Well, this is weird.... this patch makes this crash: INTEL_DEBUG=vs glxgears
because that uses a vertex program, so &vs->base is a NULL pointer dereference in this call: brw_dump_ir("vertex", prog, &vs->base, &vp->program.Base); The surprising part is that this is the same without this patch (!) just that the NULL dereference is not actually producing a segfault in that case. Apparently, dereferencing a NULL pointer is undefined behavior [1], so I guess that explains why the behavior is inconsistent and that we have just being lucky all this time. I suppose we want to do: brw_dump_ir("vertex", prog, vs ? &vs->base : NULL, vp ? &vp->program.Base: NULL); Ans the same for the other calls to brw_dump_ir... [1] http://stackoverflow.com/questions/6793262/why-dereferencing-a-null-pointer-is-undefined-behaviour On Wed, 2015-10-07 at 07:11 -0700, Kristian Høgsberg Kristensen wrote: > We move these calls one level up into the codegen functions. > > Signed-off-by: Kristian Høgsberg Kristensen <k...@bitplanet.net> > --- > src/mesa/drivers/dri/i965/brw_cs.c | 3 +++ > src/mesa/drivers/dri/i965/brw_fs.cpp | 13 ------------- > src/mesa/drivers/dri/i965/brw_gs.c | 3 +++ > src/mesa/drivers/dri/i965/brw_vec4.cpp | 7 ------- > src/mesa/drivers/dri/i965/brw_vec4_gs_visitor.cpp | 3 --- > src/mesa/drivers/dri/i965/brw_vs.c | 3 +++ > src/mesa/drivers/dri/i965/brw_wm.c | 3 +++ > 7 files changed, 12 insertions(+), 23 deletions(-) > > diff --git a/src/mesa/drivers/dri/i965/brw_cs.c > b/src/mesa/drivers/dri/i965/brw_cs.c > index 6b64030..34680ee 100644 > --- a/src/mesa/drivers/dri/i965/brw_cs.c > +++ b/src/mesa/drivers/dri/i965/brw_cs.c > @@ -98,6 +98,9 @@ brw_codegen_cs_prog(struct brw_context *brw, > start_time = get_time(); > } > > + if (unlikely(INTEL_DEBUG & DEBUG_CS)) > + brw_dump_ir("compute", prog, &cs->base, &cp->program.Base); > + > program = brw_cs_emit(brw, mem_ctx, key, &prog_data, > &cp->program, prog, &program_size); > if (program == NULL) { > diff --git a/src/mesa/drivers/dri/i965/brw_fs.cpp > b/src/mesa/drivers/dri/i965/brw_fs.cpp > index 1187c67..1dee888 100644 > --- a/src/mesa/drivers/dri/i965/brw_fs.cpp > +++ b/src/mesa/drivers/dri/i965/brw_fs.cpp > @@ -5100,13 +5100,6 @@ brw_wm_fs_emit(struct brw_context *brw, > struct gl_shader_program *prog, > unsigned *final_assembly_size) > { > - struct brw_shader *shader = NULL; > - if (prog) > - shader = (brw_shader *) prog->_LinkedShaders[MESA_SHADER_FRAGMENT]; > - > - if (unlikely(INTEL_DEBUG & DEBUG_WM)) > - brw_dump_ir("fragment", prog, &shader->base, &fp->Base); > - > int st_index8 = -1, st_index16 = -1; > if (INTEL_DEBUG & DEBUG_SHADER_TIME) { > st_index8 = brw_get_shader_time_index(brw, prog, &fp->Base, ST_FS8); > @@ -5224,12 +5217,6 @@ brw_cs_emit(struct brw_context *brw, > struct gl_shader_program *prog, > unsigned *final_assembly_size) > { > - struct brw_shader *shader = > - (struct brw_shader *) prog->_LinkedShaders[MESA_SHADER_COMPUTE]; > - > - if (unlikely(INTEL_DEBUG & DEBUG_CS)) > - brw_dump_ir("compute", prog, &shader->base, &cp->Base); > - > prog_data->local_size[0] = cp->LocalSize[0]; > prog_data->local_size[1] = cp->LocalSize[1]; > prog_data->local_size[2] = cp->LocalSize[2]; > diff --git a/src/mesa/drivers/dri/i965/brw_gs.c > b/src/mesa/drivers/dri/i965/brw_gs.c > index f6b9874..26c91e4 100644 > --- a/src/mesa/drivers/dri/i965/brw_gs.c > +++ b/src/mesa/drivers/dri/i965/brw_gs.c > @@ -291,6 +291,9 @@ brw_codegen_gs_prog(struct brw_context *brw, > */ > c.prog_data.base.urb_read_length = (c.input_vue_map.num_slots + 1) / 2; > > + if (unlikely(INTEL_DEBUG & DEBUG_GS)) > + brw_dump_ir("geometry", prog, gs, NULL); > + > void *mem_ctx = ralloc_context(NULL); > unsigned program_size; > const unsigned *program = > diff --git a/src/mesa/drivers/dri/i965/brw_vec4.cpp > b/src/mesa/drivers/dri/i965/brw_vec4.cpp > index 76ce0c4..4b4a216 100644 > --- a/src/mesa/drivers/dri/i965/brw_vec4.cpp > +++ b/src/mesa/drivers/dri/i965/brw_vec4.cpp > @@ -1947,17 +1947,10 @@ brw_vs_emit(struct brw_context *brw, > { > const unsigned *assembly = NULL; > > - struct brw_shader *shader = NULL; > - if (prog) > - shader = (brw_shader *) prog->_LinkedShaders[MESA_SHADER_VERTEX]; > - > int st_index = -1; > if (INTEL_DEBUG & DEBUG_SHADER_TIME) > st_index = brw_get_shader_time_index(brw, prog, &vp->Base, ST_VS); > > - if (unlikely(INTEL_DEBUG & DEBUG_VS)) > - brw_dump_ir("vertex", prog, &shader->base, &vp->Base); > - > if (brw->intelScreen->compiler->scalar_vs) { > prog_data->base.dispatch_mode = DISPATCH_MODE_SIMD8; > > diff --git a/src/mesa/drivers/dri/i965/brw_vec4_gs_visitor.cpp > b/src/mesa/drivers/dri/i965/brw_vec4_gs_visitor.cpp > index f6967a7..36ab25d 100644 > --- a/src/mesa/drivers/dri/i965/brw_vec4_gs_visitor.cpp > +++ b/src/mesa/drivers/dri/i965/brw_vec4_gs_visitor.cpp > @@ -622,9 +622,6 @@ brw_gs_emit(struct brw_context *brw, > { > struct gl_shader *shader = prog->_LinkedShaders[MESA_SHADER_GEOMETRY]; > > - if (unlikely(INTEL_DEBUG & DEBUG_GS)) > - brw_dump_ir("geometry", prog, shader, NULL); > - > int st_index = -1; > if (INTEL_DEBUG & DEBUG_SHADER_TIME) > st_index = brw_get_shader_time_index(brw, prog, NULL, ST_GS); > diff --git a/src/mesa/drivers/dri/i965/brw_vs.c > b/src/mesa/drivers/dri/i965/brw_vs.c > index 3c6ee0a..34c58b8 100644 > --- a/src/mesa/drivers/dri/i965/brw_vs.c > +++ b/src/mesa/drivers/dri/i965/brw_vs.c > @@ -195,6 +195,9 @@ brw_codegen_vs_prog(struct brw_context *brw, > start_time = get_time(); > } > > + if (unlikely(INTEL_DEBUG & DEBUG_VS) && vs->base.ir) > + brw_dump_ir("vertex", prog, &vs->base, &vp->program.Base); > + > /* Emit GEN4 code. > */ > program = brw_vs_emit(brw, mem_ctx, key, &prog_data, > diff --git a/src/mesa/drivers/dri/i965/brw_wm.c > b/src/mesa/drivers/dri/i965/brw_wm.c > index 9892046..242114f 100644 > --- a/src/mesa/drivers/dri/i965/brw_wm.c > +++ b/src/mesa/drivers/dri/i965/brw_wm.c > @@ -221,6 +221,9 @@ brw_codegen_wm_prog(struct brw_context *brw, > start_time = get_time(); > } > > + if (unlikely(INTEL_DEBUG & DEBUG_WM) && fs->base.ir) > + brw_dump_ir("fragment", prog, &fs->base, &fp->program.Base); > + > program = brw_wm_fs_emit(brw, mem_ctx, key, &prog_data, > &fp->program, prog, &program_size); > if (program == NULL) { _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev