From 271c8d7a8c3080884372e005c7be5e19f5e07dad Mon Sep 17 00:00:00 2001 From: Jesse Natalie Date: Sun, 17 Jul 2022 10:21:28 -0700 Subject: [PATCH] microsoft/compiler: DXIL validator 1.6 counts UAVs differently Instead of counting the number of UAV arrays, it counts the number of actual UAVs declared. This is more correct, but we need to do the same accounting to set the 64 UAVs flag. Reviewed-by: Enrico Galli Part-of: --- src/microsoft/compiler/nir_to_dxil.c | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/src/microsoft/compiler/nir_to_dxil.c b/src/microsoft/compiler/nir_to_dxil.c index a7d3893845e..bf4983c47fe 100644 --- a/src/microsoft/compiler/nir_to_dxil.c +++ b/src/microsoft/compiler/nir_to_dxil.c @@ -457,6 +457,7 @@ struct ntd_context { struct util_dynarray uav_metadata_nodes; const struct dxil_value *ssbo_handles[MAX_UAVS]; const struct dxil_value *image_handles[MAX_UAVS]; + uint32_t num_uavs; struct util_dynarray cbv_metadata_nodes; const struct dxil_value *cbv_handles[MAX_CBVS]; @@ -881,6 +882,17 @@ add_resource(struct ntd_context *ctx, enum dxil_resource_type type, resource->upper_bound = UINT_MAX; else resource->upper_bound = layout->binding + layout->size - 1; + if (type == DXIL_RES_UAV_TYPED || + type == DXIL_RES_UAV_RAW || + type == DXIL_RES_UAV_STRUCTURED) { + uint32_t new_uav_count = ctx->num_uavs + layout->size; + if (layout->size == 0 || new_uav_count < ctx->num_uavs) + ctx->num_uavs = UINT_MAX; + else + ctx->num_uavs = new_uav_count; + if (ctx->mod.minor_validator >= 6 && ctx->num_uavs > 8) + ctx->mod.feats.use_64uavs = 1; + } } static unsigned @@ -995,7 +1007,8 @@ emit_globals(struct ntd_context *ctx, unsigned size) return false; util_dynarray_append(&ctx->uav_metadata_nodes, const struct dxil_mdnode *, uav_meta); - if (util_dynarray_num_elements(&ctx->uav_metadata_nodes, const struct dxil_mdnode *) > 8) + if (ctx->mod.minor_validator < 6 && + util_dynarray_num_elements(&ctx->uav_metadata_nodes, const struct dxil_mdnode *) > 8) ctx->mod.feats.use_64uavs = 1; /* Handles to UAVs used for kernel globals are created on-demand */ add_resource(ctx, DXIL_RES_UAV_RAW, &layout); @@ -1019,7 +1032,8 @@ emit_uav(struct ntd_context *ctx, unsigned binding, unsigned space, unsigned cou return false; util_dynarray_append(&ctx->uav_metadata_nodes, const struct dxil_mdnode *, uav_meta); - if (util_dynarray_num_elements(&ctx->uav_metadata_nodes, const struct dxil_mdnode *) > 8) + if (ctx->mod.minor_validator < 6 && + util_dynarray_num_elements(&ctx->uav_metadata_nodes, const struct dxil_mdnode *) > 8) ctx->mod.feats.use_64uavs = 1; add_resource(ctx, res_kind == DXIL_RESOURCE_KIND_RAW_BUFFER ? DXIL_RES_UAV_RAW : DXIL_RES_UAV_TYPED, &layout);