[Mesa-dev] [PATCH v5 12/70] glsl: implement unsized array length

Ilia Mirkin imirkin at alum.mit.edu
Sun Dec 13 20:10:45 PST 2015


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.

Cheers,

  -ilia


More information about the mesa-dev mailing list