Mesa (main): microsoft/compiler: Make sure all SV_Position components are written

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Wed Jun 8 15:57:26 UTC 2022


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

Author: Boris Brezillon <boris.brezillon at collabora.com>
Date:   Tue Jun  7 05:49:45 2022 -0700

microsoft/compiler: Make sure all SV_Position components are written

Not entirely sure if writing to only some components of
gl_Position/SPIRV-PositionBuiltin from a vertex-processing stage is
allowed, but
https://github.com/dneto0/spirv-samples/blob/main/spvasm/SpvModuleScopeVarParserTest_BuiltinPosition_StorePositionMember_OneAccessChain.spvasm
does exactly that.

Let's make sure all SV_Position components are written, otherwise the
DXIL validator complains.

Reviewed-by: Jesse Natalie <jenatali at microsoft.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/16221>

---

 src/microsoft/ci/spirv2dxil_reference.txt | 20 ++------------------
 src/microsoft/compiler/nir_to_dxil.c      | 26 ++++++++++++++++++++++++++
 2 files changed, 28 insertions(+), 18 deletions(-)

diff --git a/src/microsoft/ci/spirv2dxil_reference.txt b/src/microsoft/ci/spirv2dxil_reference.txt
index 6fa962c2f17..73831c9c705 100644
--- a/src/microsoft/ci/spirv2dxil_reference.txt
+++ b/src/microsoft/ci/spirv2dxil_reference.txt
@@ -370,24 +370,8 @@ Test:SpvModuleScopeVarParserTest_BuiltinPosition_StorePosition_PerVertexStructOu
 Assertion failed: glsl_get_components(type) == 4
 
 
-Test:SpvModuleScopeVarParserTest_BuiltinPosition_StorePositionMember_OneAccessChain.spvasm:main|Vertex: Fail
-DXIL: Not all elements of output SV_Position were written
-Not all elements of SV_Position were written
-
-Validation failed.
-
-Failed to validate DXIL
-
-
-Test:SpvModuleScopeVarParserTest_BuiltinPosition_StorePositionMember_TwoAccessChain.spvasm:main|Vertex: Fail
-DXIL: Not all elements of output SV_Position were written
-Not all elements of SV_Position were written
-
-Validation failed.
-
-Failed to validate DXIL
-
-
+Test:SpvModuleScopeVarParserTest_BuiltinPosition_StorePositionMember_OneAccessChain.spvasm:main|Vertex: Pass
+Test:SpvModuleScopeVarParserTest_BuiltinPosition_StorePositionMember_TwoAccessChain.spvasm:main|Vertex: Pass
 Test:SpvModuleScopeVarParserTest_BuiltinVertexIndex.spvasm:main|Vertex: Pass
 Test:SpvModuleScopeVarParserTest_ColMajorDecoration_Dropped.spvasm:main|Fragment: Pass
 Test:SpvModuleScopeVarParserTest_DescriptorGroupDecoration_Valid.spvasm:main|Fragment: Pass
diff --git a/src/microsoft/compiler/nir_to_dxil.c b/src/microsoft/compiler/nir_to_dxil.c
index 3e39ceeaeec..9ba770325f0 100644
--- a/src/microsoft/compiler/nir_to_dxil.c
+++ b/src/microsoft/compiler/nir_to_dxil.c
@@ -3175,6 +3175,32 @@ emit_store_output_via_intrinsic(struct ntd_context *ctx, nir_intrinsic_instr *in
          success &= dxil_emit_call_void(&ctx->mod, func, args, ARRAY_SIZE(args));
       }
    }
+
+   /* Make sure all SV_Position components are written, otherwise the DXIL
+    * validator complains.
+    */
+   bool is_sv_pos =
+      ctx->mod.shader_kind != DXIL_COMPUTE_SHADER &&
+      ctx->mod.shader_kind != DXIL_PIXEL_SHADER &&
+      var->data.location == VARYING_SLOT_POS;
+
+   if (is_sv_pos) {
+      const struct dxil_type *float_type = dxil_module_get_float_type(&ctx->mod, 32);
+      const struct dxil_value *float_undef = dxil_module_get_undef(&ctx->mod, float_type);
+      unsigned pos_wrmask = writemask << base_component;
+
+      for (unsigned i = 0; i < 4; ++i) {
+         if (!(BITFIELD_BIT(i) & pos_wrmask)) {
+            const struct dxil_value *args[] = {
+               opcode, output_id, row,
+               dxil_module_get_int8_const(&ctx->mod, i),
+               float_undef,
+            };
+            success &= dxil_emit_call_void(&ctx->mod, func, args, ARRAY_SIZE(args));
+         }
+      }
+   }
+
    return success;
 }
 



More information about the mesa-commit mailing list