1f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/************************************************************************** 2f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 3f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Copyright 2008 Tungsten Graphics, Inc., Cedar Park, Texas. 4f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Copyright 2009-2010 Chia-I Wu <olvaffe@gmail.com> 5f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Copyright 2010-2011 LunarG, Inc. 6f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * All Rights Reserved. 7f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 8f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Permission is hereby granted, free of charge, to any person obtaining a 9f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * copy of this software and associated documentation files (the 10f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * "Software"), to deal in the Software without restriction, including 11f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * without limitation the rights to use, copy, modify, merge, publish, 12f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * distribute, sub license, and/or sell copies of the Software, and to 13f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * permit persons to whom the Software is furnished to do so, subject to 14f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * the following conditions: 15f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 16f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The above copyright notice and this permission notice (including the 17f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * next paragraph) shall be included in all copies or substantial portions 18f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * of the Software. 19f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 20f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 21f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 22f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 23f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 24f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 25f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 26f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * DEALINGS IN THE SOFTWARE. 27f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 28f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org **************************************************************************/ 29f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 30f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 31f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 32f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Functions related to EGLDisplay. 33f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 34f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 35f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include <assert.h> 36f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include <stdlib.h> 37f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include <string.h> 38f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "eglcontext.h" 39f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "eglsurface.h" 40f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "egldisplay.h" 41f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "egldriver.h" 42f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "eglglobals.h" 43f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "eglmutex.h" 44f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "egllog.h" 45f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 46f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* Includes for _eglNativePlatformDetectNativeDisplay */ 47f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifdef HAVE_MINCORE 48f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include <unistd.h> 49f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include <sys/mman.h> 50f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 51f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifdef HAVE_WAYLAND_PLATFORM 52f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include <wayland-client.h> 53f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 54f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifdef HAVE_DRM_PLATFORM 55f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include <gbm.h> 56f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 57f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifdef HAVE_FBDEV_PLATFORM 58f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include <stdint.h> 59f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include <sys/types.h> 60f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include <sys/stat.h> 61f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 62f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 63f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 64f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 65f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Map --with-egl-platforms names to platform types. 66f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 67f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic const struct { 68f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _EGLPlatformType platform; 69f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const char *name; 70f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} egl_platforms[_EGL_NUM_PLATFORMS] = { 71f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { _EGL_PLATFORM_WINDOWS, "gdi" }, 72f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { _EGL_PLATFORM_X11, "x11" }, 73f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { _EGL_PLATFORM_WAYLAND, "wayland" }, 74f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { _EGL_PLATFORM_DRM, "drm" }, 75f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { _EGL_PLATFORM_FBDEV, "fbdev" }, 76f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { _EGL_PLATFORM_NULL, "null" }, 77f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { _EGL_PLATFORM_ANDROID, "android" } 78f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}; 79f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 80f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 81f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 82f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Return the native platform by parsing EGL_PLATFORM. 83f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 84f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic _EGLPlatformType 85f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_eglGetNativePlatformFromEnv(void) 86f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 87f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _EGLPlatformType plat = _EGL_INVALID_PLATFORM; 88f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const char *plat_name; 89f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org EGLint i; 90f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 91f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org plat_name = getenv("EGL_PLATFORM"); 92f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* try deprecated env variable */ 93f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!plat_name || !plat_name[0]) 94f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org plat_name = getenv("EGL_DISPLAY"); 95f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!plat_name || !plat_name[0]) 96f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return _EGL_INVALID_PLATFORM; 97f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 98f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < _EGL_NUM_PLATFORMS; i++) { 99f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (strcmp(egl_platforms[i].name, plat_name) == 0) { 100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org plat = egl_platforms[i].platform; 101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return plat; 106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Perform validity checks on a generic pointer. 111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic EGLBoolean 113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_eglPointerIsDereferencable(void *p) 114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifdef HAVE_MINCORE 116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uintptr_t addr = (uintptr_t) p; 117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned char valid = 0; 118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const long page_size = getpagesize(); 119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (p == NULL) 121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return EGL_FALSE; 122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* align addr to page_size */ 124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org addr &= ~(page_size - 1); 125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (mincore((void *) addr, page_size, &valid) < 0) { 127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _eglLog(_EGL_DEBUG, "mincore failed: %m"); 128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return EGL_FALSE; 129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return (valid & 0x01) == 0x01; 132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#else 133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return p != NULL; 134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Try detecting native platform with the help of native display characteristcs. 140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic _EGLPlatformType 142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_eglNativePlatformDetectNativeDisplay(EGLNativeDisplayType nativeDisplay) 143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifdef HAVE_FBDEV_PLATFORM 145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct stat buf; 146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (nativeDisplay == EGL_DEFAULT_DISPLAY) 149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return _EGL_INVALID_PLATFORM; 150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifdef HAVE_FBDEV_PLATFORM 152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* fbdev is the only platform that can be a file descriptor. */ 153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (fstat((intptr_t) nativeDisplay, &buf) == 0 && S_ISCHR(buf.st_mode)) 154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return _EGL_PLATFORM_FBDEV; 155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (_eglPointerIsDereferencable(nativeDisplay)) { 158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void *first_pointer = *(void **) nativeDisplay; 159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (void) first_pointer; /* silence unused var warning */ 161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifdef HAVE_WAYLAND_PLATFORM 163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* wl_display is a wl_proxy, which is a wl_object. 164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * wl_object's first element points to the interfacetype. */ 165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (first_pointer == &wl_display_interface) 166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return _EGL_PLATFORM_WAYLAND; 167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifdef HAVE_DRM_PLATFORM 170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* gbm has a pointer to its constructor as first element. */ 171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (first_pointer == gbm_create_device) 172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return _EGL_PLATFORM_DRM; 173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifdef HAVE_X11_PLATFORM 176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* If not matched to any other platform, fallback to x11. */ 177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return _EGL_PLATFORM_X11; 178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return _EGL_INVALID_PLATFORM; 182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Return the native platform. It is the platform of the EGL native types. 187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_EGLPlatformType 189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_eglGetNativePlatform(EGLNativeDisplayType nativeDisplay) 190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org static _EGLPlatformType native_platform = _EGL_INVALID_PLATFORM; 192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org char *detection_method = NULL; 193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (native_platform == _EGL_INVALID_PLATFORM) { 195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org native_platform = _eglGetNativePlatformFromEnv(); 196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org detection_method = "environment overwrite"; 197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (native_platform == _EGL_INVALID_PLATFORM) { 198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org native_platform = _eglNativePlatformDetectNativeDisplay(nativeDisplay); 199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org detection_method = "autodetected"; 200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (native_platform == _EGL_INVALID_PLATFORM) { 201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org native_platform = _EGL_NATIVE_PLATFORM; 202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org detection_method = "build-time configuration"; 203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (detection_method != NULL) 208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _eglLog(_EGL_DEBUG, "Native platform type: %s (%s)", 209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org egl_platforms[native_platform].name, detection_method); 210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return native_platform; 212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Finish display management. 217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_eglFiniDisplay(void) 220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _EGLDisplay *dpyList, *dpy; 222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* atexit function is called with global mutex locked */ 224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dpyList = _eglGlobal.DisplayList; 225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org while (dpyList) { 226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org EGLint i; 227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* pop list head */ 229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dpy = dpyList; 230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dpyList = dpyList->Next; 231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < _EGL_NUM_RESOURCES; i++) { 233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (dpy->ResourceLists[i]) { 234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _eglLog(_EGL_DEBUG, "Display %p is destroyed with resources", dpy); 235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org free(dpy); 240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _eglGlobal.DisplayList = NULL; 242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Find the display corresponding to the specified native display, or create a 247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * new one. 248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_EGLDisplay * 250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_eglFindDisplay(_EGLPlatformType plat, void *plat_dpy) 251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _EGLDisplay *dpy; 253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (plat == _EGL_INVALID_PLATFORM) 255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; 256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _eglLockMutex(_eglGlobal.Mutex); 258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* search the display list first */ 260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dpy = _eglGlobal.DisplayList; 261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org while (dpy) { 262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (dpy->Platform == plat && dpy->PlatformDisplay == plat_dpy) 263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dpy = dpy->Next; 265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* create a new display */ 268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!dpy) { 269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dpy = (_EGLDisplay *) calloc(1, sizeof(_EGLDisplay)); 270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (dpy) { 271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _eglInitMutex(&dpy->Mutex); 272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dpy->Platform = plat; 273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dpy->PlatformDisplay = plat_dpy; 274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* add to the display list */ 276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dpy->Next = _eglGlobal.DisplayList; 277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _eglGlobal.DisplayList = dpy; 278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _eglUnlockMutex(_eglGlobal.Mutex); 282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return dpy; 284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 285f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 286f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 287f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 288f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Destroy the contexts and surfaces that are linked to the display. 289f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 290f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 291f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_eglReleaseDisplayResources(_EGLDriver *drv, _EGLDisplay *display) 292f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 293f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _EGLResource *list; 294f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 295f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org list = display->ResourceLists[_EGL_RESOURCE_CONTEXT]; 296f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org while (list) { 297f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _EGLContext *ctx = (_EGLContext *) list; 298f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org list = list->Next; 299f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 300f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _eglUnlinkContext(ctx); 301f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org drv->API.DestroyContext(drv, display, ctx); 302f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 303f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(!display->ResourceLists[_EGL_RESOURCE_CONTEXT]); 304f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 305f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org list = display->ResourceLists[_EGL_RESOURCE_SURFACE]; 306f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org while (list) { 307f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _EGLSurface *surf = (_EGLSurface *) list; 308f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org list = list->Next; 309f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 310f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _eglUnlinkSurface(surf); 311f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org drv->API.DestroySurface(drv, display, surf); 312f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 313f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(!display->ResourceLists[_EGL_RESOURCE_SURFACE]); 314f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 315f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 316f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 317f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 318f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Free all the data hanging of an _EGLDisplay object, but not 319f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * the object itself. 320f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 321f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 322f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_eglCleanupDisplay(_EGLDisplay *disp) 323f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 324f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (disp->Configs) { 325f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _eglDestroyArray(disp->Configs, free); 326f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org disp->Configs = NULL; 327f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 328f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 329f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* XXX incomplete */ 330f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 331f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 332f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 333f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 334f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Return EGL_TRUE if the given handle is a valid handle to a display. 335f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 336f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgEGLBoolean 337f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_eglCheckDisplayHandle(EGLDisplay dpy) 338f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 339f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _EGLDisplay *cur; 340f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 341f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _eglLockMutex(_eglGlobal.Mutex); 342f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cur = _eglGlobal.DisplayList; 343f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org while (cur) { 344f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (cur == (_EGLDisplay *) dpy) 345f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 346f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cur = cur->Next; 347f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 348f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _eglUnlockMutex(_eglGlobal.Mutex); 349f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return (cur != NULL); 350f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 351f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 352f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 353f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 354f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Return EGL_TRUE if the given resource is valid. That is, the display does 355f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * own the resource. 356f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 357f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgEGLBoolean 358f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_eglCheckResource(void *res, _EGLResourceType type, _EGLDisplay *dpy) 359f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 360f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _EGLResource *list = dpy->ResourceLists[type]; 361f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 362f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!res) 363f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return EGL_FALSE; 364f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 365f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org while (list) { 366f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (res == (void *) list) { 367f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(list->Display == dpy); 368f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 369f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 370f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org list = list->Next; 371f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 372f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 373f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return (list != NULL); 374f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 375f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 376f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 377f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 378f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Initialize a display resource. 379f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 380f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 381f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_eglInitResource(_EGLResource *res, EGLint size, _EGLDisplay *dpy) 382f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 383f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(res, 0, size); 384f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org res->Display = dpy; 385f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org res->RefCount = 1; 386f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 387f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 388f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 389f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 390f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Increment reference count for the resource. 391f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 392f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 393f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_eglGetResource(_EGLResource *res) 394f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 395f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(res && res->RefCount > 0); 396f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* hopefully a resource is always manipulated with its display locked */ 397f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org res->RefCount++; 398f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 399f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 400f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 401f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 402f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Decrement reference count for the resource. 403f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 404f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgEGLBoolean 405f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_eglPutResource(_EGLResource *res) 406f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 407f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(res && res->RefCount > 0); 408f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org res->RefCount--; 409f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return (!res->RefCount); 410f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 411f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 412f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 413f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 414f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Link a resource to its display. 415f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 416f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 417f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_eglLinkResource(_EGLResource *res, _EGLResourceType type) 418f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 419f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(res->Display); 420f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 421f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org res->IsLinked = EGL_TRUE; 422f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org res->Next = res->Display->ResourceLists[type]; 423f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org res->Display->ResourceLists[type] = res; 424f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _eglGetResource(res); 425f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 426f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 427f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 428f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 429f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Unlink a linked resource from its display. 430f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 431f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 432f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_eglUnlinkResource(_EGLResource *res, _EGLResourceType type) 433f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 434f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _EGLResource *prev; 435f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 436f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org prev = res->Display->ResourceLists[type]; 437f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (prev != res) { 438f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org while (prev) { 439f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (prev->Next == res) 440f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 441f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org prev = prev->Next; 442f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 443f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(prev); 444f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org prev->Next = res->Next; 445f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 446f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 447f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org res->Display->ResourceLists[type] = res->Next; 448f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 449f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 450f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org res->Next = NULL; 451f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org res->IsLinked = EGL_FALSE; 452f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _eglPutResource(res); 453f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 454f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* We always unlink before destroy. The driver still owns a reference */ 455f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(res->RefCount); 456f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 457