We want to use nir_shader_gather_info() the GLSL IR version might be including varyings that NIR later eliminates. To do this we need to generate NIR before we we start using the in/out bitmasks. --- src/mesa/state_tracker/st_glsl_to_nir.cpp | 6 +++++ src/mesa/state_tracker/st_program.c | 45 ++++++------------------------- 2 files changed, 14 insertions(+), 37 deletions(-)
diff --git a/src/mesa/state_tracker/st_glsl_to_nir.cpp b/src/mesa/state_tracker/st_glsl_to_nir.cpp index bbef830a2e..d59e472584 100644 --- a/src/mesa/state_tracker/st_glsl_to_nir.cpp +++ b/src/mesa/state_tracker/st_glsl_to_nir.cpp @@ -400,20 +400,21 @@ st_finalize_nir(struct st_context *st, struct gl_program *prog, NIR_PASS_V(nir, nir_lower_samplers_as_deref, shader_program); else NIR_PASS_V(nir, nir_lower_samplers, shader_program); } struct gl_program * st_nir_get_mesa_program(struct gl_context *ctx, struct gl_shader_program *shader_program, struct gl_linked_shader *shader) { + struct st_context *st = st_context(ctx); struct gl_program *prog; validate_ir_tree(shader->ir); prog = shader->Program; prog->Parameters = _mesa_new_parameter_list(); do_set_program_inouts(shader->ir, prog, shader->Stage); @@ -455,14 +456,19 @@ st_nir_get_mesa_program(struct gl_context *ctx, break; case MESA_SHADER_COMPUTE: stcp = (struct st_compute_program *)prog; stcp->shader_program = shader_program; break; default: assert(!"should not be reached"); return NULL; } + struct st_common_program *st_comm_prog = (struct st_common_program *)prog; + nir_shader *nir = st_glsl_to_nir(st, prog, shader_program, shader->Stage); + st_comm_prog->tgsi.type = PIPE_SHADER_IR_NIR; + st_comm_prog->tgsi.ir.nir = nir; + return prog; } } /* extern "C" */ diff --git a/src/mesa/state_tracker/st_program.c b/src/mesa/state_tracker/st_program.c index 25a849bb18..e3649a8b7c 100644 --- a/src/mesa/state_tracker/st_program.c +++ b/src/mesa/state_tracker/st_program.c @@ -440,26 +440,20 @@ st_translate_vertex_program(struct st_context *st, ST_NEW_RASTERIZER | ST_NEW_VERTEX_ARRAYS; if (stvp->Base.Parameters->NumParameters) stvp->affected_states |= ST_NEW_VS_CONSTANTS; /* No samplers are allowed in ARB_vp. */ } if (stvp->shader_program) { - nir_shader *nir = st_glsl_to_nir(st, &stvp->Base, stvp->shader_program, - MESA_SHADER_VERTEX); - - stvp->tgsi.type = PIPE_SHADER_IR_NIR; - stvp->tgsi.ir.nir = nir; - struct gl_program *prog = stvp->shader_program->last_vert_prog; if (prog) { st_translate_stream_output_info2(prog->sh.LinkedTransformFeedback, stvp->result_to_output, &stvp->tgsi.stream_output); } return true; } @@ -888,29 +882,23 @@ st_translate_fragment_program(struct st_context *st, fs_output_semantic_index[fs_num_outputs] = index; outputMapping[attr] = fs_num_outputs; break; } } fs_num_outputs++; } } - if (stfp->shader_program) { - nir_shader *nir = st_glsl_to_nir(st, &stfp->Base, stfp->shader_program, - MESA_SHADER_FRAGMENT); - - stfp->tgsi.type = PIPE_SHADER_IR_NIR; - stfp->tgsi.ir.nir = nir; - + /* We have already compiler to NIR so just return */ + if (stfp->shader_program) return true; - } ureg = ureg_create_with_screen(PIPE_SHADER_FRAGMENT, st->pipe->screen); if (ureg == NULL) return false; if (ST_DEBUG & DEBUG_MESA) { _mesa_print_program(&stfp->Base); _mesa_print_program_parameters(st->ctx, &stfp->Base); debug_printf("\n"); } @@ -1674,29 +1662,23 @@ st_get_basic_variant(struct st_context *st, /** * Translate a tessellation control program to create a new variant. */ bool st_translate_tessctrl_program(struct st_context *st, struct st_common_program *sttcp) { struct ureg_program *ureg; - if (sttcp->shader_program) { - nir_shader *nir = st_glsl_to_nir(st, &sttcp->Base, sttcp->shader_program, - MESA_SHADER_TESS_EVAL); - - sttcp->tgsi.type = PIPE_SHADER_IR_NIR; - sttcp->tgsi.ir.nir = nir; - + /* We have already compiler to NIR so just return */ + if (sttcp->shader_program) return true; - } ureg = ureg_create_with_screen(PIPE_SHADER_TESS_CTRL, st->pipe->screen); if (ureg == NULL) return false; ureg_property(ureg, TGSI_PROPERTY_TCS_VERTICES_OUT, sttcp->Base.info.tess.tcs_vertices_out); st_translate_program_common(st, &sttcp->Base, sttcp->glsl_to_tgsi, ureg, PIPE_SHADER_TESS_CTRL, &sttcp->tgsi); @@ -1709,29 +1691,23 @@ st_translate_tessctrl_program(struct st_context *st, /** * Translate a tessellation evaluation program to create a new variant. */ bool st_translate_tesseval_program(struct st_context *st, struct st_common_program *sttep) { struct ureg_program *ureg; - if (sttep->shader_program) { - nir_shader *nir = st_glsl_to_nir(st, &sttep->Base, sttep->shader_program, - MESA_SHADER_TESS_EVAL); - - sttep->tgsi.type = PIPE_SHADER_IR_NIR; - sttep->tgsi.ir.nir = nir; - + /* We have already compiler to NIR so just return */ + if (sttep->shader_program) return true; - } ureg = ureg_create_with_screen(PIPE_SHADER_TESS_EVAL, st->pipe->screen); if (ureg == NULL) return false; if (sttep->Base.info.tess.primitive_mode == GL_ISOLINES) ureg_property(ureg, TGSI_PROPERTY_TES_PRIM_MODE, GL_LINES); else ureg_property(ureg, TGSI_PROPERTY_TES_PRIM_MODE, sttep->Base.info.tess.primitive_mode); @@ -1763,28 +1739,23 @@ st_translate_tesseval_program(struct st_context *st, * Translate a compute program to create a new variant. */ bool st_translate_compute_program(struct st_context *st, struct st_compute_program *stcp) { struct ureg_program *ureg; struct pipe_shader_state prog; if (stcp->shader_program) { - nir_shader *nir = st_glsl_to_nir(st, &stcp->Base, stcp->shader_program, - MESA_SHADER_COMPUTE); - /* no compute variants: */ - st_finalize_nir(st, &stcp->Base, stcp->shader_program, nir); - - stcp->tgsi.ir_type = PIPE_SHADER_IR_NIR; - stcp->tgsi.prog = nir; + st_finalize_nir(st, &stcp->Base, stcp->shader_program, + (struct nir_shader *) stcp->tgsi.prog); return true; } ureg = ureg_create_with_screen(PIPE_SHADER_COMPUTE, st->pipe->screen); if (ureg == NULL) return false; st_translate_program_common(st, &stcp->Base, stcp->glsl_to_tgsi, ureg, PIPE_SHADER_COMPUTE, &prog); -- 2.14.3 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev