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