From e3ec2e2ea9a20576d47340b3bbc6c95693ea4fcb Mon Sep 17 00:00:00 2001 From: Emma Anholt Date: Wed, 18 Jan 2023 16:59:11 -0800 Subject: [PATCH] zink: Re-emit the SpvBuiltInSampleMask access chain each load. Otherwise, the access chain you emitted last time may not dominate the current use. Fixes the following validation failure in dEQP-GLES31.functional.shaders.sample_variables.sample_mask_in.bits_unique_per_sample.multisample_texture_2: UNASSIGNED-CoreValidation-Shader-InconsistentSpirv(ERROR / SPEC): msgNum: 7060244 - Validation Error: [ UNASSIGNED-CoreValidation-Shader-InconsistentSpirv ] Object 0: handle = 0x55cf3cea2c60, type = VK_OBJECT_TYPE_DEVICE; | MessageID = 0x6bbb14 | SPIR-V module not valid: ID '67[%67]' defined in block '23[%23]' does not dominate its use in block '31[%31]' Fixes: 8899f6a19857 ("zink: fix gl_SampleMaskIn spirv generation") Part-of: (cherry picked from commit 4286633eec3e134d462edd16629311ed0e0e7934) --- .pick_status.json | 2 +- .../drivers/zink/nir_to_spirv/nir_to_spirv.c | 20 ++++++++++--------- 2 files changed, 12 insertions(+), 10 deletions(-) diff --git a/.pick_status.json b/.pick_status.json index bc8cdf5f51a..9813a054cfa 100644 --- a/.pick_status.json +++ b/.pick_status.json @@ -913,7 +913,7 @@ "description": "zink: Re-emit the SpvBuiltInSampleMask access chain each load.", "nominated": true, "nomination_type": 1, - "resolution": 0, + "resolution": 1, "main_sha": null, "because_sha": "8899f6a19857d533d62945889c413b55cea5223c" }, diff --git a/src/gallium/drivers/zink/nir_to_spirv/nir_to_spirv.c b/src/gallium/drivers/zink/nir_to_spirv/nir_to_spirv.c index 6638f618ca0..681e0ba939f 100644 --- a/src/gallium/drivers/zink/nir_to_spirv/nir_to_spirv.c +++ b/src/gallium/drivers/zink/nir_to_spirv/nir_to_spirv.c @@ -2779,17 +2779,19 @@ emit_load_uint_input(struct ntv_context *ctx, nir_intrinsic_instr *intr, SpvId * SpvStorageClassInput, var_name, builtin); - if (builtin == SpvBuiltInSampleMask) { - SpvId zero = emit_uint_const(ctx, 32, 0); - var_type = spirv_builder_type_uint(&ctx->builder, 32); - SpvId pointer_type = spirv_builder_type_pointer(&ctx->builder, - SpvStorageClassInput, - var_type); - *var_id = spirv_builder_emit_access_chain(&ctx->builder, pointer_type, *var_id, &zero, 1); - } } - SpvId result = spirv_builder_emit_load(&ctx->builder, var_type, *var_id); + SpvId load_var = *var_id; + if (builtin == SpvBuiltInSampleMask) { + SpvId zero = emit_uint_const(ctx, 32, 0); + var_type = spirv_builder_type_uint(&ctx->builder, 32); + SpvId pointer_type = spirv_builder_type_pointer(&ctx->builder, + SpvStorageClassInput, + var_type); + load_var = spirv_builder_emit_access_chain(&ctx->builder, pointer_type, load_var, &zero, 1); + } + + SpvId result = spirv_builder_emit_load(&ctx->builder, var_type, load_var); assert(1 == nir_dest_num_components(intr->dest)); store_dest(ctx, &intr->dest, result, nir_type_uint); }