glsl: use remap location when serialising uniform program resource data
This allows us to avoid expensive string compares since we already have
a map to the pointers.
These compares were taking ~30 seconds for a single shader compile
in Godot due to it using 64,000+ uniforms.
Fixes: c4cff5f402
("glsl: add basic support for resource list to shader cache")
Reviewed-by: Tapani Pälli <tapani.palli@intel.com>
Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=109229
This commit is contained in:
@@ -764,6 +764,12 @@ get_shader_var_and_pointer_sizes(size_t *s_var_size, size_t *s_var_ptrs,
|
|||||||
sizeof(var->name);
|
sizeof(var->name);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
enum uniform_type
|
||||||
|
{
|
||||||
|
uniform_remapped,
|
||||||
|
uniform_not_remapped
|
||||||
|
};
|
||||||
|
|
||||||
static void
|
static void
|
||||||
write_program_resource_data(struct blob *metadata,
|
write_program_resource_data(struct blob *metadata,
|
||||||
struct gl_shader_program *prog,
|
struct gl_shader_program *prog,
|
||||||
@@ -816,12 +822,19 @@ write_program_resource_data(struct blob *metadata,
|
|||||||
case GL_TESS_CONTROL_SUBROUTINE_UNIFORM:
|
case GL_TESS_CONTROL_SUBROUTINE_UNIFORM:
|
||||||
case GL_TESS_EVALUATION_SUBROUTINE_UNIFORM:
|
case GL_TESS_EVALUATION_SUBROUTINE_UNIFORM:
|
||||||
case GL_UNIFORM:
|
case GL_UNIFORM:
|
||||||
for (unsigned i = 0; i < prog->data->NumUniformStorage; i++) {
|
if (((gl_uniform_storage *)res->Data)->builtin ||
|
||||||
if (strcmp(((gl_uniform_storage *)res->Data)->name,
|
res->Type != GL_UNIFORM) {
|
||||||
prog->data->UniformStorage[i].name) == 0) {
|
blob_write_uint32(metadata, uniform_not_remapped);
|
||||||
blob_write_uint32(metadata, i);
|
for (unsigned i = 0; i < prog->data->NumUniformStorage; i++) {
|
||||||
break;
|
if (strcmp(((gl_uniform_storage *)res->Data)->name,
|
||||||
|
prog->data->UniformStorage[i].name) == 0) {
|
||||||
|
blob_write_uint32(metadata, i);
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
blob_write_uint32(metadata, uniform_remapped);
|
||||||
|
blob_write_uint32(metadata, ((gl_uniform_storage *)res->Data)->remap_location);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case GL_ATOMIC_COUNTER_BUFFER:
|
case GL_ATOMIC_COUNTER_BUFFER:
|
||||||
@@ -906,9 +919,15 @@ read_program_resource_data(struct blob_reader *metadata,
|
|||||||
case GL_COMPUTE_SUBROUTINE_UNIFORM:
|
case GL_COMPUTE_SUBROUTINE_UNIFORM:
|
||||||
case GL_TESS_CONTROL_SUBROUTINE_UNIFORM:
|
case GL_TESS_CONTROL_SUBROUTINE_UNIFORM:
|
||||||
case GL_TESS_EVALUATION_SUBROUTINE_UNIFORM:
|
case GL_TESS_EVALUATION_SUBROUTINE_UNIFORM:
|
||||||
case GL_UNIFORM:
|
case GL_UNIFORM: {
|
||||||
res->Data = &prog->data->UniformStorage[blob_read_uint32(metadata)];
|
enum uniform_type type = (enum uniform_type) blob_read_uint32(metadata);
|
||||||
|
if (type == uniform_not_remapped) {
|
||||||
|
res->Data = &prog->data->UniformStorage[blob_read_uint32(metadata)];
|
||||||
|
} else {
|
||||||
|
res->Data = prog->UniformRemapTable[blob_read_uint32(metadata)];
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
|
}
|
||||||
case GL_ATOMIC_COUNTER_BUFFER:
|
case GL_ATOMIC_COUNTER_BUFFER:
|
||||||
res->Data = &prog->data->AtomicBuffers[blob_read_uint32(metadata)];
|
res->Data = &prog->data->AtomicBuffers[blob_read_uint32(metadata)];
|
||||||
break;
|
break;
|
||||||
|
Reference in New Issue
Block a user