[Mesa-dev] [PATCH 24/25] mesa/glsl: set and get cs layouts to and from shader_info
Lionel Landwerlin
lionel.g.landwerlin at intel.com
Wed Jan 11 12:54:45 UTC 2017
On 09/01/17 05:13, Timothy Arceri wrote:
> ---
> src/compiler/glsl/linker.cpp | 35 +++++++++++++++--------------------
> src/mesa/main/mtypes.h | 10 ----------
> src/mesa/main/shaderapi.c | 6 ++----
> src/mesa/main/shaderobj.c | 2 --
> 4 files changed, 17 insertions(+), 36 deletions(-)
>
> diff --git a/src/compiler/glsl/linker.cpp b/src/compiler/glsl/linker.cpp
> index 53ee7e6..f822778 100644
> --- a/src/compiler/glsl/linker.cpp
> +++ b/src/compiler/glsl/linker.cpp
> @@ -2005,21 +2005,21 @@ link_gs_inout_layout_qualifiers(struct gl_shader_program *prog,
> */
> static void
> link_cs_input_layout_qualifiers(struct gl_shader_program *prog,
> - struct gl_linked_shader *linked_shader,
> + struct gl_program *gl_prog,
> struct gl_shader **shader_list,
> unsigned num_shaders)
> {
> - 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.
> */
> - if (linked_shader->Stage != MESA_SHADER_COMPUTE)
> + if (gl_prog->info.stage != MESA_SHADER_COMPUTE)
> return;
>
> + for (int i = 0; i < 3; i++)
> + gl_prog->info.cs.local_size[i] = 0;
> +
> + gl_prog->info.cs.local_size_variable = false;
> +
> /* From the ARB_compute_shader spec, in the section describing local size
> * declarations:
> *
> @@ -2034,9 +2034,9 @@ link_cs_input_layout_qualifiers(struct gl_shader_program *prog,
> struct gl_shader *shader = shader_list[sh];
>
> if (shader->info.Comp.LocalSize[0] != 0) {
> - if (linked_shader->info.Comp.LocalSize[0] != 0) {
> + if (gl_prog->info.cs.local_size[0] != 0) {
> for (int i = 0; i < 3; i++) {
> - if (linked_shader->info.Comp.LocalSize[i] !=
> + if (gl_prog->info.cs.local_size[i] !=
> shader->info.Comp.LocalSize[i]) {
> linker_error(prog, "compute shader defined with conflicting "
> "local sizes\n");
> @@ -2045,11 +2045,11 @@ link_cs_input_layout_qualifiers(struct gl_shader_program *prog,
> }
> }
> for (int i = 0; i < 3; i++) {
> - linked_shader->info.Comp.LocalSize[i] =
> + gl_prog->info.cs.local_size[i] =
> shader->info.Comp.LocalSize[i];
> }
> } else if (shader->info.Comp.LocalSizeVariable) {
> - if (linked_shader->info.Comp.LocalSize[0] != 0) {
> + if (gl_prog->info.cs.local_size[0] != 0) {
> /* The ARB_compute_variable_group_size spec says:
> *
> * If one compute shader attached to a program declares a
> @@ -2061,7 +2061,7 @@ link_cs_input_layout_qualifiers(struct gl_shader_program *prog,
> "variable local group size\n");
> return;
> }
> - linked_shader->info.Comp.LocalSizeVariable = true;
> + gl_prog->info.cs.local_size_variable = true;
> }
> }
>
> @@ -2069,17 +2069,12 @@ 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 &&
> - !linked_shader->info.Comp.LocalSizeVariable) {
> + if (gl_prog->info.cs.local_size[0] == 0 &&
> + !gl_prog->info.cs.local_size_variable) {
> 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;
> }
>
>
> @@ -2209,7 +2204,7 @@ link_intrastage_shaders(void *mem_ctx,
> link_tcs_out_layout_qualifiers(prog, gl_prog, shader_list, num_shaders);
> link_tes_in_layout_qualifiers(prog, gl_prog, shader_list, num_shaders);
> link_gs_inout_layout_qualifiers(prog, gl_prog, shader_list, num_shaders);
> - link_cs_input_layout_qualifiers(prog, linked, shader_list, num_shaders);
> + link_cs_input_layout_qualifiers(prog, gl_prog, shader_list, num_shaders);
> link_xfb_stride_layout_qualifiers(ctx, prog, linked, shader_list,
> num_shaders);
>
> diff --git a/src/mesa/main/mtypes.h b/src/mesa/main/mtypes.h
> index 2004720..aff426f 100644
> --- a/src/mesa/main/mtypes.h
> +++ b/src/mesa/main/mtypes.h
> @@ -2760,19 +2760,9 @@ struct gl_shader_program
> */
> struct {
> /**
> - * If this shader contains a compute stage, size specified using
> - * local_size_{x,y,z}. Otherwise undefined.
> - */
> - unsigned LocalSize[3];
> - /**
> * Size of shared variables accessed by the compute shader.
> */
> unsigned SharedSize;
Do you think we could get rid SharedSize too and store it directly into
shader_info?
> -
> - /**
> - * Whether a variable work group size has been specified.
> - */
> - bool LocalSizeVariable;
> } Comp;
>
> /** Data shared by gl_program and gl_shader_program */
> diff --git a/src/mesa/main/shaderapi.c b/src/mesa/main/shaderapi.c
> index 4537ea4..8c6e035 100644
> --- a/src/mesa/main/shaderapi.c
> +++ b/src/mesa/main/shaderapi.c
> @@ -807,7 +807,8 @@ get_programiv(struct gl_context *ctx, GLuint program, GLenum pname,
> return;
> }
> for (i = 0; i < 3; i++)
> - params[i] = shProg->Comp.LocalSize[i];
> + params[i] = shProg->_LinkedShaders[MESA_SHADER_COMPUTE]->
> + Program->info.cs.local_size[i];
> return;
> }
> case GL_PROGRAM_SEPARABLE:
> @@ -2214,10 +2215,7 @@ _mesa_copy_linked_program_data(const struct gl_shader_program *src,
> break;
> }
> case MESA_SHADER_COMPUTE: {
> - for (int i = 0; i < 3; i++)
> - dst->info.cs.local_size[i] = src->Comp.LocalSize[i];
> dst->info.cs.shared_size = src->Comp.SharedSize;
> - dst->info.cs.local_size_variable = src->Comp.LocalSizeVariable;
> break;
> }
> default:
> diff --git a/src/mesa/main/shaderobj.c b/src/mesa/main/shaderobj.c
> index 4e514a3..b41137f 100644
> --- a/src/mesa/main/shaderobj.c
> +++ b/src/mesa/main/shaderobj.c
> @@ -282,8 +282,6 @@ init_shader_program(struct gl_shader_program *prog)
> prog->Geom.UsesEndPrimitive = false;
> prog->Geom.UsesStreams = false;
>
> - prog->Comp.LocalSizeVariable = false;
> -
> prog->TransformFeedback.BufferMode = GL_INTERLEAVED_ATTRIBS;
>
> exec_list_make_empty(&prog->EmptyUniformLocations);
More information about the mesa-dev
mailing list