1 /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2 /* vim: set ts=8 sts=2 et sw=2 tw=80: */
3 /* This Source Code Form is subject to the terms of the Mozilla Public
4 * License, v. 2.0. If a copy of the MPL was not distributed with this
5 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
24 // Define MOZ_GL_DEBUG_BUILD unconditionally to enable GL debugging in opt
27 # define MOZ_GL_DEBUG_BUILD 1
30 #include "mozilla/IntegerRange.h"
31 #include "mozilla/RefPtr.h"
32 #include "mozilla/UniquePtr.h"
33 #include "mozilla/ThreadLocal.h"
35 #include "MozFramebuffer.h"
40 #include "nsRegionFwd.h"
42 #include "GLContextTypes.h"
43 #include "GLContextSymbols.h"
44 #include "base/platform_thread.h" // for PlatformThreadId
45 #include "mozilla/GenericRefCounted.h"
46 #include "mozilla/WeakPtr.h"
48 template <class ElemT
, class... More
>
49 constexpr inline std::array
<ElemT
, 1 + sizeof...(More
)> make_array(
50 ElemT
&& arg1
, More
&&... more
) {
51 return {std::forward
<ElemT
>(arg1
), std::forward
<ElemT
>(more
)...};
54 #ifdef MOZ_WIDGET_ANDROID
55 # include "mozilla/ProfilerLabels.h"
63 class GLReadTexImageHelper
;
70 class ColorTextureLayerProgram
;
74 class CompositorWidget
;
76 } // namespace mozilla
81 enum class GLFeature
{
94 EXT_color_buffer_float
,
98 framebuffer_multisample
,
100 framebuffer_object_EXT_OES
,
102 get_integer64_indexed
,
103 get_query_object_i64v
,
107 instanced_non_arrays
,
108 internalformat_query
,
109 invalidate_framebuffer
,
113 occlusion_query_boolean
,
115 packed_depth_stencil
,
123 renderbuffer_color_float
,
124 renderbuffer_color_half_float
,
125 robust_buffer_access_behavior
,
129 seamless_cube_map_opt_in
,
132 standard_derivatives
,
135 texture_3D_compressed
,
137 texture_compression_bptc
,
138 texture_compression_rgtc
,
140 texture_float_linear
,
142 texture_half_float_linear
,
143 texture_non_power_of_two
,
149 uniform_buffer_object
,
150 uniform_matrix_nonsquare
,
155 enum class ContextProfile
: uint8_t {
162 enum class GLRenderer
{
181 MicrosoftBasicRenderDriver
,
186 class GLContext
: public GenericAtomicRefCounted
, public SupportsWeakPtr
{
188 static MOZ_THREAD_LOCAL(const GLContext
*) sCurrentContext
;
190 static void InvalidateCurrentContext();
192 const GLContextDesc mDesc
;
194 bool mImplicitMakeCurrent
= false;
195 bool mUseTLSIsCurrent
;
197 static void ResetTLSCurrentContext();
199 class TlsScope final
{
200 const WeakPtr
<GLContext
> mGL
;
201 const bool mWasTlsOk
;
204 explicit TlsScope(GLContext
* const gl
, bool invalidate
= false)
205 : mGL(gl
), mWasTlsOk(gl
&& gl
->mUseTLSIsCurrent
) {
208 InvalidateCurrentContext();
210 mGL
->mUseTLSIsCurrent
= true;
216 mGL
->mUseTLSIsCurrent
= mWasTlsOk
;
221 // -----------------------------------------------------------------------------
225 * Returns true if the context is using ANGLE. This should only be overridden
226 * for an ANGLE implementation.
228 virtual bool IsANGLE() const { return false; }
231 * Returns true if the context is using WARP. This should only be overridden
232 * for an ANGLE implementation.
234 virtual bool IsWARP() const { return false; }
236 virtual void GetWSIInfo(nsCString
* const out
) const = 0;
239 * Return true if we are running on a OpenGL core profile context
241 inline bool IsCoreProfile() const {
242 MOZ_ASSERT(mProfile
!= ContextProfile::Unknown
, "unknown context profile");
244 return mProfile
== ContextProfile::OpenGLCore
;
248 * Return true if we are running on a OpenGL compatibility profile context
249 * (legacy profile 2.1 on Max OS X)
251 inline bool IsCompatibilityProfile() const {
252 MOZ_ASSERT(mProfile
!= ContextProfile::Unknown
, "unknown context profile");
254 return mProfile
== ContextProfile::OpenGLCompatibility
;
257 inline bool IsGLES() const {
258 MOZ_ASSERT(mProfile
!= ContextProfile::Unknown
, "unknown context profile");
260 return mProfile
== ContextProfile::OpenGLES
;
263 inline bool IsAtLeast(ContextProfile profile
, unsigned int version
) const {
264 MOZ_ASSERT(profile
!= ContextProfile::Unknown
,
265 "IsAtLeast: bad <profile> parameter");
266 MOZ_ASSERT(mProfile
!= ContextProfile::Unknown
, "unknown context profile");
267 MOZ_ASSERT(mVersion
!= 0, "unknown context version");
269 if (version
> mVersion
) {
273 return profile
== mProfile
;
277 * Return the version of the context.
279 * If this a OpenGL 2.1, that will return 210
281 inline uint32_t Version() const { return mVersion
; }
283 inline uint32_t ShadingLanguageVersion() const {
284 return mShadingLanguageVersion
;
287 GLVendor
Vendor() const { return mVendor
; }
288 GLRenderer
Renderer() const { return mRenderer
; }
289 bool IsMesa() const { return mIsMesa
; }
291 bool IsContextLost() const { return mContextLost
; }
293 bool CheckContextLost() const {
294 mTopError
= GetError();
295 return IsContextLost();
298 bool HasPBOState() const { return (!IsGLES() || Version() >= 300); }
301 * If this context is double-buffered, returns TRUE.
303 virtual bool IsDoubleBuffered() const { return false; }
305 virtual GLContextType
GetContextType() const = 0;
307 virtual bool IsCurrentImpl() const = 0;
308 virtual bool MakeCurrentImpl() const = 0;
310 bool IsCurrent() const {
311 if (mImplicitMakeCurrent
) return MakeCurrent();
313 return IsCurrentImpl();
316 bool MakeCurrent(bool aForce
= false) const;
319 * Get the default framebuffer for this context.
321 UniquePtr
<MozFramebuffer
> mOffscreenDefaultFb
;
323 bool CreateOffscreenDefaultFb(const gfx::IntSize
& size
);
325 virtual GLuint
GetDefaultFramebuffer() {
326 if (mOffscreenDefaultFb
) {
327 return mOffscreenDefaultFb
->mFB
;
333 * mVersion store the OpenGL's version, multiplied by 100. For example, if
334 * the context is an OpenGL 2.1 context, mVersion value will be 210.
336 uint32_t mVersion
= 0;
337 ContextProfile mProfile
= ContextProfile::Unknown
;
339 uint32_t mShadingLanguageVersion
= 0;
341 GLVendor mVendor
= GLVendor::Other
;
342 GLRenderer mRenderer
= GLRenderer::Other
;
343 bool mIsMesa
= false;
345 // -----------------------------------------------------------------------------
346 // Extensions management
348 * This mechanism is designed to know if an extension is supported. In the
349 * long term, we would like to only use the extension group queries XXX_* to
350 * have full compatibility with context version and profiles (especialy the
351 * core that officialy don't bring any extensions).
355 * Known GL extensions that can be queried by
356 * IsExtensionSupported. The results of this are cached, and as
357 * such it's safe to use this even in performance critical code.
358 * If you add to this array, remember to add to the string names
363 AMD_compressed_ATC_texture
,
365 ANGLE_framebuffer_blit
,
366 ANGLE_framebuffer_multisample
,
367 ANGLE_instanced_arrays
,
369 ANGLE_provoking_vertex
,
370 ANGLE_texture_compression_dxt3
,
371 ANGLE_texture_compression_dxt5
,
373 APPLE_client_storage
,
375 APPLE_framebuffer_multisample
,
378 APPLE_vertex_array_object
,
379 ARB_ES2_compatibility
,
380 ARB_ES3_compatibility
,
381 ARB_color_buffer_float
,
388 ARB_framebuffer_object
,
389 ARB_framebuffer_sRGB
,
390 ARB_geometry_shader4
,
391 ARB_half_float_pixel
,
392 ARB_instanced_arrays
,
393 ARB_internalformat_query
,
394 ARB_invalidate_subdata
,
395 ARB_map_buffer_range
,
396 ARB_occlusion_query2
,
397 ARB_pixel_buffer_object
,
398 ARB_provoking_vertex
,
399 ARB_robust_buffer_access_behavior
,
402 ARB_seamless_cube_map
,
403 ARB_shader_texture_lod
,
405 ARB_texture_compression
,
406 ARB_texture_compression_bptc
,
407 ARB_texture_compression_rgtc
,
409 ARB_texture_non_power_of_two
,
410 ARB_texture_rectangle
,
415 ARB_transform_feedback2
,
416 ARB_uniform_buffer_object
,
417 ARB_vertex_array_object
,
418 CHROMIUM_color_buffer_float_rgb
,
419 CHROMIUM_color_buffer_float_rgba
,
422 EXT_color_buffer_float
,
423 EXT_color_buffer_half_float
,
426 EXT_disjoint_timer_query
,
432 EXT_framebuffer_blit
,
433 EXT_framebuffer_multisample
,
434 EXT_framebuffer_object
,
435 EXT_framebuffer_sRGB
,
437 EXT_map_buffer_range
,
438 EXT_multisampled_render_to_texture
,
439 EXT_occlusion_query_boolean
,
440 EXT_packed_depth_stencil
,
441 EXT_provoking_vertex
,
442 EXT_read_format_bgra
,
445 EXT_sRGB_write_control
,
446 EXT_shader_texture_lod
,
447 EXT_texture_compression_bptc
,
448 EXT_texture_compression_dxt1
,
449 EXT_texture_compression_rgtc
,
450 EXT_texture_compression_s3tc
,
451 EXT_texture_compression_s3tc_srgb
,
452 EXT_texture_filter_anisotropic
,
453 EXT_texture_format_BGRA8888
,
458 EXT_transform_feedback
,
463 EXT_memory_object_fd
,
465 IMG_texture_compression_pvrtc
,
468 KHR_parallel_shader_compile
,
469 KHR_robust_buffer_access_behavior
,
471 KHR_texture_compression_astc_hdr
,
472 KHR_texture_compression_astc_ldr
,
476 NV_geometry_program4
,
479 NV_primitive_restart
,
481 NV_transform_feedback
,
482 NV_transform_feedback2
,
484 OES_EGL_image_external
,
486 OES_compressed_ETC1_RGB8_texture
,
490 OES_draw_buffers_indexed
,
491 OES_element_index_uint
,
492 OES_fbo_render_mipmap
,
493 OES_framebuffer_object
,
494 OES_packed_depth_stencil
,
496 OES_standard_derivatives
,
500 OES_texture_float_linear
,
501 OES_texture_half_float
,
502 OES_texture_half_float_linear
,
504 OES_vertex_array_object
,
510 bool IsExtensionSupported(GLExtensions aKnownExtension
) const {
511 return mAvailableExtensions
[aKnownExtension
];
515 void MarkExtensionUnsupported(GLExtensions aKnownExtension
) {
516 mAvailableExtensions
[aKnownExtension
] = 0;
519 void MarkExtensionSupported(GLExtensions aKnownExtension
) {
520 mAvailableExtensions
[aKnownExtension
] = 1;
523 std::bitset
<Extensions_Max
> mAvailableExtensions
;
525 // -----------------------------------------------------------------------------
528 * This mecahnism introduces a new way to check if a OpenGL feature is
529 * supported, regardless of whether it is supported by an extension or
530 * natively by the context version/profile
533 bool IsSupported(GLFeature feature
) const {
534 return mAvailableFeatures
[size_t(feature
)];
537 static const char* GetFeatureName(GLFeature feature
);
540 std::bitset
<size_t(GLFeature::EnumMax
)> mAvailableFeatures
;
543 * Init features regarding OpenGL extension and context version and profile
548 * Mark the feature and associated extensions as unsupported
550 void MarkUnsupported(GLFeature feature
);
553 * Is this feature supported using the core (unsuffixed) symbols?
555 bool IsFeatureProvidedByCoreSymbols(GLFeature feature
);
557 // -----------------------------------------------------------------------------
561 mutable bool mContextLost
= false;
562 mutable GLenum mTopError
= 0;
565 void OnContextLostError() const;
568 static std::string
GLErrorToString(GLenum aError
);
570 static bool IsBadCallError(const GLenum err
) {
571 return !(err
== 0 || err
== LOCAL_GL_CONTEXT_LOST
);
574 class LocalErrorScope
;
577 mutable std::stack
<const LocalErrorScope
*> mLocalErrorScopeStack
;
578 mutable UniquePtr
<LocalErrorScope
> mDebugErrorScope
;
580 ////////////////////////////////////
581 // Use this safer option.
584 class LocalErrorScope
{
585 const GLContext
& mGL
;
587 bool mHasBeenChecked
;
590 explicit LocalErrorScope(const GLContext
& gl
)
591 : mGL(gl
), mHasBeenChecked(false) {
592 mGL
.mLocalErrorScopeStack
.push(this);
593 mOldTop
= mGL
.GetError();
596 /// Never returns CONTEXT_LOST.
598 MOZ_ASSERT(!mHasBeenChecked
);
599 mHasBeenChecked
= true;
601 const auto ret
= mGL
.GetError();
602 if (ret
== LOCAL_GL_CONTEXT_LOST
) return 0;
607 MOZ_ASSERT(mHasBeenChecked
);
609 MOZ_ASSERT(!IsBadCallError(mGL
.GetError()));
611 MOZ_ASSERT(mGL
.mLocalErrorScopeStack
.top() == this);
612 mGL
.mLocalErrorScopeStack
.pop();
614 mGL
.mTopError
= mOldTop
;
620 bool GetPotentialInteger(GLenum pname
, GLint
* param
) {
621 LocalErrorScope
localError(*this);
623 fGetIntegerv(pname
, param
);
625 GLenum err
= localError
.GetError();
626 MOZ_ASSERT_IF(err
!= LOCAL_GL_NO_ERROR
, err
== LOCAL_GL_INVALID_ENUM
);
627 return err
== LOCAL_GL_NO_ERROR
;
630 void DebugCallback(GLenum source
, GLenum type
, GLuint id
, GLenum severity
,
631 GLsizei length
, const GLchar
* message
);
634 static void GLAPIENTRY
StaticDebugCallback(GLenum source
, GLenum type
,
635 GLuint id
, GLenum severity
,
637 const GLchar
* message
,
638 const GLvoid
* userParam
);
640 // -----------------------------------------------------------------------------
641 // Debugging implementation
643 #ifndef MOZ_FUNCTION_NAME
645 # define MOZ_FUNCTION_NAME __PRETTY_FUNCTION__
646 # elif defined(_MSC_VER)
647 # define MOZ_FUNCTION_NAME __FUNCTION__
649 # define MOZ_FUNCTION_NAME \
650 __func__ // defined in C99, supported in various C++ compilers. Just raw
655 #ifdef MOZ_WIDGET_ANDROID
656 // Record the name of the GL call for better hang stacks on Android.
657 # define ANDROID_ONLY_PROFILER_LABEL AUTO_PROFILER_LABEL(__func__, GRAPHICS);
659 # define ANDROID_ONLY_PROFILER_LABEL
662 #define BEFORE_GL_CALL \
663 ANDROID_ONLY_PROFILER_LABEL \
664 if (MOZ_LIKELY(BeforeGLCall(MOZ_FUNCTION_NAME))) { \
668 #define AFTER_GL_CALL \
669 AfterGLCall(MOZ_FUNCTION_NAME); \
674 void BeforeGLCall_Debug(const char* funcName
) const;
675 void AfterGLCall_Debug(const char* funcName
) const;
676 static void OnImplicitMakeCurrentFailure(const char* funcName
);
678 bool BeforeGLCall(const char* const funcName
) const {
679 if (mImplicitMakeCurrent
) {
680 if (MOZ_UNLIKELY(!MakeCurrent())) {
682 OnImplicitMakeCurrentFailure(funcName
);
687 MOZ_GL_ASSERT(this, IsCurrentImpl());
689 if (MOZ_UNLIKELY(mDebugFlags
)) {
690 BeforeGLCall_Debug(funcName
);
695 void AfterGLCall(const char* const funcName
) const {
696 if (MOZ_UNLIKELY(mDebugFlags
)) {
697 AfterGLCall_Debug(funcName
);
701 GLContext
* TrackingContext() {
702 GLContext
* tip
= this;
703 while (tip
->mSharedContext
) tip
= tip
->mSharedContext
;
707 static void AssertNotPassingStackBufferToTheGL(const void* ptr
);
709 #ifdef MOZ_GL_DEBUG_BUILD
711 # define TRACKING_CONTEXT(a) \
713 TrackingContext()->a; \
716 # define ASSERT_NOT_PASSING_STACK_BUFFER_TO_GL(ptr) \
717 AssertNotPassingStackBufferToTheGL(ptr)
719 # define ASSERT_SYMBOL_PRESENT(func) \
721 MOZ_ASSERT(strstr(MOZ_FUNCTION_NAME, #func) != nullptr, \
722 "Mismatched symbol check."); \
723 if (MOZ_UNLIKELY(!mSymbols.func)) { \
724 printf_stderr("RUNTIME ASSERT: Uninitialized GL function: %s\n", \
726 MOZ_CRASH("GFX: Uninitialized GL function"); \
730 #else // ifdef MOZ_GL_DEBUG_BUILD
732 # define TRACKING_CONTEXT(a) \
735 # define ASSERT_NOT_PASSING_STACK_BUFFER_TO_GL(ptr) \
738 # define ASSERT_SYMBOL_PRESENT(func) \
742 #endif // ifdef MOZ_GL_DEBUG_BUILD
744 // Do whatever setup is necessary to draw to our offscreen FBO, if it's
746 void BeforeGLDrawCall() {}
748 // Do whatever tear-down is necessary after drawing to our offscreen FBO,
750 void AfterGLDrawCall() { mHeavyGLCallsSinceLastFlush
= true; }
752 // Do whatever setup is necessary to read from our offscreen FBO, if it's
754 void BeforeGLReadCall() {}
756 // Do whatever tear-down is necessary after reading from our offscreen FBO,
758 void AfterGLReadCall() {}
761 void OnSyncCall() const { mSyncGLCallCount
++; }
763 uint64_t GetSyncCallCount() const { return mSyncGLCallCount
; }
765 void ResetSyncCallCount(const char* resetReason
) const;
767 // -----------------------------------------------------------------------------
768 // GL official entry points
770 // We smash all errors together, so you never have to loop on this. We
771 // guarantee that immediately after this call, there are no errors left.
772 // Always returns the top-most error, except if followed by CONTEXT_LOST, then
773 // return that instead.
774 GLenum
GetError() const;
776 GLenum
fGetError() { return GetError(); }
778 GLenum
fGetGraphicsResetStatus() const;
782 void fActiveTexture(GLenum texture
) {
784 mSymbols
.fActiveTexture(texture
);
788 void fAttachShader(GLuint program
, GLuint shader
) {
790 mSymbols
.fAttachShader(program
, shader
);
794 void fBeginQuery(GLenum target
, GLuint id
) {
796 ASSERT_SYMBOL_PRESENT(fBeginQuery
);
797 mSymbols
.fBeginQuery(target
, id
);
801 void fBindAttribLocation(GLuint program
, GLuint index
, const GLchar
* name
) {
803 mSymbols
.fBindAttribLocation(program
, index
, name
);
807 void fBindBuffer(GLenum target
, GLuint buffer
) {
809 mSymbols
.fBindBuffer(target
, buffer
);
813 void InvalidateFramebuffer(GLenum target
) {
814 constexpr auto ATTACHMENTS
= make_array(GLenum
{LOCAL_GL_COLOR_ATTACHMENT0
},
815 LOCAL_GL_DEPTH_STENCIL_ATTACHMENT
);
816 fInvalidateFramebuffer(target
, ATTACHMENTS
.size(), ATTACHMENTS
.data());
819 void fInvalidateFramebuffer(GLenum target
, GLsizei numAttachments
,
820 const GLenum
* attachments
) {
821 if (!mSymbols
.fInvalidateFramebuffer
) return;
824 ASSERT_SYMBOL_PRESENT(fInvalidateFramebuffer
);
825 mSymbols
.fInvalidateFramebuffer(target
, numAttachments
, attachments
);
830 void fInvalidateSubFramebuffer(GLenum target
, GLsizei numAttachments
,
831 const GLenum
* attachments
, GLint x
, GLint y
,
832 GLsizei width
, GLsizei height
) {
833 if (!mSymbols
.fInvalidateSubFramebuffer
) return;
836 ASSERT_SYMBOL_PRESENT(fInvalidateSubFramebuffer
);
837 mSymbols
.fInvalidateSubFramebuffer(target
, numAttachments
, attachments
, x
,
843 void fBindTexture(GLenum target
, GLuint texture
) {
845 mSymbols
.fBindTexture(target
, texture
);
849 void BindSamplerTexture(GLuint texUnitId
, GLuint samplerHandle
,
850 GLenum texTarget
, GLuint texHandle
) {
851 fBindSampler(texUnitId
, samplerHandle
);
852 fActiveTexture(LOCAL_GL_TEXTURE0
+ texUnitId
);
853 fBindTexture(texTarget
, texHandle
);
856 void fBlendColor(GLfloat red
, GLfloat green
, GLfloat blue
, GLfloat alpha
) {
858 mSymbols
.fBlendColor(red
, green
, blue
, alpha
);
862 void fBlendEquation(GLenum mode
) {
864 mSymbols
.fBlendEquation(mode
);
868 void fBlendEquationSeparate(GLenum modeRGB
, GLenum modeAlpha
) {
870 mSymbols
.fBlendEquationSeparate(modeRGB
, modeAlpha
);
874 void fBlendFunc(GLenum sfactor
, GLenum dfactor
) {
876 mSymbols
.fBlendFunc(sfactor
, dfactor
);
880 void fBlendFuncSeparate(GLenum sfactorRGB
, GLenum dfactorRGB
,
881 GLenum sfactorAlpha
, GLenum dfactorAlpha
) {
883 mSymbols
.fBlendFuncSeparate(sfactorRGB
, dfactorRGB
, sfactorAlpha
,
889 void raw_fBufferData(GLenum target
, GLsizeiptr size
, const GLvoid
* data
,
891 ASSERT_NOT_PASSING_STACK_BUFFER_TO_GL(data
);
893 mSymbols
.fBufferData(target
, size
, data
, usage
);
896 mHeavyGLCallsSinceLastFlush
= true;
900 void fBufferData(GLenum target
, GLsizeiptr size
, const GLvoid
* data
,
902 raw_fBufferData(target
, size
, data
, usage
);
905 if (WorkAroundDriverBugs() && !data
&& Vendor() == GLVendor::NVIDIA
) {
906 UniquePtr
<char[]> buf
= MakeUnique
<char[]>(1);
908 fBufferSubData(target
, size
- 1, 1, buf
.get());
912 void fBufferSubData(GLenum target
, GLintptr offset
, GLsizeiptr size
,
913 const GLvoid
* data
) {
914 ASSERT_NOT_PASSING_STACK_BUFFER_TO_GL(data
);
916 mSymbols
.fBufferSubData(target
, offset
, size
, data
);
918 mHeavyGLCallsSinceLastFlush
= true;
922 void raw_fClear(GLbitfield mask
) {
924 mSymbols
.fClear(mask
);
929 void fClear(GLbitfield mask
) {
935 void fClearBufferfi(GLenum buffer
, GLint drawbuffer
, GLfloat depth
,
939 mSymbols
.fClearBufferfi(buffer
, drawbuffer
, depth
, stencil
);
944 void fClearBufferfv(GLenum buffer
, GLint drawbuffer
, const GLfloat
* value
) {
947 mSymbols
.fClearBufferfv(buffer
, drawbuffer
, value
);
952 void fClearBufferiv(GLenum buffer
, GLint drawbuffer
, const GLint
* value
) {
955 mSymbols
.fClearBufferiv(buffer
, drawbuffer
, value
);
960 void fClearBufferuiv(GLenum buffer
, GLint drawbuffer
, const GLuint
* value
) {
963 mSymbols
.fClearBufferuiv(buffer
, drawbuffer
, value
);
968 void fClearColor(GLfloat r
, GLfloat g
, GLfloat b
, GLfloat a
) {
970 mSymbols
.fClearColor(r
, g
, b
, a
);
974 void fClearStencil(GLint s
) {
976 mSymbols
.fClearStencil(s
);
980 void fClientActiveTexture(GLenum texture
) {
982 mSymbols
.fClientActiveTexture(texture
);
986 void fColorMask(realGLboolean red
, realGLboolean green
, realGLboolean blue
,
987 realGLboolean alpha
) {
989 mSymbols
.fColorMask(red
, green
, blue
, alpha
);
993 void fCompressedTexImage2D(GLenum target
, GLint level
, GLenum internalformat
,
994 GLsizei width
, GLsizei height
, GLint border
,
995 GLsizei imageSize
, const GLvoid
* pixels
) {
996 ASSERT_NOT_PASSING_STACK_BUFFER_TO_GL(pixels
);
998 mSymbols
.fCompressedTexImage2D(target
, level
, internalformat
, width
, height
,
999 border
, imageSize
, pixels
);
1001 mHeavyGLCallsSinceLastFlush
= true;
1004 void fCompressedTexSubImage2D(GLenum target
, GLint level
, GLint xoffset
,
1005 GLint yoffset
, GLsizei width
, GLsizei height
,
1006 GLenum format
, GLsizei imageSize
,
1007 const GLvoid
* pixels
) {
1008 ASSERT_NOT_PASSING_STACK_BUFFER_TO_GL(pixels
);
1010 mSymbols
.fCompressedTexSubImage2D(target
, level
, xoffset
, yoffset
, width
,
1011 height
, format
, imageSize
, pixels
);
1013 mHeavyGLCallsSinceLastFlush
= true;
1016 void fCopyTexImage2D(GLenum target
, GLint level
, GLenum internalformat
,
1017 GLint x
, GLint y
, GLsizei width
, GLsizei height
,
1020 void fCopyTexSubImage2D(GLenum target
, GLint level
, GLint xoffset
,
1021 GLint yoffset
, GLint x
, GLint y
, GLsizei width
,
1024 raw_fCopyTexSubImage2D(target
, level
, xoffset
, yoffset
, x
, y
, width
,
1029 void fCullFace(GLenum mode
) {
1031 mSymbols
.fCullFace(mode
);
1035 void fDebugMessageCallback(GLDEBUGPROC callback
, const GLvoid
* userParam
) {
1037 ASSERT_SYMBOL_PRESENT(fDebugMessageCallback
);
1038 mSymbols
.fDebugMessageCallback(callback
, userParam
);
1042 void fDebugMessageControl(GLenum source
, GLenum type
, GLenum severity
,
1043 GLsizei count
, const GLuint
* ids
,
1044 realGLboolean enabled
) {
1046 ASSERT_SYMBOL_PRESENT(fDebugMessageControl
);
1047 mSymbols
.fDebugMessageControl(source
, type
, severity
, count
, ids
, enabled
);
1051 void fDebugMessageInsert(GLenum source
, GLenum type
, GLuint id
,
1052 GLenum severity
, GLsizei length
, const GLchar
* buf
) {
1054 ASSERT_SYMBOL_PRESENT(fDebugMessageInsert
);
1055 mSymbols
.fDebugMessageInsert(source
, type
, id
, severity
, length
, buf
);
1059 void fDetachShader(GLuint program
, GLuint shader
) {
1061 mSymbols
.fDetachShader(program
, shader
);
1065 void fDepthFunc(GLenum func
) {
1067 mSymbols
.fDepthFunc(func
);
1071 void fDepthMask(realGLboolean flag
) {
1073 mSymbols
.fDepthMask(flag
);
1077 void fDisable(GLenum capability
) {
1079 mSymbols
.fDisable(capability
);
1083 void fDisableClientState(GLenum capability
) {
1085 mSymbols
.fDisableClientState(capability
);
1089 void fDisableVertexAttribArray(GLuint index
) {
1091 mSymbols
.fDisableVertexAttribArray(index
);
1095 void fDrawBuffer(GLenum mode
) {
1097 mSymbols
.fDrawBuffer(mode
);
1102 void raw_fDrawArrays(GLenum mode
, GLint first
, GLsizei count
) {
1104 mSymbols
.fDrawArrays(mode
, first
, count
);
1108 void raw_fDrawElements(GLenum mode
, GLsizei count
, GLenum type
,
1109 const GLvoid
* indices
) {
1111 mSymbols
.fDrawElements(mode
, count
, type
, indices
);
1116 void fDrawArrays(GLenum mode
, GLint first
, GLsizei count
) {
1118 raw_fDrawArrays(mode
, first
, count
);
1122 void fDrawElements(GLenum mode
, GLsizei count
, GLenum type
,
1123 const GLvoid
* indices
) {
1125 raw_fDrawElements(mode
, count
, type
, indices
);
1129 void fEnable(GLenum capability
) {
1131 mSymbols
.fEnable(capability
);
1135 void fEnableClientState(GLenum capability
) {
1137 mSymbols
.fEnableClientState(capability
);
1141 void fEnableVertexAttribArray(GLuint index
) {
1143 mSymbols
.fEnableVertexAttribArray(index
);
1147 void fEndQuery(GLenum target
) {
1149 ASSERT_SYMBOL_PRESENT(fEndQuery
);
1150 mSymbols
.fEndQuery(target
);
1159 mHeavyGLCallsSinceLastFlush
= false;
1166 mHeavyGLCallsSinceLastFlush
= false;
1169 void fFrontFace(GLenum face
) {
1171 mSymbols
.fFrontFace(face
);
1175 void fGetActiveAttrib(GLuint program
, GLuint index
, GLsizei maxLength
,
1176 GLsizei
* length
, GLint
* size
, GLenum
* type
,
1179 mSymbols
.fGetActiveAttrib(program
, index
, maxLength
, length
, size
, type
,
1185 void fGetActiveUniform(GLuint program
, GLuint index
, GLsizei maxLength
,
1186 GLsizei
* length
, GLint
* size
, GLenum
* type
,
1189 mSymbols
.fGetActiveUniform(program
, index
, maxLength
, length
, size
, type
,
1195 void fGetAttachedShaders(GLuint program
, GLsizei maxCount
, GLsizei
* count
,
1198 mSymbols
.fGetAttachedShaders(program
, maxCount
, count
, shaders
);
1203 GLint
fGetAttribLocation(GLuint program
, const GLchar
* name
) {
1206 retval
= mSymbols
.fGetAttribLocation(program
, name
);
1213 void raw_fGetIntegerv(GLenum pname
, GLint
* params
) const {
1215 mSymbols
.fGetIntegerv(pname
, params
);
1221 void fGetIntegerv(GLenum pname
, GLint
* params
) const;
1223 template <typename T
>
1224 void GetInt(const GLenum pname
, T
* const params
) const {
1225 static_assert(sizeof(T
) == sizeof(GLint
), "Invalid T.");
1226 fGetIntegerv(pname
, reinterpret_cast<GLint
*>(params
));
1229 void GetUIntegerv(GLenum pname
, GLuint
* params
) const {
1230 GetInt(pname
, params
);
1233 template <typename T
>
1234 T
GetIntAs(GLenum pname
) const {
1235 static_assert(sizeof(T
) == sizeof(GLint
), "Invalid T.");
1237 fGetIntegerv(pname
, (GLint
*)&ret
);
1241 void fGetFloatv(GLenum pname
, GLfloat
* params
) const {
1243 mSymbols
.fGetFloatv(pname
, params
);
1248 void fGetBooleanv(GLenum pname
, realGLboolean
* params
) const {
1250 mSymbols
.fGetBooleanv(pname
, params
);
1255 void fGetBufferParameteriv(GLenum target
, GLenum pname
, GLint
* params
) {
1257 mSymbols
.fGetBufferParameteriv(target
, pname
, params
);
1262 GLuint
fGetDebugMessageLog(GLuint count
, GLsizei bufsize
, GLenum
* sources
,
1263 GLenum
* types
, GLuint
* ids
, GLenum
* severities
,
1264 GLsizei
* lengths
, GLchar
* messageLog
) {
1267 ASSERT_SYMBOL_PRESENT(fGetDebugMessageLog
);
1268 ret
= mSymbols
.fGetDebugMessageLog(count
, bufsize
, sources
, types
, ids
,
1269 severities
, lengths
, messageLog
);
1275 void fGetPointerv(GLenum pname
, GLvoid
** params
) {
1277 ASSERT_SYMBOL_PRESENT(fGetPointerv
);
1278 mSymbols
.fGetPointerv(pname
, params
);
1283 void fGetObjectLabel(GLenum identifier
, GLuint name
, GLsizei bufSize
,
1284 GLsizei
* length
, GLchar
* label
) {
1286 ASSERT_SYMBOL_PRESENT(fGetObjectLabel
);
1287 mSymbols
.fGetObjectLabel(identifier
, name
, bufSize
, length
, label
);
1292 void fGetObjectPtrLabel(const GLvoid
* ptr
, GLsizei bufSize
, GLsizei
* length
,
1295 ASSERT_SYMBOL_PRESENT(fGetObjectPtrLabel
);
1296 mSymbols
.fGetObjectPtrLabel(ptr
, bufSize
, length
, label
);
1301 void fGenerateMipmap(GLenum target
) {
1303 mSymbols
.fGenerateMipmap(target
);
1307 void fGetProgramiv(GLuint program
, GLenum pname
, GLint
* param
) {
1309 mSymbols
.fGetProgramiv(program
, pname
, param
);
1314 void fGetProgramInfoLog(GLuint program
, GLsizei bufSize
, GLsizei
* length
,
1317 mSymbols
.fGetProgramInfoLog(program
, bufSize
, length
, infoLog
);
1322 void fTexParameteri(GLenum target
, GLenum pname
, GLint param
) {
1324 mSymbols
.fTexParameteri(target
, pname
, param
);
1328 void fTexParameteriv(GLenum target
, GLenum pname
, const GLint
* params
) {
1330 mSymbols
.fTexParameteriv(target
, pname
, params
);
1334 void fTexParameterf(GLenum target
, GLenum pname
, GLfloat param
) {
1336 mSymbols
.fTexParameterf(target
, pname
, param
);
1340 const GLubyte
* fGetString(GLenum name
) {
1341 const GLubyte
* result
= nullptr;
1343 result
= mSymbols
.fGetString(name
);
1349 void fGetTexImage(GLenum target
, GLint level
, GLenum format
, GLenum type
,
1352 ASSERT_SYMBOL_PRESENT(fGetTexImage
);
1353 mSymbols
.fGetTexImage(target
, level
, format
, type
, img
);
1358 void fGetTexLevelParameteriv(GLenum target
, GLint level
, GLenum pname
,
1361 ASSERT_SYMBOL_PRESENT(fGetTexLevelParameteriv
);
1362 mSymbols
.fGetTexLevelParameteriv(target
, level
, pname
, params
);
1367 void fGetTexParameterfv(GLenum target
, GLenum pname
, GLfloat
* params
) {
1369 mSymbols
.fGetTexParameterfv(target
, pname
, params
);
1374 void fGetTexParameteriv(GLenum target
, GLenum pname
, GLint
* params
) {
1376 mSymbols
.fGetTexParameteriv(target
, pname
, params
);
1381 void fGetUniformfv(GLuint program
, GLint location
, GLfloat
* params
) {
1383 mSymbols
.fGetUniformfv(program
, location
, params
);
1388 void fGetUniformiv(GLuint program
, GLint location
, GLint
* params
) {
1390 mSymbols
.fGetUniformiv(program
, location
, params
);
1395 void fGetUniformuiv(GLuint program
, GLint location
, GLuint
* params
) {
1397 ASSERT_SYMBOL_PRESENT(fGetUniformuiv
);
1398 mSymbols
.fGetUniformuiv(program
, location
, params
);
1403 GLint
fGetUniformLocation(GLuint programObj
, const GLchar
* name
) {
1406 retval
= mSymbols
.fGetUniformLocation(programObj
, name
);
1412 void fGetVertexAttribfv(GLuint index
, GLenum pname
, GLfloat
* retval
) {
1414 mSymbols
.fGetVertexAttribfv(index
, pname
, retval
);
1419 void fGetVertexAttribiv(GLuint index
, GLenum pname
, GLint
* retval
) {
1421 mSymbols
.fGetVertexAttribiv(index
, pname
, retval
);
1426 void fGetVertexAttribPointerv(GLuint index
, GLenum pname
, GLvoid
** retval
) {
1428 mSymbols
.fGetVertexAttribPointerv(index
, pname
, retval
);
1433 void fHint(GLenum target
, GLenum mode
) {
1435 mSymbols
.fHint(target
, mode
);
1439 realGLboolean
fIsBuffer(GLuint buffer
) {
1440 realGLboolean retval
= false;
1442 retval
= mSymbols
.fIsBuffer(buffer
);
1448 realGLboolean
fIsEnabled(GLenum capability
) {
1449 realGLboolean retval
= false;
1451 retval
= mSymbols
.fIsEnabled(capability
);
1456 void SetEnabled(const GLenum cap
, const bool val
) {
1464 bool PushEnabled(const GLenum cap
, const bool newVal
) {
1465 const bool oldVal
= fIsEnabled(cap
);
1466 if (oldVal
!= newVal
) {
1467 SetEnabled(cap
, newVal
);
1472 realGLboolean
fIsProgram(GLuint program
) {
1473 realGLboolean retval
= false;
1475 retval
= mSymbols
.fIsProgram(program
);
1480 realGLboolean
fIsShader(GLuint shader
) {
1481 realGLboolean retval
= false;
1483 retval
= mSymbols
.fIsShader(shader
);
1488 realGLboolean
fIsTexture(GLuint texture
) {
1489 realGLboolean retval
= false;
1491 retval
= mSymbols
.fIsTexture(texture
);
1496 void fLineWidth(GLfloat width
) {
1498 mSymbols
.fLineWidth(width
);
1502 void fLinkProgram(GLuint program
) {
1504 mSymbols
.fLinkProgram(program
);
1508 void fObjectLabel(GLenum identifier
, GLuint name
, GLsizei length
,
1509 const GLchar
* label
) {
1511 ASSERT_SYMBOL_PRESENT(fObjectLabel
);
1512 mSymbols
.fObjectLabel(identifier
, name
, length
, label
);
1516 void fObjectPtrLabel(const GLvoid
* ptr
, GLsizei length
, const GLchar
* label
) {
1518 ASSERT_SYMBOL_PRESENT(fObjectPtrLabel
);
1519 mSymbols
.fObjectPtrLabel(ptr
, length
, label
);
1523 void fLoadIdentity() {
1525 mSymbols
.fLoadIdentity();
1529 void fLoadMatrixf(const GLfloat
* matrix
) {
1531 mSymbols
.fLoadMatrixf(matrix
);
1535 void fMatrixMode(GLenum mode
) {
1537 mSymbols
.fMatrixMode(mode
);
1541 void fPixelStorei(GLenum pname
, GLint param
) {
1543 mSymbols
.fPixelStorei(pname
, param
);
1547 void fTextureRangeAPPLE(GLenum target
, GLsizei length
, GLvoid
* pointer
) {
1548 ASSERT_NOT_PASSING_STACK_BUFFER_TO_GL(pointer
);
1550 mSymbols
.fTextureRangeAPPLE(target
, length
, pointer
);
1554 void fPointParameterf(GLenum pname
, GLfloat param
) {
1556 mSymbols
.fPointParameterf(pname
, param
);
1560 void fPolygonMode(GLenum face
, GLenum mode
) {
1562 mSymbols
.fPolygonMode(face
, mode
);
1566 void fPolygonOffset(GLfloat factor
, GLfloat bias
) {
1568 mSymbols
.fPolygonOffset(factor
, bias
);
1572 void fPopDebugGroup() {
1574 ASSERT_SYMBOL_PRESENT(fPopDebugGroup
);
1575 mSymbols
.fPopDebugGroup();
1579 void fPushDebugGroup(GLenum source
, GLuint id
, GLsizei length
,
1580 const GLchar
* message
) {
1582 ASSERT_SYMBOL_PRESENT(fPushDebugGroup
);
1583 mSymbols
.fPushDebugGroup(source
, id
, length
, message
);
1587 void fReadBuffer(GLenum mode
) {
1589 mSymbols
.fReadBuffer(mode
);
1593 void raw_fReadPixels(GLint x
, GLint y
, GLsizei width
, GLsizei height
,
1594 GLenum format
, GLenum type
, GLvoid
* pixels
) {
1596 mSymbols
.fReadPixels(x
, y
, width
, height
, format
, type
, pixels
);
1599 mHeavyGLCallsSinceLastFlush
= true;
1602 void fReadPixels(GLint x
, GLint y
, GLsizei width
, GLsizei height
,
1603 GLenum format
, GLenum type
, GLvoid
* pixels
);
1606 void fSampleCoverage(GLclampf value
, realGLboolean invert
) {
1608 mSymbols
.fSampleCoverage(value
, invert
);
1612 void fScissor(GLint x
, GLint y
, GLsizei width
, GLsizei height
) {
1613 if (mScissorRect
[0] == x
&& mScissorRect
[1] == y
&&
1614 mScissorRect
[2] == width
&& mScissorRect
[3] == height
) {
1617 mScissorRect
[0] = x
;
1618 mScissorRect
[1] = y
;
1619 mScissorRect
[2] = width
;
1620 mScissorRect
[3] = height
;
1622 mSymbols
.fScissor(x
, y
, width
, height
);
1626 void fStencilFunc(GLenum func
, GLint reference
, GLuint mask
) {
1628 mSymbols
.fStencilFunc(func
, reference
, mask
);
1632 void fStencilFuncSeparate(GLenum frontfunc
, GLenum backfunc
, GLint reference
,
1635 mSymbols
.fStencilFuncSeparate(frontfunc
, backfunc
, reference
, mask
);
1639 void fStencilMask(GLuint mask
) {
1641 mSymbols
.fStencilMask(mask
);
1645 void fStencilMaskSeparate(GLenum face
, GLuint mask
) {
1647 mSymbols
.fStencilMaskSeparate(face
, mask
);
1651 void fStencilOp(GLenum fail
, GLenum zfail
, GLenum zpass
) {
1653 mSymbols
.fStencilOp(fail
, zfail
, zpass
);
1657 void fStencilOpSeparate(GLenum face
, GLenum sfail
, GLenum dpfail
,
1660 mSymbols
.fStencilOpSeparate(face
, sfail
, dpfail
, dppass
);
1664 void fTexGeni(GLenum coord
, GLenum pname
, GLint param
) {
1666 mSymbols
.fTexGeni(coord
, pname
, param
);
1670 void fTexGenf(GLenum coord
, GLenum pname
, GLfloat param
) {
1672 mSymbols
.fTexGenf(coord
, pname
, param
);
1676 void fTexGenfv(GLenum coord
, GLenum pname
, const GLfloat
* params
) {
1678 mSymbols
.fTexGenfv(coord
, pname
, params
);
1683 void raw_fTexImage2D(GLenum target
, GLint level
, GLint internalformat
,
1684 GLsizei width
, GLsizei height
, GLint border
,
1685 GLenum format
, GLenum type
, const GLvoid
* pixels
) {
1686 ASSERT_NOT_PASSING_STACK_BUFFER_TO_GL(pixels
);
1688 mSymbols
.fTexImage2D(target
, level
, internalformat
, width
, height
, border
,
1689 format
, type
, pixels
);
1691 mHeavyGLCallsSinceLastFlush
= true;
1695 void fTexImage2D(GLenum target
, GLint level
, GLint internalformat
,
1696 GLsizei width
, GLsizei height
, GLint border
, GLenum format
,
1697 GLenum type
, const GLvoid
* pixels
);
1699 void fTexSubImage2D(GLenum target
, GLint level
, GLint xoffset
, GLint yoffset
,
1700 GLsizei width
, GLsizei height
, GLenum format
, GLenum type
,
1701 const GLvoid
* pixels
) {
1702 ASSERT_NOT_PASSING_STACK_BUFFER_TO_GL(pixels
);
1704 mSymbols
.fTexSubImage2D(target
, level
, xoffset
, yoffset
, width
, height
,
1705 format
, type
, pixels
);
1707 mHeavyGLCallsSinceLastFlush
= true;
1710 void fUniform1f(GLint location
, GLfloat v0
) {
1712 mSymbols
.fUniform1f(location
, v0
);
1716 void fUniform1fv(GLint location
, GLsizei count
, const GLfloat
* value
) {
1718 mSymbols
.fUniform1fv(location
, count
, value
);
1722 void fUniform1i(GLint location
, GLint v0
) {
1724 mSymbols
.fUniform1i(location
, v0
);
1728 void fUniform1iv(GLint location
, GLsizei count
, const GLint
* value
) {
1730 mSymbols
.fUniform1iv(location
, count
, value
);
1734 void fUniform2f(GLint location
, GLfloat v0
, GLfloat v1
) {
1736 mSymbols
.fUniform2f(location
, v0
, v1
);
1740 void fUniform2fv(GLint location
, GLsizei count
, const GLfloat
* value
) {
1742 mSymbols
.fUniform2fv(location
, count
, value
);
1746 void fUniform2i(GLint location
, GLint v0
, GLint v1
) {
1748 mSymbols
.fUniform2i(location
, v0
, v1
);
1752 void fUniform2iv(GLint location
, GLsizei count
, const GLint
* value
) {
1754 mSymbols
.fUniform2iv(location
, count
, value
);
1758 void fUniform3f(GLint location
, GLfloat v0
, GLfloat v1
, GLfloat v2
) {
1760 mSymbols
.fUniform3f(location
, v0
, v1
, v2
);
1764 void fUniform3fv(GLint location
, GLsizei count
, const GLfloat
* value
) {
1766 mSymbols
.fUniform3fv(location
, count
, value
);
1770 void fUniform3i(GLint location
, GLint v0
, GLint v1
, GLint v2
) {
1772 mSymbols
.fUniform3i(location
, v0
, v1
, v2
);
1776 void fUniform3iv(GLint location
, GLsizei count
, const GLint
* value
) {
1778 mSymbols
.fUniform3iv(location
, count
, value
);
1782 void fUniform4f(GLint location
, GLfloat v0
, GLfloat v1
, GLfloat v2
,
1785 mSymbols
.fUniform4f(location
, v0
, v1
, v2
, v3
);
1789 void fUniform4fv(GLint location
, GLsizei count
, const GLfloat
* value
) {
1791 mSymbols
.fUniform4fv(location
, count
, value
);
1795 void fUniform4i(GLint location
, GLint v0
, GLint v1
, GLint v2
, GLint v3
) {
1797 mSymbols
.fUniform4i(location
, v0
, v1
, v2
, v3
);
1801 void fUniform4iv(GLint location
, GLsizei count
, const GLint
* value
) {
1803 mSymbols
.fUniform4iv(location
, count
, value
);
1807 void fUniformMatrix2fv(GLint location
, GLsizei count
, realGLboolean transpose
,
1808 const GLfloat
* value
) {
1810 mSymbols
.fUniformMatrix2fv(location
, count
, transpose
, value
);
1814 void fUniformMatrix2x3fv(GLint location
, GLsizei count
,
1815 realGLboolean transpose
, const GLfloat
* value
) {
1817 ASSERT_SYMBOL_PRESENT(fUniformMatrix2x3fv
);
1818 mSymbols
.fUniformMatrix2x3fv(location
, count
, transpose
, value
);
1822 void fUniformMatrix2x4fv(GLint location
, GLsizei count
,
1823 realGLboolean transpose
, const GLfloat
* value
) {
1825 ASSERT_SYMBOL_PRESENT(fUniformMatrix2x4fv
);
1826 mSymbols
.fUniformMatrix2x4fv(location
, count
, transpose
, value
);
1830 void fUniformMatrix3fv(GLint location
, GLsizei count
, realGLboolean transpose
,
1831 const GLfloat
* value
) {
1833 mSymbols
.fUniformMatrix3fv(location
, count
, transpose
, value
);
1837 void fUniformMatrix3x2fv(GLint location
, GLsizei count
,
1838 realGLboolean transpose
, const GLfloat
* value
) {
1840 ASSERT_SYMBOL_PRESENT(fUniformMatrix3x2fv
);
1841 mSymbols
.fUniformMatrix3x2fv(location
, count
, transpose
, value
);
1845 void fUniformMatrix3x4fv(GLint location
, GLsizei count
,
1846 realGLboolean transpose
, const GLfloat
* value
) {
1848 ASSERT_SYMBOL_PRESENT(fUniformMatrix3x4fv
);
1849 mSymbols
.fUniformMatrix3x4fv(location
, count
, transpose
, value
);
1853 void fUniformMatrix4fv(GLint location
, GLsizei count
, realGLboolean transpose
,
1854 const GLfloat
* value
) {
1856 mSymbols
.fUniformMatrix4fv(location
, count
, transpose
, value
);
1860 void fUniformMatrix4x2fv(GLint location
, GLsizei count
,
1861 realGLboolean transpose
, const GLfloat
* value
) {
1863 ASSERT_SYMBOL_PRESENT(fUniformMatrix4x2fv
);
1864 mSymbols
.fUniformMatrix4x2fv(location
, count
, transpose
, value
);
1868 void fUniformMatrix4x3fv(GLint location
, GLsizei count
,
1869 realGLboolean transpose
, const GLfloat
* value
) {
1871 ASSERT_SYMBOL_PRESENT(fUniformMatrix4x3fv
);
1872 mSymbols
.fUniformMatrix4x3fv(location
, count
, transpose
, value
);
1876 void fUseProgram(GLuint program
) {
1878 mSymbols
.fUseProgram(program
);
1882 void fValidateProgram(GLuint program
) {
1884 mSymbols
.fValidateProgram(program
);
1888 void fVertexAttribPointer(GLuint index
, GLint size
, GLenum type
,
1889 realGLboolean normalized
, GLsizei stride
,
1890 const GLvoid
* pointer
) {
1892 mSymbols
.fVertexAttribPointer(index
, size
, type
, normalized
, stride
,
1897 void fVertexAttrib1f(GLuint index
, GLfloat x
) {
1899 mSymbols
.fVertexAttrib1f(index
, x
);
1903 void fVertexAttrib2f(GLuint index
, GLfloat x
, GLfloat y
) {
1905 mSymbols
.fVertexAttrib2f(index
, x
, y
);
1909 void fVertexAttrib3f(GLuint index
, GLfloat x
, GLfloat y
, GLfloat z
) {
1911 mSymbols
.fVertexAttrib3f(index
, x
, y
, z
);
1915 void fVertexAttrib4f(GLuint index
, GLfloat x
, GLfloat y
, GLfloat z
,
1918 mSymbols
.fVertexAttrib4f(index
, x
, y
, z
, w
);
1922 void fVertexAttrib1fv(GLuint index
, const GLfloat
* v
) {
1924 mSymbols
.fVertexAttrib1fv(index
, v
);
1928 void fVertexAttrib2fv(GLuint index
, const GLfloat
* v
) {
1930 mSymbols
.fVertexAttrib2fv(index
, v
);
1934 void fVertexAttrib3fv(GLuint index
, const GLfloat
* v
) {
1936 mSymbols
.fVertexAttrib3fv(index
, v
);
1940 void fVertexAttrib4fv(GLuint index
, const GLfloat
* v
) {
1942 mSymbols
.fVertexAttrib4fv(index
, v
);
1946 void fVertexPointer(GLint size
, GLenum type
, GLsizei stride
,
1947 const GLvoid
* pointer
) {
1949 mSymbols
.fVertexPointer(size
, type
, stride
, pointer
);
1953 void fViewport(GLint x
, GLint y
, GLsizei width
, GLsizei height
) {
1954 if (mViewportRect
[0] == x
&& mViewportRect
[1] == y
&&
1955 mViewportRect
[2] == width
&& mViewportRect
[3] == height
) {
1958 mViewportRect
[0] = x
;
1959 mViewportRect
[1] = y
;
1960 mViewportRect
[2] = width
;
1961 mViewportRect
[3] = height
;
1963 mSymbols
.fViewport(x
, y
, width
, height
);
1967 void fCompileShader(GLuint shader
) {
1969 mSymbols
.fCompileShader(shader
);
1974 friend class SharedSurface_IOSurface
;
1976 void raw_fCopyTexImage2D(GLenum target
, GLint level
, GLenum internalformat
,
1977 GLint x
, GLint y
, GLsizei width
, GLsizei height
,
1980 mSymbols
.fCopyTexImage2D(target
, level
, internalformat
, x
, y
, width
, height
,
1985 void raw_fCopyTexSubImage2D(GLenum target
, GLint level
, GLint xoffset
,
1986 GLint yoffset
, GLint x
, GLint y
, GLsizei width
,
1989 mSymbols
.fCopyTexSubImage2D(target
, level
, xoffset
, yoffset
, x
, y
, width
,
1995 void fGetShaderiv(GLuint shader
, GLenum pname
, GLint
* param
) {
1997 mSymbols
.fGetShaderiv(shader
, pname
, param
);
2002 void fGetShaderInfoLog(GLuint shader
, GLsizei bufSize
, GLsizei
* length
,
2005 mSymbols
.fGetShaderInfoLog(shader
, bufSize
, length
, infoLog
);
2011 void raw_fGetShaderPrecisionFormat(GLenum shadertype
, GLenum precisiontype
,
2012 GLint
* range
, GLint
* precision
) {
2013 MOZ_ASSERT(IsGLES());
2016 ASSERT_SYMBOL_PRESENT(fGetShaderPrecisionFormat
);
2017 mSymbols
.fGetShaderPrecisionFormat(shadertype
, precisiontype
, range
,
2024 void fGetShaderPrecisionFormat(GLenum shadertype
, GLenum precisiontype
,
2025 GLint
* range
, GLint
* precision
) {
2027 raw_fGetShaderPrecisionFormat(shadertype
, precisiontype
, range
,
2030 // Fall back to automatic values because almost all desktop hardware
2031 // supports the OpenGL standard precisions.
2032 GetShaderPrecisionFormatNonES2(shadertype
, precisiontype
, range
,
2037 void fGetShaderSource(GLint obj
, GLsizei maxLength
, GLsizei
* length
,
2040 mSymbols
.fGetShaderSource(obj
, maxLength
, length
, source
);
2045 void fShaderSource(GLuint shader
, GLsizei count
, const GLchar
* const* strings
,
2046 const GLint
* lengths
) {
2048 mSymbols
.fShaderSource(shader
, count
, strings
, lengths
);
2053 mutable GLuint mCachedDrawFb
= 0;
2054 mutable GLuint mCachedReadFb
= 0;
2057 bool mElideDuplicateBindFramebuffers
= false;
2059 // If e.g. GL_DRAW_FRAMEBUFFER isn't supported, will bind GL_FRAMEBUFFER.
2060 void fBindFramebuffer(GLenum target
, const GLuint fb
) const {
2061 if (!IsSupported(gl::GLFeature::framebuffer_blit
)) {
2062 target
= LOCAL_GL_FRAMEBUFFER
;
2064 if (mElideDuplicateBindFramebuffers
) {
2065 MOZ_ASSERT(mCachedDrawFb
==
2066 GetIntAs
<GLuint
>(LOCAL_GL_DRAW_FRAMEBUFFER_BINDING
));
2067 MOZ_ASSERT(mCachedReadFb
==
2068 GetIntAs
<GLuint
>(LOCAL_GL_READ_FRAMEBUFFER_BINDING
));
2071 case LOCAL_GL_FRAMEBUFFER
:
2072 if (mCachedDrawFb
== fb
&& mCachedReadFb
== fb
) return;
2074 case LOCAL_GL_DRAW_FRAMEBUFFER
:
2075 if (mCachedDrawFb
== fb
) return;
2077 case LOCAL_GL_READ_FRAMEBUFFER
:
2078 if (mCachedReadFb
== fb
) return;
2084 mSymbols
.fBindFramebuffer(target
, fb
);
2088 case LOCAL_GL_FRAMEBUFFER
:
2092 case LOCAL_GL_DRAW_FRAMEBUFFER
:
2095 case LOCAL_GL_READ_FRAMEBUFFER
:
2101 void fBindRenderbuffer(GLenum target
, GLuint renderbuffer
) {
2103 mSymbols
.fBindRenderbuffer(target
, renderbuffer
);
2107 GLenum
fCheckFramebufferStatus(GLenum target
) {
2110 retval
= mSymbols
.fCheckFramebufferStatus(target
);
2116 void fFramebufferRenderbuffer(GLenum target
, GLenum attachmentPoint
,
2117 GLenum renderbufferTarget
,
2118 GLuint renderbuffer
) {
2120 mSymbols
.fFramebufferRenderbuffer(target
, attachmentPoint
,
2121 renderbufferTarget
, renderbuffer
);
2125 void fFramebufferTexture2D(GLenum target
, GLenum attachmentPoint
,
2126 GLenum textureTarget
, GLuint texture
,
2129 mSymbols
.fFramebufferTexture2D(target
, attachmentPoint
, textureTarget
,
2134 void fFramebufferTextureLayer(GLenum target
, GLenum attachment
,
2135 GLuint texture
, GLint level
, GLint layer
) {
2137 ASSERT_SYMBOL_PRESENT(fFramebufferTextureLayer
);
2138 mSymbols
.fFramebufferTextureLayer(target
, attachment
, texture
, level
,
2143 void fGetFramebufferAttachmentParameteriv(GLenum target
, GLenum attachment
,
2144 GLenum pname
, GLint
* value
) {
2146 mSymbols
.fGetFramebufferAttachmentParameteriv(target
, attachment
, pname
,
2152 void fGetRenderbufferParameteriv(GLenum target
, GLenum pname
, GLint
* value
) {
2154 mSymbols
.fGetRenderbufferParameteriv(target
, pname
, value
);
2159 realGLboolean
fIsFramebuffer(GLuint framebuffer
) {
2160 realGLboolean retval
= false;
2162 retval
= mSymbols
.fIsFramebuffer(framebuffer
);
2169 realGLboolean
fIsRenderbuffer(GLuint renderbuffer
) {
2170 realGLboolean retval
= false;
2172 retval
= mSymbols
.fIsRenderbuffer(renderbuffer
);
2178 void fRenderbufferStorage(GLenum target
, GLenum internalFormat
, GLsizei width
,
2181 mSymbols
.fRenderbufferStorage(target
, internalFormat
, width
, height
);
2186 void raw_fDepthRange(GLclampf a
, GLclampf b
) {
2187 MOZ_ASSERT(!IsGLES());
2190 ASSERT_SYMBOL_PRESENT(fDepthRange
);
2191 mSymbols
.fDepthRange(a
, b
);
2195 void raw_fDepthRangef(GLclampf a
, GLclampf b
) {
2196 MOZ_ASSERT(IsGLES());
2199 ASSERT_SYMBOL_PRESENT(fDepthRangef
);
2200 mSymbols
.fDepthRangef(a
, b
);
2204 void raw_fClearDepth(GLclampf v
) {
2205 MOZ_ASSERT(!IsGLES());
2208 ASSERT_SYMBOL_PRESENT(fClearDepth
);
2209 mSymbols
.fClearDepth(v
);
2213 void raw_fClearDepthf(GLclampf v
) {
2214 MOZ_ASSERT(IsGLES());
2217 ASSERT_SYMBOL_PRESENT(fClearDepthf
);
2218 mSymbols
.fClearDepthf(v
);
2223 void fDepthRange(GLclampf a
, GLclampf b
) {
2225 raw_fDepthRangef(a
, b
);
2227 raw_fDepthRange(a
, b
);
2231 void fClearDepth(GLclampf v
) {
2233 raw_fClearDepthf(v
);
2239 void* fMapBuffer(GLenum target
, GLenum access
) {
2240 void* ret
= nullptr;
2242 ASSERT_SYMBOL_PRESENT(fMapBuffer
);
2243 ret
= mSymbols
.fMapBuffer(target
, access
);
2249 realGLboolean
fUnmapBuffer(GLenum target
) {
2250 realGLboolean ret
= false;
2252 ASSERT_SYMBOL_PRESENT(fUnmapBuffer
);
2253 ret
= mSymbols
.fUnmapBuffer(target
);
2259 GLuint
raw_fCreateProgram() {
2262 ret
= mSymbols
.fCreateProgram();
2267 GLuint
raw_fCreateShader(GLenum t
) {
2270 ret
= mSymbols
.fCreateShader(t
);
2275 void raw_fGenBuffers(GLsizei n
, GLuint
* names
) {
2277 mSymbols
.fGenBuffers(n
, names
);
2282 void raw_fGenFramebuffers(GLsizei n
, GLuint
* names
) {
2284 mSymbols
.fGenFramebuffers(n
, names
);
2289 void raw_fGenRenderbuffers(GLsizei n
, GLuint
* names
) {
2291 mSymbols
.fGenRenderbuffers(n
, names
);
2296 void raw_fGenTextures(GLsizei n
, GLuint
* names
) {
2298 mSymbols
.fGenTextures(n
, names
);
2304 GLuint
fCreateProgram() {
2305 GLuint ret
= raw_fCreateProgram();
2306 TRACKING_CONTEXT(CreatedProgram(this, ret
));
2310 GLuint
fCreateShader(GLenum t
) {
2311 GLuint ret
= raw_fCreateShader(t
);
2312 TRACKING_CONTEXT(CreatedShader(this, ret
));
2316 void fGenBuffers(GLsizei n
, GLuint
* names
) {
2317 raw_fGenBuffers(n
, names
);
2318 TRACKING_CONTEXT(CreatedBuffers(this, n
, names
));
2321 void fGenFramebuffers(GLsizei n
, GLuint
* names
) {
2322 raw_fGenFramebuffers(n
, names
);
2323 TRACKING_CONTEXT(CreatedFramebuffers(this, n
, names
));
2326 void fGenRenderbuffers(GLsizei n
, GLuint
* names
) {
2327 raw_fGenRenderbuffers(n
, names
);
2328 TRACKING_CONTEXT(CreatedRenderbuffers(this, n
, names
));
2331 void fGenTextures(GLsizei n
, GLuint
* names
) {
2332 raw_fGenTextures(n
, names
);
2333 TRACKING_CONTEXT(CreatedTextures(this, n
, names
));
2337 void raw_fDeleteProgram(GLuint program
) {
2339 mSymbols
.fDeleteProgram(program
);
2343 void raw_fDeleteShader(GLuint shader
) {
2345 mSymbols
.fDeleteShader(shader
);
2349 void raw_fDeleteBuffers(GLsizei n
, const GLuint
* names
) {
2351 mSymbols
.fDeleteBuffers(n
, names
);
2355 void raw_fDeleteFramebuffers(GLsizei n
, const GLuint
* names
) {
2357 mSymbols
.fDeleteFramebuffers(n
, names
);
2360 for (const auto i
: IntegerRange(n
)) {
2361 const auto fb
= names
[i
];
2362 if (mCachedDrawFb
== fb
) {
2365 if (mCachedReadFb
== fb
) {
2371 void raw_fDeleteRenderbuffers(GLsizei n
, const GLuint
* names
) {
2373 mSymbols
.fDeleteRenderbuffers(n
, names
);
2377 void raw_fDeleteTextures(GLsizei n
, const GLuint
* names
) {
2379 mSymbols
.fDeleteTextures(n
, names
);
2384 void fDeleteProgram(GLuint program
) {
2385 raw_fDeleteProgram(program
);
2386 TRACKING_CONTEXT(DeletedProgram(this, program
));
2389 void fDeleteShader(GLuint shader
) {
2390 raw_fDeleteShader(shader
);
2391 TRACKING_CONTEXT(DeletedShader(this, shader
));
2394 void fDeleteBuffers(GLsizei n
, const GLuint
* names
) {
2395 raw_fDeleteBuffers(n
, names
);
2396 TRACKING_CONTEXT(DeletedBuffers(this, n
, names
));
2399 void fDeleteFramebuffers(GLsizei n
, const GLuint
* names
);
2401 void fDeleteRenderbuffers(GLsizei n
, const GLuint
* names
) {
2402 raw_fDeleteRenderbuffers(n
, names
);
2403 TRACKING_CONTEXT(DeletedRenderbuffers(this, n
, names
));
2406 void fDeleteTextures(GLsizei n
, const GLuint
* names
) {
2408 // On the Mac the call to fDeleteTextures() triggers a flush. But it
2409 // happens at the wrong time, which can lead to crashes. To work around
2410 // this we call fFlush() explicitly ourselves, before the call to
2411 // fDeleteTextures(). This fixes bug 1666293.
2414 raw_fDeleteTextures(n
, names
);
2415 TRACKING_CONTEXT(DeletedTextures(this, n
, names
));
2418 // -----------------------------------------------------------------------------
2419 // Extension ARB_sync (GL)
2421 GLsync
fFenceSync(GLenum condition
, GLbitfield flags
) {
2424 ASSERT_SYMBOL_PRESENT(fFenceSync
);
2425 ret
= mSymbols
.fFenceSync(condition
, flags
);
2431 realGLboolean
fIsSync(GLsync sync
) {
2432 realGLboolean ret
= false;
2434 ASSERT_SYMBOL_PRESENT(fIsSync
);
2435 ret
= mSymbols
.fIsSync(sync
);
2441 void fDeleteSync(GLsync sync
) {
2443 ASSERT_SYMBOL_PRESENT(fDeleteSync
);
2444 mSymbols
.fDeleteSync(sync
);
2448 GLenum
fClientWaitSync(GLsync sync
, GLbitfield flags
, GLuint64 timeout
) {
2451 ASSERT_SYMBOL_PRESENT(fClientWaitSync
);
2452 ret
= mSymbols
.fClientWaitSync(sync
, flags
, timeout
);
2458 void fWaitSync(GLsync sync
, GLbitfield flags
, GLuint64 timeout
) {
2460 ASSERT_SYMBOL_PRESENT(fWaitSync
);
2461 mSymbols
.fWaitSync(sync
, flags
, timeout
);
2465 void fGetInteger64v(GLenum pname
, GLint64
* params
) {
2467 ASSERT_SYMBOL_PRESENT(fGetInteger64v
);
2468 mSymbols
.fGetInteger64v(pname
, params
);
2472 void fGetSynciv(GLsync sync
, GLenum pname
, GLsizei bufSize
, GLsizei
* length
,
2475 ASSERT_SYMBOL_PRESENT(fGetSynciv
);
2476 mSymbols
.fGetSynciv(sync
, pname
, bufSize
, length
, values
);
2481 // -----------------------------------------------------------------------------
2482 // Extension OES_EGL_image (GLES)
2484 void fEGLImageTargetTexture2D(GLenum target
, GLeglImage image
) {
2486 ASSERT_SYMBOL_PRESENT(fEGLImageTargetTexture2D
);
2487 mSymbols
.fEGLImageTargetTexture2D(target
, image
);
2489 mHeavyGLCallsSinceLastFlush
= true;
2492 void fEGLImageTargetRenderbufferStorage(GLenum target
, GLeglImage image
) {
2494 ASSERT_SYMBOL_PRESENT(fEGLImageTargetRenderbufferStorage
);
2495 mSymbols
.fEGLImageTargetRenderbufferStorage(target
, image
);
2499 // -----------------------------------------------------------------------------
2500 // Package XXX_bind_buffer_offset
2502 void fBindBufferOffset(GLenum target
, GLuint index
, GLuint buffer
,
2505 ASSERT_SYMBOL_PRESENT(fBindBufferOffset
);
2506 mSymbols
.fBindBufferOffset(target
, index
, buffer
, offset
);
2510 // -----------------------------------------------------------------------------
2511 // Package XXX_draw_buffers
2513 void fDrawBuffers(GLsizei n
, const GLenum
* bufs
) {
2515 ASSERT_SYMBOL_PRESENT(fDrawBuffers
);
2516 mSymbols
.fDrawBuffers(n
, bufs
);
2520 // -----------------------------------------------------------------------------
2521 // Package XXX_draw_instanced
2523 void fDrawArraysInstanced(GLenum mode
, GLint first
, GLsizei count
,
2524 GLsizei primcount
) {
2526 raw_fDrawArraysInstanced(mode
, first
, count
, primcount
);
2530 void fDrawElementsInstanced(GLenum mode
, GLsizei count
, GLenum type
,
2531 const GLvoid
* indices
, GLsizei primcount
) {
2533 raw_fDrawElementsInstanced(mode
, count
, type
, indices
, primcount
);
2538 void raw_fDrawArraysInstanced(GLenum mode
, GLint first
, GLsizei count
,
2539 GLsizei primcount
) {
2541 ASSERT_SYMBOL_PRESENT(fDrawArraysInstanced
);
2542 mSymbols
.fDrawArraysInstanced(mode
, first
, count
, primcount
);
2546 void raw_fDrawElementsInstanced(GLenum mode
, GLsizei count
, GLenum type
,
2547 const GLvoid
* indices
, GLsizei primcount
) {
2549 ASSERT_SYMBOL_PRESENT(fDrawElementsInstanced
);
2550 mSymbols
.fDrawElementsInstanced(mode
, count
, type
, indices
, primcount
);
2554 // -----------------------------------------------------------------------------
2555 // Package XXX_framebuffer_blit
2558 void fBlitFramebuffer(GLint srcX0
, GLint srcY0
, GLint srcX1
, GLint srcY1
,
2559 GLint dstX0
, GLint dstY0
, GLint dstX1
, GLint dstY1
,
2560 GLbitfield mask
, GLenum filter
) {
2563 raw_fBlitFramebuffer(srcX0
, srcY0
, srcX1
, srcY1
, dstX0
, dstY0
, dstX1
, dstY1
,
2570 void raw_fBlitFramebuffer(GLint srcX0
, GLint srcY0
, GLint srcX1
, GLint srcY1
,
2571 GLint dstX0
, GLint dstY0
, GLint dstX1
, GLint dstY1
,
2572 GLbitfield mask
, GLenum filter
) {
2574 ASSERT_SYMBOL_PRESENT(fBlitFramebuffer
);
2575 mSymbols
.fBlitFramebuffer(srcX0
, srcY0
, srcX1
, srcY1
, dstX0
, dstY0
, dstX1
,
2576 dstY1
, mask
, filter
);
2580 // -----------------------------------------------------------------------------
2581 // Package XXX_framebuffer_multisample
2583 void fRenderbufferStorageMultisample(GLenum target
, GLsizei samples
,
2584 GLenum internalFormat
, GLsizei width
,
2587 ASSERT_SYMBOL_PRESENT(fRenderbufferStorageMultisample
);
2588 mSymbols
.fRenderbufferStorageMultisample(target
, samples
, internalFormat
,
2593 // -----------------------------------------------------------------------------
2594 // GL 3.0, GL ES 3.0 & EXT_gpu_shader4
2596 void fGetVertexAttribIiv(GLuint index
, GLenum pname
, GLint
* params
) {
2597 ASSERT_SYMBOL_PRESENT(fGetVertexAttribIiv
);
2599 mSymbols
.fGetVertexAttribIiv(index
, pname
, params
);
2604 void fGetVertexAttribIuiv(GLuint index
, GLenum pname
, GLuint
* params
) {
2605 ASSERT_SYMBOL_PRESENT(fGetVertexAttribIuiv
);
2607 mSymbols
.fGetVertexAttribIuiv(index
, pname
, params
);
2612 void fVertexAttribI4i(GLuint index
, GLint x
, GLint y
, GLint z
, GLint w
) {
2614 ASSERT_SYMBOL_PRESENT(fVertexAttribI4i
);
2615 mSymbols
.fVertexAttribI4i(index
, x
, y
, z
, w
);
2619 void fVertexAttribI4iv(GLuint index
, const GLint
* v
) {
2621 ASSERT_SYMBOL_PRESENT(fVertexAttribI4iv
);
2622 mSymbols
.fVertexAttribI4iv(index
, v
);
2626 void fVertexAttribI4ui(GLuint index
, GLuint x
, GLuint y
, GLuint z
, GLuint w
) {
2628 ASSERT_SYMBOL_PRESENT(fVertexAttribI4ui
);
2629 mSymbols
.fVertexAttribI4ui(index
, x
, y
, z
, w
);
2633 void fVertexAttribI4uiv(GLuint index
, const GLuint
* v
) {
2635 ASSERT_SYMBOL_PRESENT(fVertexAttribI4uiv
);
2636 mSymbols
.fVertexAttribI4uiv(index
, v
);
2640 void fVertexAttribIPointer(GLuint index
, GLint size
, GLenum type
,
2641 GLsizei stride
, const GLvoid
* offset
) {
2643 ASSERT_SYMBOL_PRESENT(fVertexAttribIPointer
);
2644 mSymbols
.fVertexAttribIPointer(index
, size
, type
, stride
, offset
);
2648 void fUniform1ui(GLint location
, GLuint v0
) {
2650 ASSERT_SYMBOL_PRESENT(fUniform1ui
);
2651 mSymbols
.fUniform1ui(location
, v0
);
2655 void fUniform2ui(GLint location
, GLuint v0
, GLuint v1
) {
2657 ASSERT_SYMBOL_PRESENT(fUniform2ui
);
2658 mSymbols
.fUniform2ui(location
, v0
, v1
);
2662 void fUniform3ui(GLint location
, GLuint v0
, GLuint v1
, GLuint v2
) {
2664 ASSERT_SYMBOL_PRESENT(fUniform3ui
);
2665 mSymbols
.fUniform3ui(location
, v0
, v1
, v2
);
2669 void fUniform4ui(GLint location
, GLuint v0
, GLuint v1
, GLuint v2
, GLuint v3
) {
2671 ASSERT_SYMBOL_PRESENT(fUniform4ui
);
2672 mSymbols
.fUniform4ui(location
, v0
, v1
, v2
, v3
);
2676 void fUniform1uiv(GLint location
, GLsizei count
, const GLuint
* value
) {
2678 ASSERT_SYMBOL_PRESENT(fUniform1uiv
);
2679 mSymbols
.fUniform1uiv(location
, count
, value
);
2683 void fUniform2uiv(GLint location
, GLsizei count
, const GLuint
* value
) {
2685 ASSERT_SYMBOL_PRESENT(fUniform2uiv
);
2686 mSymbols
.fUniform2uiv(location
, count
, value
);
2690 void fUniform3uiv(GLint location
, GLsizei count
, const GLuint
* value
) {
2692 ASSERT_SYMBOL_PRESENT(fUniform3uiv
);
2693 mSymbols
.fUniform3uiv(location
, count
, value
);
2697 void fUniform4uiv(GLint location
, GLsizei count
, const GLuint
* value
) {
2699 ASSERT_SYMBOL_PRESENT(fUniform4uiv
);
2700 mSymbols
.fUniform4uiv(location
, count
, value
);
2704 GLint
fGetFragDataLocation(GLuint program
, const GLchar
* name
) {
2707 ASSERT_SYMBOL_PRESENT(fGetFragDataLocation
);
2708 result
= mSymbols
.fGetFragDataLocation(program
, name
);
2714 // -----------------------------------------------------------------------------
2715 // Package XXX_instanced_arrays
2717 void fVertexAttribDivisor(GLuint index
, GLuint divisor
) {
2719 ASSERT_SYMBOL_PRESENT(fVertexAttribDivisor
);
2720 mSymbols
.fVertexAttribDivisor(index
, divisor
);
2724 // -----------------------------------------------------------------------------
2725 // Feature internalformat_query
2727 void fGetInternalformativ(GLenum target
, GLenum internalformat
, GLenum pname
,
2728 GLsizei bufSize
, GLint
* params
) {
2730 ASSERT_SYMBOL_PRESENT(fGetInternalformativ
);
2731 mSymbols
.fGetInternalformativ(target
, internalformat
, pname
, bufSize
,
2737 // -----------------------------------------------------------------------------
2738 // Package XXX_query_counter
2740 * XXX_query_counter:
2741 * - depends on XXX_query_objects
2742 * - provide all followed entry points
2743 * - provide GL_TIMESTAMP
2746 void fQueryCounter(GLuint id
, GLenum target
) {
2748 ASSERT_SYMBOL_PRESENT(fQueryCounter
);
2749 mSymbols
.fQueryCounter(id
, target
);
2753 // -----------------------------------------------------------------------------
2754 // Package XXX_query_objects
2756 * XXX_query_objects:
2757 * - provide all followed entry points
2759 * XXX_occlusion_query2:
2760 * - depends on XXX_query_objects
2761 * - provide ANY_SAMPLES_PASSED
2763 * XXX_occlusion_query_boolean:
2764 * - depends on XXX_occlusion_query2
2765 * - provide ANY_SAMPLES_PASSED_CONSERVATIVE
2768 void fDeleteQueries(GLsizei n
, const GLuint
* names
) {
2770 ASSERT_SYMBOL_PRESENT(fDeleteQueries
);
2771 mSymbols
.fDeleteQueries(n
, names
);
2773 TRACKING_CONTEXT(DeletedQueries(this, n
, names
));
2776 void fGenQueries(GLsizei n
, GLuint
* names
) {
2778 ASSERT_SYMBOL_PRESENT(fGenQueries
);
2779 mSymbols
.fGenQueries(n
, names
);
2781 TRACKING_CONTEXT(CreatedQueries(this, n
, names
));
2784 void fGetQueryiv(GLenum target
, GLenum pname
, GLint
* params
) {
2786 ASSERT_SYMBOL_PRESENT(fGetQueryiv
);
2787 mSymbols
.fGetQueryiv(target
, pname
, params
);
2792 void fGetQueryObjectuiv(GLuint id
, GLenum pname
, GLuint
* params
) {
2794 ASSERT_SYMBOL_PRESENT(fGetQueryObjectuiv
);
2795 mSymbols
.fGetQueryObjectuiv(id
, pname
, params
);
2800 realGLboolean
fIsQuery(GLuint query
) {
2801 realGLboolean retval
= false;
2803 ASSERT_SYMBOL_PRESENT(fIsQuery
);
2804 retval
= mSymbols
.fIsQuery(query
);
2810 // -----------------------------------------------------------------------------
2811 // Package XXX_get_query_object_i64v
2813 * XXX_get_query_object_i64v:
2814 * - depends on XXX_query_objects
2815 * - provide the followed entry point
2818 void fGetQueryObjecti64v(GLuint id
, GLenum pname
, GLint64
* params
) {
2820 ASSERT_SYMBOL_PRESENT(fGetQueryObjecti64v
);
2821 mSymbols
.fGetQueryObjecti64v(id
, pname
, params
);
2826 void fGetQueryObjectui64v(GLuint id
, GLenum pname
, GLuint64
* params
) {
2828 ASSERT_SYMBOL_PRESENT(fGetQueryObjectui64v
);
2829 mSymbols
.fGetQueryObjectui64v(id
, pname
, params
);
2834 // -----------------------------------------------------------------------------
2835 // Package XXX_get_query_object_iv
2837 * XXX_get_query_object_iv:
2838 * - depends on XXX_query_objects
2839 * - provide the followed entry point
2841 * XXX_occlusion_query:
2842 * - depends on XXX_get_query_object_iv
2843 * - provide LOCAL_GL_SAMPLES_PASSED
2846 void fGetQueryObjectiv(GLuint id
, GLenum pname
, GLint
* params
) {
2848 ASSERT_SYMBOL_PRESENT(fGetQueryObjectiv
);
2849 mSymbols
.fGetQueryObjectiv(id
, pname
, params
);
2854 // -----------------------------------------------------------------------------
2855 // GL 4.0, GL ES 3.0, ARB_transform_feedback2, NV_transform_feedback2
2857 void fBindBufferBase(GLenum target
, GLuint index
, GLuint buffer
) {
2859 ASSERT_SYMBOL_PRESENT(fBindBufferBase
);
2860 mSymbols
.fBindBufferBase(target
, index
, buffer
);
2864 void fBindBufferRange(GLenum target
, GLuint index
, GLuint buffer
,
2865 GLintptr offset
, GLsizeiptr size
) {
2867 ASSERT_SYMBOL_PRESENT(fBindBufferRange
);
2868 mSymbols
.fBindBufferRange(target
, index
, buffer
, offset
, size
);
2872 void fGenTransformFeedbacks(GLsizei n
, GLuint
* ids
) {
2874 ASSERT_SYMBOL_PRESENT(fGenTransformFeedbacks
);
2875 mSymbols
.fGenTransformFeedbacks(n
, ids
);
2880 void fDeleteTransformFeedbacks(GLsizei n
, const GLuint
* ids
) {
2882 ASSERT_SYMBOL_PRESENT(fDeleteTransformFeedbacks
);
2883 mSymbols
.fDeleteTransformFeedbacks(n
, ids
);
2887 realGLboolean
fIsTransformFeedback(GLuint id
) {
2888 realGLboolean result
= false;
2890 ASSERT_SYMBOL_PRESENT(fIsTransformFeedback
);
2891 result
= mSymbols
.fIsTransformFeedback(id
);
2897 void fBindTransformFeedback(GLenum target
, GLuint id
) {
2899 ASSERT_SYMBOL_PRESENT(fBindTransformFeedback
);
2900 mSymbols
.fBindTransformFeedback(target
, id
);
2904 void fBeginTransformFeedback(GLenum primitiveMode
) {
2906 ASSERT_SYMBOL_PRESENT(fBeginTransformFeedback
);
2907 mSymbols
.fBeginTransformFeedback(primitiveMode
);
2911 void fEndTransformFeedback() {
2913 ASSERT_SYMBOL_PRESENT(fEndTransformFeedback
);
2914 mSymbols
.fEndTransformFeedback();
2918 void fTransformFeedbackVaryings(GLuint program
, GLsizei count
,
2919 const GLchar
* const* varyings
,
2920 GLenum bufferMode
) {
2922 ASSERT_SYMBOL_PRESENT(fTransformFeedbackVaryings
);
2923 mSymbols
.fTransformFeedbackVaryings(program
, count
, varyings
, bufferMode
);
2927 void fGetTransformFeedbackVarying(GLuint program
, GLuint index
,
2928 GLsizei bufSize
, GLsizei
* length
,
2929 GLsizei
* size
, GLenum
* type
, GLchar
* name
) {
2931 ASSERT_SYMBOL_PRESENT(fGetTransformFeedbackVarying
);
2932 mSymbols
.fGetTransformFeedbackVarying(program
, index
, bufSize
, length
, size
,
2938 void fPauseTransformFeedback() {
2940 ASSERT_SYMBOL_PRESENT(fPauseTransformFeedback
);
2941 mSymbols
.fPauseTransformFeedback();
2945 void fResumeTransformFeedback() {
2947 ASSERT_SYMBOL_PRESENT(fResumeTransformFeedback
);
2948 mSymbols
.fResumeTransformFeedback();
2952 void fGetIntegeri_v(GLenum param
, GLuint index
, GLint
* values
) {
2954 ASSERT_SYMBOL_PRESENT(fGetIntegeri_v
);
2955 mSymbols
.fGetIntegeri_v(param
, index
, values
);
2960 void fGetInteger64i_v(GLenum target
, GLuint index
, GLint64
* data
) {
2961 ASSERT_SYMBOL_PRESENT(fGetInteger64i_v
);
2963 mSymbols
.fGetInteger64i_v(target
, index
, data
);
2968 // -----------------------------------------------------------------------------
2969 // Package XXX_vertex_array_object
2971 void fBindVertexArray(GLuint array
) {
2973 ASSERT_SYMBOL_PRESENT(fBindVertexArray
);
2974 mSymbols
.fBindVertexArray(array
);
2978 void fDeleteVertexArrays(GLsizei n
, const GLuint
* arrays
) {
2980 ASSERT_SYMBOL_PRESENT(fDeleteVertexArrays
);
2981 mSymbols
.fDeleteVertexArrays(n
, arrays
);
2985 void fGenVertexArrays(GLsizei n
, GLuint
* arrays
) {
2987 ASSERT_SYMBOL_PRESENT(fGenVertexArrays
);
2988 mSymbols
.fGenVertexArrays(n
, arrays
);
2992 realGLboolean
fIsVertexArray(GLuint array
) {
2993 realGLboolean ret
= false;
2995 ASSERT_SYMBOL_PRESENT(fIsVertexArray
);
2996 ret
= mSymbols
.fIsVertexArray(array
);
3002 // -----------------------------------------------------------------------------
3003 // Extension NV_fence
3005 void fGenFences(GLsizei n
, GLuint
* fences
) {
3006 ASSERT_SYMBOL_PRESENT(fGenFences
);
3008 mSymbols
.fGenFences(n
, fences
);
3012 void fDeleteFences(GLsizei n
, const GLuint
* fences
) {
3013 ASSERT_SYMBOL_PRESENT(fDeleteFences
);
3015 mSymbols
.fDeleteFences(n
, fences
);
3019 void fSetFence(GLuint fence
, GLenum condition
) {
3020 ASSERT_SYMBOL_PRESENT(fSetFence
);
3022 mSymbols
.fSetFence(fence
, condition
);
3026 realGLboolean
fTestFence(GLuint fence
) {
3027 realGLboolean ret
= false;
3028 ASSERT_SYMBOL_PRESENT(fTestFence
);
3030 ret
= mSymbols
.fTestFence(fence
);
3036 void fFinishFence(GLuint fence
) {
3037 ASSERT_SYMBOL_PRESENT(fFinishFence
);
3039 mSymbols
.fFinishFence(fence
);
3044 realGLboolean
fIsFence(GLuint fence
) {
3045 realGLboolean ret
= false;
3046 ASSERT_SYMBOL_PRESENT(fIsFence
);
3048 ret
= mSymbols
.fIsFence(fence
);
3054 void fGetFenceiv(GLuint fence
, GLenum pname
, GLint
* params
) {
3055 ASSERT_SYMBOL_PRESENT(fGetFenceiv
);
3057 mSymbols
.fGetFenceiv(fence
, pname
, params
);
3062 // -----------------------------------------------------------------------------
3063 // Extension NV_texture_barrier
3065 void fTextureBarrier() {
3066 ASSERT_SYMBOL_PRESENT(fTextureBarrier
);
3068 mSymbols
.fTextureBarrier();
3072 // Core GL & Extension ARB_copy_buffer
3074 void fCopyBufferSubData(GLenum readtarget
, GLenum writetarget
,
3075 GLintptr readoffset
, GLintptr writeoffset
,
3078 ASSERT_SYMBOL_PRESENT(fCopyBufferSubData
);
3079 mSymbols
.fCopyBufferSubData(readtarget
, writetarget
, readoffset
,
3084 // -----------------------------------------------------------------------------
3085 // Core GL & Extension ARB_map_buffer_range
3087 void* fMapBufferRange(GLenum target
, GLintptr offset
, GLsizeiptr length
,
3088 GLbitfield access
) {
3089 void* data
= nullptr;
3090 ASSERT_SYMBOL_PRESENT(fMapBufferRange
);
3092 data
= mSymbols
.fMapBufferRange(target
, offset
, length
, access
);
3098 void fFlushMappedBufferRange(GLenum target
, GLintptr offset
,
3099 GLsizeiptr length
) {
3100 ASSERT_SYMBOL_PRESENT(fFlushMappedBufferRange
);
3102 mSymbols
.fFlushMappedBufferRange(target
, offset
, length
);
3106 // -----------------------------------------------------------------------------
3107 // Core GL & Extension ARB_sampler_objects
3109 void fGenSamplers(GLsizei count
, GLuint
* samplers
) {
3111 ASSERT_SYMBOL_PRESENT(fGenSamplers
);
3112 mSymbols
.fGenSamplers(count
, samplers
);
3116 void fDeleteSamplers(GLsizei count
, const GLuint
* samplers
) {
3118 ASSERT_SYMBOL_PRESENT(fDeleteSamplers
);
3119 mSymbols
.fDeleteSamplers(count
, samplers
);
3123 realGLboolean
fIsSampler(GLuint sampler
) {
3124 realGLboolean result
= false;
3126 ASSERT_SYMBOL_PRESENT(fIsSampler
);
3127 result
= mSymbols
.fIsSampler(sampler
);
3133 void fBindSampler(GLuint unit
, GLuint sampler
) {
3135 ASSERT_SYMBOL_PRESENT(fBindSampler
);
3136 mSymbols
.fBindSampler(unit
, sampler
);
3140 void fSamplerParameteri(GLuint sampler
, GLenum pname
, GLint param
) {
3142 ASSERT_SYMBOL_PRESENT(fSamplerParameteri
);
3143 mSymbols
.fSamplerParameteri(sampler
, pname
, param
);
3147 void fSamplerParameteriv(GLuint sampler
, GLenum pname
, const GLint
* param
) {
3149 ASSERT_SYMBOL_PRESENT(fSamplerParameteriv
);
3150 mSymbols
.fSamplerParameteriv(sampler
, pname
, param
);
3154 void fSamplerParameterf(GLuint sampler
, GLenum pname
, GLfloat param
) {
3156 ASSERT_SYMBOL_PRESENT(fSamplerParameterf
);
3157 mSymbols
.fSamplerParameterf(sampler
, pname
, param
);
3161 void fSamplerParameterfv(GLuint sampler
, GLenum pname
, const GLfloat
* param
) {
3163 ASSERT_SYMBOL_PRESENT(fSamplerParameterfv
);
3164 mSymbols
.fSamplerParameterfv(sampler
, pname
, param
);
3168 void fGetSamplerParameteriv(GLuint sampler
, GLenum pname
, GLint
* params
) {
3170 ASSERT_SYMBOL_PRESENT(fGetSamplerParameteriv
);
3171 mSymbols
.fGetSamplerParameteriv(sampler
, pname
, params
);
3175 void fGetSamplerParameterfv(GLuint sampler
, GLenum pname
, GLfloat
* params
) {
3177 ASSERT_SYMBOL_PRESENT(fGetSamplerParameterfv
);
3178 mSymbols
.fGetSamplerParameterfv(sampler
, pname
, params
);
3182 // -----------------------------------------------------------------------------
3183 // Core GL & Extension ARB_uniform_buffer_object
3185 void fGetUniformIndices(GLuint program
, GLsizei uniformCount
,
3186 const GLchar
* const* uniformNames
,
3187 GLuint
* uniformIndices
) {
3188 ASSERT_SYMBOL_PRESENT(fGetUniformIndices
);
3190 mSymbols
.fGetUniformIndices(program
, uniformCount
, uniformNames
,
3196 void fGetActiveUniformsiv(GLuint program
, GLsizei uniformCount
,
3197 const GLuint
* uniformIndices
, GLenum pname
,
3199 ASSERT_SYMBOL_PRESENT(fGetActiveUniformsiv
);
3201 mSymbols
.fGetActiveUniformsiv(program
, uniformCount
, uniformIndices
, pname
,
3207 GLuint
fGetUniformBlockIndex(GLuint program
, const GLchar
* uniformBlockName
) {
3209 ASSERT_SYMBOL_PRESENT(fGetUniformBlockIndex
);
3211 result
= mSymbols
.fGetUniformBlockIndex(program
, uniformBlockName
);
3217 void fGetActiveUniformBlockiv(GLuint program
, GLuint uniformBlockIndex
,
3218 GLenum pname
, GLint
* params
) {
3219 ASSERT_SYMBOL_PRESENT(fGetActiveUniformBlockiv
);
3221 mSymbols
.fGetActiveUniformBlockiv(program
, uniformBlockIndex
, pname
,
3227 void fGetActiveUniformBlockName(GLuint program
, GLuint uniformBlockIndex
,
3228 GLsizei bufSize
, GLsizei
* length
,
3229 GLchar
* uniformBlockName
) {
3230 ASSERT_SYMBOL_PRESENT(fGetActiveUniformBlockName
);
3232 mSymbols
.fGetActiveUniformBlockName(program
, uniformBlockIndex
, bufSize
,
3233 length
, uniformBlockName
);
3238 void fUniformBlockBinding(GLuint program
, GLuint uniformBlockIndex
,
3239 GLuint uniformBlockBinding
) {
3240 ASSERT_SYMBOL_PRESENT(fUniformBlockBinding
);
3242 mSymbols
.fUniformBlockBinding(program
, uniformBlockIndex
,
3243 uniformBlockBinding
);
3247 // -----------------------------------------------------------------------------
3248 // Core GL 4.2, GL ES 3.0 & Extension ARB_texture_storage/EXT_texture_storage
3249 void fTexStorage2D(GLenum target
, GLsizei levels
, GLenum internalformat
,
3250 GLsizei width
, GLsizei height
) {
3252 ASSERT_SYMBOL_PRESENT(fTexStorage2D
);
3253 mSymbols
.fTexStorage2D(target
, levels
, internalformat
, width
, height
);
3258 void fTexStorage3D(GLenum target
, GLsizei levels
, GLenum internalformat
,
3259 GLsizei width
, GLsizei height
, GLsizei depth
) {
3261 ASSERT_SYMBOL_PRESENT(fTexStorage3D
);
3262 mSymbols
.fTexStorage3D(target
, levels
, internalformat
, width
, height
,
3268 // -----------------------------------------------------------------------------
3270 void fTexImage3D(GLenum target
, GLint level
, GLint internalFormat
,
3271 GLsizei width
, GLsizei height
, GLsizei depth
, GLint border
,
3272 GLenum format
, GLenum type
, const GLvoid
* data
) {
3274 ASSERT_SYMBOL_PRESENT(fTexImage3D
);
3275 mSymbols
.fTexImage3D(target
, level
, internalFormat
, width
, height
, depth
,
3276 border
, format
, type
, data
);
3281 void fTexSubImage3D(GLenum target
, GLint level
, GLint xoffset
, GLint yoffset
,
3282 GLint zoffset
, GLsizei width
, GLsizei height
,
3283 GLsizei depth
, GLenum format
, GLenum type
,
3284 const GLvoid
* pixels
) {
3286 ASSERT_SYMBOL_PRESENT(fTexSubImage3D
);
3287 mSymbols
.fTexSubImage3D(target
, level
, xoffset
, yoffset
, zoffset
, width
,
3288 height
, depth
, format
, type
, pixels
);
3293 void fCopyTexSubImage3D(GLenum target
, GLint level
, GLint xoffset
,
3294 GLint yoffset
, GLint zoffset
, GLint x
, GLint y
,
3295 GLsizei width
, GLsizei height
) {
3298 ASSERT_SYMBOL_PRESENT(fCopyTexSubImage3D
);
3299 mSymbols
.fCopyTexSubImage3D(target
, level
, xoffset
, yoffset
, zoffset
, x
, y
,
3305 void fCompressedTexImage3D(GLenum target
, GLint level
, GLenum internalformat
,
3306 GLsizei width
, GLsizei height
, GLsizei depth
,
3307 GLint border
, GLsizei imageSize
,
3308 const GLvoid
* data
) {
3310 ASSERT_SYMBOL_PRESENT(fCompressedTexImage3D
);
3311 mSymbols
.fCompressedTexImage3D(target
, level
, internalformat
, width
, height
,
3312 depth
, border
, imageSize
, data
);
3316 void fCompressedTexSubImage3D(GLenum target
, GLint level
, GLint xoffset
,
3317 GLint yoffset
, GLint zoffset
, GLsizei width
,
3318 GLsizei height
, GLsizei depth
, GLenum format
,
3319 GLsizei imageSize
, const GLvoid
* data
) {
3321 ASSERT_SYMBOL_PRESENT(fCompressedTexSubImage3D
);
3322 mSymbols
.fCompressedTexSubImage3D(target
, level
, xoffset
, yoffset
, zoffset
,
3323 width
, height
, depth
, format
, imageSize
,
3328 // -----------------------------------------------------------------------------
3331 const GLubyte
* fGetStringi(GLenum name
, GLuint index
) {
3332 const GLubyte
* ret
= nullptr;
3334 ASSERT_SYMBOL_PRESENT(fGetStringi
);
3335 ret
= mSymbols
.fGetStringi(name
, index
);
3341 // -----------------------------------------------------------------------------
3342 // APPLE_framebuffer_multisample
3344 void fResolveMultisampleFramebufferAPPLE() {
3346 ASSERT_SYMBOL_PRESENT(fResolveMultisampleFramebufferAPPLE
);
3347 mSymbols
.fResolveMultisampleFramebufferAPPLE();
3351 // -----------------------------------------------------------------------------
3354 void fFinishObjectAPPLE(GLenum object
, GLint name
) {
3356 ASSERT_SYMBOL_PRESENT(fFinishObjectAPPLE
);
3357 mSymbols
.fFinishObjectAPPLE(object
, name
);
3361 realGLboolean
fTestObjectAPPLE(GLenum object
, GLint name
) {
3362 realGLboolean ret
= false;
3364 ASSERT_SYMBOL_PRESENT(fTestObjectAPPLE
);
3365 ret
= mSymbols
.fTestObjectAPPLE(object
, name
);
3370 // -----------------------------------------------------------------------------
3373 void fPrimitiveRestartIndex(GLuint index
) {
3375 ASSERT_SYMBOL_PRESENT(fPrimitiveRestartIndex
);
3376 mSymbols
.fPrimitiveRestartIndex(index
);
3380 // -----------------------------------------------------------------------------
3383 void fFramebufferTextureMultiview(GLenum target
, GLenum attachment
,
3384 GLuint texture
, GLint level
,
3385 GLint baseViewIndex
,
3386 GLsizei numViews
) const {
3388 ASSERT_SYMBOL_PRESENT(fFramebufferTextureMultiview
);
3389 mSymbols
.fFramebufferTextureMultiview(target
, attachment
, texture
, level
,
3390 baseViewIndex
, numViews
);
3395 // draw_buffers_indexed
3397 void fBlendEquationSeparatei(GLuint i
, GLenum modeRGB
,
3398 GLenum modeAlpha
) const {
3400 mSymbols
.fBlendEquationSeparatei(i
, modeRGB
, modeAlpha
);
3404 void fBlendFuncSeparatei(GLuint i
, GLenum sfactorRGB
, GLenum dfactorRGB
,
3405 GLenum sfactorAlpha
, GLenum dfactorAlpha
) const {
3407 mSymbols
.fBlendFuncSeparatei(i
, sfactorRGB
, dfactorRGB
, sfactorAlpha
,
3412 void fColorMaski(GLuint i
, realGLboolean red
, realGLboolean green
,
3413 realGLboolean blue
, realGLboolean alpha
) const {
3415 mSymbols
.fColorMaski(i
, red
, green
, blue
, alpha
);
3419 void fDisablei(GLenum capability
, GLuint i
) const {
3421 mSymbols
.fDisablei(capability
, i
);
3425 void fEnablei(GLenum capability
, GLuint i
) const {
3427 mSymbols
.fEnablei(capability
, i
);
3433 void fProvokingVertex(GLenum mode
) const {
3435 mSymbols
.fProvokingVertex(mode
);
3439 // -----------------------------------------------------------------------------
3441 void fDeleteSemaphoresEXT(GLsizei n
, const GLuint
* semaphores
) {
3443 mSymbols
.fDeleteSemaphoresEXT(n
, semaphores
);
3447 void fGenSemaphoresEXT(GLsizei n
, GLuint
* semaphores
) {
3449 mSymbols
.fGenSemaphoresEXT(n
, semaphores
);
3453 void fGetSemaphoreParameterui64vEXT(GLuint semaphore
, GLenum pname
,
3456 mSymbols
.fGetSemaphoreParameterui64vEXT(semaphore
, pname
, params
);
3460 realGLboolean
fIsSemaphoreEXT(GLuint semaphore
) {
3461 realGLboolean ret
= false;
3463 ret
= mSymbols
.fIsSemaphoreEXT(semaphore
);
3468 void fSemaphoreParameterui64vEXT(GLuint semaphore
, GLenum pname
,
3469 const GLuint64
* params
) {
3471 mSymbols
.fSemaphoreParameterui64vEXT(semaphore
, pname
, params
);
3475 void fSignalSemaphoreEXT(GLuint semaphore
, GLuint numBufferBarriers
,
3476 const GLuint
* buffers
, GLuint numTextureBarriers
,
3477 const GLuint
* textures
, const GLenum
* dstLayouts
) {
3479 mSymbols
.fSignalSemaphoreEXT(semaphore
, numBufferBarriers
, buffers
,
3480 numTextureBarriers
, textures
, dstLayouts
);
3484 void fWaitSemaphoreEXT(GLuint semaphore
, GLuint numBufferBarriers
,
3485 const GLuint
* buffers
, GLuint numTextureBarriers
,
3486 const GLuint
* textures
, const GLenum
* srcLayouts
) {
3488 mSymbols
.fWaitSemaphoreEXT(semaphore
, numBufferBarriers
, buffers
,
3489 numTextureBarriers
, textures
, srcLayouts
);
3493 // -----------------------------------------------------------------------------
3494 // GL_EXT_semaphore_fd
3495 void fImportSemaphoreFdEXT(GLuint semaphore
, GLenum handleType
, GLint fd
) {
3497 mSymbols
.fImportSemaphoreFdEXT(semaphore
, handleType
, fd
);
3501 // -----------------------------------------------------------------------------
3502 // Extension EXT_memory_object
3503 void fGetUnsignedBytevEXT(GLenum pname
, GLubyte
* data
) {
3505 mSymbols
.fGetUnsignedBytevEXT(pname
, data
);
3509 void fGetUnsignedBytei_vEXT(GLenum target
, GLuint index
, GLubyte
* data
) {
3511 mSymbols
.fGetUnsignedBytei_vEXT(target
, index
, data
);
3515 void fDeleteMemoryObjectsEXT(GLsizei n
, const GLuint
* memoryObjects
) {
3517 mSymbols
.fDeleteMemoryObjectsEXT(n
, memoryObjects
);
3521 void fIsMemoryObjectEXT(GLuint memoryObject
) {
3523 mSymbols
.fIsMemoryObjectEXT(memoryObject
);
3527 void fCreateMemoryObjectsEXT(GLsizei n
, GLuint
* memoryObjects
) {
3529 mSymbols
.fCreateMemoryObjectsEXT(n
, memoryObjects
);
3533 void fMemoryObjectParameterivEXT(GLuint memoryObject
, GLenum pname
,
3534 const GLint
* params
) {
3536 mSymbols
.fMemoryObjectParameterivEXT(memoryObject
, pname
, params
);
3540 void fGetMemoryObjectParameterivEXT(GLuint memoryObject
, GLenum pname
,
3543 mSymbols
.fGetMemoryObjectParameterivEXT(memoryObject
, pname
, params
);
3547 void fTexStorageMem2DEXT(GLenum target
, GLsizei levels
, GLenum internalFormat
,
3548 GLsizei width
, GLsizei height
, GLuint memory
,
3551 mSymbols
.fTexStorageMem2DEXT(target
, levels
, internalFormat
, width
, height
,
3556 void fTexStorageMem2DMultisampleEXT(GLenum target
, GLsizei samples
,
3557 GLenum internalFormat
, GLsizei width
,
3559 realGLboolean fixedSampleLocations
,
3560 GLuint memory
, GLuint64 offset
) {
3562 mSymbols
.fTexStorageMem2DMultisampleEXT(target
, samples
, internalFormat
,
3563 width
, height
, fixedSampleLocations
,
3568 void fTexStorageMem3DEXT(GLenum target
, GLsizei levels
, GLenum internalFormat
,
3569 GLsizei width
, GLsizei height
, GLsizei depth
,
3570 GLuint memory
, GLuint64 offset
) {
3572 mSymbols
.fTexStorageMem3DEXT(target
, levels
, internalFormat
, width
, height
,
3573 depth
, memory
, offset
);
3577 void fTexStorageMem3DMultisampleEXT(GLenum target
, GLsizei samples
,
3578 GLenum internalFormat
, GLsizei width
,
3579 GLsizei height
, GLsizei depth
,
3580 realGLboolean fixedSampleLocations
,
3581 GLuint memory
, GLuint64 offset
) {
3583 mSymbols
.fTexStorageMem3DMultisampleEXT(
3584 target
, samples
, internalFormat
, width
, height
, depth
,
3585 fixedSampleLocations
, memory
, offset
);
3589 void fBufferStorageMemEXT(GLenum target
, GLsizeiptr size
, GLuint memory
,
3592 mSymbols
.fBufferStorageMemEXT(target
, size
, memory
, offset
);
3596 void fTextureStorageMem2DEXT(GLuint texture
, GLsizei levels
,
3597 GLenum internalFormat
, GLsizei width
,
3598 GLsizei height
, GLuint memory
, GLuint64 offset
) {
3600 mSymbols
.fTextureStorageMem2DEXT(texture
, levels
, internalFormat
, width
,
3601 height
, memory
, offset
);
3605 void fTextureStorageMem2DMultisampleEXT(GLuint texture
, GLsizei samples
,
3606 GLenum internalFormat
, GLsizei width
,
3608 realGLboolean fixedSampleLocations
,
3609 GLuint memory
, GLuint64 offset
) {
3611 mSymbols
.fTextureStorageMem2DMultisampleEXT(
3612 texture
, samples
, internalFormat
, width
, height
, fixedSampleLocations
,
3617 void fTextureStorageMem3DEXT(GLuint texture
, GLsizei levels
,
3618 GLenum internalFormat
, GLsizei width
,
3619 GLsizei height
, GLsizei depth
, GLuint memory
,
3622 mSymbols
.fTextureStorageMem3DEXT(texture
, levels
, internalFormat
, width
,
3623 height
, depth
, memory
, offset
);
3627 void fTextureStorageMem3DMultisampleEXT(GLuint texture
, GLsizei samples
,
3628 GLenum internalFormat
, GLsizei width
,
3629 GLsizei height
, GLsizei depth
,
3630 realGLboolean fixedSampleLocations
,
3631 GLuint memory
, GLuint64 offset
) {
3633 mSymbols
.fTextureStorageMem3DMultisampleEXT(
3634 texture
, samples
, internalFormat
, width
, height
, depth
,
3635 fixedSampleLocations
, memory
, offset
);
3639 void fNamedBufferStorageMemEXT(GLuint buffer
, GLsizeiptr size
, GLuint memory
,
3642 mSymbols
.fNamedBufferStorageMemEXT(buffer
, size
, memory
, offset
);
3646 // -----------------------------------------------------------------------------
3647 // Extension EXT_memory_object_fd
3649 void fImportMemoryFdEXT(GLuint memory
, GLuint64 size
, GLenum handleType
,
3652 mSymbols
.fImportMemoryFdEXT(memory
, size
, handleType
, fd
);
3658 #undef BEFORE_GL_CALL
3659 #undef AFTER_GL_CALL
3660 #undef ASSERT_SYMBOL_PRESENT
3661 // #undef TRACKING_CONTEXT // Needed in GLContext.cpp
3662 #undef ASSERT_NOT_PASSING_STACK_BUFFER_TO_GL
3664 // -----------------------------------------------------------------------------
3667 explicit GLContext(const GLContextDesc
&, GLContext
* sharedContext
= nullptr,
3668 bool canUseTLSIsCurrent
= false);
3670 // -----------------------------------------------------------------------------
3673 virtual ~GLContext();
3675 // Mark this context as destroyed. This will nullptr out all
3676 // the GL function pointers!
3677 void MarkDestroyed();
3680 virtual void OnMarkDestroyed() {}
3682 // -----------------------------------------------------------------------------
3683 // Everything that isn't standard GL APIs
3685 typedef gfx::SurfaceFormat SurfaceFormat
;
3688 virtual void ReleaseSurface() {}
3690 bool IsDestroyed() const {
3691 // MarkDestroyed will mark all these as null.
3692 return mContextLost
&& mSymbols
.fUseProgram
== nullptr;
3695 GLContext
* GetSharedContext() { return mSharedContext
; }
3698 * Returns true if the thread on which this context was created is the
3699 * currently executing thread.
3701 bool IsValidOwningThread() const;
3703 static void PlatformStartup();
3707 * If this context wraps a double-buffered target, swap the back
3708 * and front buffers. It should be assumed that after a swap, the
3709 * contents of the new back buffer are undefined.
3711 virtual bool SwapBuffers() { return false; }
3714 * Stores a damage region (in origin bottom left coordinates), which
3715 * makes the next SwapBuffers call do eglSwapBuffersWithDamage if supported.
3717 * Note that even if only part of the context is damaged, the entire buffer
3718 * needs to be filled with up-to-date contents. This region is only a hint
3719 * telling the system compositor which parts of the buffer were updated.
3721 virtual void SetDamage(const nsIntRegion
& aDamageRegion
) {}
3724 * Get the buffer age. If it returns 0, that indicates the buffer state is
3725 * unknown and the entire frame should be redrawn.
3727 virtual GLint
GetBufferAge() const { return 0; }
3730 * Defines a two-dimensional texture image for context target surface
3732 virtual bool BindTexImage() { return false; }
3734 * Releases a color buffer that is being used as a texture
3736 virtual bool ReleaseTexImage() { return false; }
3738 virtual Maybe
<SymbolLoader
> GetSymbolLoader() const = 0;
3740 void BindFB(GLuint fb
) {
3741 fBindFramebuffer(LOCAL_GL_FRAMEBUFFER
, fb
);
3742 MOZ_GL_ASSERT(this, !fb
|| fIsFramebuffer(fb
));
3745 void BindDrawFB(GLuint fb
) {
3746 fBindFramebuffer(LOCAL_GL_DRAW_FRAMEBUFFER_EXT
, fb
);
3749 void BindReadFB(GLuint fb
) {
3750 fBindFramebuffer(LOCAL_GL_READ_FRAMEBUFFER_EXT
, fb
);
3753 GLuint
GetDrawFB() const {
3754 return GetIntAs
<GLuint
>(LOCAL_GL_DRAW_FRAMEBUFFER_BINDING_EXT
);
3757 GLuint
GetReadFB() const {
3758 auto bindEnum
= LOCAL_GL_READ_FRAMEBUFFER_BINDING_EXT
;
3759 if (!IsSupported(GLFeature::split_framebuffer
)) {
3760 bindEnum
= LOCAL_GL_FRAMEBUFFER_BINDING
;
3762 return GetIntAs
<GLuint
>(bindEnum
);
3765 GLuint
GetFB() const {
3766 const auto ret
= GetDrawFB();
3767 MOZ_ASSERT(ret
== GetReadFB());
3772 void GetShaderPrecisionFormatNonES2(GLenum shadertype
, GLenum precisiontype
,
3773 GLint
* range
, GLint
* precision
) {
3774 switch (precisiontype
) {
3775 case LOCAL_GL_LOW_FLOAT
:
3776 case LOCAL_GL_MEDIUM_FLOAT
:
3777 case LOCAL_GL_HIGH_FLOAT
:
3778 // Assume IEEE 754 precision
3783 case LOCAL_GL_LOW_INT
:
3784 case LOCAL_GL_MEDIUM_INT
:
3785 case LOCAL_GL_HIGH_INT
:
3786 // Some (most) hardware only supports single-precision floating-point
3787 // numbers, which can accurately represent integers up to +/-16777216
3796 virtual GLenum
GetPreferredARGB32Format() const { return LOCAL_GL_RGBA
; }
3798 virtual GLenum
GetPreferredEGLImageTextureTarget() const {
3799 #ifdef MOZ_WIDGET_GTK
3800 return LOCAL_GL_TEXTURE_2D
;
3802 if (IsExtensionSupported(OES_EGL_image_external
) &&
3803 mRenderer
!= GLRenderer::AndroidEmulator
) {
3804 return LOCAL_GL_TEXTURE_EXTERNAL
;
3806 return LOCAL_GL_TEXTURE_2D
;
3810 virtual bool RenewSurface(widget::CompositorWidget
* aWidget
) { return false; }
3812 // Shared code for GL extensions and GLX extensions.
3813 static bool ListHasExtension(const GLubyte
* extensions
,
3814 const char* extension
);
3818 DebugFlagEnabled
= 1 << 0,
3819 DebugFlagTrace
= 1 << 1,
3820 DebugFlagAbortOnError
= 1 << 2
3823 const uint8_t mDebugFlags
;
3824 static uint8_t ChooseDebugFlags(CreateContextFlags createFlags
);
3827 RefPtr
<GLContext
> mSharedContext
;
3830 // The thread id which this context was created.
3831 Maybe
<PlatformThreadId
> mOwningThreadId
;
3834 GLContextSymbols mSymbols
= {};
3836 UniquePtr
<GLBlitHelper
> mBlitHelper
;
3837 UniquePtr
<GLReadTexImageHelper
> mReadTexImageHelper
;
3840 GLBlitHelper
* BlitHelper();
3841 GLReadTexImageHelper
* ReadTexImageHelper();
3843 // Assumes shares are created by all sharing with the same global context.
3844 bool SharesWith(const GLContext
* other
) const {
3845 MOZ_ASSERT(!this->mSharedContext
|| !this->mSharedContext
->mSharedContext
);
3846 MOZ_ASSERT(!other
->mSharedContext
||
3847 !other
->mSharedContext
->mSharedContext
);
3848 MOZ_ASSERT(!this->mSharedContext
|| !other
->mSharedContext
||
3849 this->mSharedContext
== other
->mSharedContext
);
3851 const GLContext
* thisShared
=
3852 this->mSharedContext
? this->mSharedContext
: this;
3853 const GLContext
* otherShared
=
3854 other
->mSharedContext
? other
->mSharedContext
: other
;
3856 return thisShared
== otherShared
;
3859 bool IsFramebufferComplete(GLuint fb
, GLenum
* status
= nullptr);
3861 // Does not check completeness.
3862 void AttachBuffersToFB(GLuint colorTex
, GLuint colorRB
, GLuint depthRB
,
3863 GLuint stencilRB
, GLuint fb
,
3864 GLenum target
= LOCAL_GL_TEXTURE_2D
);
3866 // Passing null is fine if the value you'd get is 0.
3867 bool AssembleOffscreenFBs(const GLuint colorMSRB
, const GLuint depthRB
,
3868 const GLuint stencilRB
, const GLuint texture
,
3869 GLuint
* drawFB
, GLuint
* readFB
);
3872 SharedSurface
* mLockedSurface
= nullptr;
3875 void LockSurface(SharedSurface
* surf
) { mLockedSurface
= surf
; }
3877 void UnlockSurface(SharedSurface
* surf
) {
3878 MOZ_ASSERT(mLockedSurface
== surf
);
3879 mLockedSurface
= nullptr;
3882 SharedSurface
* GetLockedSurface() const { return mLockedSurface
; }
3884 bool IsOffscreen() const { return mDesc
.isOffscreen
; }
3886 bool WorkAroundDriverBugs() const { return mWorkAroundDriverBugs
; }
3888 bool IsOffscreenSizeAllowed(const gfx::IntSize
& aSize
) const;
3890 virtual bool Init();
3894 void LoadMoreSymbols(const SymbolLoader
& loader
);
3895 bool LoadExtSymbols(const SymbolLoader
& loader
, const SymLoadStruct
* list
,
3897 bool LoadFeatureSymbols(const SymbolLoader
& loader
, const SymLoadStruct
* list
,
3901 void InitExtensions();
3903 GLint mViewportRect
[4] = {};
3904 GLint mScissorRect
[4] = {};
3906 uint32_t mMaxTexOrRbSize
= 0;
3907 GLint mMaxTextureSize
= 0;
3908 GLint mMaxCubeMapTextureSize
= 0;
3909 GLint mMaxRenderbufferSize
= 0;
3910 GLint mMaxViewportDims
[2] = {};
3911 GLsizei mMaxSamples
= 0;
3912 bool mNeedsTextureSizeChecks
= false;
3913 bool mNeedsFlushBeforeDeleteFB
= false;
3914 bool mTextureAllocCrashesOnMapFailure
= false;
3915 const bool mWorkAroundDriverBugs
;
3916 mutable uint64_t mSyncGLCallCount
= 0;
3918 bool IsTextureSizeSafeToPassToDriver(GLenum target
, GLsizei width
,
3919 GLsizei height
) const {
3920 if (mNeedsTextureSizeChecks
) {
3921 // some drivers incorrectly handle some large texture sizes that are below
3922 // the max texture size that they report. So we check ourselves against
3923 // our own values (mMax[CubeMap]TextureSize). see bug 737182 for Mac Intel
3924 // 2D textures see bug 684882 for Mac Intel cube map textures see bug
3925 // 814716 for Mesa Nouveau
3927 target
== LOCAL_GL_TEXTURE_CUBE_MAP
||
3928 (target
>= LOCAL_GL_TEXTURE_CUBE_MAP_POSITIVE_X
&&
3929 target
<= LOCAL_GL_TEXTURE_CUBE_MAP_NEGATIVE_Z
)
3930 ? mMaxCubeMapTextureSize
3932 return width
<= maxSize
&& height
<= maxSize
;
3938 auto MaxSamples() const { return uint32_t(mMaxSamples
); }
3939 auto MaxTextureSize() const { return uint32_t(mMaxTextureSize
); }
3940 auto MaxRenderbufferSize() const { return uint32_t(mMaxRenderbufferSize
); }
3941 auto MaxTexOrRbSize() const { return mMaxTexOrRbSize
; }
3943 #ifdef MOZ_GL_DEBUG_BUILD
3944 void CreatedProgram(GLContext
* aOrigin
, GLuint aName
);
3945 void CreatedShader(GLContext
* aOrigin
, GLuint aName
);
3946 void CreatedBuffers(GLContext
* aOrigin
, GLsizei aCount
, GLuint
* aNames
);
3947 void CreatedQueries(GLContext
* aOrigin
, GLsizei aCount
, GLuint
* aNames
);
3948 void CreatedTextures(GLContext
* aOrigin
, GLsizei aCount
, GLuint
* aNames
);
3949 void CreatedFramebuffers(GLContext
* aOrigin
, GLsizei aCount
, GLuint
* aNames
);
3950 void CreatedRenderbuffers(GLContext
* aOrigin
, GLsizei aCount
, GLuint
* aNames
);
3951 void DeletedProgram(GLContext
* aOrigin
, GLuint aName
);
3952 void DeletedShader(GLContext
* aOrigin
, GLuint aName
);
3953 void DeletedBuffers(GLContext
* aOrigin
, GLsizei aCount
, const GLuint
* aNames
);
3954 void DeletedQueries(GLContext
* aOrigin
, GLsizei aCount
, const GLuint
* aNames
);
3955 void DeletedTextures(GLContext
* aOrigin
, GLsizei aCount
,
3956 const GLuint
* aNames
);
3957 void DeletedFramebuffers(GLContext
* aOrigin
, GLsizei aCount
,
3958 const GLuint
* aNames
);
3959 void DeletedRenderbuffers(GLContext
* aOrigin
, GLsizei aCount
,
3960 const GLuint
* aNames
);
3962 void SharedContextDestroyed(GLContext
* aChild
);
3963 void ReportOutstandingNames();
3965 struct NamedResource
{
3966 NamedResource() : origin(nullptr), name(0), originDeleted(false) {}
3968 NamedResource(GLContext
* aOrigin
, GLuint aName
)
3969 : origin(aOrigin
), name(aName
), originDeleted(false) {}
3976 bool operator<(const NamedResource
& aOther
) const {
3977 if (intptr_t(origin
) < intptr_t(aOther
.origin
)) return true;
3978 if (name
< aOther
.name
) return true;
3981 bool operator==(const NamedResource
& aOther
) const {
3982 return origin
== aOther
.origin
&& name
== aOther
.name
&&
3983 originDeleted
== aOther
.originDeleted
;
3987 nsTArray
<NamedResource
> mTrackedPrograms
;
3988 nsTArray
<NamedResource
> mTrackedShaders
;
3989 nsTArray
<NamedResource
> mTrackedTextures
;
3990 nsTArray
<NamedResource
> mTrackedFramebuffers
;
3991 nsTArray
<NamedResource
> mTrackedRenderbuffers
;
3992 nsTArray
<NamedResource
> mTrackedBuffers
;
3993 nsTArray
<NamedResource
> mTrackedQueries
;
3997 bool mHeavyGLCallsSinceLastFlush
= false;
4000 void FlushIfHeavyGLCallsSinceLastFlush();
4001 static bool ShouldSpew();
4002 static bool ShouldDumpExts();
4006 void TexParams_SetClampNoMips(GLenum target
= LOCAL_GL_TEXTURE_2D
) {
4007 fTexParameteri(target
, LOCAL_GL_TEXTURE_WRAP_S
, LOCAL_GL_CLAMP_TO_EDGE
);
4008 fTexParameteri(target
, LOCAL_GL_TEXTURE_WRAP_T
, LOCAL_GL_CLAMP_TO_EDGE
);
4009 fTexParameteri(target
, LOCAL_GL_TEXTURE_MAG_FILTER
, LOCAL_GL_NEAREST
);
4010 fTexParameteri(target
, LOCAL_GL_TEXTURE_MIN_FILTER
, LOCAL_GL_NEAREST
);
4015 GLuint
CreateFramebuffer() {
4017 fGenFramebuffers(1, &x
);
4020 GLuint
CreateRenderbuffer() {
4022 fGenRenderbuffers(1, &x
);
4025 GLuint
CreateTexture() {
4027 fGenTextures(1, &x
);
4031 void DeleteFramebuffer(const GLuint x
) { fDeleteFramebuffers(1, &x
); }
4032 void DeleteRenderbuffer(const GLuint x
) { fDeleteRenderbuffers(1, &x
); }
4033 void DeleteTexture(const GLuint x
) { fDeleteTextures(1, &x
); }
4036 bool DoesStringMatch(const char* aString
, const char* aWantedString
);
4038 void SplitByChar(const nsACString
& str
, const char delim
,
4039 std::vector
<nsCString
>* const out
);
4042 bool MarkBitfieldByString(const nsACString
& str
,
4043 const char* const (&markStrList
)[N
],
4044 std::bitset
<N
>* const out_markList
) {
4045 for (size_t i
= 0; i
< N
; i
++) {
4046 if (str
.Equals(markStrList
[i
])) {
4047 (*out_markList
)[i
] = 1;
4055 void MarkBitfieldByStrings(const std::vector
<nsCString
>& strList
,
4057 const char* const (&markStrList
)[N
],
4058 std::bitset
<N
>* const out_markList
) {
4059 for (auto itr
= strList
.begin(); itr
!= strList
.end(); ++itr
) {
4060 const nsACString
& str
= *itr
;
4061 const bool wasMarked
= MarkBitfieldByString(str
, markStrList
, out_markList
);
4063 printf_stderr(" %s%s\n", str
.BeginReading(), wasMarked
? "(*)" : "");
4069 class Renderbuffer final
{
4071 const WeakPtr
<GLContext
> weakGl
;
4075 static GLuint
Create(GLContext
& gl
) {
4077 gl
.fGenRenderbuffers(1, &ret
);
4082 explicit Renderbuffer(GLContext
& gl
) : weakGl(&gl
), name(Create(gl
)) {}
4085 const RefPtr
<GLContext
> gl
= weakGl
.get();
4086 if (!gl
|| !gl
->MakeCurrent()) return;
4087 gl
->fDeleteRenderbuffers(1, &name
);
4093 class Texture final
{
4095 const WeakPtr
<GLContext
> weakGl
;
4099 static GLuint
Create(GLContext
& gl
) {
4101 gl
.fGenTextures(1, &ret
);
4106 explicit Texture(GLContext
& gl
) : weakGl(&gl
), name(Create(gl
)) {}
4109 const RefPtr
<GLContext
> gl
= weakGl
.get();
4110 if (!gl
|| !gl
->MakeCurrent()) return;
4111 gl
->fDeleteTextures(1, &name
);
4117 class Sampler final
{
4119 const WeakPtr
<GLContext
> weakGl
;
4123 static GLuint
Create(GLContext
& gl
) {
4125 gl
.fGenSamplers(1, &ret
);
4130 explicit Sampler(GLContext
& gl
) : weakGl(&gl
), name(Create(gl
)) {}
4133 const RefPtr
<GLContext
> gl
= weakGl
.get();
4134 if (!gl
|| !gl
->MakeCurrent()) return;
4135 gl
->fDeleteSamplers(1, &name
);
4140 * Helper function that creates a 2D texture aSize.width x aSize.height with
4141 * storage type specified by aFormats. Returns GL texture object id.
4143 * See mozilla::gl::CreateTexture.
4145 UniquePtr
<Texture
> CreateTexture(GLContext
&, const gfx::IntSize
& size
);
4148 * Helper function that calculates the number of bytes required per
4149 * texel for a texture from its format and type.
4151 uint32_t GetBytesPerTexel(GLenum format
, GLenum type
);
4153 void MesaMemoryLeakWorkaround();
4155 } /* namespace gl */
4156 } /* namespace mozilla */
4158 #endif /* GLCONTEXT_H_ */