[Mesa-dev] [PATCH 21/30] mesa/cs: Implement MAX_COMPUTE_WORK_GROUP_SIZE constant.

Brian Paul brianp at vmware.com
Fri Jan 10 07:42:30 PST 2014


On 01/09/2014 07:19 PM, Paul Berry wrote:
> ---
>   src/glsl/builtin_variables.cpp      | 27 +++++++++++++++++++++++++++
>   src/glsl/glsl_parser_extras.cpp     |  4 ++++
>   src/glsl/glsl_parser_extras.h       |  3 +++
>   src/glsl/main.cpp                   |  3 +++
>   src/glsl/standalone_scaffolding.cpp |  3 +++
>   src/mesa/main/context.c             |  5 +++++
>   src/mesa/main/get.c                 |  8 ++++++++
>   src/mesa/main/mtypes.h              |  3 +++
>   8 files changed, 56 insertions(+)
>
> diff --git a/src/glsl/builtin_variables.cpp b/src/glsl/builtin_variables.cpp
> index 17ae087..171bf08 100644
> --- a/src/glsl/builtin_variables.cpp
> +++ b/src/glsl/builtin_variables.cpp
> @@ -390,6 +390,7 @@ private:
>                                enum ir_variable_mode mode, int slot);
>      ir_variable *add_uniform(const glsl_type *type, const char *name);
>      ir_variable *add_const(const char *name, int value);
> +   ir_variable *add_const_ivec3(const char *name, int x, int y, int z);
>      void add_varying(int slot, const glsl_type *type, const char *name,
>                       const char *name_as_gs_input);
>
> @@ -530,6 +531,25 @@ builtin_variable_generator::add_const(const char *name, int value)
>   }
>
>
> +ir_variable *
> +builtin_variable_generator::add_const_ivec3(const char *name, int x, int y,
> +                                            int z)
> +{
> +   ir_variable *const var = add_variable(name, glsl_type::ivec3_type,
> +                                         ir_var_auto, -1);
> +   ir_constant_data data;
> +   memset(&data, 0, sizeof(data));
> +   data.i[0] = x;
> +   data.i[1] = y;
> +   data.i[2] = z;
> +   var->constant_value = new(var) ir_constant(glsl_type::ivec3_type, &data);
> +   var->constant_initializer =
> +      new(var) ir_constant(glsl_type::ivec3_type, &data);
> +   var->data.has_initializer = true;
> +   return var;
> +}
> +
> +
>   void
>   builtin_variable_generator::generate_constants()
>   {
> @@ -660,6 +680,13 @@ builtin_variable_generator::generate_constants()
>         add_const("gl_MaxTessControlAtomicCounters", 0);
>         add_const("gl_MaxTessEvaluationAtomicCounters", 0);
>      }
> +
> +   if (state->is_version(430, 0) || state->ARB_compute_shader_enable) {
> +      add_const_ivec3("gl_MaxComputeWorkGroupSize",
> +                      state->Const.MaxComputeWorkGroupSize[0],
> +                      state->Const.MaxComputeWorkGroupSize[1],
> +                      state->Const.MaxComputeWorkGroupSize[2]);
> +   }
>   }
>
>
> diff --git a/src/glsl/glsl_parser_extras.cpp b/src/glsl/glsl_parser_extras.cpp
> index 33a43c5..8524fc6 100644
> --- a/src/glsl/glsl_parser_extras.cpp
> +++ b/src/glsl/glsl_parser_extras.cpp
> @@ -123,6 +123,10 @@ _mesa_glsl_parse_state::_mesa_glsl_parse_state(struct gl_context *_ctx,
>      this->Const.MaxCombinedAtomicCounters = ctx->Const.MaxCombinedAtomicCounters;
>      this->Const.MaxAtomicBufferBindings = ctx->Const.MaxAtomicBufferBindings;
>
> +   /* Compute shader constants */
> +   for (unsigned i = 0; i < Elements(this->Const.MaxComputeWorkGroupSize); i++)
> +      this->Const.MaxComputeWorkGroupSize[i] = ctx->Const.MaxComputeWorkGroupSize[i];
> +
>      this->current_function = NULL;
>      this->toplevel_ir = NULL;
>      this->found_return = false;
> diff --git a/src/glsl/glsl_parser_extras.h b/src/glsl/glsl_parser_extras.h
> index 468707c..be34fd9 100644
> --- a/src/glsl/glsl_parser_extras.h
> +++ b/src/glsl/glsl_parser_extras.h
> @@ -250,6 +250,9 @@ struct _mesa_glsl_parse_state {
>         unsigned MaxFragmentAtomicCounters;
>         unsigned MaxCombinedAtomicCounters;
>         unsigned MaxAtomicBufferBindings;
> +
> +      /* ARB_compute_shader */
> +      unsigned MaxComputeWorkGroupSize[3];
>      } Const;
>
>      /**
> diff --git a/src/glsl/main.cpp b/src/glsl/main.cpp
> index 864c929..bb2054f 100644
> --- a/src/glsl/main.cpp
> +++ b/src/glsl/main.cpp
> @@ -50,6 +50,9 @@ initialize_context(struct gl_context *ctx, gl_api api)
>       */
>      ctx->Const.GLSLVersion = glsl_version;
>      ctx->Extensions.ARB_ES3_compatibility = true;
> +   ctx->Const.MaxComputeWorkGroupSize[0] = 1024;
> +   ctx->Const.MaxComputeWorkGroupSize[1] = 1024;
> +   ctx->Const.MaxComputeWorkGroupSize[2] = 64;
>      ctx->Const.Program[MESA_SHADER_COMPUTE].MaxTextureImageUnits = 16;
>      ctx->Const.Program[MESA_SHADER_COMPUTE].MaxUniformComponents = 1024;
>      ctx->Const.Program[MESA_SHADER_COMPUTE].MaxInputComponents = 0; /* not used */
> diff --git a/src/glsl/standalone_scaffolding.cpp b/src/glsl/standalone_scaffolding.cpp
> index ab92da8..e8eb529 100644
> --- a/src/glsl/standalone_scaffolding.cpp
> +++ b/src/glsl/standalone_scaffolding.cpp
> @@ -140,6 +140,9 @@ void initialize_context_to_defaults(struct gl_context *ctx, gl_api api)
>      ctx->Const.Program[MESA_SHADER_FRAGMENT].MaxInputComponents = 32;
>
>      ctx->Const.MaxDrawBuffers = 1;
> +   ctx->Const.MaxComputeWorkGroupSize[0] = 1024;
> +   ctx->Const.MaxComputeWorkGroupSize[1] = 1024;
> +   ctx->Const.MaxComputeWorkGroupSize[2] = 64;
>      ctx->Const.Program[MESA_SHADER_COMPUTE].MaxTextureImageUnits = 16;
>      ctx->Const.Program[MESA_SHADER_COMPUTE].MaxUniformComponents = 1024;
>      ctx->Const.Program[MESA_SHADER_COMPUTE].MaxInputComponents = 0; /* not used */
> diff --git a/src/mesa/main/context.c b/src/mesa/main/context.c
> index b0cf5da..ebe27b4 100644
> --- a/src/mesa/main/context.c
> +++ b/src/mesa/main/context.c
> @@ -690,6 +690,11 @@ _mesa_init_constants(struct gl_context *ctx)
>      /* GL_ARB_vertex_attrib_binding */
>      ctx->Const.MaxVertexAttribRelativeOffset = 2047;
>      ctx->Const.MaxVertexAttribBindings = MAX_VERTEX_GENERIC_ATTRIBS;
> +
> +   /* GL_ARB_compute_shader */
> +   ctx->Const.MaxComputeWorkGroupSize[0] = 1024;
> +   ctx->Const.MaxComputeWorkGroupSize[1] = 1024;
> +   ctx->Const.MaxComputeWorkGroupSize[2] = 64;
>   }
>
>
> diff --git a/src/mesa/main/get.c b/src/mesa/main/get.c
> index 6342fbe..6b914f4 100644
> --- a/src/mesa/main/get.c
> +++ b/src/mesa/main/get.c
> @@ -1789,6 +1789,14 @@ find_value_indexed(const char *func, GLenum pname, GLuint index, union value *v)
>             goto invalid_value;
>         v->value_int = ctx->Array.ArrayObj->VertexBinding[VERT_ATTRIB_GENERIC(index)].Stride;
>         return TYPE_INT;
> +
> +   case GL_MAX_COMPUTE_WORK_GROUP_SIZE:
> +      if (!_mesa_is_desktop_gl(ctx) || !ctx->Extensions.ARB_compute_shader)
> +         goto invalid_enum;
> +      if (index >= 3)
> +         goto invalid_value;
> +      v->value_int = ctx->Const.MaxComputeWorkGroupSize[index];
> +      return TYPE_INT;
>      }
>
>    invalid_enum:
> diff --git a/src/mesa/main/mtypes.h b/src/mesa/main/mtypes.h
> index e6c3a22..d3f3a30 100644
> --- a/src/mesa/main/mtypes.h
> +++ b/src/mesa/main/mtypes.h
> @@ -3320,6 +3320,9 @@ struct gl_constants
>      /** GL_ARB_vertex_attrib_binding */
>      GLint MaxVertexAttribRelativeOffset;
>      GLint MaxVertexAttribBindings;
> +
> +   /** GL_ARB_compute_shader */
> +   GLuint MaxComputeWorkGroupSize[3];

Maybe put a comment on this to explain [3], that it's the X, Y, Z 
dimensions of the compute kernel.

-Brian



More information about the mesa-dev mailing list