On Wed, Aug 31, 2016 at 8:17 AM, Topi Pohjolainen < [email protected]> wrote:
> Once mcs buffer gets allocated without delay for lossless > compression (same as we do for msaa), one gets regression in: > > GL45-CTS.texture_barrier_ARB.same-texel-rw > > Setting the auxiliary surface for both sampling engine and data > port seems to fix this. I haven't found any hardware documentation > backing this though. > > Signed-off-by: Topi Pohjolainen <[email protected]> > --- > src/mesa/drivers/dri/i965/brw_wm_surface_state.c | 46 > ++++++++++++++++++++++-- > 1 file changed, 43 insertions(+), 3 deletions(-) > > diff --git a/src/mesa/drivers/dri/i965/brw_wm_surface_state.c > b/src/mesa/drivers/dri/i965/brw_wm_surface_state.c > index bfd973b..5cd27ef 100644 > --- a/src/mesa/drivers/dri/i965/brw_wm_surface_state.c > +++ b/src/mesa/drivers/dri/i965/brw_wm_surface_state.c > @@ -72,6 +72,48 @@ static const struct surface_state_info > surface_state_infos[] = { > [9] = {16, 64, 8, 10, SKL_MOCS_WB, SKL_MOCS_PTE}, > }; > > +static bool > +brw_needs_aux_surface(const struct brw_context *brw, > + const struct intel_mipmap_tree *mt, > + const struct isl_view *view) > +{ > + if (!mt->mcs_mt) > + return false; > + > + if (view->usage & ISL_SURF_USAGE_RENDER_TARGET_BIT) > + return true; > + > + const bool is_lossless_compressed = > + intel_miptree_is_lossless_compressed(brw, mt); > + const bool view_format_lossless_compressed = > + isl_format_supports_lossless_compression(brw->intelScreen-> > devinfo, > + view->format); > + > + /* If the underlying surface is compressed but it is sampled using a > + * format that the sampling engine doesn't support as compressed, there > + * is no alternative but to treat the surface as non-compressed. > + */ > Does this even work? I mean, can you render to a texture with one format and texture from it with another and still use color compression? > + if (is_lossless_compressed && !view_format_lossless_compressed) { > This is more of a change in behavior than the commit message says. We should probably make the commit message a bit better. > + /* Logic elsewhere needs to take care to resolve the color buffer > prior > + * to sampling it as non-compressed. > + */ > + assert(mt->fast_clear_state == INTEL_FAST_CLEAR_STATE_RESOLVED); > + return false; > + } > + > + /* In practise it looks that setting the same lossless compressed > surface > + * to be sampled without auxiliary surface and to be written with > auxiliary > + * surface confuses the hardware. > + * Currently there is no direct way of knowing if render pass will use > the > + * sane surface as render target and therefore simply use the auxiliary > + * surface unconditionally here. > + */ > + if (is_lossless_compressed) > + return true; > This makes a lot of sense. If we're sampling from and rendering to the same surface, we'd better have the compression buffer for both. That said, if we ever bind a compressed buffer as a render target with a texture-viewed version as a source (as per above), we're going to have a problem... > + > + return mt->fast_clear_state != INTEL_FAST_CLEAR_STATE_RESOLVED; > +} > + > static void > brw_emit_surface_state(struct brw_context *brw, > struct intel_mipmap_tree *mt, > @@ -135,9 +177,7 @@ brw_emit_surface_state(struct brw_context *brw, > struct isl_surf *aux_surf = NULL, aux_surf_s; > uint64_t aux_offset = 0; > enum isl_aux_usage aux_usage = ISL_AUX_USAGE_NONE; > - if (mt->mcs_mt && > - ((view.usage & ISL_SURF_USAGE_RENDER_TARGET_BIT) || > - mt->fast_clear_state != INTEL_FAST_CLEAR_STATE_RESOLVED)) { > + if (brw_needs_aux_surface(brw, mt, &view)) { > intel_miptree_get_aux_isl_surf(brw, mt, &aux_surf_s, &aux_usage); > aux_surf = &aux_surf_s; > assert(mt->mcs_mt->offset == 0); > -- > 2.5.5 > > _______________________________________________ > mesa-dev mailing list > [email protected] > https://lists.freedesktop.org/mailman/listinfo/mesa-dev >
_______________________________________________ mesa-dev mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/mesa-dev
