summaryrefslogtreecommitdiffstats
path: root/src/egl
diff options
context:
space:
mode:
authorMarek Olšák <[email protected]>2019-10-17 18:59:23 -0400
committerMarek Olšák <[email protected]>2019-10-25 19:59:04 -0400
commit34b1aa957a3f44ea9587ec43311e8434d3782cc1 (patch)
tree571b89f4e912bd4e05b83d51b619a12bd3b0cdf7 /src/egl
parent1d122c104a7a3d9348ab347e1e843b7e2bf3b498 (diff)
egl: handle EGL_IMAGE_EXTERNAL_FLUSH_EXT
Reviewed-by: Kristian H. Kristensen <[email protected]> Reviewed-By: Tapani Pälli <[email protected]>
Diffstat (limited to 'src/egl')
-rw-r--r--src/egl/drivers/dri2/egl_dri2.c55
-rw-r--r--src/egl/main/eglimage.c23
-rw-r--r--src/egl/main/eglimage.h3
3 files changed, 70 insertions, 11 deletions
diff --git a/src/egl/drivers/dri2/egl_dri2.c b/src/egl/drivers/dri2/egl_dri2.c
index 23d0e469427..e9468dcf991 100644
--- a/src/egl/drivers/dri2/egl_dri2.c
+++ b/src/egl/drivers/dri2/egl_dri2.c
@@ -2297,14 +2297,27 @@ dri2_create_image_mesa_drm_buffer(_EGLDisplay *disp, _EGLContext *ctx,
return NULL;
}
- dri_image =
- dri2_dpy->image->createImageFromName(dri2_dpy->dri_screen,
- attrs.Width,
- attrs.Height,
- format,
- name,
- pitch,
- NULL);
+ if (dri2_dpy->image->base.version >= 18) {
+ unsigned use = 0;
+
+ if (attrs.ImageFlushExternal)
+ use |= __DRI_IMAGE_USE_FLUSH_EXTERNAL;
+
+ dri_image =
+ dri2_dpy->image->createImageFromName2(dri2_dpy->dri_screen,
+ attrs.Width, attrs.Height,
+ format, name, pitch, use,
+ NULL);
+ } else {
+ dri_image =
+ dri2_dpy->image->createImageFromName(dri2_dpy->dri_screen,
+ attrs.Width,
+ attrs.Height,
+ format,
+ name,
+ pitch,
+ NULL);
+ }
return dri2_create_image_from_dri(disp, dri_image);
}
@@ -2646,7 +2659,26 @@ dri2_create_image_dma_buf(_EGLDisplay *disp, _EGLContext *ctx,
has_modifier = true;
}
- if (has_modifier) {
+ if (dri2_dpy->image->base.version >= 18) {
+ unsigned use = 0;
+
+ if (attrs.ImageFlushExternal)
+ use |= __DRI_IMAGE_USE_FLUSH_EXTERNAL;
+
+ if (!has_modifier)
+ modifier = DRM_FORMAT_MOD_INVALID;
+
+ dri_image =
+ dri2_dpy->image->createImageFromDmaBufs3(dri2_dpy->dri_screen,
+ attrs.Width, attrs.Height, attrs.DMABufFourCC.Value,
+ modifier, use, fds, num_fds, pitches, offsets,
+ attrs.DMABufYuvColorSpaceHint.Value,
+ attrs.DMABufSampleRangeHint.Value,
+ attrs.DMABufChromaHorizontalSiting.Value,
+ attrs.DMABufChromaVerticalSiting.Value,
+ &error,
+ NULL);
+ } else if (has_modifier) {
if (dri2_dpy->image->base.version < 15 ||
dri2_dpy->image->createImageFromDmaBufs2 == NULL) {
_eglError(EGL_BAD_MATCH, "unsupported dma_buf format modifier");
@@ -2662,8 +2694,7 @@ dri2_create_image_dma_buf(_EGLDisplay *disp, _EGLContext *ctx,
attrs.DMABufChromaVerticalSiting.Value,
&error,
NULL);
- }
- else {
+ } else {
dri_image =
dri2_dpy->image->createImageFromDmaBufs(dri2_dpy->dri_screen,
attrs.Width, attrs.Height, attrs.DMABufFourCC.Value,
@@ -2734,6 +2765,8 @@ dri2_create_drm_image_mesa(_EGLDriver *drv, _EGLDisplay *disp,
dri_use |= __DRI_IMAGE_USE_SCANOUT;
if (attrs.DRMBufferUseMESA & EGL_DRM_BUFFER_USE_CURSOR_MESA)
dri_use |= __DRI_IMAGE_USE_CURSOR;
+ if (attrs.ImageFlushExternal)
+ dri_use |= __DRI_IMAGE_USE_FLUSH_EXTERNAL;
dri2_img = malloc(sizeof *dri2_img);
if (!dri2_img) {
diff --git a/src/egl/main/eglimage.c b/src/egl/main/eglimage.c
index 9df6b6511d5..ef4a68f2367 100644
--- a/src/egl/main/eglimage.c
+++ b/src/egl/main/eglimage.c
@@ -265,6 +265,25 @@ _eglParseEXTImageDmaBufImportModifiersAttribs(_EGLImageAttribs *attrs,
return EGL_SUCCESS;
}
+static EGLint
+_eglParseEXTImageFlushExternalAttribs(_EGLImageAttribs *attrs,
+ _EGLDisplay *disp,
+ EGLint attr, EGLint val)
+{
+ if (!disp->Extensions.EXT_image_flush_external)
+ return EGL_BAD_PARAMETER;
+
+ switch (attr) {
+ case EGL_IMAGE_EXTERNAL_FLUSH_EXT:
+ attrs->ImageFlushExternal = val;
+ break;
+ default:
+ return EGL_BAD_PARAMETER;
+ }
+
+ return EGL_SUCCESS;
+}
+
/**
* Parse the list of image attributes.
*
@@ -286,6 +305,10 @@ _eglParseImageAttribList(_EGLImageAttribs *attrs, _EGLDisplay *disp,
EGLint attr = attrib_list[i++];
EGLint val = attrib_list[i];
+ err = _eglParseEXTImageFlushExternalAttribs(attrs, disp, attr, val);
+ if (err == EGL_SUCCESS)
+ continue;
+
err = _eglParseKHRImageAttribs(attrs, disp, attr, val);
if (err == EGL_SUCCESS)
continue;
diff --git a/src/egl/main/eglimage.h b/src/egl/main/eglimage.h
index 6d2e7ba8a2d..84ad0f01b0c 100644
--- a/src/egl/main/eglimage.h
+++ b/src/egl/main/eglimage.h
@@ -50,6 +50,9 @@ struct _egl_image_attrib_int
struct _egl_image_attribs
{
+ /* EGL_EXT_image_flush_external */
+ EGLBoolean ImageFlushExternal;
+
/* EGL_KHR_image_base */
EGLBoolean ImagePreserved;