Mesa (staging/21.3): mesa: move GetProgramInterfaceiv as a shader_query function
GitLab Mirror
gitlab-mirror at kemper.freedesktop.org
Tue Jan 25 21:20:35 UTC 2022
Module: Mesa
Branch: staging/21.3
Commit: c782bc72dce0c9f5ac18506e2dfd8e8e94ce1d6f
URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=c782bc72dce0c9f5ac18506e2dfd8e8e94ce1d6f
Author: Tapani Pälli <tapani.palli at intel.com>
Date: Thu Jan 20 12:18:24 2022 +0200
mesa: move GetProgramInterfaceiv as a shader_query function
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 <tapani.palli at intel.com>
Reviewed-by: Marek Olšák <marek.olsak at amd.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/14636>
(cherry picked from commit 1b898d78d8d809dfd01a47aae6da355d4b820e84)
---
.pick_status.json | 2 +-
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 ++
5 files changed, 138 insertions(+), 123 deletions(-)
diff --git a/.pick_status.json b/.pick_status.json
index c4bc1b6ae75..41affd8a5e1 100644
--- a/.pick_status.json
+++ b/.pick_status.json
@@ -310,7 +310,7 @@
"description": "mesa: move GetProgramInterfaceiv as a shader_query function",
"nominated": true,
"nomination_type": 0,
- "resolution": 0,
+ "resolution": 1,
"main_sha": null,
"because_sha": null
},
diff --git a/src/mesa/main/program_resource.c b/src/mesa/main/program_resource.c
index fda59c561b3..da0bdd01dd9 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_len(&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 00f9d423670..96faf5f0937 100644
--- a/src/mesa/main/shader_query.cpp
+++ b/src/mesa/main/shader_query.cpp
@@ -1668,6 +1668,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_len(&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 83f06a70767..f08e466f0eb 100644
--- a/src/mesa/main/shaderapi.c
+++ b/src/mesa/main/shaderapi.c
@@ -767,8 +767,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 10ef268f8fd..1bc1d42e33f 100644
--- a/src/mesa/main/shaderapi.h
+++ b/src/mesa/main/shaderapi.h
@@ -334,6 +334,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_create_program_resource_hash(struct gl_shader_program *shProg);
More information about the mesa-commit
mailing list