On 20 May 2016 at 19:55, Matteo Bruni mbruni@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.