[Mesa-dev] [PATCH 4/4] st/mesa: use new float comparison opcodes if native integers are supported

Roland Scheidegger sroland at vmware.com
Tue Aug 13 14:42:46 PDT 2013


Am 13.08.2013 23:38, schrieb Brian Paul:
> On 08/13/2013 11:04 AM, sroland at vmware.com wrote:
>> From: Roland Scheidegger <sroland at vmware.com>
>>
>> Should get rid of some float-to-int conversions (with negation).
>> No piglit regressions (with llvmpipe).
>> ---
>>   src/mesa/state_tracker/st_glsl_to_tgsi.cpp |   45
>> ++++++++++------------------
>>   1 file changed, 15 insertions(+), 30 deletions(-)
>>
>> diff --git a/src/mesa/state_tracker/st_glsl_to_tgsi.cpp
>> b/src/mesa/state_tracker/st_glsl_to_tgsi.cpp
>> index d9b4ed2..65ba449 100644
>> --- a/src/mesa/state_tracker/st_glsl_to_tgsi.cpp
>> +++ b/src/mesa/state_tracker/st_glsl_to_tgsi.cpp
>> @@ -420,8 +420,6 @@ public:
>>      void emit_scalar(ir_instruction *ir, unsigned op,
>>                   st_dst_reg dst, st_src_reg src0, st_src_reg src1);
>>
>> -   void try_emit_float_set(ir_instruction *ir, unsigned op,
>> st_dst_reg dst);
>> -
>>      void emit_arl(ir_instruction *ir, st_dst_reg dst, st_src_reg src0);
>>
>>      void emit_scs(ir_instruction *ir, unsigned op,
>> @@ -594,9 +592,6 @@ glsl_to_tgsi_visitor::emit(ir_instruction *ir,
>> unsigned op,
>>
>>      this->instructions.push_tail(inst);
>>
>> -   if (native_integers)
>> -      try_emit_float_set(ir, op, dst);
>> -
>>      return inst;
>>   }
>>
>> @@ -622,25 +617,6 @@ glsl_to_tgsi_visitor::emit(ir_instruction *ir,
>> unsigned op)
>>      return emit(ir, op, undef_dst, undef_src, undef_src, undef_src);
>>   }
>>
>> - /**
>> - * Emits the code to convert the result of float SET instructions to
>> integers.
>> - */
>> -void
>> -glsl_to_tgsi_visitor::try_emit_float_set(ir_instruction *ir, unsigned
>> op,
>> -                 st_dst_reg dst)
>> -{
>> -   if ((op == TGSI_OPCODE_SEQ ||
>> -        op == TGSI_OPCODE_SNE ||
>> -        op == TGSI_OPCODE_SGE ||
>> -        op == TGSI_OPCODE_SLT))
>> -   {
>> -      st_src_reg src = st_src_reg(dst);
>> -      src.negate = ~src.negate;
>> -      dst.type = GLSL_TYPE_FLOAT;
>> -      emit(ir, TGSI_OPCODE_F2I, dst, src);
>> -   }
>> -}
>> -
>>   /**
>>    * Determines whether to use an integer, unsigned integer, or float
>> opcode
>>    * based on the operands and input opcode, then emits the result.
>> @@ -672,6 +648,15 @@ glsl_to_tgsi_visitor::get_opcode(ir_instruction
>> *ir, unsigned op,
>>   #define case2fi(f, i)   case4(f, f, i, i)
>>   #define case2iu(i, u)   case4(i, LAST, i, u)
>>
>> +#define casecomp(c, f, i, u) \
>> +   case TGSI_OPCODE_##c: \
>> +      if (type == GLSL_TYPE_INT) op = TGSI_OPCODE_##i; \
>> +      else if (type == GLSL_TYPE_UINT) op = TGSI_OPCODE_##u; \
>> +      else if (native_integers) \
>> +         op = TGSI_OPCODE_##f; \
>> +      else op = TGSI_OPCODE_##c; \
>> +      break;
>> +
> 
> Would you mind cleaning up the formatting of that macro...
> 
> case x:
>   if (type == GLSL_TYPE_INT)
>       op = ...
>   else if (type == GLSL_TYPE_UINT)
>       op = ...
>   else if (native_integers)
>       op = ...
>   else
>       op = ...
>   break;
> 
> 
Ok. I copied it from the case4 macro right above it that's why only one
case (the new one) has any indentation :-).

Roland



>>      switch(op) {
>>         case2fi(ADD, UADD);
>>         case2fi(MUL, UMUL);
>> @@ -680,12 +665,12 @@ glsl_to_tgsi_visitor::get_opcode(ir_instruction
>> *ir, unsigned op,
>>         case3(MAX, IMAX, UMAX);
>>         case3(MIN, IMIN, UMIN);
>>         case2iu(MOD, UMOD);
>> -
>> -      case2fi(SEQ, USEQ);
>> -      case2fi(SNE, USNE);
>> -      case3(SGE, ISGE, USGE);
>> -      case3(SLT, ISLT, USLT);
>> -
>> +
>> +      casecomp(SEQ, FSEQ, USEQ, USEQ);
>> +      casecomp(SNE, FSNE, USNE, USNE);
>> +      casecomp(SGE, FSGE, ISGE, USGE);
>> +      casecomp(SLT, FSLT, ISLT, USLT);
>> +
>>         case2iu(ISHR, USHR);
>>
>>         case2fi(SSG, ISSG);
>>
> 
> Reviewed-by: Brian Paul <brianp at vmware.com>


More information about the mesa-dev mailing list