diff --git a/libs/vkd3d-shader/d3d_asm.c b/libs/vkd3d-shader/d3d_asm.c index 6ab3c622..69e14e0c 100644 --- a/libs/vkd3d-shader/d3d_asm.c +++ b/libs/vkd3d-shader/d3d_asm.c @@ -387,6 +387,7 @@ static const char * const shader_register_names[] = [VKD3DSPR_NULL ] = "null", [VKD3DSPR_OUTCONTROLPOINT ] = "vocp", [VKD3DSPR_OUTPOINTID ] = "vOutputControlPointID", + [VKD3DSPR_OUTPUT ] = "o", [VKD3DSPR_OUTSTENCILREF ] = "oStencilRef", [VKD3DSPR_PARAMETER ] = "parameter", [VKD3DSPR_PATCHCONST ] = "vpc", @@ -401,6 +402,7 @@ static const char * const shader_register_names[] = [VKD3DSPR_STREAM ] = "m", [VKD3DSPR_TEMP ] = "r", [VKD3DSPR_TESSCOORD ] = "vDomainLocation", + [VKD3DSPR_TEXCRDOUT ] = "oT", [VKD3DSPR_TEXTURE ] = "t", [VKD3DSPR_THREADGROUPID ] = "vThreadGroupID", [VKD3DSPR_THREADID ] = "vThreadID", @@ -1010,15 +1012,6 @@ static void shader_print_register(struct vkd3d_d3d_asm_compiler *compiler, const vkd3d_string_buffer_printf(buffer, "%s", rastout_reg_names[offset]); break; - case VKD3DSPR_TEXCRDOUT: - /* Vertex shaders >= 3.0 use general purpose output registers - * (VKD3DSPR_OUTPUT), which can include an address token. */ - if (vkd3d_shader_ver_ge(&compiler->shader_version, 3, 0)) - vkd3d_string_buffer_printf(buffer, "o"); - else - vkd3d_string_buffer_printf(buffer, "oT"); - break; - case VKD3DSPR_MISCTYPE: if (offset > 1) vkd3d_string_buffer_printf(buffer, "%s%s", diff --git a/libs/vkd3d-shader/d3dbc.c b/libs/vkd3d-shader/d3dbc.c index c0184a15..7ba925b6 100644 --- a/libs/vkd3d-shader/d3dbc.c +++ b/libs/vkd3d-shader/d3dbc.c @@ -428,6 +428,7 @@ register_types[] = {VKD3D_SM1_REG_TEXTURE, VKD3DSPR_TEXTURE}, {VKD3D_SM1_REG_RASTOUT, VKD3DSPR_RASTOUT}, {VKD3D_SM1_REG_ATTROUT, VKD3DSPR_ATTROUT}, + {VKD3D_SM1_REG_OUTPUT, VKD3DSPR_OUTPUT}, {VKD3D_SM1_REG_TEXCRDOUT, VKD3DSPR_TEXCRDOUT}, {VKD3D_SM1_REG_CONSTINT, VKD3DSPR_CONSTINT}, {VKD3D_SM1_REG_COLOROUT, VKD3DSPR_COLOROUT}, @@ -542,6 +543,8 @@ static enum vkd3d_shader_register_type parse_register_type( if (d3dbc_type == VKD3D_SM1_REG_ADDR) return sm1->p.program->shader_version.type == VKD3D_SHADER_TYPE_PIXEL ? VKD3DSPR_TEXTURE : VKD3DSPR_ADDR; + if (d3dbc_type == VKD3D_SM1_REG_TEXCRDOUT) + return vkd3d_shader_ver_ge(&sm1->p.program->shader_version, 3, 0) ? VKD3DSPR_OUTPUT : VKD3DSPR_TEXCRDOUT; for (unsigned int i = 0; i < ARRAY_SIZE(register_types); ++i) { @@ -783,20 +786,15 @@ static bool add_signature_element_from_register(struct vkd3d_shader_sm1_parser * return add_signature_element(sm1, false, "TEXCOORD", register_index, VKD3D_SHADER_SV_NONE, register_index, is_dcl, mask); + case VKD3DSPR_TEXCRDOUT: + return add_signature_element(sm1, true, "TEXCOORD", register_index, + VKD3D_SHADER_SV_NONE, register_index, is_dcl, mask); + case VKD3DSPR_OUTPUT: if (version->type == VKD3D_SHADER_TYPE_VERTEX) { - /* For sm < 2 vertex shaders, this is TEXCRDOUT. - * - * For sm3 vertex shaders, this is OUTPUT, but we already - * should have had a DCL instruction. */ - if (version->major == 3) - { - add_signature_mask(sm1, true, register_index, mask); - return true; - } - return add_signature_element(sm1, true, "TEXCOORD", register_index, - VKD3D_SHADER_SV_NONE, register_index, is_dcl, mask); + add_signature_mask(sm1, true, register_index, mask); + return true; } /* fall through */ diff --git a/libs/vkd3d-shader/ir.c b/libs/vkd3d-shader/ir.c index b31a49d9..ec7e2d03 100644 --- a/libs/vkd3d-shader/ir.c +++ b/libs/vkd3d-shader/ir.c @@ -1192,6 +1192,7 @@ static void remove_unread_output_components(const struct shader_signature *signa switch (dst->reg.type) { case VKD3DSPR_OUTPUT: + case VKD3DSPR_TEXCRDOUT: e = vsir_signature_find_element_for_reg(signature, dst->reg.idx[0].offset, 0); break; @@ -2177,6 +2178,7 @@ static bool shader_dst_param_io_normalise(struct vkd3d_shader_dst_param *dst_par signature = normaliser->patch_constant_signature; break; + case VKD3DSPR_TEXCRDOUT: case VKD3DSPR_COLOROUT: reg_idx = reg->idx[0].offset; signature = normaliser->output_signature; diff --git a/libs/vkd3d-shader/vkd3d_shader_private.h b/libs/vkd3d-shader/vkd3d_shader_private.h index caffccb7..cf2c6076 100644 --- a/libs/vkd3d-shader/vkd3d_shader_private.h +++ b/libs/vkd3d-shader/vkd3d_shader_private.h @@ -603,7 +603,7 @@ enum vkd3d_shader_register_type VKD3DSPR_RASTOUT, VKD3DSPR_ATTROUT, VKD3DSPR_TEXCRDOUT, - VKD3DSPR_OUTPUT = VKD3DSPR_TEXCRDOUT, + VKD3DSPR_OUTPUT, VKD3DSPR_CONSTINT, VKD3DSPR_COLOROUT, VKD3DSPR_DEPTHOUT,