mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2025-12-24 13:10:10 +01:00
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 <samuel.pitoiset@gmail.com>
Reviewed-by: Ian Romanick <ian.d.romanick@intel.com>
Reviewed-by: Nicolai Hähnle <nicolai.haehnle@amd.com>
This commit is contained in:
parent
008e785f74
commit
dee627a16e
1 changed files with 23 additions and 2 deletions
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue