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