Module: vkd3d Branch: master Commit: 98d158d004fedfcc954998c141efe90a707933d6 URL: https://gitlab.winehq.org/wine/vkd3d/-/commit/98d158d004fedfcc954998c141efe9...
Author: Henri Verbeet hverbeet@codeweavers.com Date: Thu Oct 5 22:47:24 2023 +0200
vkd3d-shader/tpf: Get rid of the output map.
Map output registers in the backend instead, as needed.
---
libs/vkd3d-shader/d3d_asm.c | 4 +--- libs/vkd3d-shader/spirv.c | 7 ++++++- libs/vkd3d-shader/tpf.c | 47 --------------------------------------------- 3 files changed, 7 insertions(+), 51 deletions(-)
diff --git a/libs/vkd3d-shader/d3d_asm.c b/libs/vkd3d-shader/d3d_asm.c index 6a3513a2..620a2d22 100644 --- a/libs/vkd3d-shader/d3d_asm.c +++ b/libs/vkd3d-shader/d3d_asm.c @@ -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: diff --git a/libs/vkd3d-shader/spirv.c b/libs/vkd3d-shader/spirv.c index 07e276c5..d490e745 100644 --- a/libs/vkd3d-shader/spirv.c +++ b/libs/vkd3d-shader/spirv.c @@ -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); diff --git a/libs/vkd3d-shader/tpf.c b/libs/vkd3d-shader/tpf.c index 0fc16b4c..fb0bbdaa 100644 --- a/libs/vkd3d-shader/tpf.c +++ b/libs/vkd3d-shader/tpf.c @@ -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;