1*61046927SAndroid Build Coastguard Worker /**************************************************************************
2*61046927SAndroid Build Coastguard Worker *
3*61046927SAndroid Build Coastguard Worker * Copyright 2008 VMware, Inc.
4*61046927SAndroid Build Coastguard Worker * Copyright 2009-2010 Chia-I Wu <[email protected]>
5*61046927SAndroid Build Coastguard Worker * Copyright 2010 LunarG, Inc.
6*61046927SAndroid Build Coastguard Worker * All Rights Reserved.
7*61046927SAndroid Build Coastguard Worker *
8*61046927SAndroid Build Coastguard Worker * Permission is hereby granted, free of charge, to any person obtaining a
9*61046927SAndroid Build Coastguard Worker * copy of this software and associated documentation files (the
10*61046927SAndroid Build Coastguard Worker * "Software"), to deal in the Software without restriction, including
11*61046927SAndroid Build Coastguard Worker * without limitation the rights to use, copy, modify, merge, publish,
12*61046927SAndroid Build Coastguard Worker * distribute, sub license, and/or sell copies of the Software, and to
13*61046927SAndroid Build Coastguard Worker * permit persons to whom the Software is furnished to do so, subject to
14*61046927SAndroid Build Coastguard Worker * the following conditions:
15*61046927SAndroid Build Coastguard Worker *
16*61046927SAndroid Build Coastguard Worker * The above copyright notice and this permission notice (including the
17*61046927SAndroid Build Coastguard Worker * next paragraph) shall be included in all copies or substantial portions
18*61046927SAndroid Build Coastguard Worker * of the Software.
19*61046927SAndroid Build Coastguard Worker *
20*61046927SAndroid Build Coastguard Worker * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
21*61046927SAndroid Build Coastguard Worker * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
22*61046927SAndroid Build Coastguard Worker * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
23*61046927SAndroid Build Coastguard Worker * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
24*61046927SAndroid Build Coastguard Worker * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
25*61046927SAndroid Build Coastguard Worker * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
26*61046927SAndroid Build Coastguard Worker * DEALINGS IN THE SOFTWARE.
27*61046927SAndroid Build Coastguard Worker *
28*61046927SAndroid Build Coastguard Worker **************************************************************************/
29*61046927SAndroid Build Coastguard Worker
30*61046927SAndroid Build Coastguard Worker /**
31*61046927SAndroid Build Coastguard Worker * Surface-related functions.
32*61046927SAndroid Build Coastguard Worker */
33*61046927SAndroid Build Coastguard Worker
34*61046927SAndroid Build Coastguard Worker #include "eglsurface.h"
35*61046927SAndroid Build Coastguard Worker #include <assert.h>
36*61046927SAndroid Build Coastguard Worker #include <stdlib.h>
37*61046927SAndroid Build Coastguard Worker #include <string.h>
38*61046927SAndroid Build Coastguard Worker #include "eglconfig.h"
39*61046927SAndroid Build Coastguard Worker #include "eglcontext.h"
40*61046927SAndroid Build Coastguard Worker #include "eglcurrent.h"
41*61046927SAndroid Build Coastguard Worker #include "egldefines.h"
42*61046927SAndroid Build Coastguard Worker #include "egldisplay.h"
43*61046927SAndroid Build Coastguard Worker #include "egldriver.h"
44*61046927SAndroid Build Coastguard Worker #include "egllog.h"
45*61046927SAndroid Build Coastguard Worker
46*61046927SAndroid Build Coastguard Worker #include "util/macros.h"
47*61046927SAndroid Build Coastguard Worker
48*61046927SAndroid Build Coastguard Worker /**
49*61046927SAndroid Build Coastguard Worker * Parse the list of surface attributes and return the proper error code.
50*61046927SAndroid Build Coastguard Worker */
51*61046927SAndroid Build Coastguard Worker static EGLint
_eglParseSurfaceAttribList(_EGLSurface * surf,const EGLint * attrib_list)52*61046927SAndroid Build Coastguard Worker _eglParseSurfaceAttribList(_EGLSurface *surf, const EGLint *attrib_list)
53*61046927SAndroid Build Coastguard Worker {
54*61046927SAndroid Build Coastguard Worker _EGLDisplay *disp = surf->Resource.Display;
55*61046927SAndroid Build Coastguard Worker EGLint type = surf->Type;
56*61046927SAndroid Build Coastguard Worker EGLint texture_type = EGL_PBUFFER_BIT;
57*61046927SAndroid Build Coastguard Worker EGLint i, err = EGL_SUCCESS;
58*61046927SAndroid Build Coastguard Worker EGLint attr = EGL_NONE;
59*61046927SAndroid Build Coastguard Worker EGLint val = EGL_NONE;
60*61046927SAndroid Build Coastguard Worker
61*61046927SAndroid Build Coastguard Worker if (!attrib_list)
62*61046927SAndroid Build Coastguard Worker return EGL_SUCCESS;
63*61046927SAndroid Build Coastguard Worker
64*61046927SAndroid Build Coastguard Worker if (disp->Extensions.NOK_texture_from_pixmap)
65*61046927SAndroid Build Coastguard Worker texture_type |= EGL_PIXMAP_BIT;
66*61046927SAndroid Build Coastguard Worker
67*61046927SAndroid Build Coastguard Worker for (i = 0; attrib_list[i] != EGL_NONE; i++) {
68*61046927SAndroid Build Coastguard Worker attr = attrib_list[i++];
69*61046927SAndroid Build Coastguard Worker val = attrib_list[i];
70*61046927SAndroid Build Coastguard Worker
71*61046927SAndroid Build Coastguard Worker switch (attr) {
72*61046927SAndroid Build Coastguard Worker /* common attributes */
73*61046927SAndroid Build Coastguard Worker case EGL_GL_COLORSPACE_KHR:
74*61046927SAndroid Build Coastguard Worker if (!disp->Extensions.KHR_gl_colorspace) {
75*61046927SAndroid Build Coastguard Worker err = EGL_BAD_ATTRIBUTE;
76*61046927SAndroid Build Coastguard Worker break;
77*61046927SAndroid Build Coastguard Worker }
78*61046927SAndroid Build Coastguard Worker switch (val) {
79*61046927SAndroid Build Coastguard Worker case EGL_GL_COLORSPACE_SRGB_KHR:
80*61046927SAndroid Build Coastguard Worker case EGL_GL_COLORSPACE_LINEAR_KHR:
81*61046927SAndroid Build Coastguard Worker break;
82*61046927SAndroid Build Coastguard Worker default:
83*61046927SAndroid Build Coastguard Worker err = EGL_BAD_ATTRIBUTE;
84*61046927SAndroid Build Coastguard Worker }
85*61046927SAndroid Build Coastguard Worker if (err != EGL_SUCCESS)
86*61046927SAndroid Build Coastguard Worker break;
87*61046927SAndroid Build Coastguard Worker surf->GLColorspace = val;
88*61046927SAndroid Build Coastguard Worker break;
89*61046927SAndroid Build Coastguard Worker case EGL_SMPTE2086_DISPLAY_PRIMARY_RX_EXT:
90*61046927SAndroid Build Coastguard Worker if (!disp->Extensions.EXT_surface_SMPTE2086_metadata) {
91*61046927SAndroid Build Coastguard Worker err = EGL_BAD_ATTRIBUTE;
92*61046927SAndroid Build Coastguard Worker break;
93*61046927SAndroid Build Coastguard Worker }
94*61046927SAndroid Build Coastguard Worker surf->HdrMetadata.display_primary_r.x = val;
95*61046927SAndroid Build Coastguard Worker break;
96*61046927SAndroid Build Coastguard Worker case EGL_SMPTE2086_DISPLAY_PRIMARY_RY_EXT:
97*61046927SAndroid Build Coastguard Worker if (!disp->Extensions.EXT_surface_SMPTE2086_metadata) {
98*61046927SAndroid Build Coastguard Worker err = EGL_BAD_ATTRIBUTE;
99*61046927SAndroid Build Coastguard Worker break;
100*61046927SAndroid Build Coastguard Worker }
101*61046927SAndroid Build Coastguard Worker surf->HdrMetadata.display_primary_r.y = val;
102*61046927SAndroid Build Coastguard Worker break;
103*61046927SAndroid Build Coastguard Worker case EGL_SMPTE2086_DISPLAY_PRIMARY_GX_EXT:
104*61046927SAndroid Build Coastguard Worker if (!disp->Extensions.EXT_surface_SMPTE2086_metadata) {
105*61046927SAndroid Build Coastguard Worker err = EGL_BAD_ATTRIBUTE;
106*61046927SAndroid Build Coastguard Worker break;
107*61046927SAndroid Build Coastguard Worker }
108*61046927SAndroid Build Coastguard Worker surf->HdrMetadata.display_primary_g.x = val;
109*61046927SAndroid Build Coastguard Worker break;
110*61046927SAndroid Build Coastguard Worker case EGL_SMPTE2086_DISPLAY_PRIMARY_GY_EXT:
111*61046927SAndroid Build Coastguard Worker if (!disp->Extensions.EXT_surface_SMPTE2086_metadata) {
112*61046927SAndroid Build Coastguard Worker err = EGL_BAD_ATTRIBUTE;
113*61046927SAndroid Build Coastguard Worker break;
114*61046927SAndroid Build Coastguard Worker }
115*61046927SAndroid Build Coastguard Worker surf->HdrMetadata.display_primary_g.y = val;
116*61046927SAndroid Build Coastguard Worker break;
117*61046927SAndroid Build Coastguard Worker case EGL_SMPTE2086_DISPLAY_PRIMARY_BX_EXT:
118*61046927SAndroid Build Coastguard Worker if (!disp->Extensions.EXT_surface_SMPTE2086_metadata) {
119*61046927SAndroid Build Coastguard Worker err = EGL_BAD_ATTRIBUTE;
120*61046927SAndroid Build Coastguard Worker break;
121*61046927SAndroid Build Coastguard Worker }
122*61046927SAndroid Build Coastguard Worker surf->HdrMetadata.display_primary_b.x = val;
123*61046927SAndroid Build Coastguard Worker break;
124*61046927SAndroid Build Coastguard Worker case EGL_SMPTE2086_DISPLAY_PRIMARY_BY_EXT:
125*61046927SAndroid Build Coastguard Worker if (!disp->Extensions.EXT_surface_SMPTE2086_metadata) {
126*61046927SAndroid Build Coastguard Worker err = EGL_BAD_ATTRIBUTE;
127*61046927SAndroid Build Coastguard Worker break;
128*61046927SAndroid Build Coastguard Worker }
129*61046927SAndroid Build Coastguard Worker surf->HdrMetadata.display_primary_b.y = val;
130*61046927SAndroid Build Coastguard Worker break;
131*61046927SAndroid Build Coastguard Worker case EGL_SMPTE2086_WHITE_POINT_X_EXT:
132*61046927SAndroid Build Coastguard Worker if (!disp->Extensions.EXT_surface_SMPTE2086_metadata) {
133*61046927SAndroid Build Coastguard Worker err = EGL_BAD_ATTRIBUTE;
134*61046927SAndroid Build Coastguard Worker break;
135*61046927SAndroid Build Coastguard Worker }
136*61046927SAndroid Build Coastguard Worker surf->HdrMetadata.white_point.x = val;
137*61046927SAndroid Build Coastguard Worker break;
138*61046927SAndroid Build Coastguard Worker case EGL_SMPTE2086_WHITE_POINT_Y_EXT:
139*61046927SAndroid Build Coastguard Worker if (!disp->Extensions.EXT_surface_SMPTE2086_metadata) {
140*61046927SAndroid Build Coastguard Worker err = EGL_BAD_ATTRIBUTE;
141*61046927SAndroid Build Coastguard Worker break;
142*61046927SAndroid Build Coastguard Worker }
143*61046927SAndroid Build Coastguard Worker surf->HdrMetadata.white_point.y = val;
144*61046927SAndroid Build Coastguard Worker break;
145*61046927SAndroid Build Coastguard Worker case EGL_SMPTE2086_MAX_LUMINANCE_EXT:
146*61046927SAndroid Build Coastguard Worker if (!disp->Extensions.EXT_surface_SMPTE2086_metadata) {
147*61046927SAndroid Build Coastguard Worker err = EGL_BAD_ATTRIBUTE;
148*61046927SAndroid Build Coastguard Worker break;
149*61046927SAndroid Build Coastguard Worker }
150*61046927SAndroid Build Coastguard Worker surf->HdrMetadata.max_luminance = val;
151*61046927SAndroid Build Coastguard Worker break;
152*61046927SAndroid Build Coastguard Worker case EGL_SMPTE2086_MIN_LUMINANCE_EXT:
153*61046927SAndroid Build Coastguard Worker if (!disp->Extensions.EXT_surface_SMPTE2086_metadata) {
154*61046927SAndroid Build Coastguard Worker err = EGL_BAD_ATTRIBUTE;
155*61046927SAndroid Build Coastguard Worker break;
156*61046927SAndroid Build Coastguard Worker }
157*61046927SAndroid Build Coastguard Worker surf->HdrMetadata.min_luminance = val;
158*61046927SAndroid Build Coastguard Worker break;
159*61046927SAndroid Build Coastguard Worker case EGL_CTA861_3_MAX_CONTENT_LIGHT_LEVEL_EXT:
160*61046927SAndroid Build Coastguard Worker if (!disp->Extensions.EXT_surface_CTA861_3_metadata) {
161*61046927SAndroid Build Coastguard Worker err = EGL_BAD_ATTRIBUTE;
162*61046927SAndroid Build Coastguard Worker break;
163*61046927SAndroid Build Coastguard Worker }
164*61046927SAndroid Build Coastguard Worker surf->HdrMetadata.max_cll = val;
165*61046927SAndroid Build Coastguard Worker break;
166*61046927SAndroid Build Coastguard Worker case EGL_CTA861_3_MAX_FRAME_AVERAGE_LEVEL_EXT:
167*61046927SAndroid Build Coastguard Worker if (!disp->Extensions.EXT_surface_CTA861_3_metadata) {
168*61046927SAndroid Build Coastguard Worker err = EGL_BAD_ATTRIBUTE;
169*61046927SAndroid Build Coastguard Worker break;
170*61046927SAndroid Build Coastguard Worker }
171*61046927SAndroid Build Coastguard Worker surf->HdrMetadata.max_fall = val;
172*61046927SAndroid Build Coastguard Worker break;
173*61046927SAndroid Build Coastguard Worker case EGL_VG_COLORSPACE:
174*61046927SAndroid Build Coastguard Worker switch (val) {
175*61046927SAndroid Build Coastguard Worker case EGL_VG_COLORSPACE_sRGB:
176*61046927SAndroid Build Coastguard Worker case EGL_VG_COLORSPACE_LINEAR:
177*61046927SAndroid Build Coastguard Worker break;
178*61046927SAndroid Build Coastguard Worker default:
179*61046927SAndroid Build Coastguard Worker err = EGL_BAD_ATTRIBUTE;
180*61046927SAndroid Build Coastguard Worker break;
181*61046927SAndroid Build Coastguard Worker }
182*61046927SAndroid Build Coastguard Worker if (err != EGL_SUCCESS)
183*61046927SAndroid Build Coastguard Worker break;
184*61046927SAndroid Build Coastguard Worker surf->VGColorspace = val;
185*61046927SAndroid Build Coastguard Worker break;
186*61046927SAndroid Build Coastguard Worker case EGL_VG_ALPHA_FORMAT:
187*61046927SAndroid Build Coastguard Worker switch (val) {
188*61046927SAndroid Build Coastguard Worker case EGL_VG_ALPHA_FORMAT_NONPRE:
189*61046927SAndroid Build Coastguard Worker case EGL_VG_ALPHA_FORMAT_PRE:
190*61046927SAndroid Build Coastguard Worker break;
191*61046927SAndroid Build Coastguard Worker default:
192*61046927SAndroid Build Coastguard Worker err = EGL_BAD_ATTRIBUTE;
193*61046927SAndroid Build Coastguard Worker break;
194*61046927SAndroid Build Coastguard Worker }
195*61046927SAndroid Build Coastguard Worker if (err != EGL_SUCCESS)
196*61046927SAndroid Build Coastguard Worker break;
197*61046927SAndroid Build Coastguard Worker surf->VGAlphaFormat = val;
198*61046927SAndroid Build Coastguard Worker break;
199*61046927SAndroid Build Coastguard Worker /* window surface attributes */
200*61046927SAndroid Build Coastguard Worker case EGL_RENDER_BUFFER:
201*61046927SAndroid Build Coastguard Worker if (type != EGL_WINDOW_BIT) {
202*61046927SAndroid Build Coastguard Worker err = EGL_BAD_ATTRIBUTE;
203*61046927SAndroid Build Coastguard Worker break;
204*61046927SAndroid Build Coastguard Worker }
205*61046927SAndroid Build Coastguard Worker if (val != EGL_BACK_BUFFER && val != EGL_SINGLE_BUFFER) {
206*61046927SAndroid Build Coastguard Worker err = EGL_BAD_ATTRIBUTE;
207*61046927SAndroid Build Coastguard Worker break;
208*61046927SAndroid Build Coastguard Worker }
209*61046927SAndroid Build Coastguard Worker surf->RequestedRenderBuffer = val;
210*61046927SAndroid Build Coastguard Worker if (surf->Config->SurfaceType & EGL_MUTABLE_RENDER_BUFFER_BIT_KHR) {
211*61046927SAndroid Build Coastguard Worker /* Unlike normal EGLSurfaces, one with a mutable render buffer
212*61046927SAndroid Build Coastguard Worker * uses the application-chosen render buffer.
213*61046927SAndroid Build Coastguard Worker */
214*61046927SAndroid Build Coastguard Worker surf->ActiveRenderBuffer = val;
215*61046927SAndroid Build Coastguard Worker }
216*61046927SAndroid Build Coastguard Worker break;
217*61046927SAndroid Build Coastguard Worker case EGL_PRESENT_OPAQUE_EXT:
218*61046927SAndroid Build Coastguard Worker if (!disp->Extensions.EXT_present_opaque) {
219*61046927SAndroid Build Coastguard Worker err = EGL_BAD_ATTRIBUTE;
220*61046927SAndroid Build Coastguard Worker break;
221*61046927SAndroid Build Coastguard Worker }
222*61046927SAndroid Build Coastguard Worker if (type != EGL_WINDOW_BIT) {
223*61046927SAndroid Build Coastguard Worker err = EGL_BAD_ATTRIBUTE;
224*61046927SAndroid Build Coastguard Worker break;
225*61046927SAndroid Build Coastguard Worker }
226*61046927SAndroid Build Coastguard Worker if (val != EGL_TRUE && val != EGL_FALSE) {
227*61046927SAndroid Build Coastguard Worker err = EGL_BAD_PARAMETER;
228*61046927SAndroid Build Coastguard Worker break;
229*61046927SAndroid Build Coastguard Worker }
230*61046927SAndroid Build Coastguard Worker surf->PresentOpaque = val;
231*61046927SAndroid Build Coastguard Worker break;
232*61046927SAndroid Build Coastguard Worker case EGL_POST_SUB_BUFFER_SUPPORTED_NV:
233*61046927SAndroid Build Coastguard Worker if (!disp->Extensions.NV_post_sub_buffer || type != EGL_WINDOW_BIT) {
234*61046927SAndroid Build Coastguard Worker err = EGL_BAD_ATTRIBUTE;
235*61046927SAndroid Build Coastguard Worker break;
236*61046927SAndroid Build Coastguard Worker }
237*61046927SAndroid Build Coastguard Worker if (val != EGL_TRUE && val != EGL_FALSE) {
238*61046927SAndroid Build Coastguard Worker err = EGL_BAD_PARAMETER;
239*61046927SAndroid Build Coastguard Worker break;
240*61046927SAndroid Build Coastguard Worker }
241*61046927SAndroid Build Coastguard Worker surf->PostSubBufferSupportedNV = val;
242*61046927SAndroid Build Coastguard Worker break;
243*61046927SAndroid Build Coastguard Worker case EGL_SURFACE_COMPRESSION_EXT:
244*61046927SAndroid Build Coastguard Worker if (type != EGL_WINDOW_BIT) {
245*61046927SAndroid Build Coastguard Worker err = EGL_BAD_ATTRIBUTE;
246*61046927SAndroid Build Coastguard Worker break;
247*61046927SAndroid Build Coastguard Worker }
248*61046927SAndroid Build Coastguard Worker if (val < EGL_SURFACE_COMPRESSION_FIXED_RATE_NONE_EXT ||
249*61046927SAndroid Build Coastguard Worker val > EGL_SURFACE_COMPRESSION_FIXED_RATE_12BPC_EXT) {
250*61046927SAndroid Build Coastguard Worker err = EGL_BAD_PARAMETER;
251*61046927SAndroid Build Coastguard Worker break;
252*61046927SAndroid Build Coastguard Worker }
253*61046927SAndroid Build Coastguard Worker surf->CompressionRate = val;
254*61046927SAndroid Build Coastguard Worker break;
255*61046927SAndroid Build Coastguard Worker /* pbuffer surface attributes */
256*61046927SAndroid Build Coastguard Worker case EGL_WIDTH:
257*61046927SAndroid Build Coastguard Worker if (type != EGL_PBUFFER_BIT) {
258*61046927SAndroid Build Coastguard Worker err = EGL_BAD_ATTRIBUTE;
259*61046927SAndroid Build Coastguard Worker break;
260*61046927SAndroid Build Coastguard Worker }
261*61046927SAndroid Build Coastguard Worker if (val < 0) {
262*61046927SAndroid Build Coastguard Worker err = EGL_BAD_PARAMETER;
263*61046927SAndroid Build Coastguard Worker break;
264*61046927SAndroid Build Coastguard Worker }
265*61046927SAndroid Build Coastguard Worker surf->Width = val;
266*61046927SAndroid Build Coastguard Worker break;
267*61046927SAndroid Build Coastguard Worker case EGL_HEIGHT:
268*61046927SAndroid Build Coastguard Worker if (type != EGL_PBUFFER_BIT) {
269*61046927SAndroid Build Coastguard Worker err = EGL_BAD_ATTRIBUTE;
270*61046927SAndroid Build Coastguard Worker break;
271*61046927SAndroid Build Coastguard Worker }
272*61046927SAndroid Build Coastguard Worker if (val < 0) {
273*61046927SAndroid Build Coastguard Worker err = EGL_BAD_PARAMETER;
274*61046927SAndroid Build Coastguard Worker break;
275*61046927SAndroid Build Coastguard Worker }
276*61046927SAndroid Build Coastguard Worker surf->Height = val;
277*61046927SAndroid Build Coastguard Worker break;
278*61046927SAndroid Build Coastguard Worker case EGL_LARGEST_PBUFFER:
279*61046927SAndroid Build Coastguard Worker if (type != EGL_PBUFFER_BIT) {
280*61046927SAndroid Build Coastguard Worker err = EGL_BAD_ATTRIBUTE;
281*61046927SAndroid Build Coastguard Worker break;
282*61046927SAndroid Build Coastguard Worker }
283*61046927SAndroid Build Coastguard Worker surf->LargestPbuffer = !!val;
284*61046927SAndroid Build Coastguard Worker break;
285*61046927SAndroid Build Coastguard Worker /* for eglBindTexImage */
286*61046927SAndroid Build Coastguard Worker case EGL_TEXTURE_FORMAT:
287*61046927SAndroid Build Coastguard Worker if (!(type & texture_type)) {
288*61046927SAndroid Build Coastguard Worker err = EGL_BAD_ATTRIBUTE;
289*61046927SAndroid Build Coastguard Worker break;
290*61046927SAndroid Build Coastguard Worker }
291*61046927SAndroid Build Coastguard Worker
292*61046927SAndroid Build Coastguard Worker switch (val) {
293*61046927SAndroid Build Coastguard Worker case EGL_TEXTURE_RGB:
294*61046927SAndroid Build Coastguard Worker case EGL_TEXTURE_RGBA:
295*61046927SAndroid Build Coastguard Worker case EGL_NO_TEXTURE:
296*61046927SAndroid Build Coastguard Worker break;
297*61046927SAndroid Build Coastguard Worker default:
298*61046927SAndroid Build Coastguard Worker err = EGL_BAD_ATTRIBUTE;
299*61046927SAndroid Build Coastguard Worker break;
300*61046927SAndroid Build Coastguard Worker }
301*61046927SAndroid Build Coastguard Worker if (err != EGL_SUCCESS)
302*61046927SAndroid Build Coastguard Worker break;
303*61046927SAndroid Build Coastguard Worker surf->TextureFormat = val;
304*61046927SAndroid Build Coastguard Worker break;
305*61046927SAndroid Build Coastguard Worker case EGL_TEXTURE_TARGET:
306*61046927SAndroid Build Coastguard Worker if (!(type & texture_type)) {
307*61046927SAndroid Build Coastguard Worker err = EGL_BAD_ATTRIBUTE;
308*61046927SAndroid Build Coastguard Worker break;
309*61046927SAndroid Build Coastguard Worker }
310*61046927SAndroid Build Coastguard Worker
311*61046927SAndroid Build Coastguard Worker switch (val) {
312*61046927SAndroid Build Coastguard Worker case EGL_TEXTURE_2D:
313*61046927SAndroid Build Coastguard Worker case EGL_NO_TEXTURE:
314*61046927SAndroid Build Coastguard Worker break;
315*61046927SAndroid Build Coastguard Worker default:
316*61046927SAndroid Build Coastguard Worker err = EGL_BAD_ATTRIBUTE;
317*61046927SAndroid Build Coastguard Worker break;
318*61046927SAndroid Build Coastguard Worker }
319*61046927SAndroid Build Coastguard Worker if (err != EGL_SUCCESS)
320*61046927SAndroid Build Coastguard Worker break;
321*61046927SAndroid Build Coastguard Worker surf->TextureTarget = val;
322*61046927SAndroid Build Coastguard Worker break;
323*61046927SAndroid Build Coastguard Worker case EGL_MIPMAP_TEXTURE:
324*61046927SAndroid Build Coastguard Worker if (!(type & texture_type)) {
325*61046927SAndroid Build Coastguard Worker err = EGL_BAD_ATTRIBUTE;
326*61046927SAndroid Build Coastguard Worker break;
327*61046927SAndroid Build Coastguard Worker }
328*61046927SAndroid Build Coastguard Worker surf->MipmapTexture = !!val;
329*61046927SAndroid Build Coastguard Worker break;
330*61046927SAndroid Build Coastguard Worker case EGL_PROTECTED_CONTENT_EXT:
331*61046927SAndroid Build Coastguard Worker if (!disp->Extensions.EXT_protected_content &&
332*61046927SAndroid Build Coastguard Worker !disp->Extensions.EXT_protected_surface) {
333*61046927SAndroid Build Coastguard Worker err = EGL_BAD_ATTRIBUTE;
334*61046927SAndroid Build Coastguard Worker break;
335*61046927SAndroid Build Coastguard Worker }
336*61046927SAndroid Build Coastguard Worker surf->ProtectedContent = val;
337*61046927SAndroid Build Coastguard Worker break;
338*61046927SAndroid Build Coastguard Worker
339*61046927SAndroid Build Coastguard Worker /* no pixmap surface specific attributes */
340*61046927SAndroid Build Coastguard Worker default:
341*61046927SAndroid Build Coastguard Worker err = EGL_BAD_ATTRIBUTE;
342*61046927SAndroid Build Coastguard Worker break;
343*61046927SAndroid Build Coastguard Worker }
344*61046927SAndroid Build Coastguard Worker
345*61046927SAndroid Build Coastguard Worker if (err != EGL_SUCCESS)
346*61046927SAndroid Build Coastguard Worker break;
347*61046927SAndroid Build Coastguard Worker }
348*61046927SAndroid Build Coastguard Worker
349*61046927SAndroid Build Coastguard Worker if (err == EGL_SUCCESS && type == EGL_PBUFFER_BIT) {
350*61046927SAndroid Build Coastguard Worker if ((surf->TextureTarget == EGL_NO_TEXTURE &&
351*61046927SAndroid Build Coastguard Worker surf->TextureFormat != EGL_NO_TEXTURE) ||
352*61046927SAndroid Build Coastguard Worker (surf->TextureFormat == EGL_NO_TEXTURE &&
353*61046927SAndroid Build Coastguard Worker surf->TextureTarget != EGL_NO_TEXTURE)) {
354*61046927SAndroid Build Coastguard Worker attr = surf->TextureTarget == EGL_NO_TEXTURE ? EGL_TEXTURE_TARGET
355*61046927SAndroid Build Coastguard Worker : EGL_TEXTURE_FORMAT;
356*61046927SAndroid Build Coastguard Worker err = EGL_BAD_MATCH;
357*61046927SAndroid Build Coastguard Worker }
358*61046927SAndroid Build Coastguard Worker }
359*61046927SAndroid Build Coastguard Worker
360*61046927SAndroid Build Coastguard Worker if (err != EGL_SUCCESS)
361*61046927SAndroid Build Coastguard Worker _eglLog(_EGL_WARNING, "bad surface attribute 0x%04x", attr);
362*61046927SAndroid Build Coastguard Worker
363*61046927SAndroid Build Coastguard Worker return err;
364*61046927SAndroid Build Coastguard Worker }
365*61046927SAndroid Build Coastguard Worker
366*61046927SAndroid Build Coastguard Worker /**
367*61046927SAndroid Build Coastguard Worker * Do error check on parameters and initialize the given _EGLSurface object.
368*61046927SAndroid Build Coastguard Worker * \return EGL_TRUE if no errors, EGL_FALSE otherwise.
369*61046927SAndroid Build Coastguard Worker */
370*61046927SAndroid Build Coastguard Worker EGLBoolean
_eglInitSurface(_EGLSurface * surf,_EGLDisplay * disp,EGLint type,_EGLConfig * conf,const EGLint * attrib_list,void * native_surface)371*61046927SAndroid Build Coastguard Worker _eglInitSurface(_EGLSurface *surf, _EGLDisplay *disp, EGLint type,
372*61046927SAndroid Build Coastguard Worker _EGLConfig *conf, const EGLint *attrib_list,
373*61046927SAndroid Build Coastguard Worker void *native_surface)
374*61046927SAndroid Build Coastguard Worker {
375*61046927SAndroid Build Coastguard Worker const char *func;
376*61046927SAndroid Build Coastguard Worker EGLint renderBuffer = EGL_BACK_BUFFER;
377*61046927SAndroid Build Coastguard Worker EGLint swapBehavior = EGL_BUFFER_DESTROYED;
378*61046927SAndroid Build Coastguard Worker EGLint err;
379*61046927SAndroid Build Coastguard Worker
380*61046927SAndroid Build Coastguard Worker /* Swap behavior can be preserved only if config supports this. */
381*61046927SAndroid Build Coastguard Worker if (conf->SurfaceType & EGL_SWAP_BEHAVIOR_PRESERVED_BIT)
382*61046927SAndroid Build Coastguard Worker swapBehavior = EGL_BUFFER_PRESERVED;
383*61046927SAndroid Build Coastguard Worker
384*61046927SAndroid Build Coastguard Worker switch (type) {
385*61046927SAndroid Build Coastguard Worker case EGL_WINDOW_BIT:
386*61046927SAndroid Build Coastguard Worker func = "eglCreateWindowSurface";
387*61046927SAndroid Build Coastguard Worker swapBehavior = EGL_BUFFER_DESTROYED;
388*61046927SAndroid Build Coastguard Worker break;
389*61046927SAndroid Build Coastguard Worker case EGL_PIXMAP_BIT:
390*61046927SAndroid Build Coastguard Worker func = "eglCreatePixmapSurface";
391*61046927SAndroid Build Coastguard Worker renderBuffer = EGL_SINGLE_BUFFER;
392*61046927SAndroid Build Coastguard Worker break;
393*61046927SAndroid Build Coastguard Worker case EGL_PBUFFER_BIT:
394*61046927SAndroid Build Coastguard Worker func = "eglCreatePBufferSurface";
395*61046927SAndroid Build Coastguard Worker break;
396*61046927SAndroid Build Coastguard Worker default:
397*61046927SAndroid Build Coastguard Worker _eglLog(_EGL_WARNING, "Bad type in _eglInitSurface");
398*61046927SAndroid Build Coastguard Worker return EGL_FALSE;
399*61046927SAndroid Build Coastguard Worker }
400*61046927SAndroid Build Coastguard Worker
401*61046927SAndroid Build Coastguard Worker if ((conf->SurfaceType & type) == 0)
402*61046927SAndroid Build Coastguard Worker /* The config can't be used to create a surface of this type */
403*61046927SAndroid Build Coastguard Worker return _eglError(EGL_BAD_MATCH, func);
404*61046927SAndroid Build Coastguard Worker
405*61046927SAndroid Build Coastguard Worker _eglInitResource(&surf->Resource, sizeof(*surf), disp);
406*61046927SAndroid Build Coastguard Worker surf->Type = type;
407*61046927SAndroid Build Coastguard Worker surf->Config = conf;
408*61046927SAndroid Build Coastguard Worker surf->Lost = EGL_FALSE;
409*61046927SAndroid Build Coastguard Worker
410*61046927SAndroid Build Coastguard Worker surf->Width = 0;
411*61046927SAndroid Build Coastguard Worker surf->Height = 0;
412*61046927SAndroid Build Coastguard Worker surf->TextureFormat = EGL_NO_TEXTURE;
413*61046927SAndroid Build Coastguard Worker surf->TextureTarget = EGL_NO_TEXTURE;
414*61046927SAndroid Build Coastguard Worker surf->MipmapTexture = EGL_FALSE;
415*61046927SAndroid Build Coastguard Worker surf->LargestPbuffer = EGL_FALSE;
416*61046927SAndroid Build Coastguard Worker surf->RequestedRenderBuffer = renderBuffer;
417*61046927SAndroid Build Coastguard Worker surf->ActiveRenderBuffer = renderBuffer;
418*61046927SAndroid Build Coastguard Worker surf->VGAlphaFormat = EGL_VG_ALPHA_FORMAT_NONPRE;
419*61046927SAndroid Build Coastguard Worker surf->VGColorspace = EGL_VG_COLORSPACE_sRGB;
420*61046927SAndroid Build Coastguard Worker surf->GLColorspace = EGL_GL_COLORSPACE_LINEAR_KHR;
421*61046927SAndroid Build Coastguard Worker surf->ProtectedContent = EGL_FALSE;
422*61046927SAndroid Build Coastguard Worker surf->PresentOpaque = EGL_FALSE;
423*61046927SAndroid Build Coastguard Worker surf->CompressionRate = EGL_SURFACE_COMPRESSION_FIXED_RATE_NONE_EXT;
424*61046927SAndroid Build Coastguard Worker
425*61046927SAndroid Build Coastguard Worker surf->MipmapLevel = 0;
426*61046927SAndroid Build Coastguard Worker surf->MultisampleResolve = EGL_MULTISAMPLE_RESOLVE_DEFAULT;
427*61046927SAndroid Build Coastguard Worker surf->SwapBehavior = swapBehavior;
428*61046927SAndroid Build Coastguard Worker
429*61046927SAndroid Build Coastguard Worker surf->HorizontalResolution = EGL_UNKNOWN;
430*61046927SAndroid Build Coastguard Worker surf->VerticalResolution = EGL_UNKNOWN;
431*61046927SAndroid Build Coastguard Worker surf->AspectRatio = EGL_UNKNOWN;
432*61046927SAndroid Build Coastguard Worker
433*61046927SAndroid Build Coastguard Worker surf->PostSubBufferSupportedNV = EGL_FALSE;
434*61046927SAndroid Build Coastguard Worker surf->SetDamageRegionCalled = EGL_FALSE;
435*61046927SAndroid Build Coastguard Worker surf->BufferAgeRead = EGL_FALSE;
436*61046927SAndroid Build Coastguard Worker
437*61046927SAndroid Build Coastguard Worker /* the default swap interval is 1 */
438*61046927SAndroid Build Coastguard Worker surf->SwapInterval = 1;
439*61046927SAndroid Build Coastguard Worker
440*61046927SAndroid Build Coastguard Worker surf->HdrMetadata.display_primary_r.x = EGL_DONT_CARE;
441*61046927SAndroid Build Coastguard Worker surf->HdrMetadata.display_primary_r.y = EGL_DONT_CARE;
442*61046927SAndroid Build Coastguard Worker surf->HdrMetadata.display_primary_g.x = EGL_DONT_CARE;
443*61046927SAndroid Build Coastguard Worker surf->HdrMetadata.display_primary_g.y = EGL_DONT_CARE;
444*61046927SAndroid Build Coastguard Worker surf->HdrMetadata.display_primary_b.x = EGL_DONT_CARE;
445*61046927SAndroid Build Coastguard Worker surf->HdrMetadata.display_primary_b.y = EGL_DONT_CARE;
446*61046927SAndroid Build Coastguard Worker surf->HdrMetadata.white_point.x = EGL_DONT_CARE;
447*61046927SAndroid Build Coastguard Worker surf->HdrMetadata.white_point.y = EGL_DONT_CARE;
448*61046927SAndroid Build Coastguard Worker surf->HdrMetadata.max_luminance = EGL_DONT_CARE;
449*61046927SAndroid Build Coastguard Worker surf->HdrMetadata.min_luminance = EGL_DONT_CARE;
450*61046927SAndroid Build Coastguard Worker surf->HdrMetadata.max_cll = EGL_DONT_CARE;
451*61046927SAndroid Build Coastguard Worker surf->HdrMetadata.max_fall = EGL_DONT_CARE;
452*61046927SAndroid Build Coastguard Worker
453*61046927SAndroid Build Coastguard Worker err = _eglParseSurfaceAttribList(surf, attrib_list);
454*61046927SAndroid Build Coastguard Worker if (err != EGL_SUCCESS)
455*61046927SAndroid Build Coastguard Worker return _eglError(err, func);
456*61046927SAndroid Build Coastguard Worker
457*61046927SAndroid Build Coastguard Worker /* if EGL_LARGEST_PBUFFER in use, clamp width and height */
458*61046927SAndroid Build Coastguard Worker if (surf->LargestPbuffer) {
459*61046927SAndroid Build Coastguard Worker surf->Width = MIN2(surf->Width, _EGL_MAX_PBUFFER_WIDTH);
460*61046927SAndroid Build Coastguard Worker surf->Height = MIN2(surf->Height, _EGL_MAX_PBUFFER_HEIGHT);
461*61046927SAndroid Build Coastguard Worker }
462*61046927SAndroid Build Coastguard Worker
463*61046927SAndroid Build Coastguard Worker surf->NativeSurface = native_surface;
464*61046927SAndroid Build Coastguard Worker
465*61046927SAndroid Build Coastguard Worker return EGL_TRUE;
466*61046927SAndroid Build Coastguard Worker }
467*61046927SAndroid Build Coastguard Worker
468*61046927SAndroid Build Coastguard Worker EGLBoolean
_eglQuerySurface(_EGLDisplay * disp,_EGLSurface * surface,EGLint attribute,EGLint * value)469*61046927SAndroid Build Coastguard Worker _eglQuerySurface(_EGLDisplay *disp, _EGLSurface *surface, EGLint attribute,
470*61046927SAndroid Build Coastguard Worker EGLint *value)
471*61046927SAndroid Build Coastguard Worker {
472*61046927SAndroid Build Coastguard Worker switch (attribute) {
473*61046927SAndroid Build Coastguard Worker case EGL_WIDTH:
474*61046927SAndroid Build Coastguard Worker *value = surface->Width;
475*61046927SAndroid Build Coastguard Worker break;
476*61046927SAndroid Build Coastguard Worker case EGL_HEIGHT:
477*61046927SAndroid Build Coastguard Worker *value = surface->Height;
478*61046927SAndroid Build Coastguard Worker break;
479*61046927SAndroid Build Coastguard Worker case EGL_CONFIG_ID:
480*61046927SAndroid Build Coastguard Worker *value = surface->Config->ConfigID;
481*61046927SAndroid Build Coastguard Worker break;
482*61046927SAndroid Build Coastguard Worker case EGL_LARGEST_PBUFFER:
483*61046927SAndroid Build Coastguard Worker if (surface->Type == EGL_PBUFFER_BIT)
484*61046927SAndroid Build Coastguard Worker *value = surface->LargestPbuffer;
485*61046927SAndroid Build Coastguard Worker break;
486*61046927SAndroid Build Coastguard Worker case EGL_TEXTURE_FORMAT:
487*61046927SAndroid Build Coastguard Worker /* texture attributes: only for pbuffers, no error otherwise */
488*61046927SAndroid Build Coastguard Worker if (surface->Type == EGL_PBUFFER_BIT)
489*61046927SAndroid Build Coastguard Worker *value = surface->TextureFormat;
490*61046927SAndroid Build Coastguard Worker break;
491*61046927SAndroid Build Coastguard Worker case EGL_TEXTURE_TARGET:
492*61046927SAndroid Build Coastguard Worker if (surface->Type == EGL_PBUFFER_BIT)
493*61046927SAndroid Build Coastguard Worker *value = surface->TextureTarget;
494*61046927SAndroid Build Coastguard Worker break;
495*61046927SAndroid Build Coastguard Worker case EGL_MIPMAP_TEXTURE:
496*61046927SAndroid Build Coastguard Worker if (surface->Type == EGL_PBUFFER_BIT)
497*61046927SAndroid Build Coastguard Worker *value = surface->MipmapTexture;
498*61046927SAndroid Build Coastguard Worker break;
499*61046927SAndroid Build Coastguard Worker case EGL_MIPMAP_LEVEL:
500*61046927SAndroid Build Coastguard Worker if (surface->Type == EGL_PBUFFER_BIT)
501*61046927SAndroid Build Coastguard Worker *value = surface->MipmapLevel;
502*61046927SAndroid Build Coastguard Worker break;
503*61046927SAndroid Build Coastguard Worker case EGL_SWAP_BEHAVIOR:
504*61046927SAndroid Build Coastguard Worker *value = surface->SwapBehavior;
505*61046927SAndroid Build Coastguard Worker break;
506*61046927SAndroid Build Coastguard Worker case EGL_RENDER_BUFFER:
507*61046927SAndroid Build Coastguard Worker /* From the EGL_KHR_mutable_render_buffer spec (v12):
508*61046927SAndroid Build Coastguard Worker *
509*61046927SAndroid Build Coastguard Worker * Querying EGL_RENDER_BUFFER returns the buffer which client API
510*61046927SAndroid Build Coastguard Worker * rendering is requested to use. For a window surface, this is the
511*61046927SAndroid Build Coastguard Worker * attribute value specified when the surface was created or last set
512*61046927SAndroid Build Coastguard Worker * via eglSurfaceAttrib.
513*61046927SAndroid Build Coastguard Worker *
514*61046927SAndroid Build Coastguard Worker * In other words, querying a window surface returns the value most
515*61046927SAndroid Build Coastguard Worker * recently *requested* by the user.
516*61046927SAndroid Build Coastguard Worker *
517*61046927SAndroid Build Coastguard Worker * The paragraph continues in the EGL 1.5 spec (2014.08.27):
518*61046927SAndroid Build Coastguard Worker *
519*61046927SAndroid Build Coastguard Worker * For a pbuffer surface, it is always EGL_BACK_BUFFER . For a pixmap
520*61046927SAndroid Build Coastguard Worker * surface, it is always EGL_SINGLE_BUFFER . To determine the actual
521*61046927SAndroid Build Coastguard Worker * buffer being rendered to by a context, call eglQueryContext.
522*61046927SAndroid Build Coastguard Worker */
523*61046927SAndroid Build Coastguard Worker switch (surface->Type) {
524*61046927SAndroid Build Coastguard Worker default:
525*61046927SAndroid Build Coastguard Worker unreachable("bad EGLSurface type");
526*61046927SAndroid Build Coastguard Worker case EGL_WINDOW_BIT:
527*61046927SAndroid Build Coastguard Worker *value = surface->RequestedRenderBuffer;
528*61046927SAndroid Build Coastguard Worker break;
529*61046927SAndroid Build Coastguard Worker case EGL_PBUFFER_BIT:
530*61046927SAndroid Build Coastguard Worker *value = EGL_BACK_BUFFER;
531*61046927SAndroid Build Coastguard Worker break;
532*61046927SAndroid Build Coastguard Worker case EGL_PIXMAP_BIT:
533*61046927SAndroid Build Coastguard Worker *value = EGL_SINGLE_BUFFER;
534*61046927SAndroid Build Coastguard Worker break;
535*61046927SAndroid Build Coastguard Worker }
536*61046927SAndroid Build Coastguard Worker break;
537*61046927SAndroid Build Coastguard Worker case EGL_PIXEL_ASPECT_RATIO:
538*61046927SAndroid Build Coastguard Worker *value = surface->AspectRatio;
539*61046927SAndroid Build Coastguard Worker break;
540*61046927SAndroid Build Coastguard Worker case EGL_HORIZONTAL_RESOLUTION:
541*61046927SAndroid Build Coastguard Worker *value = surface->HorizontalResolution;
542*61046927SAndroid Build Coastguard Worker break;
543*61046927SAndroid Build Coastguard Worker case EGL_VERTICAL_RESOLUTION:
544*61046927SAndroid Build Coastguard Worker *value = surface->VerticalResolution;
545*61046927SAndroid Build Coastguard Worker break;
546*61046927SAndroid Build Coastguard Worker case EGL_MULTISAMPLE_RESOLVE:
547*61046927SAndroid Build Coastguard Worker *value = surface->MultisampleResolve;
548*61046927SAndroid Build Coastguard Worker break;
549*61046927SAndroid Build Coastguard Worker case EGL_VG_ALPHA_FORMAT:
550*61046927SAndroid Build Coastguard Worker *value = surface->VGAlphaFormat;
551*61046927SAndroid Build Coastguard Worker break;
552*61046927SAndroid Build Coastguard Worker case EGL_VG_COLORSPACE:
553*61046927SAndroid Build Coastguard Worker *value = surface->VGColorspace;
554*61046927SAndroid Build Coastguard Worker break;
555*61046927SAndroid Build Coastguard Worker case EGL_GL_COLORSPACE_KHR:
556*61046927SAndroid Build Coastguard Worker if (!disp->Extensions.KHR_gl_colorspace)
557*61046927SAndroid Build Coastguard Worker return _eglError(EGL_BAD_ATTRIBUTE, "eglQuerySurface");
558*61046927SAndroid Build Coastguard Worker
559*61046927SAndroid Build Coastguard Worker *value = surface->GLColorspace;
560*61046927SAndroid Build Coastguard Worker break;
561*61046927SAndroid Build Coastguard Worker case EGL_POST_SUB_BUFFER_SUPPORTED_NV:
562*61046927SAndroid Build Coastguard Worker *value = surface->PostSubBufferSupportedNV;
563*61046927SAndroid Build Coastguard Worker break;
564*61046927SAndroid Build Coastguard Worker case EGL_BUFFER_AGE_EXT:
565*61046927SAndroid Build Coastguard Worker /* Both EXT_buffer_age and KHR_partial_update accept EGL_BUFFER_AGE_EXT.
566*61046927SAndroid Build Coastguard Worker * To be precise, the KHR one accepts EGL_BUFFER_AGE_KHR which is an
567*61046927SAndroid Build Coastguard Worker * alias with the same numeric value.
568*61046927SAndroid Build Coastguard Worker */
569*61046927SAndroid Build Coastguard Worker if (!disp->Extensions.EXT_buffer_age &&
570*61046927SAndroid Build Coastguard Worker !disp->Extensions.KHR_partial_update)
571*61046927SAndroid Build Coastguard Worker return _eglError(EGL_BAD_ATTRIBUTE, "eglQuerySurface");
572*61046927SAndroid Build Coastguard Worker
573*61046927SAndroid Build Coastguard Worker _EGLContext *ctx = _eglGetCurrentContext();
574*61046927SAndroid Build Coastguard Worker if (_eglGetContextHandle(ctx) == EGL_NO_CONTEXT ||
575*61046927SAndroid Build Coastguard Worker ctx->DrawSurface != surface)
576*61046927SAndroid Build Coastguard Worker return _eglError(EGL_BAD_SURFACE, "eglQuerySurface");
577*61046927SAndroid Build Coastguard Worker
578*61046927SAndroid Build Coastguard Worker EGLint result = disp->Driver->QueryBufferAge(disp, surface);
579*61046927SAndroid Build Coastguard Worker if (result < 0)
580*61046927SAndroid Build Coastguard Worker return EGL_FALSE;
581*61046927SAndroid Build Coastguard Worker
582*61046927SAndroid Build Coastguard Worker if (disp->Options.GalliumHudWarn && result > 0) {
583*61046927SAndroid Build Coastguard Worker _eglLog(_EGL_WARNING,
584*61046927SAndroid Build Coastguard Worker "GALLIUM_HUD is not accounted for when querying "
585*61046927SAndroid Build Coastguard Worker "buffer age, possibly causing artifacts, try running with "
586*61046927SAndroid Build Coastguard Worker "MESA_EXTENSION_OVERRIDE=\"-EGL_EXT_buffer_age "
587*61046927SAndroid Build Coastguard Worker "-EGL_KHR_partial_update\"");
588*61046927SAndroid Build Coastguard Worker disp->Options.GalliumHudWarn = EGL_FALSE;
589*61046927SAndroid Build Coastguard Worker }
590*61046927SAndroid Build Coastguard Worker
591*61046927SAndroid Build Coastguard Worker *value = result;
592*61046927SAndroid Build Coastguard Worker surface->BufferAgeRead = EGL_TRUE;
593*61046927SAndroid Build Coastguard Worker break;
594*61046927SAndroid Build Coastguard Worker case EGL_SMPTE2086_DISPLAY_PRIMARY_RX_EXT:
595*61046927SAndroid Build Coastguard Worker *value = surface->HdrMetadata.display_primary_r.x;
596*61046927SAndroid Build Coastguard Worker break;
597*61046927SAndroid Build Coastguard Worker case EGL_SMPTE2086_DISPLAY_PRIMARY_RY_EXT:
598*61046927SAndroid Build Coastguard Worker *value = surface->HdrMetadata.display_primary_r.y;
599*61046927SAndroid Build Coastguard Worker break;
600*61046927SAndroid Build Coastguard Worker case EGL_SMPTE2086_DISPLAY_PRIMARY_GX_EXT:
601*61046927SAndroid Build Coastguard Worker *value = surface->HdrMetadata.display_primary_g.x;
602*61046927SAndroid Build Coastguard Worker break;
603*61046927SAndroid Build Coastguard Worker case EGL_SMPTE2086_DISPLAY_PRIMARY_GY_EXT:
604*61046927SAndroid Build Coastguard Worker *value = surface->HdrMetadata.display_primary_g.y;
605*61046927SAndroid Build Coastguard Worker break;
606*61046927SAndroid Build Coastguard Worker case EGL_SMPTE2086_DISPLAY_PRIMARY_BX_EXT:
607*61046927SAndroid Build Coastguard Worker *value = surface->HdrMetadata.display_primary_b.x;
608*61046927SAndroid Build Coastguard Worker break;
609*61046927SAndroid Build Coastguard Worker case EGL_SMPTE2086_DISPLAY_PRIMARY_BY_EXT:
610*61046927SAndroid Build Coastguard Worker *value = surface->HdrMetadata.display_primary_b.y;
611*61046927SAndroid Build Coastguard Worker break;
612*61046927SAndroid Build Coastguard Worker case EGL_SMPTE2086_WHITE_POINT_X_EXT:
613*61046927SAndroid Build Coastguard Worker *value = surface->HdrMetadata.white_point.x;
614*61046927SAndroid Build Coastguard Worker break;
615*61046927SAndroid Build Coastguard Worker case EGL_SMPTE2086_WHITE_POINT_Y_EXT:
616*61046927SAndroid Build Coastguard Worker *value = surface->HdrMetadata.white_point.y;
617*61046927SAndroid Build Coastguard Worker break;
618*61046927SAndroid Build Coastguard Worker case EGL_SMPTE2086_MAX_LUMINANCE_EXT:
619*61046927SAndroid Build Coastguard Worker *value = surface->HdrMetadata.max_luminance;
620*61046927SAndroid Build Coastguard Worker break;
621*61046927SAndroid Build Coastguard Worker case EGL_SMPTE2086_MIN_LUMINANCE_EXT:
622*61046927SAndroid Build Coastguard Worker *value = surface->HdrMetadata.min_luminance;
623*61046927SAndroid Build Coastguard Worker break;
624*61046927SAndroid Build Coastguard Worker case EGL_CTA861_3_MAX_CONTENT_LIGHT_LEVEL_EXT:
625*61046927SAndroid Build Coastguard Worker *value = surface->HdrMetadata.max_cll;
626*61046927SAndroid Build Coastguard Worker break;
627*61046927SAndroid Build Coastguard Worker case EGL_CTA861_3_MAX_FRAME_AVERAGE_LEVEL_EXT:
628*61046927SAndroid Build Coastguard Worker *value = surface->HdrMetadata.max_fall;
629*61046927SAndroid Build Coastguard Worker break;
630*61046927SAndroid Build Coastguard Worker case EGL_PROTECTED_CONTENT_EXT:
631*61046927SAndroid Build Coastguard Worker if (!disp->Extensions.EXT_protected_content &&
632*61046927SAndroid Build Coastguard Worker !disp->Extensions.EXT_protected_surface)
633*61046927SAndroid Build Coastguard Worker return _eglError(EGL_BAD_ATTRIBUTE, "eglQuerySurface");
634*61046927SAndroid Build Coastguard Worker *value = surface->ProtectedContent;
635*61046927SAndroid Build Coastguard Worker break;
636*61046927SAndroid Build Coastguard Worker case EGL_PRESENT_OPAQUE_EXT:
637*61046927SAndroid Build Coastguard Worker if (!disp->Extensions.EXT_present_opaque)
638*61046927SAndroid Build Coastguard Worker return _eglError(EGL_BAD_ATTRIBUTE, "eglQuerySurface");
639*61046927SAndroid Build Coastguard Worker *value = surface->PresentOpaque;
640*61046927SAndroid Build Coastguard Worker break;
641*61046927SAndroid Build Coastguard Worker case EGL_SURFACE_COMPRESSION_EXT:
642*61046927SAndroid Build Coastguard Worker *value = surface->CompressionRate;
643*61046927SAndroid Build Coastguard Worker break;
644*61046927SAndroid Build Coastguard Worker default:
645*61046927SAndroid Build Coastguard Worker return _eglError(EGL_BAD_ATTRIBUTE, "eglQuerySurface");
646*61046927SAndroid Build Coastguard Worker }
647*61046927SAndroid Build Coastguard Worker
648*61046927SAndroid Build Coastguard Worker return EGL_TRUE;
649*61046927SAndroid Build Coastguard Worker }
650*61046927SAndroid Build Coastguard Worker
651*61046927SAndroid Build Coastguard Worker /**
652*61046927SAndroid Build Coastguard Worker * Default fallback routine - drivers might override this.
653*61046927SAndroid Build Coastguard Worker */
654*61046927SAndroid Build Coastguard Worker EGLBoolean
_eglSurfaceAttrib(_EGLDisplay * disp,_EGLSurface * surface,EGLint attribute,EGLint value)655*61046927SAndroid Build Coastguard Worker _eglSurfaceAttrib(_EGLDisplay *disp, _EGLSurface *surface, EGLint attribute,
656*61046927SAndroid Build Coastguard Worker EGLint value)
657*61046927SAndroid Build Coastguard Worker {
658*61046927SAndroid Build Coastguard Worker EGLint confval;
659*61046927SAndroid Build Coastguard Worker EGLint err = EGL_SUCCESS;
660*61046927SAndroid Build Coastguard Worker EGLint all_es_bits =
661*61046927SAndroid Build Coastguard Worker EGL_OPENGL_ES_BIT | EGL_OPENGL_ES2_BIT | EGL_OPENGL_ES3_BIT_KHR;
662*61046927SAndroid Build Coastguard Worker
663*61046927SAndroid Build Coastguard Worker switch (attribute) {
664*61046927SAndroid Build Coastguard Worker case EGL_MIPMAP_LEVEL:
665*61046927SAndroid Build Coastguard Worker confval = surface->Config->RenderableType;
666*61046927SAndroid Build Coastguard Worker if (!(confval & all_es_bits)) {
667*61046927SAndroid Build Coastguard Worker err = EGL_BAD_PARAMETER;
668*61046927SAndroid Build Coastguard Worker break;
669*61046927SAndroid Build Coastguard Worker }
670*61046927SAndroid Build Coastguard Worker surface->MipmapLevel = value;
671*61046927SAndroid Build Coastguard Worker break;
672*61046927SAndroid Build Coastguard Worker case EGL_MULTISAMPLE_RESOLVE:
673*61046927SAndroid Build Coastguard Worker switch (value) {
674*61046927SAndroid Build Coastguard Worker case EGL_MULTISAMPLE_RESOLVE_DEFAULT:
675*61046927SAndroid Build Coastguard Worker break;
676*61046927SAndroid Build Coastguard Worker case EGL_MULTISAMPLE_RESOLVE_BOX:
677*61046927SAndroid Build Coastguard Worker confval = surface->Config->SurfaceType;
678*61046927SAndroid Build Coastguard Worker if (!(confval & EGL_MULTISAMPLE_RESOLVE_BOX_BIT))
679*61046927SAndroid Build Coastguard Worker err = EGL_BAD_MATCH;
680*61046927SAndroid Build Coastguard Worker break;
681*61046927SAndroid Build Coastguard Worker default:
682*61046927SAndroid Build Coastguard Worker err = EGL_BAD_ATTRIBUTE;
683*61046927SAndroid Build Coastguard Worker break;
684*61046927SAndroid Build Coastguard Worker }
685*61046927SAndroid Build Coastguard Worker if (err != EGL_SUCCESS)
686*61046927SAndroid Build Coastguard Worker break;
687*61046927SAndroid Build Coastguard Worker surface->MultisampleResolve = value;
688*61046927SAndroid Build Coastguard Worker break;
689*61046927SAndroid Build Coastguard Worker case EGL_RENDER_BUFFER:
690*61046927SAndroid Build Coastguard Worker if (!disp->Extensions.KHR_mutable_render_buffer) {
691*61046927SAndroid Build Coastguard Worker err = EGL_BAD_ATTRIBUTE;
692*61046927SAndroid Build Coastguard Worker break;
693*61046927SAndroid Build Coastguard Worker }
694*61046927SAndroid Build Coastguard Worker
695*61046927SAndroid Build Coastguard Worker if (value != EGL_BACK_BUFFER && value != EGL_SINGLE_BUFFER) {
696*61046927SAndroid Build Coastguard Worker err = EGL_BAD_PARAMETER;
697*61046927SAndroid Build Coastguard Worker break;
698*61046927SAndroid Build Coastguard Worker }
699*61046927SAndroid Build Coastguard Worker
700*61046927SAndroid Build Coastguard Worker /* From the EGL_KHR_mutable_render_buffer spec (v12):
701*61046927SAndroid Build Coastguard Worker *
702*61046927SAndroid Build Coastguard Worker * If attribute is EGL_RENDER_BUFFER, and the EGL_SURFACE_TYPE
703*61046927SAndroid Build Coastguard Worker * attribute of the EGLConfig used to create surface does not contain
704*61046927SAndroid Build Coastguard Worker * EGL_MUTABLE_RENDER_BUFFER_BIT_KHR, [...] an EGL_BAD_MATCH error is
705*61046927SAndroid Build Coastguard Worker * generated [...].
706*61046927SAndroid Build Coastguard Worker */
707*61046927SAndroid Build Coastguard Worker if (!(surface->Config->SurfaceType & EGL_MUTABLE_RENDER_BUFFER_BIT_KHR)) {
708*61046927SAndroid Build Coastguard Worker err = EGL_BAD_MATCH;
709*61046927SAndroid Build Coastguard Worker break;
710*61046927SAndroid Build Coastguard Worker }
711*61046927SAndroid Build Coastguard Worker
712*61046927SAndroid Build Coastguard Worker surface->RequestedRenderBuffer = value;
713*61046927SAndroid Build Coastguard Worker break;
714*61046927SAndroid Build Coastguard Worker case EGL_SWAP_BEHAVIOR:
715*61046927SAndroid Build Coastguard Worker switch (value) {
716*61046927SAndroid Build Coastguard Worker case EGL_BUFFER_DESTROYED:
717*61046927SAndroid Build Coastguard Worker break;
718*61046927SAndroid Build Coastguard Worker case EGL_BUFFER_PRESERVED:
719*61046927SAndroid Build Coastguard Worker confval = surface->Config->SurfaceType;
720*61046927SAndroid Build Coastguard Worker if (!(confval & EGL_SWAP_BEHAVIOR_PRESERVED_BIT))
721*61046927SAndroid Build Coastguard Worker err = EGL_BAD_MATCH;
722*61046927SAndroid Build Coastguard Worker break;
723*61046927SAndroid Build Coastguard Worker default:
724*61046927SAndroid Build Coastguard Worker err = EGL_BAD_ATTRIBUTE;
725*61046927SAndroid Build Coastguard Worker break;
726*61046927SAndroid Build Coastguard Worker }
727*61046927SAndroid Build Coastguard Worker if (err != EGL_SUCCESS)
728*61046927SAndroid Build Coastguard Worker break;
729*61046927SAndroid Build Coastguard Worker surface->SwapBehavior = value;
730*61046927SAndroid Build Coastguard Worker break;
731*61046927SAndroid Build Coastguard Worker case EGL_SMPTE2086_DISPLAY_PRIMARY_RX_EXT:
732*61046927SAndroid Build Coastguard Worker surface->HdrMetadata.display_primary_r.x = value;
733*61046927SAndroid Build Coastguard Worker break;
734*61046927SAndroid Build Coastguard Worker case EGL_SMPTE2086_DISPLAY_PRIMARY_RY_EXT:
735*61046927SAndroid Build Coastguard Worker surface->HdrMetadata.display_primary_r.y = value;
736*61046927SAndroid Build Coastguard Worker break;
737*61046927SAndroid Build Coastguard Worker case EGL_SMPTE2086_DISPLAY_PRIMARY_GX_EXT:
738*61046927SAndroid Build Coastguard Worker surface->HdrMetadata.display_primary_g.x = value;
739*61046927SAndroid Build Coastguard Worker break;
740*61046927SAndroid Build Coastguard Worker case EGL_SMPTE2086_DISPLAY_PRIMARY_GY_EXT:
741*61046927SAndroid Build Coastguard Worker surface->HdrMetadata.display_primary_g.y = value;
742*61046927SAndroid Build Coastguard Worker break;
743*61046927SAndroid Build Coastguard Worker case EGL_SMPTE2086_DISPLAY_PRIMARY_BX_EXT:
744*61046927SAndroid Build Coastguard Worker surface->HdrMetadata.display_primary_b.x = value;
745*61046927SAndroid Build Coastguard Worker break;
746*61046927SAndroid Build Coastguard Worker case EGL_SMPTE2086_DISPLAY_PRIMARY_BY_EXT:
747*61046927SAndroid Build Coastguard Worker surface->HdrMetadata.display_primary_b.y = value;
748*61046927SAndroid Build Coastguard Worker break;
749*61046927SAndroid Build Coastguard Worker case EGL_SMPTE2086_WHITE_POINT_X_EXT:
750*61046927SAndroid Build Coastguard Worker surface->HdrMetadata.white_point.x = value;
751*61046927SAndroid Build Coastguard Worker break;
752*61046927SAndroid Build Coastguard Worker case EGL_SMPTE2086_WHITE_POINT_Y_EXT:
753*61046927SAndroid Build Coastguard Worker surface->HdrMetadata.white_point.y = value;
754*61046927SAndroid Build Coastguard Worker break;
755*61046927SAndroid Build Coastguard Worker case EGL_SMPTE2086_MAX_LUMINANCE_EXT:
756*61046927SAndroid Build Coastguard Worker surface->HdrMetadata.max_luminance = value;
757*61046927SAndroid Build Coastguard Worker break;
758*61046927SAndroid Build Coastguard Worker case EGL_SMPTE2086_MIN_LUMINANCE_EXT:
759*61046927SAndroid Build Coastguard Worker surface->HdrMetadata.min_luminance = value;
760*61046927SAndroid Build Coastguard Worker break;
761*61046927SAndroid Build Coastguard Worker case EGL_CTA861_3_MAX_CONTENT_LIGHT_LEVEL_EXT:
762*61046927SAndroid Build Coastguard Worker surface->HdrMetadata.max_cll = value;
763*61046927SAndroid Build Coastguard Worker break;
764*61046927SAndroid Build Coastguard Worker case EGL_CTA861_3_MAX_FRAME_AVERAGE_LEVEL_EXT:
765*61046927SAndroid Build Coastguard Worker surface->HdrMetadata.max_fall = value;
766*61046927SAndroid Build Coastguard Worker break;
767*61046927SAndroid Build Coastguard Worker default:
768*61046927SAndroid Build Coastguard Worker err = EGL_BAD_ATTRIBUTE;
769*61046927SAndroid Build Coastguard Worker break;
770*61046927SAndroid Build Coastguard Worker }
771*61046927SAndroid Build Coastguard Worker
772*61046927SAndroid Build Coastguard Worker if (err != EGL_SUCCESS)
773*61046927SAndroid Build Coastguard Worker return _eglError(err, "eglSurfaceAttrib");
774*61046927SAndroid Build Coastguard Worker return EGL_TRUE;
775*61046927SAndroid Build Coastguard Worker }
776*61046927SAndroid Build Coastguard Worker
777*61046927SAndroid Build Coastguard Worker EGLBoolean
_eglBindTexImage(_EGLDisplay * disp,_EGLSurface * surface,EGLint buffer)778*61046927SAndroid Build Coastguard Worker _eglBindTexImage(_EGLDisplay *disp, _EGLSurface *surface, EGLint buffer)
779*61046927SAndroid Build Coastguard Worker {
780*61046927SAndroid Build Coastguard Worker EGLint texture_type = EGL_PBUFFER_BIT;
781*61046927SAndroid Build Coastguard Worker
782*61046927SAndroid Build Coastguard Worker /* Just do basic error checking and return success/fail.
783*61046927SAndroid Build Coastguard Worker * Drivers must implement the real stuff.
784*61046927SAndroid Build Coastguard Worker */
785*61046927SAndroid Build Coastguard Worker
786*61046927SAndroid Build Coastguard Worker if (disp->Extensions.NOK_texture_from_pixmap)
787*61046927SAndroid Build Coastguard Worker texture_type |= EGL_PIXMAP_BIT;
788*61046927SAndroid Build Coastguard Worker
789*61046927SAndroid Build Coastguard Worker if (!(surface->Type & texture_type))
790*61046927SAndroid Build Coastguard Worker return _eglError(EGL_BAD_SURFACE, "eglBindTexImage");
791*61046927SAndroid Build Coastguard Worker
792*61046927SAndroid Build Coastguard Worker if (surface->TextureFormat == EGL_NO_TEXTURE)
793*61046927SAndroid Build Coastguard Worker return _eglError(EGL_BAD_MATCH, "eglBindTexImage");
794*61046927SAndroid Build Coastguard Worker
795*61046927SAndroid Build Coastguard Worker if (surface->TextureTarget == EGL_NO_TEXTURE)
796*61046927SAndroid Build Coastguard Worker return _eglError(EGL_BAD_MATCH, "eglBindTexImage");
797*61046927SAndroid Build Coastguard Worker
798*61046927SAndroid Build Coastguard Worker if (buffer != EGL_BACK_BUFFER)
799*61046927SAndroid Build Coastguard Worker return _eglError(EGL_BAD_PARAMETER, "eglBindTexImage");
800*61046927SAndroid Build Coastguard Worker
801*61046927SAndroid Build Coastguard Worker surface->BoundToTexture = EGL_TRUE;
802*61046927SAndroid Build Coastguard Worker
803*61046927SAndroid Build Coastguard Worker return EGL_TRUE;
804*61046927SAndroid Build Coastguard Worker }
805*61046927SAndroid Build Coastguard Worker
806*61046927SAndroid Build Coastguard Worker EGLBoolean
_eglReleaseTexImage(_EGLDisplay * disp,_EGLSurface * surf,EGLint buffer)807*61046927SAndroid Build Coastguard Worker _eglReleaseTexImage(_EGLDisplay *disp, _EGLSurface *surf, EGLint buffer)
808*61046927SAndroid Build Coastguard Worker {
809*61046927SAndroid Build Coastguard Worker /* Just do basic error checking and return success/fail.
810*61046927SAndroid Build Coastguard Worker * Drivers must implement the real stuff.
811*61046927SAndroid Build Coastguard Worker */
812*61046927SAndroid Build Coastguard Worker
813*61046927SAndroid Build Coastguard Worker EGLint texture_type = EGL_PBUFFER_BIT;
814*61046927SAndroid Build Coastguard Worker
815*61046927SAndroid Build Coastguard Worker if (surf == EGL_NO_SURFACE)
816*61046927SAndroid Build Coastguard Worker return _eglError(EGL_BAD_SURFACE, "eglReleaseTexImage");
817*61046927SAndroid Build Coastguard Worker
818*61046927SAndroid Build Coastguard Worker if (!surf->BoundToTexture) {
819*61046927SAndroid Build Coastguard Worker /* Not an error, simply nothing to do */
820*61046927SAndroid Build Coastguard Worker return EGL_TRUE;
821*61046927SAndroid Build Coastguard Worker }
822*61046927SAndroid Build Coastguard Worker
823*61046927SAndroid Build Coastguard Worker if (surf->TextureFormat == EGL_NO_TEXTURE)
824*61046927SAndroid Build Coastguard Worker return _eglError(EGL_BAD_MATCH, "eglReleaseTexImage");
825*61046927SAndroid Build Coastguard Worker
826*61046927SAndroid Build Coastguard Worker if (buffer != EGL_BACK_BUFFER)
827*61046927SAndroid Build Coastguard Worker return _eglError(EGL_BAD_PARAMETER, "eglReleaseTexImage");
828*61046927SAndroid Build Coastguard Worker
829*61046927SAndroid Build Coastguard Worker if (disp->Extensions.NOK_texture_from_pixmap)
830*61046927SAndroid Build Coastguard Worker texture_type |= EGL_PIXMAP_BIT;
831*61046927SAndroid Build Coastguard Worker
832*61046927SAndroid Build Coastguard Worker if (!(surf->Type & texture_type))
833*61046927SAndroid Build Coastguard Worker return _eglError(EGL_BAD_SURFACE, "eglReleaseTexImage");
834*61046927SAndroid Build Coastguard Worker
835*61046927SAndroid Build Coastguard Worker surf->BoundToTexture = EGL_FALSE;
836*61046927SAndroid Build Coastguard Worker
837*61046927SAndroid Build Coastguard Worker return EGL_TRUE;
838*61046927SAndroid Build Coastguard Worker }
839*61046927SAndroid Build Coastguard Worker
840*61046927SAndroid Build Coastguard Worker EGLBoolean
_eglSurfaceHasMutableRenderBuffer(_EGLSurface * surf)841*61046927SAndroid Build Coastguard Worker _eglSurfaceHasMutableRenderBuffer(_EGLSurface *surf)
842*61046927SAndroid Build Coastguard Worker {
843*61046927SAndroid Build Coastguard Worker return surf->Type == EGL_WINDOW_BIT && surf->Config &&
844*61046927SAndroid Build Coastguard Worker (surf->Config->SurfaceType & EGL_MUTABLE_RENDER_BUFFER_BIT_KHR);
845*61046927SAndroid Build Coastguard Worker }
846*61046927SAndroid Build Coastguard Worker
847*61046927SAndroid Build Coastguard Worker EGLBoolean
_eglSurfaceInSharedBufferMode(_EGLSurface * surf)848*61046927SAndroid Build Coastguard Worker _eglSurfaceInSharedBufferMode(_EGLSurface *surf)
849*61046927SAndroid Build Coastguard Worker {
850*61046927SAndroid Build Coastguard Worker return _eglSurfaceHasMutableRenderBuffer(surf) &&
851*61046927SAndroid Build Coastguard Worker surf->ActiveRenderBuffer == EGL_SINGLE_BUFFER;
852*61046927SAndroid Build Coastguard Worker }
853