From 49e4d8cce2276cec0fcf56b7fa2be53f5501a78c Mon Sep 17 00:00:00 2001 From: Jason Ekstrand Date: Thu, 25 May 2017 11:58:40 -0700 Subject: [PATCH] i965: Move color rendering to the new resolve functions This also removes an unneeded brw_render_cache_set_check_flush() call. We were calling it in the case where the surface got resolved to satisfy the flushing requirements around resolves. However, blorp now does this itself, so the extra is just redundant. Reviewed-by: Topi Pohjolainen Reviewed-by: Chad Versace --- src/mesa/drivers/dri/i965/brw_context.c | 35 ++------------ src/mesa/drivers/dri/i965/brw_draw.c | 4 +- src/mesa/drivers/dri/i965/intel_mipmap_tree.c | 48 +++++++++++++++++++ src/mesa/drivers/dri/i965/intel_mipmap_tree.h | 9 ++++ 4 files changed, 62 insertions(+), 34 deletions(-) diff --git a/src/mesa/drivers/dri/i965/brw_context.c b/src/mesa/drivers/dri/i965/brw_context.c index 5e901dfac71..33b13a4cf09 100644 --- a/src/mesa/drivers/dri/i965/brw_context.c +++ b/src/mesa/drivers/dri/i965/brw_context.c @@ -301,38 +301,9 @@ intel_update_state(struct gl_context * ctx, GLuint new_state) if (irb == NULL || irb->mt == NULL) continue; - struct intel_mipmap_tree *mt = irb->mt; - - /* If FRAMEBUFFER_SRGB is used on Gen9+ then we need to resolve any of - * the single-sampled color renderbuffers because the CCS buffer isn't - * supported for SRGB formats. This only matters if FRAMEBUFFER_SRGB is - * enabled because otherwise the surface state will be programmed with - * the linear equivalent format anyway. - */ - if (brw->gen >= 9 && ctx->Color.sRGBEnabled && mt->num_samples <= 1 && - _mesa_get_srgb_format_linear(mt->format) != mt->format) { - - /* Lossless compression is not supported for SRGB formats, it - * should be impossible to get here with such surfaces. - */ - assert(!intel_miptree_is_lossless_compressed(brw, mt)); - intel_miptree_all_slices_resolve_color(brw, mt, 0); - brw_render_cache_set_check_flush(brw, mt->bo); - } - - /* For layered rendering non-compressed fast cleared buffers need to be - * resolved. Surface state can carry only one fast color clear value - * while each layer may have its own fast clear color value. For - * compressed buffers color value is available in the color buffer. - */ - if (irb->layer_count > 1 && - !(irb->mt->aux_disable & INTEL_AUX_DISABLE_CCS) && - !intel_miptree_is_lossless_compressed(brw, mt)) { - assert(brw->gen >= 8); - - intel_miptree_resolve_color(brw, mt, irb->mt_level, 1, - irb->mt_layer, irb->layer_count, 0); - } + intel_miptree_prepare_render(brw, irb->mt, irb->mt_level, + irb->mt_layer, irb->layer_count, + ctx->Color.sRGBEnabled); } _mesa_lock_context_textures(ctx); diff --git a/src/mesa/drivers/dri/i965/brw_draw.c b/src/mesa/drivers/dri/i965/brw_draw.c index 3a1bb5023e4..07f1d48ff65 100644 --- a/src/mesa/drivers/dri/i965/brw_draw.c +++ b/src/mesa/drivers/dri/i965/brw_draw.c @@ -400,8 +400,8 @@ brw_postdraw_set_buffers_need_resolve(struct brw_context *brw) continue; brw_render_cache_set_add_bo(brw, irb->mt->bo); - intel_miptree_used_for_rendering( - brw, irb->mt, irb->mt_level, irb->mt_layer, irb->layer_count); + intel_miptree_finish_render(brw, irb->mt, irb->mt_level, + irb->mt_layer, irb->layer_count); } } diff --git a/src/mesa/drivers/dri/i965/intel_mipmap_tree.c b/src/mesa/drivers/dri/i965/intel_mipmap_tree.c index 033dd80e121..cd713b93e3f 100644 --- a/src/mesa/drivers/dri/i965/intel_mipmap_tree.c +++ b/src/mesa/drivers/dri/i965/intel_mipmap_tree.c @@ -2454,6 +2454,54 @@ intel_miptree_prepare_texture(struct brw_context *brw, *aux_supported_out = aux_supported; } +void +intel_miptree_prepare_render(struct brw_context *brw, + struct intel_mipmap_tree *mt, uint32_t level, + uint32_t start_layer, uint32_t layer_count, + bool srgb_enabled) +{ + /* If FRAMEBUFFER_SRGB is used on Gen9+ then we need to resolve any of + * the single-sampled color renderbuffers because the CCS buffer isn't + * supported for SRGB formats. This only matters if FRAMEBUFFER_SRGB is + * enabled because otherwise the surface state will be programmed with + * the linear equivalent format anyway. + */ + if (brw->gen >= 9 && srgb_enabled && mt->num_samples <= 1 && + _mesa_get_srgb_format_linear(mt->format) != mt->format) { + + /* Lossless compression is not supported for SRGB formats, it + * should be impossible to get here with such surfaces. + */ + assert(!intel_miptree_is_lossless_compressed(brw, mt)); + intel_miptree_prepare_access(brw, mt, level, 1, start_layer, layer_count, + false, false); + } + + /* For layered rendering non-compressed fast cleared buffers need to be + * resolved. Surface state can carry only one fast color clear value + * while each layer may have its own fast clear color value. For + * compressed buffers color value is available in the color buffer. + */ + if (layer_count > 1 && + !(mt->aux_disable & INTEL_AUX_DISABLE_CCS) && + !intel_miptree_is_lossless_compressed(brw, mt)) { + assert(brw->gen >= 8); + + intel_miptree_prepare_access(brw, mt, level, 1, start_layer, layer_count, + false, false); + } +} + +void +intel_miptree_finish_render(struct brw_context *brw, + struct intel_mipmap_tree *mt, uint32_t level, + uint32_t start_layer, uint32_t layer_count) +{ + assert(_mesa_is_format_color_format(mt->format)); + intel_miptree_finish_write(brw, mt, level, start_layer, layer_count, + mt->mcs_buf); +} + /** * Make it possible to share the BO backing the given miptree with another * process or another miptree. diff --git a/src/mesa/drivers/dri/i965/intel_mipmap_tree.h b/src/mesa/drivers/dri/i965/intel_mipmap_tree.h index 52008d73b73..5f3431c5bdd 100644 --- a/src/mesa/drivers/dri/i965/intel_mipmap_tree.h +++ b/src/mesa/drivers/dri/i965/intel_mipmap_tree.h @@ -1050,6 +1050,15 @@ intel_miptree_prepare_texture(struct brw_context *brw, struct intel_mipmap_tree *mt, mesa_format view_format, bool *aux_supported_out); +void +intel_miptree_prepare_render(struct brw_context *brw, + struct intel_mipmap_tree *mt, uint32_t level, + uint32_t start_layer, uint32_t layer_count, + bool srgb_enabled); +void +intel_miptree_finish_render(struct brw_context *brw, + struct intel_mipmap_tree *mt, uint32_t level, + uint32_t start_layer, uint32_t layer_count); void intel_miptree_make_shareable(struct brw_context *brw, -- 2.30.2