[Mesa-dev] [PATCH 13/17] mesa: move DispatchCompute() validation to compute.c

Timothy Arceri tarceri at itsqueeze.com
Mon May 15 06:19:22 UTC 2017


This is the only place it is used so there is no reason for it to be
in api_validate.c
---
 src/mesa/main/api_validate.c | 234 -------------------------------------------
 src/mesa/main/api_validate.h |  13 ---
 src/mesa/main/compute.c      | 234 ++++++++++++++++++++++++++++++++++++++++++-
 3 files changed, 229 insertions(+), 252 deletions(-)

diff --git a/src/mesa/main/api_validate.c b/src/mesa/main/api_validate.c
index cbb2361..850deda 100644
--- a/src/mesa/main/api_validate.c
+++ b/src/mesa/main/api_validate.c
@@ -1356,244 +1356,10 @@ _mesa_validate_MultiDrawElementsIndirectCount(struct gl_context *ctx,
       : 0;
 
    if (!valid_draw_indirect_elements(ctx, mode, type,
                                      (void *)indirect, size,
                                      "glMultiDrawElementsIndirectCountARB"))
       return GL_FALSE;
 
    return valid_draw_indirect_parameters(
          ctx, "glMultiDrawElementsIndirectCountARB", drawcount);
 }
-
-static bool
-check_valid_to_compute(struct gl_context *ctx, const char *function)
-{
-   if (!_mesa_has_compute_shaders(ctx)) {
-      _mesa_error(ctx, GL_INVALID_OPERATION,
-                  "unsupported function (%s) called",
-                  function);
-      return false;
-   }
-
-   /* From the OpenGL 4.3 Core Specification, Chapter 19, Compute Shaders:
-    *
-    * "An INVALID_OPERATION error is generated if there is no active program
-    *  for the compute shader stage."
-    */
-   if (ctx->_Shader->CurrentProgram[MESA_SHADER_COMPUTE] == NULL) {
-      _mesa_error(ctx, GL_INVALID_OPERATION,
-                  "%s(no active compute shader)",
-                  function);
-      return false;
-   }
-
-   return true;
-}
-
-GLboolean
-_mesa_validate_DispatchCompute(struct gl_context *ctx,
-                               const GLuint *num_groups)
-{
-   int i;
-   FLUSH_CURRENT(ctx, 0);
-
-   if (!check_valid_to_compute(ctx, "glDispatchCompute"))
-      return GL_FALSE;
-
-   for (i = 0; i < 3; i++) {
-      /* From the OpenGL 4.3 Core Specification, Chapter 19, Compute Shaders:
-       *
-       * "An INVALID_VALUE error is generated if any of num_groups_x,
-       *  num_groups_y and num_groups_z are greater than or equal to the
-       *  maximum work group count for the corresponding dimension."
-       *
-       * However, the "or equal to" portions appears to be a specification
-       * bug. In all other areas, the specification appears to indicate that
-       * the number of workgroups can match the MAX_COMPUTE_WORK_GROUP_COUNT
-       * value. For example, under DispatchComputeIndirect:
-       *
-       * "If any of num_groups_x, num_groups_y or num_groups_z is greater than
-       *  the value of MAX_COMPUTE_WORK_GROUP_COUNT for the corresponding
-       *  dimension then the results are undefined."
-       *
-       * Additionally, the OpenGLES 3.1 specification does not contain "or
-       * equal to" as an error condition.
-       */
-      if (num_groups[i] > ctx->Const.MaxComputeWorkGroupCount[i]) {
-         _mesa_error(ctx, GL_INVALID_VALUE,
-                     "glDispatchCompute(num_groups_%c)", 'x' + i);
-         return GL_FALSE;
-      }
-   }
-
-   /* The ARB_compute_variable_group_size spec says:
-    *
-    * "An INVALID_OPERATION error is generated by DispatchCompute if the active
-    *  program for the compute shader stage has a variable work group size."
-    */
-   struct gl_program *prog = ctx->_Shader->CurrentProgram[MESA_SHADER_COMPUTE];
-   if (prog->info.cs.local_size_variable) {
-      _mesa_error(ctx, GL_INVALID_OPERATION,
-                  "glDispatchCompute(variable work group size forbidden)");
-      return GL_FALSE;
-   }
-
-   return GL_TRUE;
-}
-
-GLboolean
-_mesa_validate_DispatchComputeGroupSizeARB(struct gl_context *ctx,
-                                           const GLuint *num_groups,
-                                           const GLuint *group_size)
-{
-   GLuint total_invocations = 1;
-   int i;
-
-   FLUSH_CURRENT(ctx, 0);
-
-   if (!check_valid_to_compute(ctx, "glDispatchComputeGroupSizeARB"))
-      return GL_FALSE;
-
-   /* The ARB_compute_variable_group_size spec says:
-    *
-    * "An INVALID_OPERATION error is generated by
-    *  DispatchComputeGroupSizeARB if the active program for the compute
-    *  shader stage has a fixed work group size."
-    */
-   struct gl_program *prog = ctx->_Shader->CurrentProgram[MESA_SHADER_COMPUTE];
-   if (!prog->info.cs.local_size_variable) {
-      _mesa_error(ctx, GL_INVALID_OPERATION,
-                  "glDispatchComputeGroupSizeARB(fixed work group size "
-                  "forbidden)");
-      return GL_FALSE;
-   }
-
-   for (i = 0; i < 3; i++) {
-      /* The ARB_compute_variable_group_size spec says:
-       *
-       * "An INVALID_VALUE error is generated if any of num_groups_x,
-       *  num_groups_y and num_groups_z are greater than or equal to the
-       *  maximum work group count for the corresponding dimension."
-       */
-      if (num_groups[i] > ctx->Const.MaxComputeWorkGroupCount[i]) {
-         _mesa_error(ctx, GL_INVALID_VALUE,
-                     "glDispatchComputeGroupSizeARB(num_groups_%c)", 'x' + i);
-         return GL_FALSE;
-      }
-
-      /* The ARB_compute_variable_group_size spec says:
-       *
-       * "An INVALID_VALUE error is generated by DispatchComputeGroupSizeARB if
-       *  any of <group_size_x>, <group_size_y>, or <group_size_z> is less than
-       *  or equal to zero or greater than the maximum local work group size
-       *  for compute shaders with variable group size
-       *  (MAX_COMPUTE_VARIABLE_GROUP_SIZE_ARB) in the corresponding
-       *  dimension."
-       *
-       * However, the "less than" is a spec bug because they are declared as
-       * unsigned integers.
-       */
-      if (group_size[i] == 0 ||
-          group_size[i] > ctx->Const.MaxComputeVariableGroupSize[i]) {
-         _mesa_error(ctx, GL_INVALID_VALUE,
-                     "glDispatchComputeGroupSizeARB(group_size_%c)", 'x' + i);
-         return GL_FALSE;
-      }
-
-      total_invocations *= group_size[i];
-   }
-
-   /* The ARB_compute_variable_group_size spec says:
-    *
-    * "An INVALID_VALUE error is generated by DispatchComputeGroupSizeARB if
-    *  the product of <group_size_x>, <group_size_y>, and <group_size_z> exceeds
-    *  the implementation-dependent maximum local work group invocation count
-    *  for compute shaders with variable group size
-    *  (MAX_COMPUTE_VARIABLE_GROUP_INVOCATIONS_ARB)."
-    */
-   if (total_invocations > ctx->Const.MaxComputeVariableGroupInvocations) {
-      _mesa_error(ctx, GL_INVALID_VALUE,
-                  "glDispatchComputeGroupSizeARB(product of local_sizes "
-                  "exceeds MAX_COMPUTE_VARIABLE_GROUP_INVOCATIONS_ARB "
-                  "(%d > %d))", total_invocations,
-                  ctx->Const.MaxComputeVariableGroupInvocations);
-      return GL_FALSE;
-   }
-
-   return GL_TRUE;
-}
-
-static GLboolean
-valid_dispatch_indirect(struct gl_context *ctx,
-                        GLintptr indirect,
-                        GLsizei size, const char *name)
-{
-   const uint64_t end = (uint64_t) indirect + size;
-
-   if (!check_valid_to_compute(ctx, name))
-      return GL_FALSE;
-
-   /* From the OpenGL 4.3 Core Specification, Chapter 19, Compute Shaders:
-    *
-    * "An INVALID_VALUE error is generated if indirect is negative or is not a
-    *  multiple of four."
-    */
-   if (indirect & (sizeof(GLuint) - 1)) {
-      _mesa_error(ctx, GL_INVALID_VALUE,
-                  "%s(indirect is not aligned)", name);
-      return GL_FALSE;
-   }
-
-   if (indirect < 0) {
-      _mesa_error(ctx, GL_INVALID_VALUE,
-                  "%s(indirect is less than zero)", name);
-      return GL_FALSE;
-   }
-
-   /* From the OpenGL 4.3 Core Specification, Chapter 19, Compute Shaders:
-    *
-    * "An INVALID_OPERATION error is generated if no buffer is bound to the
-    *  DRAW_INDIRECT_BUFFER binding, or if the command would source data
-    *  beyond the end of the buffer object."
-    */
-   if (!_mesa_is_bufferobj(ctx->DispatchIndirectBuffer)) {
-      _mesa_error(ctx, GL_INVALID_OPERATION,
-                  "%s: no buffer bound to DISPATCH_INDIRECT_BUFFER", name);
-      return GL_FALSE;
-   }
-
-   if (_mesa_check_disallowed_mapping(ctx->DispatchIndirectBuffer)) {
-      _mesa_error(ctx, GL_INVALID_OPERATION,
-                  "%s(DISPATCH_INDIRECT_BUFFER is mapped)", name);
-      return GL_FALSE;
-   }
-
-   if (ctx->DispatchIndirectBuffer->Size < end) {
-      _mesa_error(ctx, GL_INVALID_OPERATION,
-                  "%s(DISPATCH_INDIRECT_BUFFER too small)", name);
-      return GL_FALSE;
-   }
-
-   /* The ARB_compute_variable_group_size spec says:
-    *
-    * "An INVALID_OPERATION error is generated if the active program for the
-    *  compute shader stage has a variable work group size."
-    */
-   struct gl_program *prog = ctx->_Shader->CurrentProgram[MESA_SHADER_COMPUTE];
-   if (prog->info.cs.local_size_variable) {
-      _mesa_error(ctx, GL_INVALID_OPERATION,
-                  "%s(variable work group size forbidden)", name);
-      return GL_FALSE;
-   }
-
-   return GL_TRUE;
-}
-
-GLboolean
-_mesa_validate_DispatchComputeIndirect(struct gl_context *ctx,
-                                       GLintptr indirect)
-{
-   FLUSH_CURRENT(ctx, 0);
-
-   return valid_dispatch_indirect(ctx, indirect, 3 * sizeof(GLuint),
-                                  "glDispatchComputeIndirect");
-}
diff --git a/src/mesa/main/api_validate.h b/src/mesa/main/api_validate.h
index 88c51bf..7a18115 100644
--- a/src/mesa/main/api_validate.h
+++ b/src/mesa/main/api_validate.h
@@ -121,24 +121,11 @@ _mesa_validate_MultiDrawArraysIndirectCount(struct gl_context *ctx,
                                             GLsizei stride);
 
 extern GLboolean
 _mesa_validate_MultiDrawElementsIndirectCount(struct gl_context *ctx,
                                               GLenum mode, GLenum type,
                                               GLintptr indirect,
                                               GLintptr drawcount,
                                               GLsizei maxdrawcount,
                                               GLsizei stride);
 
-extern GLboolean
-_mesa_validate_DispatchCompute(struct gl_context *ctx,
-                               const GLuint *num_groups);
-
-extern GLboolean
-_mesa_validate_DispatchComputeIndirect(struct gl_context *ctx,
-                                       GLintptr indirect);
-
-extern GLboolean
-_mesa_validate_DispatchComputeGroupSizeARB(struct gl_context *ctx,
-                                           const GLuint *num_groups,
-                                           const GLuint *group_size);
-
 #endif
diff --git a/src/mesa/main/compute.c b/src/mesa/main/compute.c
index bb62539..5c84516 100644
--- a/src/mesa/main/compute.c
+++ b/src/mesa/main/compute.c
@@ -15,73 +15,297 @@
  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
  * DEALINGS IN THE SOFTWARE.
  */
 
 #include "glheader.h"
+#include "bufferobj.h"
 #include "compute.h"
 #include "context.h"
-#include "api_validate.h"
+
+static bool
+check_valid_to_compute(struct gl_context *ctx, const char *function)
+{
+   if (!_mesa_has_compute_shaders(ctx)) {
+      _mesa_error(ctx, GL_INVALID_OPERATION,
+                  "unsupported function (%s) called",
+                  function);
+      return false;
+   }
+
+   /* From the OpenGL 4.3 Core Specification, Chapter 19, Compute Shaders:
+    *
+    * "An INVALID_OPERATION error is generated if there is no active program
+    *  for the compute shader stage."
+    */
+   if (ctx->_Shader->CurrentProgram[MESA_SHADER_COMPUTE] == NULL) {
+      _mesa_error(ctx, GL_INVALID_OPERATION,
+                  "%s(no active compute shader)",
+                  function);
+      return false;
+   }
+
+   return true;
+}
+
+static bool
+validate_DispatchCompute(struct gl_context *ctx, const GLuint *num_groups)
+{
+   int i;
+   FLUSH_CURRENT(ctx, 0);
+
+   if (!check_valid_to_compute(ctx, "glDispatchCompute"))
+      return GL_FALSE;
+
+   for (i = 0; i < 3; i++) {
+      /* From the OpenGL 4.3 Core Specification, Chapter 19, Compute Shaders:
+       *
+       * "An INVALID_VALUE error is generated if any of num_groups_x,
+       *  num_groups_y and num_groups_z are greater than or equal to the
+       *  maximum work group count for the corresponding dimension."
+       *
+       * However, the "or equal to" portions appears to be a specification
+       * bug. In all other areas, the specification appears to indicate that
+       * the number of workgroups can match the MAX_COMPUTE_WORK_GROUP_COUNT
+       * value. For example, under DispatchComputeIndirect:
+       *
+       * "If any of num_groups_x, num_groups_y or num_groups_z is greater than
+       *  the value of MAX_COMPUTE_WORK_GROUP_COUNT for the corresponding
+       *  dimension then the results are undefined."
+       *
+       * Additionally, the OpenGLES 3.1 specification does not contain "or
+       * equal to" as an error condition.
+       */
+      if (num_groups[i] > ctx->Const.MaxComputeWorkGroupCount[i]) {
+         _mesa_error(ctx, GL_INVALID_VALUE,
+                     "glDispatchCompute(num_groups_%c)", 'x' + i);
+         return GL_FALSE;
+      }
+   }
+
+   /* The ARB_compute_variable_group_size spec says:
+    *
+    * "An INVALID_OPERATION error is generated by DispatchCompute if the active
+    *  program for the compute shader stage has a variable work group size."
+    */
+   struct gl_program *prog = ctx->_Shader->CurrentProgram[MESA_SHADER_COMPUTE];
+   if (prog->info.cs.local_size_variable) {
+      _mesa_error(ctx, GL_INVALID_OPERATION,
+                  "glDispatchCompute(variable work group size forbidden)");
+      return GL_FALSE;
+   }
+
+   return GL_TRUE;
+}
+
+static bool
+validate_DispatchComputeGroupSizeARB(struct gl_context *ctx,
+                                     const GLuint *num_groups,
+                                     const GLuint *group_size)
+{
+   GLuint total_invocations = 1;
+   int i;
+
+   FLUSH_CURRENT(ctx, 0);
+
+   if (!check_valid_to_compute(ctx, "glDispatchComputeGroupSizeARB"))
+      return GL_FALSE;
+
+   /* The ARB_compute_variable_group_size spec says:
+    *
+    * "An INVALID_OPERATION error is generated by
+    *  DispatchComputeGroupSizeARB if the active program for the compute
+    *  shader stage has a fixed work group size."
+    */
+   struct gl_program *prog = ctx->_Shader->CurrentProgram[MESA_SHADER_COMPUTE];
+   if (!prog->info.cs.local_size_variable) {
+      _mesa_error(ctx, GL_INVALID_OPERATION,
+                  "glDispatchComputeGroupSizeARB(fixed work group size "
+                  "forbidden)");
+      return GL_FALSE;
+   }
+
+   for (i = 0; i < 3; i++) {
+      /* The ARB_compute_variable_group_size spec says:
+       *
+       * "An INVALID_VALUE error is generated if any of num_groups_x,
+       *  num_groups_y and num_groups_z are greater than or equal to the
+       *  maximum work group count for the corresponding dimension."
+       */
+      if (num_groups[i] > ctx->Const.MaxComputeWorkGroupCount[i]) {
+         _mesa_error(ctx, GL_INVALID_VALUE,
+                     "glDispatchComputeGroupSizeARB(num_groups_%c)", 'x' + i);
+         return GL_FALSE;
+      }
+
+      /* The ARB_compute_variable_group_size spec says:
+       *
+       * "An INVALID_VALUE error is generated by DispatchComputeGroupSizeARB if
+       *  any of <group_size_x>, <group_size_y>, or <group_size_z> is less than
+       *  or equal to zero or greater than the maximum local work group size
+       *  for compute shaders with variable group size
+       *  (MAX_COMPUTE_VARIABLE_GROUP_SIZE_ARB) in the corresponding
+       *  dimension."
+       *
+       * However, the "less than" is a spec bug because they are declared as
+       * unsigned integers.
+       */
+      if (group_size[i] == 0 ||
+          group_size[i] > ctx->Const.MaxComputeVariableGroupSize[i]) {
+         _mesa_error(ctx, GL_INVALID_VALUE,
+                     "glDispatchComputeGroupSizeARB(group_size_%c)", 'x' + i);
+         return GL_FALSE;
+      }
+
+      total_invocations *= group_size[i];
+   }
+
+   /* The ARB_compute_variable_group_size spec says:
+    *
+    * "An INVALID_VALUE error is generated by DispatchComputeGroupSizeARB if
+    *  the product of <group_size_x>, <group_size_y>, and <group_size_z> exceeds
+    *  the implementation-dependent maximum local work group invocation count
+    *  for compute shaders with variable group size
+    *  (MAX_COMPUTE_VARIABLE_GROUP_INVOCATIONS_ARB)."
+    */
+   if (total_invocations > ctx->Const.MaxComputeVariableGroupInvocations) {
+      _mesa_error(ctx, GL_INVALID_VALUE,
+                  "glDispatchComputeGroupSizeARB(product of local_sizes "
+                  "exceeds MAX_COMPUTE_VARIABLE_GROUP_INVOCATIONS_ARB "
+                  "(%d > %d))", total_invocations,
+                  ctx->Const.MaxComputeVariableGroupInvocations);
+      return GL_FALSE;
+   }
+
+   return GL_TRUE;
+}
+
+static bool
+valid_dispatch_indirect(struct gl_context *ctx,  GLintptr indirect)
+{
+   FLUSH_CURRENT(ctx, 0);
+
+   GLsizei size = 3 * sizeof(GLuint);
+   const uint64_t end = (uint64_t) indirect + size;
+   const char *name = "glDispatchComputeIndirect";
+
+   if (!check_valid_to_compute(ctx, name))
+      return GL_FALSE;
+
+   /* From the OpenGL 4.3 Core Specification, Chapter 19, Compute Shaders:
+    *
+    * "An INVALID_VALUE error is generated if indirect is negative or is not a
+    *  multiple of four."
+    */
+   if (indirect & (sizeof(GLuint) - 1)) {
+      _mesa_error(ctx, GL_INVALID_VALUE,
+                  "%s(indirect is not aligned)", name);
+      return GL_FALSE;
+   }
+
+   if (indirect < 0) {
+      _mesa_error(ctx, GL_INVALID_VALUE,
+                  "%s(indirect is less than zero)", name);
+      return GL_FALSE;
+   }
+
+   /* From the OpenGL 4.3 Core Specification, Chapter 19, Compute Shaders:
+    *
+    * "An INVALID_OPERATION error is generated if no buffer is bound to the
+    *  DRAW_INDIRECT_BUFFER binding, or if the command would source data
+    *  beyond the end of the buffer object."
+    */
+   if (!_mesa_is_bufferobj(ctx->DispatchIndirectBuffer)) {
+      _mesa_error(ctx, GL_INVALID_OPERATION,
+                  "%s: no buffer bound to DISPATCH_INDIRECT_BUFFER", name);
+      return GL_FALSE;
+   }
+
+   if (_mesa_check_disallowed_mapping(ctx->DispatchIndirectBuffer)) {
+      _mesa_error(ctx, GL_INVALID_OPERATION,
+                  "%s(DISPATCH_INDIRECT_BUFFER is mapped)", name);
+      return GL_FALSE;
+   }
+
+   if (ctx->DispatchIndirectBuffer->Size < end) {
+      _mesa_error(ctx, GL_INVALID_OPERATION,
+                  "%s(DISPATCH_INDIRECT_BUFFER too small)", name);
+      return GL_FALSE;
+   }
+
+   /* The ARB_compute_variable_group_size spec says:
+    *
+    * "An INVALID_OPERATION error is generated if the active program for the
+    *  compute shader stage has a variable work group size."
+    */
+   struct gl_program *prog = ctx->_Shader->CurrentProgram[MESA_SHADER_COMPUTE];
+   if (prog->info.cs.local_size_variable) {
+      _mesa_error(ctx, GL_INVALID_OPERATION,
+                  "%s(variable work group size forbidden)", name);
+      return GL_FALSE;
+   }
+
+   return GL_TRUE;
+}
 
 void GLAPIENTRY
 _mesa_DispatchCompute(GLuint num_groups_x,
                       GLuint num_groups_y,
                       GLuint num_groups_z)
 {
    GET_CURRENT_CONTEXT(ctx);
    const GLuint num_groups[3] = { num_groups_x, num_groups_y, num_groups_z };
 
    if (MESA_VERBOSE & VERBOSE_API)
       _mesa_debug(ctx, "glDispatchCompute(%d, %d, %d)\n",
                   num_groups_x, num_groups_y, num_groups_z);
 
-   if (!_mesa_validate_DispatchCompute(ctx, num_groups))
+   if (!validate_DispatchCompute(ctx, num_groups))
       return;
 
    if (num_groups_x == 0u || num_groups_y == 0u || num_groups_z == 0u)
        return;
 
    ctx->Driver.DispatchCompute(ctx, num_groups);
 }
 
 extern void GLAPIENTRY
 _mesa_DispatchComputeIndirect(GLintptr indirect)
 {
    GET_CURRENT_CONTEXT(ctx);
 
    if (MESA_VERBOSE & VERBOSE_API)
       _mesa_debug(ctx, "glDispatchComputeIndirect(%ld)\n", (long) indirect);
 
-   if (!_mesa_validate_DispatchComputeIndirect(ctx, indirect))
+   if (!valid_dispatch_indirect(ctx, indirect))
       return;
 
    ctx->Driver.DispatchComputeIndirect(ctx, indirect);
 }
 
 void GLAPIENTRY
 _mesa_DispatchComputeGroupSizeARB(GLuint num_groups_x, GLuint num_groups_y,
                                   GLuint num_groups_z, GLuint group_size_x,
                                   GLuint group_size_y, GLuint group_size_z)
 {
    GET_CURRENT_CONTEXT(ctx);
    const GLuint num_groups[3] = { num_groups_x, num_groups_y, num_groups_z };
    const GLuint group_size[3] = { group_size_x, group_size_y, group_size_z };
 
    if (MESA_VERBOSE & VERBOSE_API)
       _mesa_debug(ctx,
                   "glDispatchComputeGroupSizeARB(%d, %d, %d, %d, %d, %d)\n",
                   num_groups_x, num_groups_y, num_groups_z,
                   group_size_x, group_size_y, group_size_z);
 
-   if (!_mesa_validate_DispatchComputeGroupSizeARB(ctx, num_groups,
-                                                   group_size))
+   if (!validate_DispatchComputeGroupSizeARB(ctx, num_groups, group_size))
       return;
 
    if (num_groups_x == 0u || num_groups_y == 0u || num_groups_z == 0u)
        return;
 
    ctx->Driver.DispatchComputeGroupSize(ctx, num_groups, group_size);
 }
-- 
2.9.3



More information about the mesa-dev mailing list