mirror of
https://gitlab.winehq.org/wine/vkd3d.git
synced 2025-09-12 18:50:22 -07:00
vkd3d-shader/hlsl: Set the sysval for more sm1 semantics.
To match the sysval we set when reading them.
This commit is contained in:
committed by
Henri Verbeet
parent
ba7a9a0b29
commit
7331c70e9e
Notes:
Henri Verbeet
2025-04-14 17:16:33 +02:00
Approved-by: Francisco Casas (@fcasas) Approved-by: Giovanni Mascellani (@giomasce) Approved-by: Henri Verbeet (@hverbeet) Merge-Request: https://gitlab.winehq.org/wine/vkd3d/-/merge_requests/1450
@@ -1491,7 +1491,8 @@ int d3dbc_parse(const struct vkd3d_shader_compile_info *compile_info, uint64_t c
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool sm1_register_from_semantic_name(const struct vkd3d_shader_version *version, const char *semantic_name,
|
bool sm1_register_from_semantic_name(const struct vkd3d_shader_version *version, const char *semantic_name,
|
||||||
unsigned int semantic_index, bool output, enum vkd3d_shader_register_type *type, unsigned int *reg)
|
unsigned int semantic_index, bool output, enum vkd3d_shader_sysval_semantic *sysval,
|
||||||
|
enum vkd3d_shader_register_type *type, unsigned int *reg)
|
||||||
{
|
{
|
||||||
unsigned int i;
|
unsigned int i;
|
||||||
|
|
||||||
@@ -1501,42 +1502,43 @@ bool sm1_register_from_semantic_name(const struct vkd3d_shader_version *version,
|
|||||||
bool output;
|
bool output;
|
||||||
enum vkd3d_shader_type shader_type;
|
enum vkd3d_shader_type shader_type;
|
||||||
unsigned int major_version;
|
unsigned int major_version;
|
||||||
|
enum vkd3d_shader_sysval_semantic sysval;
|
||||||
enum vkd3d_shader_register_type type;
|
enum vkd3d_shader_register_type type;
|
||||||
unsigned int offset;
|
unsigned int offset;
|
||||||
}
|
}
|
||||||
register_table[] =
|
register_table[] =
|
||||||
{
|
{
|
||||||
{"color", false, VKD3D_SHADER_TYPE_PIXEL, 1, VKD3DSPR_INPUT},
|
{"color", false, VKD3D_SHADER_TYPE_PIXEL, 1, VKD3D_SHADER_SV_NONE, VKD3DSPR_INPUT},
|
||||||
{"texcoord", false, VKD3D_SHADER_TYPE_PIXEL, 1, VKD3DSPR_TEXTURE},
|
{"texcoord", false, VKD3D_SHADER_TYPE_PIXEL, 1, VKD3D_SHADER_SV_NONE, VKD3DSPR_TEXTURE},
|
||||||
|
|
||||||
{"color", true, VKD3D_SHADER_TYPE_PIXEL, 2, VKD3DSPR_COLOROUT},
|
{"color", true, VKD3D_SHADER_TYPE_PIXEL, 2, VKD3D_SHADER_SV_TARGET, VKD3DSPR_COLOROUT},
|
||||||
{"depth", true, VKD3D_SHADER_TYPE_PIXEL, 2, VKD3DSPR_DEPTHOUT},
|
{"depth", true, VKD3D_SHADER_TYPE_PIXEL, 2, VKD3D_SHADER_SV_DEPTH, VKD3DSPR_DEPTHOUT},
|
||||||
{"sv_depth", true, VKD3D_SHADER_TYPE_PIXEL, 2, VKD3DSPR_DEPTHOUT},
|
{"sv_depth", true, VKD3D_SHADER_TYPE_PIXEL, 2, VKD3D_SHADER_SV_DEPTH, VKD3DSPR_DEPTHOUT},
|
||||||
{"sv_target", true, VKD3D_SHADER_TYPE_PIXEL, 2, VKD3DSPR_COLOROUT},
|
{"sv_target", true, VKD3D_SHADER_TYPE_PIXEL, 2, VKD3D_SHADER_SV_TARGET, VKD3DSPR_COLOROUT},
|
||||||
{"color", false, VKD3D_SHADER_TYPE_PIXEL, 2, VKD3DSPR_INPUT},
|
{"color", false, VKD3D_SHADER_TYPE_PIXEL, 2, VKD3D_SHADER_SV_NONE, VKD3DSPR_INPUT},
|
||||||
{"texcoord", false, VKD3D_SHADER_TYPE_PIXEL, 2, VKD3DSPR_TEXTURE},
|
{"texcoord", false, VKD3D_SHADER_TYPE_PIXEL, 2, VKD3D_SHADER_SV_NONE, VKD3DSPR_TEXTURE},
|
||||||
|
|
||||||
{"color", true, VKD3D_SHADER_TYPE_PIXEL, 3, VKD3DSPR_COLOROUT},
|
{"color", true, VKD3D_SHADER_TYPE_PIXEL, 3, VKD3D_SHADER_SV_TARGET, VKD3DSPR_COLOROUT},
|
||||||
{"depth", true, VKD3D_SHADER_TYPE_PIXEL, 3, VKD3DSPR_DEPTHOUT},
|
{"depth", true, VKD3D_SHADER_TYPE_PIXEL, 3, VKD3D_SHADER_SV_DEPTH, VKD3DSPR_DEPTHOUT},
|
||||||
{"sv_depth", true, VKD3D_SHADER_TYPE_PIXEL, 3, VKD3DSPR_DEPTHOUT},
|
{"sv_depth", true, VKD3D_SHADER_TYPE_PIXEL, 3, VKD3D_SHADER_SV_DEPTH, VKD3DSPR_DEPTHOUT},
|
||||||
{"sv_target", true, VKD3D_SHADER_TYPE_PIXEL, 3, VKD3DSPR_COLOROUT},
|
{"sv_target", true, VKD3D_SHADER_TYPE_PIXEL, 3, VKD3D_SHADER_SV_TARGET, VKD3DSPR_COLOROUT},
|
||||||
{"sv_position", false, VKD3D_SHADER_TYPE_PIXEL, 3, VKD3DSPR_MISCTYPE, VKD3D_SM1_MISC_POSITION},
|
{"sv_position", false, VKD3D_SHADER_TYPE_PIXEL, 3, VKD3D_SHADER_SV_POSITION, VKD3DSPR_MISCTYPE, VKD3D_SM1_MISC_POSITION},
|
||||||
{"vface", false, VKD3D_SHADER_TYPE_PIXEL, 3, VKD3DSPR_MISCTYPE, VKD3D_SM1_MISC_FACE},
|
{"vface", false, VKD3D_SHADER_TYPE_PIXEL, 3, VKD3D_SHADER_SV_IS_FRONT_FACE, VKD3DSPR_MISCTYPE, VKD3D_SM1_MISC_FACE},
|
||||||
{"vpos", false, VKD3D_SHADER_TYPE_PIXEL, 3, VKD3DSPR_MISCTYPE, VKD3D_SM1_MISC_POSITION},
|
{"vpos", false, VKD3D_SHADER_TYPE_PIXEL, 3, VKD3D_SHADER_SV_POSITION, VKD3DSPR_MISCTYPE, VKD3D_SM1_MISC_POSITION},
|
||||||
|
|
||||||
{"color", true, VKD3D_SHADER_TYPE_VERTEX, 1, VKD3DSPR_ATTROUT},
|
{"color", true, VKD3D_SHADER_TYPE_VERTEX, 1, VKD3D_SHADER_SV_NONE, VKD3DSPR_ATTROUT},
|
||||||
{"fog", true, VKD3D_SHADER_TYPE_VERTEX, 1, VKD3DSPR_RASTOUT, VSIR_RASTOUT_FOG},
|
{"fog", true, VKD3D_SHADER_TYPE_VERTEX, 1, VKD3D_SHADER_SV_NONE, VKD3DSPR_RASTOUT, VSIR_RASTOUT_FOG},
|
||||||
{"position", true, VKD3D_SHADER_TYPE_VERTEX, 1, VKD3DSPR_RASTOUT, VSIR_RASTOUT_POSITION},
|
{"position", true, VKD3D_SHADER_TYPE_VERTEX, 1, VKD3D_SHADER_SV_POSITION, VKD3DSPR_RASTOUT, VSIR_RASTOUT_POSITION},
|
||||||
{"psize", true, VKD3D_SHADER_TYPE_VERTEX, 1, VKD3DSPR_RASTOUT, VSIR_RASTOUT_POINT_SIZE},
|
{"psize", true, VKD3D_SHADER_TYPE_VERTEX, 1, VKD3D_SHADER_SV_NONE, VKD3DSPR_RASTOUT, VSIR_RASTOUT_POINT_SIZE},
|
||||||
{"sv_position", true, VKD3D_SHADER_TYPE_VERTEX, 1, VKD3DSPR_RASTOUT, VSIR_RASTOUT_POSITION},
|
{"sv_position", true, VKD3D_SHADER_TYPE_VERTEX, 1, VKD3D_SHADER_SV_POSITION, VKD3DSPR_RASTOUT, VSIR_RASTOUT_POSITION},
|
||||||
{"texcoord", true, VKD3D_SHADER_TYPE_VERTEX, 1, VKD3DSPR_TEXCRDOUT},
|
{"texcoord", true, VKD3D_SHADER_TYPE_VERTEX, 1, VKD3D_SHADER_SV_NONE, VKD3DSPR_TEXCRDOUT},
|
||||||
|
|
||||||
{"color", true, VKD3D_SHADER_TYPE_VERTEX, 2, VKD3DSPR_ATTROUT},
|
{"color", true, VKD3D_SHADER_TYPE_VERTEX, 2, VKD3D_SHADER_SV_NONE, VKD3DSPR_ATTROUT},
|
||||||
{"fog", true, VKD3D_SHADER_TYPE_VERTEX, 2, VKD3DSPR_RASTOUT, VSIR_RASTOUT_FOG},
|
{"fog", true, VKD3D_SHADER_TYPE_VERTEX, 2, VKD3D_SHADER_SV_NONE, VKD3DSPR_RASTOUT, VSIR_RASTOUT_FOG},
|
||||||
{"position", true, VKD3D_SHADER_TYPE_VERTEX, 2, VKD3DSPR_RASTOUT, VSIR_RASTOUT_POSITION},
|
{"position", true, VKD3D_SHADER_TYPE_VERTEX, 2, VKD3D_SHADER_SV_POSITION, VKD3DSPR_RASTOUT, VSIR_RASTOUT_POSITION},
|
||||||
{"psize", true, VKD3D_SHADER_TYPE_VERTEX, 2, VKD3DSPR_RASTOUT, VSIR_RASTOUT_POINT_SIZE},
|
{"psize", true, VKD3D_SHADER_TYPE_VERTEX, 2, VKD3D_SHADER_SV_NONE, VKD3DSPR_RASTOUT, VSIR_RASTOUT_POINT_SIZE},
|
||||||
{"sv_position", true, VKD3D_SHADER_TYPE_VERTEX, 2, VKD3DSPR_RASTOUT, VSIR_RASTOUT_POSITION},
|
{"sv_position", true, VKD3D_SHADER_TYPE_VERTEX, 2, VKD3D_SHADER_SV_POSITION, VKD3DSPR_RASTOUT, VSIR_RASTOUT_POSITION},
|
||||||
{"texcoord", true, VKD3D_SHADER_TYPE_VERTEX, 2, VKD3DSPR_TEXCRDOUT},
|
{"texcoord", true, VKD3D_SHADER_TYPE_VERTEX, 2, VKD3D_SHADER_SV_NONE, VKD3DSPR_TEXCRDOUT},
|
||||||
};
|
};
|
||||||
|
|
||||||
for (i = 0; i < ARRAY_SIZE(register_table); ++i)
|
for (i = 0; i < ARRAY_SIZE(register_table); ++i)
|
||||||
@@ -1546,6 +1548,8 @@ bool sm1_register_from_semantic_name(const struct vkd3d_shader_version *version,
|
|||||||
&& version->type == register_table[i].shader_type
|
&& version->type == register_table[i].shader_type
|
||||||
&& version->major == register_table[i].major_version)
|
&& version->major == register_table[i].major_version)
|
||||||
{
|
{
|
||||||
|
if (sysval)
|
||||||
|
*sysval = register_table[i].sysval;
|
||||||
*type = register_table[i].type;
|
*type = register_table[i].type;
|
||||||
if (register_table[i].type == VKD3DSPR_MISCTYPE || register_table[i].type == VKD3DSPR_RASTOUT)
|
if (register_table[i].type == VKD3DSPR_MISCTYPE || register_table[i].type == VKD3DSPR_RASTOUT)
|
||||||
*reg = register_table[i].offset;
|
*reg = register_table[i].offset;
|
||||||
@@ -1997,7 +2001,7 @@ static void d3dbc_write_semantic_dcl(struct d3dbc_compiler *d3dbc,
|
|||||||
|
|
||||||
reg.reg.idx_count = 1;
|
reg.reg.idx_count = 1;
|
||||||
if (sm1_register_from_semantic_name(version, element->semantic_name,
|
if (sm1_register_from_semantic_name(version, element->semantic_name,
|
||||||
element->semantic_index, output, ®.reg.type, ®.reg.idx[0].offset))
|
element->semantic_index, output, NULL, ®.reg.type, ®.reg.idx[0].offset))
|
||||||
{
|
{
|
||||||
usage = 0;
|
usage = 0;
|
||||||
usage_idx = 0;
|
usage_idx = 0;
|
||||||
|
@@ -6368,7 +6368,7 @@ static void allocate_semantic_register(struct hlsl_ctx *ctx, struct hlsl_ir_var
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
builtin = sm1_register_from_semantic_name(&version,
|
builtin = sm1_register_from_semantic_name(&version,
|
||||||
var->semantic.name, var->semantic.index, output, &type, ®);
|
var->semantic.name, var->semantic.index, output, NULL, &type, ®);
|
||||||
if (!builtin && !sm1_usage_from_semantic_name(var->semantic.name, var->semantic.index, &usage, &usage_idx))
|
if (!builtin && !sm1_usage_from_semantic_name(var->semantic.name, var->semantic.index, &usage, &usage_idx))
|
||||||
{
|
{
|
||||||
hlsl_error(ctx, &var->loc, VKD3D_SHADER_ERROR_HLSL_INVALID_SEMANTIC,
|
hlsl_error(ctx, &var->loc, VKD3D_SHADER_ERROR_HLSL_INVALID_SEMANTIC,
|
||||||
@@ -7763,7 +7763,7 @@ static void generate_vsir_signature_entry(struct hlsl_ctx *ctx, struct vsir_prog
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
if (!sm1_register_from_semantic_name(&program->shader_version,
|
if (!sm1_register_from_semantic_name(&program->shader_version,
|
||||||
var->semantic.name, var->semantic.index, output, &type, ®ister_index))
|
var->semantic.name, var->semantic.index, output, &sysval, &type, ®ister_index))
|
||||||
{
|
{
|
||||||
enum vkd3d_decl_usage usage;
|
enum vkd3d_decl_usage usage;
|
||||||
unsigned int usage_idx;
|
unsigned int usage_idx;
|
||||||
@@ -7780,6 +7780,8 @@ static void generate_vsir_signature_entry(struct hlsl_ctx *ctx, struct vsir_prog
|
|||||||
if (program->shader_version.type == VKD3D_SHADER_TYPE_VERTEX
|
if (program->shader_version.type == VKD3D_SHADER_TYPE_VERTEX
|
||||||
&& output && usage == VKD3D_DECL_USAGE_POSITION)
|
&& output && usage == VKD3D_DECL_USAGE_POSITION)
|
||||||
sysval = VKD3D_SHADER_SV_POSITION;
|
sysval = VKD3D_SHADER_SV_POSITION;
|
||||||
|
else
|
||||||
|
sysval = VKD3D_SHADER_SV_NONE;
|
||||||
}
|
}
|
||||||
|
|
||||||
mask = (1 << var->data_type->e.numeric.dimx) - 1;
|
mask = (1 << var->data_type->e.numeric.dimx) - 1;
|
||||||
@@ -8880,7 +8882,7 @@ static void sm1_generate_vsir_init_dst_param_from_deref(struct hlsl_ctx *ctx,
|
|||||||
register_index = 0;
|
register_index = 0;
|
||||||
}
|
}
|
||||||
else if (!sm1_register_from_semantic_name(&version, semantic_name,
|
else if (!sm1_register_from_semantic_name(&version, semantic_name,
|
||||||
deref->var->semantic.index, true, &type, ®ister_index))
|
deref->var->semantic.index, true, NULL, &type, ®ister_index))
|
||||||
{
|
{
|
||||||
VKD3D_ASSERT(reg.allocated);
|
VKD3D_ASSERT(reg.allocated);
|
||||||
type = VKD3DSPR_OUTPUT;
|
type = VKD3DSPR_OUTPUT;
|
||||||
@@ -9006,7 +9008,7 @@ static void sm1_generate_vsir_init_src_param_from_deref(struct hlsl_ctx *ctx,
|
|||||||
version.minor = ctx->profile->minor_version;
|
version.minor = ctx->profile->minor_version;
|
||||||
version.type = ctx->profile->type;
|
version.type = ctx->profile->type;
|
||||||
if (sm1_register_from_semantic_name(&version, deref->var->semantic.name,
|
if (sm1_register_from_semantic_name(&version, deref->var->semantic.name,
|
||||||
deref->var->semantic.index, false, &type, ®ister_index))
|
deref->var->semantic.index, false, NULL, &type, ®ister_index))
|
||||||
{
|
{
|
||||||
writemask = (1 << deref->var->data_type->e.numeric.dimx) - 1;
|
writemask = (1 << deref->var->data_type->e.numeric.dimx) - 1;
|
||||||
}
|
}
|
||||||
|
@@ -1654,7 +1654,8 @@ void vkd3d_shader_trace_text_(const char *text, size_t size, const char *functio
|
|||||||
vkd3d_shader_trace_text_(text, size, __FUNCTION__)
|
vkd3d_shader_trace_text_(text, size, __FUNCTION__)
|
||||||
|
|
||||||
bool sm1_register_from_semantic_name(const struct vkd3d_shader_version *version, const char *semantic_name,
|
bool sm1_register_from_semantic_name(const struct vkd3d_shader_version *version, const char *semantic_name,
|
||||||
unsigned int semantic_index, bool output, enum vkd3d_shader_register_type *type, unsigned int *reg);
|
unsigned int semantic_index, bool output, enum vkd3d_shader_sysval_semantic *sysval,
|
||||||
|
enum vkd3d_shader_register_type *type, unsigned int *reg);
|
||||||
bool sm1_usage_from_semantic_name(const char *semantic_name,
|
bool sm1_usage_from_semantic_name(const char *semantic_name,
|
||||||
uint32_t semantic_index, enum vkd3d_decl_usage *usage, uint32_t *usage_idx);
|
uint32_t semantic_index, enum vkd3d_decl_usage *usage, uint32_t *usage_idx);
|
||||||
bool sm4_register_from_semantic_name(const struct vkd3d_shader_version *version,
|
bool sm4_register_from_semantic_name(const struct vkd3d_shader_version *version,
|
||||||
|
Reference in New Issue
Block a user