diff options
author | Chris Forbes <[email protected]> | 2013-08-11 09:55:30 +1200 |
---|---|---|
committer | Chris Forbes <[email protected]> | 2013-10-03 07:56:20 +1300 |
commit | cfa3c8a0d326e031c349039b95fc1232d9d623eb (patch) | |
tree | 7a7a0681bec18354133435355bc544505d8dca7b | |
parent | 36e25ccd29056d965612523f82d973b43b85313e (diff) |
i965: w/a for gather4 green RG32F
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 <[email protected]>
Reviewed-by: Kenneth Graunke <[email protected]>
-rw-r--r-- | src/mesa/drivers/dri/i965/brw_fs_visitor.cpp | 4 | ||||
-rw-r--r-- | src/mesa/drivers/dri/i965/brw_program.h | 5 | ||||
-rw-r--r-- | src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp | 4 | ||||
-rw-r--r-- | src/mesa/drivers/dri/i965/brw_wm.c | 9 |
4 files changed, 22 insertions, 0 deletions
diff --git a/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp b/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp index 262cead1cce..a8ad65928c0 100644 --- a/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp +++ b/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp @@ -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; diff --git a/src/mesa/drivers/dri/i965/brw_program.h b/src/mesa/drivers/dri/i965/brw_program.h index e2ddaa8d70a..07be4a04569 100644 --- a/src/mesa/drivers/dri/i965/brw_program.h +++ b/src/mesa/drivers/dri/i965/brw_program.h @@ -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 diff --git a/src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp b/src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp index f6ea28ae007..9e6cc785ba9 100644 --- a/src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp +++ b/src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp @@ -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; diff --git a/src/mesa/drivers/dri/i965/brw_wm.c b/src/mesa/drivers/dri/i965/brw_wm.c index 9745edac6ca..3d1ed447cc8 100644 --- a/src/mesa/drivers/dri/i965/brw_wm.c +++ b/src/mesa/drivers/dri/i965/brw_wm.c @@ -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; + } } } } |