[Mesa-dev] [PATCH 1/2] mesa/st: add support for dynamic ubo selection

Ilia Mirkin imirkin at alum.mit.edu
Tue Jul 15 04:28:37 PDT 2014


On Wed, Jul 9, 2014 at 9:06 AM, Brian Paul <brianp at vmware.com> wrote:
> On 07/08/2014 08:40 PM, Ilia Mirkin wrote:
>>
>> Signed-off-by: Ilia Mirkin <imirkin at alum.mit.edu>
>> ---
>>
>> With ChrisF's patches to add support for this in core mesa, this generates
>> code like:
>>
>> FRAG
>> DCL OUT[0], COLOR
>> DCL CONST[0]
>> DCL CONST[1][0]
>> DCL CONST[2][0]
>> DCL CONST[3][0]
>> DCL CONST[4][0]
>> DCL TEMP[0], LOCAL
>> DCL ADDR[0..1]
>> IMM[0] UINT32 {0, 0, 0, 0}
>> IMM[1] INT32 {1, 0, 0, 0}
>>    0: UADD TEMP[0].x, CONST[0].xxxx, IMM[1].xxxx
>>    1: UARL ADDR[1].x, TEMP[0].xxxx
>>    2: UARL ADDR[1].x, TEMP[0].xxxx
>>    3: MOV TEMP[0], CONST[ADDR[1].x][0]
>>    4: MOV OUT[0], TEMP[0]
>>    5: END
>>
>> Not sure what the deal is with the two UARL's, but nouveau's backend
>> removes
>> one of them pretty easily. I assume others handle this too.
>
>
> Yeah, I noticed this too when I was doing some UBO work last week.  I
> haven't had time to investigate yet.

Does this change look good though? Looks like Chris's non-const UBO
indexing patches are ~ready. With some tweaks to the nvc0 logic, the
simple tests pass on nouveau (and there are no 'complex' tests).

>
> -Brian
>
>
>>
>> Unfortunately the core patches aren't quite ready yet, but this patch
>> doesn't
>> regress anything.
>>
>>   src/mesa/state_tracker/st_glsl_to_tgsi.cpp | 20 +++++++++++++++++---
>>   1 file changed, 17 insertions(+), 3 deletions(-)
>>
>> diff --git a/src/mesa/state_tracker/st_glsl_to_tgsi.cpp
>> b/src/mesa/state_tracker/st_glsl_to_tgsi.cpp
>> index 9bc7500..3202c56 100644
>> --- a/src/mesa/state_tracker/st_glsl_to_tgsi.cpp
>> +++ b/src/mesa/state_tracker/st_glsl_to_tgsi.cpp
>> @@ -1947,16 +1947,16 @@ glsl_to_tgsi_visitor::visit(ir_expression *ir)
>>         break;
>>
>>      case ir_binop_ubo_load: {
>> -      ir_constant *uniform_block = ir->operands[0]->as_constant();
>> +      ir_constant *const_uniform_block = ir->operands[0]->as_constant();
>>         ir_constant *const_offset_ir = ir->operands[1]->as_constant();
>>         unsigned const_offset = const_offset_ir ?
>> const_offset_ir->value.u[0] : 0;
>> +      unsigned const_block = const_uniform_block ?
>> const_uniform_block->value.u[0] + 1 : 0;
>>         st_src_reg index_reg = get_temp(glsl_type::uint_type);
>>         st_src_reg cbuf;
>>
>>         cbuf.type = glsl_type::vec4_type->base_type;
>>         cbuf.file = PROGRAM_CONSTANT;
>>         cbuf.index = 0;
>> -      cbuf.index2D = uniform_block->value.u[0] + 1;
>>         cbuf.reladdr = NULL;
>>         cbuf.negate = 0;
>>
>> @@ -1966,7 +1966,6 @@ glsl_to_tgsi_visitor::visit(ir_expression *ir)
>>            /* Constant index into constant buffer */
>>            cbuf.reladdr = NULL;
>>            cbuf.index = const_offset / 16;
>> -         cbuf.has_index2 = true;
>>         }
>>         else {
>>            /* Relative/variable index into constant buffer */
>> @@ -1976,6 +1975,21 @@ glsl_to_tgsi_visitor::visit(ir_expression *ir)
>>            memcpy(cbuf.reladdr, &index_reg, sizeof(index_reg));
>>         }
>>
>> +      if (const_uniform_block) {
>> +         /* Constant constant buffer */
>> +         cbuf.reladdr2 = NULL;
>> +         cbuf.index2D = const_block;
>> +         cbuf.has_index2 = true;
>> +      }
>> +      else {
>> +         /* Relative/variable constant buffer */
>> +         emit(ir, TGSI_OPCODE_UADD, st_dst_reg(index_reg), op[0],
>> +              st_src_reg_for_int(1));
>> +         cbuf.reladdr2 = ralloc(mem_ctx, st_src_reg);
>> +         memcpy(cbuf.reladdr2, &index_reg, sizeof(index_reg));
>> +         cbuf.has_index2 = true;
>> +      }
>> +
>>         cbuf.swizzle = swizzle_for_size(ir->type->vector_elements);
>>         cbuf.swizzle += MAKE_SWIZZLE4(const_offset % 16 / 4,
>>                                       const_offset % 16 / 4,
>>
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/mesa-dev


More information about the mesa-dev mailing list