[Mesa-dev] [PATCH 2/5] gallium: document breakc and switch/case/default/endswitch

Roland Scheidegger sroland at vmware.com
Fri Apr 19 08:29:59 PDT 2013


Am 19.04.2013 09:26, schrieb Jose Fonseca:
> 
> 
> ----- Original Message -----
>> From: Roland Scheidegger <sroland at vmware.com>
>>
>> docs were missing, especially the opcode-from-hell switch however is anything
>> but obvious.
>> ---
>>  src/gallium/docs/source/tgsi.rst |   57
>>  ++++++++++++++++++++++++++++++++++----
>>  1 file changed, 51 insertions(+), 6 deletions(-)
>>
>> diff --git a/src/gallium/docs/source/tgsi.rst
>> b/src/gallium/docs/source/tgsi.rst
>> index b7180f8..b46347e 100644
>> --- a/src/gallium/docs/source/tgsi.rst
>> +++ b/src/gallium/docs/source/tgsi.rst
>> @@ -861,7 +861,18 @@ This instruction replicates its result.
>>  
>>  .. opcode:: BRK - Break
>>  
>> -  TBD
>> +  Unconditionally moves the point of execution to the instruction after the
>> +  next endloop or endswitch. The instruction must appear within a
>> loop/endloop
>> +  or switch/endswitch.
>> +
>> +
>> +.. opcode:: BREAKC - Break Conditional
>> +
>> +  Conditionally moves the point of execution to the instruction after the
>> +  next endloop or endswitch. The instruction must appear within a
>> loop/endloop
>> +  or switch/endswitch.
>> +  Condition evaluates to true if src0.x != 0 where src0.x is interpreted
>> +  as an integer register.
> 
> This is fine. But I do wonder if hardware can really benefit from "UIF foo; BREAK; ENDIF" vs "BREAKC foo", or if this is just syntactic sugar that merely burdens developers. 
Yes I was considering nuking it instead of documenting it. If the
consensus is it isn't useful we can still do it.
But if it is considered useful, we should probably add the corresponding
callc, continuec, and retc too which work all just the same.

> 
> 
> BTW, svga translates BREAKC, though I think it doesn't follow anywhere near these semantics, so that translation should be removed from the driver:
> $ git grep BREAKC
> [...]
> src/gallium/drivers/svga/svga_tgsi_insn.c:   case TGSI_OPCODE_BREAKC:     return SVGA3DOP_BREAKC;
Oh yes I will fix that. svga3dop_breakc is for dx9 break_comp, so it
takes 2 float args for comparison. That certainly never has worked as we
always had the wrong argument count even.

> [...]
> 
>>  
>>  .. opcode:: IF - Float If
>> @@ -892,6 +903,45 @@ This instruction replicates its result.
>>    Ends an IF or UIF block.
>>  
>>  
>> +.. opcode:: SWITCH - Switch
>> +
>> +   Starts a c-style switch expression. The switch consists of one or
> 
> C-style
> 
>> multiple
>> +   CASE statements, and at most one DEFAULT statement. Execution of a
>> statement
>> +   ends when a BRK is hit, but just like in C falling through to other cases
>> +   without a break is allowed. Similarly, DEFAULT label is allowed anywhere
>> not
>> +   just as last statement, and fallthrough is allowed into/from it.
>> +   CASE src arguments are evaulated at bit level against the SWITCH src
> 
> evaluated
> 
>> argument.
>> +
>> +   Example:
>> +   SWITCH src[0].x
>> +   CASE src[0].x
>> +   (some instructions here)
>> +   (optional BRK here)
>> +   DEFAULT
>> +   (some instructions here)
>> +   (optional BRK here)
>> +   CASE src[0].x
>> +   (some instructions here)
>> +   (optional BRK here)
>> +   ENDSWITCH
>> +
>> +
>> +.. opcode:: CASE - Switch case
>> +
>> +   This represents a switch case label. The src arg must be an integer
>> immediate.
>> +
>> +
>> +.. opcode:: DEFAULT - Switch default
>> +
>> +   This represents the default case in the switch, which is taken if no
>> other
>> +   case matches.
>> +
>> +
>> +.. opcode:: ENDSWITCH - End of switch
>> +
>> +   Ends a switch expression.
>> +
>> +
>>  .. opcode:: PUSHA - Push Address Register On Stack
>>  
>>    push(src.x)
>> @@ -1210,11 +1260,6 @@ XXX wait what
>>  
>>    TBD
>>  
>> -
>> -.. opcode:: BREAKC - Break Conditional
>> -
>> -  TBD
>> -
>>  .. _doubleopcodes:
>>  
>>  Double ISA
>> --
>> 1.7.9.5
>>
> 
> 
> Reviewed-by: Jose Fonseca <jfonseca at vmware.com>
> 

Roland


More information about the mesa-dev mailing list