diff options
author | Samuel Pitoiset <[email protected]> | 2016-09-06 22:46:42 +0200 |
---|---|---|
committer | Samuel Pitoiset <[email protected]> | 2016-10-07 00:18:57 +0200 |
commit | dee627a16ee46ffd9d049217cbb394d4ad5c6043 (patch) | |
tree | b167180773688e164749b0c331753c6c43b44aa0 /src | |
parent | 008e785f742078e17221ebea727a5a5ea7ee95ff (diff) |
glsl/linker: handle errors when a variable local size is used
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 <[email protected]>
Reviewed-by: Ian Romanick <[email protected]>
Reviewed-by: Nicolai Hähnle <[email protected]>
Diffstat (limited to 'src')
-rw-r--r-- | src/compiler/glsl/linker.cpp | 25 |
1 files 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; } |