From: Ian Romanick <ian.d.roman...@intel.com> There are several things that could cause the fragment shader precompile to fail. Looking for calls to 'fail' in brw_fs_visitor.cpp finds three classes of things:
* Trying to emit instructions that are invalid in 16-wide mode. * Trying to emit instructions that should have been lowered. * Register allocation failures. None of these should cause link errors. Signed-off-by: Ian Romanick <ian.d.roman...@intel.com> --- src/mesa/drivers/dri/i965/brw_fs.cpp | 68 ------------------------------ src/mesa/drivers/dri/i965/brw_fs.h | 1 - src/mesa/drivers/dri/i965/brw_shader.cpp | 5 -- 3 files changed, 0 insertions(+), 74 deletions(-) diff --git a/src/mesa/drivers/dri/i965/brw_fs.cpp b/src/mesa/drivers/dri/i965/brw_fs.cpp index 40327ac..3b71864 100644 --- a/src/mesa/drivers/dri/i965/brw_fs.cpp +++ b/src/mesa/drivers/dri/i965/brw_fs.cpp @@ -1858,71 +1858,3 @@ brw_wm_fs_emit(struct brw_context *brw, struct brw_wm_compile *c, return true; } - -bool -brw_fs_precompile(struct gl_context *ctx, struct gl_shader_program *prog) -{ - struct brw_context *brw = brw_context(ctx); - struct brw_wm_prog_key key; - - if (!prog->_LinkedShaders[MESA_SHADER_FRAGMENT]) - return true; - - struct gl_fragment_program *fp = (struct gl_fragment_program *) - prog->_LinkedShaders[MESA_SHADER_FRAGMENT]->Program; - struct brw_fragment_program *bfp = brw_fragment_program(fp); - - memset(&key, 0, sizeof(key)); - - if (fp->UsesKill) - key.iz_lookup |= IZ_PS_KILL_ALPHATEST_BIT; - - if (fp->Base.OutputsWritten & BITFIELD64_BIT(FRAG_RESULT_DEPTH)) - key.iz_lookup |= IZ_PS_COMPUTES_DEPTH_BIT; - - /* Just assume depth testing. */ - key.iz_lookup |= IZ_DEPTH_TEST_ENABLE_BIT; - key.iz_lookup |= IZ_DEPTH_WRITE_ENABLE_BIT; - - key.vp_outputs_written |= BITFIELD64_BIT(FRAG_ATTRIB_WPOS); - for (int i = 0; i < FRAG_ATTRIB_MAX; i++) { - if (!(fp->Base.InputsRead & BITFIELD64_BIT(i))) - continue; - - key.proj_attrib_mask |= 1 << i; - - int vp_index = _mesa_vert_result_to_frag_attrib((gl_vert_result) i); - - if (vp_index >= 0) - key.vp_outputs_written |= BITFIELD64_BIT(vp_index); - } - - key.clamp_fragment_color = true; - - for (int i = 0; i < BRW_MAX_TEX_UNIT; i++) { - if (fp->Base.ShadowSamplers & (1 << i)) - key.tex.compare_funcs[i] = GL_LESS; - - /* FINISHME: depth compares might use (0,0,0,W) for example */ - key.tex.swizzles[i] = SWIZZLE_XYZW; - } - - if (fp->Base.InputsRead & FRAG_BIT_WPOS) { - key.drawable_height = ctx->DrawBuffer->Height; - key.render_to_fbo = ctx->DrawBuffer->Name != 0; - } - - key.nr_color_regions = 1; - - key.program_string_id = bfp->id; - - uint32_t old_prog_offset = brw->wm.prog_offset; - struct brw_wm_prog_data *old_prog_data = brw->wm.prog_data; - - bool success = do_wm_prog(brw, prog, bfp, &key); - - brw->wm.prog_offset = old_prog_offset; - brw->wm.prog_data = old_prog_data; - - return success; -} diff --git a/src/mesa/drivers/dri/i965/brw_fs.h b/src/mesa/drivers/dri/i965/brw_fs.h index d623316..24bf7bb 100644 --- a/src/mesa/drivers/dri/i965/brw_fs.h +++ b/src/mesa/drivers/dri/i965/brw_fs.h @@ -613,4 +613,3 @@ public: bool brw_do_channel_expressions(struct exec_list *instructions); bool brw_do_vector_splitting(struct exec_list *instructions); -bool brw_fs_precompile(struct gl_context *ctx, struct gl_shader_program *prog); diff --git a/src/mesa/drivers/dri/i965/brw_shader.cpp b/src/mesa/drivers/dri/i965/brw_shader.cpp index 294cc73..634f7e3 100644 --- a/src/mesa/drivers/dri/i965/brw_shader.cpp +++ b/src/mesa/drivers/dri/i965/brw_shader.cpp @@ -65,11 +65,6 @@ brw_new_shader_program(struct gl_context *ctx, GLuint name) bool brw_shader_precompile(struct gl_context *ctx, struct gl_shader_program *prog) { - struct brw_context *brw = brw_context(ctx); - - if (brw->precompile && !brw_fs_precompile(ctx, prog)) - return false; - return true; } -- 1.7.6.4 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev