mesa/cs: Implement MAX_COMPUTE_WORK_GROUP_SIZE constant.
authorPaul Berry <stereotype441@gmail.com>
Mon, 6 Jan 2014 21:31:58 +0000 (13:31 -0800)
committerPaul Berry <stereotype441@gmail.com>
Wed, 5 Feb 2014 17:01:54 +0000 (09:01 -0800)
v2: Document that the 3-element array MaxComputeWorkGroupSize is
indexed by dimension.

Reviewed-by: Matt Turner <mattst88@gmail.com>
Reviewed-by: Jordan Justen <jordan.l.justen@intel.com>
src/glsl/builtin_variables.cpp
src/glsl/glsl_parser_extras.cpp
src/glsl/glsl_parser_extras.h
src/glsl/main.cpp
src/glsl/standalone_scaffolding.cpp
src/mesa/main/context.c
src/mesa/main/get.c
src/mesa/main/mtypes.h

index df560fbbf655c30b45d61f5a65192b127d6d5701..f96d4895d5fa26593ab320de9584664a95191b67 100644 (file)
@@ -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]);
+   }
 }
 
 
index 134d836e1d97010538881412ac722ec077f6cd1e..d256680e8ea2e6f198018561892d501c9321603b 100644 (file)
@@ -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;
index 6c0034d50086ea4b418351423204e5562d79fa29..802e0f0e6357a6b612aa2f71bc8080d34424ba13 100644 (file)
@@ -250,6 +250,9 @@ struct _mesa_glsl_parse_state {
       unsigned MaxFragmentAtomicCounters;
       unsigned MaxCombinedAtomicCounters;
       unsigned MaxAtomicBufferBindings;
+
+      /* ARB_compute_shader */
+      unsigned MaxComputeWorkGroupSize[3];
    } Const;
 
    /**
index 864c9298865d2f13b12b032d912de9523d9f4d83..bb2054f9866413a477e3fcb60ac59e18f89902cb 100644 (file)
@@ -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 */
index 42c45720b73177a0e1e658d956ca26e6027ad7dc..748d7e964d21afec120c00e3fe57ec69a396de64 100644 (file)
@@ -141,6 +141,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 */
index 69835a59eaf075b00d6e910cdfa1a346698f1b72..abebd82874a288e91a07ebaad9a43501dfddef24 100644 (file)
@@ -700,6 +700,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;
 }
 
 
index f22acff0b36babf803c9afc5bd40225f14997f03..acd4d8c290b5c90e18dda8b54592f7c2c44963e2 100644 (file)
@@ -1927,6 +1927,14 @@ find_value_indexed(const char *func, GLenum pname, GLuint index, union value *v)
 
       v->value_int = ctx->ImageUnits[index].Format;
       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:
index 6af4db65c2e020dad1cf91cd1e35b274b2028a60..08c5505f8c191159da618a4d271d90de1c9bbde4 100644 (file)
@@ -3378,6 +3378,9 @@ struct gl_constants
    GLuint MaxCombinedImageUnitsAndFragmentOutputs;
    GLuint MaxImageSamples;
    GLuint MaxCombinedImageUniforms;
+
+   /** GL_ARB_compute_shader */
+   GLuint MaxComputeWorkGroupSize[3]; /* Array of x, y, z dimensions */
 };