1 #ifndef DALI_INTERNAL_CONTEXT_H
2 #define DALI_INTERNAL_CONTEXT_H
5 * Copyright (c) 2020 Samsung Electronics Co., Ltd.
7 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
11 * http://www.apache.org/licenses/LICENSE-2.0
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS,
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
22 #include <dali/public-api/common/dali-vector.h>
23 #include <dali/public-api/common/dali-common.h>
24 #include <dali/public-api/math/rect.h>
25 #include <dali/public-api/math/vector4.h>
26 #include <dali/public-api/rendering/renderer.h>
27 #include <dali/devel-api/common/owner-container.h>
28 #include <dali/integration-api/debug.h>
29 #include <dali/integration-api/gl-abstraction.h>
30 #include <dali/integration-api/gl-defines.h>
31 #include <dali/internal/render/common/performance-monitor.h>
32 #include <dali/internal/render/gl-resources/texture-units.h>
33 #include <dali/internal/render/gl-resources/frame-buffer-state-cache.h>
34 #include <dali/internal/render/gl-resources/gl-call-debug.h>
43 * Context records the current GL state, and provides access to the OpenGL ES 2.0 API.
44 * Context avoids duplicate GL calls, if the same setting etc. is requested repeatedly.
51 * FrameBuffer Clear mode
55 FORCE_CLEAR, ///< always perform the glClear regardless of current state
56 CHECK_CACHED_VALUES ///< check the Frame buffers cached state to see if a clear is required
60 * Size of the VertexAttributeArray enables
61 * GLES specification states that there's minimum of 8
63 static constexpr unsigned int MAX_ATTRIBUTE_CACHE_SIZE = 8;
65 static constexpr unsigned int MAX_TEXTURE_UNITS = 8; // for GLES 2.0 8 is guaranteed, which is more than DALi uses anyways
66 static constexpr unsigned int MAX_TEXTURE_TARGET = 3; // We support only GL_TEXTURE_2D, GL_TEXTURE_CUBE_MAP and GL_TEXTURE_EXTERNAL_OES now
69 * Creates the Dali Context object for surface rendering only.
70 * This method does not create an OpenGL context i.e. that is done from outside dali-core.
71 * @pre Context has not been created.
72 * @exception Context already created.
73 * @param glAbstraction the gl abstraction.
75 Context( Integration::GlAbstraction& glAbstraction );
78 * Creates the Dali Context object for texture (and surface rendering if required).
79 * This method does not create an OpenGL context i.e. that is done from outside dali-core.
80 * @pre Context has not been created.
81 * @exception Context already created.
82 * @param glAbstraction the gl abstraction.
83 * @param contexts The list of scene contexts (for surface rendering)
85 Context( Integration::GlAbstraction& glAbstraction, OwnerContainer< Context* >* contexts );
93 * Called when the GL context has been created.
95 void GlContextCreated();
98 * Called when the GL context has been destroyed.
100 void GlContextDestroyed();
103 * Query whether the OpenGL context has been created.
104 * @return True if the OpenGL context has been created.
106 bool IsGlContextCreated() { return mGlContextCreated; }
109 * @return the GLAbstraction
111 Integration::GlAbstraction& GetAbstraction() { return mGlAbstraction; }
116 * Debug helper which prints the currently cached GL state.
118 void PrintCurrentState();
123 * Helper to convert GL error code to string
124 * @param errorCode to convert
127 const char* ErrorToString( GLenum errorCode );
130 * Helper to print GL string to debug log
132 void PrintGlString(const char* stringName, GLenum stringId)
134 DALI_LOG_INFO(Debug::Filter::gRender, Debug::General, "GL %s = %s\n", stringName, reinterpret_cast< const char * >( GetString( stringId ) ) );
138 * Reset the cached buffer ids.
140 void ResetBufferCache()
142 // reset the cached buffer id's
143 // fixes problem where some drivers will a generate a buffer with the
144 // same id, as the last deleted buffer id.
145 mBoundArrayBufferId = 0;
146 mBoundElementArrayBufferId = 0;
147 mBoundTransformFeedbackBufferId = 0;
151 * Reset the cached texture ids.
153 void ResetTextureCache()
155 // reset the cached texture id's in case the driver re-uses them
156 // when creating new textures
157 for(unsigned int i = 0; i < MAX_TEXTURE_UNITS; ++i)
159 for(unsigned int j = 0; j < MAX_TEXTURE_TARGET; ++j)
161 mBoundTextureId[i][j] = 0;
167 * Get an index of the cached texture list from the texture target.
168 * @param target The texture target
169 * @return The index of the cached texture list
171 static constexpr int16_t GetTextureIndexFromGlFormat(int target)
179 case GL_TEXTURE_CUBE_MAP:
183 case GL_TEXTURE_EXTERNAL_OES:
194 /****************************************************************************************
195 * The following methods are forwarded to Dali::Integration::GlAbstraction.
196 * In some cases the GL state is recorded, to avoid duplicate calls with the same state.
197 * All Shader, Program, Uniform and Attribute related calls are not here, Program class
198 * handles them and optimizes any program related state changes
199 ****************************************************************************************/
202 * Wrapper for IsSurfacelessContextSupported of Dali::Integration::GlAbstraction
204 bool IsSurfacelessContextSupported() const
206 return mGlAbstraction.IsSurfacelessContextSupported();
210 * Wrapper for TextureRequiresConverting of Dali::Integration::GlAbstraction
212 bool TextureRequiresConverting( const GLenum imageGlFormat, const GLenum textureGlFormat, const bool isSubImage ) const
214 return mGlAbstraction.TextureRequiresConverting( imageGlFormat, textureGlFormat, isSubImage );
218 * Wrapper for OpenGL ES 2.0 glActiveTexture()
220 void ActiveTexture( TextureUnit textureUnit )
222 if ( textureUnit != mActiveTextureUnit )
224 mActiveTextureUnit = textureUnit;
225 LOG_GL("ActiveTexture %x\n", textureUnit);
226 CHECK_GL( mGlAbstraction, mGlAbstraction.ActiveTexture(TextureUnitAsGLenum(textureUnit)) );
231 * Wrapper for OpenGL ES 3.0 glBeginQuery()
233 void BeginQuery(GLenum target, GLuint id)
235 LOG_GL("BeginQuery %d %d\n", target, id);
236 CHECK_GL( mGlAbstraction, mGlAbstraction.BeginQuery(target, id) );
240 * Wrapper for OpenGL ES 3.0 glBeginTransformFeedback()
242 void BeginTransformFeedback(GLenum primitiveMode)
244 LOG_GL("BeginTransformFeedback %x\n", primitiveMode);
245 CHECK_GL( mGlAbstraction, mGlAbstraction.BeginTransformFeedback(primitiveMode) );
249 * The wrapper for OpenGL ES 2.0 glBindBuffer() has been replaced by BindArrayBuffer & BindElementArrayBuffer & BindTransformFeedbackBuffer.
253 * Wrapper for OpenGL ES 2.0 glBindBuffer(GL_ARRAY_BUFFER, ...)
255 void BindArrayBuffer(GLuint buffer)
257 // Avoid unecessary calls to BindBuffer
258 if (mBoundArrayBufferId != buffer)
260 mBoundArrayBufferId = buffer;
262 LOG_GL("BindBuffer GL_ARRAY_BUFFER %d\n", buffer);
263 CHECK_GL( mGlAbstraction, mGlAbstraction.BindBuffer(GL_ARRAY_BUFFER, buffer) );
268 * Wrapper for OpenGL ES 2.0 glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ...)
270 void BindElementArrayBuffer(GLuint buffer)
272 // Avoid unecessary calls to BindBuffer
273 if (mBoundElementArrayBufferId!= buffer)
275 mBoundElementArrayBufferId = buffer;
277 LOG_GL("BindBuffer GL_ELEMENT_ARRAY_BUFFER %d\n", buffer);
278 CHECK_GL( mGlAbstraction, mGlAbstraction.BindBuffer(GL_ELEMENT_ARRAY_BUFFER, buffer) );
283 * Wrapper for OpenGL ES 3.0 glBindBuffer(GL_TRANSFORM_FEEDBACK_BUFFER, ...)
285 void BindTransformFeedbackBuffer(GLuint buffer)
287 // Avoid unecessary calls to BindBuffer
288 if (mBoundTransformFeedbackBufferId != buffer)
290 mBoundTransformFeedbackBufferId = buffer;
292 LOG_GL("BindBuffer GL_TRANSFORM_FEEDBACK_BUFFER %d\n", buffer);
293 CHECK_GL( mGlAbstraction, mGlAbstraction.BindBuffer(GL_TRANSFORM_FEEDBACK_BUFFER , buffer) );
298 * Wrapper for OpenGL ES 3.0 glBindBufferBase(GL_TRANSFORM_FEEDBACK_BUFFER, ...)
300 void BindTransformFeedbackBufferBase(GLuint index, GLuint buffer)
302 // Avoid unecessary calls to BindBufferBase
303 if (mBoundTransformFeedbackBufferId != buffer)
305 mBoundTransformFeedbackBufferId = buffer;
307 LOG_GL("BindBufferBase GL_TRANSFORM_FEEDBACK_BUFFER %d %d\n", index, buffer);
308 CHECK_GL( mGlAbstraction, mGlAbstraction.BindBufferBase(GL_TRANSFORM_FEEDBACK_BUFFER, index, buffer) );
313 * Wrapper for OpenGL ES 2.0 glBindFramebuffer()
315 void BindFramebuffer(GLenum target, GLuint framebuffer)
317 mFrameBufferStateCache.SetCurrentFrameBuffer( framebuffer );
319 LOG_GL("BindFramebuffer %d %d\n", target, framebuffer);
320 CHECK_GL( mGlAbstraction, mGlAbstraction.BindFramebuffer(target, framebuffer) );
324 * Wrapper for OpenGL ES 2.0 glBindRenderbuffer()
326 void BindRenderbuffer(GLenum target, GLuint renderbuffer)
328 LOG_GL("BindRenderbuffer %d %d\n", target, renderbuffer);
329 CHECK_GL( mGlAbstraction, mGlAbstraction.BindRenderbuffer(target, renderbuffer) );
333 * Wrapper for OpenGL ES 3.0 glBindTransformFeedback()
335 void BindTransformFeedback(GLenum target, GLuint id)
337 LOG_GL("BindTransformFeedback %d %d\n", target, id);
338 CHECK_GL( mGlAbstraction, mGlAbstraction.BindTransformFeedback(target, id) );
342 * Helper to bind texture for rendering. If given texture is
343 * already bound in the given textureunit, this method does nothing.
344 * Otherwise changes the active texture unit and binds the texture.
345 * Note! after this call active texture unit may not necessarily be the one
346 * passed in as argument so you cannot change texture unit state!!
347 * @param textureunit to bind to
348 * @param texture to bind
350 void BindTextureForUnit( TextureUnit textureunit, int target, GLuint texture )
352 ActiveTexture(textureunit);
353 BindTexture(target, texture);
357 * Wrapper for OpenGL ES 2.0 glBindTexture( target )
359 void BindTexture( int target, GLuint texture )
361 int16_t index = GetTextureIndexFromGlFormat(target);
364 if(mBoundTextureId[ mActiveTextureUnit ][index] != texture)
366 mBoundTextureId[ mActiveTextureUnit ][index] = texture;
368 LOG_GL("BindTexture target(%d) %d\n", target, texture);
369 CHECK_GL(mGlAbstraction, mGlAbstraction.BindTexture(target, texture));
375 LOG_GL("BindTexture target(%d) %d\n", target, texture);
376 CHECK_GL(mGlAbstraction, mGlAbstraction.BindTexture(target, texture));
381 * Wrapper for OpenGL ES 2.0 glBlendColor()
383 void SetDefaultBlendColor()
385 if( ! mUsingDefaultBlendColor )
387 SetCustomBlendColor( Color::TRANSPARENT );
388 mUsingDefaultBlendColor = true;
393 * Wrapper for OpenGL ES 2.0 glBlendColor()
395 void SetCustomBlendColor( const Vector4& color )
397 if( mUsingDefaultBlendColor || mBlendColor != color )
399 LOG_GL( "BlendColor %f %f %f %f\n", color.r, color.g, color.b, color.a );
400 CHECK_GL( mGlAbstraction, mGlAbstraction.BlendColor( color.r, color.g, color.b, color.a ) );
401 mUsingDefaultBlendColor = false;
407 * Wrapper for OpenGL ES 2.0 glBlendEquation()
409 void BlendEquation(GLenum mode)
411 // use BlendEquationSeparate to set the rgb and alpha modes the same
412 BlendEquationSeparate( mode, mode );
416 * Wrapper for OpenGL ES 2.0 glBlendEquationSeparate()
418 void BlendEquationSeparate(GLenum modeRGB, GLenum modeAlpha)
420 if( ( modeRGB != mBlendEquationSeparateModeRGB ) ||
421 ( modeAlpha != mBlendEquationSeparateModeAlpha ) )
423 mBlendEquationSeparateModeRGB = modeRGB;
424 mBlendEquationSeparateModeAlpha = modeAlpha;
425 LOG_GL("BlendEquationSeparate %d %d\n", modeRGB, modeAlpha);
426 CHECK_GL( mGlAbstraction, mGlAbstraction.BlendEquationSeparate(modeRGB, modeAlpha) );
431 * Wrapper for OpenGL ES 2.0 glBlendFunc()
433 void BlendFunc(GLenum sfactor, GLenum dfactor)
435 // reuse the BlendFuncSeparate as thats what the DDK does anyways
436 BlendFuncSeparate( sfactor, dfactor, sfactor, dfactor );
440 * Wrapper for OpenGL ES 2.0 glBlendFuncSeparate()
442 void BlendFuncSeparate( GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha )
444 if( ( mBlendFuncSeparateSrcRGB != srcRGB )||( mBlendFuncSeparateDstRGB != dstRGB )||
445 ( mBlendFuncSeparateSrcAlpha != srcAlpha )||( mBlendFuncSeparateDstAlpha != dstAlpha ) )
447 mBlendFuncSeparateSrcRGB = srcRGB;
448 mBlendFuncSeparateDstRGB = dstRGB;
449 mBlendFuncSeparateSrcAlpha = srcAlpha;
450 mBlendFuncSeparateDstAlpha = dstAlpha;
452 LOG_GL( "BlendFuncSeparate %d %d %d %d\n", srcRGB, dstRGB, srcAlpha, dstAlpha );
453 CHECK_GL( mGlAbstraction, mGlAbstraction.BlendFuncSeparate( srcRGB, dstRGB, srcAlpha, dstAlpha ) );
458 * Wrapper for OpenGL ES 3.0 glBlitFramebuffer()
460 void BlitFramebuffer(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter)
462 LOG_GL( "BlitFramebuffer %d %d %d %d %d %d %d %d %x %d\n", srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter );
463 CHECK_GL( mGlAbstraction, mGlAbstraction.BlitFramebuffer( srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter ) );
467 * Wrapper for OpenGL ES 2.0 glBufferData()
469 void BufferData(GLenum target, GLsizeiptr size, const void* data, GLenum usage)
471 LOG_GL("BufferData %d %d %p %d\n", target, size, data, usage);
472 CHECK_GL( mGlAbstraction, mGlAbstraction.BufferData(target, size, data, usage) );
476 * Wrapper for OpenGL ES 2.0 glBufferSubData()
478 void BufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, const void* data)
480 LOG_GL("BufferSubData %d %d %d %p\n", target, offset, size, data);
481 CHECK_GL( mGlAbstraction, mGlAbstraction.BufferSubData(target, offset, size, data) );
485 * Wrapper for OpenGL ES 2.0 glCheckFramebufferStatus()
487 GLenum CheckFramebufferStatus(GLenum target)
489 LOG_GL("CheckFramebufferStatus %d\n", target);
490 GLenum value = CHECK_GL( mGlAbstraction, mGlAbstraction.CheckFramebufferStatus(target) );
495 * Wrapper for OpenGL ES 2.0 glClear()
497 void Clear(GLbitfield mask, ClearMode mode )
499 bool forceClear = (mode == FORCE_CLEAR );
500 mask = mFrameBufferStateCache.GetClearMask( mask, forceClear , mScissorTestEnabled );
504 LOG_GL("Clear %d\n", mask);
505 CHECK_GL( mGlAbstraction, mGlAbstraction.Clear( mask ) );
510 * Wrapper for OpenGL ES 2.0 glClearColor()
512 void ClearColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha)
514 Vector4 newCol(red,green,blue,alpha);
516 if (!mClearColorSet || mClearColor !=newCol )
518 LOG_GL("ClearColor %f %f %f %f\n", red, green, blue, alpha);
519 CHECK_GL( mGlAbstraction, mGlAbstraction.ClearColor(red, green, blue, alpha) );
521 mClearColorSet = true;
522 mClearColor = newCol;
527 * Wrapper for OpenGL ES 2.0 glClearDepthf()
529 void ClearDepthf(GLclampf depth)
531 LOG_GL("ClearDepthf %f\n", depth);
532 CHECK_GL( mGlAbstraction, mGlAbstraction.ClearDepthf(depth) );
536 * Wrapper for OpenGL ES 2.0 glClearStencil()
538 void ClearStencil(GLint s)
540 LOG_GL("ClearStencil %d\n", s);
541 CHECK_GL( mGlAbstraction, mGlAbstraction.ClearStencil(s) );
545 * Wrapper for OpenGL ES 2.0 glColorMask()
546 * @note This has been optimized to a single boolean value (masking individual channels is not required)
548 void ColorMask( bool flag )
550 // only change state if needed
551 if( flag != mColorMask )
554 LOG_GL("ColorMask %s %s %s %s\n", flag ? "True" : "False", flag ? "True" : "False", flag ? "True" : "False", flag ? "True" : "False");
555 CHECK_GL( mGlAbstraction, mGlAbstraction.ColorMask(flag, flag, flag, flag) );
560 * Wrapper for OpenGL ES 2.0 glCompressedTexImage2D()
562 void CompressedTexImage2D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height,
563 GLint border, GLsizei imageSize, const void* data)
565 LOG_GL("CompressedTexImage2D %d %d %x %d %d %d %d %p\n", target, level, internalformat, width, height, border, imageSize, data);
566 CHECK_GL( mGlAbstraction, mGlAbstraction.CompressedTexImage2D(target, level, internalformat, width, height, border, imageSize, data) );
570 * Wrapper for OpenGL ES 3.0 glCompressedTexImage3D()
572 void CompressedTexImage3D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth,
573 GLint border, GLsizei imageSize, const void* data)
575 LOG_GL("CompressedTexImage3D %d %d %x %d %d %d %d %d %p\n", target, level, internalformat, width, height, depth, border, imageSize, data);
576 CHECK_GL( mGlAbstraction, mGlAbstraction.CompressedTexImage3D(target, level, internalformat, width, height, depth, border, imageSize, data) );
580 * Wrapper for OpenGL ES 2.0 glCompressedTexSubImage2D()
582 void CompressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height,
583 GLenum format, GLsizei imageSize, const void* data)
585 LOG_GL("CompressedTexSubImage2D %x %d %d %d %d %d %x %d %p\n", target, level, xoffset, yoffset, width, height, format, imageSize, data);
586 CHECK_GL( mGlAbstraction, mGlAbstraction.CompressedTexSubImage2D(target, level, xoffset, yoffset, width, height, format, imageSize, data) );
590 * Wrapper for OpenGL ES 3.0 glCompressedTexSubImage3D()
592 void CompressedTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset,
593 GLsizei width, GLsizei height, GLsizei depth,
594 GLenum format, GLsizei imageSize, const void* data)
596 LOG_GL("CompressedTexSubImage3D %x %d %d %d %d %d %d %d %x %d %p\n", target, level, xoffset, yoffset, xoffset, width, height, depth, format, imageSize, data);
597 CHECK_GL( mGlAbstraction, mGlAbstraction.CompressedTexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, data) );
601 * Wrapper for OpenGL ES 2.0 glCopyTexImage2D()
603 void CopyTexImage2D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border)
605 LOG_GL("CopyTexImage2D %x %d %x %d %d %d %d %d\n", target, level, internalformat, x, y, width, height, border);
606 CHECK_GL( mGlAbstraction, mGlAbstraction.CopyTexImage2D(target, level, internalformat, x, y, width, height, border) );
610 * Wrapper for OpenGL ES 2.0 glCopyTexSubImage2D()
612 void CopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height)
614 LOG_GL("CopyTexSubImage2D %x %d %d %d %d %d %d %d\n", target, level, xoffset, yoffset, x, y, width, height);
615 CHECK_GL( mGlAbstraction, mGlAbstraction.CopyTexSubImage2D(target, level, xoffset, yoffset, x, y, width, height) );
619 * Wrapper for OpenGL ES 3.0 glCopyTexSubImage3D()
621 void CopyTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height)
623 LOG_GL("CopyTexSubImage3D %x %d %d %d %d %d %d %d %d\n", target, level, xoffset, yoffset, zoffset, x, y, width, height);
624 CHECK_GL( mGlAbstraction, mGlAbstraction.CopyTexSubImage3D(target, level, xoffset, yoffset, zoffset, x, y, width, height) );
628 * Wrapper for OpenGL ES 2.0 glCullFace()
629 * enables GL_CULL_FACE if in any of the face culling modes
630 * otherwise disables GL_CULL_FACE
632 void CullFace( Dali::FaceCullingMode::Type mode )
634 // Avoid unnecessary calls to gl
635 if(mCullFaceMode != mode)
637 mCullFaceMode = mode;
640 case Dali::FaceCullingMode::NONE:
642 LOG_GL("Disable GL_CULL_FACE\n");
643 CHECK_GL( mGlAbstraction, mGlAbstraction.Disable(GL_CULL_FACE) );
647 case Dali::FaceCullingMode::FRONT:
649 LOG_GL("Enable GL_CULL_FACE\n");
650 CHECK_GL( mGlAbstraction, mGlAbstraction.Enable(GL_CULL_FACE) );
651 LOG_GL("Enable GL_FRONT\n");
652 CHECK_GL( mGlAbstraction, mGlAbstraction.CullFace(GL_FRONT) );
656 case Dali::FaceCullingMode::BACK:
658 LOG_GL("Enable GL_CULL_FACE\n");
659 CHECK_GL( mGlAbstraction, mGlAbstraction.Enable(GL_CULL_FACE) );
660 LOG_GL("Enable GL_BACK\n");
661 CHECK_GL( mGlAbstraction, mGlAbstraction.CullFace(GL_BACK) );
665 case Dali::FaceCullingMode::FRONT_AND_BACK:
667 LOG_GL("Enable GL_CULL_FACE\n");
668 CHECK_GL( mGlAbstraction, mGlAbstraction.Enable(GL_CULL_FACE) );
669 LOG_GL("Enable GL_FRONT_AND_BACK\n");
670 CHECK_GL( mGlAbstraction, mGlAbstraction.CullFace(GL_FRONT_AND_BACK) );
681 * Wrapper for OpenGL ES 2.0 glDeleteBuffers()
683 void DeleteBuffers(GLsizei n, const GLuint* buffers)
685 if( this->IsGlContextCreated() )
687 LOG_GL("DeleteBuffers %d %p\n", n, buffers);
688 CHECK_GL( mGlAbstraction, mGlAbstraction.DeleteBuffers(n, buffers) );
693 // Need to reset the buffer cache in the surface contexts
694 // This will only be executed by the surfaceless context when there are contexts for surface rendering
695 if ( mSceneContexts )
697 for ( auto&& context : *mSceneContexts )
701 context->ResetBufferCache();
708 * Wrapper for OpenGL ES 2.0 glDeleteFramebuffers()
710 void DeleteFramebuffers(GLsizei n, const GLuint* framebuffers)
712 mFrameBufferStateCache.FrameBuffersDeleted( n, framebuffers );
714 LOG_GL("DeleteFramebuffers %d %p\n", n, framebuffers);
715 CHECK_GL( mGlAbstraction, mGlAbstraction.DeleteFramebuffers(n, framebuffers) );
719 * Wrapper for OpenGL ES 3.0 glDeleteQueries()
721 void DeleteQueries(GLsizei n, GLuint* ids)
723 LOG_GL("DeleteQueries %d %p\n", n, ids);
724 CHECK_GL( mGlAbstraction, mGlAbstraction.DeleteQueries(n, ids) );
728 * Wrapper for OpenGL ES 2.0 glDeleteRenderbuffers()
730 void DeleteRenderbuffers(GLsizei n, const GLuint* renderbuffers)
732 LOG_GL("DeleteRenderbuffers %d %p\n", n, renderbuffers);
733 CHECK_GL( mGlAbstraction, mGlAbstraction.DeleteRenderbuffers(n, renderbuffers) );
737 * Wrapper for OpenGL ES 2.0 glDeleteTextures()
739 void DeleteTextures(GLsizei n, const GLuint* textures)
741 LOG_GL("DeleteTextures %d %p\n", n, textures);
742 CHECK_GL( mGlAbstraction, mGlAbstraction.DeleteTextures(n, textures) );
746 // Need to reset the texture cache in the scene contexts
747 // This will only be executed by the surfaceless context when there are contexts for surface rendering
748 if ( mSceneContexts )
750 for ( auto&& context : *mSceneContexts )
754 context->ResetTextureCache();
761 * Wrapper for OpenGL ES 3.0 glDeleteTransformFeedbacks()
763 void DeleteTransformFeedbacks(GLsizei n, GLuint* ids)
765 LOG_GL("DeleteTransformFeedbacks %d %p\n", n, ids);
766 CHECK_GL( mGlAbstraction, mGlAbstraction.DeleteTransformFeedbacks(n, ids) );
770 * Wrapper for OpenGL ES 2.0 glDepthFunc()
772 void DepthFunc(GLenum func)
774 if( func != mDepthFunction )
776 mDepthFunction = func;
777 LOG_GL("DepthFunc %x\n", func);
778 CHECK_GL( mGlAbstraction, mGlAbstraction.DepthFunc(func) );
783 * Wrapper for OpenGL ES 2.0 glDepthMask()
785 void DepthMask(GLboolean flag)
787 bool booleanFlag = flag != GL_FALSE;
788 // only change state if needed
789 if( booleanFlag != mDepthMaskEnabled )
791 mDepthMaskEnabled = booleanFlag;
792 LOG_GL("DepthMask %s\n", booleanFlag ? "True" : "False");
793 CHECK_GL( mGlAbstraction, mGlAbstraction.DepthMask( mDepthMaskEnabled ) );
798 * Wrapper for OpenGL ES 2.0 glDepthRangef()
800 void DepthRangef(GLclampf zNear, GLclampf zFar)
802 LOG_GL("DepthRangef %f %f\n", zNear, zFar);
803 CHECK_GL( mGlAbstraction, mGlAbstraction.DepthRangef(zNear, zFar) );
807 * The wrapper for OpenGL ES 2.0 glDisable() has been replaced by SetBlend, SetCullFace, SetDepthTest,
808 * SetDither, SetPolygonOffsetFill, SetSampleAlphaToCoverage, SetSampleCoverage, SetScissorTest & SetStencilTest.
812 * Wrapper for OpenGL ES 2.0 glDrawArrays()
814 void DrawArrays(GLenum mode, GLint first, GLsizei count)
816 mFrameBufferStateCache.DrawOperation( mColorMask, DepthBufferWriteEnabled(), StencilBufferWriteEnabled() );
817 FlushVertexAttributeLocations();
819 LOG_GL("DrawArrays %x %d %d\n", mode, first, count);
820 CHECK_GL( mGlAbstraction, mGlAbstraction.DrawArrays(mode, first, count) );
824 * Wrapper for OpenGL ES 3.0 glDrawArraysInstanced()
826 void DrawArraysInstanced(GLenum mode, GLint first, GLsizei count, GLsizei instanceCount)
828 mFrameBufferStateCache.DrawOperation( mColorMask, DepthBufferWriteEnabled(), StencilBufferWriteEnabled() );
829 FlushVertexAttributeLocations();
831 LOG_GL("DrawArraysInstanced %x %d %d %d\n", mode, first, count, instanceCount);
832 CHECK_GL( mGlAbstraction, mGlAbstraction.DrawArraysInstanced(mode, first, count,instanceCount) );
836 * Wrapper for OpenGL ES 3.0 glDrawBuffers()
838 void DrawBuffers(GLsizei n, const GLenum* bufs)
840 mFrameBufferStateCache.DrawOperation( mColorMask, DepthBufferWriteEnabled(), StencilBufferWriteEnabled() );
841 LOG_GL("DrawBuffers %d %p\n", n, bufs);
842 CHECK_GL( mGlAbstraction, mGlAbstraction.DrawBuffers(n, bufs) );
846 * Wrapper for OpenGL ES 2.0 glDrawElements()
848 void DrawElements(GLenum mode, GLsizei count, GLenum type, const void* indices)
850 mFrameBufferStateCache.DrawOperation( mColorMask, DepthBufferWriteEnabled(), StencilBufferWriteEnabled() );
852 FlushVertexAttributeLocations();
854 LOG_GL("DrawElements %x %d %d %p\n", mode, count, type, indices);
855 CHECK_GL( mGlAbstraction, mGlAbstraction.DrawElements(mode, count, type, indices) );
859 * Wrapper for OpenGL ES 3.0 glDrawElementsInstanced()
861 void DrawElementsInstanced(GLenum mode, GLsizei count, GLenum type, const void* indices, GLsizei instanceCount)
863 mFrameBufferStateCache.DrawOperation( mColorMask, DepthBufferWriteEnabled(), StencilBufferWriteEnabled() );
865 FlushVertexAttributeLocations();
867 LOG_GL("DrawElementsInstanced %x %d %d %p %d\n", mode, count, type, indices, instanceCount);
868 CHECK_GL( mGlAbstraction, mGlAbstraction.DrawElementsInstanced(mode, count, type, indices, instanceCount) );
872 * Wrapper for OpenGL ES 3.0 glDrawRangeElements()
874 void DrawRangeElements(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void* indices)
876 mFrameBufferStateCache.DrawOperation( mColorMask, DepthBufferWriteEnabled(), StencilBufferWriteEnabled() );
877 FlushVertexAttributeLocations();
879 LOG_GL("DrawRangeElements %x %u %u %d %d %p\n", mode, start, end, count, type, indices);
880 CHECK_GL( mGlAbstraction, mGlAbstraction.DrawRangeElements(mode, start, end, count, type, indices) );
884 * Wrapper for OpenGL ES 3.0 glGenQuerieS()
886 void GenQueries(GLsizei n, GLuint* ids)
888 LOG_GL("GenQueries %d %p\n", n, ids);
889 CHECK_GL( mGlAbstraction, mGlAbstraction.GenQueries(n, ids) );
893 * Wrapper for OpenGL ES 3.0 glGenTransformFeedbacks()
895 void GenTransformFeedbacks(GLsizei n, GLuint* ids)
897 LOG_GL("GenTransformFeedbacks %d %p\n", n, ids);
898 CHECK_GL( mGlAbstraction, mGlAbstraction.GenTransformFeedbacks(n, ids) );
902 * @return the current buffer bound for a given target
904 GLuint GetCurrentBoundArrayBuffer(GLenum target)
909 case GL_ARRAY_BUFFER:
911 result = mBoundArrayBufferId;
914 case GL_ELEMENT_ARRAY_BUFFER:
916 result = mBoundElementArrayBufferId;
919 case GL_TRANSFORM_FEEDBACK_BUFFER:
921 result = mBoundTransformFeedbackBufferId;
926 DALI_ASSERT_DEBUG(0 && "target buffer type not supported");
932 void EnableVertexAttributeArray( GLuint location )
934 SetVertexAttributeLocation( location, true);
937 void DisableVertexAttributeArray( GLuint location )
939 SetVertexAttributeLocation( location, false);
943 * Wrapper for OpenGL ES 3.0 glVertexAttribDivisor()
945 void VertexAttribDivisor ( GLuint index, GLuint divisor )
947 LOG_GL("VertexAttribDivisor(%d, %d)\n", index, divisor );
948 CHECK_GL( mGlAbstraction, mGlAbstraction.VertexAttribDivisor( index, divisor ) );
952 * Wrapper for OpenGL ES 2.0 glVertexAttribPointer()
954 void VertexAttribPointer( GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void* ptr )
956 LOG_GL("VertexAttribPointer(%d, %d, %d, %d, %d, %x)\n", index, size, type, normalized, stride, ptr );
957 CHECK_GL( mGlAbstraction, mGlAbstraction.VertexAttribPointer( index, size, type, normalized, stride, ptr ) );
961 * Wrapper for OpenGL ES 3.0 glInvalidateFramebuffer()
963 void InvalidateFramebuffer(GLenum target, GLsizei numAttachments, const GLenum *attachments)
965 LOG_GL("InvalidateFramebuffer\n");
966 CHECK_GL( mGlAbstraction, mGlAbstraction.InvalidateFramebuffer(target, numAttachments, attachments) );
970 * The wrapper for OpenGL ES 2.0 glEnable() has been replaced by SetBlend, SetCullFace, SetDepthTest,
971 * SetDither, SetPolygonOffsetFill, SetSampleAlphaToCoverage, SetSampleCoverage, SetScissorTest & SetStencilTest.
975 * This method replaces glEnable(GL_BLEND) and glDisable(GL_BLEND).
976 * @param[in] enable True if GL_BLEND should be enabled.
978 void SetBlend(bool enable)
980 // Avoid unecessary calls to glEnable/glDisable
981 if (enable != mBlendEnabled)
983 mBlendEnabled = enable;
987 LOG_GL("Enable GL_BLEND\n");
988 CHECK_GL( mGlAbstraction, mGlAbstraction.Enable(GL_BLEND) );
992 LOG_GL("Disable GL_BLEND\n");
993 CHECK_GL( mGlAbstraction, mGlAbstraction.Disable(GL_BLEND) );
999 * This method replaces glEnable(GL_DEPTH_TEST) and glDisable(GL_DEPTH_TEST).
1000 * Note GL_DEPTH_TEST means enable the depth buffer for writing and or testing.
1001 * glDepthMask is used to enable / disable writing to depth buffer.
1002 * glDepthFunc us used to control if testing is enabled and how it is performed ( default GL_LESS)
1004 * @param[in] enable True if GL_DEPTH_TEST should be enabled.
1006 void EnableDepthBuffer( bool enable )
1008 // Avoid unecessary calls to glEnable/glDisable
1009 if( enable != mDepthBufferEnabled )
1011 mDepthBufferEnabled = enable;
1015 LOG_GL("Enable GL_DEPTH_TEST\n");
1016 CHECK_GL( mGlAbstraction, mGlAbstraction.Enable(GL_DEPTH_TEST) );
1020 LOG_GL("Disable GL_DEPTH_TEST\n");
1021 CHECK_GL( mGlAbstraction, mGlAbstraction.Disable(GL_DEPTH_TEST) );
1027 * This method replaces glEnable(GL_DITHER) and glDisable(GL_DITHER).
1028 * @param[in] enable True if GL_DITHER should be enabled.
1030 void SetDither(bool enable)
1032 // Avoid unecessary calls to glEnable/glDisable
1033 if (enable != mDitherEnabled)
1035 mDitherEnabled = enable;
1039 LOG_GL("Enable GL_DITHER\n");
1040 CHECK_GL( mGlAbstraction, mGlAbstraction.Enable(GL_DITHER) );
1044 LOG_GL("Disable GL_DITHER\n");
1045 CHECK_GL( mGlAbstraction, mGlAbstraction.Disable(GL_DITHER) );
1051 * This method replaces glEnable(GL_POLYGON_OFFSET_FILL) and glDisable(GL_POLYGON_OFFSET_FILL).
1052 * @param[in] enable True if GL_POLYGON_OFFSET_FILL should be enabled.
1054 void SetPolygonOffsetFill(bool enable)
1056 // Avoid unecessary calls to glEnable/glDisable
1057 if (enable != mPolygonOffsetFillEnabled)
1059 mPolygonOffsetFillEnabled = enable;
1063 LOG_GL("Enable GL_POLYGON_OFFSET_FILL\n");
1064 CHECK_GL( mGlAbstraction, mGlAbstraction.Enable(GL_POLYGON_OFFSET_FILL) );
1068 LOG_GL("Disable GL_POLYGON_OFFSET_FILL\n");
1069 CHECK_GL( mGlAbstraction, mGlAbstraction.Disable(GL_POLYGON_OFFSET_FILL) );
1075 * This method replaces glEnable(GL_SAMPLE_ALPHA_TO_COVERAGE) and glDisable(GL_SAMPLE_ALPHA_TO_COVERAGE).
1076 * @param[in] enable True if GL_SAMPLE_ALPHA_TO_COVERAGE should be enabled.
1078 void SetSampleAlphaToCoverage(bool enable)
1080 // Avoid unecessary calls to glEnable/glDisable
1081 if (enable != mSampleAlphaToCoverageEnabled)
1083 mSampleAlphaToCoverageEnabled = enable;
1087 LOG_GL("Enable GL_SAMPLE_ALPHA_TO_COVERAGE\n");
1088 CHECK_GL( mGlAbstraction, mGlAbstraction.Enable(GL_SAMPLE_ALPHA_TO_COVERAGE) );
1092 LOG_GL("Disable GL_SAMPLE_ALPHA_TO_COVERAGE\n");
1093 CHECK_GL( mGlAbstraction, mGlAbstraction.Disable(GL_SAMPLE_ALPHA_TO_COVERAGE) );
1099 * This method replaces glEnable(GL_SAMPLE_COVERAGE) and glDisable(GL_SAMPLE_COVERAGE).
1100 * @param[in] enable True if GL_SAMPLE_COVERAGE should be enabled.
1102 void SetSampleCoverage(bool enable)
1104 // Avoid unecessary calls to glEnable/glDisable
1105 if (enable != mSampleCoverageEnabled)
1107 mSampleCoverageEnabled = enable;
1111 LOG_GL("Enable GL_SAMPLE_COVERAGE\n");
1112 CHECK_GL( mGlAbstraction, mGlAbstraction.Enable(GL_SAMPLE_COVERAGE) );
1116 LOG_GL("Disable GL_SAMPLE_COVERAGE\n");
1117 CHECK_GL( mGlAbstraction, mGlAbstraction.Disable(GL_SAMPLE_COVERAGE) );
1123 * This method replaces glEnable(GL_SCISSOR_TEST) and glDisable(GL_SCISSOR_TEST).
1124 * @param[in] enable True if GL_SCISSOR_TEST should be enabled.
1126 void SetScissorTest(bool enable)
1128 // Avoid unecessary calls to glEnable/glDisable
1129 if (enable != mScissorTestEnabled)
1131 mScissorTestEnabled = enable;
1135 LOG_GL("Enable GL_SCISSOR_TEST\n");
1136 CHECK_GL( mGlAbstraction, mGlAbstraction.Enable(GL_SCISSOR_TEST) );
1140 LOG_GL("Disable GL_SCISSOR_TEST\n");
1141 CHECK_GL( mGlAbstraction, mGlAbstraction.Disable(GL_SCISSOR_TEST) );
1147 * This method replaces glEnable(GL_STENCIL_TEST) and glDisable(GL_STENCIL_TEST).
1148 * Note GL_STENCIL_TEST means enable the stencil buffer for writing and or testing.
1149 * glStencilMask is used to control how bits are written to the stencil buffer.
1150 * glStencilFunc is used to control if testing is enabled and how it is performed ( default GL_ALWAYS )
1151 * @param[in] enable True if GL_STENCIL_TEST should be enabled.
1153 void EnableStencilBuffer(bool enable)
1155 // Avoid unecessary calls to glEnable/glDisable
1156 if( enable != mStencilBufferEnabled )
1158 mStencilBufferEnabled = enable;
1162 LOG_GL("Enable GL_STENCIL_TEST\n");
1163 CHECK_GL( mGlAbstraction, mGlAbstraction.Enable(GL_STENCIL_TEST) );
1167 LOG_GL("Disable GL_STENCIL_TEST\n");
1168 CHECK_GL( mGlAbstraction, mGlAbstraction.Disable(GL_STENCIL_TEST) );
1174 * Wrapper for OpenGL ES 3.0 glEndQuery()
1176 void EndQuery(GLenum target)
1178 LOG_GL("EndQuery %d\n", target);
1179 CHECK_GL( mGlAbstraction, mGlAbstraction.EndQuery(target) );
1183 * Wrapper for OpenGL ES 3.0 glEndTransformFeedback()
1185 void EndTransformFeedback()
1187 LOG_GL("EndTransformFeedback\n");
1188 CHECK_GL( mGlAbstraction, mGlAbstraction.EndTransformFeedback() );
1192 * Wrapper for OpenGL ES 2.0 glFinish()
1197 CHECK_GL( mGlAbstraction, mGlAbstraction.Finish() );
1201 * Wrapper for OpenGL ES 2.0 glFlush()
1206 CHECK_GL( mGlAbstraction, mGlAbstraction.Flush() );
1210 * Wrapper for OpenGL ES 2.0 glFramebufferRenderbuffer()
1212 void FramebufferRenderbuffer(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer)
1214 LOG_GL("FramebufferRenderbuffer %x %x %x %d\n", target, attachment, renderbuffertarget, renderbuffer);
1215 CHECK_GL( mGlAbstraction, mGlAbstraction.FramebufferRenderbuffer(target, attachment, renderbuffertarget, renderbuffer) );
1219 * Wrapper for OpenGL ES 2.0 glFramebufferTexture2D()
1221 void FramebufferTexture2D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level)
1223 LOG_GL("FramebufferTexture2D %x %x %x %d %d\n", target, attachment, textarget, texture, level);
1224 CHECK_GL( mGlAbstraction, mGlAbstraction.FramebufferTexture2D(target, attachment, textarget, texture, level) );
1228 * Wrapper for OpenGL ES 3.0 glFramebufferTextureLayer()
1230 void FramebufferTextureLayer(GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer)
1232 LOG_GL("FramebufferTextureLayer %x %x %d %d %d\n", target, attachment, texture, level, layer);
1233 CHECK_GL( mGlAbstraction, mGlAbstraction.FramebufferTextureLayer(target, attachment, texture, level, layer) );
1237 * Wrapper for OpenGL ES 2.0 glFrontFace()
1239 void FrontFace(GLenum mode)
1241 LOG_GL("FrontFace %x\n", mode);
1242 CHECK_GL( mGlAbstraction, mGlAbstraction.FrontFace(mode) );
1246 * Wrapper for OpenGL ES 2.0 glGenBuffers()
1248 void GenBuffers(GLsizei n, GLuint* buffers)
1250 LOG_GL("GenBuffers %d\n", n, buffers);
1251 CHECK_GL( mGlAbstraction, mGlAbstraction.GenBuffers(n, buffers) );
1255 * Wrapper for OpenGL ES 2.0 glGenerateMipmap()
1257 void GenerateMipmap(GLenum target)
1259 LOG_GL("GenerateMipmap %x\n", target);
1260 CHECK_GL( mGlAbstraction, mGlAbstraction.GenerateMipmap(target) );
1264 * Wrapper for OpenGL ES 2.0 glGenFramebuffers()
1266 void GenFramebuffers(GLsizei n, GLuint* framebuffers)
1268 LOG_GL("GenFramebuffers %d %p\n", n, framebuffers);
1269 CHECK_GL( mGlAbstraction, mGlAbstraction.GenFramebuffers(n, framebuffers) );
1271 mFrameBufferStateCache.FrameBuffersCreated( n, framebuffers );
1275 * Wrapper for OpenGL ES 2.0 glGenRenderbuffers()
1277 void GenRenderbuffers(GLsizei n, GLuint* renderbuffers)
1279 LOG_GL("GenRenderbuffers %d %p\n", n, renderbuffers);
1280 CHECK_GL( mGlAbstraction, mGlAbstraction.GenRenderbuffers(n, renderbuffers) );
1284 * Wrapper for OpenGL ES 2.0 glGenTextures()
1286 void GenTextures(GLsizei n, GLuint* textures)
1288 LOG_GL("GenTextures %d %p\n", n, textures);
1289 CHECK_GL( mGlAbstraction, mGlAbstraction.GenTextures(n, textures) );
1293 * Wrapper for OpenGL ES 2.0 glGetBooleanv()
1295 void GetBooleanv(GLenum pname, GLboolean* params)
1297 LOG_GL("GetBooleanv %x\n", pname);
1298 CHECK_GL( mGlAbstraction, mGlAbstraction.GetBooleanv(pname, params) );
1302 * Wrapper for OpenGL ES 2.0 glGetBufferParameteriv()
1304 void GetBufferParameteriv(GLenum target, GLenum pname, GLint* params)
1306 LOG_GL("GetBufferParameteriv %x %x %p\n", target, pname, params);
1307 CHECK_GL( mGlAbstraction, mGlAbstraction.GetBufferParameteriv(target, pname, params) );
1311 * Wrapper for OpenGL ES 3.0 glGetBufferPointer()
1313 void GetBufferPointerv(GLenum target, GLenum pname, GLvoid** params)
1315 LOG_GL("GetBufferPointerv %x %x %p\n", target, pname, params);
1316 CHECK_GL( mGlAbstraction, mGlAbstraction.GetBufferPointerv(target, pname, params) );
1320 * Wrapper for OpenGL ES 2.0 glGetError()
1322 GLenum GetError(void)
1324 // Not worth logging here
1325 return mGlAbstraction.GetError();
1329 * Wrapper for OpenGL ES 2.0 glGetFloatv()
1331 void GetFloatv(GLenum pname, GLfloat* params)
1333 LOG_GL("GetFloatv %x\n", pname);
1334 CHECK_GL( mGlAbstraction, mGlAbstraction.GetFloatv(pname, params) );
1338 * Wrapper for OpenGL ES 2.0 glGetFramebufferAttachmentParameteriv()
1340 void GetFramebufferAttachmentParameteriv(GLenum target, GLenum attachment, GLenum pname, GLint* params)
1342 LOG_GL("GetFramebufferAttachmentParameteriv %x %x %x\n", target, attachment, pname);
1343 CHECK_GL( mGlAbstraction, mGlAbstraction.GetFramebufferAttachmentParameteriv(target, attachment, pname, params) );
1347 * Wrapper for OpenGL ES 2.0 glGetIntegerv()
1349 void GetIntegerv(GLenum pname, GLint* params)
1351 LOG_GL("GetIntegerv %x\n", pname);
1352 CHECK_GL( mGlAbstraction, mGlAbstraction.GetIntegerv(pname, params) );
1356 * Wrapper for OpenGL ES 3.0 glGetQueryiv()
1358 void GetQueryiv(GLenum target, GLenum pname, GLint* params)
1360 LOG_GL("GetQueryiv %x %x\n", target, pname);
1361 CHECK_GL( mGlAbstraction, mGlAbstraction.GetQueryiv(target, pname, params) );
1365 * Wrapper for OpenGL ES 3.0 glGetQueryObjectuiv()
1367 void GetQueryObjectuiv(GLuint id, GLenum pname, GLuint* params)
1369 LOG_GL("GetQueryObjectuiv %u %x %p\n", id, pname, params);
1370 CHECK_GL( mGlAbstraction, mGlAbstraction.GetQueryObjectuiv(id, pname, params) );
1374 * Wrapper for OpenGL ES 2.0 glGetRenderbufferParameteriv()
1376 void GetRenderbufferParameteriv(GLenum target, GLenum pname, GLint* params)
1378 LOG_GL("GetRenderbufferParameteriv %x %x\n", target, pname);
1379 CHECK_GL( mGlAbstraction, mGlAbstraction.GetRenderbufferParameteriv(target, pname, params) );
1383 * Wrapper for OpenGL ES 2.0 glGetString()
1385 const GLubyte* GetString(GLenum name)
1387 LOG_GL("GetString %x\n", name);
1388 const GLubyte* str = CHECK_GL( mGlAbstraction, mGlAbstraction.GetString(name) );
1393 * Wrapper for OpenGL ES 2.0 glGetTexParameterfv()
1395 void GetTexParameterfv(GLenum target, GLenum pname, GLfloat* params)
1397 LOG_GL("GetTexParameterfv %x %x\n", target, pname);
1398 CHECK_GL( mGlAbstraction, mGlAbstraction.GetTexParameterfv(target, pname, params) );
1402 * Wrapper for OpenGL ES 2.0 glGetTexParameteriv()
1404 void GetTexParameteriv(GLenum target, GLenum pname, GLint* params)
1406 LOG_GL("GetTexParameteriv %x %x\n", target, pname);
1407 CHECK_GL( mGlAbstraction, mGlAbstraction.GetTexParameteriv(target, pname, params) );
1411 * Wrapper for OpenGL ES 2.0 glHint()
1413 void Hint(GLenum target, GLenum mode)
1415 LOG_GL("Hint %x %x\n", target, mode);
1416 CHECK_GL( mGlAbstraction, mGlAbstraction.Hint(target, mode) );
1420 * Wrapper for OpenGL ES 2.0 glIsBuffer()
1422 GLboolean IsBuffer(GLuint buffer)
1424 LOG_GL("IsBuffer %d\n", buffer);
1425 GLboolean val = CHECK_GL( mGlAbstraction, mGlAbstraction.IsBuffer(buffer) );
1430 * Wrapper for OpenGL ES 2.0 glIsEnabled()
1432 GLboolean IsEnabled(GLenum cap)
1434 LOG_GL("IsEnabled %x\n", cap);
1435 GLboolean val = CHECK_GL( mGlAbstraction, mGlAbstraction.IsEnabled(cap) );
1440 * Wrapper for OpenGL ES 2.0 glIsFramebuffer()
1442 GLboolean IsFramebuffer(GLuint framebuffer)
1444 LOG_GL("IsFramebuffer %d\n", framebuffer);
1445 GLboolean val = CHECK_GL( mGlAbstraction, mGlAbstraction.IsFramebuffer(framebuffer) );
1450 * Wrapper for OpenGL ES 3.0 glIsQuery()
1452 GLboolean IsQuery(GLuint id)
1454 LOG_GL("IsQuery %u\n", id);
1455 GLboolean val = CHECK_GL( mGlAbstraction, mGlAbstraction.IsQuery(id) );
1460 * Wrapper for OpenGL ES 2.0 glIsRenderbuffer()
1462 GLboolean IsRenderbuffer(GLuint renderbuffer)
1464 LOG_GL("IsRenderbuffer %d\n", renderbuffer);
1465 GLboolean val = CHECK_GL( mGlAbstraction, mGlAbstraction.IsRenderbuffer(renderbuffer) );
1470 * Wrapper for OpenGL ES 2.0 glIsTexture()
1472 GLboolean IsTexture(GLuint texture)
1474 LOG_GL("IsTexture %d\n", texture);
1475 GLboolean val = CHECK_GL( mGlAbstraction, mGlAbstraction.IsTexture(texture) );
1480 * Wrapper for OpenGL ES 3.0 glIsTransformFeedback()
1482 GLboolean IsTransformFeedback(GLuint id)
1484 LOG_GL("IsTransformFeedback %u\n", id);
1485 GLboolean val = CHECK_GL( mGlAbstraction, mGlAbstraction.IsTransformFeedback(id) );
1490 * Wrapper for OpenGL ES 2.0 glLineWidth()
1492 void LineWidth(GLfloat width)
1494 LOG_GL("LineWidth %f\n", width);
1495 CHECK_GL( mGlAbstraction, mGlAbstraction.LineWidth(width) );
1499 * Wrapper for OpenGL ES 3.0 glPauseTransformFeedback()
1501 void PauseTransformFeedback()
1503 LOG_GL("PauseTransformFeedback\n");
1504 CHECK_GL( mGlAbstraction, mGlAbstraction.PauseTransformFeedback() );
1508 * Wrapper for OpenGL ES 2.0 glPixelStorei()
1510 void PixelStorei(GLenum pname, GLint param)
1512 LOG_GL("PixelStorei %x %d\n", pname, param);
1513 CHECK_GL( mGlAbstraction, mGlAbstraction.PixelStorei(pname, param) );
1517 * Wrapper for OpenGL ES 2.0 glPolygonOffset()
1519 void PolygonOffset(GLfloat factor, GLfloat units)
1521 LOG_GL("PolygonOffset %f %f\n", factor, units);
1522 CHECK_GL( mGlAbstraction, mGlAbstraction.PolygonOffset(factor, units) );
1526 * Wrapper for OpenGL ES 2.0 glReadPixels()
1528 void ReadPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, void* pixels)
1530 LOG_GL("ReadPixels %d %d %d %d %x %x\n", x, y, width, height, format, type);
1531 CHECK_GL( mGlAbstraction, mGlAbstraction.ReadPixels(x, y, width, height, format, type, pixels) );
1535 * Wrapper for OpenGL ES 2.0 glRenderbufferStorage()
1537 void RenderbufferStorage(GLenum target, GLenum internalformat, GLsizei width, GLsizei height)
1539 LOG_GL("RenderbufferStorage %x %x %d %d\n", target, internalformat, width, height);
1540 CHECK_GL( mGlAbstraction, mGlAbstraction.RenderbufferStorage(target, internalformat, width, height) );
1544 * Wrapper for OpenGL ES 3.0 glRenderbufferStorageMultisample()
1546 void RenderbufferStorageMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height)
1548 LOG_GL("RenderbufferStorageMultisample %x %u %x %d %d\n", target, samples, internalformat, width, height);
1549 CHECK_GL( mGlAbstraction, mGlAbstraction.RenderbufferStorageMultisample(target, samples, internalformat, width, height) );
1553 * Wrapper for OpenGL ES 3.0 glResumeTransformFeedback()
1555 void ResumeTransformFeedback()
1557 LOG_GL("ResumeTransformFeedback\n");
1558 CHECK_GL( mGlAbstraction, mGlAbstraction.ResumeTransformFeedback() );
1562 * Wrapper for OpenGL ES 2.0 glSampleCoverage()
1564 void SampleCoverage(GLclampf value, GLboolean invert)
1566 LOG_GL("SampleCoverage %f %s\n", value, invert ? "True" : "False");
1567 CHECK_GL( mGlAbstraction, mGlAbstraction.SampleCoverage(value, invert) );
1571 * Wrapper for OpenGL ES 2.0 glScissor()
1573 void Scissor(GLint x, GLint y, GLsizei width, GLsizei height)
1575 LOG_GL("Scissor %d %d %d %d\n", x, y, width, height);
1576 CHECK_GL( mGlAbstraction, mGlAbstraction.Scissor(x, y, width, height) );
1580 * Wrapper for OpenGL ES 2.0 glStencilFunc()
1582 void StencilFunc(GLenum func, GLint ref, GLuint mask)
1584 if( ( func != mStencilFunc ) || ( ref != mStencilFuncRef ) || ( mask != mStencilFuncMask ) )
1586 mStencilFunc = func;
1587 mStencilFuncRef = ref;
1588 mStencilFuncMask = mask;
1590 LOG_GL("StencilFunc %x %d %d\n", func, ref, mask);
1591 CHECK_GL( mGlAbstraction, mGlAbstraction.StencilFunc(func, ref, mask) );
1596 * Wrapper for OpenGL ES 2.0 glStencilFuncSeparate()
1598 void StencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask)
1600 LOG_GL("StencilFuncSeparate %x %x %d %d\n", face, func, ref, mask);
1601 CHECK_GL( mGlAbstraction, mGlAbstraction.StencilFuncSeparate(face, func, ref, mask) );
1605 * Wrapper for OpenGL ES 2.0 glStencilMask()
1607 void StencilMask(GLuint mask)
1609 if( mask != mStencilMask )
1611 mStencilMask = mask;
1613 LOG_GL("StencilMask %d\n", mask);
1614 CHECK_GL( mGlAbstraction, mGlAbstraction.StencilMask(mask) );
1619 * Wrapper for OpenGL ES 2.0 glStencilMaskSeparate()
1621 void StencilMaskSeparate(GLenum face, GLuint mask)
1623 LOG_GL("StencilMaskSeparate %x %d\n", face, mask);
1624 CHECK_GL( mGlAbstraction, mGlAbstraction.StencilMaskSeparate(face, mask) );
1628 * Wrapper for OpenGL ES 2.0 glStencilOp()
1630 void StencilOp(GLenum fail, GLenum zfail, GLenum zpass)
1632 if( ( fail != mStencilOpFail ) || ( zfail != mStencilOpDepthFail ) || ( zpass != mStencilOpDepthPass ) )
1634 mStencilOpFail = fail;
1635 mStencilOpDepthFail = zfail;
1636 mStencilOpDepthPass = zpass;
1638 LOG_GL("StencilOp %x %x %x\n", fail, zfail, zpass);
1639 CHECK_GL( mGlAbstraction, mGlAbstraction.StencilOp(fail, zfail, zpass) );
1644 * Wrapper for OpenGL ES 2.0 glStencilOpSeparate()
1646 void StencilOpSeparate(GLenum face, GLenum fail, GLenum zfail, GLenum zpass)
1648 LOG_GL("StencilOpSeparate %x %x %x %x\n", face, fail, zfail, zpass);
1649 CHECK_GL( mGlAbstraction, mGlAbstraction.StencilOpSeparate(face, fail, zfail, zpass) );
1653 * Wrapper for OpenGL ES 2.0 glTexImage2D()
1655 void TexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height,
1656 GLint border, GLenum format, GLenum type, const void* pixels)
1658 LOG_GL("TexImage2D %x %d %d %dx%d %d %x %x %p\n", target, level, internalformat, width, height, border, format, type, pixels);
1659 CHECK_GL( mGlAbstraction, mGlAbstraction.TexImage2D(target, level, internalformat, width, height, border, format, type, pixels) );
1663 * Wrapper for OpenGL ES 3.0 glTexImage3D()
1665 void TexImage3D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth,
1666 GLint border, GLenum format, GLenum type, const void* pixels)
1668 LOG_GL("TexImage3D %x %d %d %dx%dx%d %d %x %x %p\n", target, level, internalformat, width, height, depth, border, format, type, pixels);
1669 CHECK_GL( mGlAbstraction, mGlAbstraction.TexImage3D(target, level, internalformat, width, height, depth, border, format, type, pixels) );
1673 * Wrapper for OpenGL ES 2.0 glTexParameterf()
1675 void TexParameterf(GLenum target, GLenum pname, GLfloat param)
1677 LOG_GL("TexParameterf %x %x %f\n", target, pname, param);
1678 CHECK_GL( mGlAbstraction, mGlAbstraction.TexParameterf(target, pname, param) );
1682 * Wrapper for OpenGL ES 2.0 glTexParameterfv()
1684 void TexParameterfv(GLenum target, GLenum pname, const GLfloat* params)
1686 LOG_GL("TexParameterfv %x %x\n", target, pname);
1687 CHECK_GL( mGlAbstraction, mGlAbstraction.TexParameterfv(target, pname, params) );
1691 * Wrapper for OpenGL ES 2.0 glTexParameteri()
1693 void TexParameteri(GLenum target, GLenum pname, GLint param)
1695 LOG_GL("TexParameteri %x %x %d\n", target, pname, param);
1696 CHECK_GL( mGlAbstraction, mGlAbstraction.TexParameteri(target, pname, param) );
1700 * Wrapper for OpenGL ES 2.0 glTexParameteriv()
1702 void TexParameteriv(GLenum target, GLenum pname, const GLint* params)
1704 LOG_GL("TexParameteriv %x %x\n", target, pname);
1705 CHECK_GL( mGlAbstraction, mGlAbstraction.TexParameteriv(target, pname, params) );
1709 * Wrapper for OpenGL ES 2.0 glTexSubImage2D()
1711 void TexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height,
1712 GLenum format, GLenum type, const void* pixels)
1714 LOG_GL("TexSubImage2D %x %d %d %d %d %d %x %x %p\n", target, level, xoffset, yoffset, width, height, format, type, pixels);
1715 CHECK_GL( mGlAbstraction, mGlAbstraction.TexSubImage2D(target, level, xoffset, yoffset, width, height, format, type, pixels) );
1719 * Wrapper for OpenGL ES 3.0 glTexSubImage3D()
1721 void TexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset,
1722 GLsizei width, GLsizei height, GLsizei depth,
1723 GLenum format, GLenum type, const void* pixels)
1725 LOG_GL("TexSubImage3D %x %d %d %d %d %d %d %d %x %x %p\n", target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels);
1726 CHECK_GL( mGlAbstraction, mGlAbstraction.TexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels) );
1730 * Wrapper for OpenGL ES 3.0 glUnmapBubffer()
1732 GLboolean UnmapBuffer(GLenum target)
1734 LOG_GL("UnmapBuffer %x \n", target);
1735 GLboolean val = CHECK_GL( mGlAbstraction, mGlAbstraction.UnmapBuffer(target) );
1739 * Wrapper for OpenGL ES 2.0 glViewport()
1741 void Viewport(GLint x, GLint y, GLsizei width, GLsizei height)
1743 // check if its same as already set
1744 Rect<int> newViewport( x, y, width, height );
1746 // Temporarily disable the viewport caching, as the implementation of GLES driver in Tizen platform
1747 // share a global viewport between multiple contexts, therefore glViewport has to be called every
1748 // time after glBindFramebuffer regardless of the same vewport size in the same context.
1749 // if( mViewPort != newViewport )
1752 LOG_GL("Viewport %d %d %d %d\n", x, y, width, height);
1753 CHECK_GL( mGlAbstraction, mGlAbstraction.Viewport(x, y, width, height) );
1754 mViewPort = newViewport; // remember new one
1759 * Get the implementation defined MAX_TEXTURE_SIZE. This values is cached when the context is created
1760 * @return The implementation defined MAX_TEXTURE_SIZE
1762 GLint CachedMaxTextureSize() const
1764 return mMaxTextureSize;
1768 * Get the current viewport.
1769 * @return Viewport rectangle.
1771 const Rect< int >& GetViewport();
1773 private: // Implementation
1776 * @return true if next draw operation will write to depth buffer
1778 bool DepthBufferWriteEnabled() const
1780 return mDepthBufferEnabled && mDepthMaskEnabled;
1784 * @return true if next draw operation will write to stencil buffer
1786 bool StencilBufferWriteEnabled() const
1788 return mStencilBufferEnabled && ( mStencilMask > 0 );
1792 * Flushes vertex attribute location changes to the driver
1794 void FlushVertexAttributeLocations();
1797 * Either enables or disables a vertex attribute location in the cache
1798 * The cahnges won't take affect until FlushVertexAttributeLocations is called
1799 * @param location attribute location
1800 * @param state attribute state
1802 void SetVertexAttributeLocation(unsigned int location, bool state);
1805 * Sets the initial GL state.
1807 void InitializeGlState();
1811 Integration::GlAbstraction& mGlAbstraction;
1813 bool mGlContextCreated; ///< True if the OpenGL context has been created
1815 // glEnable/glDisable states
1817 GLuint mStencilMask;
1819 bool mDepthBufferEnabled;
1820 bool mDepthMaskEnabled;
1821 bool mDitherEnabled;
1822 bool mPolygonOffsetFillEnabled;
1823 bool mSampleAlphaToCoverageEnabled;
1824 bool mSampleCoverageEnabled;
1825 bool mScissorTestEnabled;
1826 bool mStencilBufferEnabled;
1827 bool mClearColorSet;
1828 bool mUsingDefaultBlendColor;
1830 // glBindBuffer() state
1831 GLuint mBoundArrayBufferId; ///< The ID passed to glBindBuffer(GL_ARRAY_BUFFER)
1832 GLuint mBoundElementArrayBufferId; ///< The ID passed to glBindBuffer(GL_ELEMENT_ARRAY_BUFFER)
1833 GLuint mBoundTransformFeedbackBufferId; ///< The ID passed to glBindBuffer(GL_TRANSFORM_FEEDBACK_BUFFER)
1835 // glBindTexture() state
1836 TextureUnit mActiveTextureUnit;
1837 GLuint mBoundTextureId[ MAX_TEXTURE_UNITS ][MAX_TEXTURE_TARGET]; ///< The ID passed to glBindTexture()
1839 // glBlendColor() state
1840 Vector4 mBlendColor; ///< Blend color
1842 // glBlendFuncSeparate() state
1843 GLenum mBlendFuncSeparateSrcRGB; ///< The srcRGB parameter passed to glBlendFuncSeparate()
1844 GLenum mBlendFuncSeparateDstRGB; ///< The dstRGB parameter passed to glBlendFuncSeparate()
1845 GLenum mBlendFuncSeparateSrcAlpha; ///< The srcAlpha parameter passed to glBlendFuncSeparate()
1846 GLenum mBlendFuncSeparateDstAlpha; ///< The dstAlpha parameter passed to glBlendFuncSeparate()
1848 // glBlendEquationSeparate state
1849 GLenum mBlendEquationSeparateModeRGB; ///< Controls RGB blend mode
1850 GLenum mBlendEquationSeparateModeAlpha; ///< Controls Alpha blend mode
1852 // glStencilFunc() and glStencilOp() state.
1853 GLenum mStencilFunc;
1854 GLint mStencilFuncRef;
1855 GLuint mStencilFuncMask;
1856 GLenum mStencilOpFail;
1857 GLenum mStencilOpDepthFail;
1858 GLenum mStencilOpDepthPass;
1860 GLenum mDepthFunction; ///The depth function
1862 GLint mMaxTextureSize; ///< return value from GetIntegerv(GL_MAX_TEXTURE_SIZE)
1863 Vector4 mClearColor; ///< clear color
1865 // Face culling mode
1866 Dali::FaceCullingMode::Type mCullFaceMode;
1868 // cached viewport size
1869 Rect< int > mViewPort;
1871 // Vertex Attribute Buffer enable caching
1872 bool mVertexAttributeCachedState[ MAX_ATTRIBUTE_CACHE_SIZE ]; ///< Value cache for Enable Vertex Attribute
1873 bool mVertexAttributeCurrentState[ MAX_ATTRIBUTE_CACHE_SIZE ]; ///< Current state on the driver for Enable Vertex Attribute
1875 FrameBufferStateCache mFrameBufferStateCache; ///< frame buffer state cache
1877 OwnerContainer< Context* >* mSceneContexts; ///< The pointer of the container of contexts for surface rendering
1880 } // namespace Internal
1884 #endif // DALI_INTERNAL_CONTEXT_H