vkd3d-shader/tpf: Get rid of the output map.

Map output registers in the backend instead, as needed.
This commit is contained in:
Henri Verbeet 2023-10-05 22:47:24 +02:00 committed by Alexandre Julliard
parent 31ce7c3a38
commit 98d158d004
Notes: Alexandre Julliard 2023-10-09 23:09:10 +02:00
Approved-by: Henri Verbeet (@hverbeet)
Approved-by: Alexandre Julliard (@julliard)
Merge-Request: https://gitlab.winehq.org/wine/vkd3d/-/merge_requests/392
3 changed files with 7 additions and 51 deletions

View File

@ -880,9 +880,7 @@ static void shader_dump_register(struct vkd3d_d3d_asm_compiler *compiler, const
break;
case VKD3DSPR_COLOROUT:
shader_addline(buffer, "o");
if (!shader_ver_ge(&compiler->shader_version, 4, 0))
shader_addline(buffer, "C");
shader_addline(buffer, "oC");
break;
case VKD3DSPR_DEPTHOUT:

View File

@ -3003,9 +3003,11 @@ static bool spirv_compiler_get_register_name(char *buffer, unsigned int buffer_s
snprintf(buffer, buffer_size, "vicp%u", idx);
break;
case VKD3DSPR_OUTPUT:
case VKD3DSPR_COLOROUT:
snprintf(buffer, buffer_size, "o%u", idx);
break;
case VKD3DSPR_COLOROUT:
snprintf(buffer, buffer_size, "oC%u", idx);
break;
case VKD3DSPR_DEPTHOUT:
case VKD3DSPR_DEPTHOUTGE:
case VKD3DSPR_DEPTHOUTLE:
@ -5061,6 +5063,9 @@ static void spirv_compiler_emit_output(struct spirv_compiler *compiler,
if (is_patch_constant)
location += shader_signature_next_location(&compiler->output_signature);
else if (compiler->shader_type == VKD3D_SHADER_TYPE_PIXEL
&& signature_element->sysval_semantic == VKD3D_SHADER_SV_TARGET)
location = signature_element->semantic_index;
id = spirv_compiler_emit_array_variable(compiler, &builder->global_stream,
storage_class, component_type, output_component_count, array_sizes, 2);

View File

@ -618,8 +618,6 @@ struct vkd3d_shader_sm4_parser
{
const uint32_t *start, *end, *ptr;
unsigned int output_map[MAX_REG_OUTPUT];
enum vkd3d_shader_opcode phase;
bool has_control_point_phase;
unsigned int input_register_masks[MAX_REG_OUTPUT];
@ -1656,31 +1654,6 @@ static enum vkd3d_sm4_swizzle_type vkd3d_sm4_get_default_swizzle_type(
return register_type_info->default_src_swizzle_type;
}
static void map_register(const struct vkd3d_shader_sm4_parser *sm4, struct vkd3d_shader_register *reg)
{
switch (sm4->p.shader_version.type)
{
case VKD3D_SHADER_TYPE_PIXEL:
if (reg->type == VKD3DSPR_OUTPUT)
{
unsigned int reg_idx = reg->idx[0].offset;
if (reg_idx >= ARRAY_SIZE(sm4->output_map))
{
/* Validated later */
break;
}
reg->type = VKD3DSPR_COLOROUT;
reg->idx[0].offset = sm4->output_map[reg_idx];
}
break;
default:
break;
}
}
static enum vkd3d_data_type map_data_type(char t)
{
switch (t)
@ -1944,8 +1917,6 @@ static bool shader_sm4_read_param(struct vkd3d_shader_sm4_parser *priv, const ui
++param->idx_count;
}
map_register(priv, param);
return true;
}
@ -2476,7 +2447,6 @@ static bool shader_sm4_init(struct vkd3d_shader_sm4_parser *sm4, const uint32_t
{
struct vkd3d_shader_version version;
uint32_t version_token, token_count;
unsigned int i;
if (byte_code_size / sizeof(*byte_code) < 2)
{
@ -2536,23 +2506,6 @@ static bool shader_sm4_init(struct vkd3d_shader_sm4_parser *sm4, const uint32_t
return false;
sm4->ptr = sm4->start;
memset(sm4->output_map, 0xff, sizeof(sm4->output_map));
for (i = 0; i < output_signature->element_count; ++i)
{
struct signature_element *e = &output_signature->elements[i];
if (version.type == VKD3D_SHADER_TYPE_PIXEL
&& ascii_strcasecmp(e->semantic_name, "SV_Target"))
continue;
if (e->register_index >= ARRAY_SIZE(sm4->output_map))
{
WARN("Invalid output index %u.\n", e->register_index);
continue;
}
sm4->output_map[e->register_index] = e->semantic_index;
}
init_sm4_lookup_tables(&sm4->lookup);
return true;