egl: add support for EGL_ANDROID_blob_cache
v2: cleanup, move callbacks to _egl_display struct (Emil Velikov) adapt to earlier ctx->screen changes v3: remove useless checking, add _eglSetFuncName (Emil Velikov) Signed-off-by: Tapani Pälli <tapani.palli@intel.com> Reviewed-by: Jordan Justen <jordan.l.justen@intel.com> (v2) Reviewed-by: Emil Velikov <emil.velikov@collabora.com>
This commit is contained in:
parent
cf4569da6b
commit
6f5b57093b
|
@ -458,6 +458,7 @@ static const struct dri2_extension_match optional_core_extensions[] = {
|
||||||
{ __DRI2_INTEROP, 1, offsetof(struct dri2_egl_display, interop) },
|
{ __DRI2_INTEROP, 1, offsetof(struct dri2_egl_display, interop) },
|
||||||
{ __DRI_IMAGE, 1, offsetof(struct dri2_egl_display, image) },
|
{ __DRI_IMAGE, 1, offsetof(struct dri2_egl_display, image) },
|
||||||
{ __DRI2_FLUSH_CONTROL, 1, offsetof(struct dri2_egl_display, flush_control) },
|
{ __DRI2_FLUSH_CONTROL, 1, offsetof(struct dri2_egl_display, flush_control) },
|
||||||
|
{ __DRI2_BLOB, 1, offsetof(struct dri2_egl_display, blob) },
|
||||||
{ NULL, 0, 0 }
|
{ NULL, 0, 0 }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -727,6 +728,9 @@ dri2_setup_screen(_EGLDisplay *disp)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (dri2_dpy->blob)
|
||||||
|
disp->Extensions.ANDROID_blob_cache = EGL_TRUE;
|
||||||
|
|
||||||
disp->Extensions.KHR_reusable_sync = EGL_TRUE;
|
disp->Extensions.KHR_reusable_sync = EGL_TRUE;
|
||||||
|
|
||||||
if (dri2_dpy->image) {
|
if (dri2_dpy->image) {
|
||||||
|
@ -3016,6 +3020,17 @@ dri2_dup_native_fence_fd(_EGLDriver *drv, _EGLDisplay *dpy, _EGLSync *sync)
|
||||||
return dup(sync->SyncFd);
|
return dup(sync->SyncFd);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
dri2_set_blob_cache_funcs(_EGLDriver *drv, _EGLDisplay *dpy,
|
||||||
|
EGLSetBlobFuncANDROID set,
|
||||||
|
EGLGetBlobFuncANDROID get)
|
||||||
|
{
|
||||||
|
struct dri2_egl_display *dri2_dpy = dri2_egl_display(dpy);
|
||||||
|
dri2_dpy->blob->set_cache_funcs(dri2_dpy->dri_screen,
|
||||||
|
dpy->BlobCacheSet,
|
||||||
|
dpy->BlobCacheGet);
|
||||||
|
}
|
||||||
|
|
||||||
static EGLint
|
static EGLint
|
||||||
dri2_client_wait_sync(_EGLDriver *drv, _EGLDisplay *dpy, _EGLSync *sync,
|
dri2_client_wait_sync(_EGLDriver *drv, _EGLDisplay *dpy, _EGLSync *sync,
|
||||||
EGLint flags, EGLTime timeout)
|
EGLint flags, EGLTime timeout)
|
||||||
|
@ -3234,6 +3249,7 @@ _eglBuiltInDriver(void)
|
||||||
dri2_drv->API.GLInteropQueryDeviceInfo = dri2_interop_query_device_info;
|
dri2_drv->API.GLInteropQueryDeviceInfo = dri2_interop_query_device_info;
|
||||||
dri2_drv->API.GLInteropExportObject = dri2_interop_export_object;
|
dri2_drv->API.GLInteropExportObject = dri2_interop_export_object;
|
||||||
dri2_drv->API.DupNativeFenceFDANDROID = dri2_dup_native_fence_fd;
|
dri2_drv->API.DupNativeFenceFDANDROID = dri2_dup_native_fence_fd;
|
||||||
|
dri2_drv->API.SetBlobCacheFuncsANDROID = dri2_set_blob_cache_funcs;
|
||||||
|
|
||||||
dri2_drv->Name = "DRI2";
|
dri2_drv->Name = "DRI2";
|
||||||
|
|
||||||
|
|
|
@ -171,6 +171,7 @@ struct dri2_egl_display
|
||||||
const __DRInoErrorExtension *no_error;
|
const __DRInoErrorExtension *no_error;
|
||||||
const __DRI2configQueryExtension *config;
|
const __DRI2configQueryExtension *config;
|
||||||
const __DRI2fenceExtension *fence;
|
const __DRI2fenceExtension *fence;
|
||||||
|
const __DRI2blobExtension *blob;
|
||||||
const __DRI2rendererQueryExtension *rendererQuery;
|
const __DRI2rendererQueryExtension *rendererQuery;
|
||||||
const __DRI2interopExtension *interop;
|
const __DRI2interopExtension *interop;
|
||||||
int fd;
|
int fd;
|
||||||
|
|
|
@ -476,6 +476,7 @@ _eglCreateExtensionsString(_EGLDisplay *dpy)
|
||||||
char *exts = dpy->ExtensionsString;
|
char *exts = dpy->ExtensionsString;
|
||||||
|
|
||||||
/* Please keep these sorted alphabetically. */
|
/* Please keep these sorted alphabetically. */
|
||||||
|
_EGL_CHECK_EXTENSION(ANDROID_blob_cache);
|
||||||
_EGL_CHECK_EXTENSION(ANDROID_framebuffer_target);
|
_EGL_CHECK_EXTENSION(ANDROID_framebuffer_target);
|
||||||
_EGL_CHECK_EXTENSION(ANDROID_image_native_buffer);
|
_EGL_CHECK_EXTENSION(ANDROID_image_native_buffer);
|
||||||
_EGL_CHECK_EXTENSION(ANDROID_native_fence_sync);
|
_EGL_CHECK_EXTENSION(ANDROID_native_fence_sync);
|
||||||
|
@ -2522,6 +2523,49 @@ eglQueryDmaBufModifiersEXT(EGLDisplay dpy, EGLint format, EGLint max_modifiers,
|
||||||
RETURN_EGL_EVAL(disp, ret);
|
RETURN_EGL_EVAL(disp, ret);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void EGLAPIENTRY
|
||||||
|
eglSetBlobCacheFuncsANDROID(EGLDisplay *dpy, EGLSetBlobFuncANDROID set,
|
||||||
|
EGLGetBlobFuncANDROID get)
|
||||||
|
{
|
||||||
|
/* This function does not return anything so we cannot
|
||||||
|
* utilize the helper macros _EGL_FUNC_START or _EGL_CHECK_DISPLAY.
|
||||||
|
*/
|
||||||
|
_EGLDisplay *disp = _eglLockDisplay(dpy);
|
||||||
|
if (!_eglSetFuncName(__func__, disp, EGL_OBJECT_DISPLAY_KHR, NULL)) {
|
||||||
|
if (disp)
|
||||||
|
_eglUnlockDisplay(disp);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
_EGLDriver *drv = _eglCheckDisplay(disp, __func__);
|
||||||
|
if (!drv) {
|
||||||
|
if (disp)
|
||||||
|
_eglUnlockDisplay(disp);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!set || !get) {
|
||||||
|
_eglError(EGL_BAD_PARAMETER,
|
||||||
|
"eglSetBlobCacheFuncsANDROID: NULL handler given");
|
||||||
|
_eglUnlockDisplay(disp);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (disp->BlobCacheSet) {
|
||||||
|
_eglError(EGL_BAD_PARAMETER,
|
||||||
|
"eglSetBlobCacheFuncsANDROID: functions already set");
|
||||||
|
_eglUnlockDisplay(disp);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
disp->BlobCacheSet = set;
|
||||||
|
disp->BlobCacheGet = get;
|
||||||
|
|
||||||
|
drv->API.SetBlobCacheFuncsANDROID(drv, disp, set, get);
|
||||||
|
|
||||||
|
_eglUnlockDisplay(disp);
|
||||||
|
}
|
||||||
|
|
||||||
__eglMustCastToProperFunctionPointerType EGLAPIENTRY
|
__eglMustCastToProperFunctionPointerType EGLAPIENTRY
|
||||||
eglGetProcAddress(const char *procname)
|
eglGetProcAddress(const char *procname)
|
||||||
{
|
{
|
||||||
|
|
|
@ -209,6 +209,10 @@ struct _egl_api
|
||||||
EGLuint64KHR *modifiers,
|
EGLuint64KHR *modifiers,
|
||||||
EGLBoolean *external_only,
|
EGLBoolean *external_only,
|
||||||
EGLint *num_modifiers);
|
EGLint *num_modifiers);
|
||||||
|
|
||||||
|
void (*SetBlobCacheFuncsANDROID) (_EGLDriver *drv, _EGLDisplay *dpy,
|
||||||
|
EGLSetBlobFuncANDROID set,
|
||||||
|
EGLGetBlobFuncANDROID get);
|
||||||
};
|
};
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
|
|
|
@ -92,6 +92,7 @@ struct _egl_resource
|
||||||
struct _egl_extensions
|
struct _egl_extensions
|
||||||
{
|
{
|
||||||
/* Please keep these sorted alphabetically. */
|
/* Please keep these sorted alphabetically. */
|
||||||
|
EGLBoolean ANDROID_blob_cache;
|
||||||
EGLBoolean ANDROID_framebuffer_target;
|
EGLBoolean ANDROID_framebuffer_target;
|
||||||
EGLBoolean ANDROID_image_native_buffer;
|
EGLBoolean ANDROID_image_native_buffer;
|
||||||
EGLBoolean ANDROID_native_fence_sync;
|
EGLBoolean ANDROID_native_fence_sync;
|
||||||
|
@ -181,6 +182,9 @@ struct _egl_display
|
||||||
_EGLResource *ResourceLists[_EGL_NUM_RESOURCES];
|
_EGLResource *ResourceLists[_EGL_NUM_RESOURCES];
|
||||||
|
|
||||||
EGLLabelKHR Label;
|
EGLLabelKHR Label;
|
||||||
|
|
||||||
|
EGLSetBlobFuncANDROID BlobCacheSet;
|
||||||
|
EGLGetBlobFuncANDROID BlobCacheGet;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -63,6 +63,7 @@ EGL_ENTRYPOINT(eglQuerySurface)
|
||||||
EGL_ENTRYPOINT(eglQueryWaylandBufferWL)
|
EGL_ENTRYPOINT(eglQueryWaylandBufferWL)
|
||||||
EGL_ENTRYPOINT(eglReleaseTexImage)
|
EGL_ENTRYPOINT(eglReleaseTexImage)
|
||||||
EGL_ENTRYPOINT(eglReleaseThread)
|
EGL_ENTRYPOINT(eglReleaseThread)
|
||||||
|
EGL_ENTRYPOINT(eglSetBlobCacheFuncsANDROID)
|
||||||
EGL_ENTRYPOINT(eglSetDamageRegionKHR)
|
EGL_ENTRYPOINT(eglSetDamageRegionKHR)
|
||||||
EGL_ENTRYPOINT(eglSignalSyncKHR)
|
EGL_ENTRYPOINT(eglSignalSyncKHR)
|
||||||
EGL_ENTRYPOINT(eglSurfaceAttrib)
|
EGL_ENTRYPOINT(eglSurfaceAttrib)
|
||||||
|
|
Loading…
Reference in New Issue