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