[Mesa-dev] [PATCH 09/40] glsl: fix uniform remap table cache when explicit locations used

Timothy Arceri tarceri at itsqueeze.com
Sat Feb 11 12:16:09 UTC 2017


On 10/02/17 21:52, Nicolai Hähnle wrote:

> On 07.02.2017 04:42, Timothy Arceri wrote:
>> From: Timothy Arceri <timothy.arceri at collabora.com>
>>
>> ---
>>  src/compiler/glsl/shader_cache.cpp | 32 
>> +++++++++++++++++++++++++-------
>>  1 file changed, 25 insertions(+), 7 deletions(-)
>>
>> diff --git a/src/compiler/glsl/shader_cache.cpp 
>> b/src/compiler/glsl/shader_cache.cpp
>> index ba05655..ff8d150 100644
>> --- a/src/compiler/glsl/shader_cache.cpp
>> +++ b/src/compiler/glsl/shader_cache.cpp
>> @@ -57,7 +57,7 @@
>>  #include "main/core.h"
>>  #include "nir.h"
>>  #include "program.h"
>> -#include "util/disk_cache.h"
>> +#include "shader_cache.h"
>>  #include "util/mesa-sha1.h"
>>  #include "util/string_to_uint_map.h"
>>
>> @@ -283,8 +283,20 @@ write_uniform_remap_table(struct blob *metadata,
>>     blob_write_uint32(metadata, prog->NumUniformRemapTable);
>>
>>     for (unsigned i = 0; i < prog->NumUniformRemapTable; i++) {
>> -      blob_write_uint32(metadata, prog->UniformRemapTable[i] -
>> -                           prog->data->UniformStorage);
>> +      blob_write_uint64(metadata,
>> + ptr_to_uint64_t(prog->UniformRemapTable[i]));
>> +
>> +      if (prog->UniformRemapTable[i] != 
>> INACTIVE_UNIFORM_EXPLICIT_LOCATION &&
>> +          prog->UniformRemapTable[i] != NULL) {
>> +
>> +         /* Here we store the offset rather than calculating it on 
>> restore
>> +          * because gl_uniform_storage may have a different size on the
>> +          * platform we are restoring the cache on.
>> +          */
>> +         uint32_t offset =
>> +            prog->UniformRemapTable[i] - prog->data->UniformStorage;
>> +         blob_write_uint32(metadata, offset);
>> +      }
>>     }
>>  }
>>
>> @@ -294,12 +306,18 @@ read_uniform_remap_table(struct blob_reader 
>> *metadata,
>>  {
>>     prog->NumUniformRemapTable = blob_read_uint32(metadata);
>>
>> -   prog->UniformRemapTable =rzalloc_array(prog, struct 
>> gl_uniform_storage *,
>> - prog->NumUniformRemapTable);
>> +   prog->UniformRemapTable = rzalloc_array(prog, struct 
>> gl_uniform_storage *,
>> + prog->NumUniformRemapTable);
>>
>>     for (unsigned i = 0; i < prog->NumUniformRemapTable; i++) {
>> -      prog->UniformRemapTable[i] =
>> -         prog->data->UniformStorage + blob_read_uint32(metadata);
>> +      uint64_t uni_ptr = blob_read_uint64(metadata);
>> +      if (uni_ptr == (uint64_t) INACTIVE_UNIFORM_EXPLICIT_LOCATION ||
>> +          uni_ptr == (uint64_t) NULL) {
>> +         prog->UniformRemapTable[i] = (gl_uniform_storage *) uni_ptr;
>> +      } else {
>> +         uint32_t uni_offset = blob_read_uint32(metadata);
>> +         prog->UniformRemapTable[i] = prog->data->UniformStorage + 
>> uni_offset;
>> +      }
>
> Instead of storing a pointer that isn't used anyway, IMHO it would be 
> better to store an explicit "union tag" enum.

The glUniform* functions check for INACTIVE_UNIFORM_EXPLICIT_LOCATION so 
it's not unused.

>
> Nicolai
>
>>     }
>>  }
>>
>>
>



More information about the mesa-dev mailing list