mirror of
https://github.com/hyprwm/wlroots-hyprland.git
synced 2024-11-29 16:05:59 +01:00
output: make wlr_egl flip the damage
This commit is contained in:
parent
ca770995cc
commit
1b9ebcf645
2 changed files with 31 additions and 19 deletions
18
render/egl.c
18
render/egl.c
|
@ -1,11 +1,12 @@
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
#include <stdio.h>
|
#include <drm_fourcc.h>
|
||||||
#include <EGL/egl.h>
|
#include <EGL/egl.h>
|
||||||
#include <EGL/eglext.h>
|
#include <EGL/eglext.h>
|
||||||
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <drm_fourcc.h>
|
|
||||||
#include <wlr/render/egl.h>
|
#include <wlr/render/egl.h>
|
||||||
#include <wlr/util/log.h>
|
#include <wlr/util/log.h>
|
||||||
|
#include <wlr/util/region.h>
|
||||||
#include "glapi.h"
|
#include "glapi.h"
|
||||||
|
|
||||||
static bool egl_get_config(EGLDisplay disp, EGLint *attribs, EGLConfig *out,
|
static bool egl_get_config(EGLDisplay disp, EGLint *attribs, EGLConfig *out,
|
||||||
|
@ -329,9 +330,18 @@ bool wlr_egl_swap_buffers(struct wlr_egl *egl, EGLSurface surface,
|
||||||
EGLBoolean ret;
|
EGLBoolean ret;
|
||||||
if (damage != NULL && (egl->exts.swap_buffers_with_damage_ext ||
|
if (damage != NULL && (egl->exts.swap_buffers_with_damage_ext ||
|
||||||
egl->exts.swap_buffers_with_damage_khr)) {
|
egl->exts.swap_buffers_with_damage_khr)) {
|
||||||
|
EGLint width = 0, height = 0;
|
||||||
|
eglQuerySurface(egl->display, surface, EGL_WIDTH, &width);
|
||||||
|
eglQuerySurface(egl->display, surface, EGL_HEIGHT, &height);
|
||||||
|
|
||||||
|
pixman_region32_t flipped_damage;
|
||||||
|
pixman_region32_init(&flipped_damage);
|
||||||
|
wlr_region_transform(&flipped_damage, damage,
|
||||||
|
WL_OUTPUT_TRANSFORM_FLIPPED_180, width, height);
|
||||||
|
|
||||||
int nrects;
|
int nrects;
|
||||||
pixman_box32_t *rects =
|
pixman_box32_t *rects =
|
||||||
pixman_region32_rectangles(damage, &nrects);
|
pixman_region32_rectangles(&flipped_damage, &nrects);
|
||||||
EGLint egl_damage[4 * nrects];
|
EGLint egl_damage[4 * nrects];
|
||||||
for (int i = 0; i < nrects; ++i) {
|
for (int i = 0; i < nrects; ++i) {
|
||||||
egl_damage[4*i] = rects[i].x1;
|
egl_damage[4*i] = rects[i].x1;
|
||||||
|
@ -340,6 +350,8 @@ bool wlr_egl_swap_buffers(struct wlr_egl *egl, EGLSurface surface,
|
||||||
egl_damage[4*i + 3] = rects[i].y2 - rects[i].y1;
|
egl_damage[4*i + 3] = rects[i].y2 - rects[i].y1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pixman_region32_fini(&flipped_damage);
|
||||||
|
|
||||||
if (egl->exts.swap_buffers_with_damage_ext) {
|
if (egl->exts.swap_buffers_with_damage_ext) {
|
||||||
ret = eglSwapBuffersWithDamageEXT(egl->display, surface, egl_damage,
|
ret = eglSwapBuffersWithDamageEXT(egl->display, surface, egl_damage,
|
||||||
nrects);
|
nrects);
|
||||||
|
|
|
@ -353,15 +353,6 @@ bool wlr_output_swap_buffers(struct wlr_output *output, struct timespec *when,
|
||||||
int width, height;
|
int width, height;
|
||||||
wlr_output_transformed_resolution(output, &width, &height);
|
wlr_output_transformed_resolution(output, &width, &height);
|
||||||
|
|
||||||
pixman_region32_t render_damage;
|
|
||||||
pixman_region32_init(&render_damage);
|
|
||||||
pixman_region32_union_rect(&render_damage, &render_damage, 0, 0,
|
|
||||||
width, height);
|
|
||||||
if (damage != NULL) {
|
|
||||||
// Damage tracking supported
|
|
||||||
pixman_region32_intersect(&render_damage, &render_damage, damage);
|
|
||||||
}
|
|
||||||
|
|
||||||
struct timespec now;
|
struct timespec now;
|
||||||
if (when == NULL) {
|
if (when == NULL) {
|
||||||
clock_gettime(CLOCK_MONOTONIC, &now);
|
clock_gettime(CLOCK_MONOTONIC, &now);
|
||||||
|
@ -375,18 +366,29 @@ bool wlr_output_swap_buffers(struct wlr_output *output, struct timespec *when,
|
||||||
};
|
};
|
||||||
wlr_signal_emit_safe(&output->events.swap_buffers, &event);
|
wlr_signal_emit_safe(&output->events.swap_buffers, &event);
|
||||||
|
|
||||||
|
pixman_region32_t render_damage;
|
||||||
|
pixman_region32_init(&render_damage);
|
||||||
|
pixman_region32_union_rect(&render_damage, &render_damage, 0, 0,
|
||||||
|
width, height);
|
||||||
|
if (damage != NULL) {
|
||||||
|
// Damage tracking supported
|
||||||
|
pixman_region32_intersect(&render_damage, &render_damage, damage);
|
||||||
|
}
|
||||||
|
|
||||||
// Transform damage into renderer coordinates, ie. upside down
|
// Transform damage into renderer coordinates, ie. upside down
|
||||||
// TODO: take transformed coords, make the renderer flip the damage
|
// TODO: take transformed coords, make the renderer flip the damage
|
||||||
enum wl_output_transform transform = wlr_output_transform_compose(
|
enum wl_output_transform transform =
|
||||||
wlr_output_transform_invert(output->transform),
|
wlr_output_transform_invert(output->transform);
|
||||||
WL_OUTPUT_TRANSFORM_FLIPPED_180);
|
wlr_region_transform(&render_damage, &render_damage, transform,
|
||||||
wlr_region_transform(&render_damage, &render_damage, transform, width,
|
width, height);
|
||||||
height);
|
|
||||||
|
|
||||||
if (!output->impl->swap_buffers(output, damage ? &render_damage : NULL)) {
|
if (!output->impl->swap_buffers(output, damage ? &render_damage : NULL)) {
|
||||||
|
pixman_region32_fini(&render_damage);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pixman_region32_fini(&render_damage);
|
||||||
|
|
||||||
struct wlr_output_cursor *cursor;
|
struct wlr_output_cursor *cursor;
|
||||||
wl_list_for_each(cursor, &output->cursors, link) {
|
wl_list_for_each(cursor, &output->cursors, link) {
|
||||||
if (!cursor->enabled || !cursor->visible || cursor->surface == NULL) {
|
if (!cursor->enabled || !cursor->visible || cursor->surface == NULL) {
|
||||||
|
@ -398,8 +400,6 @@ bool wlr_output_swap_buffers(struct wlr_output *output, struct timespec *when,
|
||||||
output->frame_pending = true;
|
output->frame_pending = true;
|
||||||
output->needs_swap = false;
|
output->needs_swap = false;
|
||||||
pixman_region32_clear(&output->damage);
|
pixman_region32_clear(&output->damage);
|
||||||
|
|
||||||
pixman_region32_fini(&render_damage);
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue