mirror of
https://github.com/hyprwm/wlroots-hyprland.git
synced 2024-11-22 12:55:58 +01:00
output: fix back buffer checks
The back buffer is no longer set at commit time since 0556aa0c59
("output: rejigger attach/clear for back buffer").
Instead, check whether the buffer belongs to the output swapchain.
This is more robust.
Closes: https://gitlab.freedesktop.org/wlroots/wlroots/-/issues/3496
This commit is contained in:
parent
800ea7d52d
commit
8e8b9a7217
4 changed files with 21 additions and 2 deletions
|
@ -8,6 +8,8 @@ void output_pending_resolution(struct wlr_output *output,
|
||||||
const struct wlr_output_state *state, int *width, int *height);
|
const struct wlr_output_state *state, int *width, int *height);
|
||||||
void output_state_attach_buffer(struct wlr_output_state *state,
|
void output_state_attach_buffer(struct wlr_output_state *state,
|
||||||
struct wlr_buffer *buffer);
|
struct wlr_buffer *buffer);
|
||||||
|
bool output_is_direct_scanout(struct wlr_output *output,
|
||||||
|
struct wlr_buffer *buffer);
|
||||||
|
|
||||||
struct wlr_drm_format *output_pick_format(struct wlr_output *output,
|
struct wlr_drm_format *output_pick_format(struct wlr_output *output,
|
||||||
const struct wlr_drm_format_set *display_formats, uint32_t format);
|
const struct wlr_drm_format_set *display_formats, uint32_t format);
|
||||||
|
|
|
@ -575,7 +575,7 @@ static bool output_basic_test(struct wlr_output *output,
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (output->back_buffer == NULL) {
|
if (output_is_direct_scanout(output, state->buffer)) {
|
||||||
if (output->attach_render_locks > 0) {
|
if (output->attach_render_locks > 0) {
|
||||||
wlr_log(WLR_DEBUG, "Direct scan-out disabled by lock");
|
wlr_log(WLR_DEBUG, "Direct scan-out disabled by lock");
|
||||||
return false;
|
return false;
|
||||||
|
|
|
@ -329,3 +329,18 @@ uint32_t wlr_output_preferred_read_format(struct wlr_output *output) {
|
||||||
|
|
||||||
return fmt;
|
return fmt;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool output_is_direct_scanout(struct wlr_output *output,
|
||||||
|
struct wlr_buffer *buffer) {
|
||||||
|
if (output->swapchain == NULL) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (size_t i = 0; i < WLR_SWAPCHAIN_CAP; i++) {
|
||||||
|
if (output->swapchain->slots[i].buffer == buffer) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
|
@ -5,6 +5,7 @@
|
||||||
#include <wlr/types/wlr_output_damage.h>
|
#include <wlr/types/wlr_output_damage.h>
|
||||||
#include <wlr/types/wlr_output.h>
|
#include <wlr/types/wlr_output.h>
|
||||||
#include <wlr/util/box.h>
|
#include <wlr/util/box.h>
|
||||||
|
#include "types/wlr_output.h"
|
||||||
|
|
||||||
static void output_handle_destroy(struct wl_listener *listener, void *data) {
|
static void output_handle_destroy(struct wl_listener *listener, void *data) {
|
||||||
struct wlr_output_damage *output_damage =
|
struct wlr_output_damage *output_damage =
|
||||||
|
@ -53,7 +54,8 @@ static void output_handle_precommit(struct wl_listener *listener, void *data) {
|
||||||
if (state->committed & WLR_OUTPUT_STATE_BUFFER) {
|
if (state->committed & WLR_OUTPUT_STATE_BUFFER) {
|
||||||
// TODO: find a better way to access this info without a precommit
|
// TODO: find a better way to access this info without a precommit
|
||||||
// handler
|
// handler
|
||||||
output_damage->pending_attach_render = output->back_buffer != NULL;
|
output_damage->pending_attach_render =
|
||||||
|
output_is_direct_scanout(output, state->buffer);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue