glsl/linker: handle errors when a variable local size is used
authorSamuel Pitoiset <samuel.pitoiset@gmail.com>
Tue, 6 Sep 2016 20:46:42 +0000 (22:46 +0200)
committerSamuel Pitoiset <samuel.pitoiset@gmail.com>
Thu, 6 Oct 2016 22:18:57 +0000 (00:18 +0200)
Compute shaders can now include a fixed local size as defined by
ARB_compute_shader or a variable size as defined by
ARB_compute_variable_group_size.

v2: - update formatting spec quotations (Ian)
    - various cosmetic changes (Ian)

Signed-off-by: Samuel Pitoiset <samuel.pitoiset@gmail.com>
Reviewed-by: Ian Romanick <ian.d.romanick@intel.com>
Reviewed-by: Nicolai Hähnle <nicolai.haehnle@amd.com>
src/compiler/glsl/linker.cpp

index e6b2231a596afd96d8d8bb14e547d13ce3eae157..85995905bbb8d5384bbad945ad758b2768b0be33 100644 (file)
@@ -1988,6 +1988,8 @@ link_cs_input_layout_qualifiers(struct gl_shader_program *prog,
    for (int i = 0; i < 3; i++)
       linked_shader->info.Comp.LocalSize[i] = 0;
 
+   linked_shader->info.Comp.LocalSizeVariable = false;
+
    /* This function is called for all shader stages, but it only has an effect
     * for compute shaders.
     */
@@ -2022,6 +2024,20 @@ link_cs_input_layout_qualifiers(struct gl_shader_program *prog,
             linked_shader->info.Comp.LocalSize[i] =
                shader->info.Comp.LocalSize[i];
          }
+      } else if (shader->info.Comp.LocalSizeVariable) {
+         if (linked_shader->info.Comp.LocalSize[0] != 0) {
+            /* The ARB_compute_variable_group_size spec says:
+             *
+             *     If one compute shader attached to a program declares a
+             *     variable local group size and a second compute shader
+             *     attached to the same program declares a fixed local group
+             *     size, a link-time error results.
+             */
+            linker_error(prog, "compute shader defined with both fixed and "
+                         "variable local group size\n");
+            return;
+         }
+         linked_shader->info.Comp.LocalSizeVariable = true;
       }
    }
 
@@ -2029,12 +2045,17 @@ link_cs_input_layout_qualifiers(struct gl_shader_program *prog,
     * since we already know we're in the right type of shader program
     * for doing it.
     */
-   if (linked_shader->info.Comp.LocalSize[0] == 0) {
-      linker_error(prog, "compute shader didn't declare local size\n");
+   if (linked_shader->info.Comp.LocalSize[0] == 0 &&
+       !linked_shader->info.Comp.LocalSizeVariable) {
+      linker_error(prog, "compute shader must contain a fixed or a variable "
+                         "local group size\n");
       return;
    }
    for (int i = 0; i < 3; i++)
       prog->Comp.LocalSize[i] = linked_shader->info.Comp.LocalSize[i];
+
+   prog->Comp.LocalSizeVariable =
+      linked_shader->info.Comp.LocalSizeVariable;
 }