[Mesa-dev] [PATCH v2 15/28] glsl: Add ubo lowering support for doubles

Ilia Mirkin imirkin at alum.mit.edu
Sat Feb 7 19:47:01 PST 2015


On Fri, Feb 6, 2015 at 3:08 AM, Ian Romanick <idr at freedesktop.org> wrote:
> On 02/06/2015 06:56 AM, Ilia Mirkin wrote:
>> From: Dave Airlie <airlied at gmail.com>
>>
>> Signed-off-by: Dave Airlie <airlied at redhat.com>
>> Reviewed-by: Matt Turner <mattst88 at gmail.com>
>> ---
>>  src/glsl/lower_ubo_reference.cpp | 12 +++++++++---
>>  1 file changed, 9 insertions(+), 3 deletions(-)
>>
>> diff --git a/src/glsl/lower_ubo_reference.cpp b/src/glsl/lower_ubo_reference.cpp
>> index 43dd067..b1eaf62 100644
>> --- a/src/glsl/lower_ubo_reference.cpp
>> +++ b/src/glsl/lower_ubo_reference.cpp
>> @@ -510,16 +510,22 @@ lower_ubo_reference_visitor::emit_ubo_loads(ir_dereference *deref,
>>        base_ir->insert_before(assign(deref->clone(mem_ctx, NULL),
>>                                   ubo_load(deref->type, offset)));
>>     } else {
>> +      unsigned N = deref->type->is_double() ? 8 : 4;
>> +
>>        /* We're dereffing a column out of a row-major matrix, so we
>>         * gather the vector from each stored row.
>>        */
>> -      assert(deref->type->base_type == GLSL_TYPE_FLOAT);
>> +      assert(deref->type->base_type == GLSL_TYPE_FLOAT ||
>> +             deref->type->base_type == GLSL_TYPE_DOUBLE);
>>        /* Matrices, row_major or not, are stored as if they were
>>         * arrays of vectors of the appropriate size in std140.
>>         * Arrays have their strides rounded up to a vec4, so the
>>         * matrix stride is always 16.
>>         */
>
> The comment needs to be updated since the matrix stride is now either 16
> or 32.
>
>> -      unsigned matrix_stride = 16;
>> +      unsigned matrix_stride = 4 * N;
>
> This calculation is wrong.  A dmat2 will end up with a stride of 32 when
> it should be 16.

Ah yeah. I've added the same code as in the other place, with the
assert(items <= 4)

>
>> +
>> +      const glsl_type *ubo_type = deref->type->base_type == GLSL_TYPE_FLOAT ?
>> +         glsl_type::float_type : glsl_type::double_type;
>>
>>        for (unsigned i = 0; i < deref->type->vector_elements; i++) {
>>        ir_rvalue *chan_offset =
>> @@ -527,7 +533,7 @@ lower_ubo_reference_visitor::emit_ubo_loads(ir_dereference *deref,
>>               new(mem_ctx) ir_constant(deref_offset + i * matrix_stride));
>>
>>        base_ir->insert_before(assign(deref->clone(mem_ctx, NULL),
>> -                                    ubo_load(glsl_type::float_type,
>> +                                    ubo_load(ubo_type,
>>                                               chan_offset),
>>                                      (1U << i)));
>>        }
>>
>


More information about the mesa-dev mailing list