egl: implement new functions from EGL_EXT_image_flush_external
Reviewed-by: Kristian H. Kristensen <hoegsberg@google.com> Reviewed-By: Tapani Pälli <tapani.palli@intel.com>
This commit is contained in:
@@ -801,6 +801,7 @@ dri2_setup_screen(_EGLDisplay *disp)
|
||||
}
|
||||
|
||||
disp->Extensions.KHR_image_base = EGL_TRUE;
|
||||
disp->Extensions.EXT_image_flush_external = EGL_TRUE;
|
||||
disp->Extensions.KHR_gl_renderbuffer_image = EGL_TRUE;
|
||||
if (dri2_dpy->image->base.version >= 5 &&
|
||||
dri2_dpy->image->createImageFromTexture) {
|
||||
@@ -3475,6 +3476,37 @@ dri2_interop_export_object(_EGLDisplay *disp, _EGLContext *ctx,
|
||||
return dri2_dpy->interop->export_object(dri2_ctx->dri_context, in, out);
|
||||
}
|
||||
|
||||
static void
|
||||
dri2_image_flush_external(_EGLDisplay *disp, _EGLContext *ctx,
|
||||
_EGLImage *image)
|
||||
{
|
||||
struct dri2_egl_display *dri2_dpy = dri2_egl_display(disp);
|
||||
struct dri2_egl_context *dri2_ctx = dri2_egl_context(ctx);
|
||||
struct dri2_egl_image *dri2_img = dri2_egl_image(image);
|
||||
|
||||
if (dri2_dpy->image->base.version < 18)
|
||||
return;
|
||||
|
||||
dri2_dpy->image->imageFlushExternal(dri2_ctx->dri_context,
|
||||
dri2_img->dri_image, 0);
|
||||
}
|
||||
|
||||
static void
|
||||
dri2_image_invalidate_external(_EGLDisplay *disp, _EGLContext *ctx,
|
||||
_EGLImage *image)
|
||||
{
|
||||
struct dri2_egl_display *dri2_dpy = dri2_egl_display(disp);
|
||||
struct dri2_egl_context *dri2_ctx = dri2_egl_context(ctx);
|
||||
struct dri2_egl_image *dri2_img = dri2_egl_image(image);
|
||||
|
||||
if (dri2_dpy->image->base.version < 18)
|
||||
return;
|
||||
|
||||
dri2_dpy->image->imageInvalidateExternal(dri2_ctx->dri_context,
|
||||
dri2_img->dri_image, 0);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* This is the main entrypoint into the driver, called by libEGL.
|
||||
* Gets an _EGLDriver object and init its dispatch table.
|
||||
@@ -3533,4 +3565,6 @@ _eglInitDriver(_EGLDriver *dri2_drv)
|
||||
dri2_drv->API.GLInteropExportObject = dri2_interop_export_object;
|
||||
dri2_drv->API.DupNativeFenceFDANDROID = dri2_dup_native_fence_fd;
|
||||
dri2_drv->API.SetBlobCacheFuncsANDROID = dri2_set_blob_cache_funcs;
|
||||
dri2_drv->API.ImageFlushExternal = dri2_image_flush_external;
|
||||
dri2_drv->API.ImageInvalidateExternal = dri2_image_invalidate_external;
|
||||
}
|
||||
|
@@ -1795,6 +1795,18 @@
|
||||
<param><ptype>EGLint</ptype> <name>external_win_id</name></param>
|
||||
<param><ptype>EGLint</ptype> <name>policy</name></param>
|
||||
</command>
|
||||
<command>
|
||||
<proto><ptype>EGLBoolean</ptype> <name>eglImageFlushExternalEXT</name></proto>
|
||||
<param><ptype>EGLDisplay</ptype> <name>dpy</name></param>
|
||||
<param><ptype>EGLImageKHR</ptype> <name>image</name></param>
|
||||
<param>const <ptype>EGLAttrib</ptype> *<name>attrib_list</name></param>
|
||||
</command>
|
||||
<command>
|
||||
<proto><ptype>EGLBoolean</ptype> <name>eglImageInvalidateExternalEXT</name></proto>
|
||||
<param><ptype>EGLDisplay</ptype> <name>dpy</name></param>
|
||||
<param><ptype>EGLImageKHR</ptype> <name>image</name></param>
|
||||
<param>const <ptype>EGLAttrib</ptype> *<name>attrib_list</name></param>
|
||||
</command>
|
||||
</commands>
|
||||
|
||||
<!-- SECTION: EGL API interface definitions. -->
|
||||
|
@@ -213,5 +213,7 @@ EGL_FUNCTIONS = (
|
||||
_eglFunc("eglGetDisplayDriverName", "display"),
|
||||
_eglFunc("eglGetDisplayDriverConfig", "display"),
|
||||
|
||||
_eglFunc("eglImageFlushExternalEXT", "display"),
|
||||
_eglFunc("eglImageInvalidateExternalEXT", "display"),
|
||||
)
|
||||
|
||||
|
@@ -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)
|
||||
{
|
||||
|
@@ -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
|
||||
|
@@ -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;
|
||||
|
@@ -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)
|
||||
|
Reference in New Issue
Block a user