[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