[v2 1/3] wined3d: Add support for flat interpolation in shaders.

Józef Kucia joseph.kucia at gmail.com
Sun Nov 20 18:46:38 CST 2016


This is still broken in the same way as the first version:
fixme:d3d_shader:print_glsl_info_log     error: interpolation modifier
mismatch for varying parameter (named ps_link1) between shader stages

On Sun, Nov 20, 2016 at 6:36 PM, Andrew Wesie <awesie at gmail.com> wrote:
> Signed-off-by: Andrew Wesie <awesie at gmail.com>
> ---
>  dlls/wined3d/glsl_shader.c     | 47 ++++++++++++++++++++++++++++++------------
>  dlls/wined3d/shader.c          |  7 +++++++
>  dlls/wined3d/wined3d_private.h |  1 +
>  3 files changed, 42 insertions(+), 13 deletions(-)
>
> diff --git a/dlls/wined3d/glsl_shader.c b/dlls/wined3d/glsl_shader.c
> index 9e9c83b..5df1827 100644
> --- a/dlls/wined3d/glsl_shader.c
> +++ b/dlls/wined3d/glsl_shader.c
> @@ -2162,7 +2162,14 @@ static void shader_generate_glsl_declarations(const struct wined3d_context *cont
>              UINT in_count = min(vec4_varyings(version->major, gl_info), shader->limits->packed_input);
>
>              if (ps_args->vp_mode == vertexshader)
> -                declare_in_varying(gl_info, buffer, FALSE, "vec4 %s_link[%u];\n", prefix, in_count);
> +            {
> +                unsigned int j;
> +                for (j = 0; j < in_count; j++)
> +                {
> +                    declare_in_varying(gl_info, buffer, shader->u.ps.input_reg_flags[j] == WINED3DSIM_CONSTANT,
> +                            "vec4 %s_link%u;\n", prefix, j);
> +                }
> +            }

We should add a FIXME() message for other unsupported interpolation
modes. We do not want to hide that those are still not implemented.
Currently, we have a FIXME() for the dcl_input_ps instruction.

> +        else if (ins.handler_idx == WINED3DSIH_DCL_INPUT_PS)
> +        {
> +            unsigned int reg_idx = ins.declaration.dst.reg.idx[0].offset;
> +            reg_maps->input_registers |= 1u << reg_idx;
> +            /* We can assume we are in the pixel shader */
> +            shader->u.ps.input_reg_flags[reg_idx] = ins.flags;
> +        }

We tend to check the shader type and print a FIXME() message in
similar cases instead of adding a comment. See
WINED3DSIH_DCL_INPUT_PRIMITIVE, WINED3DSIH_DCL_OUTPUT_TOPOLOGY and
WINED3DSIH_DCL_VERTICES_OUT.

>      /* Pixel shader input semantics */
>      DWORD input_reg_map[MAX_REG_INPUT];
>      BOOL input_reg_used[MAX_REG_INPUT];
> +    enum wined3d_shader_interpolation_mode input_reg_flags[MAX_REG_INPUT];

I think we could use better name for this variable, e.g.
"input_reg_interpolation_mode" or "interpolation_mode".



More information about the wine-devel mailing list