1 /* This Source Code Form is subject to the terms of the Mozilla Public
2 * License, v. 2.0. If a copy of the MPL was not distributed with this file,
3 * You can obtain one at http://mozilla.org/MPL/2.0/. */
5 #ifndef GLLIBRARYEGL_H_
6 #define GLLIBRARYEGL_H_
9 # include "mozilla/X11Util.h"
13 #include "mozilla/EnumTypeTraits.h"
14 #include "mozilla/Maybe.h"
15 #include "mozilla/RefPtr.h"
16 #include "mozilla/StaticMutex.h"
17 #include "mozilla/StaticPtr.h"
18 #include "nsISupports.h"
23 #include <unordered_map>
25 #ifdef MOZ_WIDGET_ANDROID
26 # include "mozilla/ProfilerLabels.h"
30 # define EGL_DEFAULT_DISPLAY ((EGLNativeDisplayType)mozilla::DefaultXDisplay())
32 # define EGL_DEFAULT_DISPLAY ((EGLNativeDisplayType)0)
38 struct AHardwareBuffer
;
48 class DataSourceSurface
;
55 PRLibrary
* LoadApitraceLibrary();
57 void BeforeEGLCall(const char* funcName
);
58 void AfterEGLCall(const char* funcName
);
62 * Known GL extensions that can be queried by
63 * IsExtensionSupported. The results of this are cached, and as
64 * such it's safe to use this even in performance critical code.
65 * If you add to this array, remember to add to the string names
66 * in GLLibraryEGL.cpp.
68 enum class EGLLibExtension
{
69 ANDROID_get_native_client_buffer
,
70 ANGLE_device_creation
,
71 ANGLE_device_creation_d3d11
,
73 ANGLE_platform_angle_d3d
,
74 EXT_device_enumeration
,
77 MESA_platform_surfaceless
,
82 * Known GL extensions that can be queried by
83 * IsExtensionSupported. The results of this are cached, and as
84 * such it's safe to use this even in performance critical code.
85 * If you add to this array, remember to add to the string names
86 * in GLLibraryEGL.cpp.
88 enum class EGLExtension
{
91 KHR_gl_texture_2D_image
,
92 ANGLE_surface_d3d_texture_2d_share_handle
,
93 EXT_create_context_robustness
,
97 ANDROID_native_fence_sync
,
98 EGL_ANDROID_image_crop
,
99 ANGLE_d3d_share_handle_client_buffer
,
102 KHR_stream_consumer_gltexture
,
103 NV_stream_consumer_gltexture_yuv
,
104 ANGLE_stream_producer_d3d_texture
,
105 KHR_surfaceless_context
,
106 KHR_create_context_no_error
,
107 MOZ_create_context_provoking_vertex_dont_care
,
108 EXT_swap_buffers_with_damage
,
109 KHR_swap_buffers_with_damage
,
112 NV_robustness_video_memory_purge
,
113 EXT_image_dma_buf_import
,
114 EXT_image_dma_buf_import_modifiers
,
115 MESA_image_dma_buf_export
,
121 class GLLibraryEGL final
{
122 friend class EglDisplay
;
125 NS_INLINE_DECL_THREADSAFE_REFCOUNTING(GLLibraryEGL
)
128 PRLibrary
* mEGLLibrary
= nullptr;
129 PRLibrary
* mGLLibrary
= nullptr;
130 bool mIsANGLE
= false;
131 std::bitset
<UnderlyingValue(EGLLibExtension::Max
)> mAvailableExtensions
;
132 std::weak_ptr
<EglDisplay
> mDefaultDisplay
;
133 std::unordered_map
<EGLDisplay
, std::weak_ptr
<EglDisplay
>> mActiveDisplays
;
136 static RefPtr
<GLLibraryEGL
> Get(nsACString
* const out_failureId
);
137 static void Shutdown();
140 ~GLLibraryEGL() = default;
142 static StaticMutex sMutex
;
143 static StaticRefPtr
<GLLibraryEGL
> sInstance
GUARDED_BY(sMutex
);
145 bool Init(nsACString
* const out_failureId
);
146 void InitLibExtensions();
148 std::shared_ptr
<EglDisplay
> CreateDisplayLocked(
149 bool forceAccel
, nsACString
* const out_failureId
,
150 const StaticMutexAutoLock
& aProofOfLock
);
153 Maybe
<SymbolLoader
> GetSymbolLoader() const;
155 std::shared_ptr
<EglDisplay
> CreateDisplay(bool forceAccel
,
156 nsACString
* const out_failureId
);
157 std::shared_ptr
<EglDisplay
> CreateDisplay(ID3D11Device
*);
158 std::shared_ptr
<EglDisplay
> DefaultDisplay(nsACString
* const out_failureId
);
160 bool IsExtensionSupported(EGLLibExtension aKnownExtension
) const {
161 return mAvailableExtensions
[UnderlyingValue(aKnownExtension
)];
164 void MarkExtensionUnsupported(EGLLibExtension aKnownExtension
) {
165 mAvailableExtensions
[UnderlyingValue(aKnownExtension
)] = false;
168 bool IsANGLE() const { return mIsANGLE
; }
173 #ifdef MOZ_WIDGET_ANDROID
174 # define PROFILE_CALL AUTO_PROFILER_LABEL(__func__, GRAPHICS);
176 # define PROFILE_CALL
179 #ifndef MOZ_FUNCTION_NAME
181 # define MOZ_FUNCTION_NAME __PRETTY_FUNCTION__
182 # elif defined(_MSC_VER)
183 # define MOZ_FUNCTION_NAME __FUNCTION__
185 # define MOZ_FUNCTION_NAME \
186 __func__ // defined in C99, supported in various C++ compilers. Just raw
192 # define BEFORE_CALL BeforeEGLCall(MOZ_FUNCTION_NAME);
193 # define AFTER_CALL AfterEGLCall(MOZ_FUNCTION_NAME);
202 const auto ret = mSymbols.X; \
207 EGLDisplay
fGetDisplay(void* display_id
) const {
208 WRAP(fGetDisplay(display_id
));
211 EGLDisplay
fGetPlatformDisplay(EGLenum platform
, void* native_display
,
212 const EGLAttrib
* attrib_list
) const {
213 WRAP(fGetPlatformDisplay(platform
, native_display
, attrib_list
));
216 EGLSurface
fGetCurrentSurface(EGLint id
) const {
217 WRAP(fGetCurrentSurface(id
));
220 EGLContext
fGetCurrentContext() const { WRAP(fGetCurrentContext()); }
222 EGLBoolean
fBindAPI(EGLenum api
) const { WRAP(fBindAPI(api
)); }
224 EGLint
fGetError() const { WRAP(fGetError()); }
226 EGLBoolean
fWaitNative(EGLint engine
) const { WRAP(fWaitNative(engine
)); }
228 EGLCastToRelevantPtr
fGetProcAddress(const char* procname
) const {
229 WRAP(fGetProcAddress(procname
));
232 // ANGLE_device_creation
233 EGLDeviceEXT
fCreateDeviceANGLE(EGLint device_type
, void* native_device
,
234 const EGLAttrib
* attrib_list
) const {
235 WRAP(fCreateDeviceANGLE(device_type
, native_device
, attrib_list
));
238 EGLBoolean
fReleaseDeviceANGLE(EGLDeviceEXT device
) {
239 WRAP(fReleaseDeviceANGLE(device
));
242 // ANDROID_get_native_client_buffer
243 EGLClientBuffer
fGetNativeClientBufferANDROID(
244 const struct AHardwareBuffer
* buffer
) {
245 WRAP(fGetNativeClientBufferANDROID(buffer
));
249 EGLBoolean
fTerminate(EGLDisplay display
) const { WRAP(fTerminate(display
)); }
251 EGLBoolean
fMakeCurrent(EGLDisplay dpy
, EGLSurface draw
, EGLSurface read
,
252 EGLContext ctx
) const {
253 WRAP(fMakeCurrent(dpy
, draw
, read
, ctx
));
256 EGLBoolean
fDestroyContext(EGLDisplay dpy
, EGLContext ctx
) const {
257 WRAP(fDestroyContext(dpy
, ctx
));
260 EGLContext
fCreateContext(EGLDisplay dpy
, EGLConfig config
,
261 EGLContext share_context
,
262 const EGLint
* attrib_list
) const {
263 WRAP(fCreateContext(dpy
, config
, share_context
, attrib_list
));
266 EGLBoolean
fDestroySurface(EGLDisplay dpy
, EGLSurface surface
) const {
267 WRAP(fDestroySurface(dpy
, surface
));
271 EGLSurface
fCreateWindowSurface(EGLDisplay dpy
, EGLConfig config
,
272 EGLNativeWindowType win
,
273 const EGLint
* attrib_list
) const {
274 WRAP(fCreateWindowSurface(dpy
, config
, win
, attrib_list
));
278 EGLSurface
fCreatePbufferSurface(EGLDisplay dpy
, EGLConfig config
,
279 const EGLint
* attrib_list
) const {
280 WRAP(fCreatePbufferSurface(dpy
, config
, attrib_list
));
283 EGLSurface
fCreatePbufferFromClientBuffer(EGLDisplay dpy
, EGLenum buftype
,
284 EGLClientBuffer buffer
,
286 const EGLint
* attrib_list
) const {
287 WRAP(fCreatePbufferFromClientBuffer(dpy
, buftype
, buffer
, config
,
291 EGLSurface
fCreatePixmapSurface(EGLDisplay dpy
, EGLConfig config
,
292 EGLNativePixmapType pixmap
,
293 const EGLint
* attrib_list
) const {
294 WRAP(fCreatePixmapSurface(dpy
, config
, pixmap
, attrib_list
));
297 EGLBoolean
fInitialize(EGLDisplay dpy
, EGLint
* major
, EGLint
* minor
) const {
298 WRAP(fInitialize(dpy
, major
, minor
));
301 EGLBoolean
fChooseConfig(EGLDisplay dpy
, const EGLint
* attrib_list
,
302 EGLConfig
* configs
, EGLint config_size
,
303 EGLint
* num_config
) const {
304 WRAP(fChooseConfig(dpy
, attrib_list
, configs
, config_size
, num_config
));
307 EGLBoolean
fGetConfigAttrib(EGLDisplay dpy
, EGLConfig config
,
308 EGLint attribute
, EGLint
* value
) const {
309 WRAP(fGetConfigAttrib(dpy
, config
, attribute
, value
));
312 EGLBoolean
fGetConfigs(EGLDisplay dpy
, EGLConfig
* configs
, EGLint config_size
,
313 EGLint
* num_config
) const {
314 WRAP(fGetConfigs(dpy
, configs
, config_size
, num_config
));
317 EGLBoolean
fSwapBuffers(EGLDisplay dpy
, EGLSurface surface
) const {
318 WRAP(fSwapBuffers(dpy
, surface
));
321 EGLBoolean
fCopyBuffers(EGLDisplay dpy
, EGLSurface surface
,
322 EGLNativePixmapType target
) const {
323 WRAP(fCopyBuffers(dpy
, surface
, target
));
327 const GLubyte
* fQueryString(EGLDisplay dpy
, EGLint name
) const {
328 WRAP(fQueryString(dpy
, name
));
332 EGLBoolean
fQueryContext(EGLDisplay dpy
, EGLContext ctx
, EGLint attribute
,
333 EGLint
* value
) const {
334 WRAP(fQueryContext(dpy
, ctx
, attribute
, value
));
337 EGLBoolean
fBindTexImage(EGLDisplay dpy
, EGLSurface surface
,
338 EGLint buffer
) const {
339 WRAP(fBindTexImage(dpy
, surface
, buffer
));
342 EGLBoolean
fReleaseTexImage(EGLDisplay dpy
, EGLSurface surface
,
343 EGLint buffer
) const {
344 WRAP(fReleaseTexImage(dpy
, surface
, buffer
));
347 EGLBoolean
fSwapInterval(EGLDisplay dpy
, EGLint interval
) const {
348 WRAP(fSwapInterval(dpy
, interval
));
351 EGLImage
fCreateImage(EGLDisplay dpy
, EGLContext ctx
, EGLenum target
,
352 EGLClientBuffer buffer
,
353 const EGLint
* attrib_list
) const {
354 WRAP(fCreateImageKHR(dpy
, ctx
, target
, buffer
, attrib_list
));
357 EGLBoolean
fDestroyImage(EGLDisplay dpy
, EGLImage image
) const {
358 WRAP(fDestroyImageKHR(dpy
, image
));
361 EGLBoolean
fQuerySurface(EGLDisplay dpy
, EGLSurface surface
, EGLint attribute
,
362 EGLint
* value
) const {
363 WRAP(fQuerySurface(dpy
, surface
, attribute
, value
));
366 EGLBoolean
fQuerySurfacePointerANGLE(EGLDisplay dpy
, EGLSurface surface
,
367 EGLint attribute
, void** value
) const {
368 WRAP(fQuerySurfacePointerANGLE(dpy
, surface
, attribute
, value
));
371 EGLSync
fCreateSync(EGLDisplay dpy
, EGLenum type
,
372 const EGLint
* attrib_list
) const {
373 WRAP(fCreateSyncKHR(dpy
, type
, attrib_list
));
376 EGLBoolean
fDestroySync(EGLDisplay dpy
, EGLSync sync
) const {
377 WRAP(fDestroySyncKHR(dpy
, sync
));
380 EGLint
fClientWaitSync(EGLDisplay dpy
, EGLSync sync
, EGLint flags
,
381 EGLTime timeout
) const {
382 WRAP(fClientWaitSyncKHR(dpy
, sync
, flags
, timeout
));
385 EGLBoolean
fGetSyncAttrib(EGLDisplay dpy
, EGLSync sync
, EGLint attribute
,
386 EGLint
* value
) const {
387 WRAP(fGetSyncAttribKHR(dpy
, sync
, attribute
, value
));
390 EGLint
fWaitSync(EGLDisplay dpy
, EGLSync sync
, EGLint flags
) const {
391 WRAP(fWaitSyncKHR(dpy
, sync
, flags
));
394 EGLint
fDupNativeFenceFDANDROID(EGLDisplay dpy
, EGLSync sync
) const {
395 WRAP(fDupNativeFenceFDANDROID(dpy
, sync
));
399 EGLStreamKHR
fCreateStreamKHR(EGLDisplay dpy
,
400 const EGLint
* attrib_list
) const {
401 WRAP(fCreateStreamKHR(dpy
, attrib_list
));
404 EGLBoolean
fDestroyStreamKHR(EGLDisplay dpy
, EGLStreamKHR stream
) const {
405 WRAP(fDestroyStreamKHR(dpy
, stream
));
408 EGLBoolean
fQueryStreamKHR(EGLDisplay dpy
, EGLStreamKHR stream
,
409 EGLenum attribute
, EGLint
* value
) const {
410 WRAP(fQueryStreamKHR(dpy
, stream
, attribute
, value
));
413 // KHR_stream_consumer_gltexture
414 EGLBoolean
fStreamConsumerGLTextureExternalKHR(EGLDisplay dpy
,
415 EGLStreamKHR stream
) const {
416 WRAP(fStreamConsumerGLTextureExternalKHR(dpy
, stream
));
419 EGLBoolean
fStreamConsumerAcquireKHR(EGLDisplay dpy
,
420 EGLStreamKHR stream
) const {
421 WRAP(fStreamConsumerAcquireKHR(dpy
, stream
));
424 EGLBoolean
fStreamConsumerReleaseKHR(EGLDisplay dpy
,
425 EGLStreamKHR stream
) const {
426 WRAP(fStreamConsumerReleaseKHR(dpy
, stream
));
430 EGLBoolean
fQueryDisplayAttribEXT(EGLDisplay dpy
, EGLint attribute
,
431 EGLAttrib
* value
) const {
432 WRAP(fQueryDisplayAttribEXT(dpy
, attribute
, value
));
436 EGLBoolean
fQueryDeviceAttribEXT(EGLDeviceEXT device
, EGLint attribute
,
437 EGLAttrib
* value
) const {
438 WRAP(fQueryDeviceAttribEXT(device
, attribute
, value
));
441 const char* fQueryDeviceStringEXT(EGLDeviceEXT device
, EGLint name
) {
442 WRAP(fQueryDeviceStringEXT(device
, name
));
446 // NV_stream_consumer_gltexture_yuv
447 EGLBoolean
fStreamConsumerGLTextureExternalAttribsNV(
448 EGLDisplay dpy
, EGLStreamKHR stream
, const EGLAttrib
* attrib_list
) const {
449 WRAP(fStreamConsumerGLTextureExternalAttribsNV(dpy
, stream
, attrib_list
));
452 // ANGLE_stream_producer_d3d_texture
453 EGLBoolean
fCreateStreamProducerD3DTextureANGLE(
454 EGLDisplay dpy
, EGLStreamKHR stream
, const EGLAttrib
* attrib_list
) const {
455 WRAP(fCreateStreamProducerD3DTextureANGLE(dpy
, stream
, attrib_list
));
458 EGLBoolean
fStreamPostD3DTextureANGLE(EGLDisplay dpy
, EGLStreamKHR stream
,
460 const EGLAttrib
* attrib_list
) const {
461 WRAP(fStreamPostD3DTextureANGLE(dpy
, stream
, texture
, attrib_list
));
464 // EGL_EXT_swap_buffers_with_damage / EGL_KHR_swap_buffers_with_damage
465 EGLBoolean
fSwapBuffersWithDamage(EGLDisplay dpy
, EGLSurface surface
,
466 const EGLint
* rects
, EGLint n_rects
) {
467 WRAP(fSwapBuffersWithDamage(dpy
, surface
, rects
, n_rects
));
470 // EGL_KHR_partial_update
471 EGLBoolean
fSetDamageRegion(EGLDisplay dpy
, EGLSurface surface
,
472 const EGLint
* rects
, EGLint n_rects
) {
473 WRAP(fSetDamageRegion(dpy
, surface
, rects
, n_rects
));
475 // EGL_MESA_image_dma_buf_export
476 EGLBoolean
fExportDMABUFImageQuery(EGLDisplay dpy
, EGLImage image
,
477 int* fourcc
, int* num_planes
,
478 uint64_t* modifiers
) {
480 fExportDMABUFImageQueryMESA(dpy
, image
, fourcc
, num_planes
, modifiers
));
482 EGLBoolean
fExportDMABUFImage(EGLDisplay dpy
, EGLImage image
, int* fds
,
483 EGLint
* strides
, EGLint
* offsets
) {
484 WRAP(fExportDMABUFImageMESA(dpy
, image
, fds
, strides
, offsets
));
488 // EGL_EXT_device_enumeration
489 EGLBoolean
fQueryDevicesEXT(EGLint max_devices
, EGLDeviceEXT
* devices
,
490 EGLint
* num_devices
) {
491 WRAP(fQueryDevicesEXT(max_devices
, devices
, num_devices
));
500 #undef MOZ_FUNCTION_NAME
506 EGLCastToRelevantPtr(GLAPIENTRY
* fGetProcAddress
)(const char* procname
);
507 EGLDisplay(GLAPIENTRY
* fGetDisplay
)(void* display_id
);
508 EGLDisplay(GLAPIENTRY
* fGetPlatformDisplay
)(EGLenum platform
,
509 void* native_display
,
510 const EGLAttrib
* attrib_list
);
511 EGLBoolean(GLAPIENTRY
* fTerminate
)(EGLDisplay dpy
);
512 EGLSurface(GLAPIENTRY
* fGetCurrentSurface
)(EGLint
);
513 EGLContext(GLAPIENTRY
* fGetCurrentContext
)(void);
514 EGLBoolean(GLAPIENTRY
* fMakeCurrent
)(EGLDisplay dpy
, EGLSurface draw
,
515 EGLSurface read
, EGLContext ctx
);
516 EGLBoolean(GLAPIENTRY
* fDestroyContext
)(EGLDisplay dpy
, EGLContext ctx
);
517 EGLContext(GLAPIENTRY
* fCreateContext
)(EGLDisplay dpy
, EGLConfig config
,
518 EGLContext share_context
,
519 const EGLint
* attrib_list
);
520 EGLBoolean(GLAPIENTRY
* fDestroySurface
)(EGLDisplay dpy
, EGLSurface surface
);
521 EGLSurface(GLAPIENTRY
* fCreateWindowSurface
)(EGLDisplay dpy
,
523 EGLNativeWindowType win
,
524 const EGLint
* attrib_list
);
525 EGLSurface(GLAPIENTRY
* fCreatePbufferSurface
)(EGLDisplay dpy
,
527 const EGLint
* attrib_list
);
528 EGLSurface(GLAPIENTRY
* fCreatePbufferFromClientBuffer
)(
529 EGLDisplay dpy
, EGLenum buftype
, EGLClientBuffer buffer
,
530 EGLConfig config
, const EGLint
* attrib_list
);
531 EGLSurface(GLAPIENTRY
* fCreatePixmapSurface
)(EGLDisplay dpy
,
533 EGLNativePixmapType pixmap
,
534 const EGLint
* attrib_list
);
535 EGLBoolean(GLAPIENTRY
* fBindAPI
)(EGLenum api
);
536 EGLBoolean(GLAPIENTRY
* fInitialize
)(EGLDisplay dpy
, EGLint
* major
,
538 EGLBoolean(GLAPIENTRY
* fChooseConfig
)(EGLDisplay dpy
,
539 const EGLint
* attrib_list
,
543 EGLint(GLAPIENTRY
* fGetError
)(void);
544 EGLBoolean(GLAPIENTRY
* fGetConfigAttrib
)(EGLDisplay dpy
, EGLConfig config
,
545 EGLint attribute
, EGLint
* value
);
546 EGLBoolean(GLAPIENTRY
* fGetConfigs
)(EGLDisplay dpy
, EGLConfig
* configs
,
547 EGLint config_size
, EGLint
* num_config
);
548 EGLBoolean(GLAPIENTRY
* fWaitNative
)(EGLint engine
);
549 EGLBoolean(GLAPIENTRY
* fSwapBuffers
)(EGLDisplay dpy
, EGLSurface surface
);
550 EGLBoolean(GLAPIENTRY
* fCopyBuffers
)(EGLDisplay dpy
, EGLSurface surface
,
551 EGLNativePixmapType target
);
552 const GLubyte
*(GLAPIENTRY
* fQueryString
)(EGLDisplay
, EGLint name
);
553 EGLBoolean(GLAPIENTRY
* fQueryContext
)(EGLDisplay dpy
, EGLContext ctx
,
554 EGLint attribute
, EGLint
* value
);
555 EGLBoolean(GLAPIENTRY
* fBindTexImage
)(EGLDisplay
, EGLSurface surface
,
557 EGLBoolean(GLAPIENTRY
* fReleaseTexImage
)(EGLDisplay
, EGLSurface surface
,
559 EGLBoolean(GLAPIENTRY
* fSwapInterval
)(EGLDisplay dpy
, EGLint interval
);
560 EGLImage(GLAPIENTRY
* fCreateImageKHR
)(EGLDisplay dpy
, EGLContext ctx
,
562 EGLClientBuffer buffer
,
563 const EGLint
* attrib_list
);
564 EGLBoolean(GLAPIENTRY
* fDestroyImageKHR
)(EGLDisplay dpy
, EGLImage image
);
565 EGLBoolean(GLAPIENTRY
* fQuerySurface
)(EGLDisplay dpy
, EGLSurface surface
,
566 EGLint attribute
, EGLint
* value
);
567 EGLBoolean(GLAPIENTRY
* fQuerySurfacePointerANGLE
)(EGLDisplay dpy
,
571 EGLSync(GLAPIENTRY
* fCreateSyncKHR
)(EGLDisplay dpy
, EGLenum type
,
572 const EGLint
* attrib_list
);
573 EGLBoolean(GLAPIENTRY
* fDestroySyncKHR
)(EGLDisplay dpy
, EGLSync sync
);
574 EGLint(GLAPIENTRY
* fClientWaitSyncKHR
)(EGLDisplay dpy
, EGLSync sync
,
575 EGLint flags
, EGLTime timeout
);
576 EGLBoolean(GLAPIENTRY
* fGetSyncAttribKHR
)(EGLDisplay dpy
, EGLSync sync
,
577 EGLint attribute
, EGLint
* value
);
578 EGLint(GLAPIENTRY
* fWaitSyncKHR
)(EGLDisplay dpy
, EGLSync sync
,
580 EGLint(GLAPIENTRY
* fDupNativeFenceFDANDROID
)(EGLDisplay dpy
, EGLSync sync
);
582 EGLStreamKHR(GLAPIENTRY
* fCreateStreamKHR
)(EGLDisplay dpy
,
583 const EGLint
* attrib_list
);
584 EGLBoolean(GLAPIENTRY
* fDestroyStreamKHR
)(EGLDisplay dpy
,
585 EGLStreamKHR stream
);
586 EGLBoolean(GLAPIENTRY
* fQueryStreamKHR
)(EGLDisplay dpy
, EGLStreamKHR stream
,
587 EGLenum attribute
, EGLint
* value
);
588 // KHR_stream_consumer_gltexture
589 EGLBoolean(GLAPIENTRY
* fStreamConsumerGLTextureExternalKHR
)(
590 EGLDisplay dpy
, EGLStreamKHR stream
);
591 EGLBoolean(GLAPIENTRY
* fStreamConsumerAcquireKHR
)(EGLDisplay dpy
,
592 EGLStreamKHR stream
);
593 EGLBoolean(GLAPIENTRY
* fStreamConsumerReleaseKHR
)(EGLDisplay dpy
,
594 EGLStreamKHR stream
);
596 EGLBoolean(GLAPIENTRY
* fQueryDisplayAttribEXT
)(EGLDisplay dpy
,
599 EGLBoolean(GLAPIENTRY
* fQueryDeviceAttribEXT
)(EGLDeviceEXT device
,
602 const char*(GLAPIENTRY
* fQueryDeviceStringEXT
)(EGLDeviceEXT device
,
605 // NV_stream_consumer_gltexture_yuv
606 EGLBoolean(GLAPIENTRY
* fStreamConsumerGLTextureExternalAttribsNV
)(
607 EGLDisplay dpy
, EGLStreamKHR stream
, const EGLAttrib
* attrib_list
);
608 // ANGLE_stream_producer_d3d_texture
609 EGLBoolean(GLAPIENTRY
* fCreateStreamProducerD3DTextureANGLE
)(
610 EGLDisplay dpy
, EGLStreamKHR stream
, const EGLAttrib
* attrib_list
);
611 EGLBoolean(GLAPIENTRY
* fStreamPostD3DTextureANGLE
)(
612 EGLDisplay dpy
, EGLStreamKHR stream
, void* texture
,
613 const EGLAttrib
* attrib_list
);
614 // ANGLE_device_creation
615 EGLDeviceEXT(GLAPIENTRY
* fCreateDeviceANGLE
)(EGLint device_type
,
617 const EGLAttrib
* attrib_list
);
618 EGLBoolean(GLAPIENTRY
* fReleaseDeviceANGLE
)(EGLDeviceEXT device
);
619 // EGL_EXT_swap_buffers_with_damage / EGL_KHR_swap_buffers_with_damage
620 EGLBoolean(GLAPIENTRY
* fSwapBuffersWithDamage
)(EGLDisplay dpy
,
624 // EGL_KHR_partial_update
625 EGLBoolean(GLAPIENTRY
* fSetDamageRegion
)(EGLDisplay dpy
, EGLSurface surface
,
628 EGLClientBuffer(GLAPIENTRY
* fGetNativeClientBufferANDROID
)(
629 const struct AHardwareBuffer
* buffer
);
631 // EGL_MESA_image_dma_buf_export
632 EGLBoolean(GLAPIENTRY
* fExportDMABUFImageQueryMESA
)(EGLDisplay dpy
,
636 uint64_t* modifiers
);
637 EGLBoolean(GLAPIENTRY
* fExportDMABUFImageMESA
)(EGLDisplay dpy
,
638 EGLImage image
, int* fds
,
642 EGLBoolean(GLAPIENTRY
* fQueryDevicesEXT
)(EGLint max_devices
,
643 EGLDeviceEXT
* devices
,
644 EGLint
* num_devices
);
649 class EglDisplay final
{
651 const RefPtr
<GLLibraryEGL
> mLib
;
652 const EGLDisplay mDisplay
;
656 std::bitset
<UnderlyingValue(EGLExtension::Max
)> mAvailableExtensions
;
658 struct PrivateUseOnly final
{};
661 static std::shared_ptr
<EglDisplay
> Create(
662 GLLibraryEGL
&, EGLDisplay
, bool isWarp
,
663 const StaticMutexAutoLock
& aProofOfLock
);
665 // Only `public` for make_shared.
666 EglDisplay(const PrivateUseOnly
&, GLLibraryEGL
&, EGLDisplay
, bool isWarp
);
671 bool IsExtensionSupported(EGLExtension aKnownExtension
) const {
672 return mAvailableExtensions
[UnderlyingValue(aKnownExtension
)];
675 void MarkExtensionUnsupported(EGLExtension aKnownExtension
) {
676 mAvailableExtensions
[UnderlyingValue(aKnownExtension
)] = false;
679 void DumpEGLConfig(EGLConfig
) const;
680 void DumpEGLConfigs() const;
686 bool HasKHRImageBase() const {
687 return IsExtensionSupported(EGLExtension::KHR_image
) ||
688 IsExtensionSupported(EGLExtension::KHR_image_base
);
691 bool HasKHRImagePixmap() const {
692 return IsExtensionSupported(EGLExtension::KHR_image
) ||
693 IsExtensionSupported(EGLExtension::KHR_image_pixmap
);
698 EGLBoolean
fTerminate() { return mLib
->fTerminate(mDisplay
); }
700 EGLBoolean
fMakeCurrent(EGLSurface draw
, EGLSurface read
,
701 EGLContext ctx
) const {
702 return mLib
->fMakeCurrent(mDisplay
, draw
, read
, ctx
);
705 EGLBoolean
fDestroyContext(EGLContext ctx
) const {
706 return mLib
->fDestroyContext(mDisplay
, ctx
);
709 EGLContext
fCreateContext(EGLConfig config
, EGLContext share_context
,
710 const EGLint
* attrib_list
) const {
711 return mLib
->fCreateContext(mDisplay
, config
, share_context
, attrib_list
);
714 EGLBoolean
fDestroySurface(EGLSurface surface
) const {
715 return mLib
->fDestroySurface(mDisplay
, surface
);
718 EGLSurface
fCreateWindowSurface(EGLConfig config
, EGLNativeWindowType win
,
719 const EGLint
* attrib_list
) const {
720 return mLib
->fCreateWindowSurface(mDisplay
, config
, win
, attrib_list
);
723 EGLSurface
fCreatePbufferSurface(EGLConfig config
,
724 const EGLint
* attrib_list
) const {
725 return mLib
->fCreatePbufferSurface(mDisplay
, config
, attrib_list
);
728 EGLSurface
fCreatePbufferFromClientBuffer(EGLenum buftype
,
729 EGLClientBuffer buffer
,
731 const EGLint
* attrib_list
) const {
732 return mLib
->fCreatePbufferFromClientBuffer(mDisplay
, buftype
, buffer
,
733 config
, attrib_list
);
736 EGLBoolean
fChooseConfig(const EGLint
* attrib_list
, EGLConfig
* configs
,
737 EGLint config_size
, EGLint
* num_config
) const {
738 return mLib
->fChooseConfig(mDisplay
, attrib_list
, configs
, config_size
,
742 EGLBoolean
fGetConfigAttrib(EGLConfig config
, EGLint attribute
,
743 EGLint
* value
) const {
744 return mLib
->fGetConfigAttrib(mDisplay
, config
, attribute
, value
);
747 EGLBoolean
fGetConfigs(EGLConfig
* configs
, EGLint config_size
,
748 EGLint
* num_config
) const {
749 return mLib
->fGetConfigs(mDisplay
, configs
, config_size
, num_config
);
752 EGLBoolean
fSwapBuffers(EGLSurface surface
) const {
753 return mLib
->fSwapBuffers(mDisplay
, surface
);
756 EGLBoolean
fBindTexImage(EGLSurface surface
, EGLint buffer
) const {
757 return mLib
->fBindTexImage(mDisplay
, surface
, buffer
);
760 EGLBoolean
fReleaseTexImage(EGLSurface surface
, EGLint buffer
) const {
761 return mLib
->fReleaseTexImage(mDisplay
, surface
, buffer
);
764 EGLBoolean
fSwapInterval(EGLint interval
) const {
765 return mLib
->fSwapInterval(mDisplay
, interval
);
768 EGLImage
fCreateImage(EGLContext ctx
, EGLenum target
, EGLClientBuffer buffer
,
769 const EGLint
* attribList
) const {
770 MOZ_ASSERT(HasKHRImageBase());
771 return mLib
->fCreateImage(mDisplay
, ctx
, target
, buffer
, attribList
);
774 EGLBoolean
fDestroyImage(EGLImage image
) const {
775 MOZ_ASSERT(HasKHRImageBase());
776 return mLib
->fDestroyImage(mDisplay
, image
);
779 EGLBoolean
fQuerySurface(EGLSurface surface
, EGLint attribute
,
780 EGLint
* value
) const {
781 return mLib
->fQuerySurface(mDisplay
, surface
, attribute
, value
);
784 EGLBoolean
fQuerySurfacePointerANGLE(EGLSurface surface
, EGLint attribute
,
785 void** value
) const {
786 MOZ_ASSERT(IsExtensionSupported(
787 EGLExtension::ANGLE_surface_d3d_texture_2d_share_handle
));
788 return mLib
->fQuerySurfacePointerANGLE(mDisplay
, surface
, attribute
, value
);
791 EGLSync
fCreateSync(EGLenum type
, const EGLint
* attrib_list
) const {
792 MOZ_ASSERT(IsExtensionSupported(EGLExtension::KHR_fence_sync
));
793 return mLib
->fCreateSync(mDisplay
, type
, attrib_list
);
796 EGLBoolean
fDestroySync(EGLSync sync
) const {
797 MOZ_ASSERT(IsExtensionSupported(EGLExtension::KHR_fence_sync
));
798 return mLib
->fDestroySync(mDisplay
, sync
);
801 EGLint
fClientWaitSync(EGLSync sync
, EGLint flags
, EGLTime timeout
) const {
802 MOZ_ASSERT(IsExtensionSupported(EGLExtension::KHR_fence_sync
));
803 return mLib
->fClientWaitSync(mDisplay
, sync
, flags
, timeout
);
806 EGLBoolean
fGetSyncAttrib(EGLSync sync
, EGLint attribute
,
807 EGLint
* value
) const {
808 MOZ_ASSERT(IsExtensionSupported(EGLExtension::KHR_fence_sync
));
809 return mLib
->fGetSyncAttrib(mDisplay
, sync
, attribute
, value
);
812 EGLint
fWaitSync(EGLSync sync
, EGLint flags
) const {
813 MOZ_ASSERT(IsExtensionSupported(EGLExtension::KHR_wait_sync
));
814 return mLib
->fWaitSync(mDisplay
, sync
, flags
);
817 EGLint
fDupNativeFenceFDANDROID(EGLSync sync
) const {
818 MOZ_ASSERT(IsExtensionSupported(EGLExtension::ANDROID_native_fence_sync
));
819 return mLib
->fDupNativeFenceFDANDROID(mDisplay
, sync
);
823 EGLBoolean
fQueryDisplayAttribEXT(EGLint attribute
, EGLAttrib
* value
) const {
824 MOZ_ASSERT(mLib
->IsExtensionSupported(EGLLibExtension::EXT_device_query
));
825 return mLib
->fQueryDisplayAttribEXT(mDisplay
, attribute
, value
);
829 EGLStreamKHR
fCreateStreamKHR(const EGLint
* attrib_list
) const {
830 MOZ_ASSERT(IsExtensionSupported(EGLExtension::KHR_stream
));
831 return mLib
->fCreateStreamKHR(mDisplay
, attrib_list
);
834 EGLBoolean
fDestroyStreamKHR(EGLStreamKHR stream
) const {
835 MOZ_ASSERT(IsExtensionSupported(EGLExtension::KHR_stream
));
836 return mLib
->fDestroyStreamKHR(mDisplay
, stream
);
839 EGLBoolean
fQueryStreamKHR(EGLStreamKHR stream
, EGLenum attribute
,
840 EGLint
* value
) const {
841 MOZ_ASSERT(IsExtensionSupported(EGLExtension::KHR_stream
));
842 return mLib
->fQueryStreamKHR(mDisplay
, stream
, attribute
, value
);
845 // KHR_stream_consumer_gltexture
846 EGLBoolean
fStreamConsumerGLTextureExternalKHR(EGLStreamKHR stream
) const {
848 IsExtensionSupported(EGLExtension::KHR_stream_consumer_gltexture
));
849 return mLib
->fStreamConsumerGLTextureExternalKHR(mDisplay
, stream
);
852 EGLBoolean
fStreamConsumerAcquireKHR(EGLStreamKHR stream
) const {
854 IsExtensionSupported(EGLExtension::KHR_stream_consumer_gltexture
));
855 return mLib
->fStreamConsumerAcquireKHR(mDisplay
, stream
);
858 EGLBoolean
fStreamConsumerReleaseKHR(EGLStreamKHR stream
) const {
860 IsExtensionSupported(EGLExtension::KHR_stream_consumer_gltexture
));
861 return mLib
->fStreamConsumerReleaseKHR(mDisplay
, stream
);
864 // NV_stream_consumer_gltexture_yuv
865 EGLBoolean
fStreamConsumerGLTextureExternalAttribsNV(
866 EGLStreamKHR stream
, const EGLAttrib
* attrib_list
) const {
868 IsExtensionSupported(EGLExtension::NV_stream_consumer_gltexture_yuv
));
869 return mLib
->fStreamConsumerGLTextureExternalAttribsNV(mDisplay
, stream
,
873 // ANGLE_stream_producer_d3d_texture
874 EGLBoolean
fCreateStreamProducerD3DTextureANGLE(
875 EGLStreamKHR stream
, const EGLAttrib
* attrib_list
) const {
877 IsExtensionSupported(EGLExtension::ANGLE_stream_producer_d3d_texture
));
878 return mLib
->fCreateStreamProducerD3DTextureANGLE(mDisplay
, stream
,
882 EGLBoolean
fStreamPostD3DTextureANGLE(EGLStreamKHR stream
, void* texture
,
883 const EGLAttrib
* attrib_list
) const {
885 IsExtensionSupported(EGLExtension::ANGLE_stream_producer_d3d_texture
));
886 return mLib
->fStreamPostD3DTextureANGLE(mDisplay
, stream
, texture
,
890 // EGL_EXT_swap_buffers_with_damage / EGL_KHR_swap_buffers_with_damage
891 EGLBoolean
fSwapBuffersWithDamage(EGLSurface surface
, const EGLint
* rects
,
894 IsExtensionSupported(EGLExtension::EXT_swap_buffers_with_damage
) ||
895 IsExtensionSupported(EGLExtension::KHR_swap_buffers_with_damage
));
896 return mLib
->fSwapBuffersWithDamage(mDisplay
, surface
, rects
, n_rects
);
899 // EGL_KHR_partial_update
900 EGLBoolean
fSetDamageRegion(EGLSurface surface
, const EGLint
* rects
,
902 MOZ_ASSERT(IsExtensionSupported(EGLExtension::KHR_partial_update
));
903 return mLib
->fSetDamageRegion(mDisplay
, surface
, rects
, n_rects
);
906 EGLBoolean
fExportDMABUFImageQuery(EGLImage image
, int* fourcc
,
908 uint64_t* modifiers
) const {
909 MOZ_ASSERT(IsExtensionSupported(EGLExtension::MESA_image_dma_buf_export
));
910 return mLib
->fExportDMABUFImageQuery(mDisplay
, image
, fourcc
, num_planes
,
913 EGLBoolean
fExportDMABUFImage(EGLImage image
, int* fds
, EGLint
* strides
,
914 EGLint
* offsets
) const {
915 MOZ_ASSERT(IsExtensionSupported(EGLExtension::MESA_image_dma_buf_export
));
916 return mLib
->fExportDMABUFImage(mDisplay
, image
, fds
, strides
, offsets
);
921 } /* namespace mozilla */
923 #endif /* GLLIBRARYEGL_H_ */