gl-renderer: do not expose query_dmabuf_formats and query_dmabuf_modifiers

In commit "libweston: add struct weston_drm_format" struct
weston_drm_format and its helper functions were added to libweston.

The functions query_dmabuf_formats and query_dmabuf_modifiers are very
specific to GL-renderer and its internals. So instead of exposing them
in libweston, query and store DRM formats and modifiers internally in
GL-renderer. Also, add a vfunction to struct weston_renderer in order
to retrieve the formats.

Signed-off-by: Leandro Ribeiro <leandro.ribeiro@collabora.com>
This commit is contained in:
Leandro Ribeiro 2021-03-04 17:47:13 -03:00 committed by Daniel Stone
parent a5560d6dbe
commit 1b403263d4
4 changed files with 89 additions and 46 deletions

View File

@ -919,6 +919,8 @@ struct weston_plane {
struct wl_list link;
};
struct weston_drm_format_array;
struct weston_renderer {
int (*read_pixels)(struct weston_output *output,
pixman_format_code_t format, void *pixels,
@ -948,14 +950,8 @@ struct weston_renderer {
bool (*import_dmabuf)(struct weston_compositor *ec,
struct linux_dmabuf_buffer *buffer);
/** On error sets num_formats to zero */
void (*query_dmabuf_formats)(struct weston_compositor *ec,
int **formats, int *num_formats);
/** On error sets num_modifiers to zero */
void (*query_dmabuf_modifiers)(struct weston_compositor *ec,
int format, uint64_t **modifiers,
int *num_modifiers);
const struct weston_drm_format_array *
(*get_supported_formats)(struct weston_compositor *ec);
};
enum weston_capability {

View File

@ -477,12 +477,12 @@ bind_linux_dmabuf(struct wl_client *client,
void *data, uint32_t version, uint32_t id)
{
struct weston_compositor *compositor = data;
const struct weston_drm_format_array *supported_formats;
struct wl_resource *resource;
int *formats = NULL;
uint64_t *modifiers = NULL;
int num_formats, num_modifiers;
uint64_t modifier_invalid = DRM_FORMAT_MOD_INVALID;
int i, j;
struct weston_drm_format *fmt;
const uint64_t *modifiers;
unsigned int num_modifiers;
unsigned int i;
resource = wl_resource_create(client, &zwp_linux_dmabuf_v1_interface,
version, id);
@ -494,43 +494,25 @@ bind_linux_dmabuf(struct wl_client *client,
wl_resource_set_implementation(resource, &linux_dmabuf_implementation,
compositor, NULL);
/*
* Use EGL_EXT_image_dma_buf_import_modifiers to query and advertise
* format/modifier codes.
*/
compositor->renderer->query_dmabuf_formats(compositor, &formats,
&num_formats);
for (i = 0; i < num_formats; i++) {
compositor->renderer->query_dmabuf_modifiers(compositor,
formats[i],
&modifiers,
&num_modifiers);
/* send DRM_FORMAT_MOD_INVALID token when no modifiers are supported
* for this format */
if (num_modifiers == 0) {
num_modifiers = 1;
modifiers = &modifier_invalid;
}
for (j = 0; j < num_modifiers; j++) {
/* Advertise the formats/modifiers */
supported_formats = compositor->renderer->get_supported_formats(compositor);
wl_array_for_each(fmt, &supported_formats->arr) {
modifiers = weston_drm_format_get_modifiers(fmt, &num_modifiers);
for (i = 0; i < num_modifiers; i++) {
if (version >= ZWP_LINUX_DMABUF_V1_MODIFIER_SINCE_VERSION) {
uint32_t modifier_lo = modifiers[j] & 0xFFFFFFFF;
uint32_t modifier_hi = modifiers[j] >> 32;
uint32_t modifier_lo = modifiers[i] & 0xFFFFFFFF;
uint32_t modifier_hi = modifiers[i] >> 32;
zwp_linux_dmabuf_v1_send_modifier(resource,
formats[i],
fmt->format,
modifier_hi,
modifier_lo);
} else if (modifiers[j] == DRM_FORMAT_MOD_LINEAR ||
modifiers == &modifier_invalid) {
} else if (modifiers[i] == DRM_FORMAT_MOD_LINEAR ||
modifiers[i] == DRM_FORMAT_MOD_INVALID) {
zwp_linux_dmabuf_v1_send_format(resource,
formats[i]);
fmt->format);
}
}
if (modifiers != &modifier_invalid)
free(modifiers);
}
free(formats);
}
/** Advertise linux_dmabuf support

View File

@ -108,6 +108,8 @@ struct gl_renderer {
struct wl_array vertices;
struct wl_array vtxcnt;
struct weston_drm_format_array supported_formats;
PFNGLEGLIMAGETARGETTEXTURE2DOESPROC image_target_texture_2d;
PFNEGLCREATEIMAGEKHRPROC create_image;
PFNEGLDESTROYIMAGEKHRPROC destroy_image;

View File

@ -2777,6 +2777,63 @@ gl_renderer_attach_dmabuf(struct weston_surface *surface,
gs->shader_variant = image->shader_variant;
}
static const struct weston_drm_format_array *
gl_renderer_get_supported_formats(struct weston_compositor *ec)
{
struct gl_renderer *gr = get_renderer(ec);
return &gr->supported_formats;
}
static int
populate_supported_formats(struct weston_compositor *ec,
struct weston_drm_format_array *supported_formats)
{
struct weston_drm_format *fmt;
int *formats = NULL;
uint64_t *modifiers = NULL;
unsigned int num_formats, num_modifiers;
unsigned int i, j;
int ret = 0;
/* Use EGL_EXT_image_dma_buf_import_modifiers to query the
* list of formats/modifiers of the renderer. */
gl_renderer_query_dmabuf_formats(ec, &formats, &num_formats);
if (num_formats == 0)
return 0;
for (i = 0; i < num_formats; i++) {
fmt = weston_drm_format_array_add_format(supported_formats,
formats[i]);
if (!fmt) {
ret = -1;
goto out;
}
gl_renderer_query_dmabuf_modifiers(ec, formats[i],
&modifiers, &num_modifiers);
if (num_modifiers == 0) {
ret = weston_drm_format_add_modifier(fmt, DRM_FORMAT_MOD_INVALID);
if (ret < 0)
goto out;
continue;
}
for (j = 0; j < num_modifiers; j++) {
ret = weston_drm_format_add_modifier(fmt, modifiers[j]);
if (ret < 0) {
free(modifiers);
goto out;
}
}
free(modifiers);
}
out:
free(formats);
return ret;
}
static void
gl_renderer_attach(struct weston_surface *es, struct weston_buffer *buffer)
{
@ -3423,6 +3480,8 @@ gl_renderer_destroy(struct weston_compositor *ec)
wl_list_for_each_safe(format, next_format, &gr->dmabuf_formats, link)
dmabuf_format_destroy(format);
weston_drm_format_array_fini(&gr->supported_formats);
if (gr->dummy_surface != EGL_NO_SURFACE)
weston_platform_destroy_egl_surface(gr->egl_display,
gr->dummy_surface);
@ -3495,6 +3554,7 @@ gl_renderer_display_create(struct weston_compositor *ec,
const struct gl_renderer_display_options *options)
{
struct gl_renderer *gr;
int ret;
gr = zalloc(sizeof *gr);
if (gr == NULL)
@ -3524,6 +3584,8 @@ gl_renderer_display_create(struct weston_compositor *ec,
if (gl_renderer_setup_egl_display(gr, options->egl_native_display) < 0)
goto fail;
weston_drm_format_array_init(&gr->supported_formats);
log_egl_info(gr->egl_display);
ec->renderer = &gr->base;
@ -3557,10 +3619,10 @@ gl_renderer_display_create(struct weston_compositor *ec,
wl_list_init(&gr->dmabuf_images);
if (gr->has_dmabuf_import) {
gr->base.import_dmabuf = gl_renderer_import_dmabuf;
gr->base.query_dmabuf_formats =
gl_renderer_query_dmabuf_formats;
gr->base.query_dmabuf_modifiers =
gl_renderer_query_dmabuf_modifiers;
gr->base.get_supported_formats = gl_renderer_get_supported_formats;
ret = populate_supported_formats(ec, &gr->supported_formats);
if (ret < 0)
goto fail_terminate;
}
wl_list_init(&gr->dmabuf_formats);
@ -3598,6 +3660,7 @@ gl_renderer_display_create(struct weston_compositor *ec,
fail_with_error:
gl_renderer_print_egl_error_state();
fail_terminate:
weston_drm_format_array_fini(&gr->supported_formats);
eglTerminate(gr->egl_display);
fail:
weston_log_scope_destroy(gr->shader_scope);