1
/**************************************************************************
3
* Copyright 2008 VMware, Inc.
4
* Copyright 2009-2010 Chia-I Wu <olvaffe@gmail.com>
5
* Copyright 2010 LunarG, Inc.
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:
16
* The above copyright notice and this permission notice (including the
17
* next paragraph) shall be included in all copies or substantial portions
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.
28
**************************************************************************/
32
* Surface-related functions.
39
#include "egldefines.h"
40
#include "egldisplay.h"
41
#include "egldriver.h"
42
#include "eglcontext.h"
43
#include "eglconfig.h"
44
#include "eglcurrent.h"
46
#include "eglsurface.h"
48
#include "util/macros.h"
51
* Parse the list of surface attributes and return the proper error code.
54
_eglParseSurfaceAttribList(_EGLSurface *surf, const EGLint *attrib_list)
56
_EGLDisplay *disp = surf->Resource.Display;
57
EGLint type = surf->Type;
58
EGLint texture_type = EGL_PBUFFER_BIT;
59
EGLint i, err = EGL_SUCCESS;
60
EGLint attr = EGL_NONE;
61
EGLint val = EGL_NONE;
66
if (disp->Extensions.NOK_texture_from_pixmap)
67
texture_type |= EGL_PIXMAP_BIT;
69
for (i = 0; attrib_list[i] != EGL_NONE; i++) {
70
attr = attrib_list[i++];
74
/* common attributes */
75
case EGL_GL_COLORSPACE_KHR:
76
if (!disp->Extensions.KHR_gl_colorspace) {
77
err = EGL_BAD_ATTRIBUTE;
81
case EGL_GL_COLORSPACE_SRGB_KHR:
82
case EGL_GL_COLORSPACE_LINEAR_KHR:
85
err = EGL_BAD_ATTRIBUTE;
87
if (err != EGL_SUCCESS)
89
surf->GLColorspace = val;
91
case EGL_SMPTE2086_DISPLAY_PRIMARY_RX_EXT:
92
if (!disp->Extensions.EXT_surface_SMPTE2086_metadata) {
93
err = EGL_BAD_ATTRIBUTE;
96
surf->HdrMetadata.display_primary_r.x = val;
98
case EGL_SMPTE2086_DISPLAY_PRIMARY_RY_EXT:
99
if (!disp->Extensions.EXT_surface_SMPTE2086_metadata) {
100
err = EGL_BAD_ATTRIBUTE;
103
surf->HdrMetadata.display_primary_r.y = val;
105
case EGL_SMPTE2086_DISPLAY_PRIMARY_GX_EXT:
106
if (!disp->Extensions.EXT_surface_SMPTE2086_metadata) {
107
err = EGL_BAD_ATTRIBUTE;
110
surf->HdrMetadata.display_primary_g.x = val;
112
case EGL_SMPTE2086_DISPLAY_PRIMARY_GY_EXT:
113
if (!disp->Extensions.EXT_surface_SMPTE2086_metadata) {
114
err = EGL_BAD_ATTRIBUTE;
117
surf->HdrMetadata.display_primary_g.y = val;
119
case EGL_SMPTE2086_DISPLAY_PRIMARY_BX_EXT:
120
if (!disp->Extensions.EXT_surface_SMPTE2086_metadata) {
121
err = EGL_BAD_ATTRIBUTE;
124
surf->HdrMetadata.display_primary_b.x = val;
126
case EGL_SMPTE2086_DISPLAY_PRIMARY_BY_EXT:
127
if (!disp->Extensions.EXT_surface_SMPTE2086_metadata) {
128
err = EGL_BAD_ATTRIBUTE;
131
surf->HdrMetadata.display_primary_b.y = val;
133
case EGL_SMPTE2086_WHITE_POINT_X_EXT:
134
if (!disp->Extensions.EXT_surface_SMPTE2086_metadata) {
135
err = EGL_BAD_ATTRIBUTE;
138
surf->HdrMetadata.white_point.x = val;
140
case EGL_SMPTE2086_WHITE_POINT_Y_EXT:
141
if (!disp->Extensions.EXT_surface_SMPTE2086_metadata) {
142
err = EGL_BAD_ATTRIBUTE;
145
surf->HdrMetadata.white_point.y = val;
147
case EGL_SMPTE2086_MAX_LUMINANCE_EXT:
148
if (!disp->Extensions.EXT_surface_SMPTE2086_metadata) {
149
err = EGL_BAD_ATTRIBUTE;
152
surf->HdrMetadata.max_luminance = val;
154
case EGL_SMPTE2086_MIN_LUMINANCE_EXT:
155
if (!disp->Extensions.EXT_surface_SMPTE2086_metadata) {
156
err = EGL_BAD_ATTRIBUTE;
159
surf->HdrMetadata.min_luminance = val;
161
case EGL_CTA861_3_MAX_CONTENT_LIGHT_LEVEL_EXT:
162
if (!disp->Extensions.EXT_surface_CTA861_3_metadata) {
163
err = EGL_BAD_ATTRIBUTE;
166
surf->HdrMetadata.max_cll = val;
168
case EGL_CTA861_3_MAX_FRAME_AVERAGE_LEVEL_EXT:
169
if (!disp->Extensions.EXT_surface_CTA861_3_metadata) {
170
err = EGL_BAD_ATTRIBUTE;
173
surf->HdrMetadata.max_fall = val;
175
case EGL_VG_COLORSPACE:
177
case EGL_VG_COLORSPACE_sRGB:
178
case EGL_VG_COLORSPACE_LINEAR:
181
err = EGL_BAD_ATTRIBUTE;
184
if (err != EGL_SUCCESS)
186
surf->VGColorspace = val;
188
case EGL_VG_ALPHA_FORMAT:
190
case EGL_VG_ALPHA_FORMAT_NONPRE:
191
case EGL_VG_ALPHA_FORMAT_PRE:
194
err = EGL_BAD_ATTRIBUTE;
197
if (err != EGL_SUCCESS)
199
surf->VGAlphaFormat = val;
201
/* window surface attributes */
202
case EGL_RENDER_BUFFER:
203
if (type != EGL_WINDOW_BIT) {
204
err = EGL_BAD_ATTRIBUTE;
207
if (val != EGL_BACK_BUFFER && val != EGL_SINGLE_BUFFER) {
208
err = EGL_BAD_ATTRIBUTE;
211
surf->RequestedRenderBuffer = val;
212
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.
216
surf->ActiveRenderBuffer = val;
219
case EGL_PRESENT_OPAQUE_EXT:
220
if (!disp->Extensions.EXT_present_opaque) {
221
err = EGL_BAD_ATTRIBUTE;
224
if (type != EGL_WINDOW_BIT) {
225
err = EGL_BAD_ATTRIBUTE;
228
if (val != EGL_TRUE && val != EGL_FALSE) {
229
err = EGL_BAD_PARAMETER;
232
surf->PresentOpaque = val;
234
case EGL_POST_SUB_BUFFER_SUPPORTED_NV:
235
if (!disp->Extensions.NV_post_sub_buffer ||
236
type != EGL_WINDOW_BIT) {
237
err = EGL_BAD_ATTRIBUTE;
240
if (val != EGL_TRUE && val != EGL_FALSE) {
241
err = EGL_BAD_PARAMETER;
244
surf->PostSubBufferSupportedNV = val;
246
/* pbuffer surface attributes */
248
if (type != EGL_PBUFFER_BIT) {
249
err = EGL_BAD_ATTRIBUTE;
253
err = EGL_BAD_PARAMETER;
259
if (type != EGL_PBUFFER_BIT) {
260
err = EGL_BAD_ATTRIBUTE;
264
err = EGL_BAD_PARAMETER;
269
case EGL_LARGEST_PBUFFER:
270
if (type != EGL_PBUFFER_BIT) {
271
err = EGL_BAD_ATTRIBUTE;
274
surf->LargestPbuffer = !!val;
276
/* for eglBindTexImage */
277
case EGL_TEXTURE_FORMAT:
278
if (!(type & texture_type)) {
279
err = EGL_BAD_ATTRIBUTE;
284
case EGL_TEXTURE_RGB:
285
case EGL_TEXTURE_RGBA:
289
err = EGL_BAD_ATTRIBUTE;
292
if (err != EGL_SUCCESS)
294
surf->TextureFormat = val;
296
case EGL_TEXTURE_TARGET:
297
if (!(type & texture_type)) {
298
err = EGL_BAD_ATTRIBUTE;
307
err = EGL_BAD_ATTRIBUTE;
310
if (err != EGL_SUCCESS)
312
surf->TextureTarget = val;
314
case EGL_MIPMAP_TEXTURE:
315
if (!(type & texture_type)) {
316
err = EGL_BAD_ATTRIBUTE;
319
surf->MipmapTexture = !!val;
321
case EGL_PROTECTED_CONTENT_EXT:
322
if (!disp->Extensions.EXT_protected_surface) {
323
err = EGL_BAD_ATTRIBUTE;
326
surf->ProtectedContent = val;
329
/* no pixmap surface specific attributes */
331
err = EGL_BAD_ATTRIBUTE;
335
if (err != EGL_SUCCESS)
339
if (err == EGL_SUCCESS && type == EGL_PBUFFER_BIT) {
340
if ((surf->TextureTarget == EGL_NO_TEXTURE && surf->TextureFormat != EGL_NO_TEXTURE) ||
341
(surf->TextureFormat == EGL_NO_TEXTURE && surf->TextureTarget != EGL_NO_TEXTURE)) {
342
attr = surf->TextureTarget == EGL_NO_TEXTURE ? EGL_TEXTURE_TARGET : EGL_TEXTURE_FORMAT;
347
if (err != EGL_SUCCESS)
348
_eglLog(_EGL_WARNING, "bad surface attribute 0x%04x", attr);
355
* Do error check on parameters and initialize the given _EGLSurface object.
356
* \return EGL_TRUE if no errors, EGL_FALSE otherwise.
359
_eglInitSurface(_EGLSurface *surf, _EGLDisplay *disp, EGLint type,
360
_EGLConfig *conf, const EGLint *attrib_list,
361
void *native_surface)
364
EGLint renderBuffer = EGL_BACK_BUFFER;
365
EGLint swapBehavior = EGL_BUFFER_DESTROYED;
368
/* Swap behavior can be preserved only if config supports this. */
369
if (conf->SurfaceType & EGL_SWAP_BEHAVIOR_PRESERVED_BIT)
370
swapBehavior = EGL_BUFFER_PRESERVED;
374
func = "eglCreateWindowSurface";
375
swapBehavior = EGL_BUFFER_DESTROYED;
378
func = "eglCreatePixmapSurface";
379
renderBuffer = EGL_SINGLE_BUFFER;
381
case EGL_PBUFFER_BIT:
382
func = "eglCreatePBufferSurface";
385
_eglLog(_EGL_WARNING, "Bad type in _eglInitSurface");
389
if ((conf->SurfaceType & type) == 0)
390
/* The config can't be used to create a surface of this type */
391
return _eglError(EGL_BAD_MATCH, func);
393
_eglInitResource(&surf->Resource, sizeof(*surf), disp);
396
surf->Lost = EGL_FALSE;
400
surf->TextureFormat = EGL_NO_TEXTURE;
401
surf->TextureTarget = EGL_NO_TEXTURE;
402
surf->MipmapTexture = EGL_FALSE;
403
surf->LargestPbuffer = EGL_FALSE;
404
surf->RequestedRenderBuffer = renderBuffer;
405
surf->ActiveRenderBuffer = renderBuffer;
406
surf->VGAlphaFormat = EGL_VG_ALPHA_FORMAT_NONPRE;
407
surf->VGColorspace = EGL_VG_COLORSPACE_sRGB;
408
surf->GLColorspace = EGL_GL_COLORSPACE_LINEAR_KHR;
409
surf->ProtectedContent = EGL_FALSE;
410
surf->PresentOpaque = EGL_FALSE;
412
surf->MipmapLevel = 0;
413
surf->MultisampleResolve = EGL_MULTISAMPLE_RESOLVE_DEFAULT;
414
surf->SwapBehavior = swapBehavior;
416
surf->HorizontalResolution = EGL_UNKNOWN;
417
surf->VerticalResolution = EGL_UNKNOWN;
418
surf->AspectRatio = EGL_UNKNOWN;
420
surf->PostSubBufferSupportedNV = EGL_FALSE;
421
surf->SetDamageRegionCalled = EGL_FALSE;
422
surf->BufferAgeRead = EGL_FALSE;
424
/* the default swap interval is 1 */
425
surf->SwapInterval = 1;
427
surf->HdrMetadata.display_primary_r.x = EGL_DONT_CARE;
428
surf->HdrMetadata.display_primary_r.y = EGL_DONT_CARE;
429
surf->HdrMetadata.display_primary_g.x = EGL_DONT_CARE;
430
surf->HdrMetadata.display_primary_g.y = EGL_DONT_CARE;
431
surf->HdrMetadata.display_primary_b.x = EGL_DONT_CARE;
432
surf->HdrMetadata.display_primary_b.y = EGL_DONT_CARE;
433
surf->HdrMetadata.white_point.x = EGL_DONT_CARE;
434
surf->HdrMetadata.white_point.y = EGL_DONT_CARE;
435
surf->HdrMetadata.max_luminance = EGL_DONT_CARE;
436
surf->HdrMetadata.min_luminance = EGL_DONT_CARE;
437
surf->HdrMetadata.max_cll = EGL_DONT_CARE;
438
surf->HdrMetadata.max_fall = EGL_DONT_CARE;
440
err = _eglParseSurfaceAttribList(surf, attrib_list);
441
if (err != EGL_SUCCESS)
442
return _eglError(err, func);
444
/* if EGL_LARGEST_PBUFFER in use, clamp width and height */
445
if (surf->LargestPbuffer) {
446
surf->Width = MIN2(surf->Width, _EGL_MAX_PBUFFER_WIDTH);
447
surf->Height = MIN2(surf->Height, _EGL_MAX_PBUFFER_HEIGHT);
450
surf->NativeSurface = native_surface;
457
_eglQuerySurface(_EGLDisplay *disp, _EGLSurface *surface,
458
EGLint attribute, EGLint *value)
462
*value = surface->Width;
465
*value = surface->Height;
468
*value = surface->Config->ConfigID;
470
case EGL_LARGEST_PBUFFER:
471
if (surface->Type == EGL_PBUFFER_BIT)
472
*value = surface->LargestPbuffer;
474
case EGL_TEXTURE_FORMAT:
475
/* texture attributes: only for pbuffers, no error otherwise */
476
if (surface->Type == EGL_PBUFFER_BIT)
477
*value = surface->TextureFormat;
479
case EGL_TEXTURE_TARGET:
480
if (surface->Type == EGL_PBUFFER_BIT)
481
*value = surface->TextureTarget;
483
case EGL_MIPMAP_TEXTURE:
484
if (surface->Type == EGL_PBUFFER_BIT)
485
*value = surface->MipmapTexture;
487
case EGL_MIPMAP_LEVEL:
488
if (surface->Type == EGL_PBUFFER_BIT)
489
*value = surface->MipmapLevel;
491
case EGL_SWAP_BEHAVIOR:
492
*value = surface->SwapBehavior;
494
case EGL_RENDER_BUFFER:
495
/* From the EGL_KHR_mutable_render_buffer spec (v12):
497
* Querying EGL_RENDER_BUFFER returns the buffer which client API
498
* rendering is requested to use. For a window surface, this is the
499
* attribute value specified when the surface was created or last set
500
* via eglSurfaceAttrib.
502
* In other words, querying a window surface returns the value most
503
* recently *requested* by the user.
505
* The paragraph continues in the EGL 1.5 spec (2014.08.27):
507
* For a pbuffer surface, it is always EGL_BACK_BUFFER . For a pixmap
508
* surface, it is always EGL_SINGLE_BUFFER . To determine the actual
509
* buffer being rendered to by a context, call eglQueryContext.
511
switch (surface->Type) {
513
unreachable("bad EGLSurface type");
515
*value = surface->RequestedRenderBuffer;
517
case EGL_PBUFFER_BIT:
518
*value = EGL_BACK_BUFFER;
521
*value = EGL_SINGLE_BUFFER;
525
case EGL_PIXEL_ASPECT_RATIO:
526
*value = surface->AspectRatio;
528
case EGL_HORIZONTAL_RESOLUTION:
529
*value = surface->HorizontalResolution;
531
case EGL_VERTICAL_RESOLUTION:
532
*value = surface->VerticalResolution;
534
case EGL_MULTISAMPLE_RESOLVE:
535
*value = surface->MultisampleResolve;
537
case EGL_VG_ALPHA_FORMAT:
538
*value = surface->VGAlphaFormat;
540
case EGL_VG_COLORSPACE:
541
*value = surface->VGColorspace;
543
case EGL_GL_COLORSPACE_KHR:
544
if (!disp->Extensions.KHR_gl_colorspace)
545
return _eglError(EGL_BAD_ATTRIBUTE, "eglQuerySurface");
547
*value = surface->GLColorspace;
549
case EGL_POST_SUB_BUFFER_SUPPORTED_NV:
550
*value = surface->PostSubBufferSupportedNV;
552
case EGL_BUFFER_AGE_EXT:
553
/* Both EXT_buffer_age and KHR_partial_update accept EGL_BUFFER_AGE_EXT.
554
* To be precise, the KHR one accepts EGL_BUFFER_AGE_KHR which is an
555
* alias with the same numeric value.
557
if (!disp->Extensions.EXT_buffer_age &&
558
!disp->Extensions.KHR_partial_update)
559
return _eglError(EGL_BAD_ATTRIBUTE, "eglQuerySurface");
561
_EGLContext *ctx = _eglGetCurrentContext();
562
EGLint result = disp->Driver->QueryBufferAge(disp, surface);
566
if (_eglGetContextHandle(ctx) == EGL_NO_CONTEXT ||
567
ctx->DrawSurface != surface)
568
return _eglError(EGL_BAD_SURFACE, "eglQuerySurface");
571
surface->BufferAgeRead = EGL_TRUE;
573
case EGL_SMPTE2086_DISPLAY_PRIMARY_RX_EXT:
574
*value = surface->HdrMetadata.display_primary_r.x;
576
case EGL_SMPTE2086_DISPLAY_PRIMARY_RY_EXT:
577
*value = surface->HdrMetadata.display_primary_r.y;
579
case EGL_SMPTE2086_DISPLAY_PRIMARY_GX_EXT:
580
*value = surface->HdrMetadata.display_primary_g.x;
582
case EGL_SMPTE2086_DISPLAY_PRIMARY_GY_EXT:
583
*value = surface->HdrMetadata.display_primary_g.y;
585
case EGL_SMPTE2086_DISPLAY_PRIMARY_BX_EXT:
586
*value = surface->HdrMetadata.display_primary_b.x;
588
case EGL_SMPTE2086_DISPLAY_PRIMARY_BY_EXT:
589
*value = surface->HdrMetadata.display_primary_b.y;
591
case EGL_SMPTE2086_WHITE_POINT_X_EXT:
592
*value = surface->HdrMetadata.white_point.x;
594
case EGL_SMPTE2086_WHITE_POINT_Y_EXT:
595
*value = surface->HdrMetadata.white_point.y;
597
case EGL_SMPTE2086_MAX_LUMINANCE_EXT:
598
*value = surface->HdrMetadata.max_luminance;
600
case EGL_SMPTE2086_MIN_LUMINANCE_EXT:
601
*value = surface->HdrMetadata.min_luminance;
603
case EGL_CTA861_3_MAX_CONTENT_LIGHT_LEVEL_EXT:
604
*value = surface->HdrMetadata.max_cll;
606
case EGL_CTA861_3_MAX_FRAME_AVERAGE_LEVEL_EXT:
607
*value = surface->HdrMetadata.max_fall;
609
case EGL_PROTECTED_CONTENT_EXT:
610
if (!disp->Extensions.EXT_protected_surface)
611
return _eglError(EGL_BAD_ATTRIBUTE, "eglQuerySurface");
612
*value = surface->ProtectedContent;
614
case EGL_PRESENT_OPAQUE_EXT:
615
if (!disp->Extensions.EXT_present_opaque)
616
return _eglError(EGL_BAD_ATTRIBUTE, "eglQuerySurface");
617
*value = surface->PresentOpaque;
620
return _eglError(EGL_BAD_ATTRIBUTE, "eglQuerySurface");
628
* Default fallback routine - drivers might override this.
631
_eglSurfaceAttrib(_EGLDisplay *disp, _EGLSurface *surface,
632
EGLint attribute, EGLint value)
635
EGLint err = EGL_SUCCESS;
636
EGLint all_es_bits = EGL_OPENGL_ES_BIT |
638
EGL_OPENGL_ES3_BIT_KHR;
641
case EGL_MIPMAP_LEVEL:
642
confval = surface->Config->RenderableType;
643
if (!(confval & all_es_bits)) {
644
err = EGL_BAD_PARAMETER;
647
surface->MipmapLevel = value;
649
case EGL_MULTISAMPLE_RESOLVE:
651
case EGL_MULTISAMPLE_RESOLVE_DEFAULT:
653
case EGL_MULTISAMPLE_RESOLVE_BOX:
654
confval = surface->Config->SurfaceType;
655
if (!(confval & EGL_MULTISAMPLE_RESOLVE_BOX_BIT))
659
err = EGL_BAD_ATTRIBUTE;
662
if (err != EGL_SUCCESS)
664
surface->MultisampleResolve = value;
666
case EGL_RENDER_BUFFER:
667
if (!disp->Extensions.KHR_mutable_render_buffer) {
668
err = EGL_BAD_ATTRIBUTE;
672
if (value != EGL_BACK_BUFFER && value != EGL_SINGLE_BUFFER) {
673
err = EGL_BAD_PARAMETER;
677
/* From the EGL_KHR_mutable_render_buffer spec (v12):
679
* If attribute is EGL_RENDER_BUFFER, and the EGL_SURFACE_TYPE
680
* attribute of the EGLConfig used to create surface does not contain
681
* EGL_MUTABLE_RENDER_BUFFER_BIT_KHR, [...] an EGL_BAD_MATCH error is
684
if (!(surface->Config->SurfaceType & EGL_MUTABLE_RENDER_BUFFER_BIT_KHR)) {
689
surface->RequestedRenderBuffer = value;
691
case EGL_SWAP_BEHAVIOR:
693
case EGL_BUFFER_DESTROYED:
695
case EGL_BUFFER_PRESERVED:
696
confval = surface->Config->SurfaceType;
697
if (!(confval & EGL_SWAP_BEHAVIOR_PRESERVED_BIT))
701
err = EGL_BAD_ATTRIBUTE;
704
if (err != EGL_SUCCESS)
706
surface->SwapBehavior = value;
708
case EGL_SMPTE2086_DISPLAY_PRIMARY_RX_EXT:
709
surface->HdrMetadata.display_primary_r.x = value;
711
case EGL_SMPTE2086_DISPLAY_PRIMARY_RY_EXT:
712
surface->HdrMetadata.display_primary_r.y = value;
714
case EGL_SMPTE2086_DISPLAY_PRIMARY_GX_EXT:
715
surface->HdrMetadata.display_primary_g.x = value;
717
case EGL_SMPTE2086_DISPLAY_PRIMARY_GY_EXT:
718
surface->HdrMetadata.display_primary_g.y = value;
720
case EGL_SMPTE2086_DISPLAY_PRIMARY_BX_EXT:
721
surface->HdrMetadata.display_primary_b.x = value;
723
case EGL_SMPTE2086_DISPLAY_PRIMARY_BY_EXT:
724
surface->HdrMetadata.display_primary_b.y = value;
726
case EGL_SMPTE2086_WHITE_POINT_X_EXT:
727
surface->HdrMetadata.white_point.x = value;
729
case EGL_SMPTE2086_WHITE_POINT_Y_EXT:
730
surface->HdrMetadata.white_point.y = value;
732
case EGL_SMPTE2086_MAX_LUMINANCE_EXT:
733
surface->HdrMetadata.max_luminance = value;
735
case EGL_SMPTE2086_MIN_LUMINANCE_EXT:
736
surface->HdrMetadata.min_luminance = value;
738
case EGL_CTA861_3_MAX_CONTENT_LIGHT_LEVEL_EXT:
739
surface->HdrMetadata.max_cll = value;
741
case EGL_CTA861_3_MAX_FRAME_AVERAGE_LEVEL_EXT:
742
surface->HdrMetadata.max_fall = value;
745
err = EGL_BAD_ATTRIBUTE;
749
if (err != EGL_SUCCESS)
750
return _eglError(err, "eglSurfaceAttrib");
756
_eglBindTexImage(_EGLDisplay *disp, _EGLSurface *surface, EGLint buffer)
758
EGLint texture_type = EGL_PBUFFER_BIT;
760
/* Just do basic error checking and return success/fail.
761
* Drivers must implement the real stuff.
764
if (disp->Extensions.NOK_texture_from_pixmap)
765
texture_type |= EGL_PIXMAP_BIT;
767
if (!(surface->Type & texture_type))
768
return _eglError(EGL_BAD_SURFACE, "eglBindTexImage");
770
if (surface->TextureFormat == EGL_NO_TEXTURE)
771
return _eglError(EGL_BAD_MATCH, "eglBindTexImage");
773
if (surface->TextureTarget == EGL_NO_TEXTURE)
774
return _eglError(EGL_BAD_MATCH, "eglBindTexImage");
776
if (buffer != EGL_BACK_BUFFER)
777
return _eglError(EGL_BAD_PARAMETER, "eglBindTexImage");
779
surface->BoundToTexture = EGL_TRUE;
785
_eglReleaseTexImage(_EGLDisplay *disp, _EGLSurface *surf, EGLint buffer)
787
/* Just do basic error checking and return success/fail.
788
* Drivers must implement the real stuff.
791
EGLint texture_type = EGL_PBUFFER_BIT;
793
if (surf == EGL_NO_SURFACE)
794
return _eglError(EGL_BAD_SURFACE, "eglReleaseTexImage");
796
if (!surf->BoundToTexture)
798
/* Not an error, simply nothing to do */
802
if (surf->TextureFormat == EGL_NO_TEXTURE)
803
return _eglError(EGL_BAD_MATCH, "eglReleaseTexImage");
805
if (buffer != EGL_BACK_BUFFER)
806
return _eglError(EGL_BAD_PARAMETER, "eglReleaseTexImage");
808
if (disp->Extensions.NOK_texture_from_pixmap)
809
texture_type |= EGL_PIXMAP_BIT;
811
if (!(surf->Type & texture_type))
812
return _eglError(EGL_BAD_SURFACE, "eglReleaseTexImage");
814
surf->BoundToTexture = EGL_FALSE;
820
_eglSurfaceHasMutableRenderBuffer(_EGLSurface *surf)
822
return surf->Type == EGL_WINDOW_BIT &&
824
(surf->Config->SurfaceType & EGL_MUTABLE_RENDER_BUFFER_BIT_KHR);
828
_eglSurfaceInSharedBufferMode(_EGLSurface *surf)
830
return _eglSurfaceHasMutableRenderBuffer(surf) &&
831
surf->ActiveRenderBuffer == EGL_SINGLE_BUFFER;