On Wed, Jul 9, 2014 at 9:06 AM, Brian Paul <bri...@vmware.com> wrote: > On 07/08/2014 08:40 PM, Ilia Mirkin wrote: >> >> Signed-off-by: Ilia Mirkin <imir...@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@lists.freedesktop.org > http://lists.freedesktop.org/mailman/listinfo/mesa-dev _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev