[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