}
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) {
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.
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;
}
<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. -->
_eglFunc("eglGetDisplayDriverName", "display"),
_eglFunc("eglGetDisplayDriverConfig", "display"),
+ _eglFunc("eglImageFlushExternalEXT", "display"),
+ _eglFunc("eglImageInvalidateExternalEXT", "display"),
)
_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);
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)
{
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
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;
EGL_ENTRYPOINT(eglGetSyncAttrib)
EGL_ENTRYPOINT(eglGetSyncAttribKHR)
EGL_ENTRYPOINT(eglGetSyncValuesCHROMIUM)
+EGL_ENTRYPOINT(eglImageFlushExternalEXT)
+EGL_ENTRYPOINT(eglImageInvalidateExternalEXT)
EGL_ENTRYPOINT(eglInitialize)
EGL_ENTRYPOINT(eglLabelObjectKHR)
EGL_ENTRYPOINT(eglMakeCurrent)