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>tags/18.1-branchpoint
@@ -458,6 +458,7 @@ static const struct dri2_extension_match optional_core_extensions[] = { | |||
{ __DRI2_INTEROP, 1, offsetof(struct dri2_egl_display, interop) }, | |||
{ __DRI_IMAGE, 1, offsetof(struct dri2_egl_display, image) }, | |||
{ __DRI2_FLUSH_CONTROL, 1, offsetof(struct dri2_egl_display, flush_control) }, | |||
{ __DRI2_BLOB, 1, offsetof(struct dri2_egl_display, blob) }, | |||
{ 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; | |||
if (dri2_dpy->image) { | |||
@@ -3016,6 +3020,17 @@ dri2_dup_native_fence_fd(_EGLDriver *drv, _EGLDisplay *dpy, _EGLSync *sync) | |||
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 | |||
dri2_client_wait_sync(_EGLDriver *drv, _EGLDisplay *dpy, _EGLSync *sync, | |||
EGLint flags, EGLTime timeout) | |||
@@ -3234,6 +3249,7 @@ _eglBuiltInDriver(void) | |||
dri2_drv->API.GLInteropQueryDeviceInfo = dri2_interop_query_device_info; | |||
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->Name = "DRI2"; | |||
@@ -171,6 +171,7 @@ struct dri2_egl_display | |||
const __DRInoErrorExtension *no_error; | |||
const __DRI2configQueryExtension *config; | |||
const __DRI2fenceExtension *fence; | |||
const __DRI2blobExtension *blob; | |||
const __DRI2rendererQueryExtension *rendererQuery; | |||
const __DRI2interopExtension *interop; | |||
int fd; |
@@ -476,6 +476,7 @@ _eglCreateExtensionsString(_EGLDisplay *dpy) | |||
char *exts = dpy->ExtensionsString; | |||
/* Please keep these sorted alphabetically. */ | |||
_EGL_CHECK_EXTENSION(ANDROID_blob_cache); | |||
_EGL_CHECK_EXTENSION(ANDROID_framebuffer_target); | |||
_EGL_CHECK_EXTENSION(ANDROID_image_native_buffer); | |||
_EGL_CHECK_EXTENSION(ANDROID_native_fence_sync); | |||
@@ -2522,6 +2523,49 @@ eglQueryDmaBufModifiersEXT(EGLDisplay dpy, EGLint format, EGLint max_modifiers, | |||
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 | |||
eglGetProcAddress(const char *procname) | |||
{ |
@@ -209,6 +209,10 @@ struct _egl_api | |||
EGLuint64KHR *modifiers, | |||
EGLBoolean *external_only, | |||
EGLint *num_modifiers); | |||
void (*SetBlobCacheFuncsANDROID) (_EGLDriver *drv, _EGLDisplay *dpy, | |||
EGLSetBlobFuncANDROID set, | |||
EGLGetBlobFuncANDROID get); | |||
}; | |||
#ifdef __cplusplus |
@@ -92,6 +92,7 @@ struct _egl_resource | |||
struct _egl_extensions | |||
{ | |||
/* Please keep these sorted alphabetically. */ | |||
EGLBoolean ANDROID_blob_cache; | |||
EGLBoolean ANDROID_framebuffer_target; | |||
EGLBoolean ANDROID_image_native_buffer; | |||
EGLBoolean ANDROID_native_fence_sync; | |||
@@ -181,6 +182,9 @@ struct _egl_display | |||
_EGLResource *ResourceLists[_EGL_NUM_RESOURCES]; | |||
EGLLabelKHR Label; | |||
EGLSetBlobFuncANDROID BlobCacheSet; | |||
EGLGetBlobFuncANDROID BlobCacheGet; | |||
}; | |||
@@ -63,6 +63,7 @@ EGL_ENTRYPOINT(eglQuerySurface) | |||
EGL_ENTRYPOINT(eglQueryWaylandBufferWL) | |||
EGL_ENTRYPOINT(eglReleaseTexImage) | |||
EGL_ENTRYPOINT(eglReleaseThread) | |||
EGL_ENTRYPOINT(eglSetBlobCacheFuncsANDROID) | |||
EGL_ENTRYPOINT(eglSetDamageRegionKHR) | |||
EGL_ENTRYPOINT(eglSignalSyncKHR) | |||
EGL_ENTRYPOINT(eglSurfaceAttrib) |