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

2014-01-10 Thread Brian Paul

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 

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

2014-01-09 Thread Paul Berry
---
 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; /*