X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=dali%2Finternal%2Frender%2Fgl-resources%2Fcontext.h;h=be2db896e1c70695db296d7c0591aa0ad829e498;hb=79881246746f65474b24ea4fe14151ccef8df3f4;hp=e542f3351ff80dbdd3307cdc1d894d72a99678d3;hpb=468b1a9ac8e6436b7210d8e1023a37ea28dca66e;p=platform%2Fcore%2Fuifw%2Fdali-core.git diff --git a/dali/internal/render/gl-resources/context.h b/dali/internal/render/gl-resources/context.h index e542f33..be2db89 100644 --- a/dali/internal/render/gl-resources/context.h +++ b/dali/internal/render/gl-resources/context.h @@ -1,8 +1,8 @@ -#ifndef __DALI_INTERNAL_CONTEXT_H__ -#define __DALI_INTERNAL_CONTEXT_H__ +#ifndef DALI_INTERNAL_CONTEXT_H +#define DALI_INTERNAL_CONTEXT_H /* - * Copyright (c) 2014 Samsung Electronics Co., Ltd. + * Copyright (c) 2020 Samsung Electronics Co., Ltd. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -23,10 +23,11 @@ #include #include #include +#include +#include #include #include #include -#include #include #include #include @@ -64,7 +65,7 @@ public: static const unsigned int MAX_TEXTURE_UNITS = 8; // for GLES 2.0 8 is guaranteed, which is more than DALi uses anyways /** - * Creates the Dali Context object. + * Creates the Dali Context object for surface rendering only. * This method does not create an OpenGL context i.e. that is done from outside dali-core. * @pre Context has not been created. * @exception Context already created. @@ -73,6 +74,16 @@ public: Context( Integration::GlAbstraction& glAbstraction ); /** + * Creates the Dali Context object for texture (and surface rendering if required). + * This method does not create an OpenGL context i.e. that is done from outside dali-core. + * @pre Context has not been created. + * @exception Context already created. + * @param glAbstraction the gl abstraction. + * @param contexts The list of scene contexts (for surface rendering) + */ + Context( Integration::GlAbstraction& glAbstraction, std::vector< Context* >* contexts ); + + /** * Destructor */ ~Context(); @@ -119,7 +130,27 @@ public: */ void PrintGlString(const char* stringName, GLenum stringId) { - DALI_LOG_INFO(Debug::Filter::gRender, Debug::General, "GL %s = %s\n", stringName, (const char *)GetString( stringId ) ); + DALI_LOG_INFO(Debug::Filter::gRender, Debug::General, "GL %s = %s\n", stringName, reinterpret_cast< const char * >( GetString( stringId ) ) ); + } + + void ResetBufferCache() + { + // reset the cached buffer id's + // fixes problem where some drivers will a generate a buffer with the + // same id, as the last deleted buffer id. + mBoundArrayBufferId = 0; + mBoundElementArrayBufferId = 0; + mBoundTransformFeedbackBufferId = 0; + } + + void ResetTextureCache() + { + // reset the cached texture id's in case the driver re-uses them + // when creating new textures + for( unsigned int i=0; i < MAX_TEXTURE_UNITS; ++i ) + { + mBoundTextureId[ i ] = 0; + } } /**************************************************************************************** @@ -130,6 +161,22 @@ public: ****************************************************************************************/ /** + * Wrapper for IsSurfacelessContextSupported of Dali::Integration::GlAbstraction + */ + bool IsSurfacelessContextSupported() const + { + return mGlAbstraction.IsSurfacelessContextSupported(); + } + + /** + * Wrapper for TextureRequiresConverting of Dali::Integration::GlAbstraction + */ + bool TextureRequiresConverting( const GLenum imageGlFormat, const GLenum textureGlFormat, const bool isSubImage ) const + { + return mGlAbstraction.TextureRequiresConverting( imageGlFormat, textureGlFormat, isSubImage ); + } + + /** * Wrapper for OpenGL ES 2.0 glActiveTexture() */ void ActiveTexture( TextureUnit textureUnit ) @@ -262,26 +309,26 @@ public: * @param textureunit to bind to * @param texture to bind */ - void BindTextureForUnit( TextureUnit textureunit, GLuint texture ) + void BindTextureForUnit( TextureUnit textureunit, int target, GLuint texture ) { - if( mBound2dTextureId[ textureunit ] != texture ) + if( mBoundTextureId[ textureunit ] != texture ) { ActiveTexture( textureunit ); - Bind2dTexture( texture ); + BindTexture( target, texture ); } } /** - * Wrapper for OpenGL ES 2.0 glBindTexture(GL_TEXTURE_2D) + * Wrapper for OpenGL ES 2.0 glBindTexture( target ) */ - void Bind2dTexture( GLuint texture ) + void BindTexture( int target, GLuint texture ) { - if (mBound2dTextureId[ mActiveTextureUnit ] != texture) + if (mBoundTextureId[ mActiveTextureUnit ] != texture) { - mBound2dTextureId[ mActiveTextureUnit ] = texture; + mBoundTextureId[ mActiveTextureUnit ] = texture; - LOG_GL("BindTexture GL_TEXTURE_2D %d\n", texture); - CHECK_GL( mGlAbstraction, mGlAbstraction.BindTexture(GL_TEXTURE_2D, texture) ); + LOG_GL("BindTexture target(%d) %d\n", target, texture); + CHECK_GL( mGlAbstraction, mGlAbstraction.BindTexture(target, texture) ); } } @@ -537,7 +584,7 @@ public: * enables GL_CULL_FACE if in any of the face culling modes * otherwise disables GL_CULL_FACE */ - void CullFace( Dali::Material::FaceCullingMode mode ) + void CullFace( Dali::FaceCullingMode::Type mode ) { // Avoid unnecessary calls to gl if(mCullFaceMode != mode) @@ -545,14 +592,14 @@ public: mCullFaceMode = mode; switch(mode) { - case Dali::Material::NONE: + case Dali::FaceCullingMode::NONE: { LOG_GL("Disable GL_CULL_FACE\n"); CHECK_GL( mGlAbstraction, mGlAbstraction.Disable(GL_CULL_FACE) ); break; } - case Dali::Material::CULL_FRONT: + case Dali::FaceCullingMode::FRONT: { LOG_GL("Enable GL_CULL_FACE\n"); CHECK_GL( mGlAbstraction, mGlAbstraction.Enable(GL_CULL_FACE) ); @@ -561,7 +608,7 @@ public: break; } - case Dali::Material::CULL_BACK: + case Dali::FaceCullingMode::BACK: { LOG_GL("Enable GL_CULL_FACE\n"); CHECK_GL( mGlAbstraction, mGlAbstraction.Enable(GL_CULL_FACE) ); @@ -570,7 +617,7 @@ public: break; } - case Dali::Material::CULL_BACK_AND_FRONT: + case Dali::FaceCullingMode::FRONT_AND_BACK: { LOG_GL("Enable GL_CULL_FACE\n"); CHECK_GL( mGlAbstraction, mGlAbstraction.Enable(GL_CULL_FACE) ); @@ -590,19 +637,26 @@ public: */ void DeleteBuffers(GLsizei n, const GLuint* buffers) { - // @todo: this is to prevent mesh destructor from doing GL calls when DALi core is being deleted - // can be taken out once render manages either knows about meshes or gpubuffers and can tell them directly that context is lost if( this->IsGlContextCreated() ) { LOG_GL("DeleteBuffers %d %p\n", n, buffers); CHECK_GL( mGlAbstraction, mGlAbstraction.DeleteBuffers(n, buffers) ); } - // reset the cached buffer id's - // fixes problem where some drivers will a generate a buffer with the - // same id, as the last deleted buffer id. - mBoundArrayBufferId = 0; - mBoundElementArrayBufferId = 0; - mBoundTransformFeedbackBufferId = 0; + + ResetBufferCache(); + + // Need to reset the buffer cache in the surface contexts + // This will only be executed by the surfaceless context when there are contexts for surface rendering + if ( mSceneContexts ) + { + for ( auto&& context : *mSceneContexts ) + { + if ( context ) + { + context->ResetBufferCache(); + } + } + } } /** @@ -642,11 +696,19 @@ public: LOG_GL("DeleteTextures %d %p\n", n, textures); CHECK_GL( mGlAbstraction, mGlAbstraction.DeleteTextures(n, textures) ); - // reset the cached texture id's incase the driver re-uses them - // when creating new textures - for( unsigned int i=0; i < MAX_TEXTURE_UNITS; ++i ) + ResetTextureCache(); + + // Need to reset the texture cache in the scene contexts + // This will only be executed by the surfaceless context when there are contexts for surface rendering + if ( mSceneContexts ) { - mBound2dTextureId[ i ] = 0; + for ( auto&& context : *mSceneContexts ) + { + if ( context ) + { + context->ResetTextureCache(); + } + } } } @@ -664,8 +726,12 @@ public: */ void DepthFunc(GLenum func) { - LOG_GL("DepthFunc %x\n", func); - CHECK_GL( mGlAbstraction, mGlAbstraction.DepthFunc(func) ); + if( func != mDepthFunction ) + { + mDepthFunction = func; + LOG_GL("DepthFunc %x\n", func); + CHECK_GL( mGlAbstraction, mGlAbstraction.DepthFunc(func) ); + } } /** @@ -673,11 +739,12 @@ public: */ void DepthMask(GLboolean flag) { + bool booleanFlag = flag != GL_FALSE; // only change state if needed - if( flag != mDepthMaskEnabled ) + if( booleanFlag != mDepthMaskEnabled ) { - mDepthMaskEnabled = flag; - LOG_GL("DepthMask %s\n", flag ? "True" : "False"); + mDepthMaskEnabled = booleanFlag; + LOG_GL("DepthMask %s\n", booleanFlag ? "True" : "False"); CHECK_GL( mGlAbstraction, mGlAbstraction.DepthMask( mDepthMaskEnabled ) ); } } @@ -1469,10 +1536,15 @@ public: */ void StencilFunc(GLenum func, GLint ref, GLuint mask) { + if( ( func != mStencilFunc ) || ( ref != mStencilFuncRef ) || ( mask != mStencilFuncMask ) ) + { + mStencilFunc = func; + mStencilFuncRef = ref; + mStencilFuncMask = mask; - - LOG_GL("StencilFunc %x %d %d\n", func, ref, mask); - CHECK_GL( mGlAbstraction, mGlAbstraction.StencilFunc(func, ref, mask) ); + LOG_GL("StencilFunc %x %d %d\n", func, ref, mask); + CHECK_GL( mGlAbstraction, mGlAbstraction.StencilFunc(func, ref, mask) ); + } } /** @@ -1512,8 +1584,15 @@ public: */ void StencilOp(GLenum fail, GLenum zfail, GLenum zpass) { - LOG_GL("StencilOp %x %x %x\n", fail, zfail, zpass); - CHECK_GL( mGlAbstraction, mGlAbstraction.StencilOp(fail, zfail, zpass) ); + if( ( fail != mStencilOpFail ) || ( zfail != mStencilOpDepthFail ) || ( zpass != mStencilOpDepthPass ) ) + { + mStencilOpFail = fail; + mStencilOpDepthFail = zfail; + mStencilOpDepthPass = zpass; + + LOG_GL("StencilOp %x %x %x\n", fail, zfail, zpass); + CHECK_GL( mGlAbstraction, mGlAbstraction.StencilOp(fail, zfail, zpass) ); + } } /** @@ -1618,7 +1697,11 @@ public: { // check if its same as already set Rect newViewport( x, y, width, height ); - if( mViewPort != newViewport ) + + // Temporarily disable the viewport caching, as the implementation of GLES driver in Tizen platform + // share a global viewport between multiple contexts, therefore glViewport has to be called every + // time after glBindFramebuffer regardless of the same vewport size in the same context. +// if( mViewPort != newViewport ) { // set new one LOG_GL("Viewport %d %d %d %d\n", x, y, width, height); @@ -1642,70 +1725,6 @@ public: */ const Rect< int >& GetViewport(); - /** - * Set the frame count of render thread - */ - inline void SetFrameCount(unsigned int frameCount) - { - mFrameCount = frameCount; - } - - /** - * Get the frame count - */ - inline unsigned int GetFrameCount() - { - return mFrameCount; - } - - /** - * Increment the count of culled renderers - */ - inline void IncrementCulledCount() - { - mCulledCount++; - } - - /** - * Clear the count of culled renderers - */ - inline void ClearCulledCount() - { - mCulledCount = 0; - } - - /** - * Get the count of culled renderers in this frame - */ - inline unsigned int GetCulledCount() - { - return mCulledCount; - } - - /** - * Increment the count of culled renderers - */ - inline void IncrementRendererCount() - { - mRendererCount++; - } - - /** - * Clear the count of image renderers - */ - inline void ClearRendererCount() - { - mRendererCount = 0; - } - - /** - * Get the count of image renderers in this frame - */ - inline unsigned int GetRendererCount() - { - return mRendererCount; - } - private: // Implementation /** @@ -1770,7 +1789,7 @@ private: // Data // glBindTexture() state TextureUnit mActiveTextureUnit; - GLuint mBound2dTextureId[ MAX_TEXTURE_UNITS ]; ///< The ID passed to glBindTexture(GL_TEXTURE_2D) + GLuint mBoundTextureId[ MAX_TEXTURE_UNITS ]; ///< The ID passed to glBindTexture() // glBlendColor() state Vector4 mBlendColor; ///< Blend color @@ -1785,11 +1804,21 @@ private: // Data GLenum mBlendEquationSeparateModeRGB; ///< Controls RGB blend mode GLenum mBlendEquationSeparateModeAlpha; ///< Controls Alpha blend mode + // glStencilFunc() and glStencilOp() state. + GLenum mStencilFunc; + GLint mStencilFuncRef; + GLuint mStencilFuncMask; + GLenum mStencilOpFail; + GLenum mStencilOpDepthFail; + GLenum mStencilOpDepthPass; + + GLenum mDepthFunction; ///The depth function + GLint mMaxTextureSize; ///< return value from GetIntegerv(GL_MAX_TEXTURE_SIZE) Vector4 mClearColor; ///< clear color // Face culling mode - Dali::Material::FaceCullingMode mCullFaceMode; + Dali::FaceCullingMode::Type mCullFaceMode; // cached viewport size Rect< int > mViewPort; @@ -1798,14 +1827,13 @@ private: // Data bool mVertexAttributeCachedState[ MAX_ATTRIBUTE_CACHE_SIZE ]; ///< Value cache for Enable Vertex Attribute bool mVertexAttributeCurrentState[ MAX_ATTRIBUTE_CACHE_SIZE ]; ///< Current state on the driver for Enable Vertex Attribute - unsigned int mFrameCount; ///< Number of render frames - unsigned int mCulledCount; ///< Number of culled renderers per frame - unsigned int mRendererCount; ///< Number of image renderers per frame FrameBufferStateCache mFrameBufferStateCache; ///< frame buffer state cache + + std::vector< Context* >* mSceneContexts; ///< The pointer of the container of contexts for surface rendering }; } // namespace Internal } // namespace Dali -#endif // __DALI_INTERNAL_CONTEXT_H__ +#endif // DALI_INTERNAL_CONTEXT_H