Module: vkd3d Branch: master Commit: c7a7d9a18c537f4cb206d9334a69c188f42602df URL: https://gitlab.winehq.org/wine/vkd3d/-/commit/c7a7d9a18c537f4cb206d9334a69c1...
Author: Zebediah Figura zfigura@codeweavers.com Date: Sun Jul 16 23:56:22 2023 -0500
vkd3d-shader/ir: Normalize all I/O registers to INPUT/OUTPUT/PATCHCONST.
Specifically, map COLOROUT to OUTPUT, and map INCONTROLPOINT to INPUT for domain shaders as well as hull shaders.
Obscure the non-existent differences from the view of the backend.
---
libs/vkd3d-shader/ir.c | 8 ++++---- libs/vkd3d-shader/spirv.c | 33 +++++++++++++++++--------------- libs/vkd3d-shader/vkd3d_shader_private.h | 15 --------------- 3 files changed, 22 insertions(+), 34 deletions(-)
diff --git a/libs/vkd3d-shader/ir.c b/libs/vkd3d-shader/ir.c index 16e5948f..abc8b1cd 100644 --- a/libs/vkd3d-shader/ir.c +++ b/libs/vkd3d-shader/ir.c @@ -876,11 +876,13 @@ static bool shader_dst_param_io_normalise(struct vkd3d_shader_dst_param *dst_par else if (reg->type == VKD3DSPR_OUTPUT || dst_param->reg.type == VKD3DSPR_COLOROUT) { signature = normaliser->output_signature; + reg->type = VKD3DSPR_OUTPUT; dcl_params = normaliser->output_dcl_params; } else if (dst_param->reg.type == VKD3DSPR_INCONTROLPOINT || dst_param->reg.type == VKD3DSPR_INPUT) { signature = normaliser->input_signature; + reg->type = VKD3DSPR_INPUT; dcl_params = normaliser->input_dcl_params; } else @@ -980,15 +982,13 @@ static void shader_src_param_io_normalise(struct vkd3d_shader_src_param *src_par signature = normaliser->patch_constant_signature; break; case VKD3DSPR_INCONTROLPOINT: - if (normaliser->shader_type == VKD3D_SHADER_TYPE_HULL) - reg->type = VKD3DSPR_INPUT; + reg->type = VKD3DSPR_INPUT; /* fall through */ case VKD3DSPR_INPUT: signature = normaliser->input_signature; break; case VKD3DSPR_OUTCONTROLPOINT: - if (normaliser->shader_type == VKD3D_SHADER_TYPE_HULL) - reg->type = VKD3DSPR_OUTPUT; + reg->type = VKD3DSPR_OUTPUT; /* fall through */ case VKD3DSPR_OUTPUT: signature = normaliser->output_signature; diff --git a/libs/vkd3d-shader/spirv.c b/libs/vkd3d-shader/spirv.c index 8a9910e4..b1679889 100644 --- a/libs/vkd3d-shader/spirv.c +++ b/libs/vkd3d-shader/spirv.c @@ -2141,14 +2141,22 @@ static void vkd3d_symbol_make_register(struct vkd3d_symbol *symbol, symbol->type = VKD3D_SYMBOL_REGISTER; memset(&symbol->key, 0, sizeof(symbol->key)); symbol->key.reg.type = reg->type; - if (vkd3d_shader_register_is_input(reg) || vkd3d_shader_register_is_output(reg) - || vkd3d_shader_register_is_patch_constant(reg)) + + switch (reg->type) { - symbol->key.reg.idx = reg->idx_count ? reg->idx[reg->idx_count - 1].offset : ~0u; - assert(!reg->idx_count || symbol->key.reg.idx != ~0u); + case VKD3DSPR_INPUT: + case VKD3DSPR_OUTPUT: + case VKD3DSPR_PATCHCONST: + symbol->key.reg.idx = reg->idx_count ? reg->idx[reg->idx_count - 1].offset : ~0u; + assert(!reg->idx_count || symbol->key.reg.idx != ~0u); + break; + + case VKD3DSPR_IMMCONSTBUFFER: + break; + + default: + symbol->key.reg.idx = reg->idx_count ? reg->idx[0].offset : ~0u; } - else if (reg->type != VKD3DSPR_IMMCONSTBUFFER) - symbol->key.reg.idx = reg->idx_count ? reg->idx[0].offset : ~0u; }
static void vkd3d_symbol_set_register_info(struct vkd3d_symbol *symbol, @@ -3047,9 +3055,6 @@ static bool spirv_compiler_get_register_name(char *buffer, unsigned int buffer_s case VKD3DSPR_INPUT: snprintf(buffer, buffer_size, "v%u", idx); break; - case VKD3DSPR_INCONTROLPOINT: - snprintf(buffer, buffer_size, "vicp%u", idx); - break; case VKD3DSPR_OUTPUT: snprintf(buffer, buffer_size, "o%u", idx); break; @@ -4514,8 +4519,7 @@ static const struct vkd3d_spirv_builtin *vkd3d_get_spirv_builtin(const struct sp if ((builtin = get_spirv_builtin_for_register(reg_type))) return builtin;
- if (sysval != VKD3D_SIV_NONE || (reg_type != VKD3DSPR_OUTPUT && reg_type != VKD3DSPR_COLOROUT - && reg_type != VKD3DSPR_PATCHCONST)) + if (sysval != VKD3D_SIV_NONE || (reg_type != VKD3DSPR_OUTPUT && reg_type != VKD3DSPR_PATCHCONST)) FIXME("Unhandled builtin (register type %#x, sysval %#x).\n", reg_type, sysval); return NULL; } @@ -4884,7 +4888,6 @@ static void spirv_compiler_emit_shader_phase_input(struct spirv_compiler *compil switch (reg->type) { case VKD3DSPR_INPUT: - case VKD3DSPR_INCONTROLPOINT: case VKD3DSPR_PATCHCONST: spirv_compiler_emit_input(compiler, dst); return; @@ -6175,7 +6178,7 @@ static void spirv_compiler_emit_dcl_input(struct spirv_compiler *compiler,
if (spirv_compiler_get_current_shader_phase(compiler)) spirv_compiler_emit_shader_phase_input(compiler, dst); - else if (vkd3d_shader_register_is_input(&dst->reg) || dst->reg.type == VKD3DSPR_PATCHCONST) + else if (dst->reg.type == VKD3DSPR_INPUT || dst->reg.type == VKD3DSPR_PATCHCONST) spirv_compiler_emit_input(compiler, dst); else spirv_compiler_emit_input_register(compiler, dst); @@ -6192,8 +6195,8 @@ static void spirv_compiler_emit_dcl_output(struct spirv_compiler *compiler, { const struct vkd3d_shader_dst_param *dst = &instruction->declaration.dst;
- if (vkd3d_shader_register_is_output(&dst->reg) - || (is_in_fork_or_join_phase(compiler) && vkd3d_shader_register_is_patch_constant(&dst->reg))) + if (dst->reg.type == VKD3DSPR_OUTPUT + || (is_in_fork_or_join_phase(compiler) && dst->reg.type == VKD3DSPR_PATCHCONST)) spirv_compiler_emit_output(compiler, dst); else spirv_compiler_emit_output_register(compiler, dst); diff --git a/libs/vkd3d-shader/vkd3d_shader_private.h b/libs/vkd3d-shader/vkd3d_shader_private.h index 30a8a7dd..30fda136 100644 --- a/libs/vkd3d-shader/vkd3d_shader_private.h +++ b/libs/vkd3d-shader/vkd3d_shader_private.h @@ -1133,21 +1133,6 @@ static inline bool vkd3d_shader_instruction_has_texel_offset(const struct vkd3d_ return ins->texel_offset.u || ins->texel_offset.v || ins->texel_offset.w; }
-static inline bool vkd3d_shader_register_is_input(const struct vkd3d_shader_register *reg) -{ - return reg->type == VKD3DSPR_INPUT || reg->type == VKD3DSPR_INCONTROLPOINT; -} - -static inline bool vkd3d_shader_register_is_output(const struct vkd3d_shader_register *reg) -{ - return reg->type == VKD3DSPR_OUTPUT || reg->type == VKD3DSPR_COLOROUT; -} - -static inline bool vkd3d_shader_register_is_patch_constant(const struct vkd3d_shader_register *reg) -{ - return reg->type == VKD3DSPR_PATCHCONST; -} - static inline bool register_is_constant(const struct vkd3d_shader_register *reg) { return (reg->type == VKD3DSPR_IMMCONST || reg->type == VKD3DSPR_IMMCONST64);