Matteo Bruni : wined3d: Avoid vpos fixups when ARB_fragment_coord_conventions is supported.

Alexandre Julliard julliard at winehq.org
Tue Oct 4 13:38:25 CDT 2016


Module: wine
Branch: master
Commit: a7f846b2ee82ae99b8a0ad6d1569b74e0198d639
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=a7f846b2ee82ae99b8a0ad6d1569b74e0198d639

Author: Matteo Bruni <mbruni at codeweavers.com>
Date:   Mon Oct  3 23:46:52 2016 +0200

wined3d: Avoid vpos fixups when ARB_fragment_coord_conventions is supported.

Signed-off-by: Matteo Bruni <mbruni at codeweavers.com>
Signed-off-by: Henri Verbeet <hverbeet at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/wined3d/context.c         |  2 ++
 dlls/wined3d/glsl_shader.c     | 26 ++++++++++++++++++++++----
 dlls/wined3d/shader.c          |  2 ++
 dlls/wined3d/wined3d_private.h |  3 ++-
 4 files changed, 28 insertions(+), 5 deletions(-)

diff --git a/dlls/wined3d/context.c b/dlls/wined3d/context.c
index e09c6fd..8c08310 100644
--- a/dlls/wined3d/context.c
+++ b/dlls/wined3d/context.c
@@ -2418,6 +2418,8 @@ static void context_set_render_offscreen(struct wined3d_context *context, BOOL o
     context_invalidate_state(context, STATE_VIEWPORT);
     context_invalidate_state(context, STATE_SCISSORRECT);
     context_invalidate_state(context, STATE_FRONTFACE);
+    if (context->gl_info->supported[ARB_FRAGMENT_COORD_CONVENTIONS])
+        context_invalidate_state(context, STATE_SHADER(WINED3D_SHADER_TYPE_PIXEL));
     context->render_offscreen = offscreen;
 }
 
diff --git a/dlls/wined3d/glsl_shader.c b/dlls/wined3d/glsl_shader.c
index 55cbdcf..72740af 100644
--- a/dlls/wined3d/glsl_shader.c
+++ b/dlls/wined3d/glsl_shader.c
@@ -2194,9 +2194,23 @@ 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])
+                {
+                    if (shader->device->wined3d->flags & WINED3D_PIXEL_CENTER_INTEGER)
+                        shader_addline(buffer, "layout(%spixel_center_integer) in vec4 gl_FragCoord;\n",
+                                ps_args->render_offscreen ? "" : "origin_upper_left, ");
+                    else if (!ps_args->render_offscreen)
+                        shader_addline(buffer, "layout(origin_upper_left) in vec4 gl_FragCoord;\n");
+                }
+                shader_addline(buffer, "vec4 vpos;\n");
+            }
         }
 
         if (ps_args->alpha_test_func + 1 != WINED3D_CMP_ALWAYS)
@@ -5899,6 +5913,8 @@ static GLuint shader_glsl_generate_pshader(const struct wined3d_context *context
     shader_glsl_enable_extensions(buffer, gl_info);
     if (gl_info->supported[ARB_DERIVATIVE_CONTROL])
         shader_addline(buffer, "#extension GL_ARB_derivative_control : enable\n");
+    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_TEXTURE_LOD])
         shader_addline(buffer, "#extension GL_ARB_shader_texture_lod : enable\n");
     /* The spec says that it doesn't have to be explicitly enabled, but the
@@ -5929,7 +5945,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
diff --git a/dlls/wined3d/shader.c b/dlls/wined3d/shader.c
index 1c48589..594520c 100644
--- a/dlls/wined3d/shader.c
+++ b/dlls/wined3d/shader.c
@@ -3279,6 +3279,8 @@ void find_ps_compile_args(const struct wined3d_state *state, const struct wined3
 
     if (d3d_info->emulated_flatshading)
         args->flatshading = state->render_states[WINED3D_RS_SHADEMODE] == WINED3D_SHADE_FLAT;
+
+    args->render_offscreen = gl_info->supported[ARB_FRAGMENT_COORD_CONVENTIONS] ? context->render_offscreen : 0;
 }
 
 static HRESULT pixel_shader_init(struct wined3d_shader *shader, struct wined3d_device *device,
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h
index a968bda..851c914 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -1107,7 +1107,8 @@ struct ps_compile_args {
     DWORD pointsprite : 1;
     DWORD flatshading : 1;
     DWORD alpha_test_func : 3;
-    DWORD padding : 27;
+    DWORD render_offscreen : 1;
+    DWORD padding : 26;
 };
 
 enum fog_src_type {




More information about the wine-cvs mailing list