Only allow one modifier per DMA-BUF, split attributes struct in render/

This commit is contained in:
emersion 2018-05-29 22:38:00 +01:00
parent 8c9d0f15ce
commit 28020ff577
No known key found for this signature in database
GPG key ID: 0FDE7BE0E88F5E48
15 changed files with 91 additions and 74 deletions

View file

@ -340,9 +340,9 @@ EGLImageKHR wlr_egl_create_image_from_wl_drm(struct wlr_egl *egl,
}
EGLImageKHR wlr_egl_create_image_from_dmabuf(struct wlr_egl *egl,
struct wlr_dmabuf_buffer_attribs *attributes) {
struct wlr_dmabuf_attributes *attributes) {
bool has_modifier = false;
if (attributes->modifier[0] != DRM_FORMAT_MOD_INVALID) {
if (attributes->modifier != DRM_FORMAT_MOD_INVALID) {
if (!egl->egl_exts.dmabuf_import_modifiers) {
return NULL;
}
@ -364,7 +364,7 @@ EGLImageKHR wlr_egl_create_image_from_dmabuf(struct wlr_egl *egl,
EGLint pitch;
EGLint mod_lo;
EGLint mod_hi;
} attr_names[WLR_LINUX_DMABUF_MAX_PLANES] = {
} attr_names[WLR_DMABUF_MAX_PLANES] = {
{
EGL_DMA_BUF_PLANE0_FD_EXT,
EGL_DMA_BUF_PLANE0_OFFSET_EXT,
@ -401,9 +401,9 @@ EGLImageKHR wlr_egl_create_image_from_dmabuf(struct wlr_egl *egl,
attribs[atti++] = attributes->stride[i];
if (has_modifier) {
attribs[atti++] = attr_names[i].mod_lo;
attribs[atti++] = attributes->modifier[i] & 0xFFFFFFFF;
attribs[atti++] = attributes->modifier & 0xFFFFFFFF;
attribs[atti++] = attr_names[i].mod_hi;
attribs[atti++] = attributes->modifier[i] >> 32;
attribs[atti++] = attributes->modifier >> 32;
}
}
attribs[atti++] = EGL_NONE;
@ -414,11 +414,11 @@ EGLImageKHR wlr_egl_create_image_from_dmabuf(struct wlr_egl *egl,
}
#ifndef DRM_FORMAT_BIG_ENDIAN
# define DRM_FORMAT_BIG_ENDIAN 0x80000000
#define DRM_FORMAT_BIG_ENDIAN 0x80000000
#endif
bool wlr_egl_check_import_dmabuf(struct wlr_egl *egl,
struct wlr_dmabuf_buffer *dmabuf) {
switch (dmabuf->attributes.format & ~DRM_FORMAT_BIG_ENDIAN) {
struct wlr_dmabuf_attributes *attribs) {
switch (attribs->format & ~DRM_FORMAT_BIG_ENDIAN) {
/* TODO: YUV based formats not yet supported, require multiple
* wlr_create_image_from_dmabuf */
case WL_SHM_FORMAT_YUYV:
@ -431,8 +431,7 @@ bool wlr_egl_check_import_dmabuf(struct wlr_egl *egl,
break;
}
EGLImage egl_image = wlr_egl_create_image_from_dmabuf(egl,
&dmabuf->attributes);
EGLImage egl_image = wlr_egl_create_image_from_dmabuf(egl, attribs);
if (egl_image) {
/* We can import the image, good. No need to keep it
since wlr_texture_upload_dmabuf will import it again */

View file

@ -243,9 +243,9 @@ static int gles2_get_dmabuf_modifiers(struct wlr_renderer *wlr_renderer,
}
static bool gles2_check_import_dmabuf(struct wlr_renderer *wlr_renderer,
struct wlr_dmabuf_buffer *dmabuf) {
struct wlr_dmabuf_attributes *attribs) {
struct wlr_gles2_renderer *renderer = gles2_get_renderer(wlr_renderer);
return wlr_egl_check_import_dmabuf(renderer->egl, dmabuf);
return wlr_egl_check_import_dmabuf(renderer->egl, attribs);
}
static bool gles2_read_pixels(struct wlr_renderer *wlr_renderer,
@ -299,7 +299,7 @@ static struct wlr_texture *gles2_texture_from_wl_drm(
static struct wlr_texture *gles2_texture_from_dmabuf(
struct wlr_renderer *wlr_renderer,
struct wlr_dmabuf_buffer_attribs *attribs) {
struct wlr_dmabuf_attributes *attribs) {
struct wlr_gles2_renderer *renderer = gles2_get_renderer(wlr_renderer);
return wlr_gles2_texture_from_dmabuf(renderer->egl, attribs);
}

View file

@ -199,7 +199,7 @@ struct wlr_texture *wlr_gles2_texture_from_wl_drm(struct wlr_egl *egl,
}
struct wlr_texture *wlr_gles2_texture_from_dmabuf(struct wlr_egl *egl,
struct wlr_dmabuf_buffer_attribs *attribs) {
struct wlr_dmabuf_attributes *attribs) {
assert(wlr_egl_is_current(egl));
if (!glEGLImageTargetTexture2DOES) {
@ -225,7 +225,7 @@ struct wlr_texture *wlr_gles2_texture_from_dmabuf(struct wlr_egl *egl,
texture->type = WLR_GLES2_TEXTURE_DMABUF;
texture->has_alpha = true;
texture->inverted_y =
(attribs->flags & WLR_DMABUF_BUFFER_ATTRIBS_FLAGS_Y_INVERT) != 0;
(attribs->flags & WLR_DMABUF_ATTRIBUTES_FLAGS_Y_INVERT) != 0;
texture->image = wlr_egl_create_image_from_dmabuf(egl, attribs);
if (texture->image == NULL) {

View file

@ -136,11 +136,11 @@ int wlr_renderer_get_dmabuf_modifiers(struct wlr_renderer *r, int format,
}
bool wlr_renderer_check_import_dmabuf(struct wlr_renderer *r,
struct wlr_dmabuf_buffer *dmabuf) {
struct wlr_dmabuf_attributes *attribs) {
if (!r->impl->check_import_dmabuf) {
return false;
}
return r->impl->check_import_dmabuf(r, dmabuf);
return r->impl->check_import_dmabuf(r, attribs);
}
bool wlr_renderer_read_pixels(struct wlr_renderer *r, enum wl_shm_format fmt,

View file

@ -35,7 +35,7 @@ struct wlr_texture *wlr_texture_from_wl_drm(struct wlr_renderer *renderer,
}
struct wlr_texture *wlr_texture_from_dmabuf(struct wlr_renderer *renderer,
struct wlr_dmabuf_buffer_attribs *attribs) {
struct wlr_dmabuf_attributes *attribs) {
if (!renderer->impl->texture_from_dmabuf) {
return NULL;
}