mirror of
https://gitlab.freedesktop.org/wlroots/wlroots.git
synced 2025-10-31 22:25:21 -04:00
Swap buffers with damage
This commit is contained in:
parent
34489dca16
commit
bf6d245400
11 changed files with 80 additions and 33 deletions
|
|
@ -190,7 +190,8 @@ static bool wlr_drm_connector_make_current(struct wlr_output *output,
|
|||
return wlr_drm_surface_make_current(&conn->crtc->primary->surf, buffer_age);
|
||||
}
|
||||
|
||||
static bool wlr_drm_connector_swap_buffers(struct wlr_output *output) {
|
||||
static bool wlr_drm_connector_swap_buffers(struct wlr_output *output,
|
||||
pixman_region32_t *damage) {
|
||||
struct wlr_drm_connector *conn = (struct wlr_drm_connector *)output;
|
||||
struct wlr_drm_backend *drm = (struct wlr_drm_backend *)output->backend;
|
||||
if (!drm->session->active) {
|
||||
|
|
@ -203,7 +204,7 @@ static bool wlr_drm_connector_swap_buffers(struct wlr_output *output) {
|
|||
}
|
||||
struct wlr_drm_plane *plane = crtc->primary;
|
||||
|
||||
struct gbm_bo *bo = wlr_drm_surface_swap_buffers(&plane->surf);
|
||||
struct gbm_bo *bo = wlr_drm_surface_swap_buffers(&plane->surf, damage);
|
||||
if (drm->parent) {
|
||||
bo = wlr_drm_surface_mgpu_copy(&plane->mgpu_surf, bo);
|
||||
}
|
||||
|
|
@ -635,7 +636,7 @@ static bool wlr_drm_connector_set_cursor(struct wlr_output *output,
|
|||
GL_UNSIGNED_BYTE, bo_data);
|
||||
glPixelStorei(GL_UNPACK_ROW_LENGTH_EXT, 0);
|
||||
|
||||
wlr_drm_surface_swap_buffers(&plane->surf);
|
||||
wlr_drm_surface_swap_buffers(&plane->surf, NULL);
|
||||
|
||||
gbm_bo_unmap(bo, bo_data);
|
||||
|
||||
|
|
|
|||
|
|
@ -133,14 +133,13 @@ bool wlr_drm_surface_make_current(struct wlr_drm_surface *surf,
|
|||
return wlr_egl_make_current(&surf->renderer->egl, surf->egl, buffer_damage);
|
||||
}
|
||||
|
||||
struct gbm_bo *wlr_drm_surface_swap_buffers(struct wlr_drm_surface *surf) {
|
||||
struct gbm_bo *wlr_drm_surface_swap_buffers(struct wlr_drm_surface *surf,
|
||||
pixman_region32_t *damage) {
|
||||
if (surf->front) {
|
||||
gbm_surface_release_buffer(surf->gbm, surf->front);
|
||||
}
|
||||
|
||||
if (!eglSwapBuffers(surf->renderer->egl.display, surf->egl)) {
|
||||
wlr_log(L_ERROR, "eglSwapBuffers failed");
|
||||
}
|
||||
wlr_egl_swap_buffers(&surf->renderer->egl, surf->egl, damage);
|
||||
|
||||
surf->front = surf->back;
|
||||
surf->back = gbm_surface_lock_front_buffer(surf->gbm);
|
||||
|
|
@ -156,7 +155,7 @@ struct gbm_bo *wlr_drm_surface_get_front(struct wlr_drm_surface *surf) {
|
|||
glViewport(0, 0, surf->width, surf->height);
|
||||
glClearColor(0.0, 0.0, 0.0, 1.0);
|
||||
glClear(GL_COLOR_BUFFER_BIT);
|
||||
return wlr_drm_surface_swap_buffers(surf);
|
||||
return wlr_drm_surface_swap_buffers(surf, NULL);
|
||||
}
|
||||
|
||||
void wlr_drm_surface_post(struct wlr_drm_surface *surf) {
|
||||
|
|
@ -244,7 +243,7 @@ struct gbm_bo *wlr_drm_surface_mgpu_copy(struct wlr_drm_surface *dest,
|
|||
glClear(GL_COLOR_BUFFER_BIT);
|
||||
wlr_render_with_matrix(dest->renderer->wlr_rend, tex, &matrix);
|
||||
|
||||
return wlr_drm_surface_swap_buffers(dest);
|
||||
return wlr_drm_surface_swap_buffers(dest, NULL);
|
||||
}
|
||||
|
||||
bool wlr_drm_plane_surfaces_init(struct wlr_drm_plane *plane, struct wlr_drm_backend *drm,
|
||||
|
|
|
|||
|
|
@ -55,7 +55,8 @@ static bool output_make_current(struct wlr_output *wlr_output, int *buffer_age)
|
|||
buffer_age);
|
||||
}
|
||||
|
||||
static bool output_swap_buffers(struct wlr_output *wlr_output) {
|
||||
static bool output_swap_buffers(struct wlr_output *wlr_output,
|
||||
pixman_region32_t *damage) {
|
||||
return true; // No-op
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -47,7 +47,8 @@ static bool wlr_wl_output_make_current(struct wlr_output *wlr_output,
|
|||
buffer_age);
|
||||
}
|
||||
|
||||
static bool wlr_wl_output_swap_buffers(struct wlr_output *wlr_output) {
|
||||
static bool wlr_wl_output_swap_buffers(struct wlr_output *wlr_output,
|
||||
pixman_region32_t *damage) {
|
||||
struct wlr_wl_backend_output *output =
|
||||
(struct wlr_wl_backend_output *)wlr_output;
|
||||
|
||||
|
|
@ -59,12 +60,8 @@ static bool wlr_wl_output_swap_buffers(struct wlr_output *wlr_output) {
|
|||
output->frame_callback = wl_surface_frame(output->surface);
|
||||
wl_callback_add_listener(output->frame_callback, &frame_listener, output);
|
||||
|
||||
if (!eglSwapBuffers(output->backend->egl.display, output->egl_surface)) {
|
||||
wlr_log(L_ERROR, "eglSwapBuffers failed: %s", egl_error());
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
return wlr_egl_swap_buffers(&output->backend->egl, output->egl_surface,
|
||||
damage);
|
||||
}
|
||||
|
||||
static void wlr_wl_output_transform(struct wlr_output *_output,
|
||||
|
|
|
|||
|
|
@ -401,16 +401,12 @@ static bool output_make_current(struct wlr_output *wlr_output, int *buffer_age)
|
|||
return wlr_egl_make_current(&x11->egl, output->surf, buffer_age);
|
||||
}
|
||||
|
||||
static bool output_swap_buffers(struct wlr_output *wlr_output) {
|
||||
static bool output_swap_buffers(struct wlr_output *wlr_output,
|
||||
pixman_region32_t *damage) {
|
||||
struct wlr_x11_output *output = (struct wlr_x11_output *)wlr_output;
|
||||
struct wlr_x11_backend *x11 = output->x11;
|
||||
|
||||
if (!eglSwapBuffers(x11->egl.display, output->surf)) {
|
||||
wlr_log(L_ERROR, "eglSwapBuffers failed: %s", egl_error());
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
return wlr_egl_swap_buffers(&x11->egl, output->surf, damage);
|
||||
}
|
||||
|
||||
static struct wlr_output_impl output_impl = {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue