X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fegl%2Fdrivers%2Fdri2%2Fegl_dri2.c;h=b1df0cb1a9173f659690ed87ebc2f5e5a9604cc1;hb=8cb84c8477a57ed05d703669fee1770f31b76ae6;hp=83545bab2276abb722807b59b74c78a97bfab76c;hpb=f0d053cb6dda908d554d84629bd98e05d383a8f6;p=mesa.git diff --git a/src/egl/drivers/dri2/egl_dri2.c b/src/egl/drivers/dri2/egl_dri2.c index 83545bab227..b1df0cb1a91 100644 --- a/src/egl/drivers/dri2/egl_dri2.c +++ b/src/egl/drivers/dri2/egl_dri2.c @@ -25,8 +25,6 @@ * Kristian Høgsberg */ -#define WL_HIDE_DEPRECATED - #include #include #include @@ -64,6 +62,7 @@ #include "loader/loader.h" #include "util/u_atomic.h" #include "util/u_vector.h" +#include "mapi/glapi/glapi.h" /* The kernel header drm_fourcc.h defines the DRM formats below. We duplicate * some of the definitions here so that building Mesa won't bleeding-edge @@ -102,6 +101,26 @@ dri_set_background_context(void *loaderPrivate) _eglBindContextToThread(ctx, t); } +static void +dri2_gl_flush() +{ + static void (*glFlush)(void); + static mtx_t glFlushMutex = _MTX_INITIALIZER_NP; + + mtx_lock(&glFlushMutex); + if (!glFlush) + glFlush = _glapi_get_proc_address("glFlush"); + mtx_unlock(&glFlushMutex); + + /* if glFlush is not available things are horribly broken */ + if (!glFlush) { + _eglLog(_EGL_WARNING, "DRI2: failed to find glFlush entry point"); + return; + } + + glFlush(); +} + static GLboolean dri_is_thread_safe(void *loaderPrivate) { @@ -630,6 +649,18 @@ dri2_setup_screen(_EGLDisplay *disp) struct dri2_egl_display *dri2_dpy = dri2_egl_display(disp); unsigned int api_mask; + /* + * EGL 1.5 specification defines the default value to 1. Moreover, + * eglSwapInterval() is required to clamp requested value to the supported + * range. Since the default value is implicitly assumed to be supported, + * use it as both minimum and maximum for the platforms that do not allow + * changing the interval. Platforms, which allow it (e.g. x11, wayland) + * override these values already. + */ + dri2_dpy->min_swap_interval = 1; + dri2_dpy->max_swap_interval = 1; + dri2_dpy->default_swap_interval = 1; + if (dri2_dpy->image_driver) { api_mask = dri2_dpy->image_driver->getAPIMask(dri2_dpy->dri_screen); } else if (dri2_dpy->dri2) { @@ -905,17 +936,13 @@ dri2_initialize(_EGLDriver *drv, _EGLDisplay *disp) return EGL_FALSE; } - if (ret) { - dri2_dpy = dri2_egl_display(disp); - - if (!dri2_dpy) { - return EGL_FALSE; - } + if (!ret) + return EGL_FALSE; - dri2_dpy->ref_count++; - } + dri2_dpy = dri2_egl_display(disp); + dri2_dpy->ref_count++; - return ret; + return EGL_TRUE; } /** @@ -984,9 +1011,12 @@ dri2_display_destroy(_EGLDisplay *disp) zwp_linux_dmabuf_v1_destroy(dri2_dpy->wl_dmabuf); if (dri2_dpy->wl_shm) wl_shm_destroy(dri2_dpy->wl_shm); - wl_registry_destroy(dri2_dpy->wl_registry); - wl_event_queue_destroy(dri2_dpy->wl_queue); - wl_proxy_wrapper_destroy(dri2_dpy->wl_dpy_wrapper); + if (dri2_dpy->wl_registry) + wl_registry_destroy(dri2_dpy->wl_registry); + if (dri2_dpy->wl_queue) + wl_event_queue_destroy(dri2_dpy->wl_queue); + if (dri2_dpy->wl_dpy_wrapper) + wl_proxy_wrapper_destroy(dri2_dpy->wl_dpy_wrapper); u_vector_finish(&dri2_dpy->wl_modifiers.argb8888); u_vector_finish(&dri2_dpy->wl_modifiers.xrgb8888); u_vector_finish(&dri2_dpy->wl_modifiers.rgb565); @@ -1389,6 +1419,45 @@ dri2_destroy_context(_EGLDriver *drv, _EGLDisplay *disp, _EGLContext *ctx) return EGL_TRUE; } +EGLBoolean +dri2_init_surface(_EGLSurface *surf, _EGLDisplay *dpy, EGLint type, + _EGLConfig *conf, const EGLint *attrib_list, EGLBoolean enable_out_fence) +{ + struct dri2_egl_surface *dri2_surf = dri2_egl_surface(surf); + struct dri2_egl_display *dri2_dpy = dri2_egl_display(dpy); + + dri2_surf->out_fence_fd = -1; + dri2_surf->enable_out_fence = false; + if (dri2_dpy->fence && dri2_dpy->fence->base.version >= 2 && + dri2_dpy->fence->get_capabilities && + (dri2_dpy->fence->get_capabilities(dri2_dpy->dri_screen) & + __DRI_FENCE_CAP_NATIVE_FD)) { + dri2_surf->enable_out_fence = enable_out_fence; + } + + return _eglInitSurface(surf, dpy, type, conf, attrib_list); +} + +static void +dri2_surface_set_out_fence_fd( _EGLSurface *surf, int fence_fd) +{ + struct dri2_egl_surface *dri2_surf = dri2_egl_surface(surf); + + if (dri2_surf->out_fence_fd >= 0) + close(dri2_surf->out_fence_fd); + + dri2_surf->out_fence_fd = fence_fd; +} + +void +dri2_fini_surface(_EGLSurface *surf) +{ + struct dri2_egl_surface *dri2_surf = dri2_egl_surface(surf); + + dri2_surface_set_out_fence_fd(surf, -1); + dri2_surf->enable_out_fence = false; +} + static EGLBoolean dri2_destroy_surface(_EGLDriver *drv, _EGLDisplay *dpy, _EGLSurface *surf) { @@ -1400,6 +1469,28 @@ dri2_destroy_surface(_EGLDriver *drv, _EGLDisplay *dpy, _EGLSurface *surf) return dri2_dpy->vtbl->destroy_surface(drv, dpy, surf); } +static void +dri2_surf_update_fence_fd(_EGLContext *ctx, + _EGLDisplay *dpy, _EGLSurface *surf) +{ + __DRIcontext *dri_ctx = dri2_egl_context(ctx)->dri_context; + struct dri2_egl_display *dri2_dpy = dri2_egl_display(dpy); + struct dri2_egl_surface *dri2_surf = dri2_egl_surface(surf); + int fence_fd = -1; + void *fence; + + if (!dri2_surf->enable_out_fence) + return; + + fence = dri2_dpy->fence->create_fence_fd(dri_ctx, -1); + if (fence) { + fence_fd = dri2_dpy->fence->get_fence_fd(dri2_dpy->dri_screen, + fence); + dri2_dpy->fence->destroy_fence(dri2_dpy->dri_screen, fence); + } + dri2_surface_set_out_fence_fd(surf, fence_fd); +} + /** * Called via eglMakeCurrent(), drv->API.MakeCurrent(). */ @@ -1407,7 +1498,6 @@ static EGLBoolean dri2_make_current(_EGLDriver *drv, _EGLDisplay *disp, _EGLSurface *dsurf, _EGLSurface *rsurf, _EGLContext *ctx) { - struct dri2_egl_driver *dri2_drv = dri2_egl_driver(drv); struct dri2_egl_display *dri2_dpy = dri2_egl_display(disp); struct dri2_egl_context *dri2_ctx = dri2_egl_context(ctx); _EGLContext *old_ctx; @@ -1428,7 +1518,7 @@ dri2_make_current(_EGLDriver *drv, _EGLDisplay *disp, _EGLSurface *dsurf, /* flush before context switch */ if (old_ctx) - dri2_drv->glFlush(); + dri2_gl_flush(); ddraw = (dsurf) ? dri2_dpy->vtbl->get_dri_drawable(dsurf) : NULL; rdraw = (rsurf) ? dri2_dpy->vtbl->get_dri_drawable(rsurf) : NULL; @@ -1436,6 +1526,9 @@ dri2_make_current(_EGLDriver *drv, _EGLDisplay *disp, _EGLSurface *dsurf, if (old_ctx) { __DRIcontext *old_cctx = dri2_egl_context(old_ctx)->dri_context; + + if (old_dsurf) + dri2_surf_update_fence_fd(old_ctx, disp, old_dsurf); dri2_dpy->core->unbindContext(old_cctx); } @@ -1491,9 +1584,7 @@ dri2_surface_get_dri_drawable(_EGLSurface *surf) static _EGLProc dri2_get_proc_address(_EGLDriver *drv, const char *procname) { - struct dri2_egl_driver *dri2_drv = dri2_egl_driver(drv); - - return dri2_drv->get_proc_address(procname); + return _glapi_get_proc_address(procname); } static _EGLSurface* @@ -1574,6 +1665,10 @@ static EGLBoolean dri2_swap_buffers(_EGLDriver *drv, _EGLDisplay *dpy, _EGLSurface *surf) { struct dri2_egl_display *dri2_dpy = dri2_egl_display(dpy); + _EGLContext *ctx = _eglGetCurrentContext(); + + if (ctx && surf) + dri2_surf_update_fence_fd(ctx, dpy, surf); return dri2_dpy->vtbl->swap_buffers(drv, dpy, surf); } @@ -1583,6 +1678,10 @@ dri2_swap_buffers_with_damage(_EGLDriver *drv, _EGLDisplay *dpy, const EGLint *rects, EGLint n_rects) { struct dri2_egl_display *dri2_dpy = dri2_egl_display(dpy); + _EGLContext *ctx = _eglGetCurrentContext(); + + if (ctx && surf) + dri2_surf_update_fence_fd(ctx, dpy, surf); return dri2_dpy->vtbl->swap_buffers_with_damage(drv, dpy, surf, rects, n_rects); } @@ -1767,6 +1866,29 @@ dri2_create_image_from_dri(_EGLDisplay *disp, __DRIimage *dri_image) return &dri2_img->base; } +/** + * Translate a DRI Image extension error code into an EGL error code. + */ +static EGLint +egl_error_from_dri_image_error(int dri_error) +{ + switch (dri_error) { + case __DRI_IMAGE_ERROR_SUCCESS: + return EGL_SUCCESS; + case __DRI_IMAGE_ERROR_BAD_ALLOC: + return EGL_BAD_ALLOC; + case __DRI_IMAGE_ERROR_BAD_MATCH: + return EGL_BAD_MATCH; + case __DRI_IMAGE_ERROR_BAD_PARAMETER: + return EGL_BAD_PARAMETER; + case __DRI_IMAGE_ERROR_BAD_ACCESS: + return EGL_BAD_ACCESS; + default: + assert(0); + return EGL_BAD_ALLOC; + } +} + static _EGLImage * dri2_create_image_khr_renderbuffer(_EGLDisplay *disp, _EGLContext *ctx, EGLClientBuffer buffer, @@ -1787,9 +1909,27 @@ dri2_create_image_khr_renderbuffer(_EGLDisplay *disp, _EGLContext *ctx, return EGL_NO_IMAGE_KHR; } - dri_image = - dri2_dpy->image->createImageFromRenderbuffer(dri2_ctx->dri_context, - renderbuffer, NULL); + if (dri2_dpy->image->base.version >= 17 && + dri2_dpy->image->createImageFromRenderbuffer2) { + unsigned error = ~0; + + dri_image = dri2_dpy->image->createImageFromRenderbuffer2( + dri2_ctx->dri_context, renderbuffer, NULL, &error); + + assert(!!dri_image == (error == __DRI_IMAGE_ERROR_SUCCESS)); + + if (!dri_image) { + _eglError(egl_error_from_dri_image_error(error), "dri2_create_image_khr"); + return EGL_NO_IMAGE_KHR; + } + } else { + dri_image = dri2_dpy->image->createImageFromRenderbuffer( + dri2_ctx->dri_context, renderbuffer, NULL); + if (!dri_image) { + _eglError(EGL_BAD_ALLOC, "dri2_create_image_khr"); + return EGL_NO_IMAGE_KHR; + } + } return dri2_create_image_from_dri(disp, dri_image); } @@ -1869,35 +2009,10 @@ dri2_get_sync_values_chromium(_EGLDisplay *dpy, _EGLSurface *surf, static void dri2_create_image_khr_texture_error(int dri_error) { - EGLint egl_error; + EGLint egl_error = egl_error_from_dri_image_error(dri_error); - switch (dri_error) { - case __DRI_IMAGE_ERROR_SUCCESS: - return; - - case __DRI_IMAGE_ERROR_BAD_ALLOC: - egl_error = EGL_BAD_ALLOC; - break; - - case __DRI_IMAGE_ERROR_BAD_MATCH: - egl_error = EGL_BAD_MATCH; - break; - - case __DRI_IMAGE_ERROR_BAD_PARAMETER: - egl_error = EGL_BAD_PARAMETER; - break; - - case __DRI_IMAGE_ERROR_BAD_ACCESS: - egl_error = EGL_BAD_ACCESS; - break; - - default: - assert(0); - egl_error = EGL_BAD_MATCH; - break; - } - - _eglError(egl_error, "dri2_create_image_khr_texture"); + if (egl_error != EGL_SUCCESS) + _eglError(egl_error, "dri2_create_image_khr_texture"); } static _EGLImage * @@ -2649,17 +2764,16 @@ dri2_wl_release_buffer(void *user_data, struct wl_drm_buffer *buffer) dri2_dpy->image->destroyImage(buffer->driver_buffer); } -static struct wayland_drm_callbacks wl_drm_callbacks = { - .authenticate = NULL, - .reference_buffer = dri2_wl_reference_buffer, - .release_buffer = dri2_wl_release_buffer -}; - static EGLBoolean dri2_bind_wayland_display_wl(_EGLDriver *drv, _EGLDisplay *disp, struct wl_display *wl_dpy) { struct dri2_egl_display *dri2_dpy = dri2_egl_display(disp); + const struct wayland_drm_callbacks wl_drm_callbacks = { + .authenticate = (int(*)(void *, uint32_t)) dri2_dpy->vtbl->authenticate, + .reference_buffer = dri2_wl_reference_buffer, + .release_buffer = dri2_wl_release_buffer + }; int flags = 0; uint64_t cap; @@ -2668,9 +2782,6 @@ dri2_bind_wayland_display_wl(_EGLDriver *drv, _EGLDisplay *disp, if (dri2_dpy->wl_server_drm) return EGL_FALSE; - wl_drm_callbacks.authenticate = - (int(*)(void *, uint32_t)) dri2_dpy->vtbl->authenticate; - if (drmGetCap(dri2_dpy->fd, DRM_CAP_PRIME, &cap) == 0 && cap == (DRM_PRIME_CAP_IMPORT | DRM_PRIME_CAP_EXPORT) && dri2_dpy->image->base.version >= 7 && @@ -2931,7 +3042,6 @@ dri2_client_wait_sync(_EGLDriver *drv, _EGLDisplay *dpy, _EGLSync *sync, EGLint flags, EGLTime timeout) { _EGLContext *ctx = _eglGetCurrentContext(); - struct dri2_egl_driver *dri2_drv = dri2_egl_driver(drv); struct dri2_egl_display *dri2_dpy = dri2_egl_display(dpy); struct dri2_egl_context *dri2_ctx = dri2_egl_context(ctx); struct dri2_egl_sync *dri2_sync = dri2_egl_sync(sync); @@ -2970,7 +3080,7 @@ dri2_client_wait_sync(_EGLDriver *drv, _EGLDisplay *dpy, _EGLSync *sync, if (dri2_ctx && dri2_sync->base.SyncStatus == EGL_UNSIGNALED_KHR && (flags & EGL_SYNC_FLUSH_COMMANDS_BIT_KHR)) { /* flush context if EGL_SYNC_FLUSH_COMMANDS_BIT_KHR is set */ - dri2_drv->glFlush(); + dri2_gl_flush(); } /* if timeout is EGL_FOREVER_KHR, it should wait without any timeout.*/ @@ -3083,136 +3193,61 @@ dri2_interop_export_object(_EGLDisplay *dpy, _EGLContext *ctx, return dri2_dpy->interop->export_object(dri2_ctx->dri_context, in, out); } -static void -dri2_unload(_EGLDriver *drv) -{ - struct dri2_egl_driver *dri2_drv = dri2_egl_driver(drv); - - dlclose(dri2_drv->handle); - free(dri2_drv); -} - -static EGLBoolean -dri2_load(_EGLDriver *drv) -{ - struct dri2_egl_driver *dri2_drv = dri2_egl_driver(drv); -#ifdef HAVE_ANDROID_PLATFORM - const char *libname = "libglapi.so"; -#elif defined(__APPLE__) - const char *libname = "libglapi.0.dylib"; -#elif defined(__CYGWIN__) - const char *libname = "cygglapi-0.dll"; -#else - const char *libname = "libglapi.so.0"; -#endif - void *handle; - - /* RTLD_GLOBAL to make sure glapi symbols are visible to DRI drivers */ - handle = dlopen(libname, RTLD_LAZY | RTLD_GLOBAL); - if (!handle) { - _eglLog(_EGL_WARNING, "DRI2: failed to open glapi provider"); - goto no_handle; - } - - dri2_drv->get_proc_address = (_EGLProc (*)(const char *)) - dlsym(handle, "_glapi_get_proc_address"); - - /* if glapi is not available, loading DRI drivers will fail */ - if (!dri2_drv->get_proc_address) { - _eglLog(_EGL_WARNING, "DRI2: failed to find _glapi_get_proc_address"); - goto no_symbol; - } - - dri2_drv->glFlush = (void (*)(void)) - dri2_drv->get_proc_address("glFlush"); - - /* if glFlush is not available things are horribly broken */ - if (!dri2_drv->glFlush) { - _eglLog(_EGL_WARNING, "DRI2: failed to find glFlush entry point"); - goto no_symbol; - } - - dri2_drv->handle = handle; - return EGL_TRUE; - -no_symbol: - dlclose(handle); -no_handle: - return EGL_FALSE; -} - /** * This is the main entrypoint into the driver, called by libEGL. - * Create a new _EGLDriver object and init its dispatch table. + * Gets an _EGLDriver object and init its dispatch table. */ -_EGLDriver * -_eglBuiltInDriverDRI2(const char *args) -{ - struct dri2_egl_driver *dri2_drv; - - (void) args; - - dri2_drv = calloc(1, sizeof *dri2_drv); - if (!dri2_drv) - return NULL; - - if (!dri2_load(&dri2_drv->base)) { - free(dri2_drv); - return NULL; - } - - _eglInitDriverFallbacks(&dri2_drv->base); - dri2_drv->base.API.Initialize = dri2_initialize; - dri2_drv->base.API.Terminate = dri2_terminate; - dri2_drv->base.API.CreateContext = dri2_create_context; - dri2_drv->base.API.DestroyContext = dri2_destroy_context; - dri2_drv->base.API.MakeCurrent = dri2_make_current; - dri2_drv->base.API.CreateWindowSurface = dri2_create_window_surface; - dri2_drv->base.API.CreatePixmapSurface = dri2_create_pixmap_surface; - dri2_drv->base.API.CreatePbufferSurface = dri2_create_pbuffer_surface; - dri2_drv->base.API.DestroySurface = dri2_destroy_surface; - dri2_drv->base.API.GetProcAddress = dri2_get_proc_address; - dri2_drv->base.API.WaitClient = dri2_wait_client; - dri2_drv->base.API.WaitNative = dri2_wait_native; - dri2_drv->base.API.BindTexImage = dri2_bind_tex_image; - dri2_drv->base.API.ReleaseTexImage = dri2_release_tex_image; - dri2_drv->base.API.SwapInterval = dri2_swap_interval; - dri2_drv->base.API.SwapBuffers = dri2_swap_buffers; - dri2_drv->base.API.SwapBuffersWithDamageEXT = dri2_swap_buffers_with_damage; - dri2_drv->base.API.SwapBuffersRegionNOK = dri2_swap_buffers_region; - dri2_drv->base.API.SetDamageRegion = dri2_set_damage_region; - dri2_drv->base.API.PostSubBufferNV = dri2_post_sub_buffer; - dri2_drv->base.API.CopyBuffers = dri2_copy_buffers, - dri2_drv->base.API.QueryBufferAge = dri2_query_buffer_age; - dri2_drv->base.API.CreateImageKHR = dri2_create_image; - dri2_drv->base.API.DestroyImageKHR = dri2_destroy_image_khr; - dri2_drv->base.API.CreateWaylandBufferFromImageWL = dri2_create_wayland_buffer_from_image; - dri2_drv->base.API.QuerySurface = dri2_query_surface; +void +_eglInitDriver(_EGLDriver *dri2_drv) +{ + dri2_drv->API.Initialize = dri2_initialize; + dri2_drv->API.Terminate = dri2_terminate; + dri2_drv->API.CreateContext = dri2_create_context; + dri2_drv->API.DestroyContext = dri2_destroy_context; + dri2_drv->API.MakeCurrent = dri2_make_current; + dri2_drv->API.CreateWindowSurface = dri2_create_window_surface; + dri2_drv->API.CreatePixmapSurface = dri2_create_pixmap_surface; + dri2_drv->API.CreatePbufferSurface = dri2_create_pbuffer_surface; + dri2_drv->API.DestroySurface = dri2_destroy_surface; + dri2_drv->API.GetProcAddress = dri2_get_proc_address; + dri2_drv->API.WaitClient = dri2_wait_client; + dri2_drv->API.WaitNative = dri2_wait_native; + dri2_drv->API.BindTexImage = dri2_bind_tex_image; + dri2_drv->API.ReleaseTexImage = dri2_release_tex_image; + dri2_drv->API.SwapInterval = dri2_swap_interval; + dri2_drv->API.SwapBuffers = dri2_swap_buffers; + dri2_drv->API.SwapBuffersWithDamageEXT = dri2_swap_buffers_with_damage; + dri2_drv->API.SwapBuffersRegionNOK = dri2_swap_buffers_region; + dri2_drv->API.SetDamageRegion = dri2_set_damage_region; + dri2_drv->API.PostSubBufferNV = dri2_post_sub_buffer; + dri2_drv->API.CopyBuffers = dri2_copy_buffers, + dri2_drv->API.QueryBufferAge = dri2_query_buffer_age; + dri2_drv->API.CreateImageKHR = dri2_create_image; + dri2_drv->API.DestroyImageKHR = dri2_destroy_image_khr; + dri2_drv->API.CreateWaylandBufferFromImageWL = dri2_create_wayland_buffer_from_image; + dri2_drv->API.QuerySurface = dri2_query_surface; #ifdef HAVE_LIBDRM - dri2_drv->base.API.CreateDRMImageMESA = dri2_create_drm_image_mesa; - dri2_drv->base.API.ExportDRMImageMESA = dri2_export_drm_image_mesa; - dri2_drv->base.API.ExportDMABUFImageQueryMESA = dri2_export_dma_buf_image_query_mesa; - dri2_drv->base.API.ExportDMABUFImageMESA = dri2_export_dma_buf_image_mesa; - dri2_drv->base.API.QueryDmaBufFormatsEXT = dri2_query_dma_buf_formats; - dri2_drv->base.API.QueryDmaBufModifiersEXT = dri2_query_dma_buf_modifiers; + dri2_drv->API.CreateDRMImageMESA = dri2_create_drm_image_mesa; + dri2_drv->API.ExportDRMImageMESA = dri2_export_drm_image_mesa; + dri2_drv->API.ExportDMABUFImageQueryMESA = dri2_export_dma_buf_image_query_mesa; + dri2_drv->API.ExportDMABUFImageMESA = dri2_export_dma_buf_image_mesa; + dri2_drv->API.QueryDmaBufFormatsEXT = dri2_query_dma_buf_formats; + dri2_drv->API.QueryDmaBufModifiersEXT = dri2_query_dma_buf_modifiers; #endif #ifdef HAVE_WAYLAND_PLATFORM - dri2_drv->base.API.BindWaylandDisplayWL = dri2_bind_wayland_display_wl; - dri2_drv->base.API.UnbindWaylandDisplayWL = dri2_unbind_wayland_display_wl; - dri2_drv->base.API.QueryWaylandBufferWL = dri2_query_wayland_buffer_wl; + dri2_drv->API.BindWaylandDisplayWL = dri2_bind_wayland_display_wl; + dri2_drv->API.UnbindWaylandDisplayWL = dri2_unbind_wayland_display_wl; + dri2_drv->API.QueryWaylandBufferWL = dri2_query_wayland_buffer_wl; #endif - dri2_drv->base.API.GetSyncValuesCHROMIUM = dri2_get_sync_values_chromium; - dri2_drv->base.API.CreateSyncKHR = dri2_create_sync; - dri2_drv->base.API.ClientWaitSyncKHR = dri2_client_wait_sync; - dri2_drv->base.API.SignalSyncKHR = dri2_signal_sync; - dri2_drv->base.API.WaitSyncKHR = dri2_server_wait_sync; - dri2_drv->base.API.DestroySyncKHR = dri2_destroy_sync; - dri2_drv->base.API.GLInteropQueryDeviceInfo = dri2_interop_query_device_info; - dri2_drv->base.API.GLInteropExportObject = dri2_interop_export_object; - dri2_drv->base.API.DupNativeFenceFDANDROID = dri2_dup_native_fence_fd; - - dri2_drv->base.Name = "DRI2"; - dri2_drv->base.Unload = dri2_unload; - - return &dri2_drv->base; + dri2_drv->API.GetSyncValuesCHROMIUM = dri2_get_sync_values_chromium; + dri2_drv->API.CreateSyncKHR = dri2_create_sync; + dri2_drv->API.ClientWaitSyncKHR = dri2_client_wait_sync; + dri2_drv->API.SignalSyncKHR = dri2_signal_sync; + dri2_drv->API.WaitSyncKHR = dri2_server_wait_sync; + dri2_drv->API.DestroySyncKHR = dri2_destroy_sync; + 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->Name = "DRI2"; }