static _EGLProc egl_g3d_get_proc_address(_EGLDriver *drv, const char *procname) { struct egl_g3d_driver *gdrv = egl_g3d_driver(drv); struct st_api *stapi = NULL; if (procname && procname[0] == 'v' && procname[1] == 'g') stapi = gdrv->loader->get_st_api(ST_API_OPENVG); else if (procname && procname[0] == 'g' && procname[1] == 'l') stapi = gdrv->loader->get_st_api(ST_API_OPENGL); return (_EGLProc) ((stapi) ? stapi->get_proc_address(stapi, procname) : NULL); }
/** * Get the native platform. */ static const struct native_platform * egl_g3d_get_platform(_EGLDriver *drv, _EGLPlatformType plat) { struct egl_g3d_driver *gdrv = egl_g3d_driver(drv); if (!gdrv->platforms[plat]) { const char *plat_name = NULL; const struct native_platform *nplat = NULL; plat_name = "DRM"; nplat = native_get_drm_platform(&egl_g3d_native_event_handler); if (!nplat) _eglLog(_EGL_WARNING, "unsupported platform %s", plat_name); gdrv->platforms[plat] = nplat; } return gdrv->platforms[plat]; }
/** * Get the native platform. */ static const struct native_platform * egl_g3d_get_platform(_EGLDriver *drv, _EGLPlatformType plat) { struct egl_g3d_driver *gdrv = egl_g3d_driver(drv); if (!gdrv->platforms[plat]) { const char *plat_name = NULL; const struct native_platform *nplat = NULL; switch (plat) { case _EGL_PLATFORM_WINDOWS: plat_name = "Windows"; #ifdef HAVE_GDI_BACKEND nplat = native_get_gdi_platform(&egl_g3d_native_event_handler); #endif break; case _EGL_PLATFORM_X11: plat_name = "X11"; #ifdef HAVE_X11_BACKEND nplat = native_get_x11_platform(&egl_g3d_native_event_handler); #endif break; case _EGL_PLATFORM_WAYLAND: plat_name = "wayland"; #ifdef HAVE_WAYLAND_BACKEND nplat = native_get_wayland_platform(&egl_g3d_native_event_handler); #endif break; case _EGL_PLATFORM_DRM: plat_name = "DRM"; #ifdef HAVE_DRM_BACKEND nplat = native_get_drm_platform(&egl_g3d_native_event_handler); #endif break; case _EGL_PLATFORM_FBDEV: plat_name = "FBDEV"; #ifdef HAVE_FBDEV_BACKEND nplat = native_get_fbdev_platform(&egl_g3d_native_event_handler); #endif break; case _EGL_PLATFORM_NULL: plat_name = "NULL"; #ifdef HAVE_NULL_BACKEND nplat = native_get_null_platform(&egl_g3d_native_event_handler); #endif break; case _EGL_PLATFORM_ANDROID: plat_name = "Android"; #ifdef HAVE_ANDROID_BACKEND nplat = native_get_android_platform(&egl_g3d_native_event_handler); #endif break; default: break; } if (!nplat) _eglLog(_EGL_WARNING, "unsupported platform %s", plat_name); gdrv->platforms[plat] = nplat; } return gdrv->platforms[plat]; }
void egl_g3d_destroy_driver(_EGLDriver *drv) { struct egl_g3d_driver *gdrv = egl_g3d_driver(drv); FREE(gdrv); }
static EGLBoolean egl_g3d_initialize(_EGLDriver *drv, _EGLDisplay *dpy) { struct egl_g3d_driver *gdrv = egl_g3d_driver(drv); struct egl_g3d_display *gdpy; const struct native_platform *nplat; nplat = egl_g3d_get_platform(drv, dpy->Platform); if (!nplat) return EGL_FALSE; if (dpy->Options.TestOnly) return EGL_TRUE; gdpy = CALLOC_STRUCT(egl_g3d_display); if (!gdpy) { _eglError(EGL_BAD_ALLOC, "eglInitialize"); goto fail; } gdpy->loader = gdrv->loader; dpy->DriverData = gdpy; _eglLog(_EGL_INFO, "use %s for display %p", nplat->name, dpy->PlatformDisplay); gdpy->native = nplat->create_display(dpy->PlatformDisplay, dpy->Options.UseFallback); if (!gdpy->native) { _eglError(EGL_NOT_INITIALIZED, "eglInitialize(no usable display)"); goto fail; } gdpy->native->user_data = (void *) dpy; if (!gdpy->native->init_screen(gdpy->native)) { _eglError(EGL_NOT_INITIALIZED, "eglInitialize(failed to initialize screen)"); goto fail; } if (gdpy->loader->profile_masks[ST_API_OPENGL] & ST_PROFILE_DEFAULT_MASK) dpy->ClientAPIs |= EGL_OPENGL_BIT; if (gdpy->loader->profile_masks[ST_API_OPENGL] & ST_PROFILE_OPENGL_ES1_MASK) dpy->ClientAPIs |= EGL_OPENGL_ES_BIT; if (gdpy->loader->profile_masks[ST_API_OPENGL] & ST_PROFILE_OPENGL_ES2_MASK) dpy->ClientAPIs |= EGL_OPENGL_ES2_BIT; if (gdpy->loader->profile_masks[ST_API_OPENVG] & ST_PROFILE_DEFAULT_MASK) dpy->ClientAPIs |= EGL_OPENVG_BIT; gdpy->smapi = egl_g3d_create_st_manager(dpy); if (!gdpy->smapi) { _eglError(EGL_NOT_INITIALIZED, "eglInitialize(failed to create st manager)"); goto fail; } #ifdef EGL_MESA_screen_surface /* enable MESA_screen_surface before adding (and validating) configs */ if (gdpy->native->modeset) { dpy->Extensions.MESA_screen_surface = EGL_TRUE; egl_g3d_add_screens(drv, dpy); } #endif dpy->Extensions.KHR_image_base = EGL_TRUE; if (gdpy->native->get_param(gdpy->native, NATIVE_PARAM_USE_NATIVE_BUFFER)) dpy->Extensions.KHR_image_pixmap = EGL_TRUE; dpy->Extensions.KHR_reusable_sync = EGL_TRUE; dpy->Extensions.KHR_fence_sync = EGL_TRUE; dpy->Extensions.KHR_surfaceless_context = EGL_TRUE; if (dpy->Platform == _EGL_PLATFORM_DRM) { dpy->Extensions.MESA_drm_display = EGL_TRUE; if (gdpy->native->buffer) dpy->Extensions.MESA_drm_image = EGL_TRUE; } if (dpy->Platform == _EGL_PLATFORM_WAYLAND && gdpy->native->buffer) dpy->Extensions.MESA_drm_image = EGL_TRUE; #ifdef EGL_ANDROID_image_native_buffer if (dpy->Platform == _EGL_PLATFORM_ANDROID && gdpy->native->buffer) dpy->Extensions.ANDROID_image_native_buffer = EGL_TRUE; #endif #ifdef EGL_WL_bind_wayland_display if (gdpy->native->wayland_bufmgr) dpy->Extensions.WL_bind_wayland_display = EGL_TRUE; #endif if (gdpy->native->get_param(gdpy->native, NATIVE_PARAM_PRESENT_REGION) && gdpy->native->get_param(gdpy->native, NATIVE_PARAM_PRESERVE_BUFFER)) { #ifdef EGL_NOK_swap_region dpy->Extensions.NOK_swap_region = EGL_TRUE; #endif dpy->Extensions.NV_post_sub_buffer = EGL_TRUE; } if (egl_g3d_add_configs(drv, dpy, 1) == 1) { _eglError(EGL_NOT_INITIALIZED, "eglInitialize(unable to add configs)"); goto fail; } dpy->VersionMajor = 1; dpy->VersionMinor = 4; return EGL_TRUE; fail: if (gdpy) egl_g3d_terminate(drv, dpy); return EGL_FALSE; }