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