From 1b898d78d8d809dfd01a47aae6da355d4b820e84 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tapani=20P=C3=A4lli?= Date: Thu, 20 Jan 2022 12:18:24 +0200 Subject: [PATCH] mesa: move GetProgramInterfaceiv as a shader_query function MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This matches how _mesa_get_program_resourceiv was done and this makes it possible to skip some validation and shader program lookup when calling it from glGetProgramiv. Cc: mesa-stable Signed-off-by: Tapani Pälli Reviewed-by: Marek Olšák Part-of: --- src/mesa/main/program_resource.c | 121 +---------------------------- src/mesa/main/shader_query.cpp | 129 +++++++++++++++++++++++++++++++ src/mesa/main/shaderapi.c | 4 +- src/mesa/main/shaderapi.h | 5 ++ 4 files changed, 137 insertions(+), 122 deletions(-) diff --git a/src/mesa/main/program_resource.c b/src/mesa/main/program_resource.c index 43df4e85cec..16be056304a 100644 --- a/src/mesa/main/program_resource.c +++ b/src/mesa/main/program_resource.c @@ -97,7 +97,6 @@ _mesa_GetProgramInterfaceiv(GLuint program, GLenum programInterface, _mesa_enum_to_string(pname), params); } - unsigned i; struct gl_shader_program *shProg = _mesa_lookup_shader_program_err(ctx, program, "glGetProgramInterfaceiv"); @@ -117,125 +116,7 @@ _mesa_GetProgramInterfaceiv(GLuint program, GLenum programInterface, return; } - /* Validate pname against interface. */ - switch(pname) { - case GL_ACTIVE_RESOURCES: - for (i = 0, *params = 0; i < shProg->data->NumProgramResourceList; i++) - if (shProg->data->ProgramResourceList[i].Type == programInterface) - (*params)++; - break; - case GL_MAX_NAME_LENGTH: - if (programInterface == GL_ATOMIC_COUNTER_BUFFER || - programInterface == GL_TRANSFORM_FEEDBACK_BUFFER) { - _mesa_error(ctx, GL_INVALID_OPERATION, - "glGetProgramInterfaceiv(%s pname %s)", - _mesa_enum_to_string(programInterface), - _mesa_enum_to_string(pname)); - return; - } - /* Name length consists of base name, 3 additional chars '[0]' if - * resource is an array and finally 1 char for string terminator. - */ - for (i = 0, *params = 0; i < shProg->data->NumProgramResourceList; i++) { - if (shProg->data->ProgramResourceList[i].Type != programInterface) - continue; - unsigned len = - _mesa_program_resource_name_length_array(&shProg->data->ProgramResourceList[i]); - *params = MAX2(*params, len + 1); - } - break; - case GL_MAX_NUM_ACTIVE_VARIABLES: - switch (programInterface) { - case GL_UNIFORM_BLOCK: - for (i = 0, *params = 0; i < shProg->data->NumProgramResourceList; i++) { - if (shProg->data->ProgramResourceList[i].Type == programInterface) { - struct gl_uniform_block *block = - (struct gl_uniform_block *) - shProg->data->ProgramResourceList[i].Data; - *params = MAX2(*params, block->NumUniforms); - } - } - break; - case GL_SHADER_STORAGE_BLOCK: - for (i = 0, *params = 0; i < shProg->data->NumProgramResourceList; i++) { - if (shProg->data->ProgramResourceList[i].Type == programInterface) { - struct gl_uniform_block *block = - (struct gl_uniform_block *) - shProg->data->ProgramResourceList[i].Data; - GLint block_params = 0; - for (unsigned j = 0; j < block->NumUniforms; j++) { - struct gl_program_resource *uni = - _mesa_program_resource_find_active_variable( - shProg, - GL_BUFFER_VARIABLE, - block, - j); - if (!uni) - continue; - block_params++; - } - *params = MAX2(*params, block_params); - } - } - break; - case GL_ATOMIC_COUNTER_BUFFER: - for (i = 0, *params = 0; i < shProg->data->NumProgramResourceList; i++) { - if (shProg->data->ProgramResourceList[i].Type == programInterface) { - struct gl_active_atomic_buffer *buffer = - (struct gl_active_atomic_buffer *) - shProg->data->ProgramResourceList[i].Data; - *params = MAX2(*params, buffer->NumUniforms); - } - } - break; - case GL_TRANSFORM_FEEDBACK_BUFFER: - for (i = 0, *params = 0; i < shProg->data->NumProgramResourceList; i++) { - if (shProg->data->ProgramResourceList[i].Type == programInterface) { - struct gl_transform_feedback_buffer *buffer = - (struct gl_transform_feedback_buffer *) - shProg->data->ProgramResourceList[i].Data; - *params = MAX2(*params, buffer->NumVaryings); - } - } - break; - default: - _mesa_error(ctx, GL_INVALID_OPERATION, - "glGetProgramInterfaceiv(%s pname %s)", - _mesa_enum_to_string(programInterface), - _mesa_enum_to_string(pname)); - } - break; - case GL_MAX_NUM_COMPATIBLE_SUBROUTINES: - switch (programInterface) { - case GL_VERTEX_SUBROUTINE_UNIFORM: - case GL_FRAGMENT_SUBROUTINE_UNIFORM: - case GL_GEOMETRY_SUBROUTINE_UNIFORM: - case GL_COMPUTE_SUBROUTINE_UNIFORM: - case GL_TESS_CONTROL_SUBROUTINE_UNIFORM: - case GL_TESS_EVALUATION_SUBROUTINE_UNIFORM: { - for (i = 0, *params = 0; i < shProg->data->NumProgramResourceList; i++) { - if (shProg->data->ProgramResourceList[i].Type == programInterface) { - struct gl_uniform_storage *uni = - (struct gl_uniform_storage *) - shProg->data->ProgramResourceList[i].Data; - *params = MAX2(*params, uni->num_compatible_subroutines); - } - } - break; - } - - default: - _mesa_error(ctx, GL_INVALID_OPERATION, - "glGetProgramInterfaceiv(%s pname %s)", - _mesa_enum_to_string(programInterface), - _mesa_enum_to_string(pname)); - } - break; - default: - _mesa_error(ctx, GL_INVALID_OPERATION, - "glGetProgramInterfaceiv(pname %s)", - _mesa_enum_to_string(pname)); - } + _mesa_get_program_interfaceiv(shProg, programInterface, pname, params); } static bool diff --git a/src/mesa/main/shader_query.cpp b/src/mesa/main/shader_query.cpp index bf9a1a83d75..de86bf144bc 100644 --- a/src/mesa/main/shader_query.cpp +++ b/src/mesa/main/shader_query.cpp @@ -1739,6 +1739,135 @@ _mesa_get_program_resourceiv(struct gl_shader_program *shProg, *length = amount; } +extern void +_mesa_get_program_interfaceiv(struct gl_shader_program *shProg, + GLenum programInterface, GLenum pname, + GLint *params) +{ + GET_CURRENT_CONTEXT(ctx); + unsigned i; + + /* Validate pname against interface. */ + switch(pname) { + case GL_ACTIVE_RESOURCES: + for (i = 0, *params = 0; i < shProg->data->NumProgramResourceList; i++) + if (shProg->data->ProgramResourceList[i].Type == programInterface) + (*params)++; + break; + case GL_MAX_NAME_LENGTH: + if (programInterface == GL_ATOMIC_COUNTER_BUFFER || + programInterface == GL_TRANSFORM_FEEDBACK_BUFFER) { + _mesa_error(ctx, GL_INVALID_OPERATION, + "glGetProgramInterfaceiv(%s pname %s)", + _mesa_enum_to_string(programInterface), + _mesa_enum_to_string(pname)); + return; + } + /* Name length consists of base name, 3 additional chars '[0]' if + * resource is an array and finally 1 char for string terminator. + */ + for (i = 0, *params = 0; i < shProg->data->NumProgramResourceList; i++) { + if (shProg->data->ProgramResourceList[i].Type != programInterface) + continue; + unsigned len = + _mesa_program_resource_name_length_array(&shProg->data->ProgramResourceList[i]); + *params = MAX2((unsigned)*params, len + 1); + } + break; + case GL_MAX_NUM_ACTIVE_VARIABLES: + switch (programInterface) { + case GL_UNIFORM_BLOCK: + for (i = 0, *params = 0; i < shProg->data->NumProgramResourceList; i++) { + if (shProg->data->ProgramResourceList[i].Type == programInterface) { + struct gl_uniform_block *block = + (struct gl_uniform_block *) + shProg->data->ProgramResourceList[i].Data; + *params = MAX2((unsigned)*params, block->NumUniforms); + } + } + break; + case GL_SHADER_STORAGE_BLOCK: + for (i = 0, *params = 0; i < shProg->data->NumProgramResourceList; i++) { + if (shProg->data->ProgramResourceList[i].Type == programInterface) { + struct gl_uniform_block *block = + (struct gl_uniform_block *) + shProg->data->ProgramResourceList[i].Data; + GLint block_params = 0; + for (unsigned j = 0; j < block->NumUniforms; j++) { + struct gl_program_resource *uni = + _mesa_program_resource_find_active_variable( + shProg, + GL_BUFFER_VARIABLE, + block, + j); + if (!uni) + continue; + block_params++; + } + *params = MAX2(*params, block_params); + } + } + break; + case GL_ATOMIC_COUNTER_BUFFER: + for (i = 0, *params = 0; i < shProg->data->NumProgramResourceList; i++) { + if (shProg->data->ProgramResourceList[i].Type == programInterface) { + struct gl_active_atomic_buffer *buffer = + (struct gl_active_atomic_buffer *) + shProg->data->ProgramResourceList[i].Data; + *params = MAX2((unsigned)*params, buffer->NumUniforms); + } + } + break; + case GL_TRANSFORM_FEEDBACK_BUFFER: + for (i = 0, *params = 0; i < shProg->data->NumProgramResourceList; i++) { + if (shProg->data->ProgramResourceList[i].Type == programInterface) { + struct gl_transform_feedback_buffer *buffer = + (struct gl_transform_feedback_buffer *) + shProg->data->ProgramResourceList[i].Data; + *params = MAX2((unsigned)*params, buffer->NumVaryings); + } + } + break; + default: + _mesa_error(ctx, GL_INVALID_OPERATION, + "glGetProgramInterfaceiv(%s pname %s)", + _mesa_enum_to_string(programInterface), + _mesa_enum_to_string(pname)); + } + break; + case GL_MAX_NUM_COMPATIBLE_SUBROUTINES: + switch (programInterface) { + case GL_VERTEX_SUBROUTINE_UNIFORM: + case GL_FRAGMENT_SUBROUTINE_UNIFORM: + case GL_GEOMETRY_SUBROUTINE_UNIFORM: + case GL_COMPUTE_SUBROUTINE_UNIFORM: + case GL_TESS_CONTROL_SUBROUTINE_UNIFORM: + case GL_TESS_EVALUATION_SUBROUTINE_UNIFORM: { + for (i = 0, *params = 0; i < shProg->data->NumProgramResourceList; i++) { + if (shProg->data->ProgramResourceList[i].Type == programInterface) { + struct gl_uniform_storage *uni = + (struct gl_uniform_storage *) + shProg->data->ProgramResourceList[i].Data; + *params = MAX2((unsigned)*params, uni->num_compatible_subroutines); + } + } + break; + } + + default: + _mesa_error(ctx, GL_INVALID_OPERATION, + "glGetProgramInterfaceiv(%s pname %s)", + _mesa_enum_to_string(programInterface), + _mesa_enum_to_string(pname)); + } + break; + default: + _mesa_error(ctx, GL_INVALID_OPERATION, + "glGetProgramInterfaceiv(pname %s)", + _mesa_enum_to_string(pname)); + } +} + static bool validate_io(struct gl_program *producer, struct gl_program *consumer) { diff --git a/src/mesa/main/shaderapi.c b/src/mesa/main/shaderapi.c index d181bd931e6..72630d8fe82 100644 --- a/src/mesa/main/shaderapi.c +++ b/src/mesa/main/shaderapi.c @@ -806,8 +806,8 @@ get_programiv(struct gl_context *ctx, GLuint program, GLenum pname, *params = _mesa_longest_attribute_name_length(shProg); return; case GL_ACTIVE_UNIFORMS: { - _mesa_GetProgramInterfaceiv(program, GL_UNIFORM, GL_ACTIVE_RESOURCES, - params); + _mesa_get_program_interfaceiv(shProg, GL_UNIFORM, GL_ACTIVE_RESOURCES, + params); return; } case GL_ACTIVE_UNIFORM_MAX_LENGTH: { diff --git a/src/mesa/main/shaderapi.h b/src/mesa/main/shaderapi.h index 66fa37c19f5..90e90fee743 100644 --- a/src/mesa/main/shaderapi.h +++ b/src/mesa/main/shaderapi.h @@ -160,6 +160,11 @@ _mesa_get_program_resourceiv(struct gl_shader_program *shProg, GLsizei bufSize, GLsizei *length, GLint *params); +extern void +_mesa_get_program_interfaceiv(struct gl_shader_program *shProg, + GLenum programInterface, GLenum pname, + GLint *params); + extern void _mesa_program_resource_hash_destroy(struct gl_shader_program *shProg);