[Mesa-dev] [PATCH v2 03/24] mesa/glsl: build list of program resources during linking
Tapani
tapani.palli at intel.com
Mon Apr 20 20:51:18 PDT 2015
On 04/21/2015 04:49 AM, Matt Turner wrote:
> On Wed, Apr 1, 2015 at 5:14 AM, Tapani Pälli <tapani.palli at intel.com> wrote:
>> Patch adds ProgramResourceList to gl_shader_program structure.
>> List contains references to active program resources and is
>> constructed during linking phase.
>>
>> This list will be used by follow-up patches to implement hooks
>> for GL_ARB_program_interface_query. It can be also used to
>> implement any of the older shader program query APIs.
>>
>> v2: code cleanups + note for SSBO and subroutines (Ilia Mirkin)
>>
>> Signed-off-by: Tapani Pälli <tapani.palli at intel.com>
>> ---
>> src/glsl/linker.cpp | 179 ++++++++++++++++++++++++++++++++++++++++++++++
>> src/mesa/main/mtypes.h | 14 ++++
>> src/mesa/main/shaderobj.c | 6 ++
>> 3 files changed, 199 insertions(+)
>>
>> diff --git a/src/glsl/linker.cpp b/src/glsl/linker.cpp
>> index 73432b2..a757425 100644
>> --- a/src/glsl/linker.cpp
>> +++ b/src/glsl/linker.cpp
>> @@ -2492,6 +2492,181 @@ check_explicit_uniform_locations(struct gl_context *ctx,
>> delete uniform_map;
>> }
>>
>> +static bool
>> +add_program_resource(struct gl_shader_program *prog, GLenum type,
>> + const void *data, uint8_t stages)
>> +{
>> + assert(data);
>> +
>> + /* If resource already exists, do not add it again. */
>> + for (unsigned i = 0; i < prog->NumProgramResourceList; i++)
>> + if (prog->ProgramResourceList[i].Data == data)
>> + return true;
>> +
>> + prog->ProgramResourceList =
>> + reralloc(prog,
>> + prog->ProgramResourceList,
>> + gl_program_resource,
>> + prog->NumProgramResourceList + 1);
>> +
>> + if (!prog->ProgramResourceList) {
>> + linker_error(prog, "Out of memory during linking.\n");
>> + return false;
>> + }
>> +
>> + struct gl_program_resource *res =
>> + &prog->ProgramResourceList[prog->NumProgramResourceList];
>> +
>> + res->Type = type;
>> + res->Data = data;
>> + res->StageReferences = stages;
>> +
>> + prog->NumProgramResourceList++;
>> +
>> + return true;
>> +}
>> +
>> +/**
>> + * Function builds a stage reference bitmask from variable name.
>> + */
>> +static uint8_t
>> +build_stageref(struct gl_shader_program *shProg, const char *name)
>> +{
>> + uint8_t stages = 0;
>> + for (unsigned i = 0; i < MESA_SHADER_STAGES; i++) {
>> + struct gl_shader *sh = shProg->_LinkedShaders[i];
>> + if (!sh)
>> + continue;
>> + ir_variable *var = sh->symbols->get_variable(name);
>> + if (var)
>> + stages |= (1 << i);
>> + }
>> + return stages;
>> +}
>> +
>> +/**
>> + * Builds up a list of program resources that point to existing
>> + * resource data.
>> + */
>> +static void
>> +build_program_resource_list(struct gl_context *ctx,
>> + struct gl_shader_program *shProg)
>> +{
>> + /* Rebuild resource list. */
>> + if (shProg->ProgramResourceList) {
>> + ralloc_free(shProg->ProgramResourceList);
>> + shProg->ProgramResourceList = NULL;
>> + shProg->NumProgramResourceList = 0;
>> + }
>> +
>> + int input_stage = MESA_SHADER_STAGES, output_stage = 0;
>> +
>> + /* Determine first input and final output stage. These are used to
>> + * detect which variables should be enumerated in the resource list
>> + * for GL_PROGRAM_INPUT and GL_PROGRAM_OUTPUT.
>> + */
>> + for (unsigned i = 0; i < MESA_SHADER_STAGES; i++) {
>> + struct gl_shader *sh = shProg->_LinkedShaders[i];
>> + if (!sh)
>> + continue;
>> + if (input_stage == MESA_SHADER_STAGES)
>> + input_stage = i;
>> + output_stage = i;
>> + }
>> +
>> + for (int i = 0; i < MESA_SHADER_STAGES; i++) {
>> + struct gl_shader *sh = shProg->_LinkedShaders[i];
>> +
>> + if (!sh || (i != input_stage && i != output_stage))
>> + continue;
>> +
>> + /* Add inputs and outputs to the resource list. */
>> + foreach_in_list(ir_instruction, node, sh->ir) {
>> + ir_variable *var = node->as_variable();
>> + GLenum iface;
>> +
>> + if (!var)
>> + continue;
>> +
>> + switch (var->data.mode) {
>> + /* From GL 4.3 core spec, section 11.1.1 (Vertex Attributes):
>> + * "For GetActiveAttrib, all active vertex shader input variables
>> + * are enumerated, including the special built-in inputs gl_VertexID
>> + * and gl_InstanceID."
>> + */
>> + case ir_var_system_value:
>> + if (var->data.location != SYSTEM_VALUE_VERTEX_ID &&
>> + var->data.location != SYSTEM_VALUE_VERTEX_ID_ZERO_BASE &&
>> + var->data.location != SYSTEM_VALUE_INSTANCE_ID)
>> + continue;
> Coverity is warning about this... and rightly so.
>
> Either the indentation on the "continue" statement is wrong and it's
> missing a /* fallthrough */ comment, or something more serious is
> wrong.
It is missing a /* fallthrough */ comment. I'll send a patch that adds
comments for both of the fallthrough cases you found.
// Tapani
More information about the mesa-dev
mailing list