mirror of
https://github.com/hyprwm/wlroots-hyprland.git
synced 2024-11-22 21:05:58 +01:00
output: send present event from all backends
This commit is contained in:
parent
78389fe722
commit
26b9d6dbb1
4 changed files with 27 additions and 3 deletions
|
@ -67,6 +67,7 @@ static bool output_make_current(struct wlr_output *wlr_output, int *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) {
|
pixman_region32_t *damage) {
|
||||||
|
wlr_output_send_present(wlr_output, NULL, 0, 0);
|
||||||
return true; // No-op
|
return true; // No-op
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -66,8 +66,14 @@ static bool output_swap_buffers(struct wlr_output *wlr_output,
|
||||||
output->frame_callback = wl_surface_frame(output->surface);
|
output->frame_callback = wl_surface_frame(output->surface);
|
||||||
wl_callback_add_listener(output->frame_callback, &frame_listener, output);
|
wl_callback_add_listener(output->frame_callback, &frame_listener, output);
|
||||||
|
|
||||||
return wlr_egl_swap_buffers(&output->backend->egl, output->egl_surface,
|
if (!wlr_egl_swap_buffers(&output->backend->egl,
|
||||||
damage);
|
output->egl_surface, damage)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO: if available, use the presentation-time protocol
|
||||||
|
wlr_output_send_present(wlr_output, NULL, 0, 0);
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void output_transform(struct wlr_output *wlr_output,
|
static void output_transform(struct wlr_output *wlr_output,
|
||||||
|
|
|
@ -102,7 +102,12 @@ static bool output_swap_buffers(struct wlr_output *wlr_output,
|
||||||
struct wlr_x11_output *output = (struct wlr_x11_output *)wlr_output;
|
struct wlr_x11_output *output = (struct wlr_x11_output *)wlr_output;
|
||||||
struct wlr_x11_backend *x11 = output->x11;
|
struct wlr_x11_backend *x11 = output->x11;
|
||||||
|
|
||||||
return wlr_egl_swap_buffers(&x11->egl, output->surf, damage);
|
if (!wlr_egl_swap_buffers(&x11->egl, output->surf, damage)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
wlr_output_send_present(wlr_output, NULL, 0, 0);
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
static const struct wlr_output_impl output_impl = {
|
static const struct wlr_output_impl output_impl = {
|
||||||
|
|
|
@ -18,6 +18,8 @@
|
||||||
|
|
||||||
#define OUTPUT_VERSION 3
|
#define OUTPUT_VERSION 3
|
||||||
|
|
||||||
|
#define DEFAULT_PRESENT_CLOCK CLOCK_MONOTONIC
|
||||||
|
|
||||||
static void output_send_to_resource(struct wl_resource *resource) {
|
static void output_send_to_resource(struct wl_resource *resource) {
|
||||||
struct wlr_output *output = wlr_output_from_resource(resource);
|
struct wlr_output *output = wlr_output_from_resource(resource);
|
||||||
const uint32_t version = wl_resource_get_version(resource);
|
const uint32_t version = wl_resource_get_version(resource);
|
||||||
|
@ -562,6 +564,16 @@ void wlr_output_schedule_frame(struct wlr_output *output) {
|
||||||
|
|
||||||
void wlr_output_send_present(struct wlr_output *output, struct timespec *when,
|
void wlr_output_send_present(struct wlr_output *output, struct timespec *when,
|
||||||
unsigned seq, uint32_t flags) {
|
unsigned seq, uint32_t flags) {
|
||||||
|
struct timespec now;
|
||||||
|
if (when == NULL) {
|
||||||
|
if (!clock_gettime(DEFAULT_PRESENT_CLOCK, &now)) {
|
||||||
|
wlr_log_errno(WLR_ERROR, "failed to send output present event: "
|
||||||
|
"failed to read clock");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
when = &now;
|
||||||
|
}
|
||||||
|
|
||||||
struct wlr_output_event_present event = {
|
struct wlr_output_event_present event = {
|
||||||
.output = output,
|
.output = output,
|
||||||
.when = when,
|
.when = when,
|
||||||
|
|
Loading…
Reference in a new issue