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 <chrisf@ijw.co.nz>
Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
This commit is contained in:
@@ -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;
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user