1f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/*
2f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Copyright © 2010 Intel Corporation
3f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
4f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Permission is hereby granted, free of charge, to any person obtaining a
5f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * copy of this software and associated documentation files (the "Software"),
6f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * to deal in the Software without restriction, including without limitation
7f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * and/or sell copies of the Software, and to permit persons to whom the
9f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Software is furnished to do so, subject to the following conditions:
10f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
11f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The above copyright notice and this permission notice (including the next
12f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * paragraph) shall be included in all copies or substantial portions of the
13f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Software.
14f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
15f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
16f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
17f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
18f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * NONINFRINGEMENT.  IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
19f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
20f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
22f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * DEALINGS IN THE SOFTWARE.
23f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
24f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Authors:
25f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *    Kristian Høgsberg <krh@bitplanet.net>
26f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
27f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
28f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include <stdlib.h>
29f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include <string.h>
30f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include <stdio.h>
31f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include <limits.h>
32f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include <dlfcn.h>
33f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include <fcntl.h>
34f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include <errno.h>
35f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include <unistd.h>
36f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include <xf86drm.h>
37f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include <GL/gl.h>
38f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include <GL/internal/dri_interface.h>
39f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include <sys/types.h>
40f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include <sys/stat.h>
41f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
42f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "egl_dri2.h"
43f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
44f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgconst __DRIuseInvalidateExtension use_invalidate = {
45f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { __DRI_USE_INVALIDATE, 1 }
46f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org};
47f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
48f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgEGLint dri2_to_egl_attribute_map[] = {
49f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   0,
50f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   EGL_BUFFER_SIZE,		/* __DRI_ATTRIB_BUFFER_SIZE */
51f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   EGL_LEVEL,			/* __DRI_ATTRIB_LEVEL */
52f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   EGL_RED_SIZE,		/* __DRI_ATTRIB_RED_SIZE */
53f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   EGL_GREEN_SIZE,		/* __DRI_ATTRIB_GREEN_SIZE */
54f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   EGL_BLUE_SIZE,		/* __DRI_ATTRIB_BLUE_SIZE */
55f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   EGL_LUMINANCE_SIZE,		/* __DRI_ATTRIB_LUMINANCE_SIZE */
56f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   EGL_ALPHA_SIZE,		/* __DRI_ATTRIB_ALPHA_SIZE */
57f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   0,				/* __DRI_ATTRIB_ALPHA_MASK_SIZE */
58f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   EGL_DEPTH_SIZE,		/* __DRI_ATTRIB_DEPTH_SIZE */
59f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   EGL_STENCIL_SIZE,		/* __DRI_ATTRIB_STENCIL_SIZE */
60f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   0,				/* __DRI_ATTRIB_ACCUM_RED_SIZE */
61f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   0,				/* __DRI_ATTRIB_ACCUM_GREEN_SIZE */
62f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   0,				/* __DRI_ATTRIB_ACCUM_BLUE_SIZE */
63f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   0,				/* __DRI_ATTRIB_ACCUM_ALPHA_SIZE */
64f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   EGL_SAMPLE_BUFFERS,		/* __DRI_ATTRIB_SAMPLE_BUFFERS */
65f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   EGL_SAMPLES,			/* __DRI_ATTRIB_SAMPLES */
66f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   0,				/* __DRI_ATTRIB_RENDER_TYPE, */
67f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   0,				/* __DRI_ATTRIB_CONFIG_CAVEAT */
68f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   0,				/* __DRI_ATTRIB_CONFORMANT */
69f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   0,				/* __DRI_ATTRIB_DOUBLE_BUFFER */
70f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   0,				/* __DRI_ATTRIB_STEREO */
71f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   0,				/* __DRI_ATTRIB_AUX_BUFFERS */
72f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   0,				/* __DRI_ATTRIB_TRANSPARENT_TYPE */
73f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   0,				/* __DRI_ATTRIB_TRANSPARENT_INDEX_VALUE */
74f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   0,				/* __DRI_ATTRIB_TRANSPARENT_RED_VALUE */
75f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   0,				/* __DRI_ATTRIB_TRANSPARENT_GREEN_VALUE */
76f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   0,				/* __DRI_ATTRIB_TRANSPARENT_BLUE_VALUE */
77f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   0,				/* __DRI_ATTRIB_TRANSPARENT_ALPHA_VALUE */
78f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   0,				/* __DRI_ATTRIB_FLOAT_MODE */
79f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   0,				/* __DRI_ATTRIB_RED_MASK */
80f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   0,				/* __DRI_ATTRIB_GREEN_MASK */
81f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   0,				/* __DRI_ATTRIB_BLUE_MASK */
82f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   0,				/* __DRI_ATTRIB_ALPHA_MASK */
83f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   EGL_MAX_PBUFFER_WIDTH,	/* __DRI_ATTRIB_MAX_PBUFFER_WIDTH */
84f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   EGL_MAX_PBUFFER_HEIGHT,	/* __DRI_ATTRIB_MAX_PBUFFER_HEIGHT */
85f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   EGL_MAX_PBUFFER_PIXELS,	/* __DRI_ATTRIB_MAX_PBUFFER_PIXELS */
86f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   0,				/* __DRI_ATTRIB_OPTIMAL_PBUFFER_WIDTH */
87f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   0,				/* __DRI_ATTRIB_OPTIMAL_PBUFFER_HEIGHT */
88f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   0,				/* __DRI_ATTRIB_VISUAL_SELECT_GROUP */
89f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   0,				/* __DRI_ATTRIB_SWAP_METHOD */
90f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   EGL_MAX_SWAP_INTERVAL,	/* __DRI_ATTRIB_MAX_SWAP_INTERVAL */
91f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   EGL_MIN_SWAP_INTERVAL,	/* __DRI_ATTRIB_MIN_SWAP_INTERVAL */
92f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   0,				/* __DRI_ATTRIB_BIND_TO_TEXTURE_RGB */
93f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   0,				/* __DRI_ATTRIB_BIND_TO_TEXTURE_RGBA */
94f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   0,				/* __DRI_ATTRIB_BIND_TO_MIPMAP_TEXTURE */
95f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   0,				/* __DRI_ATTRIB_BIND_TO_TEXTURE_TARGETS */
96f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   EGL_Y_INVERTED_NOK,		/* __DRI_ATTRIB_YINVERTED */
97f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   0,				/* __DRI_ATTRIB_FRAMEBUFFER_SRGB_CAPABLE */
98f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org};
99f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic EGLBoolean
101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdri2_match_config(const _EGLConfig *conf, const _EGLConfig *criteria)
102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (_eglCompareConfigs(conf, criteria, NULL, EGL_FALSE) != 0)
104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return EGL_FALSE;
105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!_eglMatchConfig(conf, criteria))
107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return EGL_FALSE;
108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return EGL_TRUE;
110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct dri2_egl_config *
113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdri2_add_config(_EGLDisplay *disp, const __DRIconfig *dri_config, int id,
114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		int depth, EGLint surface_type, const EGLint *attr_list,
115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		const unsigned int *rgba_masks)
116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct dri2_egl_config *conf;
118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct dri2_egl_display *dri2_dpy;
119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   _EGLConfig base;
120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   unsigned int attrib, value, double_buffer;
121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   EGLint key, bind_to_texture_rgb, bind_to_texture_rgba;
122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   unsigned int dri_masks[4] = { 0, 0, 0, 0 };
123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   _EGLConfig *matching_config;
124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   EGLint num_configs = 0;
125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   EGLint config_id;
126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   int i;
127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   dri2_dpy = disp->DriverData;
129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   _eglInitConfig(&base, disp, id);
130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   i = 0;
132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   double_buffer = 0;
133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   bind_to_texture_rgb = 0;
134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   bind_to_texture_rgba = 0;
135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   while (dri2_dpy->core->indexConfigAttrib(dri_config, i++, &attrib, &value)) {
137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      switch (attrib) {
138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case __DRI_ATTRIB_RENDER_TYPE:
139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 if (value & __DRI_ATTRIB_RGBA_BIT)
140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    value = EGL_RGB_BUFFER;
141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 else if (value & __DRI_ATTRIB_LUMINANCE_BIT)
142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    value = EGL_LUMINANCE_BUFFER;
143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 else
144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    /* not valid */;
145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 _eglSetConfigKey(&base, EGL_COLOR_BUFFER_TYPE, value);
146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 break;
147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case __DRI_ATTRIB_CONFIG_CAVEAT:
149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         if (value & __DRI_ATTRIB_NON_CONFORMANT_CONFIG)
150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            value = EGL_NON_CONFORMANT_CONFIG;
151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         else if (value & __DRI_ATTRIB_SLOW_BIT)
152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            value = EGL_SLOW_CONFIG;
153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 else
154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    value = EGL_NONE;
155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 _eglSetConfigKey(&base, EGL_CONFIG_CAVEAT, value);
156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case __DRI_ATTRIB_BIND_TO_TEXTURE_RGB:
159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 bind_to_texture_rgb = value;
160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 break;
161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case __DRI_ATTRIB_BIND_TO_TEXTURE_RGBA:
163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 bind_to_texture_rgba = value;
164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 break;
165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case __DRI_ATTRIB_DOUBLE_BUFFER:
167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 double_buffer = value;
168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 break;
169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case __DRI_ATTRIB_RED_MASK:
171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         dri_masks[0] = value;
172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case __DRI_ATTRIB_GREEN_MASK:
175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         dri_masks[1] = value;
176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case __DRI_ATTRIB_BLUE_MASK:
179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         dri_masks[2] = value;
180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case __DRI_ATTRIB_ALPHA_MASK:
183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         dri_masks[3] = value;
184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      default:
187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 key = dri2_to_egl_attribute_map[attrib];
188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 if (key != 0)
189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    _eglSetConfigKey(&base, key, value);
190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 break;
191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (attr_list)
195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      for (i = 0; attr_list[i] != EGL_NONE; i += 2)
196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         _eglSetConfigKey(&base, attr_list[i], attr_list[i+1]);
197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (depth > 0 && depth != base.BufferSize)
199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return NULL;
200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (rgba_masks && memcmp(rgba_masks, dri_masks, sizeof(dri_masks)))
202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return NULL;
203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   base.NativeRenderable = EGL_TRUE;
205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   base.SurfaceType = surface_type;
207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (surface_type & (EGL_PBUFFER_BIT |
208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       (disp->Extensions.NOK_texture_from_pixmap ? EGL_PIXMAP_BIT : 0))) {
209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      base.BindToTextureRGB = bind_to_texture_rgb;
210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (base.AlphaSize > 0)
211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         base.BindToTextureRGBA = bind_to_texture_rgba;
212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   base.RenderableType = disp->ClientAPIs;
215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   base.Conformant = disp->ClientAPIs;
216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!_eglValidateConfig(&base, EGL_FALSE)) {
218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _eglLog(_EGL_DEBUG, "DRI2: failed to validate config %d", id);
219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return NULL;
220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   config_id = base.ConfigID;
223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   base.ConfigID    = EGL_DONT_CARE;
224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   base.SurfaceType = EGL_DONT_CARE;
225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   num_configs = _eglFilterArray(disp->Configs, (void **) &matching_config, 1,
226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                 (_EGLArrayForEach) dri2_match_config, &base);
227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (num_configs == 1) {
229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      conf = (struct dri2_egl_config *) matching_config;
230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (double_buffer && !conf->dri_double_config)
232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         conf->dri_double_config = dri_config;
233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      else if (!double_buffer && !conf->dri_single_config)
234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         conf->dri_single_config = dri_config;
235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      else
236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         /* a similar config type is already added (unlikely) => discard */
237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return NULL;
238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else if (num_configs == 0) {
240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      conf = malloc(sizeof *conf);
241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (conf == NULL)
242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return NULL;
243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      memcpy(&conf->base, &base, sizeof base);
245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (double_buffer) {
246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         conf->dri_double_config = dri_config;
247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         conf->dri_single_config = NULL;
248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      } else {
249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         conf->dri_single_config = dri_config;
250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         conf->dri_double_config = NULL;
251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      conf->base.SurfaceType = 0;
253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      conf->base.ConfigID = config_id;
254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _eglLinkConfig(&conf->base);
256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else {
258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      assert(0);
259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return NULL;
260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (double_buffer) {
263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      surface_type &= ~EGL_PIXMAP_BIT;
264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (dri2_dpy->swap_available) {
266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         conf->base.MinSwapInterval = 0;
267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         conf->base.MaxSwapInterval = 1000; /* XXX arbitrary value */
268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   conf->base.SurfaceType |= surface_type;
272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return conf;
274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org__DRIimage *
277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdri2_lookup_egl_image(__DRIscreen *screen, void *image, void *data)
278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   _EGLDisplay *disp = data;
280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct dri2_egl_image *dri2_img;
281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   _EGLImage *img;
282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   (void) screen;
284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
285f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   img = _eglLookupImage(image, disp);
286f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (img == NULL) {
287f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _eglError(EGL_BAD_PARAMETER, "dri2_lookup_egl_image");
288f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return NULL;
289f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
290f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
291f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   dri2_img = dri2_egl_image(image);
292f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
293f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return dri2_img->dri_image;
294f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
295f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
296f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgconst __DRIimageLookupExtension image_lookup_extension = {
297f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { __DRI_IMAGE_LOOKUP, 1 },
298f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   dri2_lookup_egl_image
299f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org};
300f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
301f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic const char dri_driver_path[] = DEFAULT_DRIVER_DIR;
302f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
303f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct dri2_extension_match {
304f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const char *name;
305f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   int version;
306f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   int offset;
307f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org};
308f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
309f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic struct dri2_extension_match dri2_driver_extensions[] = {
310f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { __DRI_CORE, 1, offsetof(struct dri2_egl_display, core) },
311f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { __DRI_DRI2, 2, offsetof(struct dri2_egl_display, dri2) },
312f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { NULL, 0, 0 }
313f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org};
314f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
315f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic struct dri2_extension_match dri2_core_extensions[] = {
316f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { __DRI2_FLUSH, 1, offsetof(struct dri2_egl_display, flush) },
317f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { __DRI_TEX_BUFFER, 2, offsetof(struct dri2_egl_display, tex_buffer) },
318f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { __DRI_IMAGE, 1, offsetof(struct dri2_egl_display, image) },
319f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { NULL, 0, 0 }
320f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org};
321f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
322f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic struct dri2_extension_match swrast_driver_extensions[] = {
323f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { __DRI_CORE, 1, offsetof(struct dri2_egl_display, core) },
324f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { __DRI_SWRAST, 2, offsetof(struct dri2_egl_display, swrast) },
325f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { NULL, 0, 0 }
326f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org};
327f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
328f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic struct dri2_extension_match swrast_core_extensions[] = {
329f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { __DRI_TEX_BUFFER, 2, offsetof(struct dri2_egl_display, tex_buffer) },
330f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { NULL, 0, 0 }
331f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org};
332f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
333f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic EGLBoolean
334f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdri2_bind_extensions(struct dri2_egl_display *dri2_dpy,
335f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		     struct dri2_extension_match *matches,
336f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		     const __DRIextension **extensions)
337f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
338f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   int i, j, ret = EGL_TRUE;
339f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   void *field;
340f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
341f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (i = 0; extensions[i]; i++) {
342f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _eglLog(_EGL_DEBUG, "DRI2: found extension `%s'", extensions[i]->name);
343f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      for (j = 0; matches[j].name; j++) {
344f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 if (strcmp(extensions[i]->name, matches[j].name) == 0 &&
345f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	     extensions[i]->version >= matches[j].version) {
346f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    field = ((char *) dri2_dpy + matches[j].offset);
347f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    *(const __DRIextension **) field = extensions[i];
348f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    _eglLog(_EGL_INFO, "DRI2: found extension %s version %d",
349f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		    extensions[i]->name, extensions[i]->version);
350f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 }
351f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
352f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
353f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
354f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (j = 0; matches[j].name; j++) {
355f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      field = ((char *) dri2_dpy + matches[j].offset);
356f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (*(const __DRIextension **) field == NULL) {
357f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 _eglLog(_EGL_FATAL, "DRI2: did not find extension %s version %d",
358f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		 matches[j].name, matches[j].version);
359f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 ret = EGL_FALSE;
360f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
361f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
362f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
363f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return ret;
364f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
365f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
366f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic const __DRIextension **
367f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdri2_open_driver(_EGLDisplay *disp)
368f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
369f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct dri2_egl_display *dri2_dpy = disp->DriverData;
370f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const __DRIextension **extensions;
371f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   char path[PATH_MAX], *search_paths, *p, *next, *end;
372f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
373f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   search_paths = NULL;
374f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (geteuid() == getuid()) {
375f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* don't allow setuid apps to use LIBGL_DRIVERS_PATH */
376f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      search_paths = getenv("LIBGL_DRIVERS_PATH");
377f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
378f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (search_paths == NULL)
379f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      search_paths = DEFAULT_DRIVER_DIR;
380f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
381f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   dri2_dpy->driver = NULL;
382f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   end = search_paths + strlen(search_paths);
383f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (p = search_paths; p < end && dri2_dpy->driver == NULL; p = next + 1) {
384f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      int len;
385f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      next = strchr(p, ':');
386f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (next == NULL)
387f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         next = end;
388f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
389f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      len = next - p;
390f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if GLX_USE_TLS
391f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      snprintf(path, sizeof path,
392f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	       "%.*s/tls/%s_dri.so", len, p, dri2_dpy->driver_name);
393f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      dri2_dpy->driver = dlopen(path, RTLD_NOW | RTLD_GLOBAL);
394f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif
395f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (dri2_dpy->driver == NULL) {
396f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 snprintf(path, sizeof path,
397f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		  "%.*s/%s_dri.so", len, p, dri2_dpy->driver_name);
398f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 dri2_dpy->driver = dlopen(path, RTLD_NOW | RTLD_GLOBAL);
399f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 if (dri2_dpy->driver == NULL)
400f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    _eglLog(_EGL_DEBUG, "failed to open %s: %s\n", path, dlerror());
401f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
402f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
403f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
404f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (dri2_dpy->driver == NULL) {
405f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _eglLog(_EGL_WARNING,
406f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	      "DRI2: failed to open %s (search paths %s)",
407f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	      dri2_dpy->driver_name, search_paths);
408f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return NULL;
409f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
410f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
411f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   _eglLog(_EGL_DEBUG, "DRI2: dlopen(%s)", path);
412f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   extensions = dlsym(dri2_dpy->driver, __DRI_DRIVER_EXTENSIONS);
413f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (extensions == NULL) {
414f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _eglLog(_EGL_WARNING,
415f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	      "DRI2: driver exports no extensions (%s)", dlerror());
416f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      dlclose(dri2_dpy->driver);
417f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
418f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
419f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return extensions;
420f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
421f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
422f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgEGLBoolean
423f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdri2_load_driver(_EGLDisplay *disp)
424f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
425f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct dri2_egl_display *dri2_dpy = disp->DriverData;
426f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const __DRIextension **extensions;
427f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
428f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   extensions = dri2_open_driver(disp);
429f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!extensions)
430f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return EGL_FALSE;
431f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
432f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!dri2_bind_extensions(dri2_dpy, dri2_driver_extensions, extensions)) {
433f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      dlclose(dri2_dpy->driver);
434f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return EGL_FALSE;
435f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
436f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
437f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return EGL_TRUE;
438f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
439f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
440f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgEGLBoolean
441f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdri2_load_driver_swrast(_EGLDisplay *disp)
442f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
443f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct dri2_egl_display *dri2_dpy = disp->DriverData;
444f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const __DRIextension **extensions;
445f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
446f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   dri2_dpy->driver_name = "swrast";
447f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   extensions = dri2_open_driver(disp);
448f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
449f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!extensions)
450f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return EGL_FALSE;
451f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
452f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!dri2_bind_extensions(dri2_dpy, swrast_driver_extensions, extensions)) {
453f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      dlclose(dri2_dpy->driver);
454f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return EGL_FALSE;
455f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
456f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
457f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return EGL_TRUE;
458f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
459f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
460f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
461f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdri2_setup_screen(_EGLDisplay *disp)
462f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
463f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct dri2_egl_display *dri2_dpy = dri2_egl_display(disp);
464f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   unsigned int api_mask;
465f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
466f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (dri2_dpy->dri2) {
467f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      api_mask = dri2_dpy->dri2->getAPIMask(dri2_dpy->dri_screen);
468f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   } else {
469f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      assert(dri2_dpy->swrast);
470f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      api_mask = 1 << __DRI_API_OPENGL | 1 << __DRI_API_GLES | 1 << __DRI_API_GLES2;
471f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
472f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
473f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   disp->ClientAPIs = 0;
474f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (api_mask & (1 <<__DRI_API_OPENGL))
475f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      disp->ClientAPIs |= EGL_OPENGL_BIT;
476f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (api_mask & (1 <<__DRI_API_GLES))
477f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      disp->ClientAPIs |= EGL_OPENGL_ES_BIT;
478f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (api_mask & (1 << __DRI_API_GLES2))
479f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      disp->ClientAPIs |= EGL_OPENGL_ES2_BIT;
480f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
481f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert(dri2_dpy->dri2 || dri2_dpy->swrast);
482f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   disp->Extensions.KHR_surfaceless_context = EGL_TRUE;
483f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
484f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (dri2_dpy->dri2 && dri2_dpy->dri2->base.version >= 3) {
485f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      disp->Extensions.KHR_create_context = EGL_TRUE;
486f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
487f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (dri2_dpy->robustness)
488f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         disp->Extensions.EXT_create_context_robustness = EGL_TRUE;
489f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
490f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
491f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (dri2_dpy->image) {
492f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      disp->Extensions.MESA_drm_image = EGL_TRUE;
493f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      disp->Extensions.KHR_image_base = EGL_TRUE;
494f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      disp->Extensions.KHR_gl_renderbuffer_image = EGL_TRUE;
495f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
496f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
497f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
498f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgEGLBoolean
499f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdri2_create_screen(_EGLDisplay *disp)
500f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
501f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const __DRIextension **extensions;
502f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct dri2_egl_display *dri2_dpy;
503f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
504f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   dri2_dpy = disp->DriverData;
505f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
506f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (dri2_dpy->dri2) {
507f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      dri2_dpy->dri_screen =
508f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         dri2_dpy->dri2->createNewScreen(0, dri2_dpy->fd, dri2_dpy->extensions,
509f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				         &dri2_dpy->driver_configs, disp);
510f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   } else {
511f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      assert(dri2_dpy->swrast);
512f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      dri2_dpy->dri_screen =
513f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         dri2_dpy->swrast->createNewScreen(0, dri2_dpy->extensions,
514f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                           &dri2_dpy->driver_configs, disp);
515f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
516f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
517f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (dri2_dpy->dri_screen == NULL) {
518f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _eglLog(_EGL_WARNING, "DRI2: failed to create dri screen");
519f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return EGL_FALSE;
520f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
521f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
522f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   dri2_dpy->own_dri_screen = 1;
523f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
524f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   extensions = dri2_dpy->core->getExtensions(dri2_dpy->dri_screen);
525f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
526f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (dri2_dpy->dri2) {
527f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      unsigned i;
528f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
529f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (!dri2_bind_extensions(dri2_dpy, dri2_core_extensions, extensions))
530f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         goto cleanup_dri_screen;
531f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
532f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      for (i = 0; extensions[i]; i++) {
533f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 if (strcmp(extensions[i]->name, __DRI2_ROBUSTNESS) == 0) {
534f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            dri2_dpy->robustness = (__DRIrobustnessExtension *) extensions[i];
535f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 }
536f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
537f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   } else {
538f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      assert(dri2_dpy->swrast);
539f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (!dri2_bind_extensions(dri2_dpy, swrast_core_extensions, extensions))
540f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         goto cleanup_dri_screen;
541f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
542f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
543f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   dri2_setup_screen(disp);
544f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
545f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return EGL_TRUE;
546f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
547f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cleanup_dri_screen:
548f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   dri2_dpy->core->destroyScreen(dri2_dpy->dri_screen);
549f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
550f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return EGL_FALSE;
551f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
552f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
553f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
554f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Called via eglInitialize(), GLX_drv->API.Initialize().
555f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
556f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic EGLBoolean
557f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdri2_initialize(_EGLDriver *drv, _EGLDisplay *disp)
558f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
559f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* not until swrast_dri is supported */
560f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (disp->Options.UseFallback)
561f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return EGL_FALSE;
562f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
563f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   switch (disp->Platform) {
564f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifdef HAVE_X11_PLATFORM
565f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case _EGL_PLATFORM_X11:
566f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (disp->Options.TestOnly)
567f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return EGL_TRUE;
568f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return dri2_initialize_x11(drv, disp);
569f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif
570f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
571f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifdef HAVE_LIBUDEV
572f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifdef HAVE_DRM_PLATFORM
573f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case _EGL_PLATFORM_DRM:
574f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (disp->Options.TestOnly)
575f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return EGL_TRUE;
576f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return dri2_initialize_drm(drv, disp);
577f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif
578f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifdef HAVE_WAYLAND_PLATFORM
579f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case _EGL_PLATFORM_WAYLAND:
580f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (disp->Options.TestOnly)
581f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return EGL_TRUE;
582f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return dri2_initialize_wayland(drv, disp);
583f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif
584f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif
585f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifdef HAVE_ANDROID_PLATFORM
586f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case _EGL_PLATFORM_ANDROID:
587f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (disp->Options.TestOnly)
588f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return EGL_TRUE;
589f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return dri2_initialize_android(drv, disp);
590f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif
591f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
592f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   default:
593f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return EGL_FALSE;
594f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
595f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
596f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
597f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
598f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Called via eglTerminate(), drv->API.Terminate().
599f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
600f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic EGLBoolean
601f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdri2_terminate(_EGLDriver *drv, _EGLDisplay *disp)
602f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
603f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct dri2_egl_display *dri2_dpy = dri2_egl_display(disp);
604f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
605f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   _eglReleaseDisplayResources(drv, disp);
606f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   _eglCleanupDisplay(disp);
607f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
608f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (dri2_dpy->own_dri_screen)
609f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      dri2_dpy->core->destroyScreen(dri2_dpy->dri_screen);
610f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (dri2_dpy->fd)
611f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      close(dri2_dpy->fd);
612f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (dri2_dpy->driver)
613f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      dlclose(dri2_dpy->driver);
614f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (dri2_dpy->device_name)
615f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      free(dri2_dpy->device_name);
616f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
617f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (disp->PlatformDisplay == NULL) {
618f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      switch (disp->Platform) {
619f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifdef HAVE_X11_PLATFORM
620f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case _EGL_PLATFORM_X11:
621f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         xcb_disconnect(dri2_dpy->conn);
622f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
623f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif
624f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifdef HAVE_DRM_PLATFORM
625f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case _EGL_PLATFORM_DRM:
626f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         if (dri2_dpy->own_device) {
627f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            gbm_device_destroy(&dri2_dpy->gbm_dri->base.base);
628f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         }
629f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
630f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif
631f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      default:
632f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
633f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
634f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
635f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
636f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   free(dri2_dpy);
637f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   disp->DriverData = NULL;
638f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
639f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return EGL_TRUE;
640f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
641f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
642f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
643f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Set the error code after a call to
644f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * dri2_egl_display::dri2::createContextAttribs.
645f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
646f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void
647f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdri2_create_context_attribs_error(int dri_error)
648f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
649f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   EGLint egl_error;
650f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
651f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   switch (dri_error) {
652f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case __DRI_CTX_ERROR_SUCCESS:
653f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return;
654f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
655f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case __DRI_CTX_ERROR_NO_MEMORY:
656f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      egl_error = EGL_BAD_ALLOC;
657f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
658f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
659f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  /* From the EGL_KHR_create_context spec, section "Errors":
660f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   *
661f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   *   * If <config> does not support a client API context compatible
662f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   *     with the requested API major and minor version, [...] context flags,
663f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   *     and context reset notification behavior (for client API types where
664f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   *     these attributes are supported), then an EGL_BAD_MATCH error is
665f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   *     generated.
666f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   *
667f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   *   * If an OpenGL ES context is requested and the values for
668f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   *     attributes EGL_CONTEXT_MAJOR_VERSION_KHR and
669f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   *     EGL_CONTEXT_MINOR_VERSION_KHR specify an OpenGL ES version that
670f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   *     is not defined, than an EGL_BAD_MATCH error is generated.
671f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   *
672f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   *   * If an OpenGL context is requested, the requested version is
673f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   *     greater than 3.2, and the value for attribute
674f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   *     EGL_CONTEXT_OPENGL_PROFILE_MASK_KHR has no bits set; has any
675f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   *     bits set other than EGL_CONTEXT_OPENGL_CORE_PROFILE_BIT_KHR and
676f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   *     EGL_CONTEXT_OPENGL_COMPATIBILITY_PROFILE_BIT_KHR; has more than
677f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   *     one of these bits set; or if the implementation does not support
678f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   *     the requested profile, then an EGL_BAD_MATCH error is generated.
679f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   */
680f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case __DRI_CTX_ERROR_BAD_API:
681f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case __DRI_CTX_ERROR_BAD_VERSION:
682f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case __DRI_CTX_ERROR_BAD_FLAG:
683f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      egl_error = EGL_BAD_MATCH;
684f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
685f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
686f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  /* From the EGL_KHR_create_context spec, section "Errors":
687f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   *
688f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   *   * If an attribute name or attribute value in <attrib_list> is not
689f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   *     recognized (including unrecognized bits in bitmask attributes),
690f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   *     then an EGL_BAD_ATTRIBUTE error is generated."
691f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   */
692f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case __DRI_CTX_ERROR_UNKNOWN_ATTRIBUTE:
693f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case __DRI_CTX_ERROR_UNKNOWN_FLAG:
694f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      egl_error = EGL_BAD_ATTRIBUTE;
695f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
696f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
697f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   default:
698f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      assert(0);
699f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      egl_error = EGL_BAD_MATCH;
700f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
701f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
702f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
703f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   _eglError(egl_error, "dri2_create_context");
704f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
705f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
706f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
707f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Called via eglCreateContext(), drv->API.CreateContext().
708f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
709f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic _EGLContext *
710f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdri2_create_context(_EGLDriver *drv, _EGLDisplay *disp, _EGLConfig *conf,
711f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		    _EGLContext *share_list, const EGLint *attrib_list)
712f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
713f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct dri2_egl_context *dri2_ctx;
714f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct dri2_egl_display *dri2_dpy = dri2_egl_display(disp);
715f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct dri2_egl_context *dri2_ctx_shared = dri2_egl_context(share_list);
716f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   __DRIcontext *shared =
717f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      dri2_ctx_shared ? dri2_ctx_shared->dri_context : NULL;
718f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct dri2_egl_config *dri2_config = dri2_egl_config(conf);
719f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const __DRIconfig *dri_config;
720f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   int api;
721f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
722f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   (void) drv;
723f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
724f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   dri2_ctx = malloc(sizeof *dri2_ctx);
725f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!dri2_ctx) {
726f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _eglError(EGL_BAD_ALLOC, "eglCreateContext");
727f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return NULL;
728f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
729f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
730f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!_eglInitContext(&dri2_ctx->base, disp, conf, attrib_list))
731f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      goto cleanup;
732f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
733f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   switch (dri2_ctx->base.ClientAPI) {
734f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case EGL_OPENGL_ES_API:
735f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      switch (dri2_ctx->base.ClientMajorVersion) {
736f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case 1:
737f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         api = __DRI_API_GLES;
738f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
739f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case 2:
740f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case 3:
741f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         api = __DRI_API_GLES2;
742f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
743f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      default:
744f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 _eglError(EGL_BAD_PARAMETER, "eglCreateContext");
745f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 return NULL;
746f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
747f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
748f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case EGL_OPENGL_API:
749f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if ((dri2_ctx->base.ClientMajorVersion >= 4
750f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org           || (dri2_ctx->base.ClientMajorVersion == 3
751f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               && dri2_ctx->base.ClientMinorVersion >= 2))
752f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          && dri2_ctx->base.Profile == EGL_CONTEXT_OPENGL_CORE_PROFILE_BIT_KHR)
753f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         api = __DRI_API_OPENGL_CORE;
754f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      else
755f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         api = __DRI_API_OPENGL;
756f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
757f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   default:
758f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _eglError(EGL_BAD_PARAMETER, "eglCreateContext");
759f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return NULL;
760f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
761f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
762f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (conf != NULL) {
763f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* The config chosen here isn't necessarily
764f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       * used for surfaces later.
765f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       * A pixmap surface will use the single config.
766f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       * This opportunity depends on disabling the
767f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       * doubleBufferMode check in
768f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       * src/mesa/main/context.c:check_compatible()
769f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       */
770f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (dri2_config->dri_double_config)
771f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         dri_config = dri2_config->dri_double_config;
772f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      else
773f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         dri_config = dri2_config->dri_single_config;
774f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
775f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* EGL_WINDOW_BIT is set only when there is a dri_double_config.  This
776f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       * makes sure the back buffer will always be used.
777f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       */
778f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (conf->SurfaceType & EGL_WINDOW_BIT)
779f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         dri2_ctx->base.WindowRenderBuffer = EGL_BACK_BUFFER;
780f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
781f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else
782f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      dri_config = NULL;
783f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
784f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (dri2_dpy->dri2) {
785f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (dri2_dpy->dri2->base.version >= 3) {
786f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         unsigned error;
787f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         unsigned num_attribs = 0;
788f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         uint32_t ctx_attribs[8];
789f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
790f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         ctx_attribs[num_attribs++] = __DRI_CTX_ATTRIB_MAJOR_VERSION;
791f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         ctx_attribs[num_attribs++] = dri2_ctx->base.ClientMajorVersion;
792f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         ctx_attribs[num_attribs++] = __DRI_CTX_ATTRIB_MINOR_VERSION;
793f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         ctx_attribs[num_attribs++] = dri2_ctx->base.ClientMinorVersion;
794f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
795f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         if (dri2_ctx->base.Flags != 0) {
796f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            /* If the implementation doesn't support the __DRI2_ROBUSTNESS
797f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org             * extension, don't even try to send it the robust-access flag.
798f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org             * It may explode.  Instead, generate the required EGL error here.
799f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org             */
800f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            if ((dri2_ctx->base.Flags & EGL_CONTEXT_OPENGL_ROBUST_ACCESS_BIT_KHR) != 0
801f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                && !dri2_dpy->robustness) {
802f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               _eglError(EGL_BAD_MATCH, "eglCreateContext");
803f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               goto cleanup;
804f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            }
805f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
806f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            ctx_attribs[num_attribs++] = __DRI_CTX_ATTRIB_FLAGS;
807f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            ctx_attribs[num_attribs++] = dri2_ctx->base.Flags;
808f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         }
809f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
810f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         if (dri2_ctx->base.ResetNotificationStrategy != EGL_NO_RESET_NOTIFICATION_KHR) {
811f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            /* If the implementation doesn't support the __DRI2_ROBUSTNESS
812f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org             * extension, don't even try to send it a reset strategy.  It may
813f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org             * explode.  Instead, generate the required EGL error here.
814f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org             */
815f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            if (!dri2_dpy->robustness) {
816f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               _eglError(EGL_BAD_CONFIG, "eglCreateContext");
817f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               goto cleanup;
818f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            }
819f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
820f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            ctx_attribs[num_attribs++] = __DRI_CTX_ATTRIB_RESET_STRATEGY;
821f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            ctx_attribs[num_attribs++] = __DRI_CTX_RESET_LOSE_CONTEXT;
822f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         }
823f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
824f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         assert(num_attribs <= ARRAY_SIZE(ctx_attribs));
825f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
826f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 dri2_ctx->dri_context =
827f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    dri2_dpy->dri2->createContextAttribs(dri2_dpy->dri_screen,
828f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                                 api,
829f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                                 dri_config,
830f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                                 shared,
831f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                                 num_attribs / 2,
832f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                                 ctx_attribs,
833f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                                 & error,
834f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                                 dri2_ctx);
835f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 dri2_create_context_attribs_error(error);
836f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      } else {
837f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 dri2_ctx->dri_context =
838f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    dri2_dpy->dri2->createNewContextForAPI(dri2_dpy->dri_screen,
839f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org						   api,
840f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org						   dri_config,
841f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                                   shared,
842f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org						   dri2_ctx);
843f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
844f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   } else {
845f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      assert(dri2_dpy->swrast);
846f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      dri2_ctx->dri_context =
847f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         dri2_dpy->swrast->createNewContextForAPI(dri2_dpy->dri_screen,
848f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                                  api,
849f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                                  dri_config,
850f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                                  shared,
851f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                                  dri2_ctx);
852f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
853f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
854f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!dri2_ctx->dri_context)
855f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      goto cleanup;
856f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
857f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return &dri2_ctx->base;
858f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
859f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cleanup:
860f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   free(dri2_ctx);
861f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return NULL;
862f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
863f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
864f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
865f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Called via eglDestroyContext(), drv->API.DestroyContext().
866f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
867f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic EGLBoolean
868f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdri2_destroy_context(_EGLDriver *drv, _EGLDisplay *disp, _EGLContext *ctx)
869f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
870f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct dri2_egl_context *dri2_ctx = dri2_egl_context(ctx);
871f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct dri2_egl_display *dri2_dpy = dri2_egl_display(disp);
872f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
873f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (_eglPutContext(ctx)) {
874f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      dri2_dpy->core->destroyContext(dri2_ctx->dri_context);
875f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      free(dri2_ctx);
876f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
877f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
878f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return EGL_TRUE;
879f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
880f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
881f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
882f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Called via eglMakeCurrent(), drv->API.MakeCurrent().
883f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
884f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic EGLBoolean
885f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdri2_make_current(_EGLDriver *drv, _EGLDisplay *disp, _EGLSurface *dsurf,
886f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		  _EGLSurface *rsurf, _EGLContext *ctx)
887f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
888f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct dri2_egl_driver *dri2_drv = dri2_egl_driver(drv);
889f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct dri2_egl_display *dri2_dpy = dri2_egl_display(disp);
890f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct dri2_egl_surface *dri2_dsurf = dri2_egl_surface(dsurf);
891f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct dri2_egl_surface *dri2_rsurf = dri2_egl_surface(rsurf);
892f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct dri2_egl_context *dri2_ctx = dri2_egl_context(ctx);
893f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   _EGLContext *old_ctx;
894f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   _EGLSurface *old_dsurf, *old_rsurf;
895f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   __DRIdrawable *ddraw, *rdraw;
896f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   __DRIcontext *cctx;
897f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
898f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* make new bindings */
899f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!_eglBindContext(ctx, dsurf, rsurf, &old_ctx, &old_dsurf, &old_rsurf))
900f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return EGL_FALSE;
901f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
902f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* flush before context switch */
903f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (old_ctx && dri2_drv->glFlush)
904f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      dri2_drv->glFlush();
905f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
906f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ddraw = (dri2_dsurf) ? dri2_dsurf->dri_drawable : NULL;
907f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   rdraw = (dri2_rsurf) ? dri2_rsurf->dri_drawable : NULL;
908f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   cctx = (dri2_ctx) ? dri2_ctx->dri_context : NULL;
909f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
910f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (old_ctx) {
911f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      __DRIcontext *old_cctx = dri2_egl_context(old_ctx)->dri_context;
912f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      dri2_dpy->core->unbindContext(old_cctx);
913f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
914f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
915f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if ((cctx == NULL && ddraw == NULL && rdraw == NULL) ||
916f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       dri2_dpy->core->bindContext(cctx, ddraw, rdraw)) {
917f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (old_dsurf)
918f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         drv->API.DestroySurface(drv, disp, old_dsurf);
919f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (old_rsurf)
920f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         drv->API.DestroySurface(drv, disp, old_rsurf);
921f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (old_ctx)
922f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         drv->API.DestroyContext(drv, disp, old_ctx);
923f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
924f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return EGL_TRUE;
925f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   } else {
926f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* undo the previous _eglBindContext */
927f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _eglBindContext(old_ctx, old_dsurf, old_rsurf, &ctx, &dsurf, &rsurf);
928f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      assert(&dri2_ctx->base == ctx &&
929f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org             &dri2_dsurf->base == dsurf &&
930f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org             &dri2_rsurf->base == rsurf);
931f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
932f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _eglPutSurface(dsurf);
933f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _eglPutSurface(rsurf);
934f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _eglPutContext(ctx);
935f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
936f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _eglPutSurface(old_dsurf);
937f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _eglPutSurface(old_rsurf);
938f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _eglPutContext(old_ctx);
939f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
940f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return EGL_FALSE;
941f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
942f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
943f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
944f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/*
945f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Called from eglGetProcAddress() via drv->API.GetProcAddress().
946f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
947f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic _EGLProc
948f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdri2_get_proc_address(_EGLDriver *drv, const char *procname)
949f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
950f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct dri2_egl_driver *dri2_drv = dri2_egl_driver(drv);
951f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
952f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return dri2_drv->get_proc_address(procname);
953f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
954f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
955f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic EGLBoolean
956f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdri2_wait_client(_EGLDriver *drv, _EGLDisplay *disp, _EGLContext *ctx)
957f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
958f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct dri2_egl_display *dri2_dpy = dri2_egl_display(disp);
959f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct dri2_egl_surface *dri2_surf = dri2_egl_surface(ctx->DrawSurface);
960f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
961f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   (void) drv;
962f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
963f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* FIXME: If EGL allows frontbuffer rendering for window surfaces,
964f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * we need to copy fake to real here.*/
965f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
966f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   (*dri2_dpy->flush->flush)(dri2_surf->dri_drawable);
967f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
968f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return EGL_TRUE;
969f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
970f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
971f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic EGLBoolean
972f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdri2_wait_native(_EGLDriver *drv, _EGLDisplay *disp, EGLint engine)
973f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
974f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   (void) drv;
975f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   (void) disp;
976f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
977f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (engine != EGL_CORE_NATIVE_ENGINE)
978f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return _eglError(EGL_BAD_PARAMETER, "eglWaitNative");
979f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* glXWaitX(); */
980f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
981f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return EGL_TRUE;
982f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
983f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
984f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic EGLBoolean
985f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdri2_bind_tex_image(_EGLDriver *drv,
986f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		    _EGLDisplay *disp, _EGLSurface *surf, EGLint buffer)
987f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
988f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct dri2_egl_display *dri2_dpy = dri2_egl_display(disp);
989f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct dri2_egl_surface *dri2_surf = dri2_egl_surface(surf);
990f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct dri2_egl_context *dri2_ctx;
991f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   _EGLContext *ctx;
992f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLint format, target;
993f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
994f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ctx = _eglGetCurrentContext();
995f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   dri2_ctx = dri2_egl_context(ctx);
996f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
997f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!_eglBindTexImage(drv, disp, surf, buffer))
998f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return EGL_FALSE;
999f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1000f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   switch (dri2_surf->base.TextureFormat) {
1001f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case EGL_TEXTURE_RGB:
1002f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      format = __DRI_TEXTURE_FORMAT_RGB;
1003f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
1004f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case EGL_TEXTURE_RGBA:
1005f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      format = __DRI_TEXTURE_FORMAT_RGBA;
1006f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
1007f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   default:
1008f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      assert(0);
1009f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1010f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1011f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   switch (dri2_surf->base.TextureTarget) {
1012f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case EGL_TEXTURE_2D:
1013f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      target = GL_TEXTURE_2D;
1014f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
1015f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   default:
1016f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      assert(0);
1017f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1018f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1019f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   (*dri2_dpy->tex_buffer->setTexBuffer2)(dri2_ctx->dri_context,
1020f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					  target, format,
1021f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					  dri2_surf->dri_drawable);
1022f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1023f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return EGL_TRUE;
1024f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1025f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1026f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic EGLBoolean
1027f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdri2_release_tex_image(_EGLDriver *drv,
1028f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		       _EGLDisplay *disp, _EGLSurface *surf, EGLint buffer)
1029f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1030f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if __DRI_TEX_BUFFER_VERSION >= 3
1031f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct dri2_egl_display *dri2_dpy = dri2_egl_display(disp);
1032f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct dri2_egl_surface *dri2_surf = dri2_egl_surface(surf);
1033f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct dri2_egl_context *dri2_ctx;
1034f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   _EGLContext *ctx;
1035f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLint  target;
1036f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1037f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ctx = _eglGetCurrentContext();
1038f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   dri2_ctx = dri2_egl_context(ctx);
1039f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1040f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!_eglReleaseTexImage(drv, disp, surf, buffer))
1041f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return EGL_FALSE;
1042f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1043f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   switch (dri2_surf->base.TextureTarget) {
1044f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case EGL_TEXTURE_2D:
1045f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      target = GL_TEXTURE_2D;
1046f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
1047f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   default:
1048f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      assert(0);
1049f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1050f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (dri2_dpy->tex_buffer->releaseTexBuffer!=NULL)
1051f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    (*dri2_dpy->tex_buffer->releaseTexBuffer)(dri2_ctx->dri_context,
1052f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                             target,
1053f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                             dri2_surf->dri_drawable);
1054f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif
1055f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1056f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return EGL_TRUE;
1057f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1058f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1059f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic _EGLImage *
1060f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdri2_create_image(_EGLDisplay *disp, __DRIimage *dri_image)
1061f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1062f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct dri2_egl_image *dri2_img;
1063f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1064f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (dri_image == NULL) {
1065f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _eglError(EGL_BAD_ALLOC, "dri2_create_image");
1066f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return NULL;
1067f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1068f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1069f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   dri2_img = malloc(sizeof *dri2_img);
1070f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!dri2_img) {
1071f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _eglError(EGL_BAD_ALLOC, "dri2_create_image");
1072f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return NULL;
1073f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1074f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1075f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!_eglInitImage(&dri2_img->base, disp)) {
1076f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      free(dri2_img);
1077f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return NULL;
1078f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1079f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1080f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   dri2_img->dri_image = dri_image;
1081f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1082f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return &dri2_img->base;
1083f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1084f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1085f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic _EGLImage *
1086f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdri2_create_image_khr_renderbuffer(_EGLDisplay *disp, _EGLContext *ctx,
1087f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				   EGLClientBuffer buffer,
1088f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				   const EGLint *attr_list)
1089f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1090f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct dri2_egl_display *dri2_dpy = dri2_egl_display(disp);
1091f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct dri2_egl_context *dri2_ctx = dri2_egl_context(ctx);
1092f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLuint renderbuffer = (GLuint) (uintptr_t) buffer;
1093f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   __DRIimage *dri_image;
1094f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1095f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (renderbuffer == 0) {
1096f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _eglError(EGL_BAD_PARAMETER, "dri2_create_image_khr");
1097f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return EGL_NO_IMAGE_KHR;
1098f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1099f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   dri_image =
1101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      dri2_dpy->image->createImageFromRenderbuffer(dri2_ctx->dri_context,
1102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                                   renderbuffer, NULL);
1103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return dri2_create_image(disp, dri_image);
1105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic _EGLImage *
1108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdri2_create_image_mesa_drm_buffer(_EGLDisplay *disp, _EGLContext *ctx,
1109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				  EGLClientBuffer buffer, const EGLint *attr_list)
1110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct dri2_egl_display *dri2_dpy = dri2_egl_display(disp);
1112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   EGLint format, name, pitch, err;
1113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   _EGLImageAttribs attrs;
1114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   __DRIimage *dri_image;
1115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   name = (EGLint) (uintptr_t) buffer;
1117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   err = _eglParseImageAttribList(&attrs, disp, attr_list);
1119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (err != EGL_SUCCESS)
1120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return NULL;
1121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (attrs.Width <= 0 || attrs.Height <= 0 ||
1123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       attrs.DRMBufferStrideMESA <= 0) {
1124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _eglError(EGL_BAD_PARAMETER,
1125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		"bad width, height or stride");
1126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return NULL;
1127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   switch (attrs.DRMBufferFormatMESA) {
1130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case EGL_DRM_BUFFER_FORMAT_ARGB32_MESA:
1131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      format = __DRI_IMAGE_FORMAT_ARGB8888;
1132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      pitch = attrs.DRMBufferStrideMESA;
1133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
1134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   default:
1135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _eglError(EGL_BAD_PARAMETER,
1136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		"dri2_create_image_khr: unsupported pixmap depth");
1137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return NULL;
1138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   dri_image =
1141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      dri2_dpy->image->createImageFromName(dri2_dpy->dri_screen,
1142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					   attrs.Width,
1143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					   attrs.Height,
1144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					   format,
1145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					   name,
1146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					   pitch,
1147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					   NULL);
1148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return dri2_create_image(disp, dri_image);
1150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifdef HAVE_WAYLAND_PLATFORM
1153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* This structure describes how a wl_buffer maps to one or more
1155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * __DRIimages.  A wl_drm_buffer stores the wl_drm format code and the
1156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * offsets and strides of the planes in the buffer.  This table maps a
1157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * wl_drm format code to a description of the planes in the buffer
1158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * that lets us create a __DRIimage for each of the planes. */
1159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic const struct wl_drm_components_descriptor {
1161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   uint32_t dri_components;
1162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   EGLint components;
1163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   int nplanes;
1164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} wl_drm_components[] = {
1165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { __DRI_IMAGE_COMPONENTS_RGB, EGL_TEXTURE_RGB, 1 },
1166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { __DRI_IMAGE_COMPONENTS_RGBA, EGL_TEXTURE_RGBA, 1 },
1167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { __DRI_IMAGE_COMPONENTS_Y_U_V, EGL_TEXTURE_Y_U_V_WL, 3 },
1168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { __DRI_IMAGE_COMPONENTS_Y_UV, EGL_TEXTURE_Y_UV_WL, 2 },
1169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { __DRI_IMAGE_COMPONENTS_Y_XUXV, EGL_TEXTURE_Y_XUXV_WL, 2 },
1170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org};
1171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic _EGLImage *
1173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdri2_create_image_wayland_wl_buffer(_EGLDisplay *disp, _EGLContext *ctx,
1174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				    EGLClientBuffer _buffer,
1175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				    const EGLint *attr_list)
1176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct wl_drm_buffer *buffer = (struct wl_drm_buffer *) _buffer;
1178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct dri2_egl_display *dri2_dpy = dri2_egl_display(disp);
1179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const struct wl_drm_components_descriptor *f;
1180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   __DRIimage *dri_image;
1181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   _EGLImageAttribs attrs;
1182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   EGLint err;
1183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   int32_t plane;
1184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!wayland_buffer_is_drm(&buffer->buffer))
1186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       return NULL;
1187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   err = _eglParseImageAttribList(&attrs, disp, attr_list);
1189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   plane = attrs.PlaneWL;
1190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (err != EGL_SUCCESS) {
1191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _eglError(EGL_BAD_PARAMETER, "dri2_create_image_wayland_wl_buffer");
1192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return NULL;
1193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   f = buffer->driver_format;
1196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (plane < 0 || plane >= f->nplanes) {
1197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _eglError(EGL_BAD_PARAMETER,
1198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                "dri2_create_image_wayland_wl_buffer (plane out of bounds)");
1199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return NULL;
1200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   dri_image = dri2_dpy->image->fromPlanar(buffer->driver_buffer, plane, NULL);
1203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (dri_image == NULL) {
1205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _eglError(EGL_BAD_PARAMETER, "dri2_create_image_wayland_wl_buffer");
1206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return NULL;
1207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return dri2_create_image(disp, dri_image);
1210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif
1212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_EGLImage *
1214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdri2_create_image_khr(_EGLDriver *drv, _EGLDisplay *disp,
1215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		      _EGLContext *ctx, EGLenum target,
1216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		      EGLClientBuffer buffer, const EGLint *attr_list)
1217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   (void) drv;
1219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   switch (target) {
1221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case EGL_GL_RENDERBUFFER_KHR:
1222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return dri2_create_image_khr_renderbuffer(disp, ctx, buffer, attr_list);
1223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case EGL_DRM_BUFFER_MESA:
1224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return dri2_create_image_mesa_drm_buffer(disp, ctx, buffer, attr_list);
1225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifdef HAVE_WAYLAND_PLATFORM
1226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case EGL_WAYLAND_BUFFER_WL:
1227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return dri2_create_image_wayland_wl_buffer(disp, ctx, buffer, attr_list);
1228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif
1229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   default:
1230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _eglError(EGL_BAD_PARAMETER, "dri2_create_image_khr");
1231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return EGL_NO_IMAGE_KHR;
1232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic EGLBoolean
1236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdri2_destroy_image_khr(_EGLDriver *drv, _EGLDisplay *disp, _EGLImage *image)
1237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct dri2_egl_display *dri2_dpy = dri2_egl_display(disp);
1239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct dri2_egl_image *dri2_img = dri2_egl_image(image);
1240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   (void) drv;
1242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   dri2_dpy->image->destroyImage(dri2_img->dri_image);
1244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   free(dri2_img);
1245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return EGL_TRUE;
1247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic _EGLImage *
1250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdri2_create_drm_image_mesa(_EGLDriver *drv, _EGLDisplay *disp,
1251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			   const EGLint *attr_list)
1252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct dri2_egl_display *dri2_dpy = dri2_egl_display(disp);
1254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct dri2_egl_image *dri2_img;
1255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   _EGLImageAttribs attrs;
1256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   unsigned int dri_use, valid_mask;
1257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   int format;
1258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   EGLint err = EGL_SUCCESS;
1259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   (void) drv;
1261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   dri2_img = malloc(sizeof *dri2_img);
1263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!dri2_img) {
1264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _eglError(EGL_BAD_ALLOC, "dri2_create_image_khr");
1265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return EGL_NO_IMAGE_KHR;
1266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!attr_list) {
1269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      err = EGL_BAD_PARAMETER;
1270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      goto cleanup_img;
1271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!_eglInitImage(&dri2_img->base, disp)) {
1274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      err = EGL_BAD_PARAMETER;
1275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      goto cleanup_img;
1276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   err = _eglParseImageAttribList(&attrs, disp, attr_list);
1279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (err != EGL_SUCCESS)
1280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      goto cleanup_img;
1281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (attrs.Width <= 0 || attrs.Height <= 0) {
1283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _eglLog(_EGL_WARNING, "bad width or height (%dx%d)",
1284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            attrs.Width, attrs.Height);
1285f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      goto cleanup_img;
1286f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1287f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1288f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   switch (attrs.DRMBufferFormatMESA) {
1289f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case EGL_DRM_BUFFER_FORMAT_ARGB32_MESA:
1290f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      format = __DRI_IMAGE_FORMAT_ARGB8888;
1291f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
1292f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   default:
1293f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _eglLog(_EGL_WARNING, "bad image format value 0x%04x",
1294f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            attrs.DRMBufferFormatMESA);
1295f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      goto cleanup_img;
1296f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1297f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1298f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   valid_mask =
1299f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      EGL_DRM_BUFFER_USE_SCANOUT_MESA |
1300f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      EGL_DRM_BUFFER_USE_SHARE_MESA |
1301f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      EGL_DRM_BUFFER_USE_CURSOR_MESA;
1302f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (attrs.DRMBufferUseMESA & ~valid_mask) {
1303f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _eglLog(_EGL_WARNING, "bad image use bit 0x%04x",
1304f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            attrs.DRMBufferUseMESA & ~valid_mask);
1305f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      goto cleanup_img;
1306f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1307f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1308f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   dri_use = 0;
1309f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (attrs.DRMBufferUseMESA & EGL_DRM_BUFFER_USE_SHARE_MESA)
1310f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      dri_use |= __DRI_IMAGE_USE_SHARE;
1311f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (attrs.DRMBufferUseMESA & EGL_DRM_BUFFER_USE_SCANOUT_MESA)
1312f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      dri_use |= __DRI_IMAGE_USE_SCANOUT;
1313f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (attrs.DRMBufferUseMESA & EGL_DRM_BUFFER_USE_CURSOR_MESA)
1314f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      dri_use |= __DRI_IMAGE_USE_CURSOR;
1315f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1316f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   dri2_img->dri_image =
1317f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      dri2_dpy->image->createImage(dri2_dpy->dri_screen,
1318f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				   attrs.Width, attrs.Height,
1319f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                   format, dri_use, dri2_img);
1320f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (dri2_img->dri_image == NULL) {
1321f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      err = EGL_BAD_ALLOC;
1322f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      goto cleanup_img;
1323f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1324f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1325f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return &dri2_img->base;
1326f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1327f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cleanup_img:
1328f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   free(dri2_img);
1329f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   _eglError(err, "dri2_create_drm_image_mesa");
1330f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1331f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return EGL_NO_IMAGE_KHR;
1332f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1333f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1334f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic EGLBoolean
1335f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdri2_export_drm_image_mesa(_EGLDriver *drv, _EGLDisplay *disp, _EGLImage *img,
1336f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			  EGLint *name, EGLint *handle, EGLint *stride)
1337f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1338f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct dri2_egl_display *dri2_dpy = dri2_egl_display(disp);
1339f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct dri2_egl_image *dri2_img = dri2_egl_image(img);
1340f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1341f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   (void) drv;
1342f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1343f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (name && !dri2_dpy->image->queryImage(dri2_img->dri_image,
1344f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					    __DRI_IMAGE_ATTRIB_NAME, name)) {
1345f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _eglError(EGL_BAD_ALLOC, "dri2_export_drm_image_mesa");
1346f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return EGL_FALSE;
1347f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1348f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1349f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (handle)
1350f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      dri2_dpy->image->queryImage(dri2_img->dri_image,
1351f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				  __DRI_IMAGE_ATTRIB_HANDLE, handle);
1352f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1353f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (stride)
1354f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      dri2_dpy->image->queryImage(dri2_img->dri_image,
1355f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				  __DRI_IMAGE_ATTRIB_STRIDE, stride);
1356f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1357f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return EGL_TRUE;
1358f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1359f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1360f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifdef HAVE_WAYLAND_PLATFORM
1361f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1362f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void
1363f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdri2_wl_reference_buffer(void *user_data, uint32_t name,
1364f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                         struct wl_drm_buffer *buffer)
1365f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1366f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   _EGLDisplay *disp = user_data;
1367f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct dri2_egl_display *dri2_dpy = dri2_egl_display(disp);
1368f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   __DRIimage *img;
1369f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   int i, dri_components = 0;
1370f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1371f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   img = dri2_dpy->image->createImageFromNames(dri2_dpy->dri_screen,
1372f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                               buffer->buffer.width,
1373f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                               buffer->buffer.height,
1374f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                               buffer->format, (int*)&name, 1,
1375f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                               buffer->stride,
1376f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                               buffer->offset,
1377f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                               NULL);
1378f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1379f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (img == NULL)
1380f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return;
1381f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1382f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   dri2_dpy->image->queryImage(img, __DRI_IMAGE_ATTRIB_COMPONENTS, &dri_components);
1383f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1384f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   buffer->driver_format = NULL;
1385f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (i = 0; i < ARRAY_SIZE(wl_drm_components); i++)
1386f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (wl_drm_components[i].dri_components == dri_components)
1387f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         buffer->driver_format = &wl_drm_components[i];
1388f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1389f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (buffer->driver_format == NULL)
1390f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      dri2_dpy->image->destroyImage(img);
1391f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else
1392f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      buffer->driver_buffer = img;
1393f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1394f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1395f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void
1396f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdri2_wl_release_buffer(void *user_data, struct wl_drm_buffer *buffer)
1397f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1398f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   _EGLDisplay *disp = user_data;
1399f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct dri2_egl_display *dri2_dpy = dri2_egl_display(disp);
1400f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1401f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   dri2_dpy->image->destroyImage(buffer->driver_buffer);
1402f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1403f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1404f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic struct wayland_drm_callbacks wl_drm_callbacks = {
1405f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	.authenticate = NULL,
1406f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	.reference_buffer = dri2_wl_reference_buffer,
1407f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	.release_buffer = dri2_wl_release_buffer
1408f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org};
1409f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1410f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic EGLBoolean
1411f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdri2_bind_wayland_display_wl(_EGLDriver *drv, _EGLDisplay *disp,
1412f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			     struct wl_display *wl_dpy)
1413f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1414f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct dri2_egl_display *dri2_dpy = dri2_egl_display(disp);
1415f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1416f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   (void) drv;
1417f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1418f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (dri2_dpy->wl_server_drm)
1419f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	   return EGL_FALSE;
1420f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1421f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   wl_drm_callbacks.authenticate =
1422f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      (int(*)(void *, uint32_t)) dri2_dpy->authenticate;
1423f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1424f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   dri2_dpy->wl_server_drm =
1425f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	   wayland_drm_init(wl_dpy, dri2_dpy->device_name,
1426f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                            &wl_drm_callbacks, disp);
1427f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1428f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!dri2_dpy->wl_server_drm)
1429f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	   return EGL_FALSE;
1430f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1431f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return EGL_TRUE;
1432f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1433f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1434f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic EGLBoolean
1435f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdri2_unbind_wayland_display_wl(_EGLDriver *drv, _EGLDisplay *disp,
1436f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			       struct wl_display *wl_dpy)
1437f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1438f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct dri2_egl_display *dri2_dpy = dri2_egl_display(disp);
1439f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1440f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   (void) drv;
1441f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1442f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!dri2_dpy->wl_server_drm)
1443f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	   return EGL_FALSE;
1444f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1445f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   wayland_drm_uninit(dri2_dpy->wl_server_drm);
1446f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   dri2_dpy->wl_server_drm = NULL;
1447f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1448f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return EGL_TRUE;
1449f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1450f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1451f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic EGLBoolean
1452f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdri2_query_wayland_buffer_wl(_EGLDriver *drv, _EGLDisplay *disp,
1453f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                             struct wl_buffer *_buffer,
1454f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                             EGLint attribute, EGLint *value)
1455f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1456f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct wl_drm_buffer *buffer = (struct wl_drm_buffer *) _buffer;
1457f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const struct wl_drm_components_descriptor *format;
1458f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1459f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!wayland_buffer_is_drm(&buffer->buffer))
1460f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return EGL_FALSE;
1461f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1462f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   format = buffer->driver_format;
1463f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   switch (attribute) {
1464f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case EGL_TEXTURE_FORMAT:
1465f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      *value = format->components;
1466f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return EGL_TRUE;
1467f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case EGL_WIDTH:
1468f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      *value = buffer->buffer.width;
1469f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
1470f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case EGL_HEIGHT:
1471f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      *value = buffer->buffer.height;
1472f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
1473f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1474f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1475f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return EGL_FALSE;
1476f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1477f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif
1478f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1479f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void
1480f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdri2_unload(_EGLDriver *drv)
1481f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1482f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct dri2_egl_driver *dri2_drv = dri2_egl_driver(drv);
1483f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1484f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (dri2_drv->handle)
1485f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      dlclose(dri2_drv->handle);
1486f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   free(dri2_drv);
1487f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1488f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1489f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic EGLBoolean
1490f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdri2_load(_EGLDriver *drv)
1491f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1492f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct dri2_egl_driver *dri2_drv = dri2_egl_driver(drv);
1493f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifdef HAVE_SHARED_GLAPI
1494f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifdef HAVE_ANDROID_PLATFORM
1495f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const char *libname = "libglapi.so";
1496f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#else
1497f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const char *libname = "libglapi.so.0";
1498f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif
1499f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#else
1500f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /*
1501f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * Both libGL.so and libglapi.so are glapi providers.  There is no way to
1502f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * tell which one to load.
1503f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
1504f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const char *libname = NULL;
1505f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif
1506f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   void *handle;
1507f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1508f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* RTLD_GLOBAL to make sure glapi symbols are visible to DRI drivers */
1509f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   handle = dlopen(libname, RTLD_LAZY | RTLD_GLOBAL);
1510f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (handle) {
1511f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      dri2_drv->get_proc_address = (_EGLProc (*)(const char *))
1512f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         dlsym(handle, "_glapi_get_proc_address");
1513f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (!dri2_drv->get_proc_address || !libname) {
1514f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         /* no need to keep a reference */
1515f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         dlclose(handle);
1516f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         handle = NULL;
1517f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
1518f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1519f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1520f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* if glapi is not available, loading DRI drivers will fail */
1521f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!dri2_drv->get_proc_address) {
1522f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _eglLog(_EGL_WARNING, "DRI2: failed to find _glapi_get_proc_address");
1523f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return EGL_FALSE;
1524f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1525f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1526f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   dri2_drv->glFlush = (void (*)(void))
1527f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      dri2_drv->get_proc_address("glFlush");
1528f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1529f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   dri2_drv->handle = handle;
1530f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1531f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return EGL_TRUE;
1532f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1533f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1534f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
1535f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * This is the main entrypoint into the driver, called by libEGL.
1536f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Create a new _EGLDriver object and init its dispatch table.
1537f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
1538f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_EGLDriver *
1539f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_eglBuiltInDriverDRI2(const char *args)
1540f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1541f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct dri2_egl_driver *dri2_drv;
1542f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1543f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   (void) args;
1544f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1545f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   dri2_drv = malloc(sizeof *dri2_drv);
1546f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!dri2_drv)
1547f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return NULL;
1548f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1549f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   memset(dri2_drv, 0, sizeof *dri2_drv);
1550f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1551f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!dri2_load(&dri2_drv->base)) {
1552f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      free(dri2_drv);
1553f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return NULL;
1554f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1555f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1556f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   _eglInitDriverFallbacks(&dri2_drv->base);
1557f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   dri2_drv->base.API.Initialize = dri2_initialize;
1558f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   dri2_drv->base.API.Terminate = dri2_terminate;
1559f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   dri2_drv->base.API.CreateContext = dri2_create_context;
1560f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   dri2_drv->base.API.DestroyContext = dri2_destroy_context;
1561f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   dri2_drv->base.API.MakeCurrent = dri2_make_current;
1562f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   dri2_drv->base.API.GetProcAddress = dri2_get_proc_address;
1563f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   dri2_drv->base.API.WaitClient = dri2_wait_client;
1564f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   dri2_drv->base.API.WaitNative = dri2_wait_native;
1565f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   dri2_drv->base.API.BindTexImage = dri2_bind_tex_image;
1566f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   dri2_drv->base.API.ReleaseTexImage = dri2_release_tex_image;
1567f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   dri2_drv->base.API.CreateImageKHR = dri2_create_image_khr;
1568f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   dri2_drv->base.API.DestroyImageKHR = dri2_destroy_image_khr;
1569f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   dri2_drv->base.API.CreateDRMImageMESA = dri2_create_drm_image_mesa;
1570f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   dri2_drv->base.API.ExportDRMImageMESA = dri2_export_drm_image_mesa;
1571f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifdef HAVE_WAYLAND_PLATFORM
1572f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   dri2_drv->base.API.BindWaylandDisplayWL = dri2_bind_wayland_display_wl;
1573f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   dri2_drv->base.API.UnbindWaylandDisplayWL = dri2_unbind_wayland_display_wl;
1574f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   dri2_drv->base.API.QueryWaylandBufferWL = dri2_query_wayland_buffer_wl;
1575f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif
1576f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1577f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   dri2_drv->base.Name = "DRI2";
1578f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   dri2_drv->base.Unload = dri2_unload;
1579f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1580f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return &dri2_drv->base;
1581f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1582