diff options
author | Marek Olšák <[email protected]> | 2019-10-17 18:59:23 -0400 |
---|---|---|
committer | Marek Olšák <[email protected]> | 2019-10-25 19:59:04 -0400 |
commit | 34b1aa957a3f44ea9587ec43311e8434d3782cc1 (patch) | |
tree | 571b89f4e912bd4e05b83d51b619a12bd3b0cdf7 /src/egl | |
parent | 1d122c104a7a3d9348ab347e1e843b7e2bf3b498 (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.c | 55 | ||||
-rw-r--r-- | src/egl/main/eglimage.c | 23 | ||||
-rw-r--r-- | src/egl/main/eglimage.h | 3 |
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; |