i965: w/a for gather4 green RG32F
authorChris Forbes <chrisf@ijw.co.nz>
Sat, 10 Aug 2013 21:55:30 +0000 (09:55 +1200)
committerChris Forbes <chrisf@ijw.co.nz>
Wed, 2 Oct 2013 18:56:20 +0000 (07:56 +1300)
V4: Only flag quirks if there are any uses of gather in the shader,
    to avoid spurious recompiles just because someone happened to use
    RG32F.

Signed-off-by: Chris Forbes <chrisf@ijw.co.nz>
Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
src/mesa/drivers/dri/i965/brw_fs_visitor.cpp
src/mesa/drivers/dri/i965/brw_program.h
src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp
src/mesa/drivers/dri/i965/brw_wm.c

index 262cead1cce41742ca32bb726fcb96e6c6cdeabe..a8ad65928c054a1458622ccb88be3401d3210034 100644 (file)
@@ -1584,6 +1584,10 @@ uint32_t
 fs_visitor::gather_channel(ir_texture *ir, int sampler)
 {
    int swiz = GET_SWZ(c->key.tex.swizzles[sampler], 0 /* red */);
+   if (c->key.tex.gather_channel_quirk_mask & (1<<sampler))
+      return 2;   /* gather4 sampler is broken for green channel on RG32F --
+                   * we must ask for blue instead.
+                   */
    switch (swiz) {
       case SWIZZLE_X: return 0;
       case SWIZZLE_Y: return 1;
index e2ddaa8d70a9e50b7184b0632991a42a51f091f4..07be4a04569ad2f9e763a6c4e047b8b348ea63ba 100644 (file)
@@ -40,6 +40,11 @@ struct brw_sampler_prog_key_data {
     */
    uint16_t yuvtex_mask;
    uint16_t yuvtex_swap_mask; /**< UV swaped */
+
+   /**
+    * For RG32F, gather4's channel select is broken.
+    */
+   uint16_t gather_channel_quirk_mask;
 };
 
 #ifdef __cplusplus
index f6ea28ae007e18cc77b3f6d6a7edea17a59301a0..9e6cc785ba92bf834f1ec69db094707e13de8be0 100644 (file)
@@ -2392,6 +2392,10 @@ uint32_t
 vec4_visitor::gather_channel(ir_texture *ir, int sampler)
 {
    int swiz = GET_SWZ(key->tex.swizzles[sampler], 0 /* red */);
+   if (key->tex.gather_channel_quirk_mask & (1<<sampler))
+      return 2;   /* gather4 sampler is broken for green channel on RG32F --
+                   * we must ask for blue instead.
+                   */
    switch (swiz) {
       case SWIZZLE_X: return 0;
       case SWIZZLE_Y: return 1;
index 9745edac6cae0f353e110b6777c63acb9c8cb19b..3d1ed447cc836d8dd0ac86b46b8ea778feea9b36 100644 (file)
@@ -32,6 +32,7 @@
 #include "brw_context.h"
 #include "brw_wm.h"
 #include "brw_state.h"
+#include "main/enums.h"
 #include "main/formats.h"
 #include "main/fbobject.h"
 #include "main/samplerobj.h"
@@ -233,6 +234,8 @@ brw_debug_recompile_sampler_key(struct brw_context *brw,
                       old_key->yuvtex_mask, key->yuvtex_mask);
    found |= key_debug(brw, "GL_MESA_ycbcr UV swapping\n",
                       old_key->yuvtex_swap_mask, key->yuvtex_swap_mask);
+   found |= key_debug(brw, "gather channel quirk on any texture unit",
+                      old_key->gather_channel_quirk_mask, key->gather_channel_quirk_mask);
 
    return found;
 }
@@ -342,6 +345,12 @@ brw_populate_sampler_prog_key_data(struct gl_context *ctx,
            if (sampler->WrapR == GL_CLAMP)
               key->gl_clamp_mask[2] |= 1 << s;
         }
+
+         /* gather4's channel select for green from RG32F is broken */
+         if (brw->gen >= 7 && prog->UsesGather) {
+            if (img->InternalFormat == GL_RG32F && GET_SWZ(t->_Swizzle, 0) == 1)
+               key->gather_channel_quirk_mask |= 1 << s;
+         }
       }
    }
 }