1f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* 2f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Mesa 3-D graphics library 3f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Version: 7.8 4f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 5f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Copyright (C) 2009-2010 Chia-I Wu <olv@0xlab.org> 6f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 7f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Permission is hereby granted, free of charge, to any person obtaining a 8f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * copy of this software and associated documentation files (the "Software"), 9f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * to deal in the Software without restriction, including without limitation 10f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * the rights to use, copy, modify, merge, publish, distribute, sublicense, 11f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * and/or sell copies of the Software, and to permit persons to whom the 12f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Software is furnished to do so, subject to the following conditions: 13f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 14f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The above copyright notice and this permission notice shall be included 15f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * in all copies or substantial portions of the Software. 16f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 17f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 18f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 19f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 20f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 21f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 22f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 23f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * DEALINGS IN THE SOFTWARE. 24f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 25f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 26f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "egldriver.h" 27f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "eglcurrent.h" 28f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "egllog.h" 29f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 30f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "pipe/p_screen.h" 31f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_memory.h" 32f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_format.h" 33f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_string.h" 34f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_atomic.h" 35f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 36f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "egl_g3d.h" 37f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "egl_g3d_api.h" 38f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "egl_g3d_st.h" 39f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "egl_g3d_loader.h" 40f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "native.h" 41f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 42f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 43f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgegl_g3d_invalid_surface(struct native_display *ndpy, 44f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct native_surface *nsurf, 45f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned int seq_num) 46f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 47f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* XXX not thread safe? */ 48f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct egl_g3d_surface *gsurf = egl_g3d_surface(nsurf->user_data); 49f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 50f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (gsurf && gsurf->stfbi) 51f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org p_atomic_inc(&gsurf->stfbi->stamp); 52f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 53f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 54f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic struct pipe_screen * 55f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgegl_g3d_new_drm_screen(struct native_display *ndpy, const char *name, int fd) 56f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 57f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _EGLDisplay *dpy = (_EGLDisplay *) ndpy->user_data; 58f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct egl_g3d_display *gdpy = egl_g3d_display(dpy); 59f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return gdpy->loader->create_drm_screen(name, fd); 60f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 61f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 62f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic struct pipe_screen * 63f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgegl_g3d_new_sw_screen(struct native_display *ndpy, struct sw_winsys *ws) 64f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 65f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _EGLDisplay *dpy = (_EGLDisplay *) ndpy->user_data; 66f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct egl_g3d_display *gdpy = egl_g3d_display(dpy); 67f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return gdpy->loader->create_sw_screen(ws); 68f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 69f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 70f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic struct pipe_resource * 71f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgegl_g3d_lookup_egl_image(struct native_display *ndpy, void *egl_image) 72f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 73f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _EGLDisplay *dpy = (_EGLDisplay *) ndpy->user_data; 74f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct egl_g3d_display *gdpy = egl_g3d_display(dpy); 75f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct st_egl_image img; 76f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_resource *resource = NULL; 77f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 78f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&img, 0, sizeof(img)); 79f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (gdpy->smapi->get_egl_image(gdpy->smapi, egl_image, &img)) 80f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org resource = img.texture; 81f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 82f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return resource; 83f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 84f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 85f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic const struct native_event_handler egl_g3d_native_event_handler = { 86f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org egl_g3d_invalid_surface, 87f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org egl_g3d_new_drm_screen, 88f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org egl_g3d_new_sw_screen, 89f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org egl_g3d_lookup_egl_image 90f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}; 91f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 92f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 93f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Get the native platform. 94f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 95f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic const struct native_platform * 96f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgegl_g3d_get_platform(_EGLDriver *drv, _EGLPlatformType plat) 97f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 98f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct egl_g3d_driver *gdrv = egl_g3d_driver(drv); 99f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!gdrv->platforms[plat]) { 101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const char *plat_name = NULL; 102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct native_platform *nplat = NULL; 103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (plat) { 105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case _EGL_PLATFORM_WINDOWS: 106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org plat_name = "Windows"; 107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifdef HAVE_GDI_BACKEND 108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nplat = native_get_gdi_platform(&egl_g3d_native_event_handler); 109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case _EGL_PLATFORM_X11: 112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org plat_name = "X11"; 113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifdef HAVE_X11_BACKEND 114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nplat = native_get_x11_platform(&egl_g3d_native_event_handler); 115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case _EGL_PLATFORM_WAYLAND: 118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org plat_name = "wayland"; 119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifdef HAVE_WAYLAND_BACKEND 120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nplat = native_get_wayland_platform(&egl_g3d_native_event_handler); 121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case _EGL_PLATFORM_DRM: 124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org plat_name = "DRM"; 125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifdef HAVE_DRM_BACKEND 126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nplat = native_get_drm_platform(&egl_g3d_native_event_handler); 127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case _EGL_PLATFORM_FBDEV: 130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org plat_name = "FBDEV"; 131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifdef HAVE_FBDEV_BACKEND 132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nplat = native_get_fbdev_platform(&egl_g3d_native_event_handler); 133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case _EGL_PLATFORM_NULL: 136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org plat_name = "NULL"; 137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifdef HAVE_NULL_BACKEND 138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nplat = native_get_null_platform(&egl_g3d_native_event_handler); 139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case _EGL_PLATFORM_ANDROID: 142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org plat_name = "Android"; 143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifdef HAVE_ANDROID_BACKEND 144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nplat = native_get_android_platform(&egl_g3d_native_event_handler); 145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!nplat) 152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _eglLog(_EGL_WARNING, "unsupported platform %s", plat_name); 153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org gdrv->platforms[plat] = nplat; 155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return gdrv->platforms[plat]; 158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifdef EGL_MESA_screen_surface 161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgegl_g3d_add_screens(_EGLDriver *drv, _EGLDisplay *dpy) 164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct egl_g3d_display *gdpy = egl_g3d_display(dpy); 166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct native_connector **native_connectors; 167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org EGLint num_connectors, i; 168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org native_connectors = 170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org gdpy->native->modeset->get_connectors(gdpy->native, &num_connectors, NULL); 171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!num_connectors) { 172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (native_connectors) 173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org FREE(native_connectors); 174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < num_connectors; i++) { 178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct native_connector *nconn = native_connectors[i]; 179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct egl_g3d_screen *gscr; 180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct native_mode **native_modes; 181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org EGLint num_modes, j; 182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* TODO support for hotplug */ 184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org native_modes = 185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org gdpy->native->modeset->get_modes(gdpy->native, nconn, &num_modes); 186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!num_modes) { 187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (native_modes) 188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org FREE(native_modes); 189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org continue; 190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org gscr = CALLOC_STRUCT(egl_g3d_screen); 193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!gscr) { 194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org FREE(native_modes); 195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org continue; 196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _eglInitScreen(&gscr->base, dpy, num_modes); 199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (j = 0; j < gscr->base.NumModes; j++) { 200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct native_mode *nmode = native_modes[j]; 201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _EGLMode *mode = &gscr->base.Modes[j]; 202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mode->Width = nmode->width; 204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mode->Height = nmode->height; 205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mode->RefreshRate = nmode->refresh_rate; 206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mode->Optimal = EGL_FALSE; 207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mode->Interlaced = EGL_FALSE; 208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* no need to strdup() */ 209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mode->Name = nmode->desc; 210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org gscr->native = nconn; 213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org gscr->native_modes = native_modes; 214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _eglLinkScreen(&gscr->base); 216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org FREE(native_connectors); 219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif /* EGL_MESA_screen_surface */ 222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Initialize and validate the EGL config attributes. 225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic EGLBoolean 227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orginit_config_attributes(_EGLConfig *conf, const struct native_config *nconf, 228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org EGLint api_mask, enum pipe_format depth_stencil_format, 229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org EGLint preserve_buffer, EGLint max_swap_interval, 230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org EGLBoolean pre_alpha) 231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint rgba[4], depth_stencil[2], buffer_size; 233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org EGLint surface_type; 234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org EGLint i; 235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* get the color and depth/stencil component sizes */ 237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(nconf->color_format != PIPE_FORMAT_NONE); 238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org buffer_size = 0; 239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < 4; i++) { 240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rgba[i] = util_format_get_component_bits(nconf->color_format, 241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org UTIL_FORMAT_COLORSPACE_RGB, i); 242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org buffer_size += rgba[i]; 243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < 2; i++) { 245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (depth_stencil_format != PIPE_FORMAT_NONE) { 246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org depth_stencil[i] = 247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org util_format_get_component_bits(depth_stencil_format, 248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org UTIL_FORMAT_COLORSPACE_ZS, i); 249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org depth_stencil[i] = 0; 252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org surface_type = 0x0; 256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* pixmap surfaces should be EGL_SINGLE_BUFFER */ 257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (nconf->buffer_mask & (1 << NATIVE_ATTACHMENT_FRONT_LEFT)) { 258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (nconf->pixmap_bit) 259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org surface_type |= EGL_PIXMAP_BIT; 260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* the others surfaces should be EGL_BACK_BUFFER (or settable) */ 262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (nconf->buffer_mask & (1 << NATIVE_ATTACHMENT_BACK_LEFT)) { 263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (nconf->window_bit) 264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org surface_type |= EGL_WINDOW_BIT; 265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifdef EGL_MESA_screen_surface 266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (nconf->scanout_bit) 267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org surface_type |= EGL_SCREEN_BIT_MESA; 268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org surface_type |= EGL_PBUFFER_BIT; 270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (preserve_buffer) 273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org surface_type |= EGL_SWAP_BEHAVIOR_PRESERVED_BIT; 274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (pre_alpha && rgba[3]) { 276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org surface_type |= EGL_VG_ALPHA_FORMAT_PRE_BIT; 277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* st/vega does not support premultiplied alpha yet */ 278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org api_mask &= ~EGL_OPENVG_BIT; 279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org conf->Conformant = api_mask; 282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org conf->RenderableType = api_mask; 283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org conf->RedSize = rgba[0]; 285f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org conf->GreenSize = rgba[1]; 286f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org conf->BlueSize = rgba[2]; 287f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org conf->AlphaSize = rgba[3]; 288f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org conf->BufferSize = buffer_size; 289f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 290f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org conf->DepthSize = depth_stencil[0]; 291f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org conf->StencilSize = depth_stencil[1]; 292f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 293f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* st/vega will allocate the mask on demand */ 294f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (api_mask & EGL_OPENVG_BIT) 295f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org conf->AlphaMaskSize = 8; 296f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 297f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org conf->SurfaceType = surface_type; 298f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 299f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org conf->NativeRenderable = EGL_TRUE; 300f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (surface_type & EGL_WINDOW_BIT) { 301f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org conf->NativeVisualID = nconf->native_visual_id; 302f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org conf->NativeVisualType = nconf->native_visual_type; 303f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 304f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 305f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (surface_type & EGL_PBUFFER_BIT) { 306f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org conf->BindToTextureRGB = EGL_TRUE; 307f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (rgba[3]) 308f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org conf->BindToTextureRGBA = EGL_TRUE; 309f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 310f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org conf->MaxPbufferWidth = 4096; 311f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org conf->MaxPbufferHeight = 4096; 312f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org conf->MaxPbufferPixels = 4096 * 4096; 313f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 314f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 315f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org conf->Level = nconf->level; 316f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 317f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (nconf->transparent_rgb) { 318f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org conf->TransparentType = EGL_TRANSPARENT_RGB; 319f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org conf->TransparentRedValue = nconf->transparent_rgb_values[0]; 320f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org conf->TransparentGreenValue = nconf->transparent_rgb_values[1]; 321f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org conf->TransparentBlueValue = nconf->transparent_rgb_values[2]; 322f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 323f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 324f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org conf->MinSwapInterval = 0; 325f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org conf->MaxSwapInterval = max_swap_interval; 326f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 327f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return _eglValidateConfig(conf, EGL_FALSE); 328f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 329f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 330f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 331f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Initialize an EGL config from the native config. 332f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 333f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic EGLBoolean 334f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgegl_g3d_init_config(_EGLDriver *drv, _EGLDisplay *dpy, 335f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _EGLConfig *conf, const struct native_config *nconf, 336f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org enum pipe_format depth_stencil_format, 337f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int preserve_buffer, int max_swap_interval, 338f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int pre_alpha) 339f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 340f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct egl_g3d_config *gconf = egl_g3d_config(conf); 341f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org EGLint buffer_mask; 342f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org EGLBoolean valid; 343f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 344f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org buffer_mask = 0x0; 345f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (nconf->buffer_mask & (1 << NATIVE_ATTACHMENT_FRONT_LEFT)) 346f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org buffer_mask |= ST_ATTACHMENT_FRONT_LEFT_MASK; 347f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (nconf->buffer_mask & (1 << NATIVE_ATTACHMENT_BACK_LEFT)) 348f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org buffer_mask |= ST_ATTACHMENT_BACK_LEFT_MASK; 349f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (nconf->buffer_mask & (1 << NATIVE_ATTACHMENT_FRONT_RIGHT)) 350f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org buffer_mask |= ST_ATTACHMENT_FRONT_RIGHT_MASK; 351f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (nconf->buffer_mask & (1 << NATIVE_ATTACHMENT_BACK_RIGHT)) 352f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org buffer_mask |= ST_ATTACHMENT_BACK_RIGHT_MASK; 353f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 354f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org gconf->stvis.buffer_mask = buffer_mask; 355f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org gconf->stvis.color_format = nconf->color_format; 356f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org gconf->stvis.depth_stencil_format = depth_stencil_format; 357f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org gconf->stvis.accum_format = PIPE_FORMAT_NONE; 358f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org gconf->stvis.samples = 0; 359f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 360f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* will be overridden per surface */ 361f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org gconf->stvis.render_buffer = (buffer_mask & ST_ATTACHMENT_BACK_LEFT_MASK) ? 362f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ST_ATTACHMENT_BACK_LEFT : ST_ATTACHMENT_FRONT_LEFT; 363f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 364f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org valid = init_config_attributes(&gconf->base, 365f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nconf, dpy->ClientAPIs, depth_stencil_format, 366f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org preserve_buffer, max_swap_interval, pre_alpha); 367f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!valid) { 368f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _eglLog(_EGL_DEBUG, "skip invalid config 0x%x", nconf->native_visual_id); 369f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return EGL_FALSE; 370f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 371f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 372f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org gconf->native = nconf; 373f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 374f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return EGL_TRUE; 375f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 376f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 377f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 378f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Get all interested depth/stencil formats of a display. 379f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 380f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic EGLint 381f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgegl_g3d_fill_depth_stencil_formats(_EGLDisplay *dpy, 382f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org enum pipe_format formats[8]) 383f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 384f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct egl_g3d_display *gdpy = egl_g3d_display(dpy); 385f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_screen *screen = gdpy->native->screen; 386f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const EGLint candidates[] = { 387f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1, PIPE_FORMAT_Z16_UNORM, 388f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1, PIPE_FORMAT_Z32_UNORM, 389f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2, PIPE_FORMAT_Z24_UNORM_S8_UINT, PIPE_FORMAT_S8_UINT_Z24_UNORM, 390f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2, PIPE_FORMAT_Z24X8_UNORM, PIPE_FORMAT_X8Z24_UNORM, 391f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 0 392f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org }; 393f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const EGLint *fmt = candidates; 394f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org EGLint count; 395f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 396f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org count = 0; 397f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org formats[count++] = PIPE_FORMAT_NONE; 398f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 399f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org while (*fmt) { 400f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org EGLint i, n = *fmt++; 401f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 402f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* pick the first supported format */ 403f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < n; i++) { 404f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (screen->is_format_supported(screen, fmt[i], 405f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PIPE_TEXTURE_2D, 0, PIPE_BIND_DEPTH_STENCIL)) { 406f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org formats[count++] = fmt[i]; 407f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 408f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 409f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 410f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 411f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fmt += n; 412f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 413f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 414f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return count; 415f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 416f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 417f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 418f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Add configs to display and return the next config ID. 419f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 420f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic EGLint 421f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgegl_g3d_add_configs(_EGLDriver *drv, _EGLDisplay *dpy, EGLint id) 422f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 423f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct egl_g3d_display *gdpy = egl_g3d_display(dpy); 424f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct native_config **native_configs; 425f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org enum pipe_format depth_stencil_formats[8]; 426f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int num_formats, num_configs, i, j; 427f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int preserve_buffer, max_swap_interval, premultiplied_alpha; 428f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 429f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org native_configs = gdpy->native->get_configs(gdpy->native, &num_configs); 430f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!num_configs) { 431f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (native_configs) 432f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org FREE(native_configs); 433f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return id; 434f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 435f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 436f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org preserve_buffer = 437f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org gdpy->native->get_param(gdpy->native, NATIVE_PARAM_PRESERVE_BUFFER); 438f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org max_swap_interval = 439f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org gdpy->native->get_param(gdpy->native, NATIVE_PARAM_MAX_SWAP_INTERVAL); 440f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org premultiplied_alpha = 441f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org gdpy->native->get_param(gdpy->native, NATIVE_PARAM_PREMULTIPLIED_ALPHA); 442f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 443f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org num_formats = egl_g3d_fill_depth_stencil_formats(dpy, 444f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org depth_stencil_formats); 445f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 446f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < num_configs; i++) { 447f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (j = 0; j < num_formats; j++) { 448f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct egl_g3d_config *gconf; 449f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 450f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org gconf = CALLOC_STRUCT(egl_g3d_config); 451f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (gconf) { 452f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _eglInitConfig(&gconf->base, dpy, id); 453f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!egl_g3d_init_config(drv, dpy, &gconf->base, 454f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org native_configs[i], depth_stencil_formats[j], 455f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org preserve_buffer, max_swap_interval, 456f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org premultiplied_alpha)) { 457f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org FREE(gconf); 458f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 459f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 460f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 461f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _eglLinkConfig(&gconf->base); 462f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org id++; 463f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 464f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 465f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 466f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 467f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org FREE(native_configs); 468f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return id; 469f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 470f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 471f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 472f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgegl_g3d_free_config(void *conf) 473f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 474f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct egl_g3d_config *gconf = egl_g3d_config((_EGLConfig *) conf); 475f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org FREE(gconf); 476f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 477f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 478f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 479f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgegl_g3d_free_screen(void *scr) 480f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 481f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifdef EGL_MESA_screen_surface 482f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct egl_g3d_screen *gscr = egl_g3d_screen((_EGLScreen *) scr); 483f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org FREE(gscr->native_modes); 484f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org FREE(gscr); 485f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 486f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 487f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 488f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic EGLBoolean 489f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgegl_g3d_terminate(_EGLDriver *drv, _EGLDisplay *dpy) 490f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 491f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct egl_g3d_display *gdpy = egl_g3d_display(dpy); 492f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 493f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _eglReleaseDisplayResources(drv, dpy); 494f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 495f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (dpy->Configs) { 496f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _eglDestroyArray(dpy->Configs, egl_g3d_free_config); 497f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dpy->Configs = NULL; 498f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 499f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (dpy->Screens) { 500f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _eglDestroyArray(dpy->Screens, egl_g3d_free_screen); 501f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dpy->Screens = NULL; 502f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 503f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 504f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _eglCleanupDisplay(dpy); 505f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 506f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (gdpy->smapi) 507f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org egl_g3d_destroy_st_manager(gdpy->smapi); 508f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 509f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (gdpy->native) 510f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org gdpy->native->destroy(gdpy->native); 511f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 512f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org FREE(gdpy); 513f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dpy->DriverData = NULL; 514f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 515f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return EGL_TRUE; 516f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 517f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 518f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic EGLBoolean 519f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgegl_g3d_initialize(_EGLDriver *drv, _EGLDisplay *dpy) 520f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 521f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct egl_g3d_driver *gdrv = egl_g3d_driver(drv); 522f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct egl_g3d_display *gdpy; 523f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct native_platform *nplat; 524f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 525f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nplat = egl_g3d_get_platform(drv, dpy->Platform); 526f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!nplat) 527f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return EGL_FALSE; 528f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 529f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (dpy->Options.TestOnly) 530f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return EGL_TRUE; 531f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 532f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org gdpy = CALLOC_STRUCT(egl_g3d_display); 533f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!gdpy) { 534f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _eglError(EGL_BAD_ALLOC, "eglInitialize"); 535f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org goto fail; 536f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 537f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org gdpy->loader = gdrv->loader; 538f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dpy->DriverData = gdpy; 539f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 540f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _eglLog(_EGL_INFO, "use %s for display %p", 541f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nplat->name, dpy->PlatformDisplay); 542f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org gdpy->native = 543f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nplat->create_display(dpy->PlatformDisplay, dpy->Options.UseFallback); 544f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!gdpy->native) { 545f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _eglError(EGL_NOT_INITIALIZED, "eglInitialize(no usable display)"); 546f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org goto fail; 547f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 548f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org gdpy->native->user_data = (void *) dpy; 549f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!gdpy->native->init_screen(gdpy->native)) { 550f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _eglError(EGL_NOT_INITIALIZED, 551f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "eglInitialize(failed to initialize screen)"); 552f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org goto fail; 553f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 554f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 555f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (gdpy->loader->profile_masks[ST_API_OPENGL] & ST_PROFILE_DEFAULT_MASK) 556f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dpy->ClientAPIs |= EGL_OPENGL_BIT; 557f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (gdpy->loader->profile_masks[ST_API_OPENGL] & ST_PROFILE_OPENGL_ES1_MASK) 558f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dpy->ClientAPIs |= EGL_OPENGL_ES_BIT; 559f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (gdpy->loader->profile_masks[ST_API_OPENGL] & ST_PROFILE_OPENGL_ES2_MASK) 560f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dpy->ClientAPIs |= EGL_OPENGL_ES2_BIT; 561f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (gdpy->loader->profile_masks[ST_API_OPENVG] & ST_PROFILE_DEFAULT_MASK) 562f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dpy->ClientAPIs |= EGL_OPENVG_BIT; 563f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 564f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org gdpy->smapi = egl_g3d_create_st_manager(dpy); 565f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!gdpy->smapi) { 566f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _eglError(EGL_NOT_INITIALIZED, 567f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "eglInitialize(failed to create st manager)"); 568f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org goto fail; 569f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 570f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 571f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifdef EGL_MESA_screen_surface 572f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* enable MESA_screen_surface before adding (and validating) configs */ 573f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (gdpy->native->modeset) { 574f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dpy->Extensions.MESA_screen_surface = EGL_TRUE; 575f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org egl_g3d_add_screens(drv, dpy); 576f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 577f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 578f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 579f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dpy->Extensions.KHR_image_base = EGL_TRUE; 580f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (gdpy->native->get_param(gdpy->native, NATIVE_PARAM_USE_NATIVE_BUFFER)) 581f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dpy->Extensions.KHR_image_pixmap = EGL_TRUE; 582f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 583f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dpy->Extensions.KHR_reusable_sync = EGL_TRUE; 584f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dpy->Extensions.KHR_fence_sync = EGL_TRUE; 585f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 586f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dpy->Extensions.KHR_surfaceless_context = EGL_TRUE; 587f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 588f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (dpy->Platform == _EGL_PLATFORM_DRM) { 589f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dpy->Extensions.MESA_drm_display = EGL_TRUE; 590f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (gdpy->native->buffer) 591f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dpy->Extensions.MESA_drm_image = EGL_TRUE; 592f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 593f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 594f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (dpy->Platform == _EGL_PLATFORM_WAYLAND && gdpy->native->buffer) 595f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dpy->Extensions.MESA_drm_image = EGL_TRUE; 596f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 597f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifdef EGL_ANDROID_image_native_buffer 598f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (dpy->Platform == _EGL_PLATFORM_ANDROID && gdpy->native->buffer) 599f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dpy->Extensions.ANDROID_image_native_buffer = EGL_TRUE; 600f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 601f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 602f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifdef EGL_WL_bind_wayland_display 603f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (gdpy->native->wayland_bufmgr) 604f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dpy->Extensions.WL_bind_wayland_display = EGL_TRUE; 605f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 606f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 607f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (gdpy->native->get_param(gdpy->native, NATIVE_PARAM_PRESENT_REGION) && 608f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org gdpy->native->get_param(gdpy->native, NATIVE_PARAM_PRESERVE_BUFFER)) { 609f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifdef EGL_NOK_swap_region 610f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dpy->Extensions.NOK_swap_region = EGL_TRUE; 611f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 612f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dpy->Extensions.NV_post_sub_buffer = EGL_TRUE; 613f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 614f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 615f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (egl_g3d_add_configs(drv, dpy, 1) == 1) { 616f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _eglError(EGL_NOT_INITIALIZED, "eglInitialize(unable to add configs)"); 617f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org goto fail; 618f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 619f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 620f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dpy->VersionMajor = 1; 621f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dpy->VersionMinor = 4; 622f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 623f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return EGL_TRUE; 624f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 625f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgfail: 626f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (gdpy) 627f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org egl_g3d_terminate(drv, dpy); 628f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return EGL_FALSE; 629f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 630f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 631f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic _EGLProc 632f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgegl_g3d_get_proc_address(_EGLDriver *drv, const char *procname) 633f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 634f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct egl_g3d_driver *gdrv = egl_g3d_driver(drv); 635f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct st_api *stapi = NULL; 636f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 637f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (procname && procname[0] == 'v' && procname[1] == 'g') 638f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org stapi = gdrv->loader->get_st_api(ST_API_OPENVG); 639f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if (procname && procname[0] == 'g' && procname[1] == 'l') 640f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org stapi = gdrv->loader->get_st_api(ST_API_OPENGL); 641f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 642f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return (_EGLProc) ((stapi) ? 643f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org stapi->get_proc_address(stapi, procname) : NULL); 644f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 645f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 646f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_EGLDriver * 647f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgegl_g3d_create_driver(const struct egl_g3d_loader *loader) 648f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 649f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct egl_g3d_driver *gdrv; 650f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 651f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org gdrv = CALLOC_STRUCT(egl_g3d_driver); 652f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!gdrv) 653f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; 654f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 655f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org gdrv->loader = loader; 656f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 657f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org egl_g3d_init_driver_api(&gdrv->base); 658f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org gdrv->base.API.Initialize = egl_g3d_initialize; 659f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org gdrv->base.API.Terminate = egl_g3d_terminate; 660f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org gdrv->base.API.GetProcAddress = egl_g3d_get_proc_address; 661f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 662f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* to be filled by the caller */ 663f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org gdrv->base.Name = NULL; 664f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org gdrv->base.Unload = NULL; 665f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 666f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return &gdrv->base; 667f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 668f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 669f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 670f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgegl_g3d_destroy_driver(_EGLDriver *drv) 671f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 672f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct egl_g3d_driver *gdrv = egl_g3d_driver(drv); 673f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org FREE(gdrv); 674f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 675