[PATCH vkd3d v2 7/7] vkd3d-shader: Allocate semantic registers.
Matteo Bruni
matteo.mystral at gmail.com
Mon May 10 07:21:29 CDT 2021
On Tue, Apr 27, 2021 at 7:30 PM Zebediah Figura <zfigura at codeweavers.com> wrote:
>
> Signed-off-by: Zebediah Figura <zfigura at codeweavers.com>
> ---
> v2: Rebase; replace "varying" with "semantic".
>
> include/vkd3d_d3d9types.h | 15 +++++
> libs/vkd3d-shader/hlsl_codegen.c | 99 ++++++++++++++++++++++++++++++++
> 2 files changed, 114 insertions(+)
>
> diff --git a/include/vkd3d_d3d9types.h b/include/vkd3d_d3d9types.h
> index ba7dcbfb..1f886443 100644
> --- a/include/vkd3d_d3d9types.h
> +++ b/include/vkd3d_d3d9types.h
> @@ -164,5 +164,20 @@ typedef enum _D3DSHADER_PARAM_REGISTER_TYPE
> D3DSPR_FORCE_DWORD = 0x7fffffff,
> } D3DSHADER_PARAM_REGISTER_TYPE;
>
> +typedef enum _D3DSHADER_MISCTYPE_OFFSETS
> +{
> + D3DSMO_POSITION = 0x0,
> + D3DSMO_FACE = 0x1,
> +} D3DSHADER_MISCTYPE_OFFSETS;
> +
> +typedef enum _D3DVS_RASTOUT_OFFSETS
> +{
> + D3DSRO_POSITION = 0x0,
> + D3DSRO_FOG = 0x1,
> + D3DSRO_POINT_SIZE = 0x2,
> +
> + D3DSRO_FORCE_DWORD = 0x7fffffff,
> +} D3DVS_RASTOUT_OFFSETS;
> +
> #endif /* _d3d9TYPES_H_ */
> #endif /* __VKD3D_D3D9TYPES_H */
> diff --git a/libs/vkd3d-shader/hlsl_codegen.c b/libs/vkd3d-shader/hlsl_codegen.c
> index 787d3360..9f2c278c 100644
> --- a/libs/vkd3d-shader/hlsl_codegen.c
> +++ b/libs/vkd3d-shader/hlsl_codegen.c
> @@ -948,6 +948,104 @@ static void allocate_temp_registers(struct hlsl_ir_function_decl *entry_func)
> allocate_temp_registers_recurse(entry_func->body, &liveness);
> }
>
> +static bool sm1_register_from_semantic(struct hlsl_ctx *ctx, const struct hlsl_semantic *semantic, bool output,
> + D3DSHADER_PARAM_REGISTER_TYPE *type, unsigned int *reg)
> +{
> + unsigned int i;
> +
> + static const struct
> + {
> + const char *semantic;
> + bool output;
> + enum vkd3d_shader_type shader_type;
> + unsigned int major_version;
> + D3DSHADER_PARAM_REGISTER_TYPE type;
> + DWORD offset;
> + }
> + register_table[] =
> + {
> + {"color", true, VKD3D_SHADER_TYPE_PIXEL, 2, D3DSPR_COLOROUT},
> + {"depth", true, VKD3D_SHADER_TYPE_PIXEL, 2, D3DSPR_DEPTHOUT},
> + {"sv_depth", true, VKD3D_SHADER_TYPE_PIXEL, 2, D3DSPR_DEPTHOUT},
> + {"sv_target", true, VKD3D_SHADER_TYPE_PIXEL, 2, D3DSPR_COLOROUT},
> + {"color", false, VKD3D_SHADER_TYPE_PIXEL, 2, D3DSPR_INPUT},
> + {"texcoord", false, VKD3D_SHADER_TYPE_PIXEL, 2, D3DSPR_TEXTURE},
> +
> + {"color", true, VKD3D_SHADER_TYPE_PIXEL, 3, D3DSPR_COLOROUT},
> + {"depth", true, VKD3D_SHADER_TYPE_PIXEL, 3, D3DSPR_DEPTHOUT},
> + {"sv_depth", true, VKD3D_SHADER_TYPE_PIXEL, 3, D3DSPR_DEPTHOUT},
> + {"sv_target", true, VKD3D_SHADER_TYPE_PIXEL, 3, D3DSPR_COLOROUT},
> + {"sv_position", false, VKD3D_SHADER_TYPE_PIXEL, 3, D3DSPR_MISCTYPE, D3DSMO_POSITION},
> + {"vface", false, VKD3D_SHADER_TYPE_PIXEL, 3, D3DSPR_MISCTYPE, D3DSMO_FACE},
> + {"vpos", false, VKD3D_SHADER_TYPE_PIXEL, 3, D3DSPR_MISCTYPE, D3DSMO_POSITION},
> +
> + {"color", true, VKD3D_SHADER_TYPE_VERTEX, 1, D3DSPR_ATTROUT},
> + {"fog", true, VKD3D_SHADER_TYPE_VERTEX, 1, D3DSPR_RASTOUT, D3DSRO_FOG},
> + {"position", true, VKD3D_SHADER_TYPE_VERTEX, 1, D3DSPR_RASTOUT, D3DSRO_POSITION},
> + {"psize", true, VKD3D_SHADER_TYPE_VERTEX, 1, D3DSPR_RASTOUT, D3DSRO_POINT_SIZE},
> + {"sv_position", true, VKD3D_SHADER_TYPE_VERTEX, 1, D3DSPR_RASTOUT, D3DSRO_POSITION},
> + {"texcoord", true, VKD3D_SHADER_TYPE_VERTEX, 1, D3DSPR_TEXCRDOUT},
> +
> + {"color", true, VKD3D_SHADER_TYPE_VERTEX, 2, D3DSPR_ATTROUT},
> + {"fog", true, VKD3D_SHADER_TYPE_VERTEX, 2, D3DSPR_RASTOUT, D3DSRO_FOG},
> + {"position", true, VKD3D_SHADER_TYPE_VERTEX, 2, D3DSPR_RASTOUT, D3DSRO_POSITION},
> + {"psize", true, VKD3D_SHADER_TYPE_VERTEX, 2, D3DSPR_RASTOUT, D3DSRO_POINT_SIZE},
> + {"sv_position", true, VKD3D_SHADER_TYPE_VERTEX, 2, D3DSPR_RASTOUT, D3DSRO_POSITION},
> + {"texcoord", true, VKD3D_SHADER_TYPE_VERTEX, 2, D3DSPR_TEXCRDOUT},
> + };
> +
> + for (i = 0; i < ARRAY_SIZE(register_table); ++i)
> + {
> + if (!ascii_strcasecmp(semantic->name, register_table[i].semantic)
> + && output == register_table[i].output
> + && ctx->profile->type == register_table[i].shader_type
> + && ctx->profile->major_version == register_table[i].major_version)
> + {
> + *type = register_table[i].type;
> + if (register_table[i].type == D3DSPR_MISCTYPE || register_table[i].type == D3DSPR_RASTOUT)
> + *reg = register_table[i].offset;
> + else
> + *reg = semantic->index;
> + return true;
This branch could use a TRACE() (e.g. TRACE(""Semantic %s[%u] matches
with system value %#x[%u].\n", semantic->name, semantic->index, *type,
*reg")). The trace might be clearer in the caller, or maybe you have
something already in the following patches.
More information about the wine-devel
mailing list