On Fri, Nov 18, 2011 at 9:44 PM, Ian Romanick <i...@freedesktop.org> wrote: > On 11/18/2011 11:27 AM, Marek Olšák wrote: >> >> --- >> src/glsl/linker.cpp | 45 >> ++++++++++++++++++++++++++++ >> src/mesa/main/mtypes.h | 3 ++ >> src/mesa/program/ir_to_mesa.cpp | 29 ++++-------------- >> src/mesa/state_tracker/st_glsl_to_tgsi.cpp | 23 -------------- >> 4 files changed, 54 insertions(+), 46 deletions(-) >> >> diff --git a/src/glsl/linker.cpp b/src/glsl/linker.cpp >> index 0ec773d..226aa6f 100644 >> --- a/src/glsl/linker.cpp >> +++ b/src/glsl/linker.cpp >> @@ -1876,6 +1876,50 @@ store_tfeedback_info(struct gl_context *ctx, struct >> gl_shader_program *prog, >> } >> >> /** >> + * Store the gl_FragDepth layout in the gl_shader_program struct. >> + */ >> +static void >> +store_fragdepth_layout(struct gl_shader_program *prog) >> +{ >> + if (prog->_LinkedShaders[MESA_SHADER_FRAGMENT] == NULL) { >> + return; >> + } >> + >> + struct exec_list *ir = prog->_LinkedShaders[MESA_SHADER_FRAGMENT]->ir; >> + >> + foreach_list(node, ir) { >> + ir_variable *const var = ((ir_instruction *) node)->as_variable(); >> + >> + if (var == NULL || var->mode != ir_var_out) { >> + continue; >> + } >> + >> + if (strcmp(var->name, "gl_FragDepth") == 0) { > > It's probably worth explaining why you can't just look up gl_FragDepth in > the symbol table here. I was going to suggest changing to that, but I > managed to convince myself that looping over the IR is correct.
The reason is I didn't know there is actually any other way to look up a variable than walking over the IR. You might have been right that I should have used the look-up you are talking about. Marek > > With that small change, this patch is > > Reviewed-by: Ian Romanick <ian.d.roman...@intel.com> > >> + switch (var->depth_layout) { >> + case ir_depth_layout_none: >> + prog->FragDepthLayout = FRAG_DEPTH_LAYOUT_NONE; >> + return; >> + case ir_depth_layout_any: >> + prog->FragDepthLayout = FRAG_DEPTH_LAYOUT_ANY; >> + return; >> + case ir_depth_layout_greater: >> + prog->FragDepthLayout = FRAG_DEPTH_LAYOUT_GREATER; >> + return; >> + case ir_depth_layout_less: >> + prog->FragDepthLayout = FRAG_DEPTH_LAYOUT_LESS; >> + return; >> + case ir_depth_layout_unchanged: >> + prog->FragDepthLayout = FRAG_DEPTH_LAYOUT_UNCHANGED; >> + return; >> + default: >> + assert(0); >> + return; >> + } >> + } >> + } >> +} >> + >> +/** >> * Validate the resources used by a program versus the implementation >> limits >> */ >> static bool >> @@ -2177,6 +2221,7 @@ link_shaders(struct gl_context *ctx, struct >> gl_shader_program *prog) >> >> update_array_sizes(prog); >> link_assign_uniform_locations(prog); >> + store_fragdepth_layout(prog); >> >> if (!check_resources(ctx, prog)) >> goto done; >> diff --git a/src/mesa/main/mtypes.h b/src/mesa/main/mtypes.h >> index 285ec07..b3427da 100644 >> --- a/src/mesa/main/mtypes.h >> +++ b/src/mesa/main/mtypes.h >> @@ -2218,6 +2218,9 @@ struct gl_shader_program >> /** Post-link transform feedback info. */ >> struct gl_transform_feedback_info LinkedTransformFeedback; >> >> + /** Post-link gl_FragDepth layout for ARB_conservative_depth. */ >> + enum gl_frag_depth_layout FragDepthLayout; >> + >> /** Geometry shader state - copied into gl_geometry_program at link >> time */ >> struct { >> GLint VerticesOut; >> diff --git a/src/mesa/program/ir_to_mesa.cpp >> b/src/mesa/program/ir_to_mesa.cpp >> index 5cee837..5a68fc5 100644 >> --- a/src/mesa/program/ir_to_mesa.cpp >> +++ b/src/mesa/program/ir_to_mesa.cpp >> @@ -685,29 +685,6 @@ ir_to_mesa_visitor::visit(ir_variable *ir) >> >> fp->OriginUpperLeft = ir->origin_upper_left; >> fp->PixelCenterInteger = ir->pixel_center_integer; >> - >> - } else if (strcmp(ir->name, "gl_FragDepth") == 0) { >> - struct gl_fragment_program *fp = (struct gl_fragment_program >> *)this->prog; >> - switch (ir->depth_layout) { >> - case ir_depth_layout_none: >> - fp->FragDepthLayout = FRAG_DEPTH_LAYOUT_NONE; >> - break; >> - case ir_depth_layout_any: >> - fp->FragDepthLayout = FRAG_DEPTH_LAYOUT_ANY; >> - break; >> - case ir_depth_layout_greater: >> - fp->FragDepthLayout = FRAG_DEPTH_LAYOUT_GREATER; >> - break; >> - case ir_depth_layout_less: >> - fp->FragDepthLayout = FRAG_DEPTH_LAYOUT_LESS; >> - break; >> - case ir_depth_layout_unchanged: >> - fp->FragDepthLayout = FRAG_DEPTH_LAYOUT_UNCHANGED; >> - break; >> - default: >> - assert(0); >> - break; >> - } >> } >> >> if (ir->mode == ir_var_uniform&& strncmp(ir->name, "gl_", 3) == 0) { >> @@ -3222,6 +3199,12 @@ get_mesa_program(struct gl_context *ctx, >> do_set_program_inouts(shader->ir, prog, shader->Type == >> GL_FRAGMENT_SHADER); >> count_resources(prog); >> >> + /* Set the gl_FragDepth layout. */ >> + if (target == GL_FRAGMENT_PROGRAM_ARB) { >> + struct gl_fragment_program *fp = (struct gl_fragment_program >> *)prog; >> + fp->FragDepthLayout = shader_program->FragDepthLayout; >> + } >> + >> _mesa_reference_program(ctx,&shader->Program, prog); >> >> if ((ctx->Shader.Flags& GLSL_NO_OPT) == 0) { >> diff --git a/src/mesa/state_tracker/st_glsl_to_tgsi.cpp >> b/src/mesa/state_tracker/st_glsl_to_tgsi.cpp >> index 0bf6766..929c7af 100644 >> --- a/src/mesa/state_tracker/st_glsl_to_tgsi.cpp >> +++ b/src/mesa/state_tracker/st_glsl_to_tgsi.cpp >> @@ -1017,29 +1017,6 @@ glsl_to_tgsi_visitor::visit(ir_variable *ir) >> >> fp->OriginUpperLeft = ir->origin_upper_left; >> fp->PixelCenterInteger = ir->pixel_center_integer; >> - >> - } else if (strcmp(ir->name, "gl_FragDepth") == 0) { >> - struct gl_fragment_program *fp = (struct gl_fragment_program >> *)this->prog; >> - switch (ir->depth_layout) { >> - case ir_depth_layout_none: >> - fp->FragDepthLayout = FRAG_DEPTH_LAYOUT_NONE; >> - break; >> - case ir_depth_layout_any: >> - fp->FragDepthLayout = FRAG_DEPTH_LAYOUT_ANY; >> - break; >> - case ir_depth_layout_greater: >> - fp->FragDepthLayout = FRAG_DEPTH_LAYOUT_GREATER; >> - break; >> - case ir_depth_layout_less: >> - fp->FragDepthLayout = FRAG_DEPTH_LAYOUT_LESS; >> - break; >> - case ir_depth_layout_unchanged: >> - fp->FragDepthLayout = FRAG_DEPTH_LAYOUT_UNCHANGED; >> - break; >> - default: >> - assert(0); >> - break; >> - } >> } >> >> if (ir->mode == ir_var_uniform&& strncmp(ir->name, "gl_", 3) == 0) { > _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev