1f2001df508fda599a18b3586d2775e970a3db13aChia-I Wu/**************************************************************************
2f2001df508fda599a18b3586d2775e970a3db13aChia-I Wu *
3877128505431adaf817dc8069172ebe4a1cdf5d8José Fonseca * Copyright 2008 VMware, Inc.
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;
59eb09940e55806c36890ae8f5a35ad1b37ed74832Chad Versace      case 3:
60eb09940e55806c36890ae8f5a35ad1b37ed74832Chad Versace         bit = EGL_OPENGL_ES3_BIT_KHR;
61eb09940e55806c36890ae8f5a35ad1b37ed74832Chad Versace         break;
62caa5c8dfe8e5857aa25b2a3fa649d553e651e144Chia-I Wu      default:
63caa5c8dfe8e5857aa25b2a3fa649d553e651e144Chia-I Wu         break;
64caa5c8dfe8e5857aa25b2a3fa649d553e651e144Chia-I Wu      }
65caa5c8dfe8e5857aa25b2a3fa649d553e651e144Chia-I Wu      break;
66caa5c8dfe8e5857aa25b2a3fa649d553e651e144Chia-I Wu   case EGL_OPENVG_API:
67caa5c8dfe8e5857aa25b2a3fa649d553e651e144Chia-I Wu      bit = EGL_OPENVG_BIT;
68caa5c8dfe8e5857aa25b2a3fa649d553e651e144Chia-I Wu      break;
69caa5c8dfe8e5857aa25b2a3fa649d553e651e144Chia-I Wu   case EGL_OPENGL_API:
70caa5c8dfe8e5857aa25b2a3fa649d553e651e144Chia-I Wu      bit = EGL_OPENGL_BIT;
71caa5c8dfe8e5857aa25b2a3fa649d553e651e144Chia-I Wu      break;
72caa5c8dfe8e5857aa25b2a3fa649d553e651e144Chia-I Wu   default:
73caa5c8dfe8e5857aa25b2a3fa649d553e651e144Chia-I Wu      break;
74caa5c8dfe8e5857aa25b2a3fa649d553e651e144Chia-I Wu   }
75caa5c8dfe8e5857aa25b2a3fa649d553e651e144Chia-I Wu
76caa5c8dfe8e5857aa25b2a3fa649d553e651e144Chia-I Wu   return bit;
77caa5c8dfe8e5857aa25b2a3fa649d553e651e144Chia-I Wu}
78caa5c8dfe8e5857aa25b2a3fa649d553e651e144Chia-I Wu
79caa5c8dfe8e5857aa25b2a3fa649d553e651e144Chia-I Wu
80caa5c8dfe8e5857aa25b2a3fa649d553e651e144Chia-I Wu/**
81caa5c8dfe8e5857aa25b2a3fa649d553e651e144Chia-I Wu * Parse the list of context attributes and return the proper error code.
82caa5c8dfe8e5857aa25b2a3fa649d553e651e144Chia-I Wu */
83caa5c8dfe8e5857aa25b2a3fa649d553e651e144Chia-I Wustatic EGLint
8463beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick_eglParseContextAttribList(_EGLContext *ctx, _EGLDisplay *dpy,
8563beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick                           const EGLint *attrib_list)
86caa5c8dfe8e5857aa25b2a3fa649d553e651e144Chia-I Wu{
87caa5c8dfe8e5857aa25b2a3fa649d553e651e144Chia-I Wu   EGLenum api = ctx->ClientAPI;
88caa5c8dfe8e5857aa25b2a3fa649d553e651e144Chia-I Wu   EGLint i, err = EGL_SUCCESS;
89caa5c8dfe8e5857aa25b2a3fa649d553e651e144Chia-I Wu
90caa5c8dfe8e5857aa25b2a3fa649d553e651e144Chia-I Wu   if (!attrib_list)
91caa5c8dfe8e5857aa25b2a3fa649d553e651e144Chia-I Wu      return EGL_SUCCESS;
92caa5c8dfe8e5857aa25b2a3fa649d553e651e144Chia-I Wu
9363beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick   if (api == EGL_OPENVG_API && attrib_list[0] != EGL_NONE) {
9463beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick      _eglLog(_EGL_DEBUG, "bad context attribute 0x%04x", attrib_list[0]);
9563beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick      return EGL_BAD_ATTRIBUTE;
9663beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick   }
9763beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick
98caa5c8dfe8e5857aa25b2a3fa649d553e651e144Chia-I Wu   for (i = 0; attrib_list[i] != EGL_NONE; i++) {
99caa5c8dfe8e5857aa25b2a3fa649d553e651e144Chia-I Wu      EGLint attr = attrib_list[i++];
100caa5c8dfe8e5857aa25b2a3fa649d553e651e144Chia-I Wu      EGLint val = attrib_list[i];
101caa5c8dfe8e5857aa25b2a3fa649d553e651e144Chia-I Wu
102caa5c8dfe8e5857aa25b2a3fa649d553e651e144Chia-I Wu      switch (attr) {
103caa5c8dfe8e5857aa25b2a3fa649d553e651e144Chia-I Wu      case EGL_CONTEXT_CLIENT_VERSION:
104d9603be038b6d30f17ca7c05e60cc78100a625acFrank Binns         /* The EGL 1.4 spec says:
105d9603be038b6d30f17ca7c05e60cc78100a625acFrank Binns          *
106d9603be038b6d30f17ca7c05e60cc78100a625acFrank Binns          *     "attribute EGL_CONTEXT_CLIENT_VERSION is only valid when the
107d9603be038b6d30f17ca7c05e60cc78100a625acFrank Binns          *      current rendering API is EGL_OPENGL_ES_API"
108d9603be038b6d30f17ca7c05e60cc78100a625acFrank Binns          *
109d9603be038b6d30f17ca7c05e60cc78100a625acFrank Binns          * The EGL_KHR_create_context spec says:
110d9603be038b6d30f17ca7c05e60cc78100a625acFrank Binns          *
111d9603be038b6d30f17ca7c05e60cc78100a625acFrank Binns          *     "EGL_CONTEXT_MAJOR_VERSION_KHR           0x3098
112d9603be038b6d30f17ca7c05e60cc78100a625acFrank Binns          *      (this token is an alias for EGL_CONTEXT_CLIENT_VERSION)"
113d9603be038b6d30f17ca7c05e60cc78100a625acFrank Binns          *
114d9603be038b6d30f17ca7c05e60cc78100a625acFrank Binns          *     "The values for attributes EGL_CONTEXT_MAJOR_VERSION_KHR and
115d9603be038b6d30f17ca7c05e60cc78100a625acFrank Binns          *      EGL_CONTEXT_MINOR_VERSION_KHR specify the requested client API
116d9603be038b6d30f17ca7c05e60cc78100a625acFrank Binns          *      version. They are only meaningful for OpenGL and OpenGL ES
117d9603be038b6d30f17ca7c05e60cc78100a625acFrank Binns          *      contexts, and specifying them for other types of contexts will
118d9603be038b6d30f17ca7c05e60cc78100a625acFrank Binns          *      generate an error."
119d9603be038b6d30f17ca7c05e60cc78100a625acFrank Binns          */
120d9603be038b6d30f17ca7c05e60cc78100a625acFrank Binns         if ((api != EGL_OPENGL_ES_API &&
121d9603be038b6d30f17ca7c05e60cc78100a625acFrank Binns             (!dpy->Extensions.KHR_create_context || api != EGL_OPENGL_API))) {
122d9603be038b6d30f17ca7c05e60cc78100a625acFrank Binns               err = EGL_BAD_ATTRIBUTE;
123d9603be038b6d30f17ca7c05e60cc78100a625acFrank Binns               break;
124d9603be038b6d30f17ca7c05e60cc78100a625acFrank Binns         }
125d9603be038b6d30f17ca7c05e60cc78100a625acFrank Binns
12663beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick         ctx->ClientMajorVersion = val;
12763beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick         break;
12863beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick
12963beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick      case EGL_CONTEXT_MINOR_VERSION_KHR:
130d9603be038b6d30f17ca7c05e60cc78100a625acFrank Binns         /* The EGL_KHR_create_context spec says:
131d9603be038b6d30f17ca7c05e60cc78100a625acFrank Binns          *
132d9603be038b6d30f17ca7c05e60cc78100a625acFrank Binns          *     "The values for attributes EGL_CONTEXT_MAJOR_VERSION_KHR and
133d9603be038b6d30f17ca7c05e60cc78100a625acFrank Binns          *      EGL_CONTEXT_MINOR_VERSION_KHR specify the requested client API
134d9603be038b6d30f17ca7c05e60cc78100a625acFrank Binns          *      version. They are only meaningful for OpenGL and OpenGL ES
135d9603be038b6d30f17ca7c05e60cc78100a625acFrank Binns          *      contexts, and specifying them for other types of contexts will
136d9603be038b6d30f17ca7c05e60cc78100a625acFrank Binns          *      generate an error."
137d9603be038b6d30f17ca7c05e60cc78100a625acFrank Binns          */
138d9603be038b6d30f17ca7c05e60cc78100a625acFrank Binns         if (!dpy->Extensions.KHR_create_context ||
139d9603be038b6d30f17ca7c05e60cc78100a625acFrank Binns             (api != EGL_OPENGL_ES_API && api != EGL_OPENGL_API)) {
140caa5c8dfe8e5857aa25b2a3fa649d553e651e144Chia-I Wu            err = EGL_BAD_ATTRIBUTE;
141caa5c8dfe8e5857aa25b2a3fa649d553e651e144Chia-I Wu            break;
142caa5c8dfe8e5857aa25b2a3fa649d553e651e144Chia-I Wu         }
14363beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick
14463beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick         ctx->ClientMinorVersion = val;
14563beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick         break;
14663beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick
14763beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick      case EGL_CONTEXT_FLAGS_KHR:
14863beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick         if (!dpy->Extensions.KHR_create_context) {
149caa5c8dfe8e5857aa25b2a3fa649d553e651e144Chia-I Wu            err = EGL_BAD_ATTRIBUTE;
150caa5c8dfe8e5857aa25b2a3fa649d553e651e144Chia-I Wu            break;
151caa5c8dfe8e5857aa25b2a3fa649d553e651e144Chia-I Wu         }
15263beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick
15363beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick         /* The EGL_KHR_create_context spec says:
15463beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick          *
15511cabc45b7124e51d5ead42db6dceb5a3755266bMatthew Waters          *     "If the EGL_CONTEXT_OPENGL_DEBUG_BIT_KHR flag bit is set in
15611cabc45b7124e51d5ead42db6dceb5a3755266bMatthew Waters          *     EGL_CONTEXT_FLAGS_KHR, then a <debug context> will be created.
15711cabc45b7124e51d5ead42db6dceb5a3755266bMatthew Waters          *     [...]
15811cabc45b7124e51d5ead42db6dceb5a3755266bMatthew Waters          *     In some cases a debug context may be identical to a non-debug
15911cabc45b7124e51d5ead42db6dceb5a3755266bMatthew Waters          *     context. This bit is supported for OpenGL and OpenGL ES
16011cabc45b7124e51d5ead42db6dceb5a3755266bMatthew Waters          *     contexts."
16163beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick          */
16211cabc45b7124e51d5ead42db6dceb5a3755266bMatthew Waters         if ((val & EGL_CONTEXT_OPENGL_DEBUG_BIT_KHR) &&
16311cabc45b7124e51d5ead42db6dceb5a3755266bMatthew Waters             (api != EGL_OPENGL_API && api != EGL_OPENGL_ES_API)) {
16411cabc45b7124e51d5ead42db6dceb5a3755266bMatthew Waters            err = EGL_BAD_ATTRIBUTE;
16511cabc45b7124e51d5ead42db6dceb5a3755266bMatthew Waters            break;
16611cabc45b7124e51d5ead42db6dceb5a3755266bMatthew Waters         }
16711cabc45b7124e51d5ead42db6dceb5a3755266bMatthew Waters
16811cabc45b7124e51d5ead42db6dceb5a3755266bMatthew Waters         /* The EGL_KHR_create_context spec says:
16911cabc45b7124e51d5ead42db6dceb5a3755266bMatthew Waters          *
17011cabc45b7124e51d5ead42db6dceb5a3755266bMatthew Waters          *     "If the EGL_CONTEXT_OPENGL_FORWARD_COMPATIBLE_BIT_KHR flag bit
17111cabc45b7124e51d5ead42db6dceb5a3755266bMatthew Waters          *     is set in EGL_CONTEXT_FLAGS_KHR, then a <forward-compatible>
17211cabc45b7124e51d5ead42db6dceb5a3755266bMatthew Waters          *     context will be created. Forward-compatible contexts are
17311cabc45b7124e51d5ead42db6dceb5a3755266bMatthew Waters          *     defined only for OpenGL versions 3.0 and later. They must not
17411cabc45b7124e51d5ead42db6dceb5a3755266bMatthew Waters          *     support functionality marked as <deprecated> by that version of
17511cabc45b7124e51d5ead42db6dceb5a3755266bMatthew Waters          *     the API, while a non-forward-compatible context must support
17611cabc45b7124e51d5ead42db6dceb5a3755266bMatthew Waters          *     all functionality in that version, deprecated or not. This bit
17711cabc45b7124e51d5ead42db6dceb5a3755266bMatthew Waters          *     is supported for OpenGL contexts, and requesting a
17811cabc45b7124e51d5ead42db6dceb5a3755266bMatthew Waters          *     forward-compatible context for OpenGL versions less than 3.0
17911cabc45b7124e51d5ead42db6dceb5a3755266bMatthew Waters          *     will generate an error."
18011cabc45b7124e51d5ead42db6dceb5a3755266bMatthew Waters          */
18111cabc45b7124e51d5ead42db6dceb5a3755266bMatthew Waters         if ((val & EGL_CONTEXT_OPENGL_FORWARD_COMPATIBLE_BIT_KHR) &&
18211cabc45b7124e51d5ead42db6dceb5a3755266bMatthew Waters             (api != EGL_OPENGL_API || ctx->ClientMajorVersion < 3)) {
18311cabc45b7124e51d5ead42db6dceb5a3755266bMatthew Waters            err = EGL_BAD_ATTRIBUTE;
18411cabc45b7124e51d5ead42db6dceb5a3755266bMatthew Waters            break;
18511cabc45b7124e51d5ead42db6dceb5a3755266bMatthew Waters         }
18611cabc45b7124e51d5ead42db6dceb5a3755266bMatthew Waters
18711cabc45b7124e51d5ead42db6dceb5a3755266bMatthew Waters         if ((val & EGL_CONTEXT_OPENGL_ROBUST_ACCESS_BIT_KHR) &&
188b85c0b569fe133b71a767a068e8608868158134eChad Versace             api != EGL_OPENGL_API) {
189b85c0b569fe133b71a767a068e8608868158134eChad Versace            /* The EGL_KHR_create_context spec says:
190b85c0b569fe133b71a767a068e8608868158134eChad Versace             *
191b85c0b569fe133b71a767a068e8608868158134eChad Versace             *   10) Which error should be generated if robust buffer access
192b85c0b569fe133b71a767a068e8608868158134eChad Versace             *       or reset notifications are requested under OpenGL ES?
193b85c0b569fe133b71a767a068e8608868158134eChad Versace             *
194b85c0b569fe133b71a767a068e8608868158134eChad Versace             *       As per Issue 6, this extension does not support creating
195b85c0b569fe133b71a767a068e8608868158134eChad Versace             *       robust contexts for OpenGL ES. This is only supported via
196b85c0b569fe133b71a767a068e8608868158134eChad Versace             *       the EGL_EXT_create_context_robustness extension.
197b85c0b569fe133b71a767a068e8608868158134eChad Versace             *
198b85c0b569fe133b71a767a068e8608868158134eChad Versace             *       Attempting to use this extension to create robust OpenGL
199b85c0b569fe133b71a767a068e8608868158134eChad Versace             *       ES context will generate an EGL_BAD_ATTRIBUTE error. This
200b85c0b569fe133b71a767a068e8608868158134eChad Versace             *       specific error is generated because this extension does
201b85c0b569fe133b71a767a068e8608868158134eChad Versace             *       not define the EGL_CONTEXT_OPENGL_ROBUST_ACCESS_BIT_KHR
202b85c0b569fe133b71a767a068e8608868158134eChad Versace             *       and EGL_CONTEXT_OPENGL_RESET_NOTIFICATION_STRATEGY_KHR
203b85c0b569fe133b71a767a068e8608868158134eChad Versace             *       bits for OpenGL ES contexts. Thus, use of these bits fall
204b85c0b569fe133b71a767a068e8608868158134eChad Versace             *       under condition described by: "If an attribute is
205b85c0b569fe133b71a767a068e8608868158134eChad Versace             *       specified that is not meaningful for the client API
206b85c0b569fe133b71a767a068e8608868158134eChad Versace             *       type.." in the above specification.
207b85c0b569fe133b71a767a068e8608868158134eChad Versace             *
208b85c0b569fe133b71a767a068e8608868158134eChad Versace             * The spec requires that we emit the error even if the display
209b85c0b569fe133b71a767a068e8608868158134eChad Versace             * supports EGL_EXT_create_context_robustness. To create a robust
210b85c0b569fe133b71a767a068e8608868158134eChad Versace             * GLES context, the *attribute*
211b85c0b569fe133b71a767a068e8608868158134eChad Versace             * EGL_CONTEXT_OPENGL_ROBUST_ACCESS_EXT must be used, not the
212b85c0b569fe133b71a767a068e8608868158134eChad Versace             * *flag* EGL_CONTEXT_OPENGL_ROBUST_ACCESS_BIT_KHR.
213b85c0b569fe133b71a767a068e8608868158134eChad Versace             */
21463beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick            err = EGL_BAD_ATTRIBUTE;
21563beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick            break;
21663beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick         }
21763beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick
218f9f894447e4e7442d5dfa489bb43f2823e2fc71dMarek Olšák         ctx->Flags |= val;
219caa5c8dfe8e5857aa25b2a3fa649d553e651e144Chia-I Wu         break;
22063beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick
22163beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick      case EGL_CONTEXT_OPENGL_PROFILE_MASK_KHR:
22263beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick         if (!dpy->Extensions.KHR_create_context) {
22363beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick            err = EGL_BAD_ATTRIBUTE;
22463beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick            break;
22563beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick         }
22663beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick
22763beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick         /* The EGL_KHR_create_context spec says:
22863beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick          *
22963beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick          *     "[EGL_CONTEXT_OPENGL_PROFILE_MASK_KHR] is only meaningful for
23063beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick          *     OpenGL contexts, and specifying it for other types of
23163beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick          *     contexts, including OpenGL ES contexts, will generate an
23263beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick          *     error."
23363beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick          */
23463beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick         if (api != EGL_OPENGL_API) {
23563beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick            err = EGL_BAD_ATTRIBUTE;
23663beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick            break;
23763beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick         }
23863beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick
23963beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick         ctx->Profile = val;
24063beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick         break;
24163beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick
24263beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick      case EGL_CONTEXT_OPENGL_RESET_NOTIFICATION_STRATEGY_KHR:
24363beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick         /* The EGL_KHR_create_context spec says:
24463beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick          *
24563beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick          *     "[EGL_CONTEXT_OPENGL_RESET_NOTIFICATION_STRATEGY_KHR] is only
24663beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick          *     meaningful for OpenGL contexts, and specifying it for other
24763beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick          *     types of contexts, including OpenGL ES contexts, will generate
24863beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick          *     an error."
24963beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick          */
25063beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick           if (!dpy->Extensions.KHR_create_context
25163beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick               || api != EGL_OPENGL_API) {
25263beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick            err = EGL_BAD_ATTRIBUTE;
25363beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick            break;
25463beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick         }
25563beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick
25663beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick         ctx->ResetNotificationStrategy = val;
25763beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick         break;
25863beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick
259f171571bfc897921cee63cbba3b71fd9b64174c9Ian Romanick      case EGL_CONTEXT_OPENGL_RESET_NOTIFICATION_STRATEGY_EXT:
260f171571bfc897921cee63cbba3b71fd9b64174c9Ian Romanick         /* The EGL_EXT_create_context_robustness spec says:
261f171571bfc897921cee63cbba3b71fd9b64174c9Ian Romanick          *
262f171571bfc897921cee63cbba3b71fd9b64174c9Ian Romanick          *     "[EGL_CONTEXT_OPENGL_RESET_NOTIFICATION_STRATEGY_EXT] is only
263f171571bfc897921cee63cbba3b71fd9b64174c9Ian Romanick          *     meaningful for OpenGL ES contexts, and specifying it for other
264f171571bfc897921cee63cbba3b71fd9b64174c9Ian Romanick          *     types of contexts will generate an EGL_BAD_ATTRIBUTE error."
265f171571bfc897921cee63cbba3b71fd9b64174c9Ian Romanick          */
266f171571bfc897921cee63cbba3b71fd9b64174c9Ian Romanick         if (!dpy->Extensions.EXT_create_context_robustness
267f171571bfc897921cee63cbba3b71fd9b64174c9Ian Romanick             || api != EGL_OPENGL_ES_API) {
268f171571bfc897921cee63cbba3b71fd9b64174c9Ian Romanick            err = EGL_BAD_ATTRIBUTE;
269f171571bfc897921cee63cbba3b71fd9b64174c9Ian Romanick            break;
270f171571bfc897921cee63cbba3b71fd9b64174c9Ian Romanick         }
271f171571bfc897921cee63cbba3b71fd9b64174c9Ian Romanick
272f171571bfc897921cee63cbba3b71fd9b64174c9Ian Romanick         ctx->ResetNotificationStrategy = val;
273f171571bfc897921cee63cbba3b71fd9b64174c9Ian Romanick         break;
274f171571bfc897921cee63cbba3b71fd9b64174c9Ian Romanick
275f171571bfc897921cee63cbba3b71fd9b64174c9Ian Romanick      case EGL_CONTEXT_OPENGL_ROBUST_ACCESS_EXT:
276f171571bfc897921cee63cbba3b71fd9b64174c9Ian Romanick         if (!dpy->Extensions.EXT_create_context_robustness) {
277f171571bfc897921cee63cbba3b71fd9b64174c9Ian Romanick            err = EGL_BAD_ATTRIBUTE;
278f171571bfc897921cee63cbba3b71fd9b64174c9Ian Romanick            break;
279f171571bfc897921cee63cbba3b71fd9b64174c9Ian Romanick         }
280f171571bfc897921cee63cbba3b71fd9b64174c9Ian Romanick
281f9f894447e4e7442d5dfa489bb43f2823e2fc71dMarek Olšák         if (val == EGL_TRUE)
282f9f894447e4e7442d5dfa489bb43f2823e2fc71dMarek Olšák            ctx->Flags |= EGL_CONTEXT_OPENGL_ROBUST_ACCESS_BIT_KHR;
283f171571bfc897921cee63cbba3b71fd9b64174c9Ian Romanick         break;
284f171571bfc897921cee63cbba3b71fd9b64174c9Ian Romanick
285706466f4619b76f2475120f187c34d01ab5aa727Marek Olšák      case EGL_CONTEXT_OPENGL_ROBUST_ACCESS:
286706466f4619b76f2475120f187c34d01ab5aa727Marek Olšák         if (dpy->Version < 15) {
287706466f4619b76f2475120f187c34d01ab5aa727Marek Olšák            err = EGL_BAD_ATTRIBUTE;
288706466f4619b76f2475120f187c34d01ab5aa727Marek Olšák            break;
289706466f4619b76f2475120f187c34d01ab5aa727Marek Olšák         }
290706466f4619b76f2475120f187c34d01ab5aa727Marek Olšák
291706466f4619b76f2475120f187c34d01ab5aa727Marek Olšák         if (val == EGL_TRUE)
292706466f4619b76f2475120f187c34d01ab5aa727Marek Olšák            ctx->Flags |= EGL_CONTEXT_OPENGL_ROBUST_ACCESS_BIT_KHR;
293706466f4619b76f2475120f187c34d01ab5aa727Marek Olšák         break;
294706466f4619b76f2475120f187c34d01ab5aa727Marek Olšák
295706466f4619b76f2475120f187c34d01ab5aa727Marek Olšák      case EGL_CONTEXT_OPENGL_DEBUG:
296706466f4619b76f2475120f187c34d01ab5aa727Marek Olšák         if (dpy->Version < 15) {
297706466f4619b76f2475120f187c34d01ab5aa727Marek Olšák            err = EGL_BAD_ATTRIBUTE;
298706466f4619b76f2475120f187c34d01ab5aa727Marek Olšák            break;
299706466f4619b76f2475120f187c34d01ab5aa727Marek Olšák         }
300706466f4619b76f2475120f187c34d01ab5aa727Marek Olšák
301706466f4619b76f2475120f187c34d01ab5aa727Marek Olšák         if (val == EGL_TRUE)
302706466f4619b76f2475120f187c34d01ab5aa727Marek Olšák            ctx->Flags |= EGL_CONTEXT_OPENGL_DEBUG_BIT_KHR;
303706466f4619b76f2475120f187c34d01ab5aa727Marek Olšák         break;
304706466f4619b76f2475120f187c34d01ab5aa727Marek Olšák
305706466f4619b76f2475120f187c34d01ab5aa727Marek Olšák      case EGL_CONTEXT_OPENGL_FORWARD_COMPATIBLE:
306706466f4619b76f2475120f187c34d01ab5aa727Marek Olšák         if (dpy->Version < 15) {
307706466f4619b76f2475120f187c34d01ab5aa727Marek Olšák            err = EGL_BAD_ATTRIBUTE;
308706466f4619b76f2475120f187c34d01ab5aa727Marek Olšák            break;
309706466f4619b76f2475120f187c34d01ab5aa727Marek Olšák         }
310706466f4619b76f2475120f187c34d01ab5aa727Marek Olšák
311706466f4619b76f2475120f187c34d01ab5aa727Marek Olšák         if (val == EGL_TRUE)
312706466f4619b76f2475120f187c34d01ab5aa727Marek Olšák            ctx->Flags |= EGL_CONTEXT_OPENGL_FORWARD_COMPATIBLE_BIT_KHR;
313706466f4619b76f2475120f187c34d01ab5aa727Marek Olšák         break;
314706466f4619b76f2475120f187c34d01ab5aa727Marek Olšák
315caa5c8dfe8e5857aa25b2a3fa649d553e651e144Chia-I Wu      default:
316caa5c8dfe8e5857aa25b2a3fa649d553e651e144Chia-I Wu         err = EGL_BAD_ATTRIBUTE;
317caa5c8dfe8e5857aa25b2a3fa649d553e651e144Chia-I Wu         break;
318caa5c8dfe8e5857aa25b2a3fa649d553e651e144Chia-I Wu      }
319caa5c8dfe8e5857aa25b2a3fa649d553e651e144Chia-I Wu
320caa5c8dfe8e5857aa25b2a3fa649d553e651e144Chia-I Wu      if (err != EGL_SUCCESS) {
321caa5c8dfe8e5857aa25b2a3fa649d553e651e144Chia-I Wu         _eglLog(_EGL_DEBUG, "bad context attribute 0x%04x", attr);
322caa5c8dfe8e5857aa25b2a3fa649d553e651e144Chia-I Wu         break;
323caa5c8dfe8e5857aa25b2a3fa649d553e651e144Chia-I Wu      }
324caa5c8dfe8e5857aa25b2a3fa649d553e651e144Chia-I Wu   }
325caa5c8dfe8e5857aa25b2a3fa649d553e651e144Chia-I Wu
32663beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick   if (api == EGL_OPENGL_API) {
32763beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick      /* The EGL_KHR_create_context spec says:
32863beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick       *
32963beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick       *     "If the requested OpenGL version is less than 3.2,
33063beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick       *     EGL_CONTEXT_OPENGL_PROFILE_MASK_KHR is ignored and the
33163beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick       *     functionality of the context is determined solely by the
33263beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick       *     requested version."
33363beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick       *
33463beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick       * Since the value is ignored, only validate the setting if the version
33563beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick       * is >= 3.2.
33663beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick       */
33763beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick      if (ctx->ClientMajorVersion >= 4
33863beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick          || (ctx->ClientMajorVersion == 3 && ctx->ClientMinorVersion >= 2)) {
33963beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick         switch (ctx->Profile) {
34063beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick         case EGL_CONTEXT_OPENGL_CORE_PROFILE_BIT_KHR:
34163beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick         case EGL_CONTEXT_OPENGL_COMPATIBILITY_PROFILE_BIT_KHR:
34263beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick            break;
34363beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick
34463beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick         default:
34563beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick            /* The EGL_KHR_create_context spec says:
34663beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick             *
34763beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick             *     "* If an OpenGL context is requested, the requested version
34863beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick             *        is greater than 3.2, and the value for attribute
349587d5db11d8047663201c5fb06a6b2feb5d55891Matt Turner             *        EGL_CONTEXT_OPENGL_PROFILE_MASK_KHR has no bits set; has
350587d5db11d8047663201c5fb06a6b2feb5d55891Matt Turner             *        any bits set other than EGL_CONTEXT_OPENGL_CORE_PROFILE_BIT_KHR
351587d5db11d8047663201c5fb06a6b2feb5d55891Matt Turner             *        and EGL_CONTEXT_OPENGL_COMPATIBILITY_PROFILE_BIT_KHR; has
352587d5db11d8047663201c5fb06a6b2feb5d55891Matt Turner             *        more than one of these bits set; or if the implementation does
353587d5db11d8047663201c5fb06a6b2feb5d55891Matt Turner             *        not support the requested profile, then an EGL_BAD_MATCH error
354587d5db11d8047663201c5fb06a6b2feb5d55891Matt Turner             *        is generated."
35563beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick             */
356587d5db11d8047663201c5fb06a6b2feb5d55891Matt Turner            err = EGL_BAD_MATCH;
35763beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick            break;
35863beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick         }
35963beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick      }
36063beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick
36163beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick      /* The EGL_KHR_create_context spec says:
36263beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick       *
36363beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick       *     "* If an OpenGL context is requested and the values for
36463beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick       *        attributes EGL_CONTEXT_MAJOR_VERSION_KHR and
36563beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick       *        EGL_CONTEXT_MINOR_VERSION_KHR, when considered together with
36663beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick       *        the value for attribute
36763beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick       *        EGL_CONTEXT_FORWARD_COMPATIBLE_BIT_KHR, specify an OpenGL
36863beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick       *        version and feature set that are not defined, than an
36963beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick       *        EGL_BAD_MATCH error is generated.
37063beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick       *
37163beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick       *        ... Thus, examples of invalid combinations of attributes
37263beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick       *        include:
37363beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick       *
37463beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick       *          - Major version < 1 or > 4
37563beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick       *          - Major version == 1 and minor version < 0 or > 5
37663beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick       *          - Major version == 2 and minor version < 0 or > 1
37763beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick       *          - Major version == 3 and minor version < 0 or > 2
37863beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick       *          - Major version == 4 and minor version < 0 or > 2
37963beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick       *          - Forward-compatible flag set and major version < 3"
38063beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick       */
38163beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick      if (ctx->ClientMajorVersion < 1 || ctx->ClientMinorVersion < 0)
38263beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick         err = EGL_BAD_MATCH;
38363beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick
38463beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick      switch (ctx->ClientMajorVersion) {
38563beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick      case 1:
38663beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick         if (ctx->ClientMinorVersion > 5
38763beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick             || (ctx->Flags & EGL_CONTEXT_OPENGL_FORWARD_COMPATIBLE_BIT_KHR) != 0)
38863beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick            err = EGL_BAD_MATCH;
38963beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick         break;
39063beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick
39163beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick      case 2:
39263beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick         if (ctx->ClientMinorVersion > 1
39363beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick             || (ctx->Flags & EGL_CONTEXT_OPENGL_FORWARD_COMPATIBLE_BIT_KHR) != 0)
39463beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick            err = EGL_BAD_MATCH;
39563beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick         break;
39663beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick
39763beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick      case 3:
39863beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick         /* Note: The text above is incorrect.  There *is* an OpenGL 3.3!
39963beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick          */
40063beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick         if (ctx->ClientMinorVersion > 3)
40163beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick            err = EGL_BAD_MATCH;
40263beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick         break;
40363beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick
40463beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick      case 4:
40563beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick      default:
40663beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick         /* Don't put additional version checks here.  We don't know that
40763beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick          * there won't be versions > 4.2.
40863beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick          */
40963beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick         break;
41063beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick      }
41163beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick   } else if (api == EGL_OPENGL_ES_API) {
41263beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick      /* The EGL_KHR_create_context spec says:
41363beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick       *
41463beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick       *     "* If an OpenGL ES context is requested and the values for
41563beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick       *        attributes EGL_CONTEXT_MAJOR_VERSION_KHR and
41663beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick       *        EGL_CONTEXT_MINOR_VERSION_KHR specify an OpenGL ES version that
41763beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick       *        is not defined, than an EGL_BAD_MATCH error is generated.
41863beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick       *
41963beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick       *        ... Examples of invalid combinations of attributes include:
42063beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick       *
42163beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick       *          - Major version < 1 or > 2
42263beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick       *          - Major version == 1 and minor version < 0 or > 1
42363beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick       *          - Major version == 2 and minor version != 0
42463beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick       */
42563beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick      if (ctx->ClientMajorVersion < 1 || ctx->ClientMinorVersion < 0)
42663beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick         err = EGL_BAD_MATCH;
42763beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick
42863beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick      switch (ctx->ClientMajorVersion) {
42963beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick      case 1:
43063beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick         if (ctx->ClientMinorVersion > 1)
43163beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick            err = EGL_BAD_MATCH;
43263beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick         break;
43363beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick
43463beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick      case 2:
435dbecb413008c19e1864de93d9a8a9123bfee46e7Ian Romanick         if (ctx->ClientMinorVersion > 0)
436dbecb413008c19e1864de93d9a8a9123bfee46e7Ian Romanick            err = EGL_BAD_MATCH;
437dbecb413008c19e1864de93d9a8a9123bfee46e7Ian Romanick         break;
438dbecb413008c19e1864de93d9a8a9123bfee46e7Ian Romanick
439dbecb413008c19e1864de93d9a8a9123bfee46e7Ian Romanick      case 3:
44063beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick         /* Don't put additional version checks here.  We don't know that
441dbecb413008c19e1864de93d9a8a9123bfee46e7Ian Romanick          * there won't be versions > 3.0.
44263beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick          */
44363beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick         break;
444d308f57fe796a39d7d3f547aad62540cfd520675Anuj Phogat
445d308f57fe796a39d7d3f547aad62540cfd520675Anuj Phogat      default:
446d308f57fe796a39d7d3f547aad62540cfd520675Anuj Phogat         err = EGL_BAD_MATCH;
447d308f57fe796a39d7d3f547aad62540cfd520675Anuj Phogat         break;
44863beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick      }
44963beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick   }
45063beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick
45163beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick   switch (ctx->ResetNotificationStrategy) {
45263beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick   case EGL_NO_RESET_NOTIFICATION_KHR:
45363beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick   case EGL_LOSE_CONTEXT_ON_RESET_KHR:
45463beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick      break;
45563beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick
45663beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick   default:
45763beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick      err = EGL_BAD_ATTRIBUTE;
45863beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick      break;
45963beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick   }
46063beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick
461971750e1cd76dabe22bf2ca83f07266837e3a2a6Matt Turner   if ((ctx->Flags & ~(EGL_CONTEXT_OPENGL_DEBUG_BIT_KHR
46263beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick                      | EGL_CONTEXT_OPENGL_FORWARD_COMPATIBLE_BIT_KHR
46363beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick                      | EGL_CONTEXT_OPENGL_ROBUST_ACCESS_BIT_KHR)) != 0) {
46463beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick      err = EGL_BAD_ATTRIBUTE;
46563beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick   }
46663beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick
467caa5c8dfe8e5857aa25b2a3fa649d553e651e144Chia-I Wu   return err;
468caa5c8dfe8e5857aa25b2a3fa649d553e651e144Chia-I Wu}
469adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
470adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
471adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul/**
4725e7dba541298a29f175f9d077bf6f63030465d94Brian Paul * Initialize the given _EGLContext object to defaults and/or the values
4735e7dba541298a29f175f9d077bf6f63030465d94Brian Paul * in the attrib_list.
474a279760536be03702a3eb133c51079907a2ccc9cAdam Jackson *
475a279760536be03702a3eb133c51079907a2ccc9cAdam Jackson * According to EGL 1.5 Section 3.7:
476a279760536be03702a3eb133c51079907a2ccc9cAdam Jackson *
477dbda375d6fe29a1a0822fe5123c55c33ecfa7894Adam Jackson *	"EGL_OPENGL_API and EGL_OPENGL_ES_API are interchangeable for all
478dbda375d6fe29a1a0822fe5123c55c33ecfa7894Adam Jackson *	purposes except eglCreateContext."
479a279760536be03702a3eb133c51079907a2ccc9cAdam Jackson *
480a279760536be03702a3eb133c51079907a2ccc9cAdam Jackson * And since we only support GL and GLES, this is the only place where the
481a279760536be03702a3eb133c51079907a2ccc9cAdam Jackson * bound API matters at all. We look up the current API from the current
482a279760536be03702a3eb133c51079907a2ccc9cAdam Jackson * thread, and stash that in the context we're initializing. Our caller is
483a279760536be03702a3eb133c51079907a2ccc9cAdam Jackson * responsible for determining whether that's an API it supports.
484adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul */
485d548bf41d3a0fe443494f94f745d1fe49e5e432cBrian PaulEGLBoolean
486d69242be55091e53b0ae2cfa6282790ce1862f29Chia-I Wu_eglInitContext(_EGLContext *ctx, _EGLDisplay *dpy, _EGLConfig *conf,
487d69242be55091e53b0ae2cfa6282790ce1862f29Chia-I Wu                const EGLint *attrib_list)
488adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
489d5078b94323241a6482f54797756116b1c864327Brian Paul   const EGLenum api = eglQueryAPI();
490caa5c8dfe8e5857aa25b2a3fa649d553e651e144Chia-I Wu   EGLint err;
491d5078b94323241a6482f54797756116b1c864327Brian Paul
492d5078b94323241a6482f54797756116b1c864327Brian Paul   if (api == EGL_NONE) {
493d5078b94323241a6482f54797756116b1c864327Brian Paul      _eglError(EGL_BAD_MATCH, "eglCreateContext(no client API)");
494d5078b94323241a6482f54797756116b1c864327Brian Paul      return EGL_FALSE;
495d5078b94323241a6482f54797756116b1c864327Brian Paul   }
496d548bf41d3a0fe443494f94f745d1fe49e5e432cBrian Paul
497dc97e54d97ab9a3816a03a656c1ed530a046da0dChia-I Wu   _eglInitResource(&ctx->Resource, sizeof(*ctx), dpy);
498caa5c8dfe8e5857aa25b2a3fa649d553e651e144Chia-I Wu   ctx->ClientAPI = api;
499caa5c8dfe8e5857aa25b2a3fa649d553e651e144Chia-I Wu   ctx->Config = conf;
500caa5c8dfe8e5857aa25b2a3fa649d553e651e144Chia-I Wu   ctx->WindowRenderBuffer = EGL_NONE;
50163beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick   ctx->Profile = EGL_CONTEXT_OPENGL_CORE_PROFILE_BIT_KHR;
5029f6a4e2a65ff872bc27e7081df7d6205393a1180Brian Paul
5033fd79dd9886f05f45f3dc94c028a38dd75b8ee1bIan Romanick   ctx->ClientMajorVersion = 1; /* the default, per EGL spec */
5043fd79dd9886f05f45f3dc94c028a38dd75b8ee1bIan Romanick   ctx->ClientMinorVersion = 0;
50563beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick   ctx->Flags = 0;
50663beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick   ctx->Profile = EGL_CONTEXT_OPENGL_CORE_PROFILE_BIT_KHR;
50763beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick   ctx->ResetNotificationStrategy = EGL_NO_RESET_NOTIFICATION_KHR;
508a8533d54930f8fa989036c197ad20b0778ec0cacBrian Paul
50963beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick   err = _eglParseContextAttribList(ctx, dpy, attrib_list);
5105eb33596a0db26586957365ab27fc6afdebfe057Chia-I Wu   if (err == EGL_SUCCESS && ctx->Config) {
5113fa21881b18044292e7d9455e9a370a71249df22Chia-I Wu      EGLint api_bit;
5125eb33596a0db26586957365ab27fc6afdebfe057Chia-I Wu
5135eb33596a0db26586957365ab27fc6afdebfe057Chia-I Wu      api_bit = _eglGetContextAPIBit(ctx);
5143fa21881b18044292e7d9455e9a370a71249df22Chia-I Wu      if (!(ctx->Config->RenderableType & api_bit)) {
5155eb33596a0db26586957365ab27fc6afdebfe057Chia-I Wu         _eglLog(_EGL_DEBUG, "context api is 0x%x while config supports 0x%x",
5163fa21881b18044292e7d9455e9a370a71249df22Chia-I Wu               api_bit, ctx->Config->RenderableType);
5175eb33596a0db26586957365ab27fc6afdebfe057Chia-I Wu         err = EGL_BAD_CONFIG;
5185eb33596a0db26586957365ab27fc6afdebfe057Chia-I Wu      }
5195eb33596a0db26586957365ab27fc6afdebfe057Chia-I Wu   }
520caa5c8dfe8e5857aa25b2a3fa649d553e651e144Chia-I Wu   if (err != EGL_SUCCESS)
521caa5c8dfe8e5857aa25b2a3fa649d553e651e144Chia-I Wu      return _eglError(err, "eglCreateContext");
522d548bf41d3a0fe443494f94f745d1fe49e5e432cBrian Paul
523d548bf41d3a0fe443494f94f745d1fe49e5e432cBrian Paul   return EGL_TRUE;
524adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
525adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
526adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
527d845f2754bb8c0677323a5922cb90f9ea42bdb1fChia-I Wustatic EGLint
528d845f2754bb8c0677323a5922cb90f9ea42bdb1fChia-I Wu_eglQueryContextRenderBuffer(_EGLContext *ctx)
529d845f2754bb8c0677323a5922cb90f9ea42bdb1fChia-I Wu{
530d845f2754bb8c0677323a5922cb90f9ea42bdb1fChia-I Wu   _EGLSurface *surf = ctx->DrawSurface;
531d845f2754bb8c0677323a5922cb90f9ea42bdb1fChia-I Wu   EGLint rb;
532d845f2754bb8c0677323a5922cb90f9ea42bdb1fChia-I Wu
533d845f2754bb8c0677323a5922cb90f9ea42bdb1fChia-I Wu   if (!surf)
534d845f2754bb8c0677323a5922cb90f9ea42bdb1fChia-I Wu      return EGL_NONE;
535d845f2754bb8c0677323a5922cb90f9ea42bdb1fChia-I Wu   if (surf->Type == EGL_WINDOW_BIT && ctx->WindowRenderBuffer != EGL_NONE)
536d845f2754bb8c0677323a5922cb90f9ea42bdb1fChia-I Wu      rb = ctx->WindowRenderBuffer;
537d845f2754bb8c0677323a5922cb90f9ea42bdb1fChia-I Wu   else
538d845f2754bb8c0677323a5922cb90f9ea42bdb1fChia-I Wu      rb = surf->RenderBuffer;
539d845f2754bb8c0677323a5922cb90f9ea42bdb1fChia-I Wu   return rb;
540d845f2754bb8c0677323a5922cb90f9ea42bdb1fChia-I Wu}
541d845f2754bb8c0677323a5922cb90f9ea42bdb1fChia-I Wu
542d845f2754bb8c0677323a5922cb90f9ea42bdb1fChia-I Wu
543adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PaulEGLBoolean
5442f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu_eglQueryContext(_EGLDriver *drv, _EGLDisplay *dpy, _EGLContext *c,
545d548bf41d3a0fe443494f94f745d1fe49e5e432cBrian Paul                 EGLint attribute, EGLint *value)
546adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
547adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul   (void) drv;
548adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul   (void) dpy;
549adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
550d845f2754bb8c0677323a5922cb90f9ea42bdb1fChia-I Wu   if (!value)
551d845f2754bb8c0677323a5922cb90f9ea42bdb1fChia-I Wu      return _eglError(EGL_BAD_PARAMETER, "eglQueryContext");
552d845f2754bb8c0677323a5922cb90f9ea42bdb1fChia-I Wu
553adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul   switch (attribute) {
554adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul   case EGL_CONFIG_ID:
555cc45a5c30872e2070aae6a79dbe0e2bcf7404917Adam Jackson      /*
556cc45a5c30872e2070aae6a79dbe0e2bcf7404917Adam Jackson       * From EGL_KHR_no_config_context:
557cc45a5c30872e2070aae6a79dbe0e2bcf7404917Adam Jackson       *
558cc45a5c30872e2070aae6a79dbe0e2bcf7404917Adam Jackson       *    "Querying EGL_CONFIG_ID returns the ID of the EGLConfig with
559cc45a5c30872e2070aae6a79dbe0e2bcf7404917Adam Jackson       *     respect to which the context was created, or zero if created
560cc45a5c30872e2070aae6a79dbe0e2bcf7404917Adam Jackson       *     without respect to an EGLConfig."
561cc45a5c30872e2070aae6a79dbe0e2bcf7404917Adam Jackson       */
562cc45a5c30872e2070aae6a79dbe0e2bcf7404917Adam Jackson      *value = c->Config ? c->Config->ConfigID : 0;
563d845f2754bb8c0677323a5922cb90f9ea42bdb1fChia-I Wu      break;
564d845f2754bb8c0677323a5922cb90f9ea42bdb1fChia-I Wu   case EGL_CONTEXT_CLIENT_VERSION:
5653fd79dd9886f05f45f3dc94c028a38dd75b8ee1bIan Romanick      *value = c->ClientMajorVersion;
566d845f2754bb8c0677323a5922cb90f9ea42bdb1fChia-I Wu      break;
567b2006a40eb22899d38cd31691640555228e36975Brian Paul   case EGL_CONTEXT_CLIENT_TYPE:
568b2006a40eb22899d38cd31691640555228e36975Brian Paul      *value = c->ClientAPI;
569d845f2754bb8c0677323a5922cb90f9ea42bdb1fChia-I Wu      break;
570d845f2754bb8c0677323a5922cb90f9ea42bdb1fChia-I Wu   case EGL_RENDER_BUFFER:
571d845f2754bb8c0677323a5922cb90f9ea42bdb1fChia-I Wu      *value = _eglQueryContextRenderBuffer(c);
572d845f2754bb8c0677323a5922cb90f9ea42bdb1fChia-I Wu      break;
573adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul   default:
574d845f2754bb8c0677323a5922cb90f9ea42bdb1fChia-I Wu      return _eglError(EGL_BAD_ATTRIBUTE, "eglQueryContext");
575adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul   }
576d845f2754bb8c0677323a5922cb90f9ea42bdb1fChia-I Wu
577d845f2754bb8c0677323a5922cb90f9ea42bdb1fChia-I Wu   return EGL_TRUE;
578adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
579adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
580adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
581adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul/**
5827c09296d4ce977f711f36c3393fd1a2718a6a6ceChia-I Wu * Bind the context to the thread and return the previous context.
5837c09296d4ce977f711f36c3393fd1a2718a6a6ceChia-I Wu *
5847c09296d4ce977f711f36c3393fd1a2718a6a6ceChia-I Wu * Note that the context may be NULL.
5857c09296d4ce977f711f36c3393fd1a2718a6a6ceChia-I Wu */
5867c09296d4ce977f711f36c3393fd1a2718a6a6ceChia-I Wustatic _EGLContext *
5877c09296d4ce977f711f36c3393fd1a2718a6a6ceChia-I Wu_eglBindContextToThread(_EGLContext *ctx, _EGLThreadInfo *t)
588adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
5897c09296d4ce977f711f36c3393fd1a2718a6a6ceChia-I Wu   _EGLContext *oldCtx;
5907c09296d4ce977f711f36c3393fd1a2718a6a6ceChia-I Wu
5916e066f76ee22909b0653ff8b89429de819e60f14Kyle Brenneman   oldCtx = t->CurrentContext;
592551bfe7a09b0d1bc277796edc10c649b2b07a5b7Chia-I Wu   if (ctx != oldCtx) {
593551bfe7a09b0d1bc277796edc10c649b2b07a5b7Chia-I Wu      if (oldCtx)
594551bfe7a09b0d1bc277796edc10c649b2b07a5b7Chia-I Wu         oldCtx->Binding = NULL;
595551bfe7a09b0d1bc277796edc10c649b2b07a5b7Chia-I Wu      if (ctx)
596551bfe7a09b0d1bc277796edc10c649b2b07a5b7Chia-I Wu         ctx->Binding = t;
5977c09296d4ce977f711f36c3393fd1a2718a6a6ceChia-I Wu
5986e066f76ee22909b0653ff8b89429de819e60f14Kyle Brenneman      t->CurrentContext = ctx;
599551bfe7a09b0d1bc277796edc10c649b2b07a5b7Chia-I Wu   }
6007c09296d4ce977f711f36c3393fd1a2718a6a6ceChia-I Wu
6017c09296d4ce977f711f36c3393fd1a2718a6a6ceChia-I Wu   return oldCtx;
6027c09296d4ce977f711f36c3393fd1a2718a6a6ceChia-I Wu}
6037c09296d4ce977f711f36c3393fd1a2718a6a6ceChia-I Wu
6047c09296d4ce977f711f36c3393fd1a2718a6a6ceChia-I Wu
6057c09296d4ce977f711f36c3393fd1a2718a6a6ceChia-I Wu/**
6067c09296d4ce977f711f36c3393fd1a2718a6a6ceChia-I Wu * Return true if the given context and surfaces can be made current.
6077c09296d4ce977f711f36c3393fd1a2718a6a6ceChia-I Wu */
6087c09296d4ce977f711f36c3393fd1a2718a6a6ceChia-I Wustatic EGLBoolean
6097c09296d4ce977f711f36c3393fd1a2718a6a6ceChia-I Wu_eglCheckMakeCurrent(_EGLContext *ctx, _EGLSurface *draw, _EGLSurface *read)
6107c09296d4ce977f711f36c3393fd1a2718a6a6ceChia-I Wu{
6117c09296d4ce977f711f36c3393fd1a2718a6a6ceChia-I Wu   _EGLThreadInfo *t = _eglGetCurrentThread();
6122c343af09873f35cbc7b265d5606a228fe304bb9Kristian Høgsberg   _EGLDisplay *dpy;
613adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
61475da80b29556e6dbbba21e5297ca440e475f65cbChia-I Wu   if (_eglIsCurrentThreadDummy())
61575da80b29556e6dbbba21e5297ca440e475f65cbChia-I Wu      return _eglError(EGL_BAD_ALLOC, "eglMakeCurrent");
61675da80b29556e6dbbba21e5297ca440e475f65cbChia-I Wu
6177c09296d4ce977f711f36c3393fd1a2718a6a6ceChia-I Wu   /* this is easy */
6187c09296d4ce977f711f36c3393fd1a2718a6a6ceChia-I Wu   if (!ctx) {
6197c09296d4ce977f711f36c3393fd1a2718a6a6ceChia-I Wu      if (draw || read)
6208cdc6c66f9d8ede00d02108070d269d3aca8b130Chia-I Wu         return _eglError(EGL_BAD_MATCH, "eglMakeCurrent");
6217c09296d4ce977f711f36c3393fd1a2718a6a6ceChia-I Wu      return EGL_TRUE;
6227c09296d4ce977f711f36c3393fd1a2718a6a6ceChia-I Wu   }
6237c09296d4ce977f711f36c3393fd1a2718a6a6ceChia-I Wu
6242c343af09873f35cbc7b265d5606a228fe304bb9Kristian Høgsberg   dpy = ctx->Resource.Display;
625b50703aea55450e04bcd8154335774786e0f253bIan Romanick   if (!dpy->Extensions.KHR_surfaceless_context
626b50703aea55450e04bcd8154335774786e0f253bIan Romanick       && (draw == NULL || read == NULL))
6277c09296d4ce977f711f36c3393fd1a2718a6a6ceChia-I Wu      return _eglError(EGL_BAD_MATCH, "eglMakeCurrent");
6287c09296d4ce977f711f36c3393fd1a2718a6a6ceChia-I Wu
6297c09296d4ce977f711f36c3393fd1a2718a6a6ceChia-I Wu   /*
6307c09296d4ce977f711f36c3393fd1a2718a6a6ceChia-I Wu    * The spec says
6317c09296d4ce977f711f36c3393fd1a2718a6a6ceChia-I Wu    *
6327c09296d4ce977f711f36c3393fd1a2718a6a6ceChia-I Wu    * "If ctx is current to some other thread, or if either draw or read are
6337c09296d4ce977f711f36c3393fd1a2718a6a6ceChia-I Wu    * bound to contexts in another thread, an EGL_BAD_ACCESS error is
6347c09296d4ce977f711f36c3393fd1a2718a6a6ceChia-I Wu    * generated."
6357c09296d4ce977f711f36c3393fd1a2718a6a6ceChia-I Wu    *
6360d43cbed2f130c377bed92c7a8ad8c19f441d6a5Chia-I Wu    * and
6377c09296d4ce977f711f36c3393fd1a2718a6a6ceChia-I Wu    *
6387c09296d4ce977f711f36c3393fd1a2718a6a6ceChia-I Wu    * "at most one context may be bound to a particular surface at a given
6397c09296d4ce977f711f36c3393fd1a2718a6a6ceChia-I Wu    * time"
6407c09296d4ce977f711f36c3393fd1a2718a6a6ceChia-I Wu    */
6410d43cbed2f130c377bed92c7a8ad8c19f441d6a5Chia-I Wu   if (ctx->Binding && ctx->Binding != t)
6427c09296d4ce977f711f36c3393fd1a2718a6a6ceChia-I Wu      return _eglError(EGL_BAD_ACCESS, "eglMakeCurrent");
6430d43cbed2f130c377bed92c7a8ad8c19f441d6a5Chia-I Wu   if (draw && draw->CurrentContext && draw->CurrentContext != ctx) {
6446e066f76ee22909b0653ff8b89429de819e60f14Kyle Brenneman      if (draw->CurrentContext->Binding != t)
6450d43cbed2f130c377bed92c7a8ad8c19f441d6a5Chia-I Wu         return _eglError(EGL_BAD_ACCESS, "eglMakeCurrent");
6460d43cbed2f130c377bed92c7a8ad8c19f441d6a5Chia-I Wu   }
6470d43cbed2f130c377bed92c7a8ad8c19f441d6a5Chia-I Wu   if (read && read->CurrentContext && read->CurrentContext != ctx) {
6486e066f76ee22909b0653ff8b89429de819e60f14Kyle Brenneman      if (read->CurrentContext->Binding != t)
6490d43cbed2f130c377bed92c7a8ad8c19f441d6a5Chia-I Wu         return _eglError(EGL_BAD_ACCESS, "eglMakeCurrent");
6500d43cbed2f130c377bed92c7a8ad8c19f441d6a5Chia-I Wu   }
6517c09296d4ce977f711f36c3393fd1a2718a6a6ceChia-I Wu
652551d459af421a2eb937e9e16301bb64da4624f89Neil Roberts   /* If the context has a config then it must match that of the two
653551d459af421a2eb937e9e16301bb64da4624f89Neil Roberts    * surfaces */
654551d459af421a2eb937e9e16301bb64da4624f89Neil Roberts   if (ctx->Config) {
655551d459af421a2eb937e9e16301bb64da4624f89Neil Roberts      if ((draw && draw->Config != ctx->Config) ||
656551d459af421a2eb937e9e16301bb64da4624f89Neil Roberts          (read && read->Config != ctx->Config))
657551d459af421a2eb937e9e16301bb64da4624f89Neil Roberts         return _eglError(EGL_BAD_MATCH, "eglMakeCurrent");
658551d459af421a2eb937e9e16301bb64da4624f89Neil Roberts   } else {
659d9f5b1915b397d4baaf4c9c23a93fda49f3db4caAdam Jackson      /* Otherwise we must be using the EGL_KHR_no_config_context
660551d459af421a2eb937e9e16301bb64da4624f89Neil Roberts       * extension */
661d9f5b1915b397d4baaf4c9c23a93fda49f3db4caAdam Jackson      assert(dpy->Extensions.KHR_no_config_context);
662551d459af421a2eb937e9e16301bb64da4624f89Neil Roberts
663551d459af421a2eb937e9e16301bb64da4624f89Neil Roberts      /* The extension doesn't permit binding draw and read buffers with
664551d459af421a2eb937e9e16301bb64da4624f89Neil Roberts       * differing contexts */
665551d459af421a2eb937e9e16301bb64da4624f89Neil Roberts      if (draw && read && draw->Config != read->Config)
666551d459af421a2eb937e9e16301bb64da4624f89Neil Roberts         return _eglError(EGL_BAD_MATCH, "eglMakeCurrent");
667551d459af421a2eb937e9e16301bb64da4624f89Neil Roberts   }
66821b635ffa8b59049a95d50d4c7b7a8ff6413b730Chia-I Wu
6697c09296d4ce977f711f36c3393fd1a2718a6a6ceChia-I Wu   return EGL_TRUE;
6707c09296d4ce977f711f36c3393fd1a2718a6a6ceChia-I Wu}
6717c09296d4ce977f711f36c3393fd1a2718a6a6ceChia-I Wu
6727c09296d4ce977f711f36c3393fd1a2718a6a6ceChia-I Wu
6737c09296d4ce977f711f36c3393fd1a2718a6a6ceChia-I Wu/**
674959481ad70b033a254f4d7d0a94dfdfab6b94c15Chia-I Wu * Bind the context to the current thread and given surfaces.  Return the
675d19afc57fe49816f3f3290410e0124d326577be2Chia-I Wu * previous bound context and surfaces.  The caller should unreference the
676d19afc57fe49816f3f3290410e0124d326577be2Chia-I Wu * returned context and surfaces.
677d19afc57fe49816f3f3290410e0124d326577be2Chia-I Wu *
678d19afc57fe49816f3f3290410e0124d326577be2Chia-I Wu * Making a second call with the resources returned by the first call
679d19afc57fe49816f3f3290410e0124d326577be2Chia-I Wu * unsurprisingly undoes the first call, except for the resouce reference
680d19afc57fe49816f3f3290410e0124d326577be2Chia-I Wu * counts.
681959481ad70b033a254f4d7d0a94dfdfab6b94c15Chia-I Wu */
682959481ad70b033a254f4d7d0a94dfdfab6b94c15Chia-I WuEGLBoolean
683d19afc57fe49816f3f3290410e0124d326577be2Chia-I Wu_eglBindContext(_EGLContext *ctx, _EGLSurface *draw, _EGLSurface *read,
684d19afc57fe49816f3f3290410e0124d326577be2Chia-I Wu                _EGLContext **old_ctx,
685d19afc57fe49816f3f3290410e0124d326577be2Chia-I Wu                _EGLSurface **old_draw, _EGLSurface **old_read)
686959481ad70b033a254f4d7d0a94dfdfab6b94c15Chia-I Wu{
687959481ad70b033a254f4d7d0a94dfdfab6b94c15Chia-I Wu   _EGLThreadInfo *t = _eglGetCurrentThread();
688d19afc57fe49816f3f3290410e0124d326577be2Chia-I Wu   _EGLContext *prev_ctx;
689d19afc57fe49816f3f3290410e0124d326577be2Chia-I Wu   _EGLSurface *prev_draw, *prev_read;
690959481ad70b033a254f4d7d0a94dfdfab6b94c15Chia-I Wu
691d19afc57fe49816f3f3290410e0124d326577be2Chia-I Wu   if (!_eglCheckMakeCurrent(ctx, draw, read))
692959481ad70b033a254f4d7d0a94dfdfab6b94c15Chia-I Wu      return EGL_FALSE;
693959481ad70b033a254f4d7d0a94dfdfab6b94c15Chia-I Wu
694d19afc57fe49816f3f3290410e0124d326577be2Chia-I Wu   /* increment refcounts before binding */
695d19afc57fe49816f3f3290410e0124d326577be2Chia-I Wu   _eglGetContext(ctx);
696d19afc57fe49816f3f3290410e0124d326577be2Chia-I Wu   _eglGetSurface(draw);
697d19afc57fe49816f3f3290410e0124d326577be2Chia-I Wu   _eglGetSurface(read);
698d19afc57fe49816f3f3290410e0124d326577be2Chia-I Wu
699959481ad70b033a254f4d7d0a94dfdfab6b94c15Chia-I Wu   /* bind the new context */
700d19afc57fe49816f3f3290410e0124d326577be2Chia-I Wu   prev_ctx = _eglBindContextToThread(ctx, t);
701bbe459b14d593bd2d7b6c0f010e165fe815e8396Chia-I Wu
702d19afc57fe49816f3f3290410e0124d326577be2Chia-I Wu   /* break previous bindings */
703d19afc57fe49816f3f3290410e0124d326577be2Chia-I Wu   if (prev_ctx) {
704d19afc57fe49816f3f3290410e0124d326577be2Chia-I Wu      prev_draw = prev_ctx->DrawSurface;
705d19afc57fe49816f3f3290410e0124d326577be2Chia-I Wu      prev_read = prev_ctx->ReadSurface;
706848945e5d63ff8327f5a1a6e61e66fcdab3ac8fcChia-I Wu
707d19afc57fe49816f3f3290410e0124d326577be2Chia-I Wu      if (prev_draw)
708d19afc57fe49816f3f3290410e0124d326577be2Chia-I Wu         prev_draw->CurrentContext = NULL;
709d19afc57fe49816f3f3290410e0124d326577be2Chia-I Wu      if (prev_read)
710d19afc57fe49816f3f3290410e0124d326577be2Chia-I Wu         prev_read->CurrentContext = NULL;
711ea9e5dbbc2e992ead954d3d2ebf3689f7a003f79Chia-I Wu
712d19afc57fe49816f3f3290410e0124d326577be2Chia-I Wu      prev_ctx->DrawSurface = NULL;
713d19afc57fe49816f3f3290410e0124d326577be2Chia-I Wu      prev_ctx->ReadSurface = NULL;
714d19afc57fe49816f3f3290410e0124d326577be2Chia-I Wu   }
715d19afc57fe49816f3f3290410e0124d326577be2Chia-I Wu   else {
716d19afc57fe49816f3f3290410e0124d326577be2Chia-I Wu      prev_draw = prev_read = NULL;
717ea9e5dbbc2e992ead954d3d2ebf3689f7a003f79Chia-I Wu   }
718ea9e5dbbc2e992ead954d3d2ebf3689f7a003f79Chia-I Wu
719ea9e5dbbc2e992ead954d3d2ebf3689f7a003f79Chia-I Wu   /* establish new bindings */
720d19afc57fe49816f3f3290410e0124d326577be2Chia-I Wu   if (ctx) {
721d19afc57fe49816f3f3290410e0124d326577be2Chia-I Wu      if (draw)
722d19afc57fe49816f3f3290410e0124d326577be2Chia-I Wu         draw->CurrentContext = ctx;
723d19afc57fe49816f3f3290410e0124d326577be2Chia-I Wu      if (read)
724d19afc57fe49816f3f3290410e0124d326577be2Chia-I Wu         read->CurrentContext = ctx;
725d19afc57fe49816f3f3290410e0124d326577be2Chia-I Wu
726d19afc57fe49816f3f3290410e0124d326577be2Chia-I Wu      ctx->DrawSurface = draw;
727d19afc57fe49816f3f3290410e0124d326577be2Chia-I Wu      ctx->ReadSurface = read;
728959481ad70b033a254f4d7d0a94dfdfab6b94c15Chia-I Wu   }
729959481ad70b033a254f4d7d0a94dfdfab6b94c15Chia-I Wu
730d19afc57fe49816f3f3290410e0124d326577be2Chia-I Wu   assert(old_ctx && old_draw && old_read);
731d19afc57fe49816f3f3290410e0124d326577be2Chia-I Wu   *old_ctx = prev_ctx;
732d19afc57fe49816f3f3290410e0124d326577be2Chia-I Wu   *old_draw = prev_draw;
733d19afc57fe49816f3f3290410e0124d326577be2Chia-I Wu   *old_read = prev_read;
734bbe459b14d593bd2d7b6c0f010e165fe815e8396Chia-I Wu
735959481ad70b033a254f4d7d0a94dfdfab6b94c15Chia-I Wu   return EGL_TRUE;
736959481ad70b033a254f4d7d0a94dfdfab6b94c15Chia-I Wu}
737