st/mesa: implement limits for ARB_compute_shader
authorSamuel Pitoiset <samuel.pitoiset@gmail.com>
Wed, 20 Jan 2016 17:12:39 +0000 (18:12 +0100)
committerSamuel Pitoiset <samuel.pitoiset@gmail.com>
Sat, 13 Feb 2016 15:01:02 +0000 (16:01 +0100)
According to the spec, this also increases the following minimum values:
 - MAX_COMBINED_TEXTURE_IMAGE_UNITS     96 (6*16), was 80
 - MAX_UNIFORM_BUFFER_BINDINGS          72 (6*12), was 60

ARB_compute_shader is not enabled by default because images support is
still not implemented yet. If you want to use it you need to set
MESA_EXTENSION_OVERRIDE=GL_ARB_compute_shader.

Changes from v2:
 - make use of the new PIPE_CAP_SHADER_SUPPORTED_IRS cap instead of
   enabling the extension when PIPE_CAP_COMPUTE is enabled.
 - query for PIPE_CAP_COMPUTE first
 - s/shader_supported_irs/compute_supported_irs/
 - disable ARB_compute_shader and add a comment which explains why

Signed-off-by: Samuel Pitoiset <samuel.pitoiset@gmail.com>
Reviewed-by: Marek Olšák <marek.olsak@amd.com>
Reviewed-by: Ilia Mirkin <imirkin@alum.mit.edu>
src/mesa/state_tracker/st_extensions.c

index 6736ebc53bf00dec597779dbba5aa826af913498..bdfbded9ac60a2c1b0b409a6268067f4a356e43e 100644 (file)
@@ -276,7 +276,8 @@ void st_init_limits(struct pipe_screen *screen,
               c->Program[MESA_SHADER_TESS_CTRL].MaxTextureImageUnits +
               c->Program[MESA_SHADER_TESS_EVAL].MaxTextureImageUnits +
               c->Program[MESA_SHADER_GEOMETRY].MaxTextureImageUnits +
-              c->Program[MESA_SHADER_FRAGMENT].MaxTextureImageUnits,
+              c->Program[MESA_SHADER_FRAGMENT].MaxTextureImageUnits +
+              c->Program[MESA_SHADER_COMPUTE].MaxTextureImageUnits,
               MAX_COMBINED_TEXTURE_IMAGE_UNITS);
 
    /* This depends on program constants. */
@@ -336,7 +337,8 @@ void st_init_limits(struct pipe_screen *screen,
          c->Program[MESA_SHADER_TESS_CTRL].MaxUniformBlocks +
          c->Program[MESA_SHADER_TESS_EVAL].MaxUniformBlocks +
          c->Program[MESA_SHADER_GEOMETRY].MaxUniformBlocks +
-         c->Program[MESA_SHADER_FRAGMENT].MaxUniformBlocks;
+         c->Program[MESA_SHADER_FRAGMENT].MaxUniformBlocks +
+         c->Program[MESA_SHADER_COMPUTE].MaxUniformBlocks;
       assert(c->MaxCombinedUniformBlocks <= MAX_COMBINED_UNIFORM_BUFFERS);
    }
 
@@ -1018,4 +1020,31 @@ void st_init_extensions(struct pipe_screen *screen,
    if ((ST_DEBUG & DEBUG_GREMEDY) &&
        screen->get_param(screen, PIPE_CAP_STRING_MARKER))
       extensions->GREMEDY_string_marker = GL_TRUE;
+
+   if (screen->get_param(screen, PIPE_CAP_COMPUTE)) {
+      int compute_supported_irs =
+         screen->get_shader_param(screen, PIPE_SHADER_COMPUTE,
+                                  PIPE_SHADER_CAP_SUPPORTED_IRS);
+      if (compute_supported_irs & (1 << PIPE_SHADER_IR_TGSI)) {
+         uint64_t grid_size[3], block_size[3];
+
+         screen->get_compute_param(screen, PIPE_COMPUTE_CAP_MAX_GRID_SIZE,
+                                   grid_size);
+         screen->get_compute_param(screen, PIPE_COMPUTE_CAP_MAX_BLOCK_SIZE,
+                                   block_size);
+         screen->get_compute_param(screen,
+                                   PIPE_COMPUTE_CAP_MAX_THREADS_PER_BLOCK,
+                                   &consts->MaxComputeWorkGroupInvocations);
+         screen->get_compute_param(screen, PIPE_COMPUTE_CAP_MAX_LOCAL_SIZE,
+                                   &consts->MaxComputeSharedMemorySize);
+
+         for (i = 0; i < 3; i++) {
+            consts->MaxComputeWorkGroupCount[i] = grid_size[i];
+            consts->MaxComputeWorkGroupSize[i] = block_size[i];
+         }
+         /* XXX: ARB_compute_shader is not enabled by default because images
+          * support is still not implemented yet. */
+         /* extensions->ARB_compute_shader = true; */
+      }
+   }
 }