X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Floader%2Floader_dri3_helper.c;h=aea0f68ac63af35a76bed4e38bd92e0e0594e128;hb=622f5e1d9be1915d0982ece4aab99b77e30b1fd5;hp=51e4e97fb25f6b403551df08409456c3a68068ca;hpb=a727c804a2c17db306c68e259ae845aa6382d3b1;p=mesa.git diff --git a/src/loader/loader_dri3_helper.c b/src/loader/loader_dri3_helper.c index 51e4e97fb25..aea0f68ac63 100644 --- a/src/loader/loader_dri3_helper.c +++ b/src/loader/loader_dri3_helper.c @@ -348,6 +348,7 @@ dri3_handle_present_event(struct loader_dri3_drawable *draw, draw->width = ce->width; draw->height = ce->height; draw->vtable->set_drawable_size(draw, draw->width, draw->height); + draw->ext->flush->invalidate(draw->dri_drawable); break; } case XCB_PRESENT_COMPLETE_NOTIFY: { @@ -1372,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, @@ -1406,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, @@ -1415,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; @@ -1592,6 +1591,7 @@ loader_dri3_update_drawable_geometry(struct loader_dri3_drawable *draw) draw->width = geom_reply->width; draw->height = geom_reply->height; draw->vtable->set_drawable_size(draw, draw->width, draw->height); + draw->ext->flush->invalidate(draw->dri_drawable); free(geom_reply); }