eglcontext.c revision 63beb3df98147f34fd0965cb0afbb97444206d0c
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:
57caa5c8dfe8e5857aa25b2a3fa649d553e651e144Chia-I Wu         bit = EGL_OPENGL_ES2_BIT;
58caa5c8dfe8e5857aa25b2a3fa649d553e651e144Chia-I Wu         break;
59caa5c8dfe8e5857aa25b2a3fa649d553e651e144Chia-I Wu      default:
60caa5c8dfe8e5857aa25b2a3fa649d553e651e144Chia-I Wu         break;
61caa5c8dfe8e5857aa25b2a3fa649d553e651e144Chia-I Wu      }
62caa5c8dfe8e5857aa25b2a3fa649d553e651e144Chia-I Wu      break;
63caa5c8dfe8e5857aa25b2a3fa649d553e651e144Chia-I Wu   case EGL_OPENVG_API:
64caa5c8dfe8e5857aa25b2a3fa649d553e651e144Chia-I Wu      bit = EGL_OPENVG_BIT;
65caa5c8dfe8e5857aa25b2a3fa649d553e651e144Chia-I Wu      break;
66caa5c8dfe8e5857aa25b2a3fa649d553e651e144Chia-I Wu   case EGL_OPENGL_API:
67caa5c8dfe8e5857aa25b2a3fa649d553e651e144Chia-I Wu      bit = EGL_OPENGL_BIT;
68caa5c8dfe8e5857aa25b2a3fa649d553e651e144Chia-I Wu      break;
69caa5c8dfe8e5857aa25b2a3fa649d553e651e144Chia-I Wu   default:
70caa5c8dfe8e5857aa25b2a3fa649d553e651e144Chia-I Wu      break;
71caa5c8dfe8e5857aa25b2a3fa649d553e651e144Chia-I Wu   }
72caa5c8dfe8e5857aa25b2a3fa649d553e651e144Chia-I Wu
73caa5c8dfe8e5857aa25b2a3fa649d553e651e144Chia-I Wu   return bit;
74caa5c8dfe8e5857aa25b2a3fa649d553e651e144Chia-I Wu}
75caa5c8dfe8e5857aa25b2a3fa649d553e651e144Chia-I Wu
76caa5c8dfe8e5857aa25b2a3fa649d553e651e144Chia-I Wu
77caa5c8dfe8e5857aa25b2a3fa649d553e651e144Chia-I Wu/**
78caa5c8dfe8e5857aa25b2a3fa649d553e651e144Chia-I Wu * Parse the list of context attributes and return the proper error code.
79caa5c8dfe8e5857aa25b2a3fa649d553e651e144Chia-I Wu */
80caa5c8dfe8e5857aa25b2a3fa649d553e651e144Chia-I Wustatic EGLint
8163beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick_eglParseContextAttribList(_EGLContext *ctx, _EGLDisplay *dpy,
8263beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick                           const EGLint *attrib_list)
83caa5c8dfe8e5857aa25b2a3fa649d553e651e144Chia-I Wu{
84caa5c8dfe8e5857aa25b2a3fa649d553e651e144Chia-I Wu   EGLenum api = ctx->ClientAPI;
85caa5c8dfe8e5857aa25b2a3fa649d553e651e144Chia-I Wu   EGLint i, err = EGL_SUCCESS;
86caa5c8dfe8e5857aa25b2a3fa649d553e651e144Chia-I Wu
87caa5c8dfe8e5857aa25b2a3fa649d553e651e144Chia-I Wu   if (!attrib_list)
88caa5c8dfe8e5857aa25b2a3fa649d553e651e144Chia-I Wu      return EGL_SUCCESS;
89caa5c8dfe8e5857aa25b2a3fa649d553e651e144Chia-I Wu
9063beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick   if (api == EGL_OPENVG_API && attrib_list[0] != EGL_NONE) {
9163beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick      _eglLog(_EGL_DEBUG, "bad context attribute 0x%04x", attrib_list[0]);
9263beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick      return EGL_BAD_ATTRIBUTE;
9363beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick   }
9463beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick
95caa5c8dfe8e5857aa25b2a3fa649d553e651e144Chia-I Wu   for (i = 0; attrib_list[i] != EGL_NONE; i++) {
96caa5c8dfe8e5857aa25b2a3fa649d553e651e144Chia-I Wu      EGLint attr = attrib_list[i++];
97caa5c8dfe8e5857aa25b2a3fa649d553e651e144Chia-I Wu      EGLint val = attrib_list[i];
98caa5c8dfe8e5857aa25b2a3fa649d553e651e144Chia-I Wu
99caa5c8dfe8e5857aa25b2a3fa649d553e651e144Chia-I Wu      switch (attr) {
100caa5c8dfe8e5857aa25b2a3fa649d553e651e144Chia-I Wu      case EGL_CONTEXT_CLIENT_VERSION:
10163beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick         ctx->ClientMajorVersion = val;
10263beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick         break;
10363beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick
10463beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick      case EGL_CONTEXT_MINOR_VERSION_KHR:
10563beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick         if (!dpy->Extensions.KHR_create_context) {
106caa5c8dfe8e5857aa25b2a3fa649d553e651e144Chia-I Wu            err = EGL_BAD_ATTRIBUTE;
107caa5c8dfe8e5857aa25b2a3fa649d553e651e144Chia-I Wu            break;
108caa5c8dfe8e5857aa25b2a3fa649d553e651e144Chia-I Wu         }
10963beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick
11063beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick         ctx->ClientMinorVersion = val;
11163beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick         break;
11263beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick
11363beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick      case EGL_CONTEXT_FLAGS_KHR:
11463beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick         if (!dpy->Extensions.KHR_create_context) {
115caa5c8dfe8e5857aa25b2a3fa649d553e651e144Chia-I Wu            err = EGL_BAD_ATTRIBUTE;
116caa5c8dfe8e5857aa25b2a3fa649d553e651e144Chia-I Wu            break;
117caa5c8dfe8e5857aa25b2a3fa649d553e651e144Chia-I Wu         }
11863beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick
11963beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick         /* The EGL_KHR_create_context spec says:
12063beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick          *
12163beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick          *     "Flags are only defined for OpenGL context creation, and
12263beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick          *     specifying a flags value other than zero for other types of
12363beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick          *     contexts, including OpenGL ES contexts, will generate an
12463beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick          *     error."
12563beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick          */
12663beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick         if (api != EGL_OPENGL_API && val != 0) {
12763beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick            err = EGL_BAD_ATTRIBUTE;
12863beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick            break;
12963beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick         }
13063beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick
13163beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick         ctx->Flags = val;
132caa5c8dfe8e5857aa25b2a3fa649d553e651e144Chia-I Wu         break;
13363beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick
13463beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick      case EGL_CONTEXT_OPENGL_PROFILE_MASK_KHR:
13563beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick         if (!dpy->Extensions.KHR_create_context) {
13663beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick            err = EGL_BAD_ATTRIBUTE;
13763beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick            break;
13863beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick         }
13963beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick
14063beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick         /* The EGL_KHR_create_context spec says:
14163beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick          *
14263beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick          *     "[EGL_CONTEXT_OPENGL_PROFILE_MASK_KHR] is only meaningful for
14363beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick          *     OpenGL contexts, and specifying it for other types of
14463beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick          *     contexts, including OpenGL ES contexts, will generate an
14563beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick          *     error."
14663beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick          */
14763beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick         if (api != EGL_OPENGL_API) {
14863beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick            err = EGL_BAD_ATTRIBUTE;
14963beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick            break;
15063beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick         }
15163beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick
15263beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick         ctx->Profile = val;
15363beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick         break;
15463beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick
15563beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick      case EGL_CONTEXT_OPENGL_RESET_NOTIFICATION_STRATEGY_KHR:
15663beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick         /* The EGL_KHR_create_context spec says:
15763beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick          *
15863beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick          *     "[EGL_CONTEXT_OPENGL_RESET_NOTIFICATION_STRATEGY_KHR] is only
15963beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick          *     meaningful for OpenGL contexts, and specifying it for other
16063beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick          *     types of contexts, including OpenGL ES contexts, will generate
16163beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick          *     an error."
16263beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick          */
16363beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick           if (!dpy->Extensions.KHR_create_context
16463beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick               || api != EGL_OPENGL_API) {
16563beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick            err = EGL_BAD_ATTRIBUTE;
16663beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick            break;
16763beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick         }
16863beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick
16963beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick         ctx->ResetNotificationStrategy = val;
17063beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick         break;
17163beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick
172caa5c8dfe8e5857aa25b2a3fa649d553e651e144Chia-I Wu      default:
173caa5c8dfe8e5857aa25b2a3fa649d553e651e144Chia-I Wu         err = EGL_BAD_ATTRIBUTE;
174caa5c8dfe8e5857aa25b2a3fa649d553e651e144Chia-I Wu         break;
175caa5c8dfe8e5857aa25b2a3fa649d553e651e144Chia-I Wu      }
176caa5c8dfe8e5857aa25b2a3fa649d553e651e144Chia-I Wu
177caa5c8dfe8e5857aa25b2a3fa649d553e651e144Chia-I Wu      if (err != EGL_SUCCESS) {
178caa5c8dfe8e5857aa25b2a3fa649d553e651e144Chia-I Wu         _eglLog(_EGL_DEBUG, "bad context attribute 0x%04x", attr);
179caa5c8dfe8e5857aa25b2a3fa649d553e651e144Chia-I Wu         break;
180caa5c8dfe8e5857aa25b2a3fa649d553e651e144Chia-I Wu      }
181caa5c8dfe8e5857aa25b2a3fa649d553e651e144Chia-I Wu   }
182caa5c8dfe8e5857aa25b2a3fa649d553e651e144Chia-I Wu
18363beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick   if (api == EGL_OPENGL_API) {
18463beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick      /* The EGL_KHR_create_context spec says:
18563beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick       *
18663beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick       *     "If the requested OpenGL version is less than 3.2,
18763beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick       *     EGL_CONTEXT_OPENGL_PROFILE_MASK_KHR is ignored and the
18863beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick       *     functionality of the context is determined solely by the
18963beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick       *     requested version."
19063beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick       *
19163beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick       * Since the value is ignored, only validate the setting if the version
19263beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick       * is >= 3.2.
19363beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick       */
19463beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick      if (ctx->ClientMajorVersion >= 4
19563beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick          || (ctx->ClientMajorVersion == 3 && ctx->ClientMinorVersion >= 2)) {
19663beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick         switch (ctx->Profile) {
19763beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick         case EGL_CONTEXT_OPENGL_CORE_PROFILE_BIT_KHR:
19863beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick         case EGL_CONTEXT_OPENGL_COMPATIBILITY_PROFILE_BIT_KHR:
19963beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick            break;
20063beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick
20163beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick         default:
20263beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick            /* The EGL_KHR_create_context spec says:
20363beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick             *
20463beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick             *     "* If an OpenGL context is requested, the requested version
20563beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick             *        is greater than 3.2, and the value for attribute
20663beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick             *        EGL_CONTEXT_PROFILE_MASK_KHR has no bits set; has any
20763beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick             *        bits set other than EGL_CONTEXT_CORE_PROFILE_BIT_KHR and
20863beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick             *        EGL_CONTEXT_COMPATIBILITY_PROFILE_BIT_KHR; has more than
20963beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick             *        one of these bits set; or if the implementation does not
21063beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick             *        support the requested profile, then an
21163beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick             *        EGL_BAD_PROFILE_KHR error is generated."
21263beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick             *
21363beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick             * However, it does not define EGL_BAD_PROFILE_KHR.  For now use
21463beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick             * EGL_BAD_ATTRIBUTE.
21563beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick             */
21663beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick            err = EGL_BAD_ATTRIBUTE;
21763beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick            break;
21863beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick         }
21963beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick      }
22063beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick
22163beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick      /* The EGL_KHR_create_context spec says:
22263beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick       *
22363beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick       *     "* If an OpenGL context is requested and the values for
22463beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick       *        attributes EGL_CONTEXT_MAJOR_VERSION_KHR and
22563beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick       *        EGL_CONTEXT_MINOR_VERSION_KHR, when considered together with
22663beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick       *        the value for attribute
22763beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick       *        EGL_CONTEXT_FORWARD_COMPATIBLE_BIT_KHR, specify an OpenGL
22863beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick       *        version and feature set that are not defined, than an
22963beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick       *        EGL_BAD_MATCH error is generated.
23063beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick       *
23163beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick       *        ... Thus, examples of invalid combinations of attributes
23263beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick       *        include:
23363beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick       *
23463beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick       *          - Major version < 1 or > 4
23563beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick       *          - Major version == 1 and minor version < 0 or > 5
23663beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick       *          - Major version == 2 and minor version < 0 or > 1
23763beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick       *          - Major version == 3 and minor version < 0 or > 2
23863beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick       *          - Major version == 4 and minor version < 0 or > 2
23963beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick       *          - Forward-compatible flag set and major version < 3"
24063beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick       */
24163beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick      if (ctx->ClientMajorVersion < 1 || ctx->ClientMinorVersion < 0)
24263beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick         err = EGL_BAD_MATCH;
24363beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick
24463beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick      switch (ctx->ClientMajorVersion) {
24563beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick      case 1:
24663beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick         if (ctx->ClientMinorVersion > 5
24763beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick             || (ctx->Flags & EGL_CONTEXT_OPENGL_FORWARD_COMPATIBLE_BIT_KHR) != 0)
24863beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick            err = EGL_BAD_MATCH;
24963beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick         break;
25063beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick
25163beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick      case 2:
25263beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick         if (ctx->ClientMinorVersion > 1
25363beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick             || (ctx->Flags & EGL_CONTEXT_OPENGL_FORWARD_COMPATIBLE_BIT_KHR) != 0)
25463beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick            err = EGL_BAD_MATCH;
25563beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick         break;
25663beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick
25763beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick      case 3:
25863beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick         /* Note: The text above is incorrect.  There *is* an OpenGL 3.3!
25963beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick          */
26063beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick         if (ctx->ClientMinorVersion > 3)
26163beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick            err = EGL_BAD_MATCH;
26263beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick         break;
26363beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick
26463beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick      case 4:
26563beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick      default:
26663beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick         /* Don't put additional version checks here.  We don't know that
26763beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick          * there won't be versions > 4.2.
26863beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick          */
26963beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick         break;
27063beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick      }
27163beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick   } else if (api == EGL_OPENGL_ES_API) {
27263beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick      /* The EGL_KHR_create_context spec says:
27363beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick       *
27463beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick       *     "* If an OpenGL ES context is requested and the values for
27563beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick       *        attributes EGL_CONTEXT_MAJOR_VERSION_KHR and
27663beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick       *        EGL_CONTEXT_MINOR_VERSION_KHR specify an OpenGL ES version that
27763beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick       *        is not defined, than an EGL_BAD_MATCH error is generated.
27863beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick       *
27963beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick       *        ... Examples of invalid combinations of attributes include:
28063beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick       *
28163beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick       *          - Major version < 1 or > 2
28263beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick       *          - Major version == 1 and minor version < 0 or > 1
28363beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick       *          - Major version == 2 and minor version != 0
28463beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick       */
28563beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick      if (ctx->ClientMajorVersion < 1 || ctx->ClientMinorVersion < 0)
28663beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick         err = EGL_BAD_MATCH;
28763beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick
28863beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick      switch (ctx->ClientMajorVersion) {
28963beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick      case 1:
29063beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick         if (ctx->ClientMinorVersion > 1)
29163beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick            err = EGL_BAD_MATCH;
29263beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick         break;
29363beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick
29463beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick      case 2:
29563beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick      default:
29663beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick         /* Don't put additional version checks here.  We don't know that
29763beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick          * there won't be versions > 2.0.
29863beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick          */
29963beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick         break;
30063beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick      }
30163beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick   }
30263beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick
30363beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick   switch (ctx->ResetNotificationStrategy) {
30463beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick   case EGL_NO_RESET_NOTIFICATION_KHR:
30563beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick   case EGL_LOSE_CONTEXT_ON_RESET_KHR:
30663beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick      break;
30763beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick
30863beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick   default:
30963beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick      err = EGL_BAD_ATTRIBUTE;
31063beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick      break;
31163beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick   }
31263beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick
31363beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick   if ((ctx->Flags & (EGL_CONTEXT_OPENGL_DEBUG_BIT_KHR
31463beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick                      | EGL_CONTEXT_OPENGL_FORWARD_COMPATIBLE_BIT_KHR
31563beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick                      | EGL_CONTEXT_OPENGL_ROBUST_ACCESS_BIT_KHR)) != 0) {
31663beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick      err = EGL_BAD_ATTRIBUTE;
31763beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick   }
31863beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick
319caa5c8dfe8e5857aa25b2a3fa649d553e651e144Chia-I Wu   return err;
320caa5c8dfe8e5857aa25b2a3fa649d553e651e144Chia-I Wu}
321adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
322adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
323adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul/**
3245e7dba541298a29f175f9d077bf6f63030465d94Brian Paul * Initialize the given _EGLContext object to defaults and/or the values
3255e7dba541298a29f175f9d077bf6f63030465d94Brian Paul * in the attrib_list.
326adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul */
327d548bf41d3a0fe443494f94f745d1fe49e5e432cBrian PaulEGLBoolean
328d69242be55091e53b0ae2cfa6282790ce1862f29Chia-I Wu_eglInitContext(_EGLContext *ctx, _EGLDisplay *dpy, _EGLConfig *conf,
329d69242be55091e53b0ae2cfa6282790ce1862f29Chia-I Wu                const EGLint *attrib_list)
330adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
331d5078b94323241a6482f54797756116b1c864327Brian Paul   const EGLenum api = eglQueryAPI();
332caa5c8dfe8e5857aa25b2a3fa649d553e651e144Chia-I Wu   EGLint err;
333d5078b94323241a6482f54797756116b1c864327Brian Paul
334d5078b94323241a6482f54797756116b1c864327Brian Paul   if (api == EGL_NONE) {
335d5078b94323241a6482f54797756116b1c864327Brian Paul      _eglError(EGL_BAD_MATCH, "eglCreateContext(no client API)");
336d5078b94323241a6482f54797756116b1c864327Brian Paul      return EGL_FALSE;
337d5078b94323241a6482f54797756116b1c864327Brian Paul   }
338d548bf41d3a0fe443494f94f745d1fe49e5e432cBrian Paul
339dc4f845c37a8446de19036e24fd397a0aa864c02Chia-I Wu   _eglInitResource(&ctx->Resource, sizeof(*ctx), dpy);
340caa5c8dfe8e5857aa25b2a3fa649d553e651e144Chia-I Wu   ctx->ClientAPI = api;
341caa5c8dfe8e5857aa25b2a3fa649d553e651e144Chia-I Wu   ctx->Config = conf;
342caa5c8dfe8e5857aa25b2a3fa649d553e651e144Chia-I Wu   ctx->WindowRenderBuffer = EGL_NONE;
34363beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick   ctx->Profile = EGL_CONTEXT_OPENGL_CORE_PROFILE_BIT_KHR;
3449f6a4e2a65ff872bc27e7081df7d6205393a1180Brian Paul
3453fd79dd9886f05f45f3dc94c028a38dd75b8ee1bIan Romanick   ctx->ClientMajorVersion = 1; /* the default, per EGL spec */
3463fd79dd9886f05f45f3dc94c028a38dd75b8ee1bIan Romanick   ctx->ClientMinorVersion = 0;
34763beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick   ctx->Flags = 0;
34863beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick   ctx->Profile = EGL_CONTEXT_OPENGL_CORE_PROFILE_BIT_KHR;
34963beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick   ctx->ResetNotificationStrategy = EGL_NO_RESET_NOTIFICATION_KHR;
350a8533d54930f8fa989036c197ad20b0778ec0cacBrian Paul
35163beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick   err = _eglParseContextAttribList(ctx, dpy, attrib_list);
3525eb33596a0db26586957365ab27fc6afdebfe057Chia-I Wu   if (err == EGL_SUCCESS && ctx->Config) {
3533fa21881b18044292e7d9455e9a370a71249df22Chia-I Wu      EGLint api_bit;
3545eb33596a0db26586957365ab27fc6afdebfe057Chia-I Wu
3555eb33596a0db26586957365ab27fc6afdebfe057Chia-I Wu      api_bit = _eglGetContextAPIBit(ctx);
3563fa21881b18044292e7d9455e9a370a71249df22Chia-I Wu      if (!(ctx->Config->RenderableType & api_bit)) {
3575eb33596a0db26586957365ab27fc6afdebfe057Chia-I Wu         _eglLog(_EGL_DEBUG, "context api is 0x%x while config supports 0x%x",
3583fa21881b18044292e7d9455e9a370a71249df22Chia-I Wu               api_bit, ctx->Config->RenderableType);
3595eb33596a0db26586957365ab27fc6afdebfe057Chia-I Wu         err = EGL_BAD_CONFIG;
3605eb33596a0db26586957365ab27fc6afdebfe057Chia-I Wu      }
3615eb33596a0db26586957365ab27fc6afdebfe057Chia-I Wu   }
362caa5c8dfe8e5857aa25b2a3fa649d553e651e144Chia-I Wu   if (err != EGL_SUCCESS)
363caa5c8dfe8e5857aa25b2a3fa649d553e651e144Chia-I Wu      return _eglError(err, "eglCreateContext");
364d548bf41d3a0fe443494f94f745d1fe49e5e432cBrian Paul
365d548bf41d3a0fe443494f94f745d1fe49e5e432cBrian Paul   return EGL_TRUE;
366adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
367adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
368adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
369d845f2754bb8c0677323a5922cb90f9ea42bdb1fChia-I Wustatic EGLint
370d845f2754bb8c0677323a5922cb90f9ea42bdb1fChia-I Wu_eglQueryContextRenderBuffer(_EGLContext *ctx)
371d845f2754bb8c0677323a5922cb90f9ea42bdb1fChia-I Wu{
372d845f2754bb8c0677323a5922cb90f9ea42bdb1fChia-I Wu   _EGLSurface *surf = ctx->DrawSurface;
373d845f2754bb8c0677323a5922cb90f9ea42bdb1fChia-I Wu   EGLint rb;
374d845f2754bb8c0677323a5922cb90f9ea42bdb1fChia-I Wu
375d845f2754bb8c0677323a5922cb90f9ea42bdb1fChia-I Wu   if (!surf)
376d845f2754bb8c0677323a5922cb90f9ea42bdb1fChia-I Wu      return EGL_NONE;
377d845f2754bb8c0677323a5922cb90f9ea42bdb1fChia-I Wu   if (surf->Type == EGL_WINDOW_BIT && ctx->WindowRenderBuffer != EGL_NONE)
378d845f2754bb8c0677323a5922cb90f9ea42bdb1fChia-I Wu      rb = ctx->WindowRenderBuffer;
379d845f2754bb8c0677323a5922cb90f9ea42bdb1fChia-I Wu   else
380d845f2754bb8c0677323a5922cb90f9ea42bdb1fChia-I Wu      rb = surf->RenderBuffer;
381d845f2754bb8c0677323a5922cb90f9ea42bdb1fChia-I Wu   return rb;
382d845f2754bb8c0677323a5922cb90f9ea42bdb1fChia-I Wu}
383d845f2754bb8c0677323a5922cb90f9ea42bdb1fChia-I Wu
384d845f2754bb8c0677323a5922cb90f9ea42bdb1fChia-I Wu
385adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PaulEGLBoolean
3862f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu_eglQueryContext(_EGLDriver *drv, _EGLDisplay *dpy, _EGLContext *c,
387d548bf41d3a0fe443494f94f745d1fe49e5e432cBrian Paul                 EGLint attribute, EGLint *value)
388adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
389adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul   (void) drv;
390adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul   (void) dpy;
391adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
392d845f2754bb8c0677323a5922cb90f9ea42bdb1fChia-I Wu   if (!value)
393d845f2754bb8c0677323a5922cb90f9ea42bdb1fChia-I Wu      return _eglError(EGL_BAD_PARAMETER, "eglQueryContext");
394d845f2754bb8c0677323a5922cb90f9ea42bdb1fChia-I Wu
395adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul   switch (attribute) {
396adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul   case EGL_CONFIG_ID:
3973fa21881b18044292e7d9455e9a370a71249df22Chia-I Wu      if (!c->Config)
3983fa21881b18044292e7d9455e9a370a71249df22Chia-I Wu         return _eglError(EGL_BAD_ATTRIBUTE, "eglQueryContext");
3993fa21881b18044292e7d9455e9a370a71249df22Chia-I Wu      *value = c->Config->ConfigID;
400d845f2754bb8c0677323a5922cb90f9ea42bdb1fChia-I Wu      break;
401d845f2754bb8c0677323a5922cb90f9ea42bdb1fChia-I Wu   case EGL_CONTEXT_CLIENT_VERSION:
4023fd79dd9886f05f45f3dc94c028a38dd75b8ee1bIan Romanick      *value = c->ClientMajorVersion;
403d845f2754bb8c0677323a5922cb90f9ea42bdb1fChia-I Wu      break;
404b2006a40eb22899d38cd31691640555228e36975Brian Paul   case EGL_CONTEXT_CLIENT_TYPE:
405b2006a40eb22899d38cd31691640555228e36975Brian Paul      *value = c->ClientAPI;
406d845f2754bb8c0677323a5922cb90f9ea42bdb1fChia-I Wu      break;
407d845f2754bb8c0677323a5922cb90f9ea42bdb1fChia-I Wu   case EGL_RENDER_BUFFER:
408d845f2754bb8c0677323a5922cb90f9ea42bdb1fChia-I Wu      *value = _eglQueryContextRenderBuffer(c);
409d845f2754bb8c0677323a5922cb90f9ea42bdb1fChia-I Wu      break;
410adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul   default:
411d845f2754bb8c0677323a5922cb90f9ea42bdb1fChia-I Wu      return _eglError(EGL_BAD_ATTRIBUTE, "eglQueryContext");
412adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul   }
413d845f2754bb8c0677323a5922cb90f9ea42bdb1fChia-I Wu
414d845f2754bb8c0677323a5922cb90f9ea42bdb1fChia-I Wu   return EGL_TRUE;
415adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
416adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
417adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
418adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul/**
4197c09296d4ce977f711f36c3393fd1a2718a6a6ceChia-I Wu * Bind the context to the thread and return the previous context.
4207c09296d4ce977f711f36c3393fd1a2718a6a6ceChia-I Wu *
4217c09296d4ce977f711f36c3393fd1a2718a6a6ceChia-I Wu * Note that the context may be NULL.
4227c09296d4ce977f711f36c3393fd1a2718a6a6ceChia-I Wu */
4237c09296d4ce977f711f36c3393fd1a2718a6a6ceChia-I Wustatic _EGLContext *
4247c09296d4ce977f711f36c3393fd1a2718a6a6ceChia-I Wu_eglBindContextToThread(_EGLContext *ctx, _EGLThreadInfo *t)
425adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
42621b635ffa8b59049a95d50d4c7b7a8ff6413b730Chia-I Wu   EGLint apiIndex;
4277c09296d4ce977f711f36c3393fd1a2718a6a6ceChia-I Wu   _EGLContext *oldCtx;
4287c09296d4ce977f711f36c3393fd1a2718a6a6ceChia-I Wu
4297c09296d4ce977f711f36c3393fd1a2718a6a6ceChia-I Wu   apiIndex = (ctx) ?
4307c09296d4ce977f711f36c3393fd1a2718a6a6ceChia-I Wu      _eglConvertApiToIndex(ctx->ClientAPI) : t->CurrentAPIIndex;
4317c09296d4ce977f711f36c3393fd1a2718a6a6ceChia-I Wu
4327c09296d4ce977f711f36c3393fd1a2718a6a6ceChia-I Wu   oldCtx = t->CurrentContexts[apiIndex];
433551bfe7a09b0d1bc277796edc10c649b2b07a5b7Chia-I Wu   if (ctx != oldCtx) {
434551bfe7a09b0d1bc277796edc10c649b2b07a5b7Chia-I Wu      if (oldCtx)
435551bfe7a09b0d1bc277796edc10c649b2b07a5b7Chia-I Wu         oldCtx->Binding = NULL;
436551bfe7a09b0d1bc277796edc10c649b2b07a5b7Chia-I Wu      if (ctx)
437551bfe7a09b0d1bc277796edc10c649b2b07a5b7Chia-I Wu         ctx->Binding = t;
4387c09296d4ce977f711f36c3393fd1a2718a6a6ceChia-I Wu
439551bfe7a09b0d1bc277796edc10c649b2b07a5b7Chia-I Wu      t->CurrentContexts[apiIndex] = ctx;
440551bfe7a09b0d1bc277796edc10c649b2b07a5b7Chia-I Wu   }
4417c09296d4ce977f711f36c3393fd1a2718a6a6ceChia-I Wu
4427c09296d4ce977f711f36c3393fd1a2718a6a6ceChia-I Wu   return oldCtx;
4437c09296d4ce977f711f36c3393fd1a2718a6a6ceChia-I Wu}
4447c09296d4ce977f711f36c3393fd1a2718a6a6ceChia-I Wu
4457c09296d4ce977f711f36c3393fd1a2718a6a6ceChia-I Wu
4467c09296d4ce977f711f36c3393fd1a2718a6a6ceChia-I Wu/**
4477c09296d4ce977f711f36c3393fd1a2718a6a6ceChia-I Wu * Return true if the given context and surfaces can be made current.
4487c09296d4ce977f711f36c3393fd1a2718a6a6ceChia-I Wu */
4497c09296d4ce977f711f36c3393fd1a2718a6a6ceChia-I Wustatic EGLBoolean
4507c09296d4ce977f711f36c3393fd1a2718a6a6ceChia-I Wu_eglCheckMakeCurrent(_EGLContext *ctx, _EGLSurface *draw, _EGLSurface *read)
4517c09296d4ce977f711f36c3393fd1a2718a6a6ceChia-I Wu{
4527c09296d4ce977f711f36c3393fd1a2718a6a6ceChia-I Wu   _EGLThreadInfo *t = _eglGetCurrentThread();
4532c343af09873f35cbc7b265d5606a228fe304bb9Kristian Høgsberg   _EGLDisplay *dpy;
4547c09296d4ce977f711f36c3393fd1a2718a6a6ceChia-I Wu   EGLint conflict_api;
455adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
45675da80b29556e6dbbba21e5297ca440e475f65cbChia-I Wu   if (_eglIsCurrentThreadDummy())
45775da80b29556e6dbbba21e5297ca440e475f65cbChia-I Wu      return _eglError(EGL_BAD_ALLOC, "eglMakeCurrent");
45875da80b29556e6dbbba21e5297ca440e475f65cbChia-I Wu
4597c09296d4ce977f711f36c3393fd1a2718a6a6ceChia-I Wu   /* this is easy */
4607c09296d4ce977f711f36c3393fd1a2718a6a6ceChia-I Wu   if (!ctx) {
4617c09296d4ce977f711f36c3393fd1a2718a6a6ceChia-I Wu      if (draw || read)
4628cdc6c66f9d8ede00d02108070d269d3aca8b130Chia-I Wu         return _eglError(EGL_BAD_MATCH, "eglMakeCurrent");
4637c09296d4ce977f711f36c3393fd1a2718a6a6ceChia-I Wu      return EGL_TRUE;
4647c09296d4ce977f711f36c3393fd1a2718a6a6ceChia-I Wu   }
4657c09296d4ce977f711f36c3393fd1a2718a6a6ceChia-I Wu
4662c343af09873f35cbc7b265d5606a228fe304bb9Kristian Høgsberg   dpy = ctx->Resource.Display;
467b50703aea55450e04bcd8154335774786e0f253bIan Romanick   if (!dpy->Extensions.KHR_surfaceless_context
468b50703aea55450e04bcd8154335774786e0f253bIan Romanick       && (draw == NULL || read == NULL))
4697c09296d4ce977f711f36c3393fd1a2718a6a6ceChia-I Wu      return _eglError(EGL_BAD_MATCH, "eglMakeCurrent");
4707c09296d4ce977f711f36c3393fd1a2718a6a6ceChia-I Wu
4717c09296d4ce977f711f36c3393fd1a2718a6a6ceChia-I Wu   /*
4727c09296d4ce977f711f36c3393fd1a2718a6a6ceChia-I Wu    * The spec says
4737c09296d4ce977f711f36c3393fd1a2718a6a6ceChia-I Wu    *
4747c09296d4ce977f711f36c3393fd1a2718a6a6ceChia-I Wu    * "If ctx is current to some other thread, or if either draw or read are
4757c09296d4ce977f711f36c3393fd1a2718a6a6ceChia-I Wu    * bound to contexts in another thread, an EGL_BAD_ACCESS error is
4767c09296d4ce977f711f36c3393fd1a2718a6a6ceChia-I Wu    * generated."
4777c09296d4ce977f711f36c3393fd1a2718a6a6ceChia-I Wu    *
4780d43cbed2f130c377bed92c7a8ad8c19f441d6a5Chia-I Wu    * and
4797c09296d4ce977f711f36c3393fd1a2718a6a6ceChia-I Wu    *
4807c09296d4ce977f711f36c3393fd1a2718a6a6ceChia-I Wu    * "at most one context may be bound to a particular surface at a given
4817c09296d4ce977f711f36c3393fd1a2718a6a6ceChia-I Wu    * time"
4827c09296d4ce977f711f36c3393fd1a2718a6a6ceChia-I Wu    */
4830d43cbed2f130c377bed92c7a8ad8c19f441d6a5Chia-I Wu   if (ctx->Binding && ctx->Binding != t)
4847c09296d4ce977f711f36c3393fd1a2718a6a6ceChia-I Wu      return _eglError(EGL_BAD_ACCESS, "eglMakeCurrent");
4850d43cbed2f130c377bed92c7a8ad8c19f441d6a5Chia-I Wu   if (draw && draw->CurrentContext && draw->CurrentContext != ctx) {
4860d43cbed2f130c377bed92c7a8ad8c19f441d6a5Chia-I Wu      if (draw->CurrentContext->Binding != t ||
4870d43cbed2f130c377bed92c7a8ad8c19f441d6a5Chia-I Wu          draw->CurrentContext->ClientAPI != ctx->ClientAPI)
4880d43cbed2f130c377bed92c7a8ad8c19f441d6a5Chia-I Wu         return _eglError(EGL_BAD_ACCESS, "eglMakeCurrent");
4890d43cbed2f130c377bed92c7a8ad8c19f441d6a5Chia-I Wu   }
4900d43cbed2f130c377bed92c7a8ad8c19f441d6a5Chia-I Wu   if (read && read->CurrentContext && read->CurrentContext != ctx) {
4910d43cbed2f130c377bed92c7a8ad8c19f441d6a5Chia-I Wu      if (read->CurrentContext->Binding != t ||
4920d43cbed2f130c377bed92c7a8ad8c19f441d6a5Chia-I Wu          read->CurrentContext->ClientAPI != ctx->ClientAPI)
4930d43cbed2f130c377bed92c7a8ad8c19f441d6a5Chia-I Wu         return _eglError(EGL_BAD_ACCESS, "eglMakeCurrent");
4940d43cbed2f130c377bed92c7a8ad8c19f441d6a5Chia-I Wu   }
4957c09296d4ce977f711f36c3393fd1a2718a6a6ceChia-I Wu
4967c09296d4ce977f711f36c3393fd1a2718a6a6ceChia-I Wu   /* simply require the configs to be equal */
497b90a3e7d8b1bcd412ddbf2a4803de2756dacd436Kristian Høgsberg   if ((draw && draw->Config != ctx->Config) ||
498b90a3e7d8b1bcd412ddbf2a4803de2756dacd436Kristian Høgsberg       (read && read->Config != ctx->Config))
4997c09296d4ce977f711f36c3393fd1a2718a6a6ceChia-I Wu      return _eglError(EGL_BAD_MATCH, "eglMakeCurrent");
50021b635ffa8b59049a95d50d4c7b7a8ff6413b730Chia-I Wu
5017c09296d4ce977f711f36c3393fd1a2718a6a6ceChia-I Wu   switch (ctx->ClientAPI) {
5027c09296d4ce977f711f36c3393fd1a2718a6a6ceChia-I Wu   /* OpenGL and OpenGL ES are conflicting */
5037c09296d4ce977f711f36c3393fd1a2718a6a6ceChia-I Wu   case EGL_OPENGL_ES_API:
5047c09296d4ce977f711f36c3393fd1a2718a6a6ceChia-I Wu      conflict_api = EGL_OPENGL_API;
5057c09296d4ce977f711f36c3393fd1a2718a6a6ceChia-I Wu      break;
5067c09296d4ce977f711f36c3393fd1a2718a6a6ceChia-I Wu   case EGL_OPENGL_API:
5077c09296d4ce977f711f36c3393fd1a2718a6a6ceChia-I Wu      conflict_api = EGL_OPENGL_ES_API;
5087c09296d4ce977f711f36c3393fd1a2718a6a6ceChia-I Wu      break;
5097c09296d4ce977f711f36c3393fd1a2718a6a6ceChia-I Wu   default:
5107c09296d4ce977f711f36c3393fd1a2718a6a6ceChia-I Wu      conflict_api = -1;
5117c09296d4ce977f711f36c3393fd1a2718a6a6ceChia-I Wu      break;
51221b635ffa8b59049a95d50d4c7b7a8ff6413b730Chia-I Wu   }
51321b635ffa8b59049a95d50d4c7b7a8ff6413b730Chia-I Wu
5147c09296d4ce977f711f36c3393fd1a2718a6a6ceChia-I Wu   if (conflict_api >= 0 && _eglGetAPIContext(conflict_api))
5157c09296d4ce977f711f36c3393fd1a2718a6a6ceChia-I Wu      return _eglError(EGL_BAD_ACCESS, "eglMakeCurrent");
5167c09296d4ce977f711f36c3393fd1a2718a6a6ceChia-I Wu
5177c09296d4ce977f711f36c3393fd1a2718a6a6ceChia-I Wu   return EGL_TRUE;
5187c09296d4ce977f711f36c3393fd1a2718a6a6ceChia-I Wu}
5197c09296d4ce977f711f36c3393fd1a2718a6a6ceChia-I Wu
5207c09296d4ce977f711f36c3393fd1a2718a6a6ceChia-I Wu
5217c09296d4ce977f711f36c3393fd1a2718a6a6ceChia-I Wu/**
522959481ad70b033a254f4d7d0a94dfdfab6b94c15Chia-I Wu * Bind the context to the current thread and given surfaces.  Return the
523d19afc57fe49816f3f3290410e0124d326577be2Chia-I Wu * previous bound context and surfaces.  The caller should unreference the
524d19afc57fe49816f3f3290410e0124d326577be2Chia-I Wu * returned context and surfaces.
525d19afc57fe49816f3f3290410e0124d326577be2Chia-I Wu *
526d19afc57fe49816f3f3290410e0124d326577be2Chia-I Wu * Making a second call with the resources returned by the first call
527d19afc57fe49816f3f3290410e0124d326577be2Chia-I Wu * unsurprisingly undoes the first call, except for the resouce reference
528d19afc57fe49816f3f3290410e0124d326577be2Chia-I Wu * counts.
529959481ad70b033a254f4d7d0a94dfdfab6b94c15Chia-I Wu */
530959481ad70b033a254f4d7d0a94dfdfab6b94c15Chia-I WuEGLBoolean
531d19afc57fe49816f3f3290410e0124d326577be2Chia-I Wu_eglBindContext(_EGLContext *ctx, _EGLSurface *draw, _EGLSurface *read,
532d19afc57fe49816f3f3290410e0124d326577be2Chia-I Wu                _EGLContext **old_ctx,
533d19afc57fe49816f3f3290410e0124d326577be2Chia-I Wu                _EGLSurface **old_draw, _EGLSurface **old_read)
534959481ad70b033a254f4d7d0a94dfdfab6b94c15Chia-I Wu{
535959481ad70b033a254f4d7d0a94dfdfab6b94c15Chia-I Wu   _EGLThreadInfo *t = _eglGetCurrentThread();
536d19afc57fe49816f3f3290410e0124d326577be2Chia-I Wu   _EGLContext *prev_ctx;
537d19afc57fe49816f3f3290410e0124d326577be2Chia-I Wu   _EGLSurface *prev_draw, *prev_read;
538959481ad70b033a254f4d7d0a94dfdfab6b94c15Chia-I Wu
539d19afc57fe49816f3f3290410e0124d326577be2Chia-I Wu   if (!_eglCheckMakeCurrent(ctx, draw, read))
540959481ad70b033a254f4d7d0a94dfdfab6b94c15Chia-I Wu      return EGL_FALSE;
541959481ad70b033a254f4d7d0a94dfdfab6b94c15Chia-I Wu
542d19afc57fe49816f3f3290410e0124d326577be2Chia-I Wu   /* increment refcounts before binding */
543d19afc57fe49816f3f3290410e0124d326577be2Chia-I Wu   _eglGetContext(ctx);
544d19afc57fe49816f3f3290410e0124d326577be2Chia-I Wu   _eglGetSurface(draw);
545d19afc57fe49816f3f3290410e0124d326577be2Chia-I Wu   _eglGetSurface(read);
546d19afc57fe49816f3f3290410e0124d326577be2Chia-I Wu
547959481ad70b033a254f4d7d0a94dfdfab6b94c15Chia-I Wu   /* bind the new context */
548d19afc57fe49816f3f3290410e0124d326577be2Chia-I Wu   prev_ctx = _eglBindContextToThread(ctx, t);
549bbe459b14d593bd2d7b6c0f010e165fe815e8396Chia-I Wu
550d19afc57fe49816f3f3290410e0124d326577be2Chia-I Wu   /* break previous bindings */
551d19afc57fe49816f3f3290410e0124d326577be2Chia-I Wu   if (prev_ctx) {
552d19afc57fe49816f3f3290410e0124d326577be2Chia-I Wu      prev_draw = prev_ctx->DrawSurface;
553d19afc57fe49816f3f3290410e0124d326577be2Chia-I Wu      prev_read = prev_ctx->ReadSurface;
554848945e5d63ff8327f5a1a6e61e66fcdab3ac8fcChia-I Wu
555d19afc57fe49816f3f3290410e0124d326577be2Chia-I Wu      if (prev_draw)
556d19afc57fe49816f3f3290410e0124d326577be2Chia-I Wu         prev_draw->CurrentContext = NULL;
557d19afc57fe49816f3f3290410e0124d326577be2Chia-I Wu      if (prev_read)
558d19afc57fe49816f3f3290410e0124d326577be2Chia-I Wu         prev_read->CurrentContext = NULL;
559ea9e5dbbc2e992ead954d3d2ebf3689f7a003f79Chia-I Wu
560d19afc57fe49816f3f3290410e0124d326577be2Chia-I Wu      prev_ctx->DrawSurface = NULL;
561d19afc57fe49816f3f3290410e0124d326577be2Chia-I Wu      prev_ctx->ReadSurface = NULL;
562d19afc57fe49816f3f3290410e0124d326577be2Chia-I Wu   }
563d19afc57fe49816f3f3290410e0124d326577be2Chia-I Wu   else {
564d19afc57fe49816f3f3290410e0124d326577be2Chia-I Wu      prev_draw = prev_read = NULL;
565ea9e5dbbc2e992ead954d3d2ebf3689f7a003f79Chia-I Wu   }
566ea9e5dbbc2e992ead954d3d2ebf3689f7a003f79Chia-I Wu
567ea9e5dbbc2e992ead954d3d2ebf3689f7a003f79Chia-I Wu   /* establish new bindings */
568d19afc57fe49816f3f3290410e0124d326577be2Chia-I Wu   if (ctx) {
569d19afc57fe49816f3f3290410e0124d326577be2Chia-I Wu      if (draw)
570d19afc57fe49816f3f3290410e0124d326577be2Chia-I Wu         draw->CurrentContext = ctx;
571d19afc57fe49816f3f3290410e0124d326577be2Chia-I Wu      if (read)
572d19afc57fe49816f3f3290410e0124d326577be2Chia-I Wu         read->CurrentContext = ctx;
573d19afc57fe49816f3f3290410e0124d326577be2Chia-I Wu
574d19afc57fe49816f3f3290410e0124d326577be2Chia-I Wu      ctx->DrawSurface = draw;
575d19afc57fe49816f3f3290410e0124d326577be2Chia-I Wu      ctx->ReadSurface = read;
576959481ad70b033a254f4d7d0a94dfdfab6b94c15Chia-I Wu   }
577959481ad70b033a254f4d7d0a94dfdfab6b94c15Chia-I Wu
578d19afc57fe49816f3f3290410e0124d326577be2Chia-I Wu   assert(old_ctx && old_draw && old_read);
579d19afc57fe49816f3f3290410e0124d326577be2Chia-I Wu   *old_ctx = prev_ctx;
580d19afc57fe49816f3f3290410e0124d326577be2Chia-I Wu   *old_draw = prev_draw;
581d19afc57fe49816f3f3290410e0124d326577be2Chia-I Wu   *old_read = prev_read;
582bbe459b14d593bd2d7b6c0f010e165fe815e8396Chia-I Wu
583959481ad70b033a254f4d7d0a94dfdfab6b94c15Chia-I Wu   return EGL_TRUE;
584959481ad70b033a254f4d7d0a94dfdfab6b94c15Chia-I Wu}
585