output: add wlr_output_get_primary_formats

This allows compositors to get primary formats without manually
calling wlr_output_impl.get_primary_formats.

For example, the Sway patch for linux-dmabuf feedback [1] needs
this.

[1]: https://github.com/swaywm/sway/pull/6313
This commit is contained in:
Simon Ser 2021-11-30 20:26:11 +01:00
parent e93435016e
commit 697a1cd0f5
3 changed files with 32 additions and 20 deletions

View file

@ -460,6 +460,16 @@ void wlr_output_lock_software_cursors(struct wlr_output *output, bool lock);
*/ */
void wlr_output_render_software_cursors(struct wlr_output *output, void wlr_output_render_software_cursors(struct wlr_output *output,
pixman_region32_t *damage); pixman_region32_t *damage);
/**
* Get the set of DRM formats suitable for the primary buffer, assuming a
* buffer with the specified capabilities.
*
* NULL is returned if the backend doesn't have any format constraint, ie. all
* formats are supported. An empty set is returned if the backend doesn't
* support any format.
*/
const struct wlr_drm_format_set *wlr_output_get_primary_formats(
struct wlr_output *output, uint32_t buffer_caps);
struct wlr_output_cursor *wlr_output_cursor_create(struct wlr_output *output); struct wlr_output_cursor *wlr_output_cursor_create(struct wlr_output *output);

View file

@ -560,16 +560,8 @@ static bool output_basic_test(struct wlr_output *output) {
struct wlr_allocator *allocator = output->allocator; struct wlr_allocator *allocator = output->allocator;
assert(allocator != NULL); assert(allocator != NULL);
const struct wlr_drm_format_set *display_formats = NULL; const struct wlr_drm_format_set *display_formats =
if (output->impl->get_primary_formats) { wlr_output_get_primary_formats(output, allocator->buffer_caps);
display_formats =
output->impl->get_primary_formats(output, allocator->buffer_caps);
if (display_formats == NULL) {
wlr_log(WLR_ERROR, "Failed to get primary display formats");
return false;
}
}
struct wlr_drm_format *format = output_pick_format(output, display_formats, struct wlr_drm_format *format = output_pick_format(output, display_formats,
output->pending.render_format); output->pending.render_format);
if (format == NULL) { if (format == NULL) {
@ -868,3 +860,21 @@ void wlr_output_damage_whole(struct wlr_output *output) {
pixman_region32_fini(&damage); pixman_region32_fini(&damage);
} }
const struct wlr_drm_format_set *wlr_output_get_primary_formats(
struct wlr_output *output, uint32_t buffer_caps) {
if (!output->impl->get_primary_formats) {
return NULL;
}
const struct wlr_drm_format_set *formats =
output->impl->get_primary_formats(output, buffer_caps);
if (formats == NULL) {
wlr_log(WLR_ERROR, "Failed to get primary display formats");
static const struct wlr_drm_format_set empty_format_set = {0};
return &empty_format_set;
}
return formats;
}

View file

@ -51,16 +51,8 @@ static bool output_create_swapchain(struct wlr_output *output,
struct wlr_allocator *allocator = output->allocator; struct wlr_allocator *allocator = output->allocator;
assert(allocator != NULL); assert(allocator != NULL);
const struct wlr_drm_format_set *display_formats = NULL; const struct wlr_drm_format_set *display_formats =
if (output->impl->get_primary_formats) { wlr_output_get_primary_formats(output, allocator->buffer_caps);
display_formats =
output->impl->get_primary_formats(output, allocator->buffer_caps);
if (display_formats == NULL) {
wlr_log(WLR_ERROR, "Failed to get primary display formats");
return false;
}
}
struct wlr_drm_format *format = output_pick_format(output, display_formats, struct wlr_drm_format *format = output_pick_format(output, display_formats,
output->render_format); output->render_format);
if (format == NULL) { if (format == NULL) {