Module: vkd3d Branch: master Commit: b73d2c978d35b8129593402675d86767f9787684 URL: https://gitlab.winehq.org/wine/vkd3d/-/commit/b73d2c978d35b8129593402675d867...
Author: Zebediah Figura zfigura@codeweavers.com Date: Sun Jul 16 23:34:04 2023 -0500
vkd3d-shader/ir: Check for vocp usage during IR normalization.
The hull shader barrier used for this was broken by I/O normalization, since vocp is no longer exposed to the spirv backend.
Restore this barrier by checking for vocp during normalization instead.
---
libs/vkd3d-shader/ir.c | 7 +++++++ libs/vkd3d-shader/spirv.c | 4 +--- libs/vkd3d-shader/vkd3d_shader_private.h | 2 ++ 3 files changed, 10 insertions(+), 3 deletions(-)
diff --git a/libs/vkd3d-shader/ir.c b/libs/vkd3d-shader/ir.c index d9f92ff1..758b594b 100644 --- a/libs/vkd3d-shader/ir.c +++ b/libs/vkd3d-shader/ir.c @@ -550,6 +550,8 @@ struct io_normaliser uint8_t input_range_map[MAX_REG_OUTPUT][VKD3D_VEC4_SIZE]; uint8_t output_range_map[MAX_REG_OUTPUT][VKD3D_VEC4_SIZE]; uint8_t pc_range_map[MAX_REG_OUTPUT][VKD3D_VEC4_SIZE]; + + bool use_vocp; };
static bool io_normaliser_is_in_fork_or_join_phase(const struct io_normaliser *normaliser) @@ -1031,6 +1033,10 @@ static void shader_instruction_normalise_io_params(struct vkd3d_shader_instructi if (normaliser->shader_type == VKD3D_SHADER_TYPE_HULL) { reg = &ins->declaration.dst.reg; + + if (reg->type == VKD3DSPR_OUTCONTROLPOINT) + normaliser->use_vocp = true; + /* We don't need to keep OUTCONTROLPOINT or PATCHCONST input declarations since their * equivalents were declared earlier, but INCONTROLPOINT may be the first occurrence. */ if (reg->type == VKD3DSPR_OUTCONTROLPOINT || reg->type == VKD3DSPR_PATCHCONST) @@ -1138,6 +1144,7 @@ static enum vkd3d_result shader_normalise_io_registers(struct vkd3d_shader_parse shader_instruction_normalise_io_params(&normaliser.instructions.elements[i], &normaliser);
parser->instructions = normaliser.instructions; + parser->shader_desc.use_vocp = normaliser.use_vocp; return VKD3D_OK; }
diff --git a/libs/vkd3d-shader/spirv.c b/libs/vkd3d-shader/spirv.c index 6faac0cc..a43d1c00 100644 --- a/libs/vkd3d-shader/spirv.c +++ b/libs/vkd3d-shader/spirv.c @@ -6146,9 +6146,6 @@ static void spirv_compiler_emit_dcl_input(struct spirv_compiler *compiler, spirv_compiler_emit_input(compiler, dst); else spirv_compiler_emit_input_register(compiler, dst); - - if (dst->reg.type == VKD3DSPR_OUTCONTROLPOINT) - compiler->use_vocp = true; }
static void spirv_compiler_emit_dcl_input_sysval(struct spirv_compiler *compiler, @@ -9722,6 +9719,7 @@ static int spirv_compiler_generate_spirv(struct spirv_compiler *compiler, memset(&shader_desc->input_signature, 0, sizeof(shader_desc->input_signature)); memset(&shader_desc->output_signature, 0, sizeof(shader_desc->output_signature)); memset(&shader_desc->patch_constant_signature, 0, sizeof(shader_desc->patch_constant_signature)); + compiler->use_vocp = parser->shader_desc.use_vocp;
if (compiler->shader_type != VKD3D_SHADER_TYPE_HULL) spirv_compiler_emit_shader_signature_outputs(compiler); diff --git a/libs/vkd3d-shader/vkd3d_shader_private.h b/libs/vkd3d-shader/vkd3d_shader_private.h index 912267e0..2b22e536 100644 --- a/libs/vkd3d-shader/vkd3d_shader_private.h +++ b/libs/vkd3d-shader/vkd3d_shader_private.h @@ -958,6 +958,8 @@ struct vkd3d_shader_desc { uint32_t used, external; } flat_constant_count[3]; + + bool use_vocp; };
struct vkd3d_shader_register_semantic