Browse Source

i965/fs: Clear result before visiting shadow comparitor and LOD info.

Commit 53c89c67f3 ("i965: Avoid generating
MOVs for assignments of expressions.") added the line "this->result =
reg_undef" all over the code.  Unfortunately, since Eric developed his
patch before I landed Ivybridge support, he missed adding it to
fs_visitor::emit_texture_gen7() after rebasing.

Furthermore, since I developed TXD support before Eric's patch, I
neglected to add it to the gradient handling when I rebased.

Neglecting to set this causes the visitor to use this->result as storage
rather than generating a new temporary.  These missing statements
resulted in the same register being used to store several different
values.

Fixes the following piglit tests on Ivybridge:
- glsl-fs-shadow2dproj.shader_test
- glsl-fs-shadow2dproj-bias.shader_test

NOTE: This is a candidate for the 7.11 branch.

Signed-off-by: Kenneth Graunke <kenneth@whitecape.org>
Reviewed-by: Eric Anholt <eric@anholt.net>
tags/mesa-8.0-rc1
Kenneth Graunke 14 years ago
parent
commit
156cef0fba
1 changed files with 10 additions and 0 deletions
  1. 10
    0
      src/mesa/drivers/dri/i965/brw_fs_visitor.cpp

+ 10
- 0
src/mesa/drivers/dri/i965/brw_fs_visitor.cpp View File

/* gen4's SIMD8 sampler always has the slots for u,v,r present. */ /* gen4's SIMD8 sampler always has the slots for u,v,r present. */
mlen += 3; mlen += 3;
} else if (ir->op == ir_txd) { } else if (ir->op == ir_txd) {
this->result = reg_undef;
ir->lod_info.grad.dPdx->accept(this); ir->lod_info.grad.dPdx->accept(this);
fs_reg dPdx = this->result; fs_reg dPdx = this->result;


this->result = reg_undef;
ir->lod_info.grad.dPdy->accept(this); ir->lod_info.grad.dPdy->accept(this);
fs_reg dPdy = this->result; fs_reg dPdy = this->result;


inst = emit(FS_OPCODE_TXL, dst); inst = emit(FS_OPCODE_TXL, dst);
break; break;
case ir_txd: { case ir_txd: {
this->result = reg_undef;
ir->lod_info.grad.dPdx->accept(this); ir->lod_info.grad.dPdx->accept(this);
fs_reg dPdx = this->result; fs_reg dPdx = this->result;


this->result = reg_undef;
ir->lod_info.grad.dPdy->accept(this); ir->lod_info.grad.dPdy->accept(this);
fs_reg dPdy = this->result; fs_reg dPdy = this->result;


} }


if (ir->shadow_comparitor && ir->op != ir_txd) { if (ir->shadow_comparitor && ir->op != ir_txd) {
this->result = reg_undef;
ir->shadow_comparitor->accept(this); ir->shadow_comparitor->accept(this);
emit(BRW_OPCODE_MOV, fs_reg(MRF, base_mrf + mlen), this->result); emit(BRW_OPCODE_MOV, fs_reg(MRF, base_mrf + mlen), this->result);
mlen += reg_width; mlen += reg_width;
case ir_tex: case ir_tex:
break; break;
case ir_txb: case ir_txb:
this->result = reg_undef;
ir->lod_info.bias->accept(this); ir->lod_info.bias->accept(this);
emit(BRW_OPCODE_MOV, fs_reg(MRF, base_mrf + mlen), this->result); emit(BRW_OPCODE_MOV, fs_reg(MRF, base_mrf + mlen), this->result);
mlen += reg_width; mlen += reg_width;
break; break;
case ir_txl: case ir_txl:
this->result = reg_undef;
ir->lod_info.lod->accept(this); ir->lod_info.lod->accept(this);
emit(BRW_OPCODE_MOV, fs_reg(MRF, base_mrf + mlen), this->result); emit(BRW_OPCODE_MOV, fs_reg(MRF, base_mrf + mlen), this->result);
mlen += reg_width; mlen += reg_width;
if (c->dispatch_width == 16) if (c->dispatch_width == 16)
fail("Gen7 does not support sample_d/sample_d_c in SIMD16 mode."); fail("Gen7 does not support sample_d/sample_d_c in SIMD16 mode.");


this->result = reg_undef;
ir->lod_info.grad.dPdx->accept(this); ir->lod_info.grad.dPdx->accept(this);
fs_reg dPdx = this->result; fs_reg dPdx = this->result;


this->result = reg_undef;
ir->lod_info.grad.dPdy->accept(this); ir->lod_info.grad.dPdy->accept(this);
fs_reg dPdy = this->result; fs_reg dPdy = this->result;


if (hw_compare_supported) { if (hw_compare_supported) {
inst->shadow_compare = true; inst->shadow_compare = true;
} else { } else {
this->result = reg_undef;
ir->shadow_comparitor->accept(this); ir->shadow_comparitor->accept(this);
fs_reg ref = this->result; fs_reg ref = this->result;



Loading…
Cancel
Save