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