[PATCH 12/12] wined3d: Use ARB_fragment_coord_conventions for vpos fixups when supported.
Matteo Bruni
mbruni at codeweavers.com
Fri May 20 12:56:03 CDT 2016
Signed-off-by: Matteo Bruni <mbruni at codeweavers.com>
---
It turns out that the extension really only affects gl_FragCoord.
I guess it's still worth it but if you think otherwise just shoot these
two patches down.
Or, if I'm missing something, feel free to use the cluebat on me...
dlls/wined3d/glsl_shader.c | 21 +++++++++++++++++----
1 file changed, 17 insertions(+), 4 deletions(-)
diff --git a/dlls/wined3d/glsl_shader.c b/dlls/wined3d/glsl_shader.c
index f671e84..ebf1279 100644
--- a/dlls/wined3d/glsl_shader.c
+++ b/dlls/wined3d/glsl_shader.c
@@ -2081,9 +2081,18 @@ static void shader_generate_glsl_declarations(const struct wined3d_context *cont
}
if (reg_maps->vpos || reg_maps->usesdsy)
{
- ++extra_constants_needed;
- shader_addline(buffer, "uniform vec4 ycorrection;\n");
- shader_addline(buffer, "vec4 vpos;\n");
+ if (reg_maps->usesdsy || !gl_info->supported[ARB_FRAGMENT_COORD_CONVENTIONS])
+ {
+ ++extra_constants_needed;
+ shader_addline(buffer, "uniform vec4 ycorrection;\n");
+ }
+ if (reg_maps->vpos)
+ {
+ if (gl_info->supported[ARB_FRAGMENT_COORD_CONVENTIONS]
+ && shader->device->wined3d->flags & WINED3D_PIXEL_CENTER_INTEGER)
+ shader_addline(buffer, "layout(pixel_center_integer) in vec4 gl_FragCoord;\n");
+ shader_addline(buffer, "vec4 vpos;\n");
+ }
}
if (ps_args->alpha_test_func + 1 != WINED3D_CMP_ALWAYS)
@@ -5665,6 +5674,8 @@ static GLuint shader_glsl_generate_pshader(const struct wined3d_context *context
shader_addline(buffer, "%s\n", shader_glsl_get_version(gl_info, ®_maps->shader_version));
+ if (gl_info->supported[ARB_FRAGMENT_COORD_CONVENTIONS])
+ shader_addline(buffer, "#extension GL_ARB_fragment_coord_conventions : enable\n");
if (gl_info->supported[ARB_SHADER_BIT_ENCODING])
shader_addline(buffer, "#extension GL_ARB_shader_bit_encoding : enable\n");
if (gl_info->supported[ARB_SHADER_TEXTURE_LOD])
@@ -5705,7 +5716,9 @@ static GLuint shader_glsl_generate_pshader(const struct wined3d_context *context
* on drivers that returns integer values. */
if (reg_maps->vpos)
{
- if (shader->device->wined3d->flags & WINED3D_PIXEL_CENTER_INTEGER)
+ if (gl_info->supported[ARB_FRAGMENT_COORD_CONVENTIONS])
+ shader_addline(buffer, "vpos = gl_FragCoord;\n");
+ else if (shader->device->wined3d->flags & WINED3D_PIXEL_CENTER_INTEGER)
shader_addline(buffer,
"vpos = floor(vec4(0, ycorrection[0], 0, 0) + gl_FragCoord * vec4(1, ycorrection[1], 1, 1));\n");
else
--
2.7.3
More information about the wine-patches
mailing list