Commit 09c6fd45 authored by Chris Forbes's avatar Chris Forbes

i965/fs: Add support for textureGather(.., comp)

- For HSW: Select the channel based on the component selected (swizzle
  is done in HW)
- For IVB: Select the channel based on the swizzle state for the
  component selected. Only apply the RG32F w/a if we actually want
  green -- we're about to flag it regardless of swizzle state.
Signed-off-by: default avatarChris Forbes <chrisf@ijw.co.nz>
Reviewed-by: default avatarKenneth Graunke <kenneth@whitecape.org>
parent 7335bc75
......@@ -1475,7 +1475,8 @@ fs_visitor::visit(ir_texture *ir)
/* When tg4 is used with the degenerate ZERO/ONE swizzles, don't bother
* emitting anything other than setting up the constant result.
*/
int swiz = GET_SWZ(c->key.tex.swizzles[sampler], 0);
ir_constant *chan = ir->lod_info.component->as_constant();
int swiz = GET_SWZ(c->key.tex.swizzles[sampler], chan->value.i[0]);
if (swiz == SWIZZLE_ZERO || swiz == SWIZZLE_ONE) {
fs_reg res = fs_reg(this, glsl_type::vec4_type);
......@@ -1594,14 +1595,17 @@ fs_visitor::visit(ir_texture *ir)
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.
*/
ir_constant *chan = ir->lod_info.component->as_constant();
int swiz = GET_SWZ(c->key.tex.swizzles[sampler], chan->value.i[0]);
switch (swiz) {
case SWIZZLE_X: return 0;
case SWIZZLE_Y: return 1;
case SWIZZLE_Y:
/* gather4 sampler is broken for green channel on RG32F --
* we must ask for blue instead.
*/
if (c->key.tex.gather_channel_quirk_mask & (1<<sampler))
return 2;
return 1;
case SWIZZLE_Z: return 2;
case SWIZZLE_W: return 3;
default:
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment