Performing the HiZ/color resolves is a fairly heavyweight operation that we don't need to perform on every state update, only before use the unresolved surfaces in a draw call. Since we use meta operations to perform the resolve, we cannot do so from inside brw_draw_prims() itself (as that will reenter and corrupt the vbo context). Instead we move the resolve into a vbo->resolve() hook that is called just before the primitives are drawn.
Signed-off-by: Chris Wilson <ch...@chris-wilson.co.uk> Cc: Jordan Justen <jordan.l.jus...@intel.com> Cc: Jason Ekstrand <jason.ekstr...@intel.com> Cc: Kenneth Graunke <kenn...@whitecape.org> Cc: Francisco Jerez <curroje...@riseup.net> --- src/mesa/drivers/dri/i965/brw_context.c | 24 ------------------------ src/mesa/drivers/dri/i965/brw_draw.c | 28 ++++++++++++++++++++++++++++ 2 files changed, 28 insertions(+), 24 deletions(-) diff --git a/src/mesa/drivers/dri/i965/brw_context.c b/src/mesa/drivers/dri/i965/brw_context.c index 907b2a0..fdeadda 100644 --- a/src/mesa/drivers/dri/i965/brw_context.c +++ b/src/mesa/drivers/dri/i965/brw_context.c @@ -160,36 +160,12 @@ static void intel_update_state(struct gl_context * ctx, GLuint new_state) { struct brw_context *brw = brw_context(ctx); - struct intel_texture_object *tex_obj; - struct intel_renderbuffer *depth_irb; if (ctx->swrast_context) _swrast_InvalidateState(ctx, new_state); _vbo_InvalidateState(ctx, new_state); brw->NewGLState |= new_state; - - _mesa_unlock_context_textures(ctx); - - /* Resolve the depth buffer's HiZ buffer. */ - depth_irb = intel_get_renderbuffer(ctx->DrawBuffer, BUFFER_DEPTH); - if (depth_irb) - intel_renderbuffer_resolve_hiz(brw, depth_irb); - - /* Resolve depth buffer and render cache of each enabled texture. */ - int maxEnabledUnit = ctx->Texture._MaxEnabledTexImageUnit; - for (int i = 0; i <= maxEnabledUnit; i++) { - if (!ctx->Texture.Unit[i]._Current) - continue; - tex_obj = intel_texture_object(ctx->Texture.Unit[i]._Current); - if (!tex_obj || !tex_obj->mt) - continue; - intel_miptree_all_slices_resolve_depth(brw, tex_obj->mt); - intel_miptree_resolve_color(brw, tex_obj->mt); - brw_render_cache_set_check_flush(brw, tex_obj->mt->bo); - } - - _mesa_lock_context_textures(ctx); } #define flushFront(screen) ((screen)->image.loader ? (screen)->image.loader->flushFrontBuffer : (screen)->dri2.loader->flushFrontBuffer) diff --git a/src/mesa/drivers/dri/i965/brw_draw.c b/src/mesa/drivers/dri/i965/brw_draw.c index e5de420..d1b6279 100644 --- a/src/mesa/drivers/dri/i965/brw_draw.c +++ b/src/mesa/drivers/dri/i965/brw_draw.c @@ -342,6 +342,33 @@ brw_merge_inputs(struct brw_context *brw, } } +static void +brw_draw_resolve(struct gl_context *ctx) +{ + struct brw_context *brw = brw_context(ctx); + struct intel_texture_object *tex_obj; + struct intel_renderbuffer *depth_irb; + + /* Resolve the depth buffer's HiZ buffer. */ + depth_irb = intel_get_renderbuffer(brw->ctx.DrawBuffer, BUFFER_DEPTH); + if (depth_irb) + intel_renderbuffer_resolve_hiz(brw, depth_irb); + + /* Resolve depth buffer and render cache of each enabled texture. */ + int maxEnabledUnit = brw->ctx.Texture._MaxEnabledTexImageUnit; + for (int i = 0; i <= maxEnabledUnit; i++) { + if (!brw->ctx.Texture.Unit[i]._Current) + continue; + tex_obj = intel_texture_object(brw->ctx.Texture.Unit[i]._Current); + if (!tex_obj || !tex_obj->mt) + continue; + intel_miptree_all_slices_resolve_depth(brw, tex_obj->mt); + intel_miptree_resolve_color(brw, tex_obj->mt); + brw_render_cache_set_check_flush(brw, tex_obj->mt->bo); + } +} + + /** * \brief Call this after drawing to mark which buffers need resolving * @@ -615,6 +642,7 @@ brw_draw_init(struct brw_context *brw) /* Register our drawing function: */ + vbo->resolve = brw_draw_resolve; vbo->draw_prims = brw_draw_prims; for (int i = 0; i < VERT_ATTRIB_MAX; i++) -- 2.5.1 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev