Mesa (main): microsoft/compiler: DXIL validator 1.6 counts UAVs differently

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Sat Jul 23 15:39:14 UTC 2022


Module: Mesa
Branch: main
Commit: 271c8d7a8c3080884372e005c7be5e19f5e07dad
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=271c8d7a8c3080884372e005c7be5e19f5e07dad

Author: Jesse Natalie <jenatali at microsoft.com>
Date:   Sun Jul 17 10:21:28 2022 -0700

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 <enrico.galli at intel.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/17603>

---

 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);



More information about the mesa-commit mailing list