ping
On Sat, Jul 19, 2014 at 11:45 PM, Ilia Mirkin <imir...@alum.mit.edu> wrote: > Signed-off-by: Ilia Mirkin <imir...@alum.mit.edu> > --- > > Brian reviewed the first bits of this, but it turns out I had to change > src_register as well. Also I realized that instead of doing the UADD I could > just index2D to 1 in order to generate something like > > 6: MOV TEMP[0], CONST[ADDR[1].x+1][ADDR[0].x] > > So... that's what I did. Anyways, with this (and a small nvc0 adjustment), > nvc0 passes all the new ARB_gs5 ubo tests. > > src/mesa/state_tracker/st_glsl_to_tgsi.cpp | 62 > ++++++++++++++++-------------- > 1 file changed, 34 insertions(+), 28 deletions(-) > > diff --git a/src/mesa/state_tracker/st_glsl_to_tgsi.cpp > b/src/mesa/state_tracker/st_glsl_to_tgsi.cpp > index 5ea1465..27e4615 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,20 @@ 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 */ > + cbuf.reladdr2 = ralloc(mem_ctx, st_src_reg); > + cbuf.index2D = 1; > + memcpy(cbuf.reladdr2, &op[0], sizeof(st_src_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, > @@ -4367,51 +4380,45 @@ dst_register(struct st_translate *t, > * Map a glsl_to_tgsi src register to a TGSI ureg_src register. > */ > static struct ureg_src > -src_register(struct st_translate *t, > - gl_register_file file, > - GLint index, GLint index2D) > +src_register(struct st_translate *t, const struct st_src_reg *reg) > { > - switch(file) { > + switch(reg->file) { > case PROGRAM_UNDEFINED: > return ureg_src_undef(); > > case PROGRAM_TEMPORARY: > case PROGRAM_ARRAY: > - return ureg_src(dst_register(t, file, index)); > + return ureg_src(dst_register(t, reg->file, reg->index)); > > case PROGRAM_UNIFORM: > - assert(index >= 0); > - return t->constants[index]; > + assert(reg->index >= 0); > + return t->constants[reg->index]; > case PROGRAM_STATE_VAR: > case PROGRAM_CONSTANT: /* ie, immediate */ > - if (index2D) { > - struct ureg_src src; > - src = ureg_src_register(TGSI_FILE_CONSTANT, index); > - src.Dimension = 1; > - src.DimensionIndex = index2D; > - return src; > - } else if (index < 0) > + if (reg->has_index2) > + return ureg_src_register(TGSI_FILE_CONSTANT, reg->index); > + else if (reg->index < 0) > return ureg_DECL_constant(t->ureg, 0); > else > - return t->constants[index]; > + return t->constants[reg->index]; > > case PROGRAM_IMMEDIATE: > - return t->immediates[index]; > + return t->immediates[reg->index]; > > case PROGRAM_INPUT: > - assert(t->inputMapping[index] < Elements(t->inputs)); > - return t->inputs[t->inputMapping[index]]; > + assert(t->inputMapping[reg->index] < Elements(t->inputs)); > + return t->inputs[t->inputMapping[reg->index]]; > > case PROGRAM_OUTPUT: > - assert(t->outputMapping[index] < Elements(t->outputs)); > - return ureg_src(t->outputs[t->outputMapping[index]]); /* not needed? */ > + assert(t->outputMapping[reg->index] < Elements(t->outputs)); > + return ureg_src(t->outputs[t->outputMapping[reg->index]]); /* not > needed? */ > > case PROGRAM_ADDRESS: > - return ureg_src(t->address[index]); > + return ureg_src(t->address[reg->index]); > > case PROGRAM_SYSTEM_VALUE: > - assert(index < (int) Elements(t->systemValues)); > - return t->systemValues[index]; > + assert(reg->index < (int) Elements(t->systemValues)); > + return t->systemValues[reg->index]; > > default: > assert(!"unknown src register file"); > @@ -4472,13 +4479,12 @@ translate_dst(struct st_translate *t, > static struct ureg_src > translate_src(struct st_translate *t, const st_src_reg *src_reg) > { > - struct ureg_src src = src_register(t, src_reg->file, src_reg->index, > src_reg->index2D); > + struct ureg_src src = src_register(t, src_reg); > > if (src_reg->has_index2) { > /* 2D indexes occur with geometry shader inputs (attrib, vertex) > * and UBO constant buffers (buffer, position). > */ > - src = src_register(t, src_reg->file, src_reg->index, src_reg->index2D); > if (src_reg->reladdr2) > src = ureg_src_dimension_indirect(src, ureg_src(t->address[1]), > src_reg->index2D); > -- > 1.8.5.5 > _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev