[PATCH 2/5] wined3d: Add fetch4 to shader FFP generate texture stage

Daniel Ansorregui mailszeros at gmail.com
Wed Nov 21 19:28:20 CST 2018


- Tested under W10, when Fetch4 is enabled, projection is ignored
- Untested what happens when Fetch4 is used on
  unsupported textures. Disabling Fetch4 fttb.
- The swizzle fix has been checked against windows
  since it does not match with gather4

Signed-off-by: Daniel Ansorregui <mailszeros at gmail.com>
---
 dlls/wined3d/glsl_shader.c     | 19 ++++++++++++++++++-
 dlls/wined3d/utils.c           |  2 ++
 dlls/wined3d/wined3d_private.h |  3 ++-
 3 files changed, 22 insertions(+), 2 deletions(-)

diff --git a/dlls/wined3d/glsl_shader.c b/dlls/wined3d/glsl_shader.c
index 4b2dfaf34a..e3aa5125fd 100644
--- a/dlls/wined3d/glsl_shader.c
+++ b/dlls/wined3d/glsl_shader.c
@@ -9837,6 +9837,7 @@ static GLuint shader_glsl_generate_ffp_fragment_shader(struct shader_glsl_priv *
     for (stage = 0; stage < MAX_TEXTURES && settings->op[stage].cop != WINED3D_TOP_DISABLE; ++stage)
     {
         const char *texture_function, *coord_mask;
+        BOOL fetch4 = settings->op[stage].fetch4;
         BOOL proj;
 
         if (!(tex_map & (1u << stage)))
@@ -9856,7 +9857,6 @@ static GLuint shader_glsl_generate_ffp_fragment_shader(struct shader_glsl_priv *
             FIXME("Unexpected projection mode %d\n", settings->op[stage].projected);
             proj = TRUE;
         }
-
         if (settings->op[stage].tex_type == WINED3D_GL_RES_TYPE_TEX_CUBE)
             proj = FALSE;
 
@@ -9865,6 +9865,7 @@ static GLuint shader_glsl_generate_ffp_fragment_shader(struct shader_glsl_priv *
             case WINED3D_GL_RES_TYPE_TEX_1D:
                 texture_function = "texture1D";
                 coord_mask = "x";
+                fetch4 = FALSE;
                 break;
             case WINED3D_GL_RES_TYPE_TEX_2D:
                 texture_function = "texture2D";
@@ -9873,6 +9874,7 @@ static GLuint shader_glsl_generate_ffp_fragment_shader(struct shader_glsl_priv *
             case WINED3D_GL_RES_TYPE_TEX_3D:
                 texture_function = "texture3D";
                 coord_mask = "xyz";
+                fetch4 = FALSE;
                 break;
             case WINED3D_GL_RES_TYPE_TEX_CUBE:
                 texture_function = "textureCube";
@@ -9881,17 +9883,28 @@ static GLuint shader_glsl_generate_ffp_fragment_shader(struct shader_glsl_priv *
             case WINED3D_GL_RES_TYPE_TEX_RECT:
                 texture_function = "texture2DRect";
                 coord_mask = "xy";
+                if (fetch4)
+                    FIXME("Unsupported Fetch4 and texture2DRect sampling");
+                fetch4 = FALSE;
                 break;
             default:
                 FIXME("Unhandled texture type %#x.\n", settings->op[stage].tex_type);
                 texture_function = "";
                 coord_mask = "xyzw";
                 proj = FALSE;
+                fetch4 = FALSE;
                 break;
         }
         if (!legacy_syntax)
             texture_function = "texture";
 
+        if (fetch4)
+        {
+            texture_function = "textureGather";
+            /* Tested on W10+Intel, fetch4 enabled disables projection */
+            proj = FALSE;
+        }
+
         if (stage > 0
                 && (settings->op[stage - 1].cop == WINED3D_TOP_BUMPENVMAP
                 || settings->op[stage - 1].cop == WINED3D_TOP_BUMPENVMAP_LUMINANCE))
@@ -9940,6 +9953,10 @@ static GLuint shader_glsl_generate_ffp_fragment_shader(struct shader_glsl_priv *
                     stage, texture_function, proj ? "Proj" : "", stage, stage, coord_mask, proj ? 'w' : ' ');
         }
 
+        /* Match FETCH4 swizzle with textureGather swizzle */
+        if (fetch4)
+            shader_addline(buffer, "tex%u = tex%u.xwyz;\n", stage, stage);
+
         string_buffer_sprintf(tex_reg_name, "tex%u", stage);
         shader_glsl_color_correction_ext(buffer, tex_reg_name->buffer, WINED3DSP_WRITEMASK_ALL,
                 settings->op[stage].color_fixup);
diff --git a/dlls/wined3d/utils.c b/dlls/wined3d/utils.c
index aa68799535..9b409b5c3b 100644
--- a/dlls/wined3d/utils.c
+++ b/dlls/wined3d/utils.c
@@ -5783,6 +5783,7 @@ void gen_ffp_frag_op(const struct wined3d_context *context, const struct wined3d
             settings->op[i].tmp_dst = 0;
             settings->op[i].tex_type = WINED3D_GL_RES_TYPE_TEX_1D;
             settings->op[i].projected = WINED3D_PROJECTION_NONE;
+            settings->op[i].fetch4 = FALSE;
             i++;
             break;
         }
@@ -5926,6 +5927,7 @@ void gen_ffp_frag_op(const struct wined3d_context *context, const struct wined3d
         settings->op[i].aarg1 = aarg1;
         settings->op[i].aarg2 = aarg2;
         settings->op[i].tmp_dst = state->texture_states[i][WINED3D_TSS_RESULT_ARG] == WINED3DTA_TEMP;
+        settings->op[i].fetch4 = state->sampler_states[i][WINED3D_SAMP_MIPMAP_LOD_BIAS] == MAKEFOURCC('G','E','T','4');
     }
 
     /* Clear unsupported stages */
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h
index f908ff7173..f75660f0ab 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -2743,7 +2743,8 @@ struct texture_stage_op
     unsigned                tex_type : 3;
     unsigned                tmp_dst : 1;
     unsigned                projected : 2;
-    unsigned                padding : 10;
+    unsigned                fetch4 : 1;
+    unsigned                padding : 9;
 };
 
 struct ffp_frag_settings
-- 
2.17.1




More information about the wine-devel mailing list