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