blob: 0ab6c7c7a5fb8c8012c45e0f7904f71a781d1c96 [file] [log] [blame]
Chia-I Wuf2001df2011-07-02 17:57:30 +09001/**************************************************************************
2 *
José Fonseca87712852014-01-17 16:27:50 +00003 * Copyright 2008 VMware, Inc.
Chia-I Wuf2001df2011-07-02 17:57:30 +09004 * Copyright 2009-2010 Chia-I Wu <olvaffe@gmail.com>
5 * Copyright 2010 LunarG, Inc.
6 * All Rights Reserved.
7 *
8 * Permission is hereby granted, free of charge, to any person obtaining a
9 * copy of this software and associated documentation files (the
10 * "Software"), to deal in the Software without restriction, including
11 * without limitation the rights to use, copy, modify, merge, publish,
12 * distribute, sub license, and/or sell copies of the Software, and to
13 * permit persons to whom the Software is furnished to do so, subject to
14 * the following conditions:
15 *
16 * The above copyright notice and this permission notice (including the
17 * next paragraph) shall be included in all copies or substantial portions
18 * of the Software.
19 *
20 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
21 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
22 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
23 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
24 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
25 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
26 * DEALINGS IN THE SOFTWARE.
27 *
28 **************************************************************************/
29
30
Brian Pauladbff7e2005-04-22 21:09:39 +000031/**
32 * Surface-related functions.
Brian Pauladbff7e2005-04-22 21:09:39 +000033 */
34
35
36#include <assert.h>
37#include <stdlib.h>
38#include <string.h>
Eric Engestromd75fbff2018-05-16 14:17:30 +010039#include "egldefines.h"
Chia-I Wu18457cb2009-07-17 11:48:27 -060040#include "egldisplay.h"
Kristian Høgsberg0725f2d2012-12-13 15:59:24 -050041#include "egldriver.h"
Brian Pauladbff7e2005-04-22 21:09:39 +000042#include "eglcontext.h"
43#include "eglconfig.h"
Chia-I Wu94cb3212010-01-29 09:00:30 +080044#include "eglcurrent.h"
Brian Pauld548bf42005-11-27 23:57:19 +000045#include "egllog.h"
46#include "eglsurface.h"
Brian Pauladbff7e2005-04-22 21:09:39 +000047
Eric Engestromd75fbff2018-05-16 14:17:30 +010048#include "util/macros.h"
Brian Pauladbff7e2005-04-22 21:09:39 +000049
Brian Pauld548bf42005-11-27 23:57:19 +000050/**
Chia-I Wu6f152922010-01-31 12:13:59 +080051 * Parse the list of surface attributes and return the proper error code.
52 */
53static EGLint
54_eglParseSurfaceAttribList(_EGLSurface *surf, const EGLint *attrib_list)
55{
Eric Engestrom54fa5ec2019-02-02 11:38:45 +000056 _EGLDisplay *disp = surf->Resource.Display;
Chia-I Wu6f152922010-01-31 12:13:59 +080057 EGLint type = surf->Type;
Kristian Høgsberg5dc0f492010-05-06 22:40:25 -040058 EGLint texture_type = EGL_PBUFFER_BIT;
Chia-I Wu6f152922010-01-31 12:13:59 +080059 EGLint i, err = EGL_SUCCESS;
Guillaume Charifi9fea9d62016-06-20 15:27:33 +020060 EGLint attr = EGL_NONE;
61 EGLint val = EGL_NONE;
Chia-I Wu6f152922010-01-31 12:13:59 +080062
63 if (!attrib_list)
64 return EGL_SUCCESS;
65
Eric Engestrom54fa5ec2019-02-02 11:38:45 +000066 if (disp->Extensions.NOK_texture_from_pixmap)
Kristian Høgsberg5dc0f492010-05-06 22:40:25 -040067 texture_type |= EGL_PIXMAP_BIT;
68
Chia-I Wu6f152922010-01-31 12:13:59 +080069 for (i = 0; attrib_list[i] != EGL_NONE; i++) {
Guillaume Charifi9fea9d62016-06-20 15:27:33 +020070 attr = attrib_list[i++];
71 val = attrib_list[i];
Chia-I Wu6f152922010-01-31 12:13:59 +080072
73 switch (attr) {
Chia-I Wu6c7e0b92010-07-31 00:00:49 +080074 /* common attributes */
Marek Olšákc2c2e9a2015-06-10 02:49:29 +020075 case EGL_GL_COLORSPACE_KHR:
Eric Engestrom54fa5ec2019-02-02 11:38:45 +000076 if (!disp->Extensions.KHR_gl_colorspace) {
Marek Olšákc2c2e9a2015-06-10 02:49:29 +020077 err = EGL_BAD_ATTRIBUTE;
78 break;
79 }
80 switch (val) {
81 case EGL_GL_COLORSPACE_SRGB_KHR:
82 case EGL_GL_COLORSPACE_LINEAR_KHR:
83 break;
84 default:
85 err = EGL_BAD_ATTRIBUTE;
86 }
87 if (err != EGL_SUCCESS)
88 break;
89 surf->GLColorspace = val;
90 break;
Tapani Pälli799b3d12018-04-05 13:02:36 +030091 case EGL_SMPTE2086_DISPLAY_PRIMARY_RX_EXT:
Eric Engestrom54fa5ec2019-02-02 11:38:45 +000092 if (!disp->Extensions.EXT_surface_SMPTE2086_metadata) {
Tapani Pälli799b3d12018-04-05 13:02:36 +030093 err = EGL_BAD_ATTRIBUTE;
94 break;
95 }
96 surf->HdrMetadata.display_primary_r.x = val;
97 break;
98 case EGL_SMPTE2086_DISPLAY_PRIMARY_RY_EXT:
Eric Engestrom54fa5ec2019-02-02 11:38:45 +000099 if (!disp->Extensions.EXT_surface_SMPTE2086_metadata) {
Tapani Pälli799b3d12018-04-05 13:02:36 +0300100 err = EGL_BAD_ATTRIBUTE;
101 break;
102 }
103 surf->HdrMetadata.display_primary_r.y = val;
104 break;
105 case EGL_SMPTE2086_DISPLAY_PRIMARY_GX_EXT:
Eric Engestrom54fa5ec2019-02-02 11:38:45 +0000106 if (!disp->Extensions.EXT_surface_SMPTE2086_metadata) {
Tapani Pälli799b3d12018-04-05 13:02:36 +0300107 err = EGL_BAD_ATTRIBUTE;
108 break;
109 }
110 surf->HdrMetadata.display_primary_g.x = val;
111 break;
112 case EGL_SMPTE2086_DISPLAY_PRIMARY_GY_EXT:
Eric Engestrom54fa5ec2019-02-02 11:38:45 +0000113 if (!disp->Extensions.EXT_surface_SMPTE2086_metadata) {
Tapani Pälli799b3d12018-04-05 13:02:36 +0300114 err = EGL_BAD_ATTRIBUTE;
115 break;
116 }
117 surf->HdrMetadata.display_primary_g.y = val;
118 break;
119 case EGL_SMPTE2086_DISPLAY_PRIMARY_BX_EXT:
Eric Engestrom54fa5ec2019-02-02 11:38:45 +0000120 if (!disp->Extensions.EXT_surface_SMPTE2086_metadata) {
Tapani Pälli799b3d12018-04-05 13:02:36 +0300121 err = EGL_BAD_ATTRIBUTE;
122 break;
123 }
124 surf->HdrMetadata.display_primary_b.x = val;
125 break;
126 case EGL_SMPTE2086_DISPLAY_PRIMARY_BY_EXT:
Eric Engestrom54fa5ec2019-02-02 11:38:45 +0000127 if (!disp->Extensions.EXT_surface_SMPTE2086_metadata) {
Tapani Pälli799b3d12018-04-05 13:02:36 +0300128 err = EGL_BAD_ATTRIBUTE;
129 break;
130 }
131 surf->HdrMetadata.display_primary_b.y = val;
132 break;
133 case EGL_SMPTE2086_WHITE_POINT_X_EXT:
Eric Engestrom54fa5ec2019-02-02 11:38:45 +0000134 if (!disp->Extensions.EXT_surface_SMPTE2086_metadata) {
Tapani Pälli799b3d12018-04-05 13:02:36 +0300135 err = EGL_BAD_ATTRIBUTE;
136 break;
137 }
138 surf->HdrMetadata.white_point.x = val;
139 break;
140 case EGL_SMPTE2086_WHITE_POINT_Y_EXT:
Eric Engestrom54fa5ec2019-02-02 11:38:45 +0000141 if (!disp->Extensions.EXT_surface_SMPTE2086_metadata) {
Tapani Pälli799b3d12018-04-05 13:02:36 +0300142 err = EGL_BAD_ATTRIBUTE;
143 break;
144 }
145 surf->HdrMetadata.white_point.y = val;
146 break;
147 case EGL_SMPTE2086_MAX_LUMINANCE_EXT:
Eric Engestrom54fa5ec2019-02-02 11:38:45 +0000148 if (!disp->Extensions.EXT_surface_SMPTE2086_metadata) {
Tapani Pälli799b3d12018-04-05 13:02:36 +0300149 err = EGL_BAD_ATTRIBUTE;
150 break;
151 }
152 surf->HdrMetadata.max_luminance = val;
153 break;
154 case EGL_SMPTE2086_MIN_LUMINANCE_EXT:
Eric Engestrom54fa5ec2019-02-02 11:38:45 +0000155 if (!disp->Extensions.EXT_surface_SMPTE2086_metadata) {
Tapani Pälli799b3d12018-04-05 13:02:36 +0300156 err = EGL_BAD_ATTRIBUTE;
157 break;
158 }
159 surf->HdrMetadata.min_luminance = val;
160 break;
161 case EGL_CTA861_3_MAX_CONTENT_LIGHT_LEVEL_EXT:
Eric Engestrom54fa5ec2019-02-02 11:38:45 +0000162 if (!disp->Extensions.EXT_surface_CTA861_3_metadata) {
Tapani Pälli799b3d12018-04-05 13:02:36 +0300163 err = EGL_BAD_ATTRIBUTE;
164 break;
165 }
166 surf->HdrMetadata.max_cll = val;
167 break;
168 case EGL_CTA861_3_MAX_FRAME_AVERAGE_LEVEL_EXT:
Eric Engestrom54fa5ec2019-02-02 11:38:45 +0000169 if (!disp->Extensions.EXT_surface_CTA861_3_metadata) {
Tapani Pälli799b3d12018-04-05 13:02:36 +0300170 err = EGL_BAD_ATTRIBUTE;
171 break;
172 }
173 surf->HdrMetadata.max_fall = val;
174 break;
Chia-I Wu6f152922010-01-31 12:13:59 +0800175 case EGL_VG_COLORSPACE:
Chia-I Wu6f152922010-01-31 12:13:59 +0800176 switch (val) {
177 case EGL_VG_COLORSPACE_sRGB:
178 case EGL_VG_COLORSPACE_LINEAR:
179 break;
180 default:
181 err = EGL_BAD_ATTRIBUTE;
182 break;
183 }
184 if (err != EGL_SUCCESS)
185 break;
Chia-I Wueb961f82010-01-31 17:56:30 +0800186 surf->VGColorspace = val;
Chia-I Wu6f152922010-01-31 12:13:59 +0800187 break;
188 case EGL_VG_ALPHA_FORMAT:
Chia-I Wu6f152922010-01-31 12:13:59 +0800189 switch (val) {
190 case EGL_VG_ALPHA_FORMAT_NONPRE:
191 case EGL_VG_ALPHA_FORMAT_PRE:
192 break;
193 default:
194 err = EGL_BAD_ATTRIBUTE;
195 break;
196 }
197 if (err != EGL_SUCCESS)
198 break;
Chia-I Wueb961f82010-01-31 17:56:30 +0800199 surf->VGAlphaFormat = val;
Chia-I Wu6f152922010-01-31 12:13:59 +0800200 break;
201 /* window surface attributes */
202 case EGL_RENDER_BUFFER:
203 if (type != EGL_WINDOW_BIT) {
204 err = EGL_BAD_ATTRIBUTE;
205 break;
206 }
207 if (val != EGL_BACK_BUFFER && val != EGL_SINGLE_BUFFER) {
208 err = EGL_BAD_ATTRIBUTE;
209 break;
210 }
Chad Versacef48f9a72018-04-07 14:23:48 -0700211 surf->RequestedRenderBuffer = val;
Chad Versace3dc22382018-04-30 22:32:25 -0700212 if (surf->Config->SurfaceType & EGL_MUTABLE_RENDER_BUFFER_BIT_KHR) {
213 /* Unlike normal EGLSurfaces, one with a mutable render buffer
214 * uses the application-chosen render buffer.
215 */
216 surf->ActiveRenderBuffer = val;
217 }
Chia-I Wu6f152922010-01-31 12:13:59 +0800218 break;
Fredrik Höglund7d46b452011-12-14 21:24:09 +0100219 case EGL_POST_SUB_BUFFER_SUPPORTED_NV:
Eric Engestrom54fa5ec2019-02-02 11:38:45 +0000220 if (!disp->Extensions.NV_post_sub_buffer ||
Fredrik Höglund7d46b452011-12-14 21:24:09 +0100221 type != EGL_WINDOW_BIT) {
222 err = EGL_BAD_ATTRIBUTE;
223 break;
224 }
225 if (val != EGL_TRUE && val != EGL_FALSE) {
226 err = EGL_BAD_PARAMETER;
227 break;
228 }
229 surf->PostSubBufferSupportedNV = val;
230 break;
Chia-I Wu6f152922010-01-31 12:13:59 +0800231 /* pbuffer surface attributes */
232 case EGL_WIDTH:
Chia-I Wu6c7e0b92010-07-31 00:00:49 +0800233 if (type != EGL_PBUFFER_BIT) {
Chia-I Wu6f152922010-01-31 12:13:59 +0800234 err = EGL_BAD_ATTRIBUTE;
235 break;
236 }
237 if (val < 0) {
238 err = EGL_BAD_PARAMETER;
239 break;
240 }
241 surf->Width = val;
242 break;
243 case EGL_HEIGHT:
Chia-I Wu6c7e0b92010-07-31 00:00:49 +0800244 if (type != EGL_PBUFFER_BIT) {
Chia-I Wu6f152922010-01-31 12:13:59 +0800245 err = EGL_BAD_ATTRIBUTE;
246 break;
247 }
248 if (val < 0) {
249 err = EGL_BAD_PARAMETER;
250 break;
251 }
252 surf->Height = val;
253 break;
254 case EGL_LARGEST_PBUFFER:
255 if (type != EGL_PBUFFER_BIT) {
256 err = EGL_BAD_ATTRIBUTE;
257 break;
258 }
Chia-I Wueb961f82010-01-31 17:56:30 +0800259 surf->LargestPbuffer = !!val;
Chia-I Wu6f152922010-01-31 12:13:59 +0800260 break;
Chia-I Wu6c7e0b92010-07-31 00:00:49 +0800261 /* for eglBindTexImage */
Chia-I Wu6f152922010-01-31 12:13:59 +0800262 case EGL_TEXTURE_FORMAT:
Kristian Høgsberg5dc0f492010-05-06 22:40:25 -0400263 if (!(type & texture_type)) {
Chia-I Wu6f152922010-01-31 12:13:59 +0800264 err = EGL_BAD_ATTRIBUTE;
265 break;
266 }
Plamena Manolovaa0674ce2016-05-25 17:29:55 +0100267
Chia-I Wueb961f82010-01-31 17:56:30 +0800268 switch (val) {
269 case EGL_TEXTURE_RGB:
270 case EGL_TEXTURE_RGBA:
271 case EGL_NO_TEXTURE:
272 break;
273 default:
274 err = EGL_BAD_ATTRIBUTE;
275 break;
276 }
277 if (err != EGL_SUCCESS)
278 break;
Chia-I Wu6f152922010-01-31 12:13:59 +0800279 surf->TextureFormat = val;
280 break;
281 case EGL_TEXTURE_TARGET:
Kristian Høgsberg5dc0f492010-05-06 22:40:25 -0400282 if (!(type & texture_type)) {
Chia-I Wu6f152922010-01-31 12:13:59 +0800283 err = EGL_BAD_ATTRIBUTE;
284 break;
285 }
Plamena Manolovaa0674ce2016-05-25 17:29:55 +0100286
Chia-I Wueb961f82010-01-31 17:56:30 +0800287 switch (val) {
288 case EGL_TEXTURE_2D:
289 case EGL_NO_TEXTURE:
290 break;
291 default:
292 err = EGL_BAD_ATTRIBUTE;
293 break;
294 }
295 if (err != EGL_SUCCESS)
296 break;
Chia-I Wu6f152922010-01-31 12:13:59 +0800297 surf->TextureTarget = val;
298 break;
299 case EGL_MIPMAP_TEXTURE:
Kristian Høgsberg5dc0f492010-05-06 22:40:25 -0400300 if (!(type & texture_type)) {
Chia-I Wu6f152922010-01-31 12:13:59 +0800301 err = EGL_BAD_ATTRIBUTE;
302 break;
303 }
Chia-I Wueb961f82010-01-31 17:56:30 +0800304 surf->MipmapTexture = !!val;
Chia-I Wu6f152922010-01-31 12:13:59 +0800305 break;
306 /* no pixmap surface specific attributes */
307 default:
308 err = EGL_BAD_ATTRIBUTE;
309 break;
310 }
311
Guillaume Charifi9fea9d62016-06-20 15:27:33 +0200312 if (err != EGL_SUCCESS)
Chia-I Wu6f152922010-01-31 12:13:59 +0800313 break;
Guillaume Charifi9fea9d62016-06-20 15:27:33 +0200314 }
315
316 if (err == EGL_SUCCESS && type == EGL_PBUFFER_BIT) {
317 if ((surf->TextureTarget == EGL_NO_TEXTURE && surf->TextureFormat != EGL_NO_TEXTURE) ||
318 (surf->TextureFormat == EGL_NO_TEXTURE && surf->TextureTarget != EGL_NO_TEXTURE)) {
319 attr = surf->TextureTarget == EGL_NO_TEXTURE ? EGL_TEXTURE_TARGET : EGL_TEXTURE_FORMAT;
320 err = EGL_BAD_MATCH;
Chia-I Wu6f152922010-01-31 12:13:59 +0800321 }
322 }
323
Guillaume Charifi9fea9d62016-06-20 15:27:33 +0200324 if (err != EGL_SUCCESS)
325 _eglLog(_EGL_WARNING, "bad surface attribute 0x%04x", attr);
326
Chia-I Wu6f152922010-01-31 12:13:59 +0800327 return err;
328}
329
330
331/**
Brian Pauld548bf42005-11-27 23:57:19 +0000332 * Do error check on parameters and initialize the given _EGLSurface object.
333 * \return EGL_TRUE if no errors, EGL_FALSE otherwise.
334 */
335EGLBoolean
Eric Engestrom54fa5ec2019-02-02 11:38:45 +0000336_eglInitSurface(_EGLSurface *surf, _EGLDisplay *disp, EGLint type,
Paulo Zanoni04ecda32019-05-01 15:42:26 -0700337 _EGLConfig *conf, const EGLint *attrib_list,
338 void *native_surface)
Brian Pauladbff7e2005-04-22 21:09:39 +0000339{
Brian Pauld548bf42005-11-27 23:57:19 +0000340 const char *func;
Brian Paulb2006a42006-01-30 00:10:55 +0000341 EGLint renderBuffer = EGL_BACK_BUFFER;
Tapani Pälli20359302016-10-26 13:54:51 +0300342 EGLint swapBehavior = EGL_BUFFER_DESTROYED;
Chia-I Wu6f152922010-01-31 12:13:59 +0800343 EGLint err;
Brian Pauld548bf42005-11-27 23:57:19 +0000344
Tapani Pälli20359302016-10-26 13:54:51 +0300345 /* Swap behavior can be preserved only if config supports this. */
346 if (conf->SurfaceType & EGL_SWAP_BEHAVIOR_PRESERVED_BIT)
347 swapBehavior = EGL_BUFFER_PRESERVED;
348
Brian Pauld548bf42005-11-27 23:57:19 +0000349 switch (type) {
350 case EGL_WINDOW_BIT:
351 func = "eglCreateWindowSurface";
Chia-I Wua5ab4692011-07-28 13:33:55 +0900352 swapBehavior = EGL_BUFFER_DESTROYED;
Brian Pauld548bf42005-11-27 23:57:19 +0000353 break;
354 case EGL_PIXMAP_BIT:
355 func = "eglCreatePixmapSurface";
Brian Paulb2006a42006-01-30 00:10:55 +0000356 renderBuffer = EGL_SINGLE_BUFFER;
Brian Pauld548bf42005-11-27 23:57:19 +0000357 break;
358 case EGL_PBUFFER_BIT:
359 func = "eglCreatePBufferSurface";
360 break;
Brian Pauld548bf42005-11-27 23:57:19 +0000361 default:
362 _eglLog(_EGL_WARNING, "Bad type in _eglInitSurface");
363 return EGL_FALSE;
364 }
365
Emil Velikovc58af5c2017-06-20 15:40:28 +0100366 if ((conf->SurfaceType & type) == 0)
Brian Paulb36f9062008-09-01 13:08:12 -0600367 /* The config can't be used to create a surface of this type */
Emil Velikovc58af5c2017-06-20 15:40:28 +0100368 return _eglError(EGL_BAD_MATCH, func);
Brian Paulb36f9062008-09-01 13:08:12 -0600369
Eric Engestrom54fa5ec2019-02-02 11:38:45 +0000370 _eglInitResource(&surf->Resource, sizeof(*surf), disp);
Brian Pauld548bf42005-11-27 23:57:19 +0000371 surf->Type = type;
Chia-I Wu6f152922010-01-31 12:13:59 +0800372 surf->Config = conf;
Chad Versace23c86c72017-05-04 17:46:33 -0700373 surf->Lost = EGL_FALSE;
Chia-I Wu6f152922010-01-31 12:13:59 +0800374
375 surf->Width = 0;
376 surf->Height = 0;
377 surf->TextureFormat = EGL_NO_TEXTURE;
378 surf->TextureTarget = EGL_NO_TEXTURE;
379 surf->MipmapTexture = EGL_FALSE;
Chia-I Wueb961f82010-01-31 17:56:30 +0800380 surf->LargestPbuffer = EGL_FALSE;
Chad Versacef48f9a72018-04-07 14:23:48 -0700381 surf->RequestedRenderBuffer = renderBuffer;
382 surf->ActiveRenderBuffer = renderBuffer;
Chia-I Wueb961f82010-01-31 17:56:30 +0800383 surf->VGAlphaFormat = EGL_VG_ALPHA_FORMAT_NONPRE;
384 surf->VGColorspace = EGL_VG_COLORSPACE_sRGB;
Marek Olšákc2c2e9a2015-06-10 02:49:29 +0200385 surf->GLColorspace = EGL_GL_COLORSPACE_LINEAR_KHR;
Chia-I Wueb961f82010-01-31 17:56:30 +0800386
Brian Pauld548bf42005-11-27 23:57:19 +0000387 surf->MipmapLevel = 0;
Chia-I Wueb961f82010-01-31 17:56:30 +0800388 surf->MultisampleResolve = EGL_MULTISAMPLE_RESOLVE_DEFAULT;
Chia-I Wua5ab4692011-07-28 13:33:55 +0900389 surf->SwapBehavior = swapBehavior;
Chia-I Wueb961f82010-01-31 17:56:30 +0800390
391 surf->HorizontalResolution = EGL_UNKNOWN;
392 surf->VerticalResolution = EGL_UNKNOWN;
393 surf->AspectRatio = EGL_UNKNOWN;
394
Fredrik Höglund7d46b452011-12-14 21:24:09 +0100395 surf->PostSubBufferSupportedNV = EGL_FALSE;
Harish Krupo98275472017-06-09 20:13:34 +0530396 surf->SetDamageRegionCalled = EGL_FALSE;
397 surf->BufferAgeRead = EGL_FALSE;
Fredrik Höglund7d46b452011-12-14 21:24:09 +0100398
Chia-I Wu57da4992009-10-15 11:08:48 +0800399 /* the default swap interval is 1 */
Eric Engestrom2714a8f2017-07-31 14:49:31 +0100400 surf->SwapInterval = 1;
Chia-I Wu57da4992009-10-15 11:08:48 +0800401
Tapani Pälli799b3d12018-04-05 13:02:36 +0300402 surf->HdrMetadata.display_primary_r.x = EGL_DONT_CARE;
403 surf->HdrMetadata.display_primary_r.y = EGL_DONT_CARE;
404 surf->HdrMetadata.display_primary_g.x = EGL_DONT_CARE;
405 surf->HdrMetadata.display_primary_g.y = EGL_DONT_CARE;
406 surf->HdrMetadata.display_primary_b.x = EGL_DONT_CARE;
407 surf->HdrMetadata.display_primary_b.y = EGL_DONT_CARE;
408 surf->HdrMetadata.white_point.x = EGL_DONT_CARE;
409 surf->HdrMetadata.white_point.y = EGL_DONT_CARE;
410 surf->HdrMetadata.max_luminance = EGL_DONT_CARE;
411 surf->HdrMetadata.min_luminance = EGL_DONT_CARE;
412 surf->HdrMetadata.max_cll = EGL_DONT_CARE;
413 surf->HdrMetadata.max_fall = EGL_DONT_CARE;
414
Chia-I Wu6f152922010-01-31 12:13:59 +0800415 err = _eglParseSurfaceAttribList(surf, attrib_list);
416 if (err != EGL_SUCCESS)
417 return _eglError(err, func);
418
Daniel Czarnowskid4714512016-02-22 08:00:14 +0200419 /* if EGL_LARGEST_PBUFFER in use, clamp width and height */
420 if (surf->LargestPbuffer) {
421 surf->Width = MIN2(surf->Width, _EGL_MAX_PBUFFER_WIDTH);
422 surf->Height = MIN2(surf->Height, _EGL_MAX_PBUFFER_HEIGHT);
423 }
424
Paulo Zanoni04ecda32019-05-01 15:42:26 -0700425 surf->NativeSurface = native_surface;
426
Brian Pauld548bf42005-11-27 23:57:19 +0000427 return EGL_TRUE;
Brian Pauladbff7e2005-04-22 21:09:39 +0000428}
429
430
Brian Pauladbff7e2005-04-22 21:09:39 +0000431EGLBoolean
Eric Engestrom982ac692018-04-22 16:48:15 +0200432_eglQuerySurface(_EGLDisplay *disp, _EGLSurface *surface,
Brian Pauld548bf42005-11-27 23:57:19 +0000433 EGLint attribute, EGLint *value)
Brian Pauladbff7e2005-04-22 21:09:39 +0000434{
Brian Pauladbff7e2005-04-22 21:09:39 +0000435 switch (attribute) {
436 case EGL_WIDTH:
437 *value = surface->Width;
Chia-I Wueb961f82010-01-31 17:56:30 +0800438 break;
Brian Pauladbff7e2005-04-22 21:09:39 +0000439 case EGL_HEIGHT:
440 *value = surface->Height;
Chia-I Wueb961f82010-01-31 17:56:30 +0800441 break;
Brian Pauladbff7e2005-04-22 21:09:39 +0000442 case EGL_CONFIG_ID:
Chia-I Wu3fa21882010-10-14 16:38:58 +0800443 *value = surface->Config->ConfigID;
Chia-I Wueb961f82010-01-31 17:56:30 +0800444 break;
Brian Paulfbd6e862008-06-20 10:20:25 -0600445 case EGL_LARGEST_PBUFFER:
Frank Binnsb2c59862015-07-31 09:11:45 +0100446 if (surface->Type == EGL_PBUFFER_BIT)
447 *value = surface->LargestPbuffer;
Chia-I Wueb961f82010-01-31 17:56:30 +0800448 break;
Brian Pauladbff7e2005-04-22 21:09:39 +0000449 case EGL_TEXTURE_FORMAT:
450 /* texture attributes: only for pbuffers, no error otherwise */
451 if (surface->Type == EGL_PBUFFER_BIT)
452 *value = surface->TextureFormat;
Chia-I Wueb961f82010-01-31 17:56:30 +0800453 break;
Brian Pauladbff7e2005-04-22 21:09:39 +0000454 case EGL_TEXTURE_TARGET:
455 if (surface->Type == EGL_PBUFFER_BIT)
456 *value = surface->TextureTarget;
Chia-I Wueb961f82010-01-31 17:56:30 +0800457 break;
Brian Pauladbff7e2005-04-22 21:09:39 +0000458 case EGL_MIPMAP_TEXTURE:
459 if (surface->Type == EGL_PBUFFER_BIT)
460 *value = surface->MipmapTexture;
Chia-I Wueb961f82010-01-31 17:56:30 +0800461 break;
Brian Pauladbff7e2005-04-22 21:09:39 +0000462 case EGL_MIPMAP_LEVEL:
463 if (surface->Type == EGL_PBUFFER_BIT)
464 *value = surface->MipmapLevel;
Chia-I Wueb961f82010-01-31 17:56:30 +0800465 break;
Brian Paulb2006a42006-01-30 00:10:55 +0000466 case EGL_SWAP_BEHAVIOR:
467 *value = surface->SwapBehavior;
Chia-I Wueb961f82010-01-31 17:56:30 +0800468 break;
Brian Paulb2006a42006-01-30 00:10:55 +0000469 case EGL_RENDER_BUFFER:
Chad Versace3dc22382018-04-30 22:32:25 -0700470 /* From the EGL_KHR_mutable_render_buffer spec (v12):
Chad Versacef48f9a72018-04-07 14:23:48 -0700471 *
472 * Querying EGL_RENDER_BUFFER returns the buffer which client API
473 * rendering is requested to use. For a window surface, this is the
Chad Versace3dc22382018-04-30 22:32:25 -0700474 * attribute value specified when the surface was created or last set
475 * via eglSurfaceAttrib.
476 *
477 * In other words, querying a window surface returns the value most
478 * recently *requested* by the user.
479 *
480 * The paragraph continues in the EGL 1.5 spec (2014.08.27):
481 *
482 * For a pbuffer surface, it is always EGL_BACK_BUFFER . For a pixmap
Chad Versacef48f9a72018-04-07 14:23:48 -0700483 * surface, it is always EGL_SINGLE_BUFFER . To determine the actual
484 * buffer being rendered to by a context, call eglQueryContext.
485 */
486 switch (surface->Type) {
487 default:
488 unreachable("bad EGLSurface type");
489 case EGL_WINDOW_BIT:
490 *value = surface->RequestedRenderBuffer;
491 break;
492 case EGL_PBUFFER_BIT:
493 *value = EGL_BACK_BUFFER;
494 break;
495 case EGL_PIXMAP_BIT:
496 *value = EGL_SINGLE_BUFFER;
497 break;
498 }
Chia-I Wueb961f82010-01-31 17:56:30 +0800499 break;
Brian Paulb2006a42006-01-30 00:10:55 +0000500 case EGL_PIXEL_ASPECT_RATIO:
501 *value = surface->AspectRatio;
Chia-I Wueb961f82010-01-31 17:56:30 +0800502 break;
Brian Paulb2006a42006-01-30 00:10:55 +0000503 case EGL_HORIZONTAL_RESOLUTION:
504 *value = surface->HorizontalResolution;
Chia-I Wueb961f82010-01-31 17:56:30 +0800505 break;
Brian Paulb2006a42006-01-30 00:10:55 +0000506 case EGL_VERTICAL_RESOLUTION:
507 *value = surface->VerticalResolution;
Chia-I Wueb961f82010-01-31 17:56:30 +0800508 break;
509 case EGL_MULTISAMPLE_RESOLVE:
510 *value = surface->MultisampleResolve;
511 break;
512 case EGL_VG_ALPHA_FORMAT:
513 *value = surface->VGAlphaFormat;
514 break;
515 case EGL_VG_COLORSPACE:
516 *value = surface->VGColorspace;
517 break;
Marek Olšákc2c2e9a2015-06-10 02:49:29 +0200518 case EGL_GL_COLORSPACE_KHR:
Eric Engestrom54fa5ec2019-02-02 11:38:45 +0000519 if (!disp->Extensions.KHR_gl_colorspace)
Emil Velikovc58af5c2017-06-20 15:40:28 +0100520 return _eglError(EGL_BAD_ATTRIBUTE, "eglQuerySurface");
521
Marek Olšákc2c2e9a2015-06-10 02:49:29 +0200522 *value = surface->GLColorspace;
523 break;
Fredrik Höglund7d46b452011-12-14 21:24:09 +0100524 case EGL_POST_SUB_BUFFER_SUPPORTED_NV:
525 *value = surface->PostSubBufferSupportedNV;
526 break;
Kristian Høgsberg0725f2d2012-12-13 15:59:24 -0500527 case EGL_BUFFER_AGE_EXT:
Chia-I Wu2f8734e2019-02-07 15:11:57 -0800528 /* Both EXT_buffer_age and KHR_partial_update accept EGL_BUFFER_AGE_EXT.
529 * To be precise, the KHR one accepts EGL_BUFFER_AGE_KHR which is an
530 * alias with the same numeric value.
531 */
532 if (!disp->Extensions.EXT_buffer_age &&
533 !disp->Extensions.KHR_partial_update)
Emil Velikovc58af5c2017-06-20 15:40:28 +0100534 return _eglError(EGL_BAD_ATTRIBUTE, "eglQuerySurface");
535
Harish Krupo98275472017-06-09 20:13:34 +0530536 _EGLContext *ctx = _eglGetCurrentContext();
Eric Engestrome87e68d2018-04-22 16:48:15 +0200537 const _EGLDriver *drv = disp->Driver;
Eric Engestromcc034482020-07-20 13:38:24 +0200538 EGLint result = drv->QueryBufferAge(drv, disp, surface);
Tapani Pälli8fac8942017-06-08 12:24:24 +0300539 /* error happened */
540 if (result < 0)
541 return EGL_FALSE;
Harish Krupo98275472017-06-09 20:13:34 +0530542 if (_eglGetContextHandle(ctx) == EGL_NO_CONTEXT ||
Emil Velikovc58af5c2017-06-20 15:40:28 +0100543 ctx->DrawSurface != surface)
544 return _eglError(EGL_BAD_SURFACE, "eglQuerySurface");
545
Tapani Pälli8fac8942017-06-08 12:24:24 +0300546 *value = result;
Harish Krupo98275472017-06-09 20:13:34 +0530547 surface->BufferAgeRead = EGL_TRUE;
Kristian Høgsberg0725f2d2012-12-13 15:59:24 -0500548 break;
Tapani Pälli799b3d12018-04-05 13:02:36 +0300549 case EGL_SMPTE2086_DISPLAY_PRIMARY_RX_EXT:
550 *value = surface->HdrMetadata.display_primary_r.x;
551 break;
552 case EGL_SMPTE2086_DISPLAY_PRIMARY_RY_EXT:
553 *value = surface->HdrMetadata.display_primary_r.y;
554 break;
555 case EGL_SMPTE2086_DISPLAY_PRIMARY_GX_EXT:
556 *value = surface->HdrMetadata.display_primary_g.x;
557 break;
558 case EGL_SMPTE2086_DISPLAY_PRIMARY_GY_EXT:
559 *value = surface->HdrMetadata.display_primary_g.y;
560 break;
561 case EGL_SMPTE2086_DISPLAY_PRIMARY_BX_EXT:
562 *value = surface->HdrMetadata.display_primary_b.x;
563 break;
564 case EGL_SMPTE2086_DISPLAY_PRIMARY_BY_EXT:
565 *value = surface->HdrMetadata.display_primary_b.y;
566 break;
567 case EGL_SMPTE2086_WHITE_POINT_X_EXT:
568 *value = surface->HdrMetadata.white_point.x;
569 break;
570 case EGL_SMPTE2086_WHITE_POINT_Y_EXT:
571 *value = surface->HdrMetadata.white_point.y;
572 break;
573 case EGL_SMPTE2086_MAX_LUMINANCE_EXT:
574 *value = surface->HdrMetadata.max_luminance;
575 break;
576 case EGL_SMPTE2086_MIN_LUMINANCE_EXT:
577 *value = surface->HdrMetadata.min_luminance;
578 break;
579 case EGL_CTA861_3_MAX_CONTENT_LIGHT_LEVEL_EXT:
580 *value = surface->HdrMetadata.max_cll;
581 break;
582 case EGL_CTA861_3_MAX_FRAME_AVERAGE_LEVEL_EXT:
583 *value = surface->HdrMetadata.max_fall;
584 break;
Brian Pauladbff7e2005-04-22 21:09:39 +0000585 default:
Emil Velikovc58af5c2017-06-20 15:40:28 +0100586 return _eglError(EGL_BAD_ATTRIBUTE, "eglQuerySurface");
Brian Pauladbff7e2005-04-22 21:09:39 +0000587 }
Chia-I Wueb961f82010-01-31 17:56:30 +0800588
589 return EGL_TRUE;
Brian Pauladbff7e2005-04-22 21:09:39 +0000590}
591
592
593/**
Brian Pauladbff7e2005-04-22 21:09:39 +0000594 * Default fallback routine - drivers might override this.
595 */
596EGLBoolean
Eric Engestrom9c6fa942020-07-31 01:38:41 +0200597_eglSurfaceAttrib(const _EGLDriver *drv, _EGLDisplay *disp, _EGLSurface *surface,
Brian Paulb36f9062008-09-01 13:08:12 -0600598 EGLint attribute, EGLint value)
Brian Pauladbff7e2005-04-22 21:09:39 +0000599{
Chia-I Wueb961f82010-01-31 17:56:30 +0800600 EGLint confval;
601 EGLint err = EGL_SUCCESS;
Chad Versaceeb099402012-11-20 13:43:11 -0800602 EGLint all_es_bits = EGL_OPENGL_ES_BIT |
603 EGL_OPENGL_ES2_BIT |
604 EGL_OPENGL_ES3_BIT_KHR;
Chia-I Wueb961f82010-01-31 17:56:30 +0800605
Brian Pauladbff7e2005-04-22 21:09:39 +0000606 switch (attribute) {
607 case EGL_MIPMAP_LEVEL:
Chia-I Wu3fa21882010-10-14 16:38:58 +0800608 confval = surface->Config->RenderableType;
Chad Versaceeb099402012-11-20 13:43:11 -0800609 if (!(confval & all_es_bits)) {
Chia-I Wueb961f82010-01-31 17:56:30 +0800610 err = EGL_BAD_PARAMETER;
611 break;
612 }
Brian Pauladbff7e2005-04-22 21:09:39 +0000613 surface->MipmapLevel = value;
614 break;
Chia-I Wueb961f82010-01-31 17:56:30 +0800615 case EGL_MULTISAMPLE_RESOLVE:
616 switch (value) {
617 case EGL_MULTISAMPLE_RESOLVE_DEFAULT:
618 break;
619 case EGL_MULTISAMPLE_RESOLVE_BOX:
Chia-I Wu3fa21882010-10-14 16:38:58 +0800620 confval = surface->Config->SurfaceType;
Chia-I Wueb961f82010-01-31 17:56:30 +0800621 if (!(confval & EGL_MULTISAMPLE_RESOLVE_BOX_BIT))
622 err = EGL_BAD_MATCH;
623 break;
624 default:
625 err = EGL_BAD_ATTRIBUTE;
626 break;
627 }
628 if (err != EGL_SUCCESS)
629 break;
630 surface->MultisampleResolve = value;
631 break;
Chad Versace3dc22382018-04-30 22:32:25 -0700632 case EGL_RENDER_BUFFER:
Eric Engestrom54fa5ec2019-02-02 11:38:45 +0000633 if (!disp->Extensions.KHR_mutable_render_buffer) {
Chad Versace3dc22382018-04-30 22:32:25 -0700634 err = EGL_BAD_ATTRIBUTE;
635 break;
636 }
637
638 if (value != EGL_BACK_BUFFER && value != EGL_SINGLE_BUFFER) {
639 err = EGL_BAD_PARAMETER;
640 break;
641 }
642
643 /* From the EGL_KHR_mutable_render_buffer spec (v12):
644 *
645 * If attribute is EGL_RENDER_BUFFER, and the EGL_SURFACE_TYPE
646 * attribute of the EGLConfig used to create surface does not contain
647 * EGL_MUTABLE_RENDER_BUFFER_BIT_KHR, [...] an EGL_BAD_MATCH error is
648 * generated [...].
649 */
650 if (!(surface->Config->SurfaceType & EGL_MUTABLE_RENDER_BUFFER_BIT_KHR)) {
651 err = EGL_BAD_MATCH;
652 break;
653 }
654
655 surface->RequestedRenderBuffer = value;
656 break;
Chia-I Wueb961f82010-01-31 17:56:30 +0800657 case EGL_SWAP_BEHAVIOR:
658 switch (value) {
659 case EGL_BUFFER_DESTROYED:
660 break;
661 case EGL_BUFFER_PRESERVED:
Chia-I Wu3fa21882010-10-14 16:38:58 +0800662 confval = surface->Config->SurfaceType;
Chia-I Wueb961f82010-01-31 17:56:30 +0800663 if (!(confval & EGL_SWAP_BEHAVIOR_PRESERVED_BIT))
664 err = EGL_BAD_MATCH;
665 break;
666 default:
667 err = EGL_BAD_ATTRIBUTE;
668 break;
669 }
670 if (err != EGL_SUCCESS)
671 break;
672 surface->SwapBehavior = value;
673 break;
Tapani Pälli799b3d12018-04-05 13:02:36 +0300674 case EGL_SMPTE2086_DISPLAY_PRIMARY_RX_EXT:
675 surface->HdrMetadata.display_primary_r.x = value;
676 break;
677 case EGL_SMPTE2086_DISPLAY_PRIMARY_RY_EXT:
678 surface->HdrMetadata.display_primary_r.y = value;
679 break;
680 case EGL_SMPTE2086_DISPLAY_PRIMARY_GX_EXT:
681 surface->HdrMetadata.display_primary_g.x = value;
682 break;
683 case EGL_SMPTE2086_DISPLAY_PRIMARY_GY_EXT:
684 surface->HdrMetadata.display_primary_g.y = value;
685 break;
686 case EGL_SMPTE2086_DISPLAY_PRIMARY_BX_EXT:
687 surface->HdrMetadata.display_primary_b.x = value;
688 break;
689 case EGL_SMPTE2086_DISPLAY_PRIMARY_BY_EXT:
690 surface->HdrMetadata.display_primary_b.y = value;
691 break;
692 case EGL_SMPTE2086_WHITE_POINT_X_EXT:
693 surface->HdrMetadata.white_point.x = value;
694 break;
695 case EGL_SMPTE2086_WHITE_POINT_Y_EXT:
696 surface->HdrMetadata.white_point.y = value;
697 break;
698 case EGL_SMPTE2086_MAX_LUMINANCE_EXT:
699 surface->HdrMetadata.max_luminance = value;
700 break;
701 case EGL_SMPTE2086_MIN_LUMINANCE_EXT:
702 surface->HdrMetadata.min_luminance = value;
703 break;
704 case EGL_CTA861_3_MAX_CONTENT_LIGHT_LEVEL_EXT:
705 surface->HdrMetadata.max_cll = value;
706 break;
707 case EGL_CTA861_3_MAX_FRAME_AVERAGE_LEVEL_EXT:
708 surface->HdrMetadata.max_fall = value;
709 break;
Brian Pauladbff7e2005-04-22 21:09:39 +0000710 default:
Chia-I Wueb961f82010-01-31 17:56:30 +0800711 err = EGL_BAD_ATTRIBUTE;
712 break;
Brian Pauladbff7e2005-04-22 21:09:39 +0000713 }
Chia-I Wueb961f82010-01-31 17:56:30 +0800714
715 if (err != EGL_SUCCESS)
716 return _eglError(err, "eglSurfaceAttrib");
Brian Pauladbff7e2005-04-22 21:09:39 +0000717 return EGL_TRUE;
718}
719
720
721EGLBoolean
Eric Engestrom2f4a6ad2018-04-22 16:48:15 +0200722_eglBindTexImage(_EGLDisplay *disp, _EGLSurface *surface, EGLint buffer)
Brian Pauladbff7e2005-04-22 21:09:39 +0000723{
Kristian Høgsberg5dc0f492010-05-06 22:40:25 -0400724 EGLint texture_type = EGL_PBUFFER_BIT;
725
Brian Paulb36f9062008-09-01 13:08:12 -0600726 /* Just do basic error checking and return success/fail.
727 * Drivers must implement the real stuff.
728 */
Brian Paulb36f9062008-09-01 13:08:12 -0600729
Eric Engestrom54fa5ec2019-02-02 11:38:45 +0000730 if (disp->Extensions.NOK_texture_from_pixmap)
Kristian Høgsberg5dc0f492010-05-06 22:40:25 -0400731 texture_type |= EGL_PIXMAP_BIT;
732
Emil Velikovc58af5c2017-06-20 15:40:28 +0100733 if (!(surface->Type & texture_type))
734 return _eglError(EGL_BAD_SURFACE, "eglBindTexImage");
Brian Paulb36f9062008-09-01 13:08:12 -0600735
Emil Velikovc58af5c2017-06-20 15:40:28 +0100736 if (surface->TextureFormat == EGL_NO_TEXTURE)
737 return _eglError(EGL_BAD_MATCH, "eglBindTexImage");
Brian Paulb36f9062008-09-01 13:08:12 -0600738
Emil Velikovc58af5c2017-06-20 15:40:28 +0100739 if (surface->TextureTarget == EGL_NO_TEXTURE)
740 return _eglError(EGL_BAD_MATCH, "eglBindTexImage");
Kristian Høgsberg5dc0f492010-05-06 22:40:25 -0400741
Emil Velikovc58af5c2017-06-20 15:40:28 +0100742 if (buffer != EGL_BACK_BUFFER)
743 return _eglError(EGL_BAD_PARAMETER, "eglBindTexImage");
Brian Paulb36f9062008-09-01 13:08:12 -0600744
745 surface->BoundToTexture = EGL_TRUE;
746
747 return EGL_TRUE;
Brian Pauladbff7e2005-04-22 21:09:39 +0000748}
749
Emil Velikov9b42fd12014-02-18 03:04:03 +0000750EGLBoolean
Eric Engestrom2f4a6ad2018-04-22 16:48:15 +0200751_eglReleaseTexImage(_EGLDisplay *disp, _EGLSurface *surf, EGLint buffer)
Emil Velikov9b42fd12014-02-18 03:04:03 +0000752{
Eric Engestrom25c60fa2016-10-01 00:23:26 +0100753 /* Just do basic error checking and return success/fail.
Emil Velikov9b42fd12014-02-18 03:04:03 +0000754 * Drivers must implement the real stuff.
755 */
756
Eric Engestrom25c60fa2016-10-01 00:23:26 +0100757 EGLint texture_type = EGL_PBUFFER_BIT;
758
759 if (surf == EGL_NO_SURFACE)
Emil Velikovc58af5c2017-06-20 15:40:28 +0100760 return _eglError(EGL_BAD_SURFACE, "eglReleaseTexImage");
Eric Engestrom25c60fa2016-10-01 00:23:26 +0100761
762 if (!surf->BoundToTexture)
763 {
764 /* Not an error, simply nothing to do */
765 return EGL_TRUE;
766 }
767
768 if (surf->TextureFormat == EGL_NO_TEXTURE)
Emil Velikovc58af5c2017-06-20 15:40:28 +0100769 return _eglError(EGL_BAD_MATCH, "eglReleaseTexImage");
Eric Engestrom25c60fa2016-10-01 00:23:26 +0100770
771 if (buffer != EGL_BACK_BUFFER)
Emil Velikovc58af5c2017-06-20 15:40:28 +0100772 return _eglError(EGL_BAD_PARAMETER, "eglReleaseTexImage");
Eric Engestrom25c60fa2016-10-01 00:23:26 +0100773
Eric Engestrom54fa5ec2019-02-02 11:38:45 +0000774 if (disp->Extensions.NOK_texture_from_pixmap)
Eric Engestrom25c60fa2016-10-01 00:23:26 +0100775 texture_type |= EGL_PIXMAP_BIT;
776
777 if (!(surf->Type & texture_type))
Emil Velikovc58af5c2017-06-20 15:40:28 +0100778 return _eglError(EGL_BAD_SURFACE, "eglReleaseTexImage");
Eric Engestrom25c60fa2016-10-01 00:23:26 +0100779
780 surf->BoundToTexture = EGL_FALSE;
781
782 return EGL_TRUE;
Emil Velikov9b42fd12014-02-18 03:04:03 +0000783}
784
Brian Pauladbff7e2005-04-22 21:09:39 +0000785
786EGLBoolean
Eric Engestrom9c6fa942020-07-31 01:38:41 +0200787_eglSwapInterval(const _EGLDriver *drv, _EGLDisplay *disp, _EGLSurface *surf,
Chia-I Wu57da4992009-10-15 11:08:48 +0800788 EGLint interval)
Brian Pauladbff7e2005-04-22 21:09:39 +0000789{
Brian Pauladbff7e2005-04-22 21:09:39 +0000790 return EGL_TRUE;
791}
Chad Versace3dc22382018-04-30 22:32:25 -0700792
793EGLBoolean
794_eglSurfaceHasMutableRenderBuffer(_EGLSurface *surf)
795{
796 return surf->Type == EGL_WINDOW_BIT &&
797 surf->Config &&
798 (surf->Config->SurfaceType & EGL_MUTABLE_RENDER_BUFFER_BIT_KHR);
799}
800
801EGLBoolean
802_eglSurfaceInSharedBufferMode(_EGLSurface *surf)
803{
804 return _eglSurfaceHasMutableRenderBuffer(surf) &&
805 surf->ActiveRenderBuffer == EGL_SINGLE_BUFFER;
806}