Hi!

Could anyone please review this series?

Thanks,
Thomas


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 <thellst...@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;


_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to