mirror of
https://github.com/FreeRDP/FreeRDP.git
synced 2025-06-03 00:00:20 +00:00
Fixed buffer submit and callback cleanup.
* Buffer submit now ignores duplicate buffer submit again. * Frame callback is cleaned up in the callback function now. * Damage region is currently ignored as there are screen artifacts otherwise.
This commit is contained in:
parent
823411c2f3
commit
b1e6e232ee
@ -223,7 +223,6 @@ struct uwac_window {
|
|||||||
|
|
||||||
struct wl_region *opaque_region;
|
struct wl_region *opaque_region;
|
||||||
struct wl_region *input_region;
|
struct wl_region *input_region;
|
||||||
struct wl_callback *frame_callback;
|
|
||||||
UwacBuffer *drawingBuffer, *pendingBuffer;
|
UwacBuffer *drawingBuffer, *pendingBuffer;
|
||||||
struct wl_surface *surface;
|
struct wl_surface *surface;
|
||||||
struct wl_shell_surface *shell_surface;
|
struct wl_shell_surface *shell_surface;
|
||||||
|
@ -515,9 +515,6 @@ UwacReturnCode UwacDestroyWindow(UwacWindow** pwindow)
|
|||||||
w = *pwindow;
|
w = *pwindow;
|
||||||
UwacWindowDestroyBuffers(w);
|
UwacWindowDestroyBuffers(w);
|
||||||
|
|
||||||
if (w->frame_callback)
|
|
||||||
wl_callback_destroy(w->frame_callback);
|
|
||||||
|
|
||||||
if (w->deco)
|
if (w->deco)
|
||||||
zxdg_toplevel_decoration_v1_destroy(w->deco);
|
zxdg_toplevel_decoration_v1_destroy(w->deco);
|
||||||
|
|
||||||
@ -607,6 +604,7 @@ static void UwacSubmitBufferPtr(UwacWindow* window, UwacBuffer* buffer)
|
|||||||
const RECTANGLE_16* box;
|
const RECTANGLE_16* box;
|
||||||
#endif
|
#endif
|
||||||
wl_surface_attach(window->surface, buffer->wayland_buffer, 0, 0);
|
wl_surface_attach(window->surface, buffer->wayland_buffer, 0, 0);
|
||||||
|
#if 0
|
||||||
#ifdef HAVE_PIXMAN_REGION
|
#ifdef HAVE_PIXMAN_REGION
|
||||||
box = pixman_region32_rectangles(&buffer->damage, &nrects);
|
box = pixman_region32_rectangles(&buffer->damage, &nrects);
|
||||||
|
|
||||||
@ -621,12 +619,11 @@ static void UwacSubmitBufferPtr(UwacWindow* window, UwacBuffer* buffer)
|
|||||||
(box->bottom - box->top));
|
(box->bottom - box->top));
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
#else
|
||||||
if (window->frame_callback)
|
wl_surface_damage(window->surface, 0, 0, window->width, window->height);
|
||||||
wl_callback_destroy(window->frame_callback);
|
#endif
|
||||||
|
struct wl_callback* frame_callback = wl_surface_frame(window->surface);
|
||||||
window->frame_callback = wl_surface_frame(window->surface);
|
wl_callback_add_listener(frame_callback, &frame_listener, window);
|
||||||
wl_callback_add_listener(window->frame_callback, &frame_listener, window);
|
|
||||||
wl_surface_commit(window->surface);
|
wl_surface_commit(window->surface);
|
||||||
#ifdef HAVE_PIXMAN_REGION
|
#ifdef HAVE_PIXMAN_REGION
|
||||||
pixman_region32_clear(&buffer->damage);
|
pixman_region32_clear(&buffer->damage);
|
||||||
@ -640,6 +637,8 @@ static void frame_done_cb(void* data, struct wl_callback* callback, uint32_t tim
|
|||||||
{
|
{
|
||||||
UwacWindow* window = (UwacWindow*)data;
|
UwacWindow* window = (UwacWindow*)data;
|
||||||
UwacFrameDoneEvent* event;
|
UwacFrameDoneEvent* event;
|
||||||
|
|
||||||
|
wl_callback_destroy(callback);
|
||||||
window->pendingBuffer = NULL;
|
window->pendingBuffer = NULL;
|
||||||
event = (UwacFrameDoneEvent*)UwacDisplayNewEvent(window->display, UWAC_EVENT_FRAME_DONE);
|
event = (UwacFrameDoneEvent*)UwacDisplayNewEvent(window->display, UWAC_EVENT_FRAME_DONE);
|
||||||
|
|
||||||
@ -692,14 +691,8 @@ UwacReturnCode UwacWindowSubmitBuffer(UwacWindow* window, bool copyContentForNex
|
|||||||
UwacBuffer* drawingBuffer = window->drawingBuffer;
|
UwacBuffer* drawingBuffer = window->drawingBuffer;
|
||||||
|
|
||||||
if (window->pendingBuffer)
|
if (window->pendingBuffer)
|
||||||
{
|
|
||||||
/* we already have a pending frame. resubmit as the buffer
|
|
||||||
* might have been discarded due to focus loss */
|
|
||||||
UwacSubmitBufferPtr(window, window->pendingBuffer);
|
|
||||||
return UWAC_SUCCESS;
|
return UWAC_SUCCESS;
|
||||||
}
|
|
||||||
|
|
||||||
UwacSubmitBufferPtr(window, drawingBuffer);
|
|
||||||
window->pendingBuffer = window->drawingBuffer;
|
window->pendingBuffer = window->drawingBuffer;
|
||||||
window->drawingBuffer = UwacWindowFindFreeBuffer(window);
|
window->drawingBuffer = UwacWindowFindFreeBuffer(window);
|
||||||
|
|
||||||
@ -707,10 +700,9 @@ UwacReturnCode UwacWindowSubmitBuffer(UwacWindow* window, bool copyContentForNex
|
|||||||
return UWAC_ERROR_NOMEMORY;
|
return UWAC_ERROR_NOMEMORY;
|
||||||
|
|
||||||
if (copyContentForNextFrame)
|
if (copyContentForNextFrame)
|
||||||
{
|
|
||||||
memcpy(window->drawingBuffer->data, window->pendingBuffer->data, window->stride * window->height);
|
memcpy(window->drawingBuffer->data, window->pendingBuffer->data, window->stride * window->height);
|
||||||
}
|
|
||||||
|
|
||||||
|
UwacSubmitBufferPtr(window, drawingBuffer);
|
||||||
return UWAC_SUCCESS;
|
return UWAC_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user