From e40d32b3ec0793b475004b8f36b17f1493806271 Mon Sep 17 00:00:00 2001 From: Timothy Arceri Date: Wed, 19 Oct 2016 14:49:48 +1100 Subject: [PATCH] mesa: modify _mesa_copy_linked_program_data() to take gl_linked_shader This allows us to do some small tidy ups, but will also allow us to call a new function that copies values to a shared shader info from here. In order to make this change this function now requires _mesa_reference_program() to have previously been called. Reviewed-by: Jason Ekstrand --- src/mesa/drivers/dri/i965/brw_link.cpp | 7 ++-- src/mesa/main/shaderapi.c | 39 +++++++++++----------- src/mesa/main/shaderapi.h | 5 ++- src/mesa/program/ir_to_mesa.cpp | 2 +- src/mesa/state_tracker/st_glsl_to_nir.cpp | 6 ++-- src/mesa/state_tracker/st_glsl_to_tgsi.cpp | 7 ++-- 6 files changed, 34 insertions(+), 32 deletions(-) diff --git a/src/mesa/drivers/dri/i965/brw_link.cpp b/src/mesa/drivers/dri/i965/brw_link.cpp index 5ea97736fa8..f0e504d99ab 100644 --- a/src/mesa/drivers/dri/i965/brw_link.cpp +++ b/src/mesa/drivers/dri/i965/brw_link.cpp @@ -226,9 +226,12 @@ brw_link_shader(struct gl_context *ctx, struct gl_shader_program *shProg) 0); if (!prog) return false; + + _mesa_reference_program(ctx, &shader->Program, prog); + prog->Parameters = _mesa_new_parameter_list(); - _mesa_copy_linked_program_data((gl_shader_stage) stage, shProg, prog); + _mesa_copy_linked_program_data(shProg, shader); process_glsl_ir(brw, shProg, shader); @@ -261,8 +264,6 @@ brw_link_shader(struct gl_context *ctx, struct gl_shader_program *shProg) prog->ShadowSamplers = shader->shadow_samplers; _mesa_update_shader_textures_used(shProg, prog); - _mesa_reference_program(ctx, &shader->Program, prog); - brw_add_texrect_params(prog); prog->nir = brw_create_nir(brw, shProg, prog, (gl_shader_stage) stage, diff --git a/src/mesa/main/shaderapi.c b/src/mesa/main/shaderapi.c index 1af1c3f5794..358969b082c 100644 --- a/src/mesa/main/shaderapi.c +++ b/src/mesa/main/shaderapi.c @@ -2152,14 +2152,20 @@ _mesa_use_shader_program(struct gl_context *ctx, GLenum type, /** * Copy program-specific data generated by linking from the gl_shader_program - * object to a specific gl_program object. + * object to the gl_program object referred to by the gl_linked_shader. + * + * This function expects _mesa_reference_program() to have been previously + * called setting the gl_linked_shaders program reference. */ void -_mesa_copy_linked_program_data(gl_shader_stage type, - const struct gl_shader_program *src, - struct gl_program *dst) +_mesa_copy_linked_program_data(const struct gl_shader_program *src, + struct gl_linked_shader *dst_sh) { - switch (type) { + assert(dst_sh->Program); + + struct gl_program *dst = dst_sh->Program; + + switch (dst_sh->Stage) { case MESA_SHADER_VERTEX: dst->ClipDistanceArraySize = src->Vert.ClipDistanceArraySize; dst->CullDistanceArraySize = src->Vert.CullDistanceArraySize; @@ -2167,34 +2173,29 @@ _mesa_copy_linked_program_data(gl_shader_stage type, case MESA_SHADER_TESS_CTRL: { struct gl_tess_ctrl_program *dst_tcp = (struct gl_tess_ctrl_program *) dst; - dst_tcp->VerticesOut = src->_LinkedShaders[MESA_SHADER_TESS_CTRL]-> - info.TessCtrl.VerticesOut; + dst_tcp->VerticesOut = dst_sh->info.TessCtrl.VerticesOut; break; } case MESA_SHADER_TESS_EVAL: { struct gl_tess_eval_program *dst_tep = (struct gl_tess_eval_program *) dst; - struct gl_linked_shader *tes_sh = - src->_LinkedShaders[MESA_SHADER_TESS_EVAL]; - dst_tep->PrimitiveMode = tes_sh->info.TessEval.PrimitiveMode; - dst_tep->Spacing = tes_sh->info.TessEval.Spacing; - dst_tep->VertexOrder = tes_sh->info.TessEval.VertexOrder; - dst_tep->PointMode = tes_sh->info.TessEval.PointMode; + dst_tep->PrimitiveMode = dst_sh->info.TessEval.PrimitiveMode; + dst_tep->Spacing = dst_sh->info.TessEval.Spacing; + dst_tep->VertexOrder = dst_sh->info.TessEval.VertexOrder; + dst_tep->PointMode = dst_sh->info.TessEval.PointMode; dst->ClipDistanceArraySize = src->TessEval.ClipDistanceArraySize; dst->CullDistanceArraySize = src->TessEval.CullDistanceArraySize; break; } case MESA_SHADER_GEOMETRY: { struct gl_geometry_program *dst_gp = (struct gl_geometry_program *) dst; - struct gl_linked_shader *geom_sh = - src->_LinkedShaders[MESA_SHADER_GEOMETRY]; dst_gp->VerticesIn = src->Geom.VerticesIn; - dst_gp->VerticesOut = geom_sh->info.Geom.VerticesOut; - dst_gp->Invocations = geom_sh->info.Geom.Invocations; - dst_gp->InputType = geom_sh->info.Geom.InputType; - dst_gp->OutputType = geom_sh->info.Geom.OutputType; + dst_gp->VerticesOut = dst_sh->info.Geom.VerticesOut; + dst_gp->Invocations = dst_sh->info.Geom.Invocations; + dst_gp->InputType = dst_sh->info.Geom.InputType; + dst_gp->OutputType = dst_sh->info.Geom.OutputType; dst->ClipDistanceArraySize = src->Geom.ClipDistanceArraySize; dst->CullDistanceArraySize = src->Geom.CullDistanceArraySize; dst_gp->UsesEndPrimitive = src->Geom.UsesEndPrimitive; diff --git a/src/mesa/main/shaderapi.h b/src/mesa/main/shaderapi.h index 4297bfa3d65..50929f4483e 100644 --- a/src/mesa/main/shaderapi.h +++ b/src/mesa/main/shaderapi.h @@ -218,9 +218,8 @@ _mesa_use_shader_program(struct gl_context *ctx, GLenum type, struct gl_pipeline_object *shTarget); extern void -_mesa_copy_linked_program_data(gl_shader_stage type, - const struct gl_shader_program *src, - struct gl_program *dst); +_mesa_copy_linked_program_data(const struct gl_shader_program *src, + struct gl_linked_shader *dst_sh); extern bool _mesa_validate_shader_target(const struct gl_context *ctx, GLenum type); diff --git a/src/mesa/program/ir_to_mesa.cpp b/src/mesa/program/ir_to_mesa.cpp index bd65df2b22e..00ee3e34bfc 100644 --- a/src/mesa/program/ir_to_mesa.cpp +++ b/src/mesa/program/ir_to_mesa.cpp @@ -3028,7 +3028,7 @@ _mesa_ir_link_shader(struct gl_context *ctx, struct gl_shader_program *prog) linked_prog = get_mesa_program(ctx, prog, prog->_LinkedShaders[i]); if (linked_prog) { - _mesa_copy_linked_program_data((gl_shader_stage) i, prog, linked_prog); + _mesa_copy_linked_program_data(prog, prog->_LinkedShaders[i]); if (!ctx->Driver.ProgramStringNotify(ctx, _mesa_shader_stage_to_program(i), diff --git a/src/mesa/state_tracker/st_glsl_to_nir.cpp b/src/mesa/state_tracker/st_glsl_to_nir.cpp index f43460ba67a..97fef082c04 100644 --- a/src/mesa/state_tracker/st_glsl_to_nir.cpp +++ b/src/mesa/state_tracker/st_glsl_to_nir.cpp @@ -378,9 +378,11 @@ st_nir_get_mesa_program(struct gl_context *ctx, if (!prog) return NULL; + _mesa_reference_program(ctx, &shader->Program, prog); + prog->Parameters = _mesa_new_parameter_list(); - _mesa_copy_linked_program_data(shader->Stage, shader_program, prog); + _mesa_copy_linked_program_data(shader_program, shader); _mesa_generate_parameters_list_for_uniforms(shader_program, shader, prog->Parameters); @@ -426,8 +428,6 @@ st_nir_get_mesa_program(struct gl_context *ctx, prog->ExternalSamplersUsed = gl_external_samplers(shader); _mesa_update_shader_textures_used(shader_program, prog); - _mesa_reference_program(ctx, &shader->Program, prog); - /* Avoid reallocation of the program parameter list, because the uniform * storage is only associated with the original parameter list. * This should be enough for Bitmap and DrawPixels constants. diff --git a/src/mesa/state_tracker/st_glsl_to_tgsi.cpp b/src/mesa/state_tracker/st_glsl_to_tgsi.cpp index f3764623d50..b2bd2152488 100644 --- a/src/mesa/state_tracker/st_glsl_to_tgsi.cpp +++ b/src/mesa/state_tracker/st_glsl_to_tgsi.cpp @@ -6379,6 +6379,9 @@ get_mesa_program_tgsi(struct gl_context *ctx, prog = ctx->Driver.NewProgram(ctx, target, shader_program->Name); if (!prog) return NULL; + + _mesa_reference_program(ctx, &shader->Program, prog); + prog->Parameters = _mesa_new_parameter_list(); v = new glsl_to_tgsi_visitor(); v->ctx = ctx; @@ -6394,7 +6397,7 @@ 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->Stage, shader_program, prog); + _mesa_copy_linked_program_data(shader_program, shader); _mesa_generate_parameters_list_for_uniforms(shader_program, shader, prog->Parameters); @@ -6486,8 +6489,6 @@ get_mesa_program_tgsi(struct gl_context *ctx, wposTransformState); } - _mesa_reference_program(ctx, &shader->Program, prog); - /* Avoid reallocation of the program parameter list, because the uniform * storage is only associated with the original parameter list. * This should be enough for Bitmap and DrawPixels constants. -- 2.30.2