From 9d2b391165e64f3c64021e5a563037e0ccc09d84 Mon Sep 17 00:00:00 2001 From: Timothy Arceri Date: Wed, 19 Oct 2016 09:15:57 +1100 Subject: [PATCH] glsl: add temporary copy_shader_info() function This function is added here to ease refactoring towards using the new shared shader_info. Once refactoring is complete and values are set directly it will be removed. We call it from _mesa_copy_linked_program_data() rather than glsl_to_nir() so that the values will be set for all drivers. In order to do this some calls need to be moved around so that we make sure to call do_set_program_inouts() before _mesa_copy_linked_program_data() Reviewed-by: Jason Ekstrand --- src/compiler/Makefile.sources | 4 +- src/compiler/glsl/glsl_to_nir.cpp | 45 ------------- src/compiler/shader_info.c | 78 ++++++++++++++++++++++ src/compiler/shader_info.h | 7 ++ src/mesa/drivers/dri/i965/brw_link.cpp | 8 +-- src/mesa/main/shaderapi.c | 2 + src/mesa/state_tracker/st_glsl_to_nir.cpp | 4 +- src/mesa/state_tracker/st_glsl_to_tgsi.cpp | 2 +- 8 files changed, 97 insertions(+), 53 deletions(-) create mode 100644 src/compiler/shader_info.c diff --git a/src/compiler/Makefile.sources b/src/compiler/Makefile.sources index a30443da544..df1db0c3ec2 100644 --- a/src/compiler/Makefile.sources +++ b/src/compiler/Makefile.sources @@ -5,7 +5,9 @@ LIBCOMPILER_FILES = \ nir_types.cpp \ nir_types.h \ shader_enums.c \ - shader_enums.h + shader_enums.h \ + shader_info.c \ + shader_info.h # libglsl diff --git a/src/compiler/glsl/glsl_to_nir.cpp b/src/compiler/glsl/glsl_to_nir.cpp index 934c9d14f94..096ab4c5e2a 100644 --- a/src/compiler/glsl/glsl_to_nir.cpp +++ b/src/compiler/glsl/glsl_to_nir.cpp @@ -152,57 +152,12 @@ glsl_to_nir(const struct gl_shader_program *shader_prog, shader->info->num_abos = shader_prog->NumAtomicBuffers; shader->info->num_ssbos = sh->NumShaderStorageBlocks; shader->info->num_images = sh->NumImages; - shader->info->inputs_read = sh->Program->InputsRead; - shader->info->double_inputs_read = sh->Program->DoubleInputsRead; - shader->info->outputs_written = sh->Program->OutputsWritten; - shader->info->outputs_read = sh->Program->OutputsRead; - shader->info->patch_inputs_read = sh->Program->PatchInputsRead; - shader->info->patch_outputs_written = sh->Program->PatchOutputsWritten; - shader->info->system_values_read = sh->Program->SystemValuesRead; - shader->info->uses_texture_gather = sh->Program->UsesGather; shader->info->uses_clip_distance_out = sh->Program->ClipDistanceArraySize != 0; shader->info->separate_shader = shader_prog->SeparateShader; shader->info->has_transform_feedback_varyings = shader_prog->TransformFeedback.NumVarying > 0; - switch (stage) { - case MESA_SHADER_TESS_CTRL: - shader->info->tcs.vertices_out = sh->info.TessCtrl.VerticesOut; - break; - - case MESA_SHADER_GEOMETRY: - shader->info->gs.vertices_in = shader_prog->Geom.VerticesIn; - shader->info->gs.output_primitive = sh->info.Geom.OutputType; - shader->info->gs.vertices_out = sh->info.Geom.VerticesOut; - shader->info->gs.invocations = sh->info.Geom.Invocations; - shader->info->gs.uses_end_primitive = shader_prog->Geom.UsesEndPrimitive; - shader->info->gs.uses_streams = shader_prog->Geom.UsesStreams; - break; - - case MESA_SHADER_FRAGMENT: { - struct gl_fragment_program *fp = - (struct gl_fragment_program *)sh->Program; - - shader->info->fs.uses_discard = fp->UsesKill; - shader->info->fs.uses_sample_qualifier = fp->IsSample != 0; - shader->info->fs.early_fragment_tests = sh->info.EarlyFragmentTests; - shader->info->fs.depth_layout = fp->FragDepthLayout; - break; - } - - case MESA_SHADER_COMPUTE: { - struct gl_compute_program *cp = (struct gl_compute_program *)sh->Program; - shader->info->cs.local_size[0] = cp->LocalSize[0]; - shader->info->cs.local_size[1] = cp->LocalSize[1]; - shader->info->cs.local_size[2] = cp->LocalSize[2]; - break; - } - - default: - break; /* No stage-specific info */ - } - return shader; } diff --git a/src/compiler/shader_info.c b/src/compiler/shader_info.c new file mode 100644 index 00000000000..ebd9caf1f24 --- /dev/null +++ b/src/compiler/shader_info.c @@ -0,0 +1,78 @@ +/* + * Copyright © 2016 Intel Corporation + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + * + */ + +#include "mesa/main/mtypes.h" + +void +copy_shader_info(const struct gl_shader_program *shader_prog, + struct gl_linked_shader *sh) +{ + shader_info *info = &sh->Program->info; + + info->inputs_read = sh->Program->InputsRead; + info->double_inputs_read = sh->Program->DoubleInputsRead; + info->outputs_written = sh->Program->OutputsWritten; + info->outputs_read = sh->Program->OutputsRead; + info->patch_inputs_read = sh->Program->PatchInputsRead; + info->patch_outputs_written = sh->Program->PatchOutputsWritten; + info->system_values_read = sh->Program->SystemValuesRead; + info->uses_texture_gather = sh->Program->UsesGather; + + switch (sh->Stage) { + case MESA_SHADER_TESS_CTRL: + info->tcs.vertices_out = sh->info.TessCtrl.VerticesOut; + break; + + case MESA_SHADER_GEOMETRY: + info->gs.vertices_in = shader_prog->Geom.VerticesIn; + info->gs.output_primitive = sh->info.Geom.OutputType; + info->gs.vertices_out = sh->info.Geom.VerticesOut; + info->gs.invocations = sh->info.Geom.Invocations; + info->gs.uses_end_primitive = shader_prog->Geom.UsesEndPrimitive; + info->gs.uses_streams = shader_prog->Geom.UsesStreams; + break; + + case MESA_SHADER_FRAGMENT: { + struct gl_fragment_program *fp = + (struct gl_fragment_program *)sh->Program; + + info->fs.uses_discard = fp->UsesKill; + info->fs.uses_sample_qualifier = fp->IsSample != 0; + info->fs.early_fragment_tests = sh->info.EarlyFragmentTests; + info->fs.depth_layout = fp->FragDepthLayout; + break; + } + + case MESA_SHADER_COMPUTE: { + struct gl_compute_program *cp = (struct gl_compute_program *)sh->Program; + info->cs.local_size[0] = cp->LocalSize[0]; + info->cs.local_size[1] = cp->LocalSize[1]; + info->cs.local_size[2] = cp->LocalSize[2]; + break; + } + + default: + break; /* No stage-specific info */ + } +} diff --git a/src/compiler/shader_info.h b/src/compiler/shader_info.h index ab38562d95e..7624008dedc 100644 --- a/src/compiler/shader_info.h +++ b/src/compiler/shader_info.h @@ -124,6 +124,13 @@ typedef struct shader_info { }; } shader_info; +struct gl_shader_program; +struct gl_linked_shader; + +void +copy_shader_info(const struct gl_shader_program *shader_prog, + struct gl_linked_shader *sh); + #ifdef __cplusplus } #endif diff --git a/src/mesa/drivers/dri/i965/brw_link.cpp b/src/mesa/drivers/dri/i965/brw_link.cpp index f0e504d99ab..f75b384d673 100644 --- a/src/mesa/drivers/dri/i965/brw_link.cpp +++ b/src/mesa/drivers/dri/i965/brw_link.cpp @@ -231,10 +231,12 @@ brw_link_shader(struct gl_context *ctx, struct gl_shader_program *shProg) prog->Parameters = _mesa_new_parameter_list(); - _mesa_copy_linked_program_data(shProg, shader); - process_glsl_ir(brw, shProg, shader); + do_set_program_inouts(shader->ir, prog, shader->Stage); + + _mesa_copy_linked_program_data(shProg, shader); + /* Make a pass over the IR to add state references for any built-in * uniforms that are used. This has to be done now (during linking). * Code generation doesn't happen until the first time this shader is @@ -258,8 +260,6 @@ brw_link_shader(struct gl_context *ctx, struct gl_shader_program *shProg) } } - do_set_program_inouts(shader->ir, prog, shader->Stage); - prog->SamplersUsed = shader->active_samplers; prog->ShadowSamplers = shader->shadow_samplers; _mesa_update_shader_textures_used(shProg, prog); diff --git a/src/mesa/main/shaderapi.c b/src/mesa/main/shaderapi.c index 358969b082c..bbaf7706407 100644 --- a/src/mesa/main/shaderapi.c +++ b/src/mesa/main/shaderapi.c @@ -2218,6 +2218,8 @@ _mesa_copy_linked_program_data(const struct gl_shader_program *src, default: break; } + + copy_shader_info(src, dst_sh); } /** diff --git a/src/mesa/state_tracker/st_glsl_to_nir.cpp b/src/mesa/state_tracker/st_glsl_to_nir.cpp index 97fef082c04..303b36e9467 100644 --- a/src/mesa/state_tracker/st_glsl_to_nir.cpp +++ b/src/mesa/state_tracker/st_glsl_to_nir.cpp @@ -382,6 +382,8 @@ st_nir_get_mesa_program(struct gl_context *ctx, prog->Parameters = _mesa_new_parameter_list(); + do_set_program_inouts(shader->ir, prog, shader->Stage); + _mesa_copy_linked_program_data(shader_program, shader); _mesa_generate_parameters_list_for_uniforms(shader_program, shader, prog->Parameters); @@ -421,8 +423,6 @@ st_nir_get_mesa_program(struct gl_context *ctx, prog->Instructions = NULL; prog->NumInstructions = 0; - do_set_program_inouts(shader->ir, prog, shader->Stage); - prog->SamplersUsed = shader->active_samplers; prog->ShadowSamplers = shader->shadow_samplers; prog->ExternalSamplersUsed = gl_external_samplers(shader); diff --git a/src/mesa/state_tracker/st_glsl_to_tgsi.cpp b/src/mesa/state_tracker/st_glsl_to_tgsi.cpp index b2bd2152488..4d2b1f60ebb 100644 --- a/src/mesa/state_tracker/st_glsl_to_tgsi.cpp +++ b/src/mesa/state_tracker/st_glsl_to_tgsi.cpp @@ -6397,7 +6397,6 @@ get_mesa_program_tgsi(struct gl_context *ctx, v->have_fma = pscreen->get_shader_param(pscreen, ptarget, PIPE_SHADER_CAP_TGSI_FMA_SUPPORTED); - _mesa_copy_linked_program_data(shader_program, shader); _mesa_generate_parameters_list_for_uniforms(shader_program, shader, prog->Parameters); @@ -6467,6 +6466,7 @@ get_mesa_program_tgsi(struct gl_context *ctx, prog->NumInstructions = 0; do_set_program_inouts(shader->ir, prog, shader->Stage); + _mesa_copy_linked_program_data(shader_program, shader); shrink_array_declarations(v->inputs, v->num_inputs, &prog->InputsRead, prog->DoubleInputsRead, &prog->PatchInputsRead); shrink_array_declarations(v->outputs, v->num_outputs, -- 2.30.2