summaryrefslogtreecommitdiffstats
path: root/src/compiler/glsl
diff options
context:
space:
mode:
Diffstat (limited to 'src/compiler/glsl')
-rw-r--r--src/compiler/glsl/gl_nir_link_uniforms.c69
-rw-r--r--src/compiler/glsl/gl_nir_linker.h3
-rw-r--r--src/compiler/glsl/serialize.cpp6
3 files changed, 76 insertions, 2 deletions
diff --git a/src/compiler/glsl/gl_nir_link_uniforms.c b/src/compiler/glsl/gl_nir_link_uniforms.c
index 6323d2940db..7aebe0dd7e2 100644
--- a/src/compiler/glsl/gl_nir_link_uniforms.c
+++ b/src/compiler/glsl/gl_nir_link_uniforms.c
@@ -249,6 +249,7 @@ struct nir_link_uniforms_state {
unsigned num_shader_uniform_components;
unsigned shader_samplers_used;
unsigned shader_shadow_samplers;
+ struct gl_program_parameter_list *params;
/* per-variable */
nir_variable *current_var;
@@ -256,6 +257,7 @@ struct nir_link_uniforms_state {
bool var_is_in_block;
int top_level_array_size;
int top_level_array_stride;
+ int main_uniform_storage_index;
struct type_tree_entry *current_type;
};
@@ -342,6 +344,59 @@ get_next_index(struct nir_link_uniforms_state *state,
return index;
}
+static void
+add_parameter(struct gl_uniform_storage *uniform,
+ struct gl_context *ctx,
+ struct gl_shader_program *prog,
+ const struct glsl_type *type,
+ struct nir_link_uniforms_state *state)
+{
+ if (!state->params || uniform->is_shader_storage || glsl_contains_opaque(type))
+ return;
+
+ unsigned num_params = glsl_get_aoa_size(type);
+ num_params = MAX2(num_params, 1);
+ num_params *= glsl_get_matrix_columns(glsl_without_array(type));
+
+ bool is_dual_slot = glsl_type_is_dual_slot(glsl_without_array(type));
+ if (is_dual_slot)
+ num_params *= 2;
+
+ struct gl_program_parameter_list *params = state->params;
+ int base_index = params->NumParameters;
+ _mesa_reserve_parameter_storage(params, num_params);
+
+ if (ctx->Const.PackedDriverUniformStorage) {
+ for (unsigned i = 0; i < num_params; i++) {
+ unsigned dmul = glsl_type_is_64bit(glsl_without_array(type)) ? 2 : 1;
+ unsigned comps = glsl_get_vector_elements(glsl_without_array(type)) * dmul;
+ if (is_dual_slot) {
+ if (i & 0x1)
+ comps -= 4;
+ else
+ comps = 4;
+ }
+
+ _mesa_add_parameter(params, PROGRAM_UNIFORM, NULL, comps,
+ glsl_get_gl_type(type), NULL, NULL, false);
+ }
+ } else {
+ for (unsigned i = 0; i < num_params; i++) {
+ _mesa_add_parameter(params, PROGRAM_UNIFORM, NULL, 4,
+ glsl_get_gl_type(type), NULL, NULL, true);
+ }
+ }
+
+ /* Each Parameter will hold the index to the backing uniform storage.
+ * This avoids relying on names to match parameters and uniform
+ * storages.
+ */
+ for (unsigned i = 0; i < num_params; i++) {
+ struct gl_program_parameter *param = &params->Parameters[base_index + i];
+ param->UniformStorageIndex = uniform - prog->data->UniformStorage;
+ param->MainUniformStorageIndex = state->main_uniform_storage_index;
+ }
+}
/**
* Creates the neccessary entries in UniformStorage for the uniform. Returns
@@ -435,6 +490,9 @@ nir_link_uniform(struct gl_context *ctx,
return -1;
}
+ if (state->main_uniform_storage_index == -1)
+ state->main_uniform_storage_index = prog->data->NumUniformStorage;
+
uniform = &prog->data->UniformStorage[prog->data->NumUniformStorage];
prog->data->NumUniformStorage++;
@@ -607,13 +665,17 @@ nir_link_uniform(struct gl_context *ctx,
state->max_uniform_location < uniform->remap_location + entries)
state->max_uniform_location = uniform->remap_location + entries;
+ if (!state->var_is_in_block)
+ add_parameter(uniform, ctx, prog, type, state);
+
return MAX2(uniform->array_elements, 1);
}
}
bool
gl_nir_link_uniforms(struct gl_context *ctx,
- struct gl_shader_program *prog)
+ struct gl_shader_program *prog,
+ bool fill_parameters)
{
/* First free up any previous UniformStorage items */
ralloc_free(prog->data->UniformStorage);
@@ -636,6 +698,7 @@ gl_nir_link_uniforms(struct gl_context *ctx,
state.num_shader_uniform_components = 0;
state.shader_samplers_used = 0;
state.shader_shadow_samplers = 0;
+ state.params = fill_parameters ? sh->Program->Parameters : NULL;
nir_foreach_variable(var, &nir->uniforms) {
struct gl_uniform_storage *uniform = NULL;
@@ -648,6 +711,9 @@ gl_nir_link_uniforms(struct gl_context *ctx,
if (uniform) {
var->data.location = uniform - prog->data->UniformStorage;
+ if (!state.var_is_in_block)
+ add_parameter(uniform, ctx, prog, var->type, &state);
+
continue;
}
@@ -660,6 +726,7 @@ gl_nir_link_uniforms(struct gl_context *ctx,
state.var_is_in_block = nir_variable_is_in_block(var);
state.top_level_array_size = 0;
state.top_level_array_stride = 0;
+ state.main_uniform_storage_index = -1;
/*
* From ARB_program_interface spec, issue (16):
diff --git a/src/compiler/glsl/gl_nir_linker.h b/src/compiler/glsl/gl_nir_linker.h
index 20ed35fa0e4..ecbc3f39090 100644
--- a/src/compiler/glsl/gl_nir_linker.h
+++ b/src/compiler/glsl/gl_nir_linker.h
@@ -32,7 +32,8 @@ struct gl_context;
struct gl_shader_program;
bool gl_nir_link_uniforms(struct gl_context *ctx,
- struct gl_shader_program *prog);
+ struct gl_shader_program *prog,
+ bool fill_parameters);
void gl_nir_set_uniform_initializers(struct gl_context *ctx,
struct gl_shader_program *prog);
diff --git a/src/compiler/glsl/serialize.cpp b/src/compiler/glsl/serialize.cpp
index 552300f7eaf..235188c5c59 100644
--- a/src/compiler/glsl/serialize.cpp
+++ b/src/compiler/glsl/serialize.cpp
@@ -1015,6 +1015,8 @@ write_shader_parameters(struct blob *metadata,
blob_write_uint32(metadata, param->DataType);
blob_write_bytes(metadata, param->StateIndexes,
sizeof(param->StateIndexes));
+ blob_write_uint32(metadata, param->UniformStorageIndex);
+ blob_write_uint32(metadata, param->MainUniformStorageIndex);
i++;
}
@@ -1046,6 +1048,10 @@ read_shader_parameters(struct blob_reader *metadata,
_mesa_add_parameter(params, type, name, size, data_type,
NULL, state_indexes, padded);
+ gl_program_parameter *param = &params->Parameters[i];
+ param->UniformStorageIndex = blob_read_uint32(metadata);
+ param->MainUniformStorageIndex = blob_read_uint32(metadata);
+
i++;
}