From dee627a16ee46ffd9d049217cbb394d4ad5c6043 Mon Sep 17 00:00:00 2001 From: Samuel Pitoiset Date: Tue, 6 Sep 2016 22:46:42 +0200 Subject: [PATCH] glsl/linker: handle errors when a variable local size is used MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit 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 Reviewed-by: Ian Romanick Reviewed-by: Nicolai Hähnle --- 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 e6b2231a596..85995905bbb 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.30.2