[Mesa-dev] [v2 3/6] i965: Track non-compressible sampling of renderbuffers

Pohjolainen, Topi topi.pohjolainen at gmail.com
Tue Sep 6 15:16:50 UTC 2016


On Tue, Sep 06, 2016 at 07:54:16AM -0700, Jason Ekstrand wrote:
>    On Tue, Sep 6, 2016 at 12:28 AM, Topi Pohjolainen
>    <[1]topi.pohjolainen at gmail.com> wrote:
> 
>      Signed-off-by: Topi Pohjolainen <[2]topi.pohjolainen at intel.com>
>      ---
>       src/mesa/drivers/dri/i965/brw_context.c          | 16
>      ++++++++++++++++
>       src/mesa/drivers/dri/i965/brw_context.h          | 10 ++++++++++
>       src/mesa/drivers/dri/i965/brw_wm_surface_state.c | 12 ++++++++++--
>       3 files changed, 36 insertions(+), 2 deletions(-)
>      diff --git a/src/mesa/drivers/dri/i965/brw_context.c
>      b/src/mesa/drivers/dri/i965/brw_context.c
>      index b880b4f..c5c6fdd 100644
>      --- a/src/mesa/drivers/dri/i965/brw_context.c
>      +++ b/src/mesa/drivers/dri/i965/brw_context.c
>      @@ -197,6 +197,22 @@ intel_texture_view_requires_resolve(struct
>      brw_context *brw,
>                     _mesa_get_format_name(intel_tex->_Format),
>                     _mesa_get_format_name(intel_tex->mt->format));
>      +   const struct gl_framebuffer *fb = brw->ctx.DrawBuffer;
>      +   for (unsigned i = 0; i < fb->_NumColorDrawBuffers; i++) {
>      +      const struct intel_renderbuffer *irb =
>      +         intel_renderbuffer(fb->_ColorDrawBuffers[i]);
>      +
>      +      /* In case the same surface is also used for rendering one
>      needs to
>      +       * disable the compression.
>      +       */
>      +      brw->draw_aux_buffer_disabled[i] = intel_tex->mt->bo ==
>      irb->mt->bo;

This loop goes thru all render surfaces and explicitly sets the flag. In
other words all flags are reset before uploading state - no need for
separate memset.

>      +
>      +      if (brw->draw_aux_buffer_disabled[i]) {
>      +         perf_debug("Sampling renderbuffer with non-compressible
>      format - "
>      +                    "turning off compression");
>      +      }
>      +   }
>      +
>          return true;
>       }
>      diff --git a/src/mesa/drivers/dri/i965/brw_context.h
>      b/src/mesa/drivers/dri/i965/brw_context.h
>      index 12ac8af..074d554 100644
>      --- a/src/mesa/drivers/dri/i965/brw_context.h
>      +++ b/src/mesa/drivers/dri/i965/brw_context.h
>      @@ -1333,6 +1333,16 @@ struct brw_context
>          struct brw_fast_clear_state *fast_clear_state;
>      +   /* Array of flags telling if auxiliary buffer is disabled for
>      corresponding
>      +    * renderbuffer. If draw_aux_buffer_disabled[i] is set then use
>      of
>      +    * auxiliary buffer for gl_framebuffer::_ColorDrawBuffers[i] is
>      +    * disabled.
>      +    * This is needed in case the same underlying buffer is also
>      configured
>      +    * to be sampled but with a format that the sampling engine
>      can't treat
>      +    * compressed or fast cleared.
>      +    */
>      +   bool draw_aux_buffer_disabled[MAX_DRAW_BUFFERS];
> 
>    I like the way you handled this.  It's nice and clean.  However, I
>    don't see where you memset draw_aux_buffer_disabled to 0 to reset it.
>    Did that just go missing?
> 
>      +
>          __DRIcontext *driContext;
>          struct intel_screen *intelScreen;
>       };
>      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 073919e..af102a9 100644
>      --- a/src/mesa/drivers/dri/i965/brw_wm_surface_state.c
>      +++ b/src/mesa/drivers/dri/i965/brw_wm_surface_state.c
>      @@ -56,6 +56,7 @@
>       enum {
>          INTEL_RENDERBUFFER_LAYERED = 1 << 0,
>      +   INTEL_RENDERBUFFER_AUX_DISABLED = 1 << 1,
>       };
>       struct surface_state_info {
>      @@ -194,6 +195,10 @@ brw_update_renderbuffer_surface(struct
>      brw_context *brw,
>          struct intel_renderbuffer *irb = intel_renderbuffer(rb);
>          struct intel_mipmap_tree *mt = irb->mt;
>      +   if (brw->gen < 9) {
>      +      assert(!(flags & INTEL_RENDERBUFFER_AUX_DISABLED));
>      +   }
>      +
>          assert(brw_render_target_supported(brw, rb));
>          intel_miptree_used_for_rendering(mt);
>      @@ -885,6 +890,7 @@ gen4_update_renderbuffer_surface(struct
>      brw_context *brw,
>          /* BRW_NEW_FS_PROG_DATA */
>          assert(!(flags & INTEL_RENDERBUFFER_LAYERED));
>      +   assert(!(flags & INTEL_RENDERBUFFER_AUX_DISABLED));
>          if (rb->TexImage && !brw->has_surface_tile_offset) {
>             intel_renderbuffer_get_tile_offsets(irb, &tile_x, &tile_y);
>      @@ -987,8 +993,10 @@ brw_update_renderbuffer_surfaces(struct
>      brw_context *brw,
>          if (fb->_NumColorDrawBuffers >= 1) {
>             for (i = 0; i < fb->_NumColorDrawBuffers; i++) {
>                const uint32_t surf_index = render_target_start + i;
>      -         const int flags =
>      -            _mesa_geometric_layers(fb) > 0 ?
>      INTEL_RENDERBUFFER_LAYERED : 0;
>      +         const int flags = (_mesa_geometric_layers(fb) > 0 ?
>      +                              INTEL_RENDERBUFFER_LAYERED : 0) |
>      +                           (brw->draw_aux_buffer_disabled[i] ?
>      +                              INTEL_RENDERBUFFER_AUX_DISABLED : 0);
>               if (intel_renderbuffer(fb->_ColorDrawBuffers[i])) {
>                   surf_offset[surf_index] =
>      --
>      2.5.5
>      _______________________________________________
>      mesa-dev mailing list
>      [3]mesa-dev at lists.freedesktop.org
>      [4]https://lists.freedesktop.org/mailman/listinfo/mesa-dev
> 
> References
> 
>    1. mailto:topi.pohjolainen at gmail.com
>    2. mailto:topi.pohjolainen at intel.com
>    3. mailto:mesa-dev at lists.freedesktop.org
>    4. https://lists.freedesktop.org/mailman/listinfo/mesa-dev


More information about the mesa-dev mailing list