blob: f6e41f10d78f7c9d54891a7b85353c2a9507d563 [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>
Chia-I Wu18457cb2009-07-17 11:48:27 -060039#include "egldisplay.h"
Kristian Høgsberg0725f2d2012-12-13 15:59:24 -050040#include "egldriver.h"
Brian Pauladbff7e2005-04-22 21:09:39 +000041#include "eglcontext.h"
42#include "eglconfig.h"
Chia-I Wu94cb3212010-01-29 09:00:30 +080043#include "eglcurrent.h"
Brian Pauld548bf42005-11-27 23:57:19 +000044#include "egllog.h"
45#include "eglsurface.h"
Brian Pauladbff7e2005-04-22 21:09:39 +000046
47
Chia-I Wu57da4992009-10-15 11:08:48 +080048static void
49_eglClampSwapInterval(_EGLSurface *surf, EGLint interval)
50{
Chia-I Wu3fa21882010-10-14 16:38:58 +080051 EGLint bound = surf->Config->MaxSwapInterval;
Chia-I Wu57da4992009-10-15 11:08:48 +080052 if (interval >= bound) {
53 interval = bound;
54 }
55 else {
Chia-I Wu3fa21882010-10-14 16:38:58 +080056 bound = surf->Config->MinSwapInterval;
Chia-I Wu57da4992009-10-15 11:08:48 +080057 if (interval < bound)
58 interval = bound;
59 }
60 surf->SwapInterval = interval;
61}
62
63
Brian Pauld548bf42005-11-27 23:57:19 +000064/**
Chia-I Wu6f152922010-01-31 12:13:59 +080065 * Parse the list of surface attributes and return the proper error code.
66 */
67static EGLint
68_eglParseSurfaceAttribList(_EGLSurface *surf, const EGLint *attrib_list)
69{
Kristian Høgsberg5dc0f492010-05-06 22:40:25 -040070 _EGLDisplay *dpy = surf->Resource.Display;
Chia-I Wu6f152922010-01-31 12:13:59 +080071 EGLint type = surf->Type;
Kristian Høgsberg5dc0f492010-05-06 22:40:25 -040072 EGLint texture_type = EGL_PBUFFER_BIT;
Chia-I Wu6f152922010-01-31 12:13:59 +080073 EGLint i, err = EGL_SUCCESS;
Guillaume Charifi9fea9d62016-06-20 15:27:33 +020074 EGLint attr = EGL_NONE;
75 EGLint val = EGL_NONE;
Chia-I Wu6f152922010-01-31 12:13:59 +080076
77 if (!attrib_list)
78 return EGL_SUCCESS;
79
Kristian Høgsberg5dc0f492010-05-06 22:40:25 -040080 if (dpy->Extensions.NOK_texture_from_pixmap)
81 texture_type |= EGL_PIXMAP_BIT;
82
Chia-I Wu6f152922010-01-31 12:13:59 +080083 for (i = 0; attrib_list[i] != EGL_NONE; i++) {
Guillaume Charifi9fea9d62016-06-20 15:27:33 +020084 attr = attrib_list[i++];
85 val = attrib_list[i];
Chia-I Wu6f152922010-01-31 12:13:59 +080086
87 switch (attr) {
Chia-I Wu6c7e0b92010-07-31 00:00:49 +080088 /* common attributes */
Marek Olšákc2c2e9a2015-06-10 02:49:29 +020089 case EGL_GL_COLORSPACE_KHR:
90 if (!dpy->Extensions.KHR_gl_colorspace) {
91 err = EGL_BAD_ATTRIBUTE;
92 break;
93 }
94 switch (val) {
95 case EGL_GL_COLORSPACE_SRGB_KHR:
96 case EGL_GL_COLORSPACE_LINEAR_KHR:
97 break;
98 default:
99 err = EGL_BAD_ATTRIBUTE;
100 }
101 if (err != EGL_SUCCESS)
102 break;
103 surf->GLColorspace = val;
104 break;
Chia-I Wu6f152922010-01-31 12:13:59 +0800105 case EGL_VG_COLORSPACE:
Chia-I Wu6f152922010-01-31 12:13:59 +0800106 switch (val) {
107 case EGL_VG_COLORSPACE_sRGB:
108 case EGL_VG_COLORSPACE_LINEAR:
109 break;
110 default:
111 err = EGL_BAD_ATTRIBUTE;
112 break;
113 }
114 if (err != EGL_SUCCESS)
115 break;
Chia-I Wueb961f82010-01-31 17:56:30 +0800116 surf->VGColorspace = val;
Chia-I Wu6f152922010-01-31 12:13:59 +0800117 break;
118 case EGL_VG_ALPHA_FORMAT:
Chia-I Wu6f152922010-01-31 12:13:59 +0800119 switch (val) {
120 case EGL_VG_ALPHA_FORMAT_NONPRE:
121 case EGL_VG_ALPHA_FORMAT_PRE:
122 break;
123 default:
124 err = EGL_BAD_ATTRIBUTE;
125 break;
126 }
127 if (err != EGL_SUCCESS)
128 break;
Chia-I Wueb961f82010-01-31 17:56:30 +0800129 surf->VGAlphaFormat = val;
Chia-I Wu6f152922010-01-31 12:13:59 +0800130 break;
131 /* window surface attributes */
132 case EGL_RENDER_BUFFER:
133 if (type != EGL_WINDOW_BIT) {
134 err = EGL_BAD_ATTRIBUTE;
135 break;
136 }
137 if (val != EGL_BACK_BUFFER && val != EGL_SINGLE_BUFFER) {
138 err = EGL_BAD_ATTRIBUTE;
139 break;
140 }
141 surf->RenderBuffer = val;
142 break;
Fredrik Höglund7d46b452011-12-14 21:24:09 +0100143 case EGL_POST_SUB_BUFFER_SUPPORTED_NV:
144 if (!dpy->Extensions.NV_post_sub_buffer ||
145 type != EGL_WINDOW_BIT) {
146 err = EGL_BAD_ATTRIBUTE;
147 break;
148 }
149 if (val != EGL_TRUE && val != EGL_FALSE) {
150 err = EGL_BAD_PARAMETER;
151 break;
152 }
153 surf->PostSubBufferSupportedNV = val;
154 break;
Chia-I Wu6f152922010-01-31 12:13:59 +0800155 /* pbuffer surface attributes */
156 case EGL_WIDTH:
Chia-I Wu6c7e0b92010-07-31 00:00:49 +0800157 if (type != EGL_PBUFFER_BIT) {
Chia-I Wu6f152922010-01-31 12:13:59 +0800158 err = EGL_BAD_ATTRIBUTE;
159 break;
160 }
161 if (val < 0) {
162 err = EGL_BAD_PARAMETER;
163 break;
164 }
165 surf->Width = val;
166 break;
167 case EGL_HEIGHT:
Chia-I Wu6c7e0b92010-07-31 00:00:49 +0800168 if (type != EGL_PBUFFER_BIT) {
Chia-I Wu6f152922010-01-31 12:13:59 +0800169 err = EGL_BAD_ATTRIBUTE;
170 break;
171 }
172 if (val < 0) {
173 err = EGL_BAD_PARAMETER;
174 break;
175 }
176 surf->Height = val;
177 break;
178 case EGL_LARGEST_PBUFFER:
179 if (type != EGL_PBUFFER_BIT) {
180 err = EGL_BAD_ATTRIBUTE;
181 break;
182 }
Chia-I Wueb961f82010-01-31 17:56:30 +0800183 surf->LargestPbuffer = !!val;
Chia-I Wu6f152922010-01-31 12:13:59 +0800184 break;
Chia-I Wu6c7e0b92010-07-31 00:00:49 +0800185 /* for eglBindTexImage */
Chia-I Wu6f152922010-01-31 12:13:59 +0800186 case EGL_TEXTURE_FORMAT:
Kristian Høgsberg5dc0f492010-05-06 22:40:25 -0400187 if (!(type & texture_type)) {
Chia-I Wu6f152922010-01-31 12:13:59 +0800188 err = EGL_BAD_ATTRIBUTE;
189 break;
190 }
Plamena Manolovaa0674ce2016-05-25 17:29:55 +0100191
Chia-I Wueb961f82010-01-31 17:56:30 +0800192 switch (val) {
193 case EGL_TEXTURE_RGB:
194 case EGL_TEXTURE_RGBA:
195 case EGL_NO_TEXTURE:
196 break;
197 default:
198 err = EGL_BAD_ATTRIBUTE;
199 break;
200 }
201 if (err != EGL_SUCCESS)
202 break;
Chia-I Wu6f152922010-01-31 12:13:59 +0800203 surf->TextureFormat = val;
204 break;
205 case EGL_TEXTURE_TARGET:
Kristian Høgsberg5dc0f492010-05-06 22:40:25 -0400206 if (!(type & texture_type)) {
Chia-I Wu6f152922010-01-31 12:13:59 +0800207 err = EGL_BAD_ATTRIBUTE;
208 break;
209 }
Plamena Manolovaa0674ce2016-05-25 17:29:55 +0100210
Chia-I Wueb961f82010-01-31 17:56:30 +0800211 switch (val) {
212 case EGL_TEXTURE_2D:
213 case EGL_NO_TEXTURE:
214 break;
215 default:
216 err = EGL_BAD_ATTRIBUTE;
217 break;
218 }
219 if (err != EGL_SUCCESS)
220 break;
Chia-I Wu6f152922010-01-31 12:13:59 +0800221 surf->TextureTarget = val;
222 break;
223 case EGL_MIPMAP_TEXTURE:
Kristian Høgsberg5dc0f492010-05-06 22:40:25 -0400224 if (!(type & texture_type)) {
Chia-I Wu6f152922010-01-31 12:13:59 +0800225 err = EGL_BAD_ATTRIBUTE;
226 break;
227 }
Chia-I Wueb961f82010-01-31 17:56:30 +0800228 surf->MipmapTexture = !!val;
Chia-I Wu6f152922010-01-31 12:13:59 +0800229 break;
230 /* no pixmap surface specific attributes */
231 default:
232 err = EGL_BAD_ATTRIBUTE;
233 break;
234 }
235
Guillaume Charifi9fea9d62016-06-20 15:27:33 +0200236 if (err != EGL_SUCCESS)
Chia-I Wu6f152922010-01-31 12:13:59 +0800237 break;
Guillaume Charifi9fea9d62016-06-20 15:27:33 +0200238 }
239
240 if (err == EGL_SUCCESS && type == EGL_PBUFFER_BIT) {
241 if ((surf->TextureTarget == EGL_NO_TEXTURE && surf->TextureFormat != EGL_NO_TEXTURE) ||
242 (surf->TextureFormat == EGL_NO_TEXTURE && surf->TextureTarget != EGL_NO_TEXTURE)) {
243 attr = surf->TextureTarget == EGL_NO_TEXTURE ? EGL_TEXTURE_TARGET : EGL_TEXTURE_FORMAT;
244 err = EGL_BAD_MATCH;
Chia-I Wu6f152922010-01-31 12:13:59 +0800245 }
246 }
247
Guillaume Charifi9fea9d62016-06-20 15:27:33 +0200248 if (err != EGL_SUCCESS)
249 _eglLog(_EGL_WARNING, "bad surface attribute 0x%04x", attr);
250
Chia-I Wu6f152922010-01-31 12:13:59 +0800251 return err;
252}
253
254
255/**
Brian Pauld548bf42005-11-27 23:57:19 +0000256 * Do error check on parameters and initialize the given _EGLSurface object.
257 * \return EGL_TRUE if no errors, EGL_FALSE otherwise.
258 */
259EGLBoolean
Chia-I Wud69242b2010-01-31 13:33:57 +0800260_eglInitSurface(_EGLSurface *surf, _EGLDisplay *dpy, EGLint type,
Chia-I Wucca31342009-07-17 11:53:03 -0600261 _EGLConfig *conf, const EGLint *attrib_list)
Brian Pauladbff7e2005-04-22 21:09:39 +0000262{
Brian Pauld548bf42005-11-27 23:57:19 +0000263 const char *func;
Brian Paulb2006a42006-01-30 00:10:55 +0000264 EGLint renderBuffer = EGL_BACK_BUFFER;
Tapani Pälli20359302016-10-26 13:54:51 +0300265 EGLint swapBehavior = EGL_BUFFER_DESTROYED;
Chia-I Wu6f152922010-01-31 12:13:59 +0800266 EGLint err;
Brian Pauld548bf42005-11-27 23:57:19 +0000267
Tapani Pälli20359302016-10-26 13:54:51 +0300268 /* Swap behavior can be preserved only if config supports this. */
269 if (conf->SurfaceType & EGL_SWAP_BEHAVIOR_PRESERVED_BIT)
270 swapBehavior = EGL_BUFFER_PRESERVED;
271
Brian Pauld548bf42005-11-27 23:57:19 +0000272 switch (type) {
273 case EGL_WINDOW_BIT:
274 func = "eglCreateWindowSurface";
Chia-I Wua5ab4692011-07-28 13:33:55 +0900275 swapBehavior = EGL_BUFFER_DESTROYED;
Brian Pauld548bf42005-11-27 23:57:19 +0000276 break;
277 case EGL_PIXMAP_BIT:
278 func = "eglCreatePixmapSurface";
Brian Paulb2006a42006-01-30 00:10:55 +0000279 renderBuffer = EGL_SINGLE_BUFFER;
Brian Pauld548bf42005-11-27 23:57:19 +0000280 break;
281 case EGL_PBUFFER_BIT:
282 func = "eglCreatePBufferSurface";
283 break;
Brian Pauld548bf42005-11-27 23:57:19 +0000284 default:
285 _eglLog(_EGL_WARNING, "Bad type in _eglInitSurface");
286 return EGL_FALSE;
287 }
288
Emil Velikovc58af5c2017-06-20 15:40:28 +0100289 if ((conf->SurfaceType & type) == 0)
Brian Paulb36f9062008-09-01 13:08:12 -0600290 /* The config can't be used to create a surface of this type */
Emil Velikovc58af5c2017-06-20 15:40:28 +0100291 return _eglError(EGL_BAD_MATCH, func);
Brian Paulb36f9062008-09-01 13:08:12 -0600292
Chia-I Wu924490a2014-02-19 12:57:11 +0800293 _eglInitResource(&surf->Resource, sizeof(*surf), dpy);
Brian Pauld548bf42005-11-27 23:57:19 +0000294 surf->Type = type;
Chia-I Wu6f152922010-01-31 12:13:59 +0800295 surf->Config = conf;
Chad Versace23c86c72017-05-04 17:46:33 -0700296 surf->Lost = EGL_FALSE;
Chia-I Wu6f152922010-01-31 12:13:59 +0800297
298 surf->Width = 0;
299 surf->Height = 0;
300 surf->TextureFormat = EGL_NO_TEXTURE;
301 surf->TextureTarget = EGL_NO_TEXTURE;
302 surf->MipmapTexture = EGL_FALSE;
Chia-I Wueb961f82010-01-31 17:56:30 +0800303 surf->LargestPbuffer = EGL_FALSE;
304 surf->RenderBuffer = renderBuffer;
305 surf->VGAlphaFormat = EGL_VG_ALPHA_FORMAT_NONPRE;
306 surf->VGColorspace = EGL_VG_COLORSPACE_sRGB;
Marek Olšákc2c2e9a2015-06-10 02:49:29 +0200307 surf->GLColorspace = EGL_GL_COLORSPACE_LINEAR_KHR;
Chia-I Wueb961f82010-01-31 17:56:30 +0800308
Brian Pauld548bf42005-11-27 23:57:19 +0000309 surf->MipmapLevel = 0;
Chia-I Wueb961f82010-01-31 17:56:30 +0800310 surf->MultisampleResolve = EGL_MULTISAMPLE_RESOLVE_DEFAULT;
Chia-I Wua5ab4692011-07-28 13:33:55 +0900311 surf->SwapBehavior = swapBehavior;
Chia-I Wueb961f82010-01-31 17:56:30 +0800312
313 surf->HorizontalResolution = EGL_UNKNOWN;
314 surf->VerticalResolution = EGL_UNKNOWN;
315 surf->AspectRatio = EGL_UNKNOWN;
316
Fredrik Höglund7d46b452011-12-14 21:24:09 +0100317 surf->PostSubBufferSupportedNV = EGL_FALSE;
Harish Krupo98275472017-06-09 20:13:34 +0530318 surf->SetDamageRegionCalled = EGL_FALSE;
319 surf->BufferAgeRead = EGL_FALSE;
Fredrik Höglund7d46b452011-12-14 21:24:09 +0100320
Chia-I Wu57da4992009-10-15 11:08:48 +0800321 /* the default swap interval is 1 */
322 _eglClampSwapInterval(surf, 1);
323
Chia-I Wu6f152922010-01-31 12:13:59 +0800324 err = _eglParseSurfaceAttribList(surf, attrib_list);
325 if (err != EGL_SUCCESS)
326 return _eglError(err, func);
327
Daniel Czarnowskid4714512016-02-22 08:00:14 +0200328 /* if EGL_LARGEST_PBUFFER in use, clamp width and height */
329 if (surf->LargestPbuffer) {
330 surf->Width = MIN2(surf->Width, _EGL_MAX_PBUFFER_WIDTH);
331 surf->Height = MIN2(surf->Height, _EGL_MAX_PBUFFER_HEIGHT);
332 }
333
Brian Pauld548bf42005-11-27 23:57:19 +0000334 return EGL_TRUE;
Brian Pauladbff7e2005-04-22 21:09:39 +0000335}
336
337
Brian Pauladbff7e2005-04-22 21:09:39 +0000338EGLBoolean
Chia-I Wu2f2cf462009-08-11 17:09:39 +0800339_eglQuerySurface(_EGLDriver *drv, _EGLDisplay *dpy, _EGLSurface *surface,
Brian Pauld548bf42005-11-27 23:57:19 +0000340 EGLint attribute, EGLint *value)
Brian Pauladbff7e2005-04-22 21:09:39 +0000341{
Brian Pauladbff7e2005-04-22 21:09:39 +0000342 switch (attribute) {
343 case EGL_WIDTH:
344 *value = surface->Width;
Chia-I Wueb961f82010-01-31 17:56:30 +0800345 break;
Brian Pauladbff7e2005-04-22 21:09:39 +0000346 case EGL_HEIGHT:
347 *value = surface->Height;
Chia-I Wueb961f82010-01-31 17:56:30 +0800348 break;
Brian Pauladbff7e2005-04-22 21:09:39 +0000349 case EGL_CONFIG_ID:
Chia-I Wu3fa21882010-10-14 16:38:58 +0800350 *value = surface->Config->ConfigID;
Chia-I Wueb961f82010-01-31 17:56:30 +0800351 break;
Brian Paulfbd6e862008-06-20 10:20:25 -0600352 case EGL_LARGEST_PBUFFER:
Frank Binnsb2c59862015-07-31 09:11:45 +0100353 if (surface->Type == EGL_PBUFFER_BIT)
354 *value = surface->LargestPbuffer;
Chia-I Wueb961f82010-01-31 17:56:30 +0800355 break;
Brian Pauladbff7e2005-04-22 21:09:39 +0000356 case EGL_TEXTURE_FORMAT:
357 /* texture attributes: only for pbuffers, no error otherwise */
358 if (surface->Type == EGL_PBUFFER_BIT)
359 *value = surface->TextureFormat;
Chia-I Wueb961f82010-01-31 17:56:30 +0800360 break;
Brian Pauladbff7e2005-04-22 21:09:39 +0000361 case EGL_TEXTURE_TARGET:
362 if (surface->Type == EGL_PBUFFER_BIT)
363 *value = surface->TextureTarget;
Chia-I Wueb961f82010-01-31 17:56:30 +0800364 break;
Brian Pauladbff7e2005-04-22 21:09:39 +0000365 case EGL_MIPMAP_TEXTURE:
366 if (surface->Type == EGL_PBUFFER_BIT)
367 *value = surface->MipmapTexture;
Chia-I Wueb961f82010-01-31 17:56:30 +0800368 break;
Brian Pauladbff7e2005-04-22 21:09:39 +0000369 case EGL_MIPMAP_LEVEL:
370 if (surface->Type == EGL_PBUFFER_BIT)
371 *value = surface->MipmapLevel;
Chia-I Wueb961f82010-01-31 17:56:30 +0800372 break;
Brian Paulb2006a42006-01-30 00:10:55 +0000373 case EGL_SWAP_BEHAVIOR:
374 *value = surface->SwapBehavior;
Chia-I Wueb961f82010-01-31 17:56:30 +0800375 break;
Brian Paulb2006a42006-01-30 00:10:55 +0000376 case EGL_RENDER_BUFFER:
377 *value = surface->RenderBuffer;
Chia-I Wueb961f82010-01-31 17:56:30 +0800378 break;
Brian Paulb2006a42006-01-30 00:10:55 +0000379 case EGL_PIXEL_ASPECT_RATIO:
380 *value = surface->AspectRatio;
Chia-I Wueb961f82010-01-31 17:56:30 +0800381 break;
Brian Paulb2006a42006-01-30 00:10:55 +0000382 case EGL_HORIZONTAL_RESOLUTION:
383 *value = surface->HorizontalResolution;
Chia-I Wueb961f82010-01-31 17:56:30 +0800384 break;
Brian Paulb2006a42006-01-30 00:10:55 +0000385 case EGL_VERTICAL_RESOLUTION:
386 *value = surface->VerticalResolution;
Chia-I Wueb961f82010-01-31 17:56:30 +0800387 break;
388 case EGL_MULTISAMPLE_RESOLVE:
389 *value = surface->MultisampleResolve;
390 break;
391 case EGL_VG_ALPHA_FORMAT:
392 *value = surface->VGAlphaFormat;
393 break;
394 case EGL_VG_COLORSPACE:
395 *value = surface->VGColorspace;
396 break;
Marek Olšákc2c2e9a2015-06-10 02:49:29 +0200397 case EGL_GL_COLORSPACE_KHR:
Emil Velikovc58af5c2017-06-20 15:40:28 +0100398 if (!dpy->Extensions.KHR_gl_colorspace)
399 return _eglError(EGL_BAD_ATTRIBUTE, "eglQuerySurface");
400
Marek Olšákc2c2e9a2015-06-10 02:49:29 +0200401 *value = surface->GLColorspace;
402 break;
Fredrik Höglund7d46b452011-12-14 21:24:09 +0100403 case EGL_POST_SUB_BUFFER_SUPPORTED_NV:
404 *value = surface->PostSubBufferSupportedNV;
405 break;
Kristian Høgsberg0725f2d2012-12-13 15:59:24 -0500406 case EGL_BUFFER_AGE_EXT:
Emil Velikovc58af5c2017-06-20 15:40:28 +0100407 if (!dpy->Extensions.EXT_buffer_age)
408 return _eglError(EGL_BAD_ATTRIBUTE, "eglQuerySurface");
409
Harish Krupo98275472017-06-09 20:13:34 +0530410 _EGLContext *ctx = _eglGetCurrentContext();
Tapani Pälli8fac8942017-06-08 12:24:24 +0300411 EGLint result = drv->API.QueryBufferAge(drv, dpy, surface);
412 /* error happened */
413 if (result < 0)
414 return EGL_FALSE;
Harish Krupo98275472017-06-09 20:13:34 +0530415 if (_eglGetContextHandle(ctx) == EGL_NO_CONTEXT ||
Emil Velikovc58af5c2017-06-20 15:40:28 +0100416 ctx->DrawSurface != surface)
417 return _eglError(EGL_BAD_SURFACE, "eglQuerySurface");
418
Tapani Pälli8fac8942017-06-08 12:24:24 +0300419 *value = result;
Harish Krupo98275472017-06-09 20:13:34 +0530420 surface->BufferAgeRead = EGL_TRUE;
Kristian Høgsberg0725f2d2012-12-13 15:59:24 -0500421 break;
Brian Pauladbff7e2005-04-22 21:09:39 +0000422 default:
Emil Velikovc58af5c2017-06-20 15:40:28 +0100423 return _eglError(EGL_BAD_ATTRIBUTE, "eglQuerySurface");
Brian Pauladbff7e2005-04-22 21:09:39 +0000424 }
Chia-I Wueb961f82010-01-31 17:56:30 +0800425
426 return EGL_TRUE;
Brian Pauladbff7e2005-04-22 21:09:39 +0000427}
428
429
430/**
Brian Pauladbff7e2005-04-22 21:09:39 +0000431 * Default fallback routine - drivers might override this.
432 */
433EGLBoolean
Chia-I Wu2f2cf462009-08-11 17:09:39 +0800434_eglSurfaceAttrib(_EGLDriver *drv, _EGLDisplay *dpy, _EGLSurface *surface,
Brian Paulb36f9062008-09-01 13:08:12 -0600435 EGLint attribute, EGLint value)
Brian Pauladbff7e2005-04-22 21:09:39 +0000436{
Chia-I Wueb961f82010-01-31 17:56:30 +0800437 EGLint confval;
438 EGLint err = EGL_SUCCESS;
Chad Versaceeb099402012-11-20 13:43:11 -0800439 EGLint all_es_bits = EGL_OPENGL_ES_BIT |
440 EGL_OPENGL_ES2_BIT |
441 EGL_OPENGL_ES3_BIT_KHR;
Chia-I Wueb961f82010-01-31 17:56:30 +0800442
Brian Pauladbff7e2005-04-22 21:09:39 +0000443 switch (attribute) {
444 case EGL_MIPMAP_LEVEL:
Chia-I Wu3fa21882010-10-14 16:38:58 +0800445 confval = surface->Config->RenderableType;
Chad Versaceeb099402012-11-20 13:43:11 -0800446 if (!(confval & all_es_bits)) {
Chia-I Wueb961f82010-01-31 17:56:30 +0800447 err = EGL_BAD_PARAMETER;
448 break;
449 }
Brian Pauladbff7e2005-04-22 21:09:39 +0000450 surface->MipmapLevel = value;
451 break;
Chia-I Wueb961f82010-01-31 17:56:30 +0800452 case EGL_MULTISAMPLE_RESOLVE:
453 switch (value) {
454 case EGL_MULTISAMPLE_RESOLVE_DEFAULT:
455 break;
456 case EGL_MULTISAMPLE_RESOLVE_BOX:
Chia-I Wu3fa21882010-10-14 16:38:58 +0800457 confval = surface->Config->SurfaceType;
Chia-I Wueb961f82010-01-31 17:56:30 +0800458 if (!(confval & EGL_MULTISAMPLE_RESOLVE_BOX_BIT))
459 err = EGL_BAD_MATCH;
460 break;
461 default:
462 err = EGL_BAD_ATTRIBUTE;
463 break;
464 }
465 if (err != EGL_SUCCESS)
466 break;
467 surface->MultisampleResolve = value;
468 break;
469 case EGL_SWAP_BEHAVIOR:
470 switch (value) {
471 case EGL_BUFFER_DESTROYED:
472 break;
473 case EGL_BUFFER_PRESERVED:
Chia-I Wu3fa21882010-10-14 16:38:58 +0800474 confval = surface->Config->SurfaceType;
Chia-I Wueb961f82010-01-31 17:56:30 +0800475 if (!(confval & EGL_SWAP_BEHAVIOR_PRESERVED_BIT))
476 err = EGL_BAD_MATCH;
477 break;
478 default:
479 err = EGL_BAD_ATTRIBUTE;
480 break;
481 }
482 if (err != EGL_SUCCESS)
483 break;
484 surface->SwapBehavior = value;
485 break;
Brian Pauladbff7e2005-04-22 21:09:39 +0000486 default:
Chia-I Wueb961f82010-01-31 17:56:30 +0800487 err = EGL_BAD_ATTRIBUTE;
488 break;
Brian Pauladbff7e2005-04-22 21:09:39 +0000489 }
Chia-I Wueb961f82010-01-31 17:56:30 +0800490
491 if (err != EGL_SUCCESS)
492 return _eglError(err, "eglSurfaceAttrib");
Brian Pauladbff7e2005-04-22 21:09:39 +0000493 return EGL_TRUE;
494}
495
496
497EGLBoolean
Chia-I Wu2f2cf462009-08-11 17:09:39 +0800498_eglBindTexImage(_EGLDriver *drv, _EGLDisplay *dpy, _EGLSurface *surface,
Brian Paulb36f9062008-09-01 13:08:12 -0600499 EGLint buffer)
Brian Pauladbff7e2005-04-22 21:09:39 +0000500{
Kristian Høgsberg5dc0f492010-05-06 22:40:25 -0400501 EGLint texture_type = EGL_PBUFFER_BIT;
502
Brian Paulb36f9062008-09-01 13:08:12 -0600503 /* Just do basic error checking and return success/fail.
504 * Drivers must implement the real stuff.
505 */
Brian Paulb36f9062008-09-01 13:08:12 -0600506
Kristian Høgsberg5dc0f492010-05-06 22:40:25 -0400507 if (dpy->Extensions.NOK_texture_from_pixmap)
508 texture_type |= EGL_PIXMAP_BIT;
509
Emil Velikovc58af5c2017-06-20 15:40:28 +0100510 if (!(surface->Type & texture_type))
511 return _eglError(EGL_BAD_SURFACE, "eglBindTexImage");
Brian Paulb36f9062008-09-01 13:08:12 -0600512
Emil Velikovc58af5c2017-06-20 15:40:28 +0100513 if (surface->TextureFormat == EGL_NO_TEXTURE)
514 return _eglError(EGL_BAD_MATCH, "eglBindTexImage");
Brian Paulb36f9062008-09-01 13:08:12 -0600515
Emil Velikovc58af5c2017-06-20 15:40:28 +0100516 if (surface->TextureTarget == EGL_NO_TEXTURE)
517 return _eglError(EGL_BAD_MATCH, "eglBindTexImage");
Kristian Høgsberg5dc0f492010-05-06 22:40:25 -0400518
Emil Velikovc58af5c2017-06-20 15:40:28 +0100519 if (buffer != EGL_BACK_BUFFER)
520 return _eglError(EGL_BAD_PARAMETER, "eglBindTexImage");
Brian Paulb36f9062008-09-01 13:08:12 -0600521
522 surface->BoundToTexture = EGL_TRUE;
523
524 return EGL_TRUE;
Brian Pauladbff7e2005-04-22 21:09:39 +0000525}
526
Emil Velikov9b42fd12014-02-18 03:04:03 +0000527EGLBoolean
Eric Engestrom25c60fa2016-10-01 00:23:26 +0100528_eglReleaseTexImage(_EGLDriver *drv, _EGLDisplay *dpy, _EGLSurface *surf,
Emil Velikov9b42fd12014-02-18 03:04:03 +0000529 EGLint buffer)
530{
Eric Engestrom25c60fa2016-10-01 00:23:26 +0100531 /* Just do basic error checking and return success/fail.
Emil Velikov9b42fd12014-02-18 03:04:03 +0000532 * Drivers must implement the real stuff.
533 */
534
Eric Engestrom25c60fa2016-10-01 00:23:26 +0100535 EGLint texture_type = EGL_PBUFFER_BIT;
536
537 if (surf == EGL_NO_SURFACE)
Emil Velikovc58af5c2017-06-20 15:40:28 +0100538 return _eglError(EGL_BAD_SURFACE, "eglReleaseTexImage");
Eric Engestrom25c60fa2016-10-01 00:23:26 +0100539
540 if (!surf->BoundToTexture)
541 {
542 /* Not an error, simply nothing to do */
543 return EGL_TRUE;
544 }
545
546 if (surf->TextureFormat == EGL_NO_TEXTURE)
Emil Velikovc58af5c2017-06-20 15:40:28 +0100547 return _eglError(EGL_BAD_MATCH, "eglReleaseTexImage");
Eric Engestrom25c60fa2016-10-01 00:23:26 +0100548
549 if (buffer != EGL_BACK_BUFFER)
Emil Velikovc58af5c2017-06-20 15:40:28 +0100550 return _eglError(EGL_BAD_PARAMETER, "eglReleaseTexImage");
Eric Engestrom25c60fa2016-10-01 00:23:26 +0100551
552 if (dpy->Extensions.NOK_texture_from_pixmap)
553 texture_type |= EGL_PIXMAP_BIT;
554
555 if (!(surf->Type & texture_type))
Emil Velikovc58af5c2017-06-20 15:40:28 +0100556 return _eglError(EGL_BAD_SURFACE, "eglReleaseTexImage");
Eric Engestrom25c60fa2016-10-01 00:23:26 +0100557
558 surf->BoundToTexture = EGL_FALSE;
559
560 return EGL_TRUE;
Emil Velikov9b42fd12014-02-18 03:04:03 +0000561}
562
Brian Pauladbff7e2005-04-22 21:09:39 +0000563
564EGLBoolean
Chia-I Wu57da4992009-10-15 11:08:48 +0800565_eglSwapInterval(_EGLDriver *drv, _EGLDisplay *dpy, _EGLSurface *surf,
566 EGLint interval)
Brian Pauladbff7e2005-04-22 21:09:39 +0000567{
Chia-I Wu57da4992009-10-15 11:08:48 +0800568 _eglClampSwapInterval(surf, interval);
Brian Pauladbff7e2005-04-22 21:09:39 +0000569 return EGL_TRUE;
570}