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.
This commit is contained in:
Zebediah Figura
2023-07-16 23:56:22 -05:00
committed by Alexandre Julliard
parent 133e313800
commit c7a7d9a18c
Notes: Alexandre Julliard 2023-11-10 00:09:49 +01:00
Approved-by: Henri Verbeet (@hverbeet)
Approved-by: Alexandre Julliard (@julliard)
Merge-Request: https://gitlab.winehq.org/wine/vkd3d/-/merge_requests/453
3 changed files with 22 additions and 34 deletions

View File

@@ -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) else if (reg->type == VKD3DSPR_OUTPUT || dst_param->reg.type == VKD3DSPR_COLOROUT)
{ {
signature = normaliser->output_signature; signature = normaliser->output_signature;
reg->type = VKD3DSPR_OUTPUT;
dcl_params = normaliser->output_dcl_params; dcl_params = normaliser->output_dcl_params;
} }
else if (dst_param->reg.type == VKD3DSPR_INCONTROLPOINT || dst_param->reg.type == VKD3DSPR_INPUT) else if (dst_param->reg.type == VKD3DSPR_INCONTROLPOINT || dst_param->reg.type == VKD3DSPR_INPUT)
{ {
signature = normaliser->input_signature; signature = normaliser->input_signature;
reg->type = VKD3DSPR_INPUT;
dcl_params = normaliser->input_dcl_params; dcl_params = normaliser->input_dcl_params;
} }
else else
@@ -980,15 +982,13 @@ static void shader_src_param_io_normalise(struct vkd3d_shader_src_param *src_par
signature = normaliser->patch_constant_signature; signature = normaliser->patch_constant_signature;
break; break;
case VKD3DSPR_INCONTROLPOINT: case VKD3DSPR_INCONTROLPOINT:
if (normaliser->shader_type == VKD3D_SHADER_TYPE_HULL) reg->type = VKD3DSPR_INPUT;
reg->type = VKD3DSPR_INPUT;
/* fall through */ /* fall through */
case VKD3DSPR_INPUT: case VKD3DSPR_INPUT:
signature = normaliser->input_signature; signature = normaliser->input_signature;
break; break;
case VKD3DSPR_OUTCONTROLPOINT: case VKD3DSPR_OUTCONTROLPOINT:
if (normaliser->shader_type == VKD3D_SHADER_TYPE_HULL) reg->type = VKD3DSPR_OUTPUT;
reg->type = VKD3DSPR_OUTPUT;
/* fall through */ /* fall through */
case VKD3DSPR_OUTPUT: case VKD3DSPR_OUTPUT:
signature = normaliser->output_signature; signature = normaliser->output_signature;

View File

@@ -2141,14 +2141,22 @@ static void vkd3d_symbol_make_register(struct vkd3d_symbol *symbol,
symbol->type = VKD3D_SYMBOL_REGISTER; symbol->type = VKD3D_SYMBOL_REGISTER;
memset(&symbol->key, 0, sizeof(symbol->key)); memset(&symbol->key, 0, sizeof(symbol->key));
symbol->key.reg.type = reg->type; 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; case VKD3DSPR_INPUT:
assert(!reg->idx_count || symbol->key.reg.idx != ~0u); 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, 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: case VKD3DSPR_INPUT:
snprintf(buffer, buffer_size, "v%u", idx); snprintf(buffer, buffer_size, "v%u", idx);
break; break;
case VKD3DSPR_INCONTROLPOINT:
snprintf(buffer, buffer_size, "vicp%u", idx);
break;
case VKD3DSPR_OUTPUT: case VKD3DSPR_OUTPUT:
snprintf(buffer, buffer_size, "o%u", idx); snprintf(buffer, buffer_size, "o%u", idx);
break; 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))) if ((builtin = get_spirv_builtin_for_register(reg_type)))
return builtin; return builtin;
if (sysval != VKD3D_SIV_NONE || (reg_type != VKD3DSPR_OUTPUT && reg_type != VKD3DSPR_COLOROUT if (sysval != VKD3D_SIV_NONE || (reg_type != VKD3DSPR_OUTPUT && reg_type != VKD3DSPR_PATCHCONST))
&& reg_type != VKD3DSPR_PATCHCONST))
FIXME("Unhandled builtin (register type %#x, sysval %#x).\n", reg_type, sysval); FIXME("Unhandled builtin (register type %#x, sysval %#x).\n", reg_type, sysval);
return NULL; return NULL;
} }
@@ -4884,7 +4888,6 @@ static void spirv_compiler_emit_shader_phase_input(struct spirv_compiler *compil
switch (reg->type) switch (reg->type)
{ {
case VKD3DSPR_INPUT: case VKD3DSPR_INPUT:
case VKD3DSPR_INCONTROLPOINT:
case VKD3DSPR_PATCHCONST: case VKD3DSPR_PATCHCONST:
spirv_compiler_emit_input(compiler, dst); spirv_compiler_emit_input(compiler, dst);
return; return;
@@ -6175,7 +6178,7 @@ static void spirv_compiler_emit_dcl_input(struct spirv_compiler *compiler,
if (spirv_compiler_get_current_shader_phase(compiler)) if (spirv_compiler_get_current_shader_phase(compiler))
spirv_compiler_emit_shader_phase_input(compiler, dst); 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); spirv_compiler_emit_input(compiler, dst);
else else
spirv_compiler_emit_input_register(compiler, dst); 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; const struct vkd3d_shader_dst_param *dst = &instruction->declaration.dst;
if (vkd3d_shader_register_is_output(&dst->reg) if (dst->reg.type == VKD3DSPR_OUTPUT
|| (is_in_fork_or_join_phase(compiler) && vkd3d_shader_register_is_patch_constant(&dst->reg))) || (is_in_fork_or_join_phase(compiler) && dst->reg.type == VKD3DSPR_PATCHCONST))
spirv_compiler_emit_output(compiler, dst); spirv_compiler_emit_output(compiler, dst);
else else
spirv_compiler_emit_output_register(compiler, dst); spirv_compiler_emit_output_register(compiler, dst);

View File

@@ -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; 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) static inline bool register_is_constant(const struct vkd3d_shader_register *reg)
{ {
return (reg->type == VKD3DSPR_IMMCONST || reg->type == VKD3DSPR_IMMCONST64); return (reg->type == VKD3DSPR_IMMCONST || reg->type == VKD3DSPR_IMMCONST64);