[Mesa-dev] [PATCH 5/6] i965/fs: Implement textureSize (TXS) on Gen5+.

Kenneth Graunke kenneth at whitecape.org
Tue Aug 23 11:37:28 PDT 2011


On 08/23/2011 11:18 AM, Eric Anholt wrote:
> On Mon, 22 Aug 2011 16:26:23 -0700, Kenneth Graunke <kenneth at whitecape.org> wrote:
>> Signed-off-by: Kenneth Graunke <kenneth at whitecape.org>
>> ---
>>  src/mesa/drivers/dri/i965/brw_defines.h      |    2 +
>>  src/mesa/drivers/dri/i965/brw_fs.cpp         |    1 +
>>  src/mesa/drivers/dri/i965/brw_fs.h           |    3 +-
>>  src/mesa/drivers/dri/i965/brw_fs_emit.cpp    |    4 +++
>>  src/mesa/drivers/dri/i965/brw_fs_visitor.cpp |   28 +++++++++++++++++++------
>>  src/mesa/program/ir_to_mesa.cpp              |    7 ++++-
>>  6 files changed, 35 insertions(+), 10 deletions(-)

Ah crap.  After receiving Ian and Dave's review, I -just- pushed
these...right before receiving your email.  Sorry...should've waited...

>> diff --git a/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp b/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp
>> index 792799d..3551e3d 100644
>> --- a/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp
>> +++ b/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp
>> @@ -751,6 +751,8 @@ fs_visitor::emit_texture_gen5(ir_texture *ir, fs_reg dst, fs_reg coordinate,
>>     int base_mrf = 2;
>>     int reg_width = c->dispatch_width / 8;
>>     bool header_present = false;
>> +   const int vector_elements =
>> +      ir->coordinate ? ir->coordinate->type->vector_elements : 0;
>>  
>>     if (ir->offset) {
>>        /* The offsets set up by the ir_texture visitor are in the
>> @@ -761,7 +763,7 @@ fs_visitor::emit_texture_gen5(ir_texture *ir, fs_reg dst, fs_reg coordinate,
>>        base_mrf--;
>>     }
>>  
> 
> Whoah, called the accept() method of the null pointer for the coordinate
> and things didn't blow up?

No: fs_visitor::visit(ir_texture *) checks if ir->coordinate != NULL
before calling accept() on it.  This hunk just avoids a NULL-pointer
dereference on ir->coordinate->type->vector_elements and, by setting the
dimensionality of the coordinate to 0, avoids the loops that MOV the
coordinate in.

>> diff --git a/src/mesa/program/ir_to_mesa.cpp b/src/mesa/program/ir_to_mesa.cpp
>> index b222005..e7609df 100644
>> --- a/src/mesa/program/ir_to_mesa.cpp
>> +++ b/src/mesa/program/ir_to_mesa.cpp
>> @@ -2104,7 +2104,10 @@ ir_to_mesa_visitor::visit(ir_texture *ir)
>>     ir_to_mesa_instruction *inst = NULL;
>>     prog_opcode opcode = OPCODE_NOP;
>>  
>> -   ir->coordinate->accept(this);
>> +   if (ir->op == ir_txs)
>> +      this->result = src_reg_for_float(0.0);
>> +   else
>> +      ir->coordinate->accept(this);
>>  
>>     /* Put our coords in a temp.  We'll need to modify them for shadow,
>>      * projection, or LOD, so the only case we'd use it as is is if
>> @@ -2128,6 +2131,7 @@ ir_to_mesa_visitor::visit(ir_texture *ir)
>>  
>>     switch (ir->op) {
>>     case ir_tex:
>> +   case ir_txs:
>>        opcode = OPCODE_TEX;
>>        break;
>>     case ir_txb:
>> @@ -2148,7 +2152,6 @@ ir_to_mesa_visitor::visit(ir_texture *ir)
>>        dy = this->result;
>>        break;
>>     case ir_txf:
>> -   case ir_txs:
>>        assert(!"GLSL 1.30 features unsupported");
>>        break;
>>     }
> 
> The ir_to_mesa hunks probably deserve a separate commit to explain
> what's going on there.
> 
> The other patches are:
> 
> Reviewed-by: Eric Anholt <eric at anholt.net>


More information about the mesa-dev mailing list