[Mesa-dev] [PATCH v4 06/14] glsl/linker: handle errors when a variable local size is used
Samuel Pitoiset
samuel.pitoiset at gmail.com
Wed Oct 5 18:48:11 UTC 2016
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 at gmail.com>
Reviewed-by: Ian Romanick <ian.d.romanick at intel.com>
Reviewed-by: Nicolai Hähnle <nicolai.haehnle at amd.com>
---
src/compiler/glsl/linker.cpp | 25 +++++++++++++++++++++++--
1 file changed, 23 insertions(+), 2 deletions(-)
diff --git a/src/compiler/glsl/linker.cpp b/src/compiler/glsl/linker.cpp
index e6b2231..8599590 100644
--- a/src/compiler/glsl/linker.cpp
+++ b/src/compiler/glsl/linker.cpp
@@ -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;
}
--
2.10.0
More information about the mesa-dev
mailing list