[Mesa-dev] [PATCH] glsl: move uniform calculation to link_uniforms
Matt Turner
mattst88 at gmail.com
Sat Jan 16 14:32:29 PST 2016
On Fri, Jan 15, 2016 at 9:40 PM, Tapani Pälli <tapani.palli at intel.com> wrote:
> Patch moves uniform calculation to happen during link_uniforms, this
> is possible with help of UniformRemapTable that has all the reserved
> locations.
>
> Location assignment for implicit locations is changed so that we
> utilize also the 'holes' that explicit uniform location assignment
> might have left in UniformRemapTable, this makes it possible to fit
> more uniforms as previously we were lazy here and wasting space.
>
> Fixes following CTS tests:
> ES31-CTS.explicit_uniform_location.uniform-loc-mix-with-implicit-max
> ES31-CTS.explicit_uniform_location.uniform-loc-mix-with-implicit-max-array
>
> Signed-off-by: Tapani Pälli <tapani.palli at intel.com>
> ---
> src/glsl/link_uniforms.cpp | 78 ++++++++++++++++++++++++++++++++++++++++------
> src/glsl/linker.cpp | 19 ++++-------
> src/glsl/linker.h | 3 +-
> 3 files changed, 77 insertions(+), 23 deletions(-)
>
> diff --git a/src/glsl/link_uniforms.cpp b/src/glsl/link_uniforms.cpp
> index 33b2d4c..91e973a 100644
> --- a/src/glsl/link_uniforms.cpp
> +++ b/src/glsl/link_uniforms.cpp
> @@ -1057,9 +1057,31 @@ assign_hidden_uniform_slot_id(const char *name, unsigned hidden_id,
> uniform_size->map->put(hidden_uniform_start + hidden_id, name);
> }
>
> +/**
> + * Search UniformRemapTable for empty block big enough to hold given uniform.
> + * TODO Optimize this algorithm later if it turns out to be a major bottleneck.
> + */
> +static int
> +seek_empty_block(struct gl_shader_program *prog,
I might name this "find" instead of "seek"
> + struct gl_uniform_storage *uniform)
> +{
> + const unsigned entries = MAX2(1, uniform->array_elements);
> + for (unsigned i = 0, j; i < prog->NumUniformRemapTable; i++)
This function *needs* braces! Four nesting levels and only two of them
include braces.
Shouldn't j be declared in the inner for-loop? I don't think j's
larger scope is needed by this code.
> + if (prog->UniformRemapTable[i] == NULL) {
> + for (j = i; j < entries && j < prog->NumUniformRemapTable; j++)
> + if (prog->UniformRemapTable[j] != NULL) {
> + i = j;
> + break;
> + }
> + return i;
> + }
> + return -1;
> +}
More information about the mesa-dev
mailing list