1f2001df508fda599a18b3586d2775e970a3db13aChia-I Wu/**************************************************************************
2f2001df508fda599a18b3586d2775e970a3db13aChia-I Wu *
3f2001df508fda599a18b3586d2775e970a3db13aChia-I Wu * Copyright 2008 Tungsten Graphics, Inc., Cedar Park, Texas.
4f2001df508fda599a18b3586d2775e970a3db13aChia-I Wu * Copyright 2009-2010 Chia-I Wu <olvaffe@gmail.com>
5f2001df508fda599a18b3586d2775e970a3db13aChia-I Wu * Copyright 2010-2011 LunarG, Inc.
6f2001df508fda599a18b3586d2775e970a3db13aChia-I Wu * All Rights Reserved.
7f2001df508fda599a18b3586d2775e970a3db13aChia-I Wu *
8f2001df508fda599a18b3586d2775e970a3db13aChia-I Wu * Permission is hereby granted, free of charge, to any person obtaining a
9f2001df508fda599a18b3586d2775e970a3db13aChia-I Wu * copy of this software and associated documentation files (the
10f2001df508fda599a18b3586d2775e970a3db13aChia-I Wu * "Software"), to deal in the Software without restriction, including
11f2001df508fda599a18b3586d2775e970a3db13aChia-I Wu * without limitation the rights to use, copy, modify, merge, publish,
12f2001df508fda599a18b3586d2775e970a3db13aChia-I Wu * distribute, sub license, and/or sell copies of the Software, and to
13f2001df508fda599a18b3586d2775e970a3db13aChia-I Wu * permit persons to whom the Software is furnished to do so, subject to
14f2001df508fda599a18b3586d2775e970a3db13aChia-I Wu * the following conditions:
15f2001df508fda599a18b3586d2775e970a3db13aChia-I Wu *
16f2001df508fda599a18b3586d2775e970a3db13aChia-I Wu * The above copyright notice and this permission notice (including the
17f2001df508fda599a18b3586d2775e970a3db13aChia-I Wu * next paragraph) shall be included in all copies or substantial portions
18f2001df508fda599a18b3586d2775e970a3db13aChia-I Wu * of the Software.
19f2001df508fda599a18b3586d2775e970a3db13aChia-I Wu *
20f2001df508fda599a18b3586d2775e970a3db13aChia-I Wu * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
21f2001df508fda599a18b3586d2775e970a3db13aChia-I Wu * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
22f2001df508fda599a18b3586d2775e970a3db13aChia-I Wu * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
23f2001df508fda599a18b3586d2775e970a3db13aChia-I Wu * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
24f2001df508fda599a18b3586d2775e970a3db13aChia-I Wu * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
25f2001df508fda599a18b3586d2775e970a3db13aChia-I Wu * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
26f2001df508fda599a18b3586d2775e970a3db13aChia-I Wu * DEALINGS IN THE SOFTWARE.
27f2001df508fda599a18b3586d2775e970a3db13aChia-I Wu *
28f2001df508fda599a18b3586d2775e970a3db13aChia-I Wu **************************************************************************/
29f2001df508fda599a18b3586d2775e970a3db13aChia-I Wu
30f2001df508fda599a18b3586d2775e970a3db13aChia-I Wu
31adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul#include <assert.h>
32adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul#include <stdlib.h>
33adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul#include <string.h>
34adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul#include "eglconfig.h"
35adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul#include "eglcontext.h"
36d548bf41d3a0fe443494f94f745d1fe49e5e432cBrian Paul#include "egldisplay.h"
3794cb321b5d246185abf71d89968d472a626f1a23Chia-I Wu#include "eglcurrent.h"
38adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul#include "eglsurface.h"
39caa5c8dfe8e5857aa25b2a3fa649d553e651e144Chia-I Wu#include "egllog.h"
40caa5c8dfe8e5857aa25b2a3fa649d553e651e144Chia-I Wu
41caa5c8dfe8e5857aa25b2a3fa649d553e651e144Chia-I Wu
42caa5c8dfe8e5857aa25b2a3fa649d553e651e144Chia-I Wu/**
43caa5c8dfe8e5857aa25b2a3fa649d553e651e144Chia-I Wu * Return the API bit (one of EGL_xxx_BIT) of the context.
44caa5c8dfe8e5857aa25b2a3fa649d553e651e144Chia-I Wu */
45caa5c8dfe8e5857aa25b2a3fa649d553e651e144Chia-I Wustatic EGLint
46caa5c8dfe8e5857aa25b2a3fa649d553e651e144Chia-I Wu_eglGetContextAPIBit(_EGLContext *ctx)
47caa5c8dfe8e5857aa25b2a3fa649d553e651e144Chia-I Wu{
48caa5c8dfe8e5857aa25b2a3fa649d553e651e144Chia-I Wu   EGLint bit = 0;
49caa5c8dfe8e5857aa25b2a3fa649d553e651e144Chia-I Wu
50caa5c8dfe8e5857aa25b2a3fa649d553e651e144Chia-I Wu   switch (ctx->ClientAPI) {
51caa5c8dfe8e5857aa25b2a3fa649d553e651e144Chia-I Wu   case EGL_OPENGL_ES_API:
523fd79dd9886f05f45f3dc94c028a38dd75b8ee1bIan Romanick      switch (ctx->ClientMajorVersion) {
53caa5c8dfe8e5857aa25b2a3fa649d553e651e144Chia-I Wu      case 1:
54caa5c8dfe8e5857aa25b2a3fa649d553e651e144Chia-I Wu         bit = EGL_OPENGL_ES_BIT;
55caa5c8dfe8e5857aa25b2a3fa649d553e651e144Chia-I Wu         break;
56caa5c8dfe8e5857aa25b2a3fa649d553e651e144Chia-I Wu      case 2:
57dbecb413008c19e1864de93d9a8a9123bfee46e7Ian Romanick      case 3:
58caa5c8dfe8e5857aa25b2a3fa649d553e651e144Chia-I Wu         bit = EGL_OPENGL_ES2_BIT;
59caa5c8dfe8e5857aa25b2a3fa649d553e651e144Chia-I Wu         break;
60caa5c8dfe8e5857aa25b2a3fa649d553e651e144Chia-I Wu      default:
61caa5c8dfe8e5857aa25b2a3fa649d553e651e144Chia-I Wu         break;
62caa5c8dfe8e5857aa25b2a3fa649d553e651e144Chia-I Wu      }
63caa5c8dfe8e5857aa25b2a3fa649d553e651e144Chia-I Wu      break;
64caa5c8dfe8e5857aa25b2a3fa649d553e651e144Chia-I Wu   case EGL_OPENVG_API:
65caa5c8dfe8e5857aa25b2a3fa649d553e651e144Chia-I Wu      bit = EGL_OPENVG_BIT;
66caa5c8dfe8e5857aa25b2a3fa649d553e651e144Chia-I Wu      break;
67caa5c8dfe8e5857aa25b2a3fa649d553e651e144Chia-I Wu   case EGL_OPENGL_API:
68caa5c8dfe8e5857aa25b2a3fa649d553e651e144Chia-I Wu      bit = EGL_OPENGL_BIT;
69caa5c8dfe8e5857aa25b2a3fa649d553e651e144Chia-I Wu      break;
70caa5c8dfe8e5857aa25b2a3fa649d553e651e144Chia-I Wu   default:
71caa5c8dfe8e5857aa25b2a3fa649d553e651e144Chia-I Wu      break;
72caa5c8dfe8e5857aa25b2a3fa649d553e651e144Chia-I Wu   }
73caa5c8dfe8e5857aa25b2a3fa649d553e651e144Chia-I Wu
74caa5c8dfe8e5857aa25b2a3fa649d553e651e144Chia-I Wu   return bit;
75caa5c8dfe8e5857aa25b2a3fa649d553e651e144Chia-I Wu}
76caa5c8dfe8e5857aa25b2a3fa649d553e651e144Chia-I Wu
77caa5c8dfe8e5857aa25b2a3fa649d553e651e144Chia-I Wu
78caa5c8dfe8e5857aa25b2a3fa649d553e651e144Chia-I Wu/**
79caa5c8dfe8e5857aa25b2a3fa649d553e651e144Chia-I Wu * Parse the list of context attributes and return the proper error code.
80caa5c8dfe8e5857aa25b2a3fa649d553e651e144Chia-I Wu */
81caa5c8dfe8e5857aa25b2a3fa649d553e651e144Chia-I Wustatic EGLint
8263beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick_eglParseContextAttribList(_EGLContext *ctx, _EGLDisplay *dpy,
8363beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick                           const EGLint *attrib_list)
84caa5c8dfe8e5857aa25b2a3fa649d553e651e144Chia-I Wu{
85caa5c8dfe8e5857aa25b2a3fa649d553e651e144Chia-I Wu   EGLenum api = ctx->ClientAPI;
86caa5c8dfe8e5857aa25b2a3fa649d553e651e144Chia-I Wu   EGLint i, err = EGL_SUCCESS;
87caa5c8dfe8e5857aa25b2a3fa649d553e651e144Chia-I Wu
88caa5c8dfe8e5857aa25b2a3fa649d553e651e144Chia-I Wu   if (!attrib_list)
89caa5c8dfe8e5857aa25b2a3fa649d553e651e144Chia-I Wu      return EGL_SUCCESS;
90caa5c8dfe8e5857aa25b2a3fa649d553e651e144Chia-I Wu
9163beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick   if (api == EGL_OPENVG_API && attrib_list[0] != EGL_NONE) {
9263beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick      _eglLog(_EGL_DEBUG, "bad context attribute 0x%04x", attrib_list[0]);
9363beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick      return EGL_BAD_ATTRIBUTE;
9463beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick   }
9563beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick
96caa5c8dfe8e5857aa25b2a3fa649d553e651e144Chia-I Wu   for (i = 0; attrib_list[i] != EGL_NONE; i++) {
97caa5c8dfe8e5857aa25b2a3fa649d553e651e144Chia-I Wu      EGLint attr = attrib_list[i++];
98caa5c8dfe8e5857aa25b2a3fa649d553e651e144Chia-I Wu      EGLint val = attrib_list[i];
99caa5c8dfe8e5857aa25b2a3fa649d553e651e144Chia-I Wu
100caa5c8dfe8e5857aa25b2a3fa649d553e651e144Chia-I Wu      switch (attr) {
101caa5c8dfe8e5857aa25b2a3fa649d553e651e144Chia-I Wu      case EGL_CONTEXT_CLIENT_VERSION:
10263beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick         ctx->ClientMajorVersion = val;
10363beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick         break;
10463beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick
10563beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick      case EGL_CONTEXT_MINOR_VERSION_KHR:
10663beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick         if (!dpy->Extensions.KHR_create_context) {
107caa5c8dfe8e5857aa25b2a3fa649d553e651e144Chia-I Wu            err = EGL_BAD_ATTRIBUTE;
108caa5c8dfe8e5857aa25b2a3fa649d553e651e144Chia-I Wu            break;
109caa5c8dfe8e5857aa25b2a3fa649d553e651e144Chia-I Wu         }
11063beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick
11163beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick         ctx->ClientMinorVersion = val;
11263beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick         break;
11363beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick
11463beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick      case EGL_CONTEXT_FLAGS_KHR:
11563beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick         if (!dpy->Extensions.KHR_create_context) {
116caa5c8dfe8e5857aa25b2a3fa649d553e651e144Chia-I Wu            err = EGL_BAD_ATTRIBUTE;
117caa5c8dfe8e5857aa25b2a3fa649d553e651e144Chia-I Wu            break;
118caa5c8dfe8e5857aa25b2a3fa649d553e651e144Chia-I Wu         }
11963beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick
12063beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick         /* The EGL_KHR_create_context spec says:
12163beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick          *
12263beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick          *     "Flags are only defined for OpenGL context creation, and
12363beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick          *     specifying a flags value other than zero for other types of
12463beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick          *     contexts, including OpenGL ES contexts, will generate an
12563beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick          *     error."
12663beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick          */
12763beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick         if (api != EGL_OPENGL_API && val != 0) {
12863beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick            err = EGL_BAD_ATTRIBUTE;
12963beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick            break;
13063beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick         }
13163beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick
13263beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick         ctx->Flags = val;
133caa5c8dfe8e5857aa25b2a3fa649d553e651e144Chia-I Wu         break;
13463beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick
13563beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick      case EGL_CONTEXT_OPENGL_PROFILE_MASK_KHR:
13663beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick         if (!dpy->Extensions.KHR_create_context) {
13763beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick            err = EGL_BAD_ATTRIBUTE;
13863beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick            break;
13963beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick         }
14063beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick
14163beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick         /* The EGL_KHR_create_context spec says:
14263beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick          *
14363beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick          *     "[EGL_CONTEXT_OPENGL_PROFILE_MASK_KHR] is only meaningful for
14463beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick          *     OpenGL contexts, and specifying it for other types of
14563beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick          *     contexts, including OpenGL ES contexts, will generate an
14663beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick          *     error."
14763beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick          */
14863beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick         if (api != EGL_OPENGL_API) {
14963beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick            err = EGL_BAD_ATTRIBUTE;
15063beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick            break;
15163beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick         }
15263beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick
15363beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick         ctx->Profile = val;
15463beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick         break;
15563beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick
15663beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick      case EGL_CONTEXT_OPENGL_RESET_NOTIFICATION_STRATEGY_KHR:
15763beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick         /* The EGL_KHR_create_context spec says:
15863beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick          *
15963beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick          *     "[EGL_CONTEXT_OPENGL_RESET_NOTIFICATION_STRATEGY_KHR] is only
16063beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick          *     meaningful for OpenGL contexts, and specifying it for other
16163beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick          *     types of contexts, including OpenGL ES contexts, will generate
16263beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick          *     an error."
16363beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick          */
16463beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick           if (!dpy->Extensions.KHR_create_context
16563beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick               || api != EGL_OPENGL_API) {
16663beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick            err = EGL_BAD_ATTRIBUTE;
16763beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick            break;
16863beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick         }
16963beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick
17063beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick         ctx->ResetNotificationStrategy = val;
17163beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick         break;
17263beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick
173f171571bfc897921cee63cbba3b71fd9b64174c9Ian Romanick      case EGL_CONTEXT_OPENGL_RESET_NOTIFICATION_STRATEGY_EXT:
174f171571bfc897921cee63cbba3b71fd9b64174c9Ian Romanick         /* The EGL_EXT_create_context_robustness spec says:
175f171571bfc897921cee63cbba3b71fd9b64174c9Ian Romanick          *
176f171571bfc897921cee63cbba3b71fd9b64174c9Ian Romanick          *     "[EGL_CONTEXT_OPENGL_RESET_NOTIFICATION_STRATEGY_EXT] is only
177f171571bfc897921cee63cbba3b71fd9b64174c9Ian Romanick          *     meaningful for OpenGL ES contexts, and specifying it for other
178f171571bfc897921cee63cbba3b71fd9b64174c9Ian Romanick          *     types of contexts will generate an EGL_BAD_ATTRIBUTE error."
179f171571bfc897921cee63cbba3b71fd9b64174c9Ian Romanick          */
180f171571bfc897921cee63cbba3b71fd9b64174c9Ian Romanick         if (!dpy->Extensions.EXT_create_context_robustness
181f171571bfc897921cee63cbba3b71fd9b64174c9Ian Romanick             || api != EGL_OPENGL_ES_API) {
182f171571bfc897921cee63cbba3b71fd9b64174c9Ian Romanick            err = EGL_BAD_ATTRIBUTE;
183f171571bfc897921cee63cbba3b71fd9b64174c9Ian Romanick            break;
184f171571bfc897921cee63cbba3b71fd9b64174c9Ian Romanick         }
185f171571bfc897921cee63cbba3b71fd9b64174c9Ian Romanick
186f171571bfc897921cee63cbba3b71fd9b64174c9Ian Romanick         ctx->ResetNotificationStrategy = val;
187f171571bfc897921cee63cbba3b71fd9b64174c9Ian Romanick         break;
188f171571bfc897921cee63cbba3b71fd9b64174c9Ian Romanick
189f171571bfc897921cee63cbba3b71fd9b64174c9Ian Romanick      case EGL_CONTEXT_OPENGL_ROBUST_ACCESS_EXT:
190f171571bfc897921cee63cbba3b71fd9b64174c9Ian Romanick         if (!dpy->Extensions.EXT_create_context_robustness) {
191f171571bfc897921cee63cbba3b71fd9b64174c9Ian Romanick            err = EGL_BAD_ATTRIBUTE;
192f171571bfc897921cee63cbba3b71fd9b64174c9Ian Romanick            break;
193f171571bfc897921cee63cbba3b71fd9b64174c9Ian Romanick         }
194f171571bfc897921cee63cbba3b71fd9b64174c9Ian Romanick
195f171571bfc897921cee63cbba3b71fd9b64174c9Ian Romanick         ctx->Flags = EGL_CONTEXT_OPENGL_ROBUST_ACCESS_BIT_KHR;
196f171571bfc897921cee63cbba3b71fd9b64174c9Ian Romanick         break;
197f171571bfc897921cee63cbba3b71fd9b64174c9Ian Romanick
198caa5c8dfe8e5857aa25b2a3fa649d553e651e144Chia-I Wu      default:
199caa5c8dfe8e5857aa25b2a3fa649d553e651e144Chia-I Wu         err = EGL_BAD_ATTRIBUTE;
200caa5c8dfe8e5857aa25b2a3fa649d553e651e144Chia-I Wu         break;
201caa5c8dfe8e5857aa25b2a3fa649d553e651e144Chia-I Wu      }
202caa5c8dfe8e5857aa25b2a3fa649d553e651e144Chia-I Wu
203caa5c8dfe8e5857aa25b2a3fa649d553e651e144Chia-I Wu      if (err != EGL_SUCCESS) {
204caa5c8dfe8e5857aa25b2a3fa649d553e651e144Chia-I Wu         _eglLog(_EGL_DEBUG, "bad context attribute 0x%04x", attr);
205caa5c8dfe8e5857aa25b2a3fa649d553e651e144Chia-I Wu         break;
206caa5c8dfe8e5857aa25b2a3fa649d553e651e144Chia-I Wu      }
207caa5c8dfe8e5857aa25b2a3fa649d553e651e144Chia-I Wu   }
208caa5c8dfe8e5857aa25b2a3fa649d553e651e144Chia-I Wu
20963beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick   if (api == EGL_OPENGL_API) {
21063beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick      /* The EGL_KHR_create_context spec says:
21163beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick       *
21263beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick       *     "If the requested OpenGL version is less than 3.2,
21363beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick       *     EGL_CONTEXT_OPENGL_PROFILE_MASK_KHR is ignored and the
21463beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick       *     functionality of the context is determined solely by the
21563beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick       *     requested version."
21663beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick       *
21763beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick       * Since the value is ignored, only validate the setting if the version
21863beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick       * is >= 3.2.
21963beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick       */
22063beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick      if (ctx->ClientMajorVersion >= 4
22163beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick          || (ctx->ClientMajorVersion == 3 && ctx->ClientMinorVersion >= 2)) {
22263beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick         switch (ctx->Profile) {
22363beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick         case EGL_CONTEXT_OPENGL_CORE_PROFILE_BIT_KHR:
22463beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick         case EGL_CONTEXT_OPENGL_COMPATIBILITY_PROFILE_BIT_KHR:
22563beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick            break;
22663beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick
22763beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick         default:
22863beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick            /* The EGL_KHR_create_context spec says:
22963beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick             *
23063beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick             *     "* If an OpenGL context is requested, the requested version
23163beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick             *        is greater than 3.2, and the value for attribute
232cf7634d9665b26a321a9d8542d50c76693141b52Matt Turner             *        EGL_CONTEXT_OPENGL_PROFILE_MASK_KHR has no bits set; has
233cf7634d9665b26a321a9d8542d50c76693141b52Matt Turner             *        any bits set other than EGL_CONTEXT_OPENGL_CORE_PROFILE_BIT_KHR
234cf7634d9665b26a321a9d8542d50c76693141b52Matt Turner             *        and EGL_CONTEXT_OPENGL_COMPATIBILITY_PROFILE_BIT_KHR; has
235cf7634d9665b26a321a9d8542d50c76693141b52Matt Turner             *        more than one of these bits set; or if the implementation does
236cf7634d9665b26a321a9d8542d50c76693141b52Matt Turner             *        not support the requested profile, then an EGL_BAD_MATCH error
237cf7634d9665b26a321a9d8542d50c76693141b52Matt Turner             *        is generated."
23863beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick             */
239cf7634d9665b26a321a9d8542d50c76693141b52Matt Turner            err = EGL_BAD_MATCH;
24063beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick            break;
24163beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick         }
24263beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick      }
24363beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick
24463beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick      /* The EGL_KHR_create_context spec says:
24563beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick       *
24663beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick       *     "* If an OpenGL context is requested and the values for
24763beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick       *        attributes EGL_CONTEXT_MAJOR_VERSION_KHR and
24863beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick       *        EGL_CONTEXT_MINOR_VERSION_KHR, when considered together with
24963beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick       *        the value for attribute
25063beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick       *        EGL_CONTEXT_FORWARD_COMPATIBLE_BIT_KHR, specify an OpenGL
25163beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick       *        version and feature set that are not defined, than an
25263beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick       *        EGL_BAD_MATCH error is generated.
25363beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick       *
25463beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick       *        ... Thus, examples of invalid combinations of attributes
25563beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick       *        include:
25663beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick       *
25763beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick       *          - Major version < 1 or > 4
25863beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick       *          - Major version == 1 and minor version < 0 or > 5
25963beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick       *          - Major version == 2 and minor version < 0 or > 1
26063beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick       *          - Major version == 3 and minor version < 0 or > 2
26163beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick       *          - Major version == 4 and minor version < 0 or > 2
26263beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick       *          - Forward-compatible flag set and major version < 3"
26363beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick       */
26463beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick      if (ctx->ClientMajorVersion < 1 || ctx->ClientMinorVersion < 0)
26563beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick         err = EGL_BAD_MATCH;
26663beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick
26763beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick      switch (ctx->ClientMajorVersion) {
26863beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick      case 1:
26963beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick         if (ctx->ClientMinorVersion > 5
27063beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick             || (ctx->Flags & EGL_CONTEXT_OPENGL_FORWARD_COMPATIBLE_BIT_KHR) != 0)
27163beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick            err = EGL_BAD_MATCH;
27263beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick         break;
27363beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick
27463beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick      case 2:
27563beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick         if (ctx->ClientMinorVersion > 1
27663beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick             || (ctx->Flags & EGL_CONTEXT_OPENGL_FORWARD_COMPATIBLE_BIT_KHR) != 0)
27763beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick            err = EGL_BAD_MATCH;
27863beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick         break;
27963beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick
28063beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick      case 3:
28163beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick         /* Note: The text above is incorrect.  There *is* an OpenGL 3.3!
28263beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick          */
28363beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick         if (ctx->ClientMinorVersion > 3)
28463beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick            err = EGL_BAD_MATCH;
28563beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick         break;
28663beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick
28763beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick      case 4:
28863beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick      default:
28963beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick         /* Don't put additional version checks here.  We don't know that
29063beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick          * there won't be versions > 4.2.
29163beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick          */
29263beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick         break;
29363beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick      }
29463beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick   } else if (api == EGL_OPENGL_ES_API) {
29563beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick      /* The EGL_KHR_create_context spec says:
29663beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick       *
29763beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick       *     "* If an OpenGL ES context is requested and the values for
29863beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick       *        attributes EGL_CONTEXT_MAJOR_VERSION_KHR and
29963beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick       *        EGL_CONTEXT_MINOR_VERSION_KHR specify an OpenGL ES version that
30063beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick       *        is not defined, than an EGL_BAD_MATCH error is generated.
30163beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick       *
30263beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick       *        ... Examples of invalid combinations of attributes include:
30363beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick       *
30463beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick       *          - Major version < 1 or > 2
30563beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick       *          - Major version == 1 and minor version < 0 or > 1
30663beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick       *          - Major version == 2 and minor version != 0
30763beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick       */
30863beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick      if (ctx->ClientMajorVersion < 1 || ctx->ClientMinorVersion < 0)
30963beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick         err = EGL_BAD_MATCH;
31063beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick
31163beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick      switch (ctx->ClientMajorVersion) {
31263beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick      case 1:
31363beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick         if (ctx->ClientMinorVersion > 1)
31463beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick            err = EGL_BAD_MATCH;
31563beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick         break;
31663beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick
31763beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick      case 2:
318dbecb413008c19e1864de93d9a8a9123bfee46e7Ian Romanick         if (ctx->ClientMinorVersion > 0)
319dbecb413008c19e1864de93d9a8a9123bfee46e7Ian Romanick            err = EGL_BAD_MATCH;
320dbecb413008c19e1864de93d9a8a9123bfee46e7Ian Romanick         break;
321dbecb413008c19e1864de93d9a8a9123bfee46e7Ian Romanick
322dbecb413008c19e1864de93d9a8a9123bfee46e7Ian Romanick      case 3:
32363beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick      default:
32463beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick         /* Don't put additional version checks here.  We don't know that
325dbecb413008c19e1864de93d9a8a9123bfee46e7Ian Romanick          * there won't be versions > 3.0.
32663beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick          */
32763beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick         break;
32863beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick      }
32963beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick   }
33063beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick
33163beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick   switch (ctx->ResetNotificationStrategy) {
33263beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick   case EGL_NO_RESET_NOTIFICATION_KHR:
33363beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick   case EGL_LOSE_CONTEXT_ON_RESET_KHR:
33463beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick      break;
33563beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick
33663beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick   default:
33763beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick      err = EGL_BAD_ATTRIBUTE;
33863beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick      break;
33963beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick   }
34063beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick
341971750e1cd76dabe22bf2ca83f07266837e3a2a6Matt Turner   if ((ctx->Flags & ~(EGL_CONTEXT_OPENGL_DEBUG_BIT_KHR
34263beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick                      | EGL_CONTEXT_OPENGL_FORWARD_COMPATIBLE_BIT_KHR
34363beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick                      | EGL_CONTEXT_OPENGL_ROBUST_ACCESS_BIT_KHR)) != 0) {
34463beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick      err = EGL_BAD_ATTRIBUTE;
34563beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick   }
34663beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick
347caa5c8dfe8e5857aa25b2a3fa649d553e651e144Chia-I Wu   return err;
348caa5c8dfe8e5857aa25b2a3fa649d553e651e144Chia-I Wu}
349adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
350adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
351adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul/**
3525e7dba541298a29f175f9d077bf6f63030465d94Brian Paul * Initialize the given _EGLContext object to defaults and/or the values
3535e7dba541298a29f175f9d077bf6f63030465d94Brian Paul * in the attrib_list.
354adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul */
355d548bf41d3a0fe443494f94f745d1fe49e5e432cBrian PaulEGLBoolean
356d69242be55091e53b0ae2cfa6282790ce1862f29Chia-I Wu_eglInitContext(_EGLContext *ctx, _EGLDisplay *dpy, _EGLConfig *conf,
357d69242be55091e53b0ae2cfa6282790ce1862f29Chia-I Wu                const EGLint *attrib_list)
358adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
359d5078b94323241a6482f54797756116b1c864327Brian Paul   const EGLenum api = eglQueryAPI();
360caa5c8dfe8e5857aa25b2a3fa649d553e651e144Chia-I Wu   EGLint err;
361d5078b94323241a6482f54797756116b1c864327Brian Paul
362d5078b94323241a6482f54797756116b1c864327Brian Paul   if (api == EGL_NONE) {
363d5078b94323241a6482f54797756116b1c864327Brian Paul      _eglError(EGL_BAD_MATCH, "eglCreateContext(no client API)");
364d5078b94323241a6482f54797756116b1c864327Brian Paul      return EGL_FALSE;
365d5078b94323241a6482f54797756116b1c864327Brian Paul   }
366d548bf41d3a0fe443494f94f745d1fe49e5e432cBrian Paul
367dc4f845c37a8446de19036e24fd397a0aa864c02Chia-I Wu   _eglInitResource(&ctx->Resource, sizeof(*ctx), dpy);
368caa5c8dfe8e5857aa25b2a3fa649d553e651e144Chia-I Wu   ctx->ClientAPI = api;
369caa5c8dfe8e5857aa25b2a3fa649d553e651e144Chia-I Wu   ctx->Config = conf;
370caa5c8dfe8e5857aa25b2a3fa649d553e651e144Chia-I Wu   ctx->WindowRenderBuffer = EGL_NONE;
37163beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick   ctx->Profile = EGL_CONTEXT_OPENGL_CORE_PROFILE_BIT_KHR;
3729f6a4e2a65ff872bc27e7081df7d6205393a1180Brian Paul
3733fd79dd9886f05f45f3dc94c028a38dd75b8ee1bIan Romanick   ctx->ClientMajorVersion = 1; /* the default, per EGL spec */
3743fd79dd9886f05f45f3dc94c028a38dd75b8ee1bIan Romanick   ctx->ClientMinorVersion = 0;
37563beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick   ctx->Flags = 0;
37663beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick   ctx->Profile = EGL_CONTEXT_OPENGL_CORE_PROFILE_BIT_KHR;
37763beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick   ctx->ResetNotificationStrategy = EGL_NO_RESET_NOTIFICATION_KHR;
378a8533d54930f8fa989036c197ad20b0778ec0cacBrian Paul
37963beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick   err = _eglParseContextAttribList(ctx, dpy, attrib_list);
3805eb33596a0db26586957365ab27fc6afdebfe057Chia-I Wu   if (err == EGL_SUCCESS && ctx->Config) {
3813fa21881b18044292e7d9455e9a370a71249df22Chia-I Wu      EGLint api_bit;
3825eb33596a0db26586957365ab27fc6afdebfe057Chia-I Wu
3835eb33596a0db26586957365ab27fc6afdebfe057Chia-I Wu      api_bit = _eglGetContextAPIBit(ctx);
3843fa21881b18044292e7d9455e9a370a71249df22Chia-I Wu      if (!(ctx->Config->RenderableType & api_bit)) {
3855eb33596a0db26586957365ab27fc6afdebfe057Chia-I Wu         _eglLog(_EGL_DEBUG, "context api is 0x%x while config supports 0x%x",
3863fa21881b18044292e7d9455e9a370a71249df22Chia-I Wu               api_bit, ctx->Config->RenderableType);
3875eb33596a0db26586957365ab27fc6afdebfe057Chia-I Wu         err = EGL_BAD_CONFIG;
3885eb33596a0db26586957365ab27fc6afdebfe057Chia-I Wu      }
3895eb33596a0db26586957365ab27fc6afdebfe057Chia-I Wu   }
390caa5c8dfe8e5857aa25b2a3fa649d553e651e144Chia-I Wu   if (err != EGL_SUCCESS)
391caa5c8dfe8e5857aa25b2a3fa649d553e651e144Chia-I Wu      return _eglError(err, "eglCreateContext");
392d548bf41d3a0fe443494f94f745d1fe49e5e432cBrian Paul
393d548bf41d3a0fe443494f94f745d1fe49e5e432cBrian Paul   return EGL_TRUE;
394adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
395adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
396adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
397d845f2754bb8c0677323a5922cb90f9ea42bdb1fChia-I Wustatic EGLint
398d845f2754bb8c0677323a5922cb90f9ea42bdb1fChia-I Wu_eglQueryContextRenderBuffer(_EGLContext *ctx)
399d845f2754bb8c0677323a5922cb90f9ea42bdb1fChia-I Wu{
400d845f2754bb8c0677323a5922cb90f9ea42bdb1fChia-I Wu   _EGLSurface *surf = ctx->DrawSurface;
401d845f2754bb8c0677323a5922cb90f9ea42bdb1fChia-I Wu   EGLint rb;
402d845f2754bb8c0677323a5922cb90f9ea42bdb1fChia-I Wu
403d845f2754bb8c0677323a5922cb90f9ea42bdb1fChia-I Wu   if (!surf)
404d845f2754bb8c0677323a5922cb90f9ea42bdb1fChia-I Wu      return EGL_NONE;
405d845f2754bb8c0677323a5922cb90f9ea42bdb1fChia-I Wu   if (surf->Type == EGL_WINDOW_BIT && ctx->WindowRenderBuffer != EGL_NONE)
406d845f2754bb8c0677323a5922cb90f9ea42bdb1fChia-I Wu      rb = ctx->WindowRenderBuffer;
407d845f2754bb8c0677323a5922cb90f9ea42bdb1fChia-I Wu   else
408d845f2754bb8c0677323a5922cb90f9ea42bdb1fChia-I Wu      rb = surf->RenderBuffer;
409d845f2754bb8c0677323a5922cb90f9ea42bdb1fChia-I Wu   return rb;
410d845f2754bb8c0677323a5922cb90f9ea42bdb1fChia-I Wu}
411d845f2754bb8c0677323a5922cb90f9ea42bdb1fChia-I Wu
412d845f2754bb8c0677323a5922cb90f9ea42bdb1fChia-I Wu
413adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PaulEGLBoolean
4142f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu_eglQueryContext(_EGLDriver *drv, _EGLDisplay *dpy, _EGLContext *c,
415d548bf41d3a0fe443494f94f745d1fe49e5e432cBrian Paul                 EGLint attribute, EGLint *value)
416adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
417adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul   (void) drv;
418adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul   (void) dpy;
419adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
420d845f2754bb8c0677323a5922cb90f9ea42bdb1fChia-I Wu   if (!value)
421d845f2754bb8c0677323a5922cb90f9ea42bdb1fChia-I Wu      return _eglError(EGL_BAD_PARAMETER, "eglQueryContext");
422d845f2754bb8c0677323a5922cb90f9ea42bdb1fChia-I Wu
423adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul   switch (attribute) {
424adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul   case EGL_CONFIG_ID:
4253fa21881b18044292e7d9455e9a370a71249df22Chia-I Wu      if (!c->Config)
4263fa21881b18044292e7d9455e9a370a71249df22Chia-I Wu         return _eglError(EGL_BAD_ATTRIBUTE, "eglQueryContext");
4273fa21881b18044292e7d9455e9a370a71249df22Chia-I Wu      *value = c->Config->ConfigID;
428d845f2754bb8c0677323a5922cb90f9ea42bdb1fChia-I Wu      break;
429d845f2754bb8c0677323a5922cb90f9ea42bdb1fChia-I Wu   case EGL_CONTEXT_CLIENT_VERSION:
4303fd79dd9886f05f45f3dc94c028a38dd75b8ee1bIan Romanick      *value = c->ClientMajorVersion;
431d845f2754bb8c0677323a5922cb90f9ea42bdb1fChia-I Wu      break;
432b2006a40eb22899d38cd31691640555228e36975Brian Paul   case EGL_CONTEXT_CLIENT_TYPE:
433b2006a40eb22899d38cd31691640555228e36975Brian Paul      *value = c->ClientAPI;
434d845f2754bb8c0677323a5922cb90f9ea42bdb1fChia-I Wu      break;
435d845f2754bb8c0677323a5922cb90f9ea42bdb1fChia-I Wu   case EGL_RENDER_BUFFER:
436d845f2754bb8c0677323a5922cb90f9ea42bdb1fChia-I Wu      *value = _eglQueryContextRenderBuffer(c);
437d845f2754bb8c0677323a5922cb90f9ea42bdb1fChia-I Wu      break;
438adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul   default:
439d845f2754bb8c0677323a5922cb90f9ea42bdb1fChia-I Wu      return _eglError(EGL_BAD_ATTRIBUTE, "eglQueryContext");
440adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul   }
441d845f2754bb8c0677323a5922cb90f9ea42bdb1fChia-I Wu
442d845f2754bb8c0677323a5922cb90f9ea42bdb1fChia-I Wu   return EGL_TRUE;
443adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
444adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
445adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
446adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul/**
4477c09296d4ce977f711f36c3393fd1a2718a6a6ceChia-I Wu * Bind the context to the thread and return the previous context.
4487c09296d4ce977f711f36c3393fd1a2718a6a6ceChia-I Wu *
4497c09296d4ce977f711f36c3393fd1a2718a6a6ceChia-I Wu * Note that the context may be NULL.
4507c09296d4ce977f711f36c3393fd1a2718a6a6ceChia-I Wu */
4517c09296d4ce977f711f36c3393fd1a2718a6a6ceChia-I Wustatic _EGLContext *
4527c09296d4ce977f711f36c3393fd1a2718a6a6ceChia-I Wu_eglBindContextToThread(_EGLContext *ctx, _EGLThreadInfo *t)
453adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
45421b635ffa8b59049a95d50d4c7b7a8ff6413b730Chia-I Wu   EGLint apiIndex;
4557c09296d4ce977f711f36c3393fd1a2718a6a6ceChia-I Wu   _EGLContext *oldCtx;
4567c09296d4ce977f711f36c3393fd1a2718a6a6ceChia-I Wu
4577c09296d4ce977f711f36c3393fd1a2718a6a6ceChia-I Wu   apiIndex = (ctx) ?
4587c09296d4ce977f711f36c3393fd1a2718a6a6ceChia-I Wu      _eglConvertApiToIndex(ctx->ClientAPI) : t->CurrentAPIIndex;
4597c09296d4ce977f711f36c3393fd1a2718a6a6ceChia-I Wu
4607c09296d4ce977f711f36c3393fd1a2718a6a6ceChia-I Wu   oldCtx = t->CurrentContexts[apiIndex];
461551bfe7a09b0d1bc277796edc10c649b2b07a5b7Chia-I Wu   if (ctx != oldCtx) {
462551bfe7a09b0d1bc277796edc10c649b2b07a5b7Chia-I Wu      if (oldCtx)
463551bfe7a09b0d1bc277796edc10c649b2b07a5b7Chia-I Wu         oldCtx->Binding = NULL;
464551bfe7a09b0d1bc277796edc10c649b2b07a5b7Chia-I Wu      if (ctx)
465551bfe7a09b0d1bc277796edc10c649b2b07a5b7Chia-I Wu         ctx->Binding = t;
4667c09296d4ce977f711f36c3393fd1a2718a6a6ceChia-I Wu
467551bfe7a09b0d1bc277796edc10c649b2b07a5b7Chia-I Wu      t->CurrentContexts[apiIndex] = ctx;
468551bfe7a09b0d1bc277796edc10c649b2b07a5b7Chia-I Wu   }
4697c09296d4ce977f711f36c3393fd1a2718a6a6ceChia-I Wu
4707c09296d4ce977f711f36c3393fd1a2718a6a6ceChia-I Wu   return oldCtx;
4717c09296d4ce977f711f36c3393fd1a2718a6a6ceChia-I Wu}
4727c09296d4ce977f711f36c3393fd1a2718a6a6ceChia-I Wu
4737c09296d4ce977f711f36c3393fd1a2718a6a6ceChia-I Wu
4747c09296d4ce977f711f36c3393fd1a2718a6a6ceChia-I Wu/**
4757c09296d4ce977f711f36c3393fd1a2718a6a6ceChia-I Wu * Return true if the given context and surfaces can be made current.
4767c09296d4ce977f711f36c3393fd1a2718a6a6ceChia-I Wu */
4777c09296d4ce977f711f36c3393fd1a2718a6a6ceChia-I Wustatic EGLBoolean
4787c09296d4ce977f711f36c3393fd1a2718a6a6ceChia-I Wu_eglCheckMakeCurrent(_EGLContext *ctx, _EGLSurface *draw, _EGLSurface *read)
4797c09296d4ce977f711f36c3393fd1a2718a6a6ceChia-I Wu{
4807c09296d4ce977f711f36c3393fd1a2718a6a6ceChia-I Wu   _EGLThreadInfo *t = _eglGetCurrentThread();
4812c343af09873f35cbc7b265d5606a228fe304bb9Kristian Høgsberg   _EGLDisplay *dpy;
4827c09296d4ce977f711f36c3393fd1a2718a6a6ceChia-I Wu   EGLint conflict_api;
483adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
48475da80b29556e6dbbba21e5297ca440e475f65cbChia-I Wu   if (_eglIsCurrentThreadDummy())
48575da80b29556e6dbbba21e5297ca440e475f65cbChia-I Wu      return _eglError(EGL_BAD_ALLOC, "eglMakeCurrent");
48675da80b29556e6dbbba21e5297ca440e475f65cbChia-I Wu
4877c09296d4ce977f711f36c3393fd1a2718a6a6ceChia-I Wu   /* this is easy */
4887c09296d4ce977f711f36c3393fd1a2718a6a6ceChia-I Wu   if (!ctx) {
4897c09296d4ce977f711f36c3393fd1a2718a6a6ceChia-I Wu      if (draw || read)
4908cdc6c66f9d8ede00d02108070d269d3aca8b130Chia-I Wu         return _eglError(EGL_BAD_MATCH, "eglMakeCurrent");
4917c09296d4ce977f711f36c3393fd1a2718a6a6ceChia-I Wu      return EGL_TRUE;
4927c09296d4ce977f711f36c3393fd1a2718a6a6ceChia-I Wu   }
4937c09296d4ce977f711f36c3393fd1a2718a6a6ceChia-I Wu
4942c343af09873f35cbc7b265d5606a228fe304bb9Kristian Høgsberg   dpy = ctx->Resource.Display;
495b50703aea55450e04bcd8154335774786e0f253bIan Romanick   if (!dpy->Extensions.KHR_surfaceless_context
496b50703aea55450e04bcd8154335774786e0f253bIan Romanick       && (draw == NULL || read == NULL))
4977c09296d4ce977f711f36c3393fd1a2718a6a6ceChia-I Wu      return _eglError(EGL_BAD_MATCH, "eglMakeCurrent");
4987c09296d4ce977f711f36c3393fd1a2718a6a6ceChia-I Wu
4997c09296d4ce977f711f36c3393fd1a2718a6a6ceChia-I Wu   /*
5007c09296d4ce977f711f36c3393fd1a2718a6a6ceChia-I Wu    * The spec says
5017c09296d4ce977f711f36c3393fd1a2718a6a6ceChia-I Wu    *
5027c09296d4ce977f711f36c3393fd1a2718a6a6ceChia-I Wu    * "If ctx is current to some other thread, or if either draw or read are
5037c09296d4ce977f711f36c3393fd1a2718a6a6ceChia-I Wu    * bound to contexts in another thread, an EGL_BAD_ACCESS error is
5047c09296d4ce977f711f36c3393fd1a2718a6a6ceChia-I Wu    * generated."
5057c09296d4ce977f711f36c3393fd1a2718a6a6ceChia-I Wu    *
5060d43cbed2f130c377bed92c7a8ad8c19f441d6a5Chia-I Wu    * and
5077c09296d4ce977f711f36c3393fd1a2718a6a6ceChia-I Wu    *
5087c09296d4ce977f711f36c3393fd1a2718a6a6ceChia-I Wu    * "at most one context may be bound to a particular surface at a given
5097c09296d4ce977f711f36c3393fd1a2718a6a6ceChia-I Wu    * time"
5107c09296d4ce977f711f36c3393fd1a2718a6a6ceChia-I Wu    */
5110d43cbed2f130c377bed92c7a8ad8c19f441d6a5Chia-I Wu   if (ctx->Binding && ctx->Binding != t)
5127c09296d4ce977f711f36c3393fd1a2718a6a6ceChia-I Wu      return _eglError(EGL_BAD_ACCESS, "eglMakeCurrent");
5130d43cbed2f130c377bed92c7a8ad8c19f441d6a5Chia-I Wu   if (draw && draw->CurrentContext && draw->CurrentContext != ctx) {
5140d43cbed2f130c377bed92c7a8ad8c19f441d6a5Chia-I Wu      if (draw->CurrentContext->Binding != t ||
5150d43cbed2f130c377bed92c7a8ad8c19f441d6a5Chia-I Wu          draw->CurrentContext->ClientAPI != ctx->ClientAPI)
5160d43cbed2f130c377bed92c7a8ad8c19f441d6a5Chia-I Wu         return _eglError(EGL_BAD_ACCESS, "eglMakeCurrent");
5170d43cbed2f130c377bed92c7a8ad8c19f441d6a5Chia-I Wu   }
5180d43cbed2f130c377bed92c7a8ad8c19f441d6a5Chia-I Wu   if (read && read->CurrentContext && read->CurrentContext != ctx) {
5190d43cbed2f130c377bed92c7a8ad8c19f441d6a5Chia-I Wu      if (read->CurrentContext->Binding != t ||
5200d43cbed2f130c377bed92c7a8ad8c19f441d6a5Chia-I Wu          read->CurrentContext->ClientAPI != ctx->ClientAPI)
5210d43cbed2f130c377bed92c7a8ad8c19f441d6a5Chia-I Wu         return _eglError(EGL_BAD_ACCESS, "eglMakeCurrent");
5220d43cbed2f130c377bed92c7a8ad8c19f441d6a5Chia-I Wu   }
5237c09296d4ce977f711f36c3393fd1a2718a6a6ceChia-I Wu
5247c09296d4ce977f711f36c3393fd1a2718a6a6ceChia-I Wu   /* simply require the configs to be equal */
525b90a3e7d8b1bcd412ddbf2a4803de2756dacd436Kristian Høgsberg   if ((draw && draw->Config != ctx->Config) ||
526b90a3e7d8b1bcd412ddbf2a4803de2756dacd436Kristian Høgsberg       (read && read->Config != ctx->Config))
5277c09296d4ce977f711f36c3393fd1a2718a6a6ceChia-I Wu      return _eglError(EGL_BAD_MATCH, "eglMakeCurrent");
52821b635ffa8b59049a95d50d4c7b7a8ff6413b730Chia-I Wu
5297c09296d4ce977f711f36c3393fd1a2718a6a6ceChia-I Wu   switch (ctx->ClientAPI) {
5307c09296d4ce977f711f36c3393fd1a2718a6a6ceChia-I Wu   /* OpenGL and OpenGL ES are conflicting */
5317c09296d4ce977f711f36c3393fd1a2718a6a6ceChia-I Wu   case EGL_OPENGL_ES_API:
5327c09296d4ce977f711f36c3393fd1a2718a6a6ceChia-I Wu      conflict_api = EGL_OPENGL_API;
5337c09296d4ce977f711f36c3393fd1a2718a6a6ceChia-I Wu      break;
5347c09296d4ce977f711f36c3393fd1a2718a6a6ceChia-I Wu   case EGL_OPENGL_API:
5357c09296d4ce977f711f36c3393fd1a2718a6a6ceChia-I Wu      conflict_api = EGL_OPENGL_ES_API;
5367c09296d4ce977f711f36c3393fd1a2718a6a6ceChia-I Wu      break;
5377c09296d4ce977f711f36c3393fd1a2718a6a6ceChia-I Wu   default:
5387c09296d4ce977f711f36c3393fd1a2718a6a6ceChia-I Wu      conflict_api = -1;
5397c09296d4ce977f711f36c3393fd1a2718a6a6ceChia-I Wu      break;
54021b635ffa8b59049a95d50d4c7b7a8ff6413b730Chia-I Wu   }
54121b635ffa8b59049a95d50d4c7b7a8ff6413b730Chia-I Wu
5427c09296d4ce977f711f36c3393fd1a2718a6a6ceChia-I Wu   if (conflict_api >= 0 && _eglGetAPIContext(conflict_api))
5437c09296d4ce977f711f36c3393fd1a2718a6a6ceChia-I Wu      return _eglError(EGL_BAD_ACCESS, "eglMakeCurrent");
5447c09296d4ce977f711f36c3393fd1a2718a6a6ceChia-I Wu
5457c09296d4ce977f711f36c3393fd1a2718a6a6ceChia-I Wu   return EGL_TRUE;
5467c09296d4ce977f711f36c3393fd1a2718a6a6ceChia-I Wu}
5477c09296d4ce977f711f36c3393fd1a2718a6a6ceChia-I Wu
5487c09296d4ce977f711f36c3393fd1a2718a6a6ceChia-I Wu
5497c09296d4ce977f711f36c3393fd1a2718a6a6ceChia-I Wu/**
550959481ad70b033a254f4d7d0a94dfdfab6b94c15Chia-I Wu * Bind the context to the current thread and given surfaces.  Return the
551d19afc57fe49816f3f3290410e0124d326577be2Chia-I Wu * previous bound context and surfaces.  The caller should unreference the
552d19afc57fe49816f3f3290410e0124d326577be2Chia-I Wu * returned context and surfaces.
553d19afc57fe49816f3f3290410e0124d326577be2Chia-I Wu *
554d19afc57fe49816f3f3290410e0124d326577be2Chia-I Wu * Making a second call with the resources returned by the first call
555d19afc57fe49816f3f3290410e0124d326577be2Chia-I Wu * unsurprisingly undoes the first call, except for the resouce reference
556d19afc57fe49816f3f3290410e0124d326577be2Chia-I Wu * counts.
557959481ad70b033a254f4d7d0a94dfdfab6b94c15Chia-I Wu */
558959481ad70b033a254f4d7d0a94dfdfab6b94c15Chia-I WuEGLBoolean
559d19afc57fe49816f3f3290410e0124d326577be2Chia-I Wu_eglBindContext(_EGLContext *ctx, _EGLSurface *draw, _EGLSurface *read,
560d19afc57fe49816f3f3290410e0124d326577be2Chia-I Wu                _EGLContext **old_ctx,
561d19afc57fe49816f3f3290410e0124d326577be2Chia-I Wu                _EGLSurface **old_draw, _EGLSurface **old_read)
562959481ad70b033a254f4d7d0a94dfdfab6b94c15Chia-I Wu{
563959481ad70b033a254f4d7d0a94dfdfab6b94c15Chia-I Wu   _EGLThreadInfo *t = _eglGetCurrentThread();
564d19afc57fe49816f3f3290410e0124d326577be2Chia-I Wu   _EGLContext *prev_ctx;
565d19afc57fe49816f3f3290410e0124d326577be2Chia-I Wu   _EGLSurface *prev_draw, *prev_read;
566959481ad70b033a254f4d7d0a94dfdfab6b94c15Chia-I Wu
567d19afc57fe49816f3f3290410e0124d326577be2Chia-I Wu   if (!_eglCheckMakeCurrent(ctx, draw, read))
568959481ad70b033a254f4d7d0a94dfdfab6b94c15Chia-I Wu      return EGL_FALSE;
569959481ad70b033a254f4d7d0a94dfdfab6b94c15Chia-I Wu
570d19afc57fe49816f3f3290410e0124d326577be2Chia-I Wu   /* increment refcounts before binding */
571d19afc57fe49816f3f3290410e0124d326577be2Chia-I Wu   _eglGetContext(ctx);
572d19afc57fe49816f3f3290410e0124d326577be2Chia-I Wu   _eglGetSurface(draw);
573d19afc57fe49816f3f3290410e0124d326577be2Chia-I Wu   _eglGetSurface(read);
574d19afc57fe49816f3f3290410e0124d326577be2Chia-I Wu
575959481ad70b033a254f4d7d0a94dfdfab6b94c15Chia-I Wu   /* bind the new context */
576d19afc57fe49816f3f3290410e0124d326577be2Chia-I Wu   prev_ctx = _eglBindContextToThread(ctx, t);
577bbe459b14d593bd2d7b6c0f010e165fe815e8396Chia-I Wu
578d19afc57fe49816f3f3290410e0124d326577be2Chia-I Wu   /* break previous bindings */
579d19afc57fe49816f3f3290410e0124d326577be2Chia-I Wu   if (prev_ctx) {
580d19afc57fe49816f3f3290410e0124d326577be2Chia-I Wu      prev_draw = prev_ctx->DrawSurface;
581d19afc57fe49816f3f3290410e0124d326577be2Chia-I Wu      prev_read = prev_ctx->ReadSurface;
582848945e5d63ff8327f5a1a6e61e66fcdab3ac8fcChia-I Wu
583d19afc57fe49816f3f3290410e0124d326577be2Chia-I Wu      if (prev_draw)
584d19afc57fe49816f3f3290410e0124d326577be2Chia-I Wu         prev_draw->CurrentContext = NULL;
585d19afc57fe49816f3f3290410e0124d326577be2Chia-I Wu      if (prev_read)
586d19afc57fe49816f3f3290410e0124d326577be2Chia-I Wu         prev_read->CurrentContext = NULL;
587ea9e5dbbc2e992ead954d3d2ebf3689f7a003f79Chia-I Wu
588d19afc57fe49816f3f3290410e0124d326577be2Chia-I Wu      prev_ctx->DrawSurface = NULL;
589d19afc57fe49816f3f3290410e0124d326577be2Chia-I Wu      prev_ctx->ReadSurface = NULL;
590d19afc57fe49816f3f3290410e0124d326577be2Chia-I Wu   }
591d19afc57fe49816f3f3290410e0124d326577be2Chia-I Wu   else {
592d19afc57fe49816f3f3290410e0124d326577be2Chia-I Wu      prev_draw = prev_read = NULL;
593ea9e5dbbc2e992ead954d3d2ebf3689f7a003f79Chia-I Wu   }
594ea9e5dbbc2e992ead954d3d2ebf3689f7a003f79Chia-I Wu
595ea9e5dbbc2e992ead954d3d2ebf3689f7a003f79Chia-I Wu   /* establish new bindings */
596d19afc57fe49816f3f3290410e0124d326577be2Chia-I Wu   if (ctx) {
597d19afc57fe49816f3f3290410e0124d326577be2Chia-I Wu      if (draw)
598d19afc57fe49816f3f3290410e0124d326577be2Chia-I Wu         draw->CurrentContext = ctx;
599d19afc57fe49816f3f3290410e0124d326577be2Chia-I Wu      if (read)
600d19afc57fe49816f3f3290410e0124d326577be2Chia-I Wu         read->CurrentContext = ctx;
601d19afc57fe49816f3f3290410e0124d326577be2Chia-I Wu
602d19afc57fe49816f3f3290410e0124d326577be2Chia-I Wu      ctx->DrawSurface = draw;
603d19afc57fe49816f3f3290410e0124d326577be2Chia-I Wu      ctx->ReadSurface = read;
604959481ad70b033a254f4d7d0a94dfdfab6b94c15Chia-I Wu   }
605959481ad70b033a254f4d7d0a94dfdfab6b94c15Chia-I Wu
606d19afc57fe49816f3f3290410e0124d326577be2Chia-I Wu   assert(old_ctx && old_draw && old_read);
607d19afc57fe49816f3f3290410e0124d326577be2Chia-I Wu   *old_ctx = prev_ctx;
608d19afc57fe49816f3f3290410e0124d326577be2Chia-I Wu   *old_draw = prev_draw;
609d19afc57fe49816f3f3290410e0124d326577be2Chia-I Wu   *old_read = prev_read;
610bbe459b14d593bd2d7b6c0f010e165fe815e8396Chia-I Wu
611959481ad70b033a254f4d7d0a94dfdfab6b94c15Chia-I Wu   return EGL_TRUE;
612959481ad70b033a254f4d7d0a94dfdfab6b94c15Chia-I Wu}
613