1 #ifndef __DALI_INTERNAL_CONTEXT_H__
2 #define __DALI_INTERNAL_CONTEXT_H__
5 * Copyright (c) 2014 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/actors/renderable-actor.h>
23 #include <dali/public-api/common/dali-vector.h>
24 #include <dali/public-api/common/dali-common.h>
25 #include <dali/public-api/math/rect.h>
26 #include <dali/public-api/math/vector4.h>
27 #include <dali/integration-api/debug.h>
28 #include <dali/integration-api/gl-abstraction.h>
29 #include <dali/integration-api/gl-defines.h>
30 #include <dali/internal/render/common/performance-monitor.h>
31 #include <dali/internal/render/gl-resources/texture-units.h>
32 #include <dali/internal/render/gl-resources/frame-buffer-state-cache.h>
33 #include <dali/internal/render/gl-resources/gl-call-debug.h>
42 * Context records the current GL state, and provides access to the OpenGL ES 2.0 API.
43 * Context avoids duplicate GL calls, if the same setting etc. is requested repeatedly.
50 * FrameBuffer Clear mode
54 FORCE_CLEAR, ///< always perform the glClear regardless of current state
55 CHECK_CACHED_VALUES ///< check the Frame buffers cached state to see if a clear is required
59 * Size of the VertexAttributeArray enables
60 * GLES specification states that there's minimum of 8
62 static const unsigned int MAX_ATTRIBUTE_CACHE_SIZE = 8;
64 static const unsigned int MAX_TEXTURE_UNITS = 8; // for GLES 2.0 8 is guaranteed, which is more than DALi uses anyways
67 * Creates the Dali Context object.
68 * This method does not create an OpenGL context i.e. that is done from outside dali-core.
69 * @pre Context has not been created.
70 * @exception Context already created.
71 * @param glAbstraction the gl abstraction.
73 Context( Integration::GlAbstraction& glAbstraction );
81 * Called when the GL context has been created.
83 void GlContextCreated();
86 * Called when the GL context has been destroyed.
88 void GlContextDestroyed();
91 * Query whether the OpenGL context has been created.
92 * @return True if the OpenGL context has been created.
94 bool IsGlContextCreated() { return mGlContextCreated; }
97 * @return the GLAbstraction
99 Integration::GlAbstraction& GetAbstraction() { return mGlAbstraction; }
104 * Debug helper which prints the currently cached GL state.
106 void PrintCurrentState();
111 * Helper to convert GL error code to string
112 * @param errorCode to convert
115 const char* ErrorToString( GLenum errorCode );
118 * Helper to print GL string to debug log
120 void PrintGlString(const char* stringName, GLenum stringId)
122 DALI_LOG_INFO(Debug::Filter::gRender, Debug::General, "GL %s = %s\n", stringName, (const char *)GetString( stringId ) );
125 /****************************************************************************************
126 * The following methods are forwarded to Dali::Integration::GlAbstraction.
127 * In some cases the GL state is recorded, to avoid duplicate calls with the same state.
128 * All Shader, Program, Uniform and Attribute related calls are not here, Program class
129 * handles them and optimizes any program related state changes
130 ****************************************************************************************/
133 * Wrapper for OpenGL ES 2.0 glActiveTexture()
135 void ActiveTexture( TextureUnit textureUnit )
137 if ( textureUnit != mActiveTextureUnit )
139 mActiveTextureUnit = textureUnit;
140 LOG_GL("ActiveTexture %x\n", textureUnit);
141 CHECK_GL( mGlAbstraction, mGlAbstraction.ActiveTexture(TextureUnitAsGLenum(textureUnit)) );
146 * Wrapper for OpenGL ES 3.0 glBeginQuery()
148 void BeginQuery(GLenum target, GLuint id)
150 LOG_GL("BeginQuery %d %d\n", target, id);
151 CHECK_GL( mGlAbstraction, mGlAbstraction.BeginQuery(target, id) );
155 * Wrapper for OpenGL ES 3.0 glBeginTransformFeedback()
157 void BeginTransformFeedback(GLenum primitiveMode)
159 LOG_GL("BeginTransformFeedback %x\n", primitiveMode);
160 CHECK_GL( mGlAbstraction, mGlAbstraction.BeginTransformFeedback(primitiveMode) );
164 * The wrapper for OpenGL ES 2.0 glBindBuffer() has been replaced by BindArrayBuffer & BindElementArrayBuffer & BindTransformFeedbackBuffer.
168 * Wrapper for OpenGL ES 2.0 glBindBuffer(GL_ARRAY_BUFFER, ...)
170 void BindArrayBuffer(GLuint buffer)
172 // Avoid unecessary calls to BindBuffer
173 if (mBoundArrayBufferId != buffer)
175 mBoundArrayBufferId = buffer;
177 LOG_GL("BindBuffer GL_ARRAY_BUFFER %d\n", buffer);
178 CHECK_GL( mGlAbstraction, mGlAbstraction.BindBuffer(GL_ARRAY_BUFFER, buffer) );
183 * Wrapper for OpenGL ES 2.0 glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ...)
185 void BindElementArrayBuffer(GLuint buffer)
187 // Avoid unecessary calls to BindBuffer
188 if (mBoundElementArrayBufferId!= buffer)
190 mBoundElementArrayBufferId = buffer;
192 LOG_GL("BindBuffer GL_ELEMENT_ARRAY_BUFFER %d\n", buffer);
193 CHECK_GL( mGlAbstraction, mGlAbstraction.BindBuffer(GL_ELEMENT_ARRAY_BUFFER, buffer) );
198 * Wrapper for OpenGL ES 3.0 glBindBuffer(GL_TRANSFORM_FEEDBACK_BUFFER, ...)
200 void BindTransformFeedbackBuffer(GLuint buffer)
202 // Avoid unecessary calls to BindBuffer
203 if (mBoundTransformFeedbackBufferId != buffer)
205 mBoundTransformFeedbackBufferId = buffer;
207 LOG_GL("BindBuffer GL_TRANSFORM_FEEDBACK_BUFFER %d\n", buffer);
208 CHECK_GL( mGlAbstraction, mGlAbstraction.BindBuffer(GL_TRANSFORM_FEEDBACK_BUFFER , buffer) );
213 * Wrapper for OpenGL ES 3.0 glBindBufferBase(GL_TRANSFORM_FEEDBACK_BUFFER, ...)
215 void BindTransformFeedbackBufferBase(GLuint index, GLuint buffer)
217 // Avoid unecessary calls to BindBufferBase
218 if (mBoundTransformFeedbackBufferId != buffer)
220 mBoundTransformFeedbackBufferId = buffer;
222 LOG_GL("BindBufferBase GL_TRANSFORM_FEEDBACK_BUFFER %d %d\n", index, buffer);
223 CHECK_GL( mGlAbstraction, mGlAbstraction.BindBufferBase(GL_TRANSFORM_FEEDBACK_BUFFER, index, buffer) );
228 * Wrapper for OpenGL ES 2.0 glBindFramebuffer()
230 void BindFramebuffer(GLenum target, GLuint framebuffer)
232 mFrameBufferStateCache.SetCurrentFrameBuffer( framebuffer );
234 LOG_GL("BindFramebuffer %d %d\n", target, framebuffer);
235 CHECK_GL( mGlAbstraction, mGlAbstraction.BindFramebuffer(target, framebuffer) );
239 * Wrapper for OpenGL ES 2.0 glBindRenderbuffer()
241 void BindRenderbuffer(GLenum target, GLuint renderbuffer)
243 LOG_GL("BindRenderbuffer %d %d\n", target, renderbuffer);
244 CHECK_GL( mGlAbstraction, mGlAbstraction.BindRenderbuffer(target, renderbuffer) );
248 * Wrapper for OpenGL ES 3.0 glBindTransformFeedback()
250 void BindTransformFeedback(GLenum target, GLuint id)
252 LOG_GL("BindTransformFeedback %d %d\n", target, id);
253 CHECK_GL( mGlAbstraction, mGlAbstraction.BindTransformFeedback(target, id) );
257 * Helper to bind texture for rendering. If given texture is
258 * already bound in the given textureunit, this method does nothing.
259 * Otherwise changes the active texture unit and binds the texture.
260 * Note! after this call active texture unit may not necessarily be the one
261 * passed in as argument so you cannot change texture unit state!!
262 * @param textureunit to bind to
263 * @param texture to bind
265 void BindTextureForUnit( TextureUnit textureunit, GLuint texture )
267 if( mBound2dTextureId[ textureunit ] != texture )
269 ActiveTexture( textureunit );
270 Bind2dTexture( texture );
275 * Wrapper for OpenGL ES 2.0 glBindTexture(GL_TEXTURE_2D)
277 void Bind2dTexture( GLuint texture )
279 if (mBound2dTextureId[ mActiveTextureUnit ] != texture)
281 mBound2dTextureId[ mActiveTextureUnit ] = texture;
283 LOG_GL("BindTexture GL_TEXTURE_2D %d\n", texture);
284 CHECK_GL( mGlAbstraction, mGlAbstraction.BindTexture(GL_TEXTURE_2D, texture) );
286 INCREASE_COUNTER(PerformanceMonitor::TEXTURE_STATE_CHANGES);
291 * Wrapper for OpenGL ES 2.0 glBlendColor()
293 void SetDefaultBlendColor()
295 if( !mUsingDefaultBlendColor )
297 LOG_GL( "BlendColor %f %f %f %f\n", 0.0f, 0.0f, 0.0f, 0.0f );
298 CHECK_GL( mGlAbstraction, mGlAbstraction.BlendColor( 0.0f, 0.0f, 0.0f, 0.0f ) );
299 mUsingDefaultBlendColor = true;
304 * Wrapper for OpenGL ES 2.0 glBlendColor()
306 void SetCustomBlendColor( const Vector4& color )
308 LOG_GL( "BlendColor %f %f %f %f\n", color.r, color.g, color.b, color.a );
309 CHECK_GL( mGlAbstraction, mGlAbstraction.BlendColor(color.r, color.g, color.b, color.a) );
310 mUsingDefaultBlendColor = false;
314 * Wrapper for OpenGL ES 2.0 glBlendEquation()
316 void BlendEquation(GLenum mode)
318 // use BlendEquationSeparate to set the rgb and alpha modes the same
319 BlendEquationSeparate( mode, mode );
323 * Wrapper for OpenGL ES 2.0 glBlendEquationSeparate()
325 void BlendEquationSeparate(GLenum modeRGB, GLenum modeAlpha)
327 if( ( modeRGB != mBlendEquationSeparateModeRGB ) ||
328 ( modeAlpha != mBlendEquationSeparateModeAlpha ) )
330 mBlendEquationSeparateModeRGB = modeRGB;
331 mBlendEquationSeparateModeAlpha = modeAlpha;
332 LOG_GL("BlendEquationSeparate %d %d\n", modeRGB, modeAlpha);
333 CHECK_GL( mGlAbstraction, mGlAbstraction.BlendEquationSeparate(modeRGB, modeAlpha) );
338 * Wrapper for OpenGL ES 2.0 glBlendFunc()
340 void BlendFunc(GLenum sfactor, GLenum dfactor)
342 // reuse the BlendFuncSeparate as thats what the DDK does anyways
343 BlendFuncSeparate( sfactor, dfactor, sfactor, dfactor );
347 * Wrapper for OpenGL ES 2.0 glBlendFuncSeparate()
349 void BlendFuncSeparate( GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha )
351 if( ( mBlendFuncSeparateSrcRGB != srcRGB )||( mBlendFuncSeparateDstRGB != dstRGB )||
352 ( mBlendFuncSeparateSrcAlpha != srcAlpha )||( mBlendFuncSeparateDstAlpha != dstAlpha ) )
354 mBlendFuncSeparateSrcRGB = srcRGB;
355 mBlendFuncSeparateDstRGB = dstRGB;
356 mBlendFuncSeparateSrcAlpha = srcAlpha;
357 mBlendFuncSeparateDstAlpha = dstAlpha;
359 LOG_GL( "BlendFuncSeparate %d %d %d %d\n", srcRGB, dstRGB, srcAlpha, dstAlpha );
360 CHECK_GL( mGlAbstraction, mGlAbstraction.BlendFuncSeparate( srcRGB, dstRGB, srcAlpha, dstAlpha ) );
365 * Wrapper for OpenGL ES 3.0 glBlitFramebuffer()
367 void BlitFramebuffer(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter)
369 LOG_GL( "BlitFramebuffer %d %d %d %d %d %d %d %d %x %d\n", srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter );
370 CHECK_GL( mGlAbstraction, mGlAbstraction.BlitFramebuffer( srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter ) );
374 * Wrapper for OpenGL ES 2.0 glBufferData()
376 void BufferData(GLenum target, GLsizeiptr size, const void* data, GLenum usage)
378 LOG_GL("BufferData %d %d %p %d\n", target, size, data, usage);
379 CHECK_GL( mGlAbstraction, mGlAbstraction.BufferData(target, size, data, usage) );
383 * Wrapper for OpenGL ES 2.0 glBufferSubData()
385 void BufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, const void* data)
387 LOG_GL("BufferSubData %d %d %d %p\n", target, offset, size, data);
388 CHECK_GL( mGlAbstraction, mGlAbstraction.BufferSubData(target, offset, size, data) );
392 * Wrapper for OpenGL ES 2.0 glCheckFramebufferStatus()
394 GLenum CheckFramebufferStatus(GLenum target)
396 LOG_GL("CheckFramebufferStatus %d\n", target);
397 GLenum value = CHECK_GL( mGlAbstraction, mGlAbstraction.CheckFramebufferStatus(target) );
402 * Wrapper for OpenGL ES 2.0 glClear()
404 void Clear(GLbitfield mask, ClearMode mode )
406 bool forceClear = (mode == FORCE_CLEAR );
407 mask = mFrameBufferStateCache.GetClearMask( mask, forceClear , mScissorTestEnabled );
411 LOG_GL("Clear %d\n", mask);
412 CHECK_GL( mGlAbstraction, mGlAbstraction.Clear( mask ) );
417 * Wrapper for OpenGL ES 2.0 glClearColor()
419 void ClearColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha)
421 Vector4 newCol(red,green,blue,alpha);
423 if (!mClearColorSet || mClearColor !=newCol )
425 LOG_GL("ClearColor %f %f %f %f\n", red, green, blue, alpha);
426 CHECK_GL( mGlAbstraction, mGlAbstraction.ClearColor(red, green, blue, alpha) );
428 mClearColorSet = true;
429 mClearColor = newCol;
434 * Wrapper for OpenGL ES 2.0 glClearDepthf()
436 void ClearDepthf(GLclampf depth)
438 LOG_GL("ClearDepthf %f\n", depth);
439 CHECK_GL( mGlAbstraction, mGlAbstraction.ClearDepthf(depth) );
443 * Wrapper for OpenGL ES 2.0 glClearStencil()
445 void ClearStencil(GLint s)
447 LOG_GL("ClearStencil %d\n", s);
448 CHECK_GL( mGlAbstraction, mGlAbstraction.ClearStencil(s) );
452 * Wrapper for OpenGL ES 2.0 glColorMask()
453 * @note This has been optimized to a single boolean value (masking individual channels is not required)
455 void ColorMask( bool flag )
457 // only change state if needed
458 if( flag != mColorMask )
461 LOG_GL("ColorMask %s %s %s %s\n", flag ? "True" : "False", flag ? "True" : "False", flag ? "True" : "False", flag ? "True" : "False");
462 CHECK_GL( mGlAbstraction, mGlAbstraction.ColorMask(flag, flag, flag, flag) );
467 * Wrapper for OpenGL ES 2.0 glCompressedTexImage2D()
469 void CompressedTexImage2D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height,
470 GLint border, GLsizei imageSize, const void* data)
472 LOG_GL("CompressedTexImage2D %d %d %x %d %d %d %d %p\n", target, level, internalformat, width, height, border, imageSize, data);
473 CHECK_GL( mGlAbstraction, mGlAbstraction.CompressedTexImage2D(target, level, internalformat, width, height, border, imageSize, data) );
477 * Wrapper for OpenGL ES 3.0 glCompressedTexImage3D()
479 void CompressedTexImage3D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth,
480 GLint border, GLsizei imageSize, const void* data)
482 LOG_GL("CompressedTexImage3D %d %d %x %d %d %d %d %d %p\n", target, level, internalformat, width, height, depth, border, imageSize, data);
483 CHECK_GL( mGlAbstraction, mGlAbstraction.CompressedTexImage3D(target, level, internalformat, width, height, depth, border, imageSize, data) );
487 * Wrapper for OpenGL ES 2.0 glCompressedTexSubImage2D()
489 void CompressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height,
490 GLenum format, GLsizei imageSize, const void* data)
492 LOG_GL("CompressedTexSubImage2D %x %d %d %d %d %d %x %d %p\n", target, level, xoffset, yoffset, width, height, format, imageSize, data);
493 CHECK_GL( mGlAbstraction, mGlAbstraction.CompressedTexSubImage2D(target, level, xoffset, yoffset, width, height, format, imageSize, data) );
497 * Wrapper for OpenGL ES 3.0 glCompressedTexSubImage3D()
499 void CompressedTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset,
500 GLsizei width, GLsizei height, GLsizei depth,
501 GLenum format, GLsizei imageSize, const void* data)
503 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);
504 CHECK_GL( mGlAbstraction, mGlAbstraction.CompressedTexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, data) );
508 * Wrapper for OpenGL ES 2.0 glCopyTexImage2D()
510 void CopyTexImage2D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border)
512 LOG_GL("CopyTexImage2D %x %d %x %d %d %d %d %d\n", target, level, internalformat, x, y, width, height, border);
513 CHECK_GL( mGlAbstraction, mGlAbstraction.CopyTexImage2D(target, level, internalformat, x, y, width, height, border) );
517 * Wrapper for OpenGL ES 2.0 glCopyTexSubImage2D()
519 void CopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height)
521 LOG_GL("CopyTexSubImage2D %x %d %d %d %d %d %d %d\n", target, level, xoffset, yoffset, x, y, width, height);
522 CHECK_GL( mGlAbstraction, mGlAbstraction.CopyTexSubImage2D(target, level, xoffset, yoffset, x, y, width, height) );
526 * Wrapper for OpenGL ES 3.0 glCopyTexSubImage3D()
528 void CopyTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height)
530 LOG_GL("CopyTexSubImage3D %x %d %d %d %d %d %d %d %d\n", target, level, xoffset, yoffset, zoffset, x, y, width, height);
531 CHECK_GL( mGlAbstraction, mGlAbstraction.CopyTexSubImage3D(target, level, xoffset, yoffset, zoffset, x, y, width, height) );
535 * Wrapper for OpenGL ES 2.0 glCullFace()
536 * enables GL_CULL_FACE if in any of the face culling modes
537 * otherwise disables GL_CULL_FACE
539 void CullFace(CullFaceMode mode)
541 // Avoid unnecessary calls to gl
542 if(mCullFaceMode != mode)
544 mCullFaceMode = mode;
549 LOG_GL("Disable GL_CULL_FACE\n");
550 CHECK_GL( mGlAbstraction, mGlAbstraction.Disable(GL_CULL_FACE) );
556 LOG_GL("Enable GL_CULL_FACE\n");
557 CHECK_GL( mGlAbstraction, mGlAbstraction.Enable(GL_CULL_FACE) );
558 LOG_GL("Enable GL_FRONT\n");
559 CHECK_GL( mGlAbstraction, mGlAbstraction.CullFace(GL_FRONT) );
565 LOG_GL("Enable GL_CULL_FACE\n");
566 CHECK_GL( mGlAbstraction, mGlAbstraction.Enable(GL_CULL_FACE) );
567 LOG_GL("Enable GL_BACK\n");
568 CHECK_GL( mGlAbstraction, mGlAbstraction.CullFace(GL_BACK) );
572 case CullFrontAndBack:
574 LOG_GL("Enable GL_CULL_FACE\n");
575 CHECK_GL( mGlAbstraction, mGlAbstraction.Enable(GL_CULL_FACE) );
576 LOG_GL("Enable GL_FRONT_AND_BACK\n");
577 CHECK_GL( mGlAbstraction, mGlAbstraction.CullFace(GL_FRONT_AND_BACK) );
588 * Wrapper for OpenGL ES 2.0 glDeleteBuffers()
590 void DeleteBuffers(GLsizei n, const GLuint* buffers)
592 // @todo: this is to prevent mesh destructor from doing GL calls when DALi core is being deleted
593 // can be taken out once render manages either knows about meshes or gpubuffers and can tell them directly that context is lost
594 if( this->IsGlContextCreated() )
596 LOG_GL("DeleteBuffers %d %p\n", n, buffers);
597 CHECK_GL( mGlAbstraction, mGlAbstraction.DeleteBuffers(n, buffers) );
599 // reset the cached buffer id's
600 // fixes problem where some drivers will a generate a buffer with the
601 // same id, as the last deleted buffer id.
602 mBoundArrayBufferId = 0;
603 mBoundElementArrayBufferId = 0;
604 mBoundTransformFeedbackBufferId = 0;
608 * Wrapper for OpenGL ES 2.0 glDeleteFramebuffers()
610 void DeleteFramebuffers(GLsizei n, const GLuint* framebuffers)
612 mFrameBufferStateCache.FrameBuffersDeleted( n, framebuffers );
614 LOG_GL("DeleteFramebuffers %d %p\n", n, framebuffers);
615 CHECK_GL( mGlAbstraction, mGlAbstraction.DeleteFramebuffers(n, framebuffers) );
619 * Wrapper for OpenGL ES 3.0 glDeleteQueries()
621 void DeleteQueries(GLsizei n, GLuint* ids)
623 LOG_GL("DeleteQueries %d %p\n", n, ids);
624 CHECK_GL( mGlAbstraction, mGlAbstraction.DeleteQueries(n, ids) );
628 * Wrapper for OpenGL ES 2.0 glDeleteRenderbuffers()
630 void DeleteRenderbuffers(GLsizei n, const GLuint* renderbuffers)
632 LOG_GL("DeleteRenderbuffers %d %p\n", n, renderbuffers);
633 CHECK_GL( mGlAbstraction, mGlAbstraction.DeleteRenderbuffers(n, renderbuffers) );
637 * Wrapper for OpenGL ES 2.0 glDeleteTextures()
639 void DeleteTextures(GLsizei n, const GLuint* textures)
641 LOG_GL("DeleteTextures %d %p\n", n, textures);
642 CHECK_GL( mGlAbstraction, mGlAbstraction.DeleteTextures(n, textures) );
644 // reset the cached texture id's incase the driver re-uses them
645 // when creating new textures
646 for( unsigned int i=0; i < MAX_TEXTURE_UNITS; ++i )
648 mBound2dTextureId[ i ] = 0;
653 * Wrapper for OpenGL ES 3.0 glDeleteTransformFeedbacks()
655 void DeleteTransformFeedbacks(GLsizei n, GLuint* ids)
657 LOG_GL("DeleteTransformFeedbacks %d %p\n", n, ids);
658 CHECK_GL( mGlAbstraction, mGlAbstraction.DeleteTransformFeedbacks(n, ids) );
662 * Wrapper for OpenGL ES 2.0 glDepthFunc()
664 void DepthFunc(GLenum func)
666 LOG_GL("DepthFunc %x\n", func);
667 CHECK_GL( mGlAbstraction, mGlAbstraction.DepthFunc(func) );
671 * Wrapper for OpenGL ES 2.0 glDepthMask()
673 void DepthMask(GLboolean flag)
675 // only change state if needed
676 if( flag != mDepthMaskEnabled )
678 mDepthMaskEnabled = flag;
679 LOG_GL("DepthMask %s\n", flag ? "True" : "False");
680 CHECK_GL( mGlAbstraction, mGlAbstraction.DepthMask( mDepthMaskEnabled ) );
685 * Wrapper for OpenGL ES 2.0 glDepthRangef()
687 void DepthRangef(GLclampf zNear, GLclampf zFar)
689 LOG_GL("DepthRangef %f %f\n", zNear, zFar);
690 CHECK_GL( mGlAbstraction, mGlAbstraction.DepthRangef(zNear, zFar) );
694 * The wrapper for OpenGL ES 2.0 glDisable() has been replaced by SetBlend, SetCullFace, SetDepthTest,
695 * SetDither, SetPolygonOffsetFill, SetSampleAlphaToCoverage, SetSampleCoverage, SetScissorTest & SetStencilTest.
699 * Wrapper for OpenGL ES 2.0 glDrawArrays()
701 void DrawArrays(GLenum mode, GLint first, GLsizei count)
703 mFrameBufferStateCache.DrawOperation( mColorMask, DepthBufferWriteEnabled(), StencilBufferWriteEnabled() );
704 FlushVertexAttributeLocations();
706 LOG_GL("DrawArrays %x %d %d\n", mode, first, count);
707 CHECK_GL( mGlAbstraction, mGlAbstraction.DrawArrays(mode, first, count) );
711 * Wrapper for OpenGL ES 3.0 glDrawArraysInstanced()
713 void DrawArraysInstanced(GLenum mode, GLint first, GLsizei count, GLsizei instanceCount)
715 mFrameBufferStateCache.DrawOperation( mColorMask, DepthBufferWriteEnabled(), StencilBufferWriteEnabled() );
716 FlushVertexAttributeLocations();
718 LOG_GL("DrawArraysInstanced %x %d %d %d\n", mode, first, count, instanceCount);
719 CHECK_GL( mGlAbstraction, mGlAbstraction.DrawArraysInstanced(mode, first, count,instanceCount) );
723 * Wrapper for OpenGL ES 3.0 glDrawBuffers()
725 void DrawBuffers(GLsizei n, const GLenum* bufs)
727 mFrameBufferStateCache.DrawOperation( mColorMask, DepthBufferWriteEnabled(), StencilBufferWriteEnabled() );
728 LOG_GL("DrawBuffers %d %p\n", n, bufs);
729 CHECK_GL( mGlAbstraction, mGlAbstraction.DrawBuffers(n, bufs) );
733 * Wrapper for OpenGL ES 2.0 glDrawElements()
735 void DrawElements(GLenum mode, GLsizei count, GLenum type, const void* indices)
737 mFrameBufferStateCache.DrawOperation( mColorMask, DepthBufferWriteEnabled(), StencilBufferWriteEnabled() );
739 FlushVertexAttributeLocations();
741 LOG_GL("DrawElements %x %d %d %p\n", mode, count, type, indices);
742 CHECK_GL( mGlAbstraction, mGlAbstraction.DrawElements(mode, count, type, indices) );
746 * Wrapper for OpenGL ES 3.0 glDrawElementsInstanced()
748 void DrawElementsInstanced(GLenum mode, GLsizei count, GLenum type, const void* indices, GLsizei instanceCount)
750 mFrameBufferStateCache.DrawOperation( mColorMask, DepthBufferWriteEnabled(), StencilBufferWriteEnabled() );
752 FlushVertexAttributeLocations();
754 LOG_GL("DrawElementsInstanced %x %d %d %p %d\n", mode, count, type, indices, instanceCount);
755 CHECK_GL( mGlAbstraction, mGlAbstraction.DrawElementsInstanced(mode, count, type, indices, instanceCount) );
759 * Wrapper for OpenGL ES 3.0 glDrawRangeElements()
761 void DrawRangeElements(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void* indices)
763 mFrameBufferStateCache.DrawOperation( mColorMask, DepthBufferWriteEnabled(), StencilBufferWriteEnabled() );
764 FlushVertexAttributeLocations();
766 LOG_GL("DrawRangeElements %x %u %u %d %d %p\n", mode, start, end, count, type, indices);
767 CHECK_GL( mGlAbstraction, mGlAbstraction.DrawRangeElements(mode, start, end, count, type, indices) );
771 * Wrapper for OpenGL ES 3.0 glGenQuerieS()
773 void GenQueries(GLsizei n, GLuint* ids)
775 LOG_GL("GenQueries %d %p\n", n, ids);
776 CHECK_GL( mGlAbstraction, mGlAbstraction.GenQueries(n, ids) );
780 * Wrapper for OpenGL ES 3.0 glGenTransformFeedbacks()
782 void GenTransformFeedbacks(GLsizei n, GLuint* ids)
784 LOG_GL("GenTransformFeedbacks %d %p\n", n, ids);
785 CHECK_GL( mGlAbstraction, mGlAbstraction.GenTransformFeedbacks(n, ids) );
789 * @return the current buffer bound for a given target
791 GLuint GetCurrentBoundArrayBuffer(GLenum target)
796 case GL_ARRAY_BUFFER:
798 result = mBoundArrayBufferId;
801 case GL_ELEMENT_ARRAY_BUFFER:
803 result = mBoundElementArrayBufferId;
806 case GL_TRANSFORM_FEEDBACK_BUFFER:
808 result = mBoundTransformFeedbackBufferId;
813 DALI_ASSERT_DEBUG(0 && "target buffer type not supported");
819 void EnableVertexAttributeArray( GLuint location )
821 SetVertexAttributeLocation( location, true);
824 void DisableVertexAttributeArray( GLuint location )
826 SetVertexAttributeLocation( location, false);
830 * Wrapper for OpenGL ES 3.0 glVertexAttribDivisor()
832 void VertexAttribDivisor ( GLuint index, GLuint divisor )
834 LOG_GL("VertexAttribDivisor(%d, %d)\n", index, divisor );
835 CHECK_GL( mGlAbstraction, mGlAbstraction.VertexAttribDivisor( index, divisor ) );
839 * Wrapper for OpenGL ES 2.0 glVertexAttribPointer()
841 void VertexAttribPointer( GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void* ptr )
843 LOG_GL("VertexAttribPointer(%d, %d, %d, %d, %d, %x)\n", index, size, type, normalized, stride, ptr );
844 CHECK_GL( mGlAbstraction, mGlAbstraction.VertexAttribPointer( index, size, type, normalized, stride, ptr ) );
848 * Wrapper for OpenGL ES 3.0 glInvalidateFramebuffer()
850 void InvalidateFramebuffer(GLenum target, GLsizei numAttachments, const GLenum *attachments)
852 LOG_GL("InvalidateFramebuffer\n");
853 CHECK_GL( mGlAbstraction, mGlAbstraction.InvalidateFramebuffer(target, numAttachments, attachments) );
857 * The wrapper for OpenGL ES 2.0 glEnable() has been replaced by SetBlend, SetCullFace, SetDepthTest,
858 * SetDither, SetPolygonOffsetFill, SetSampleAlphaToCoverage, SetSampleCoverage, SetScissorTest & SetStencilTest.
862 * This method replaces glEnable(GL_BLEND) and glDisable(GL_BLEND).
863 * @param[in] enable True if GL_BLEND should be enabled.
865 void SetBlend(bool enable)
867 // Avoid unecessary calls to glEnable/glDisable
868 if (enable != mBlendEnabled)
870 mBlendEnabled = enable;
874 LOG_GL("Enable GL_BLEND\n");
875 CHECK_GL( mGlAbstraction, mGlAbstraction.Enable(GL_BLEND) );
879 LOG_GL("Disable GL_BLEND\n");
880 CHECK_GL( mGlAbstraction, mGlAbstraction.Disable(GL_BLEND) );
886 * This method replaces glEnable(GL_DEPTH_TEST) and glDisable(GL_DEPTH_TEST).
887 * Note GL_DEPTH_TEST means enable the depth buffer for writing and or testing.
888 * glDepthMask is used to enable / disable writing to depth buffer.
889 * glDepthFunc us used to control if testing is enabled and how it is performed ( default GL_LESS)
891 * @param[in] enable True if GL_DEPTH_TEST should be enabled.
893 void EnableDepthBuffer( bool enable )
895 // Avoid unecessary calls to glEnable/glDisable
896 if( enable != mDepthBufferEnabled )
898 mDepthBufferEnabled = enable;
902 LOG_GL("Enable GL_DEPTH_TEST\n");
903 CHECK_GL( mGlAbstraction, mGlAbstraction.Enable(GL_DEPTH_TEST) );
907 LOG_GL("Disable GL_DEPTH_TEST\n");
908 CHECK_GL( mGlAbstraction, mGlAbstraction.Disable(GL_DEPTH_TEST) );
914 * This method replaces glEnable(GL_DITHER) and glDisable(GL_DITHER).
915 * @param[in] enable True if GL_DITHER should be enabled.
917 void SetDither(bool enable)
919 // Avoid unecessary calls to glEnable/glDisable
920 if (enable != mDitherEnabled)
922 mDitherEnabled = enable;
926 LOG_GL("Enable GL_DITHER\n");
927 CHECK_GL( mGlAbstraction, mGlAbstraction.Enable(GL_DITHER) );
931 LOG_GL("Disable GL_DITHER\n");
932 CHECK_GL( mGlAbstraction, mGlAbstraction.Disable(GL_DITHER) );
938 * This method replaces glEnable(GL_POLYGON_OFFSET_FILL) and glDisable(GL_POLYGON_OFFSET_FILL).
939 * @param[in] enable True if GL_POLYGON_OFFSET_FILL should be enabled.
941 void SetPolygonOffsetFill(bool enable)
943 // Avoid unecessary calls to glEnable/glDisable
944 if (enable != mPolygonOffsetFillEnabled)
946 mPolygonOffsetFillEnabled = enable;
950 LOG_GL("Enable GL_POLYGON_OFFSET_FILL\n");
951 CHECK_GL( mGlAbstraction, mGlAbstraction.Enable(GL_POLYGON_OFFSET_FILL) );
955 LOG_GL("Disable GL_POLYGON_OFFSET_FILL\n");
956 CHECK_GL( mGlAbstraction, mGlAbstraction.Disable(GL_POLYGON_OFFSET_FILL) );
962 * This method replaces glEnable(GL_SAMPLE_ALPHA_TO_COVERAGE) and glDisable(GL_SAMPLE_ALPHA_TO_COVERAGE).
963 * @param[in] enable True if GL_SAMPLE_ALPHA_TO_COVERAGE should be enabled.
965 void SetSampleAlphaToCoverage(bool enable)
967 // Avoid unecessary calls to glEnable/glDisable
968 if (enable != mSampleAlphaToCoverageEnabled)
970 mSampleAlphaToCoverageEnabled = enable;
974 LOG_GL("Enable GL_SAMPLE_ALPHA_TO_COVERAGE\n");
975 CHECK_GL( mGlAbstraction, mGlAbstraction.Enable(GL_SAMPLE_ALPHA_TO_COVERAGE) );
979 LOG_GL("Disable GL_SAMPLE_ALPHA_TO_COVERAGE\n");
980 CHECK_GL( mGlAbstraction, mGlAbstraction.Disable(GL_SAMPLE_ALPHA_TO_COVERAGE) );
986 * This method replaces glEnable(GL_SAMPLE_COVERAGE) and glDisable(GL_SAMPLE_COVERAGE).
987 * @param[in] enable True if GL_SAMPLE_COVERAGE should be enabled.
989 void SetSampleCoverage(bool enable)
991 // Avoid unecessary calls to glEnable/glDisable
992 if (enable != mSampleCoverageEnabled)
994 mSampleCoverageEnabled = enable;
998 LOG_GL("Enable GL_SAMPLE_COVERAGE\n");
999 CHECK_GL( mGlAbstraction, mGlAbstraction.Enable(GL_SAMPLE_COVERAGE) );
1003 LOG_GL("Disable GL_SAMPLE_COVERAGE\n");
1004 CHECK_GL( mGlAbstraction, mGlAbstraction.Disable(GL_SAMPLE_COVERAGE) );
1010 * This method replaces glEnable(GL_SCISSOR_TEST) and glDisable(GL_SCISSOR_TEST).
1011 * @param[in] enable True if GL_SCISSOR_TEST should be enabled.
1013 void SetScissorTest(bool enable)
1015 // Avoid unecessary calls to glEnable/glDisable
1016 if (enable != mScissorTestEnabled)
1018 mScissorTestEnabled = enable;
1022 LOG_GL("Enable GL_SCISSOR_TEST\n");
1023 CHECK_GL( mGlAbstraction, mGlAbstraction.Enable(GL_SCISSOR_TEST) );
1027 LOG_GL("Disable GL_SCISSOR_TEST\n");
1028 CHECK_GL( mGlAbstraction, mGlAbstraction.Disable(GL_SCISSOR_TEST) );
1034 * This method replaces glEnable(GL_STENCIL_TEST) and glDisable(GL_STENCIL_TEST).
1035 * Note GL_STENCIL_TEST means enable the stencil buffer for writing and or testing.
1036 * glStencilMask is used to control how bits are written to the stencil buffer.
1037 * glStencilFunc is used to control if testing is enabled and how it is performed ( default GL_ALWAYS )
1038 * @param[in] enable True if GL_STENCIL_TEST should be enabled.
1040 void EnableStencilBuffer(bool enable)
1042 // Avoid unecessary calls to glEnable/glDisable
1043 if( enable != mStencilBufferEnabled )
1045 mStencilBufferEnabled = enable;
1049 LOG_GL("Enable GL_STENCIL_TEST\n");
1050 CHECK_GL( mGlAbstraction, mGlAbstraction.Enable(GL_STENCIL_TEST) );
1054 LOG_GL("Disable GL_STENCIL_TEST\n");
1055 CHECK_GL( mGlAbstraction, mGlAbstraction.Disable(GL_STENCIL_TEST) );
1061 * Wrapper for OpenGL ES 3.0 glEndQuery()
1063 void EndQuery(GLenum target)
1065 LOG_GL("EndQuery %d\n", target);
1066 CHECK_GL( mGlAbstraction, mGlAbstraction.EndQuery(target) );
1070 * Wrapper for OpenGL ES 3.0 glEndTransformFeedback()
1072 void EndTransformFeedback()
1074 LOG_GL("EndTransformFeedback\n");
1075 CHECK_GL( mGlAbstraction, mGlAbstraction.EndTransformFeedback() );
1079 * Wrapper for OpenGL ES 2.0 glFinish()
1084 CHECK_GL( mGlAbstraction, mGlAbstraction.Finish() );
1088 * Wrapper for OpenGL ES 2.0 glFlush()
1093 CHECK_GL( mGlAbstraction, mGlAbstraction.Flush() );
1097 * Wrapper for OpenGL ES 2.0 glFramebufferRenderbuffer()
1099 void FramebufferRenderbuffer(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer)
1101 LOG_GL("FramebufferRenderbuffer %x %x %x %d\n", target, attachment, renderbuffertarget, renderbuffer);
1102 CHECK_GL( mGlAbstraction, mGlAbstraction.FramebufferRenderbuffer(target, attachment, renderbuffertarget, renderbuffer) );
1106 * Wrapper for OpenGL ES 2.0 glFramebufferTexture2D()
1108 void FramebufferTexture2D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level)
1110 LOG_GL("FramebufferTexture2D %x %x %x %d %d\n", target, attachment, textarget, texture, level);
1111 CHECK_GL( mGlAbstraction, mGlAbstraction.FramebufferTexture2D(target, attachment, textarget, texture, level) );
1115 * Wrapper for OpenGL ES 3.0 glFramebufferTextureLayer()
1117 void FramebufferTextureLayer(GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer)
1119 LOG_GL("FramebufferTextureLayer %x %x %d %d %d\n", target, attachment, texture, level, layer);
1120 CHECK_GL( mGlAbstraction, mGlAbstraction.FramebufferTextureLayer(target, attachment, texture, level, layer) );
1124 * Wrapper for OpenGL ES 2.0 glFrontFace()
1126 void FrontFace(GLenum mode)
1128 LOG_GL("FrontFace %x\n", mode);
1129 CHECK_GL( mGlAbstraction, mGlAbstraction.FrontFace(mode) );
1133 * Wrapper for OpenGL ES 2.0 glGenBuffers()
1135 void GenBuffers(GLsizei n, GLuint* buffers)
1137 LOG_GL("GenBuffers %d\n", n, buffers);
1138 CHECK_GL( mGlAbstraction, mGlAbstraction.GenBuffers(n, buffers) );
1142 * Wrapper for OpenGL ES 2.0 glGenerateMipmap()
1144 void GenerateMipmap(GLenum target)
1146 LOG_GL("GenerateMipmap %x\n", target);
1147 CHECK_GL( mGlAbstraction, mGlAbstraction.GenerateMipmap(target) );
1151 * Wrapper for OpenGL ES 2.0 glGenFramebuffers()
1153 void GenFramebuffers(GLsizei n, GLuint* framebuffers)
1155 LOG_GL("GenFramebuffers %d %p\n", n, framebuffers);
1156 CHECK_GL( mGlAbstraction, mGlAbstraction.GenFramebuffers(n, framebuffers) );
1158 mFrameBufferStateCache.FrameBuffersCreated( n, framebuffers );
1162 * Wrapper for OpenGL ES 2.0 glGenRenderbuffers()
1164 void GenRenderbuffers(GLsizei n, GLuint* renderbuffers)
1166 LOG_GL("GenRenderbuffers %d %p\n", n, renderbuffers);
1167 CHECK_GL( mGlAbstraction, mGlAbstraction.GenRenderbuffers(n, renderbuffers) );
1171 * Wrapper for OpenGL ES 2.0 glGenTextures()
1173 void GenTextures(GLsizei n, GLuint* textures)
1175 LOG_GL("GenTextures %d %p\n", n, textures);
1176 CHECK_GL( mGlAbstraction, mGlAbstraction.GenTextures(n, textures) );
1180 * Wrapper for OpenGL ES 2.0 glGetBooleanv()
1182 void GetBooleanv(GLenum pname, GLboolean* params)
1184 LOG_GL("GetBooleanv %x\n", pname);
1185 CHECK_GL( mGlAbstraction, mGlAbstraction.GetBooleanv(pname, params) );
1189 * Wrapper for OpenGL ES 2.0 glGetBufferParameteriv()
1191 void GetBufferParameteriv(GLenum target, GLenum pname, GLint* params)
1193 LOG_GL("GetBufferParameteriv %x %x %p\n", target, pname, params);
1194 CHECK_GL( mGlAbstraction, mGlAbstraction.GetBufferParameteriv(target, pname, params) );
1198 * Wrapper for OpenGL ES 3.0 glGetBufferPointer()
1200 void GetBufferPointerv(GLenum target, GLenum pname, GLvoid** params)
1202 LOG_GL("GetBufferPointerv %x %x %p\n", target, pname, params);
1203 CHECK_GL( mGlAbstraction, mGlAbstraction.GetBufferPointerv(target, pname, params) );
1207 * Wrapper for OpenGL ES 2.0 glGetError()
1209 GLenum GetError(void)
1211 // Not worth logging here
1212 return mGlAbstraction.GetError();
1216 * Wrapper for OpenGL ES 2.0 glGetFloatv()
1218 void GetFloatv(GLenum pname, GLfloat* params)
1220 LOG_GL("GetFloatv %x\n", pname);
1221 CHECK_GL( mGlAbstraction, mGlAbstraction.GetFloatv(pname, params) );
1225 * Wrapper for OpenGL ES 2.0 glGetFramebufferAttachmentParameteriv()
1227 void GetFramebufferAttachmentParameteriv(GLenum target, GLenum attachment, GLenum pname, GLint* params)
1229 LOG_GL("GetFramebufferAttachmentParameteriv %x %x %x\n", target, attachment, pname);
1230 CHECK_GL( mGlAbstraction, mGlAbstraction.GetFramebufferAttachmentParameteriv(target, attachment, pname, params) );
1234 * Wrapper for OpenGL ES 2.0 glGetIntegerv()
1236 void GetIntegerv(GLenum pname, GLint* params)
1238 LOG_GL("GetIntegerv %x\n", pname);
1239 CHECK_GL( mGlAbstraction, mGlAbstraction.GetIntegerv(pname, params) );
1243 * Wrapper for OpenGL ES 3.0 glGetQueryiv()
1245 void GetQueryiv(GLenum target, GLenum pname, GLint* params)
1247 LOG_GL("GetQueryiv %x %x\n", target, pname);
1248 CHECK_GL( mGlAbstraction, mGlAbstraction.GetQueryiv(target, pname, params) );
1252 * Wrapper for OpenGL ES 3.0 glGetQueryObjectuiv()
1254 void GetQueryObjectuiv(GLuint id, GLenum pname, GLuint* params)
1256 LOG_GL("GetQueryObjectuiv %u %x %p\n", id, pname, params);
1257 CHECK_GL( mGlAbstraction, mGlAbstraction.GetQueryObjectuiv(id, pname, params) );
1261 * Wrapper for OpenGL ES 2.0 glGetRenderbufferParameteriv()
1263 void GetRenderbufferParameteriv(GLenum target, GLenum pname, GLint* params)
1265 LOG_GL("GetRenderbufferParameteriv %x %x\n", target, pname);
1266 CHECK_GL( mGlAbstraction, mGlAbstraction.GetRenderbufferParameteriv(target, pname, params) );
1270 * Wrapper for OpenGL ES 2.0 glGetString()
1272 const GLubyte* GetString(GLenum name)
1274 LOG_GL("GetString %x\n", name);
1275 const GLubyte* str = CHECK_GL( mGlAbstraction, mGlAbstraction.GetString(name) );
1280 * Wrapper for OpenGL ES 2.0 glGetTexParameterfv()
1282 void GetTexParameterfv(GLenum target, GLenum pname, GLfloat* params)
1284 LOG_GL("GetTexParameterfv %x %x\n", target, pname);
1285 CHECK_GL( mGlAbstraction, mGlAbstraction.GetTexParameterfv(target, pname, params) );
1289 * Wrapper for OpenGL ES 2.0 glGetTexParameteriv()
1291 void GetTexParameteriv(GLenum target, GLenum pname, GLint* params)
1293 LOG_GL("GetTexParameteriv %x %x\n", target, pname);
1294 CHECK_GL( mGlAbstraction, mGlAbstraction.GetTexParameteriv(target, pname, params) );
1298 * Wrapper for OpenGL ES 2.0 glHint()
1300 void Hint(GLenum target, GLenum mode)
1302 LOG_GL("Hint %x %x\n", target, mode);
1303 CHECK_GL( mGlAbstraction, mGlAbstraction.Hint(target, mode) );
1307 * Wrapper for OpenGL ES 2.0 glIsBuffer()
1309 GLboolean IsBuffer(GLuint buffer)
1311 LOG_GL("IsBuffer %d\n", buffer);
1312 GLboolean val = CHECK_GL( mGlAbstraction, mGlAbstraction.IsBuffer(buffer) );
1317 * Wrapper for OpenGL ES 2.0 glIsEnabled()
1319 GLboolean IsEnabled(GLenum cap)
1321 LOG_GL("IsEnabled %x\n", cap);
1322 GLboolean val = CHECK_GL( mGlAbstraction, mGlAbstraction.IsEnabled(cap) );
1327 * Wrapper for OpenGL ES 2.0 glIsFramebuffer()
1329 GLboolean IsFramebuffer(GLuint framebuffer)
1331 LOG_GL("IsFramebuffer %d\n", framebuffer);
1332 GLboolean val = CHECK_GL( mGlAbstraction, mGlAbstraction.IsFramebuffer(framebuffer) );
1337 * Wrapper for OpenGL ES 3.0 glIsQuery()
1339 GLboolean IsQuery(GLuint id)
1341 LOG_GL("IsQuery %u\n", id);
1342 GLboolean val = CHECK_GL( mGlAbstraction, mGlAbstraction.IsQuery(id) );
1347 * Wrapper for OpenGL ES 2.0 glIsRenderbuffer()
1349 GLboolean IsRenderbuffer(GLuint renderbuffer)
1351 LOG_GL("IsRenderbuffer %d\n", renderbuffer);
1352 GLboolean val = CHECK_GL( mGlAbstraction, mGlAbstraction.IsRenderbuffer(renderbuffer) );
1357 * Wrapper for OpenGL ES 2.0 glIsTexture()
1359 GLboolean IsTexture(GLuint texture)
1361 LOG_GL("IsTexture %d\n", texture);
1362 GLboolean val = CHECK_GL( mGlAbstraction, mGlAbstraction.IsTexture(texture) );
1367 * Wrapper for OpenGL ES 3.0 glIsTransformFeedback()
1369 GLboolean IsTransformFeedback(GLuint id)
1371 LOG_GL("IsTransformFeedback %u\n", id);
1372 GLboolean val = CHECK_GL( mGlAbstraction, mGlAbstraction.IsTransformFeedback(id) );
1377 * Wrapper for OpenGL ES 2.0 glLineWidth()
1379 void LineWidth(GLfloat width)
1381 LOG_GL("LineWidth %f\n", width);
1382 CHECK_GL( mGlAbstraction, mGlAbstraction.LineWidth(width) );
1386 * Wrapper for OpenGL ES 3.0 glPauseTransformFeedback()
1388 void PauseTransformFeedback()
1390 LOG_GL("PauseTransformFeedback\n");
1391 CHECK_GL( mGlAbstraction, mGlAbstraction.PauseTransformFeedback() );
1395 * Wrapper for OpenGL ES 2.0 glPixelStorei()
1397 void PixelStorei(GLenum pname, GLint param)
1399 LOG_GL("PixelStorei %x %d\n", pname, param);
1400 CHECK_GL( mGlAbstraction, mGlAbstraction.PixelStorei(pname, param) );
1404 * Wrapper for OpenGL ES 2.0 glPolygonOffset()
1406 void PolygonOffset(GLfloat factor, GLfloat units)
1408 LOG_GL("PolygonOffset %f %f\n", factor, units);
1409 CHECK_GL( mGlAbstraction, mGlAbstraction.PolygonOffset(factor, units) );
1413 * Wrapper for OpenGL ES 2.0 glReadPixels()
1415 void ReadPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, void* pixels)
1417 LOG_GL("ReadPixels %d %d %d %d %x %x\n", x, y, width, height, format, type);
1418 CHECK_GL( mGlAbstraction, mGlAbstraction.ReadPixels(x, y, width, height, format, type, pixels) );
1422 * Wrapper for OpenGL ES 2.0 glRenderbufferStorage()
1424 void RenderbufferStorage(GLenum target, GLenum internalformat, GLsizei width, GLsizei height)
1426 LOG_GL("RenderbufferStorage %x %x %d %d\n", target, internalformat, width, height);
1427 CHECK_GL( mGlAbstraction, mGlAbstraction.RenderbufferStorage(target, internalformat, width, height) );
1431 * Wrapper for OpenGL ES 3.0 glRenderbufferStorageMultisample()
1433 void RenderbufferStorageMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height)
1435 LOG_GL("RenderbufferStorageMultisample %x %u %x %d %d\n", target, samples, internalformat, width, height);
1436 CHECK_GL( mGlAbstraction, mGlAbstraction.RenderbufferStorageMultisample(target, samples, internalformat, width, height) );
1440 * Wrapper for OpenGL ES 3.0 glResumeTransformFeedback()
1442 void ResumeTransformFeedback()
1444 LOG_GL("ResumeTransformFeedback\n");
1445 CHECK_GL( mGlAbstraction, mGlAbstraction.ResumeTransformFeedback() );
1449 * Wrapper for OpenGL ES 2.0 glSampleCoverage()
1451 void SampleCoverage(GLclampf value, GLboolean invert)
1453 LOG_GL("SampleCoverage %f %s\n", value, invert ? "True" : "False");
1454 CHECK_GL( mGlAbstraction, mGlAbstraction.SampleCoverage(value, invert) );
1458 * Wrapper for OpenGL ES 2.0 glScissor()
1460 void Scissor(GLint x, GLint y, GLsizei width, GLsizei height)
1462 LOG_GL("Scissor %d %d %d %d\n", x, y, width, height);
1463 CHECK_GL( mGlAbstraction, mGlAbstraction.Scissor(x, y, width, height) );
1467 * Wrapper for OpenGL ES 2.0 glStencilFunc()
1469 void StencilFunc(GLenum func, GLint ref, GLuint mask)
1473 LOG_GL("StencilFunc %x %d %d\n", func, ref, mask);
1474 CHECK_GL( mGlAbstraction, mGlAbstraction.StencilFunc(func, ref, mask) );
1478 * Wrapper for OpenGL ES 2.0 glStencilFuncSeparate()
1480 void StencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask)
1482 LOG_GL("StencilFuncSeparate %x %x %d %d\n", face, func, ref, mask);
1483 CHECK_GL( mGlAbstraction, mGlAbstraction.StencilFuncSeparate(face, func, ref, mask) );
1487 * Wrapper for OpenGL ES 2.0 glStencilMask()
1489 void StencilMask(GLuint mask)
1491 if( mask != mStencilMask )
1493 mStencilMask = mask;
1495 LOG_GL("StencilMask %d\n", mask);
1496 CHECK_GL( mGlAbstraction, mGlAbstraction.StencilMask(mask) );
1501 * Wrapper for OpenGL ES 2.0 glStencilMaskSeparate()
1503 void StencilMaskSeparate(GLenum face, GLuint mask)
1505 LOG_GL("StencilMaskSeparate %x %d\n", face, mask);
1506 CHECK_GL( mGlAbstraction, mGlAbstraction.StencilMaskSeparate(face, mask) );
1510 * Wrapper for OpenGL ES 2.0 glStencilOp()
1512 void StencilOp(GLenum fail, GLenum zfail, GLenum zpass)
1514 LOG_GL("StencilOp %x %x %x\n", fail, zfail, zpass);
1515 CHECK_GL( mGlAbstraction, mGlAbstraction.StencilOp(fail, zfail, zpass) );
1519 * Wrapper for OpenGL ES 2.0 glStencilOpSeparate()
1521 void StencilOpSeparate(GLenum face, GLenum fail, GLenum zfail, GLenum zpass)
1523 LOG_GL("StencilOpSeparate %x %x %x %x\n", face, fail, zfail, zpass);
1524 CHECK_GL( mGlAbstraction, mGlAbstraction.StencilOpSeparate(face, fail, zfail, zpass) );
1528 * Wrapper for OpenGL ES 2.0 glTexImage2D()
1530 void TexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height,
1531 GLint border, GLenum format, GLenum type, const void* pixels)
1533 LOG_GL("TexImage2D %x %d %d %dx%d %d %x %x %p\n", target, level, internalformat, width, height, border, format, type, pixels);
1534 CHECK_GL( mGlAbstraction, mGlAbstraction.TexImage2D(target, level, internalformat, width, height, border, format, type, pixels) );
1538 * Wrapper for OpenGL ES 3.0 glTexImage3D()
1540 void TexImage3D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth,
1541 GLint border, GLenum format, GLenum type, const void* pixels)
1543 LOG_GL("TexImage3D %x %d %d %dx%dx%d %d %x %x %p\n", target, level, internalformat, width, height, depth, border, format, type, pixels);
1544 CHECK_GL( mGlAbstraction, mGlAbstraction.TexImage3D(target, level, internalformat, width, height, depth, border, format, type, pixels) );
1548 * Wrapper for OpenGL ES 2.0 glTexParameterf()
1550 void TexParameterf(GLenum target, GLenum pname, GLfloat param)
1552 LOG_GL("TexParameterf %x %x %f\n", target, pname, param);
1553 CHECK_GL( mGlAbstraction, mGlAbstraction.TexParameterf(target, pname, param) );
1557 * Wrapper for OpenGL ES 2.0 glTexParameterfv()
1559 void TexParameterfv(GLenum target, GLenum pname, const GLfloat* params)
1561 LOG_GL("TexParameterfv %x %x\n", target, pname);
1562 CHECK_GL( mGlAbstraction, mGlAbstraction.TexParameterfv(target, pname, params) );
1566 * Wrapper for OpenGL ES 2.0 glTexParameteri()
1568 void TexParameteri(GLenum target, GLenum pname, GLint param)
1570 LOG_GL("TexParameteri %x %x %d\n", target, pname, param);
1571 CHECK_GL( mGlAbstraction, mGlAbstraction.TexParameteri(target, pname, param) );
1575 * Wrapper for OpenGL ES 2.0 glTexParameteriv()
1577 void TexParameteriv(GLenum target, GLenum pname, const GLint* params)
1579 LOG_GL("TexParameteriv %x %x\n", target, pname);
1580 CHECK_GL( mGlAbstraction, mGlAbstraction.TexParameteriv(target, pname, params) );
1584 * Wrapper for OpenGL ES 2.0 glTexSubImage2D()
1586 void TexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height,
1587 GLenum format, GLenum type, const void* pixels)
1589 LOG_GL("TexSubImage2D %x %d %d %d %d %d %x %x %p\n", target, level, xoffset, yoffset, width, height, format, type, pixels);
1590 CHECK_GL( mGlAbstraction, mGlAbstraction.TexSubImage2D(target, level, xoffset, yoffset, width, height, format, type, pixels) );
1594 * Wrapper for OpenGL ES 3.0 glTexSubImage3D()
1596 void TexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset,
1597 GLsizei width, GLsizei height, GLsizei depth,
1598 GLenum format, GLenum type, const void* pixels)
1600 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);
1601 CHECK_GL( mGlAbstraction, mGlAbstraction.TexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels) );
1605 * Wrapper for OpenGL ES 3.0 glUnmapBubffer()
1607 GLboolean UnmapBuffer(GLenum target)
1609 LOG_GL("UnmapBuffer %x \n", target);
1610 GLboolean val = CHECK_GL( mGlAbstraction, mGlAbstraction.UnmapBuffer(target) );
1614 * Wrapper for OpenGL ES 2.0 glViewport()
1616 void Viewport(GLint x, GLint y, GLsizei width, GLsizei height)
1618 // check if its same as already set
1619 Rect<int> newViewport( x, y, width, height );
1620 if( mViewPort != newViewport )
1623 LOG_GL("Viewport %d %d %d %d\n", x, y, width, height);
1624 CHECK_GL( mGlAbstraction, mGlAbstraction.Viewport(x, y, width, height) );
1625 mViewPort = newViewport; // remember new one
1630 * Get the implementation defined MAX_TEXTURE_SIZE. This values is cached when the context is created
1631 * @return The implementation defined MAX_TEXTURE_SIZE
1633 GLint CachedMaxTextureSize() const
1635 return mMaxTextureSize;
1639 * Get the current viewport.
1640 * @return Viewport rectangle.
1642 const Rect< int >& GetViewport();
1645 * Set the frame count of render thread
1647 inline void SetFrameCount(unsigned int frameCount)
1649 mFrameCount = frameCount;
1653 * Get the frame count
1655 inline unsigned int GetFrameCount()
1661 * Increment the count of culled renderers
1663 inline void IncrementCulledCount()
1669 * Clear the count of culled renderers
1671 inline void ClearCulledCount()
1677 * Get the count of culled renderers in this frame
1679 inline unsigned int GetCulledCount()
1681 return mCulledCount;
1685 * Increment the count of culled renderers
1687 inline void IncrementRendererCount()
1693 * Clear the count of image renderers
1695 inline void ClearRendererCount()
1701 * Get the count of image renderers in this frame
1703 inline unsigned int GetRendererCount()
1705 return mRendererCount;
1708 private: // Implementation
1711 * @return true if next draw operation will write to depth buffer
1713 bool DepthBufferWriteEnabled() const
1715 return mDepthBufferEnabled && mDepthMaskEnabled;
1719 * @return true if next draw operation will write to stencil buffer
1721 bool StencilBufferWriteEnabled() const
1723 return mStencilBufferEnabled && ( mStencilMask > 0 );
1727 * Flushes vertex attribute location changes to the driver
1729 void FlushVertexAttributeLocations();
1732 * Reset the cached internal vertex attribute state
1734 void ResetVertexAttributeState();
1737 * Either enables or disables a vertex attribute location in the cache
1738 * The cahnges won't take affect until FlushVertexAttributeLocations is called
1739 * @param location attribute location
1740 * @param state attribute state
1742 void SetVertexAttributeLocation(unsigned int location, bool state);
1745 * Sets the initial GL state.
1747 void ResetGlState();
1751 Integration::GlAbstraction& mGlAbstraction;
1753 bool mGlContextCreated; ///< True if the OpenGL context has been created
1755 // glEnable/glDisable states
1757 GLuint mStencilMask;
1759 bool mDepthBufferEnabled;
1760 bool mDepthMaskEnabled;
1761 bool mDitherEnabled;
1762 bool mPolygonOffsetFillEnabled;
1763 bool mSampleAlphaToCoverageEnabled;
1764 bool mSampleCoverageEnabled;
1765 bool mScissorTestEnabled;
1766 bool mStencilBufferEnabled;
1767 bool mClearColorSet;
1769 // glBindBuffer() state
1770 GLuint mBoundArrayBufferId; ///< The ID passed to glBindBuffer(GL_ARRAY_BUFFER)
1771 GLuint mBoundElementArrayBufferId; ///< The ID passed to glBindBuffer(GL_ELEMENT_ARRAY_BUFFER)
1772 GLuint mBoundTransformFeedbackBufferId; ///< The ID passed to glBindBuffer(GL_TRANSFORM_FEEDBACK_BUFFER)
1774 // glBindTexture() state
1775 TextureUnit mActiveTextureUnit;
1776 GLuint mBound2dTextureId[ MAX_TEXTURE_UNITS ]; ///< The ID passed to glBindTexture(GL_TEXTURE_2D)
1778 // glBlendColor() state
1779 bool mUsingDefaultBlendColor;
1781 // glBlendFuncSeparate() state
1782 GLenum mBlendFuncSeparateSrcRGB; ///< The srcRGB parameter passed to glBlendFuncSeparate()
1783 GLenum mBlendFuncSeparateDstRGB; ///< The dstRGB parameter passed to glBlendFuncSeparate()
1784 GLenum mBlendFuncSeparateSrcAlpha; ///< The srcAlpha parameter passed to glBlendFuncSeparate()
1785 GLenum mBlendFuncSeparateDstAlpha; ///< The dstAlpha parameter passed to glBlendFuncSeparate()
1787 // glBlendEquationSeparate state
1788 GLenum mBlendEquationSeparateModeRGB; ///< Controls RGB blend mode
1789 GLenum mBlendEquationSeparateModeAlpha; ///< Controls Alpha blend mode
1791 GLint mMaxTextureSize; ///< return value from GetIntegerv(GL_MAX_TEXTURE_SIZE)
1792 Vector4 mClearColor; ///< clear color
1794 // Face culling mode
1795 CullFaceMode mCullFaceMode;
1797 // cached viewport size
1798 Rect< int > mViewPort;
1800 // Vertex Attribute Buffer enable caching
1801 bool mVertexAttributeCachedState[ MAX_ATTRIBUTE_CACHE_SIZE ]; ///< Value cache for Enable Vertex Attribute
1802 bool mVertexAttributeCurrentState[ MAX_ATTRIBUTE_CACHE_SIZE ]; ///< Current state on the driver for Enable Vertex Attribute
1804 unsigned int mFrameCount; ///< Number of render frames
1805 unsigned int mCulledCount; ///< Number of culled renderers per frame
1806 unsigned int mRendererCount; ///< Number of image renderers per frame
1807 FrameBufferStateCache mFrameBufferStateCache; ///< frame buffer state cache
1810 } // namespace Internal
1814 #endif // __DALI_INTERNAL_CONTEXT_H__