[PATCH v3 01/12] wined3d: Alpha test emulation for core profile contexts.

Henri Verbeet hverbeet at gmail.com
Sun May 22 11:23:41 CDT 2016


On 20 May 2016 at 19:55, Matteo Bruni <mbruni at codeweavers.com> wrote:
> +static void shader_glsl_generate_alpha_test(struct wined3d_string_buffer *buffer,
> +        const struct wined3d_gl_info *gl_info, enum wined3d_cmp_func alpha_func)
> +{
> +    /* alpha_func is the PASS condition, not the DISCARD condition. Instead of
> +     * flipping all the operators here, just negate the comparison below. */
> +    static const char * const comparison_operator[] =
> +    {
> +        "",   /* WINED3D_CMP_NEVER */
> +        "<",  /* WINED3D_CMP_LESS */
> +        "==", /* WINED3D_CMP_EQUAL */
> +        "<=", /* WINED3D_CMP_LESSEQUAL */
> +        ">",  /* WINED3D_CMP_GREATER */
> +        "!=", /* WINED3D_CMP_NOTEQUAL */
> +        ">=", /* WINED3D_CMP_GREATEREQUAL */
> +        ""    /* WINED3D_CMP_ALWAYS */
> +    };
> +
> +    if (alpha_func == WINED3D_CMP_ALWAYS)
> +        return;
> +
> +    if (alpha_func != WINED3D_CMP_NEVER)
> +        shader_addline(buffer, "if (!(%s[0].a %s alpha_test_ref))\n",
> +                get_fragment_output(gl_info), comparison_operator[alpha_func - WINED3D_CMP_NEVER]);
> +    shader_addline(buffer, "    discard;\n");
> +}
I'm calling this good enough for a start. In case of WINED3D_CMP_EQUAL
and WINED3D_CMP_NOTEQUAL in particular there may come a point where
we'll have to do a range check like for color keys though.



More information about the wine-devel mailing list