mirror of
https://gitlab.freedesktop.org/wlroots/wlroots.git
synced 2025-10-31 22:25:21 -04:00
output: add damage tracking via buffer age
This commit is contained in:
parent
78c13ead16
commit
0365b587f0
21 changed files with 163 additions and 81 deletions
|
|
@ -183,12 +183,13 @@ void wlr_drm_resources_free(struct wlr_drm_backend *drm) {
|
|||
free(drm->planes);
|
||||
}
|
||||
|
||||
static void wlr_drm_connector_make_current(struct wlr_output *output) {
|
||||
static bool wlr_drm_connector_make_current(struct wlr_output *output,
|
||||
int *buffer_age) {
|
||||
struct wlr_drm_connector *conn = (struct wlr_drm_connector *)output;
|
||||
wlr_drm_surface_make_current(&conn->crtc->primary->surf);
|
||||
return wlr_drm_surface_make_current(&conn->crtc->primary->surf, buffer_age);
|
||||
}
|
||||
|
||||
static void wlr_drm_connector_swap_buffers(struct wlr_output *output) {
|
||||
static bool wlr_drm_connector_swap_buffers(struct wlr_output *output) {
|
||||
struct wlr_drm_connector *conn = (struct wlr_drm_connector *)output;
|
||||
struct wlr_drm_backend *drm = (struct wlr_drm_backend *)output->backend;
|
||||
|
||||
|
|
@ -203,7 +204,7 @@ static void wlr_drm_connector_swap_buffers(struct wlr_output *output) {
|
|||
|
||||
if (conn->pageflip_pending) {
|
||||
wlr_log(L_ERROR, "Skipping pageflip");
|
||||
return;
|
||||
return true;
|
||||
}
|
||||
|
||||
if (drm->iface->crtc_pageflip(drm, conn, crtc, fb_id, NULL)) {
|
||||
|
|
@ -212,6 +213,8 @@ static void wlr_drm_connector_swap_buffers(struct wlr_output *output) {
|
|||
wl_event_source_timer_update(conn->retry_pageflip,
|
||||
1000000.0f / conn->output.current_mode->refresh);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
static void wlr_drm_connector_set_gamma(struct wlr_output *output,
|
||||
|
|
@ -595,7 +598,7 @@ static bool wlr_drm_connector_set_cursor(struct wlr_output *output,
|
|||
return false;
|
||||
}
|
||||
|
||||
wlr_drm_surface_make_current(&plane->surf);
|
||||
wlr_drm_surface_make_current(&plane->surf, NULL);
|
||||
|
||||
wlr_texture_upload_pixels(plane->wlr_tex, WL_SHM_FORMAT_ARGB8888,
|
||||
stride, width, height, buf);
|
||||
|
|
|
|||
|
|
@ -113,9 +113,9 @@ void wlr_drm_surface_finish(struct wlr_drm_surface *surf) {
|
|||
memset(surf, 0, sizeof(*surf));
|
||||
}
|
||||
|
||||
void wlr_drm_surface_make_current(struct wlr_drm_surface *surf) {
|
||||
eglMakeCurrent(surf->renderer->egl.display, surf->egl, surf->egl,
|
||||
surf->renderer->egl.context);
|
||||
bool wlr_drm_surface_make_current(struct wlr_drm_surface *surf,
|
||||
int *buffer_damage) {
|
||||
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) {
|
||||
|
|
@ -123,7 +123,9 @@ struct gbm_bo *wlr_drm_surface_swap_buffers(struct wlr_drm_surface *surf) {
|
|||
gbm_surface_release_buffer(surf->gbm, surf->front);
|
||||
}
|
||||
|
||||
eglSwapBuffers(surf->renderer->egl.display, surf->egl);
|
||||
if (!eglSwapBuffers(surf->renderer->egl.display, surf->egl)) {
|
||||
wlr_log(L_ERROR, "eglSwapBuffers failed");
|
||||
}
|
||||
|
||||
surf->front = surf->back;
|
||||
surf->back = gbm_surface_lock_front_buffer(surf->gbm);
|
||||
|
|
@ -135,7 +137,7 @@ struct gbm_bo *wlr_drm_surface_get_front(struct wlr_drm_surface *surf) {
|
|||
return surf->front;
|
||||
}
|
||||
|
||||
wlr_drm_surface_make_current(surf);
|
||||
wlr_drm_surface_make_current(surf, NULL);
|
||||
glViewport(0, 0, surf->width, surf->height);
|
||||
glClearColor(0.0, 0.0, 0.0, 1.0);
|
||||
glClear(GL_COLOR_BUFFER_BIT);
|
||||
|
|
@ -207,8 +209,9 @@ static struct wlr_texture *get_tex_for_bo(struct wlr_drm_renderer *renderer, str
|
|||
return tex->tex;
|
||||
}
|
||||
|
||||
struct gbm_bo *wlr_drm_surface_mgpu_copy(struct wlr_drm_surface *dest, struct gbm_bo *src) {
|
||||
wlr_drm_surface_make_current(dest);
|
||||
struct gbm_bo *wlr_drm_surface_mgpu_copy(struct wlr_drm_surface *dest,
|
||||
struct gbm_bo *src) {
|
||||
wlr_drm_surface_make_current(dest, NULL);
|
||||
|
||||
struct wlr_texture *tex = get_tex_for_bo(dest->renderer, src);
|
||||
|
||||
|
|
|
|||
|
|
@ -48,18 +48,15 @@ static void output_transform(struct wlr_output *wlr_output,
|
|||
output->wlr_output.transform = transform;
|
||||
}
|
||||
|
||||
static void output_make_current(struct wlr_output *wlr_output) {
|
||||
static bool output_make_current(struct wlr_output *wlr_output, int *buffer_age) {
|
||||
struct wlr_headless_output *output =
|
||||
(struct wlr_headless_output *)wlr_output;
|
||||
if (!eglMakeCurrent(output->backend->egl.display,
|
||||
output->egl_surface, output->egl_surface,
|
||||
output->backend->egl.context)) {
|
||||
wlr_log(L_ERROR, "eglMakeCurrent failed: %s", egl_error());
|
||||
}
|
||||
return wlr_egl_make_current(&output->backend->egl, output->egl_surface,
|
||||
buffer_age);
|
||||
}
|
||||
|
||||
static void output_swap_buffers(struct wlr_output *wlr_output) {
|
||||
// No-op
|
||||
static bool output_swap_buffers(struct wlr_output *wlr_output) {
|
||||
return true; // No-op
|
||||
}
|
||||
|
||||
static void output_destroy(struct wlr_output *wlr_output) {
|
||||
|
|
|
|||
|
|
@ -38,22 +38,27 @@ static bool wlr_wl_output_set_custom_mode(struct wlr_output *_output,
|
|||
return true;
|
||||
}
|
||||
|
||||
static void wlr_wl_output_make_current(struct wlr_output *_output) {
|
||||
struct wlr_wl_backend_output *output = (struct wlr_wl_backend_output *)_output;
|
||||
if (!eglMakeCurrent(output->backend->egl.display,
|
||||
output->egl_surface, output->egl_surface,
|
||||
output->backend->egl.context)) {
|
||||
wlr_log(L_ERROR, "eglMakeCurrent failed: %s", egl_error());
|
||||
}
|
||||
static bool wlr_wl_output_make_current(struct wlr_output *wlr_output,
|
||||
int *buffer_age) {
|
||||
struct wlr_wl_backend_output *output =
|
||||
(struct wlr_wl_backend_output *)wlr_output;
|
||||
return wlr_egl_make_current(&output->backend->egl, output->egl_surface,
|
||||
buffer_age);
|
||||
}
|
||||
|
||||
static void wlr_wl_output_swap_buffers(struct wlr_output *_output) {
|
||||
struct wlr_wl_backend_output *output = (struct wlr_wl_backend_output *)_output;
|
||||
static bool wlr_wl_output_swap_buffers(struct wlr_output *wlr_output) {
|
||||
struct wlr_wl_backend_output *output =
|
||||
(struct wlr_wl_backend_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;
|
||||
}
|
||||
|
||||
static void wlr_wl_output_transform(struct wlr_output *_output,
|
||||
|
|
|
|||
|
|
@ -379,28 +379,23 @@ static void output_destroy(struct wlr_output *wlr_output) {
|
|||
// output has been allocated on the stack, do not free it
|
||||
}
|
||||
|
||||
static void output_make_current(struct wlr_output *wlr_output) {
|
||||
static bool output_make_current(struct wlr_output *wlr_output, int *buffer_age) {
|
||||
struct wlr_x11_output *output = (struct wlr_x11_output *)wlr_output;
|
||||
struct wlr_x11_backend *x11 = output->x11;
|
||||
|
||||
if (!eglMakeCurrent(x11->egl.display, output->surf, output->surf, x11->egl.context)) {
|
||||
wlr_log(L_ERROR, "eglMakeCurrent failed: %s", egl_error());
|
||||
}
|
||||
return wlr_egl_make_current(&x11->egl, output->surf, buffer_age);
|
||||
}
|
||||
|
||||
static void output_swap_buffers(struct wlr_output *wlr_output) {
|
||||
static bool output_swap_buffers(struct wlr_output *wlr_output) {
|
||||
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;
|
||||
}
|
||||
|
||||
// Damage the whole output
|
||||
// TODO: use the buffer age extension
|
||||
pixman_region32_union_rect(&wlr_output->damage, &wlr_output->damage,
|
||||
0, 0, wlr_output->width, wlr_output->height);
|
||||
wlr_output_update_needs_swap(wlr_output);
|
||||
return true;
|
||||
}
|
||||
|
||||
static struct wlr_output_impl output_impl = {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue