Accidentally replied privately only, sorry.

---------- Forwarded message ----------
From: Chris Forbes <chr...@ijw.co.nz>
Date: Tue, Jul 15, 2014 at 10:27 PM
Subject: Re: [Mesa-dev] [PATCH 2/6] glsl: Mark entire UBO array active
if indexed with non-constant.
To: Ilia Mirkin <imir...@alum.mit.edu>


On Tue, Jul 15, 2014 at 10:20 PM, Ilia Mirkin <imir...@alum.mit.edu> wrote:
> On Sat, Jul 12, 2014 at 9:51 PM, Chris Forbes <chr...@ijw.co.nz> wrote:
>> Without doing a lot more work, we have no idea which indices may
>> be used at runtime, so just mark them all.
>>
>> Signed-off-by: Chris Forbes <chr...@ijw.co.nz>
>> ---
>>  src/glsl/link_uniform_block_active_visitor.cpp | 51 
>> ++++++++++++++++----------
>>  1 file changed, 32 insertions(+), 19 deletions(-)
>>
>> diff --git a/src/glsl/link_uniform_block_active_visitor.cpp 
>> b/src/glsl/link_uniform_block_active_visitor.cpp
>> index d19ce20..4bf7349 100644
>> --- a/src/glsl/link_uniform_block_active_visitor.cpp
>> +++ b/src/glsl/link_uniform_block_active_visitor.cpp
>> @@ -109,32 +109,45 @@ 
>> link_uniform_block_active_visitor::visit_enter(ir_dereference_array *ir)
>>     assert((b->num_array_elements == 0) == (b->array_elements == NULL));
>>     assert(b->type != NULL);
>>
>> -   /* Determine whether or not this array index has already been added to 
>> the
>> -    * list of active array indices.  At this point all constant folding must
>> -    * have occured, and the array index must be a constant.
>> -    */
>>     ir_constant *c = ir->array_index->as_constant();
>> -   assert(c != NULL);
>>
>> -   const unsigned idx = c->get_uint_component(0);
>> +   if (c) {
>> +      /* Index is a constant, so mark just that element used, if not 
>> already */
>> +      const unsigned idx = c->get_uint_component(0);
>>
>> -   unsigned i;
>> -   for (i = 0; i < b->num_array_elements; i++) {
>> -      if (b->array_elements[i] == idx)
>> -        break;
>> -   }
>> +      unsigned i;
>> +      for (i = 0; i < b->num_array_elements; i++) {
>> +         if (b->array_elements[i] == idx)
>> +            break;
>> +      }
>>
>> -   assert(i <= b->num_array_elements);
>> +      assert(i <= b->num_array_elements);
>>
>> -   if (i == b->num_array_elements) {
>> -      b->array_elements = reralloc(this->mem_ctx,
>> -                                  b->array_elements,
>> -                                  unsigned,
>> -                                  b->num_array_elements + 1);
>> +      if (i == b->num_array_elements) {
>> +         b->array_elements = reralloc(this->mem_ctx,
>> +                                      b->array_elements,
>> +                                      unsigned,
>> +                                      b->num_array_elements + 1);
>>
>> -      b->array_elements[b->num_array_elements] = idx;
>> +         b->array_elements[b->num_array_elements] = idx;
>>
>> -      b->num_array_elements++;
>> +         b->num_array_elements++;
>> +      }
>> +   } else {
>> +      /* The array index is not a constant, so mark the entire array used. 
>> */
>> +      assert(b->type->is_array());
>> +      if (b->num_array_elements < b->type->length) {
>
> This condition is a little different than the other case. Is this
> basically to cover the first time that the array is indexed
> dynamically?

Right, so if this check fails, then we've already marked every element
and so don't need to do anything.
Otherwise, we need to expand to the full size of the array and mark
everything in one go.

>
>> +         b->num_array_elements = b->type->length;
>> +         b->array_elements = reralloc(this->mem_ctx,
>> +                                      b->array_elements,
>> +                                      unsigned,
>> +                                      b->num_array_elements);
>> +
>> +         unsigned i;
>
> You'll get yelled at by the MSVC people for this... needs to be at the
> beginning of a block.

This file is C++, so that shouldn't be a problem. I'll happily move it
to the start of the block though.

>
>> +         for (i = 0; i < b->num_array_elements; i++) {
>> +            b->array_elements[i] = i;
>> +         }
>
> I think this is fine, but just want to raise the issue of a situation
> where you start out with some const accesses, and then do a nonconst
> access. The nonconst will erase all the old idx's but since they only
> exist in the array_elements list (at this point in the compilation),
> the reassignment won't cause any issues, right?

That's the idea. I think it's safe (or alternatively, I've completely
misunderstood something) but more scrutiny wouldn't hurt :)
_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to