mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2025-12-27 06:10:13 +01:00
i965/vec4: Emit shader w/a for Gen6 gather
Signed-off-by: Chris Forbes <chrisf@ijw.co.nz> Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
This commit is contained in:
parent
73b91fe05a
commit
31d1077dd2
2 changed files with 32 additions and 0 deletions
|
|
@ -482,6 +482,7 @@ public:
|
|||
|
||||
uint32_t gather_channel(ir_texture *ir, int sampler);
|
||||
src_reg emit_mcs_fetch(ir_texture *ir, src_reg coordinate, int sampler);
|
||||
void emit_gen6_gather_wa(uint8_t wa, dst_reg dst);
|
||||
void swizzle_result(ir_texture *ir, src_reg orig_val, int sampler);
|
||||
|
||||
void emit_ndc_computation();
|
||||
|
|
|
|||
|
|
@ -2499,9 +2499,40 @@ vec4_visitor::visit(ir_texture *ir)
|
|||
}
|
||||
}
|
||||
|
||||
if (brw->gen == 6 && ir->op == ir_tg4) {
|
||||
emit_gen6_gather_wa(key->tex.gen6_gather_wa[sampler], inst->dst);
|
||||
}
|
||||
|
||||
swizzle_result(ir, src_reg(inst->dst), sampler);
|
||||
}
|
||||
|
||||
/**
|
||||
* Apply workarounds for Gen6 gather with UINT/SINT
|
||||
*/
|
||||
void
|
||||
vec4_visitor::emit_gen6_gather_wa(uint8_t wa, dst_reg dst)
|
||||
{
|
||||
if (!wa)
|
||||
return;
|
||||
|
||||
int width = (wa & WA_8BIT) ? 8 : 16;
|
||||
dst_reg dst_f = dst;
|
||||
dst_f.type = BRW_REGISTER_TYPE_F;
|
||||
|
||||
/* Convert from UNORM to UINT */
|
||||
emit(MUL(dst_f, src_reg(dst_f), src_reg((float)((1 << width) - 1))));
|
||||
emit(MOV(dst, src_reg(dst_f)));
|
||||
|
||||
if (wa & WA_SIGN) {
|
||||
/* Reinterpret the UINT value as a signed INT value by
|
||||
* shifting the sign bit into place, then shifting back
|
||||
* preserving sign.
|
||||
*/
|
||||
emit(SHL(dst, src_reg(dst), src_reg(32 - width)));
|
||||
emit(ASR(dst, src_reg(dst), src_reg(32 - width)));
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Set up the gather channel based on the swizzle, for gather4.
|
||||
*/
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue