Mesa (master): loader/dri3: Use local blits and local buffers when resizing
Thomas Hellstrom
thomash at kemper.freedesktop.org
Thu Oct 5 08:09:23 UTC 2017
Module: Mesa
Branch: master
Commit: 622f5e1d9be1915d0982ece4aab99b77e30b1fd5
URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=622f5e1d9be1915d0982ece4aab99b77e30b1fd5
Author: Thomas Hellstrom <thellstrom at vmware.com>
Date: Thu Sep 14 12:15:43 2017 +0200
loader/dri3: Use local blits and local buffers when resizing
When a drawable is resized, and 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>
Reviewed-by: Sinclair Yeh <syeh 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 bcd5a66ad2..aea0f68ac6 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-commit
mailing list