glsl: fix uniform remap table cache when explicit locations used
V2: don't store pointers use an enum instead to flag what should be restored. Also do the work in a helper that we will later use for the subroutine remap table. Reviewed-by: Nicolai Hähnle <nicolai.haehnle@amd.com>
This commit is contained in:

committed by
Timothy Arceri

parent
a01973a784
commit
3c45d8f464
@@ -57,7 +57,7 @@
|
|||||||
#include "main/core.h"
|
#include "main/core.h"
|
||||||
#include "nir.h"
|
#include "nir.h"
|
||||||
#include "program.h"
|
#include "program.h"
|
||||||
#include "util/disk_cache.h"
|
#include "shader_cache.h"
|
||||||
#include "util/mesa-sha1.h"
|
#include "util/mesa-sha1.h"
|
||||||
#include "util/string_to_uint_map.h"
|
#include "util/string_to_uint_map.h"
|
||||||
|
|
||||||
@@ -275,6 +275,29 @@ read_uniforms(struct blob_reader *metadata, struct gl_shader_program *prog)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
enum uniform_remap_type
|
||||||
|
{
|
||||||
|
remap_type_inactive_explicit_location,
|
||||||
|
remap_type_null_ptr,
|
||||||
|
remap_type_uniform_offset
|
||||||
|
};
|
||||||
|
|
||||||
|
static void
|
||||||
|
write_uniform_remap_table_entry(struct blob *metadata,
|
||||||
|
gl_uniform_storage *uniform_storage,
|
||||||
|
gl_uniform_storage *entry)
|
||||||
|
{
|
||||||
|
if (entry == INACTIVE_UNIFORM_EXPLICIT_LOCATION) {
|
||||||
|
blob_write_uint32(metadata, remap_type_inactive_explicit_location);
|
||||||
|
} else if (entry == NULL) {
|
||||||
|
blob_write_uint32(metadata, remap_type_null_ptr);
|
||||||
|
} else {
|
||||||
|
blob_write_uint32(metadata, remap_type_uniform_offset);
|
||||||
|
|
||||||
|
uint32_t offset = entry - uniform_storage;
|
||||||
|
blob_write_uint32(metadata, offset);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
write_uniform_remap_table(struct blob *metadata,
|
write_uniform_remap_table(struct blob *metadata,
|
||||||
@@ -283,8 +306,24 @@ write_uniform_remap_table(struct blob *metadata,
|
|||||||
blob_write_uint32(metadata, prog->NumUniformRemapTable);
|
blob_write_uint32(metadata, prog->NumUniformRemapTable);
|
||||||
|
|
||||||
for (unsigned i = 0; i < prog->NumUniformRemapTable; i++) {
|
for (unsigned i = 0; i < prog->NumUniformRemapTable; i++) {
|
||||||
blob_write_uint32(metadata, prog->UniformRemapTable[i] -
|
write_uniform_remap_table_entry(metadata, prog->data->UniformStorage,
|
||||||
prog->data->UniformStorage);
|
prog->UniformRemapTable[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
read_uniform_remap_table_entry(struct blob_reader *metadata,
|
||||||
|
gl_uniform_storage *uniform_storage,
|
||||||
|
gl_uniform_storage **entry,
|
||||||
|
enum uniform_remap_type type)
|
||||||
|
{
|
||||||
|
if (type == remap_type_inactive_explicit_location) {
|
||||||
|
*entry = INACTIVE_UNIFORM_EXPLICIT_LOCATION;
|
||||||
|
} else if (type == remap_type_null_ptr) {
|
||||||
|
*entry = NULL;
|
||||||
|
} else {
|
||||||
|
uint32_t uni_offset = blob_read_uint32(metadata);
|
||||||
|
*entry = uniform_storage + uni_offset;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -294,12 +333,15 @@ read_uniform_remap_table(struct blob_reader *metadata,
|
|||||||
{
|
{
|
||||||
prog->NumUniformRemapTable = blob_read_uint32(metadata);
|
prog->NumUniformRemapTable = blob_read_uint32(metadata);
|
||||||
|
|
||||||
prog->UniformRemapTable =rzalloc_array(prog, struct gl_uniform_storage *,
|
prog->UniformRemapTable = rzalloc_array(prog, struct gl_uniform_storage *,
|
||||||
prog->NumUniformRemapTable);
|
prog->NumUniformRemapTable);
|
||||||
|
|
||||||
for (unsigned i = 0; i < prog->NumUniformRemapTable; i++) {
|
for (unsigned i = 0; i < prog->NumUniformRemapTable; i++) {
|
||||||
prog->UniformRemapTable[i] =
|
enum uniform_remap_type type =
|
||||||
prog->data->UniformStorage + blob_read_uint32(metadata);
|
(enum uniform_remap_type) blob_read_uint32(metadata);
|
||||||
|
|
||||||
|
read_uniform_remap_table_entry(metadata, prog->data->UniformStorage,
|
||||||
|
&prog->UniformRemapTable[i], type);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user