[Mesa-dev] [PATCH 1/3] loader/dri3: Use local blits and local buffers when resizing

Sinclair Yeh syeh at vmware.com
Tue Oct 3 16:15:56 UTC 2017


On Tue, Oct 03, 2017 at 02:16:42PM +0200, Thomas Hellstrom wrote:
> Hi!
> 
> Could anyone please review this series?
> 
> Thanks,
> Thomas

Minor typo in the commit message of 1/3:

[Mesa-dev] [PATCH 1/3] loader/dri3: Use local blits and local buffers when
resizing

When a drawable is resized, and we we fill the resized buffers, with data
                                 ^
                                typo


For 3/3, I don't know which buffer LOADER_DRI3_FRONT_ID represents, so I'm
assuming that line checks the correct condition.

Other than those the series:  Reviewed-by: Sinclair Yeh <syeh at vmware.com>

> 
> 
> On 09/15/2017 10:48 AM, Thomas Hellstrom wrote:
> > When a drawable is resized, and we we fill the resized buffers, with data
> > from the old buffers, use a local blit if there is a local buffer (back or
> > fake front), and we have local blitting capability.
> > 
> > Signed-off-by: Thomas Hellstrom <thellstrom at vmware.com>
> > ---
> >   src/loader/loader_dri3_helper.c | 50 ++++++++++++++++++++---------------------
> >   1 file changed, 24 insertions(+), 26 deletions(-)
> > 
> > diff --git a/src/loader/loader_dri3_helper.c b/src/loader/loader_dri3_helper.c
> > index bcd5a66..aea0f68 100644
> > --- a/src/loader/loader_dri3_helper.c
> > +++ b/src/loader/loader_dri3_helper.c
> > @@ -1373,30 +1373,30 @@ dri3_get_buffer(__DRIdrawable *driDrawable,
> >         /* When resizing, copy the contents of the old buffer, waiting for that
> >          * copy to complete using our fences before proceeding
> >          */
> > -      switch (buffer_type) {
> > -      case loader_dri3_buffer_back:
> > -         if (buffer) {
> > -            if (!buffer->linear_buffer) {
> > -               dri3_fence_reset(draw->conn, new_buffer);
> > -               dri3_fence_await(draw->conn, draw, buffer);
> > -               dri3_copy_area(draw->conn,
> > -                              buffer->pixmap,
> > -                              new_buffer->pixmap,
> > -                              dri3_drawable_gc(draw),
> > -                              0, 0, 0, 0,
> > -                              draw->width, draw->height);
> > -               dri3_fence_trigger(draw->conn, new_buffer);
> > -            } else if (draw->vtable->in_current_context(draw)) {
> > -               (void) loader_dri3_blit_image(draw,
> > -                                             new_buffer->image,
> > -                                             buffer->image,
> > -                                             0, 0, draw->width, draw->height,
> > -                                             0, 0, 0);
> > -            }
> > -            dri3_free_render_buffer(draw, buffer);
> > +      if ((buffer_type == loader_dri3_buffer_back ||
> > +           (buffer_type == loader_dri3_buffer_front && draw->have_fake_front))
> > +          && buffer) {
> > +
> > +         /* Fill the new buffer with data from an old buffer */
> > +         dri3_fence_await(draw->conn, draw, buffer);
> > +         if (!loader_dri3_blit_image(draw,
> > +                                     new_buffer->image,
> > +                                     buffer->image,
> > +                                     0, 0, draw->width, draw->height,
> > +                                     0, 0, 0) &&
> > +             !buffer->linear_buffer) {
> > +            dri3_fence_reset(draw->conn, new_buffer);
> > +            dri3_copy_area(draw->conn,
> > +                           buffer->pixmap,
> > +                           new_buffer->pixmap,
> > +                           dri3_drawable_gc(draw),
> > +                           0, 0, 0, 0,
> > +                           draw->width, draw->height);
> > +            dri3_fence_trigger(draw->conn, new_buffer);
> >            }
> > -         break;
> > -      case loader_dri3_buffer_front:
> > +         dri3_free_render_buffer(draw, buffer);
> > +      } else if (buffer_type == loader_dri3_buffer_front) {
> > +         /* Fill the new fake front with data from a real front */
> >            loader_dri3_swapbuffer_barrier(draw);
> >            dri3_fence_reset(draw->conn, new_buffer);
> >            dri3_copy_area(draw->conn,
> > @@ -1407,8 +1407,7 @@ dri3_get_buffer(__DRIdrawable *driDrawable,
> >                           draw->width, draw->height);
> >            dri3_fence_trigger(draw->conn, new_buffer);
> > -         if (new_buffer->linear_buffer &&
> > -             draw->vtable->in_current_context(draw)) {
> > +         if (new_buffer->linear_buffer) {
> >               dri3_fence_await(draw->conn, draw, new_buffer);
> >               (void) loader_dri3_blit_image(draw,
> >                                             new_buffer->image,
> > @@ -1416,7 +1415,6 @@ dri3_get_buffer(__DRIdrawable *driDrawable,
> >                                             0, 0, draw->width, draw->height,
> >                                             0, 0, 0);
> >            }
> > -         break;
> >         }
> >         buffer = new_buffer;
> >         draw->buffers[buf_id] = buffer;
> 
> 


More information about the mesa-dev mailing list