[Mesa-dev] [PATCH v5 12/70] glsl: implement unsized array length
Iago Toral
itoral at igalia.com
Sun Dec 13 23:00:00 PST 2015
On Sun, 2015-12-13 at 23:10 -0500, Ilia Mirkin wrote:
> On Thu, Sep 10, 2015 at 9:35 AM, Iago Toral Quiroga <itoral at igalia.com> wrote:
> > +ir_expression *
> > +lower_ubo_reference_visitor::process_ssbo_unsized_array_length(ir_rvalue **rvalue,
> > + ir_dereference *deref,
> > + ir_variable *var)
> > +{
> > + mem_ctx = ralloc_parent(*rvalue);
> > +
> > + ir_rvalue *base_offset = NULL;
> > + unsigned const_offset;
> > + bool row_major;
> > + int matrix_columns;
> > + int unsized_array_stride = calculate_unsized_array_stride(deref);
> > +
> > + /* Compute the offset to the start if the dereference as well as other
> > + * information we need to calculate the length.
> > + */
> > + setup_for_load_or_store(var, deref,
> > + &base_offset, &const_offset,
> > + &row_major, &matrix_columns);
> > + /* array.length() =
> > + * max((buffer_object_size - offset_of_array) / stride_of_array, 0)
> > + */
> > + ir_expression *buffer_size = emit_ssbo_get_buffer_size();
> > +
> > + ir_expression *offset_of_array = new(mem_ctx)
> > + ir_expression(ir_binop_add, base_offset,
> > + new(mem_ctx) ir_constant(const_offset));
> > + ir_expression *offset_of_array_int = new(mem_ctx)
> > + ir_expression(ir_unop_u2i, offset_of_array);
> > +
> > + ir_expression *sub = new(mem_ctx)
> > + ir_expression(ir_binop_sub, buffer_size, offset_of_array_int);
> > + ir_expression *div = new(mem_ctx)
> > + ir_expression(ir_binop_div, sub,
> > + new(mem_ctx) ir_constant(unsized_array_stride));
> > + ir_expression *max = new(mem_ctx)
> > + ir_expression(ir_binop_max, div, new(mem_ctx) ir_constant(0));
> > +
> > + return max;
> > +}
>
> Hi Iago,
>
> I noticed that this comes out as a signed division. Is there any way
> to make it into an unsigned division? That way we can e.g. optimize a
> power-of-two division into a shift, and it's a few instructions fewer
> to emulate when there's no built-in integer division instruction
> (which I think is most GPUs). It seems that you went to some trouble
> to do all this with signed integers, but I can't quite figure out why.
Hi Ilia,
I agree, I don't see why we would do the extra work to make this
signed... Samuel wrote this code though, so I'll let him confirm.
Iago
More information about the mesa-dev
mailing list