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