diff options
author | Marek Olšák <[email protected]> | 2019-10-17 20:07:32 -0400 |
---|---|---|
committer | Marek Olšák <[email protected]> | 2019-10-25 19:59:04 -0400 |
commit | c1c574fdf18f2aeb1c03f9670bf00e1dcd22d99d (patch) | |
tree | 35bc1412bf4df9247b16f6e8660d8aea2d1e751e /src/egl/main | |
parent | 34b1aa957a3f44ea9587ec43311e8434d3782cc1 (diff) |
egl: implement new functions from EGL_EXT_image_flush_external
Reviewed-by: Kristian H. Kristensen <[email protected]>
Reviewed-By: Tapani Pälli <[email protected]>
Diffstat (limited to 'src/egl/main')
-rw-r--r-- | src/egl/main/eglapi.c | 50 | ||||
-rw-r--r-- | src/egl/main/eglapi.h | 5 | ||||
-rw-r--r-- | src/egl/main/egldisplay.h | 1 | ||||
-rw-r--r-- | src/egl/main/eglentrypoint.h | 2 |
4 files changed, 58 insertions, 0 deletions
diff --git a/src/egl/main/eglapi.c b/src/egl/main/eglapi.c index 51557be0864..68db0bd4cb9 100644 --- a/src/egl/main/eglapi.c +++ b/src/egl/main/eglapi.c @@ -499,6 +499,7 @@ _eglCreateExtensionsString(_EGLDisplay *disp) _EGL_CHECK_EXTENSION(EXT_create_context_robustness); _EGL_CHECK_EXTENSION(EXT_image_dma_buf_import); _EGL_CHECK_EXTENSION(EXT_image_dma_buf_import_modifiers); + _EGL_CHECK_EXTENSION(EXT_image_flush_external); _EGL_CHECK_EXTENSION(EXT_surface_CTA861_3_metadata); _EGL_CHECK_EXTENSION(EXT_surface_SMPTE2086_metadata); _EGL_CHECK_EXTENSION(EXT_swap_buffers_with_damage); @@ -2747,6 +2748,55 @@ eglGetDisplayDriverName(EGLDisplay dpy) RETURN_EGL_EVAL(disp, ret); } +static EGLBoolean EGLAPIENTRY +eglImageFlushExternalEXT(EGLDisplay dpy, EGLImageKHR image, + const EGLAttrib *attrib_list) +{ + _EGLDisplay *disp = _eglLockDisplay(dpy); + _EGLContext *ctx = _eglGetCurrentContext(); + _EGLImage *img = _eglLookupImage(image, disp); + _EGLDriver *drv; + + _EGL_FUNC_START(disp, EGL_OBJECT_IMAGE_KHR, img, EGL_FALSE); + _EGL_CHECK_DISPLAY(disp, EGL_FALSE, drv); + + if (attrib_list && attrib_list[0] != EGL_NONE) + RETURN_EGL_ERROR(disp, EGL_BAD_PARAMETER, EGL_FALSE); + + if (!ctx || !disp->Extensions.EXT_image_flush_external) + RETURN_EGL_EVAL(disp, EGL_FALSE); + if (!img) + RETURN_EGL_ERROR(disp, EGL_BAD_PARAMETER, EGL_FALSE); + + + drv->API.ImageFlushExternal(disp, ctx, img); + RETURN_EGL_EVAL(disp, EGL_TRUE); +} + +static EGLBoolean EGLAPIENTRY +eglImageInvalidateExternalEXT(EGLDisplay dpy, EGLImageKHR image, + const EGLAttrib *attrib_list) +{ + _EGLDisplay *disp = _eglLockDisplay(dpy); + _EGLContext *ctx = _eglGetCurrentContext(); + _EGLImage *img = _eglLookupImage(image, disp); + _EGLDriver *drv; + + _EGL_FUNC_START(disp, EGL_OBJECT_IMAGE_KHR, img, EGL_FALSE); + _EGL_CHECK_DISPLAY(disp, EGL_FALSE, drv); + + if (attrib_list && attrib_list[0] != EGL_NONE) + RETURN_EGL_ERROR(disp, EGL_BAD_PARAMETER, EGL_FALSE); + + if (!ctx || !disp->Extensions.EXT_image_flush_external) + RETURN_EGL_EVAL(disp, EGL_FALSE); + if (!img) + RETURN_EGL_ERROR(disp, EGL_BAD_PARAMETER, EGL_FALSE); + + drv->API.ImageInvalidateExternal(disp, ctx, img); + RETURN_EGL_EVAL(disp, EGL_TRUE); +} + __eglMustCastToProperFunctionPointerType EGLAPIENTRY eglGetProcAddress(const char *procname) { diff --git a/src/egl/main/eglapi.h b/src/egl/main/eglapi.h index 968f4b27725..76891dcd25b 100644 --- a/src/egl/main/eglapi.h +++ b/src/egl/main/eglapi.h @@ -189,6 +189,11 @@ struct _egl_api void (*SetBlobCacheFuncsANDROID) (_EGLDriver *drv, _EGLDisplay *disp, EGLSetBlobFuncANDROID set, EGLGetBlobFuncANDROID get); + + void (*ImageFlushExternal)(_EGLDisplay *disp, _EGLContext *ctx, + _EGLImage *image); + void (*ImageInvalidateExternal)(_EGLDisplay *disp, _EGLContext *ctx, + _EGLImage *image); }; #ifdef __cplusplus diff --git a/src/egl/main/egldisplay.h b/src/egl/main/egldisplay.h index 02ac4fb9a9d..940b71e318e 100644 --- a/src/egl/main/egldisplay.h +++ b/src/egl/main/egldisplay.h @@ -105,6 +105,7 @@ struct _egl_extensions EGLBoolean EXT_create_context_robustness; EGLBoolean EXT_image_dma_buf_import; EGLBoolean EXT_image_dma_buf_import_modifiers; + EGLBoolean EXT_image_flush_external; EGLBoolean EXT_pixel_format_float; EGLBoolean EXT_surface_CTA861_3_metadata; EGLBoolean EXT_surface_SMPTE2086_metadata; diff --git a/src/egl/main/eglentrypoint.h b/src/egl/main/eglentrypoint.h index 44e971e023a..b708078f550 100644 --- a/src/egl/main/eglentrypoint.h +++ b/src/egl/main/eglentrypoint.h @@ -51,6 +51,8 @@ EGL_ENTRYPOINT(eglGetProcAddress) EGL_ENTRYPOINT(eglGetSyncAttrib) EGL_ENTRYPOINT(eglGetSyncAttribKHR) EGL_ENTRYPOINT(eglGetSyncValuesCHROMIUM) +EGL_ENTRYPOINT(eglImageFlushExternalEXT) +EGL_ENTRYPOINT(eglImageInvalidateExternalEXT) EGL_ENTRYPOINT(eglInitialize) EGL_ENTRYPOINT(eglLabelObjectKHR) EGL_ENTRYPOINT(eglMakeCurrent) |