X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=dali%2Finternal%2Frender%2Fgl-resources%2Fcontext.cpp;h=381293c179c961128c4f1b4709e6bcda46074e83;hb=e7e01e53658a0ec14c71af35ad4c00ce8a70a1b4;hp=9dd2f68fc06e20efb007846844d75f54738750f4;hpb=5c66381841dd4dfd82c5a118d34104a00a2e0e1c;p=platform%2Fcore%2Fuifw%2Fdali-core.git diff --git a/dali/internal/render/gl-resources/context.cpp b/dali/internal/render/gl-resources/context.cpp index 9dd2f68..381293c 100644 --- a/dali/internal/render/gl-resources/context.cpp +++ b/dali/internal/render/gl-resources/context.cpp @@ -1,35 +1,33 @@ -// -// Copyright (c) 2014 Samsung Electronics Co., Ltd. -// -// Licensed under the Flora License, Version 1.0 (the License); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://floralicense.org/license/ -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an AS IS BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// +/* + * Copyright (c) 2014 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. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ // CLASS HEADER #include // EXTERNAL INCLUDES #include -#include // INTERNAL INCLUDES #include -#include +#include #include #include #include -using namespace std; - namespace Dali { @@ -39,6 +37,8 @@ namespace Internal namespace // unnamed namespace { +DALI_COMPILE_TIME_ASSERT( TEXTURE_UNIT_LAST <= Context::MAX_TEXTURE_UNITS ); + /** * GL error strings */ @@ -56,21 +56,10 @@ errorStrings errors[] = { GL_OUT_OF_MEMORY, "GL_OUT_OF_MEMORY" } }; -/* - * Called by std::for_each from ~Context - */ -void deletePrograms(std::pair< std::size_t, Program* > hashProgram) -{ - DALI_ASSERT_DEBUG( hashProgram.second ); - delete hashProgram.second; -} - -const unsigned int UNINITIALIZED_TEXTURE_UNIT = std::numeric_limits::max();// GL_MAX_TEXTURE_UNITS can't be used because it's depreciated in gles2 - } // unnamed namespace #ifdef DEBUG_ENABLED -Debug::Filter* Context::gGlLogFilter = Debug::Filter::New(Debug::Concise, false, "LOG_CONTEXT"); +Debug::Filter* gContextLogFilter = Debug::Filter::New(Debug::Concise, false, "LOG_CONTEXT_STATE"); #endif Context::Context(Integration::GlAbstraction& glAbstraction) @@ -79,20 +68,21 @@ Context::Context(Integration::GlAbstraction& glAbstraction) mColorMask(true), mStencilMask(0xFF), mBlendEnabled(false), - mDepthTestEnabled(false), + mDepthBufferEnabled(false), mDepthMaskEnabled(false), mDitherEnabled(true), // This the only GL capability which defaults to true mPolygonOffsetFillEnabled(false), mSampleAlphaToCoverageEnabled(false), mSampleCoverageEnabled(false), mScissorTestEnabled(false), - mStencilTestEnabled(false), + mStencilBufferEnabled(false), mClearColorSet(false), + mUsingDefaultBlendColor(true), mBoundArrayBufferId(0), mBoundElementArrayBufferId(0), mBoundTransformFeedbackBufferId(0), - mActiveTextureUnit( UNINITIALIZED_TEXTURE_UNIT ), - mUsingDefaultBlendColor(true), + mActiveTextureUnit( TEXTURE_UNIT_LAST ), + mBlendColor(Color::TRANSPARENT), mBlendFuncSeparateSrcRGB(GL_ONE), mBlendFuncSeparateDstRGB(GL_ZERO), mBlendFuncSeparateSrcAlpha(GL_ONE), @@ -100,23 +90,23 @@ Context::Context(Integration::GlAbstraction& glAbstraction) mBlendEquationSeparateModeRGB( GL_FUNC_ADD ), mBlendEquationSeparateModeAlpha( GL_FUNC_ADD ), mMaxTextureSize(0), - mMaxTextureUnits(0), mClearColor(Color::WHITE), // initial color, never used until it's been set by the user mCullFaceMode(CullNone), mViewPort( 0, 0, 0, 0 ), - mCurrentProgram( NULL ) + mFrameCount( 0 ), + mCulledCount( 0 ), + mRendererCount( 0 ) { } Context::~Context() { - // release the cached programs - std::for_each(mProgramCache.begin(), mProgramCache.end(), deletePrograms); - mProgramCache.clear(); } void Context::GlContextCreated() { + DALI_LOG_INFO(gContextLogFilter, Debug::Verbose, "Context::GlContextCreated()\n"); + DALI_ASSERT_DEBUG(!mGlContextCreated); mGlContextCreated = true; @@ -124,21 +114,14 @@ void Context::GlContextCreated() // Set the initial GL state, and check it. ResetGlState(); - const ProgramContainer::iterator endp = mProgramCache.end(); - for ( ProgramContainer::iterator itp = mProgramCache.begin(); itp != endp; ++itp ) - { - (*itp).second->GlContextCreated(); - } +#ifdef DEBUG_ENABLED + PrintCurrentState(); +#endif } void Context::GlContextDestroyed() { - const ProgramContainer::iterator endp = mProgramCache.end(); - for ( ProgramContainer::iterator itp = mProgramCache.begin(); itp != endp; ++itp ) - { - (*itp).second->GlContextDestroyed(); - } - + DALI_LOG_INFO(gContextLogFilter, Debug::Verbose, "Context::GlContextDestroyed()\n"); mGlContextCreated = false; } @@ -154,22 +137,6 @@ const char* Context::ErrorToString( GLenum errorCode ) return "Unknown Open GLES error"; } -Program* Context::GetCachedProgram( std::size_t hash ) const -{ - std::map< std::size_t, Program* >::const_iterator iter = mProgramCache.find(hash); - - if (iter != mProgramCache.end()) - { - return iter->second; - } - return NULL; -} - -void Context::CacheProgram( std::size_t hash, Program* pointer ) -{ - mProgramCache[ hash ] = pointer; -} - const Rect< int >& Context::GetViewport() { return mViewPort; @@ -189,12 +156,12 @@ void Context::FlushVertexAttributeLocations() if (mVertexAttributeCurrentState[ i ] ) { LOG_GL("EnableVertexAttribArray %d\n", i); - CHECK_GL( *this, mGlAbstraction.EnableVertexAttribArray( i ) ); + CHECK_GL( mGlAbstraction, mGlAbstraction.EnableVertexAttribArray( i ) ); } else { LOG_GL("DisableVertexAttribArray %d\n", i); - CHECK_GL( *this, mGlAbstraction.DisableVertexAttribArray( i ) ); + CHECK_GL( mGlAbstraction, mGlAbstraction.DisableVertexAttribArray( i ) ); } } } @@ -210,12 +177,12 @@ void Context::SetVertexAttributeLocation(unsigned int location, bool state) if ( state ) { LOG_GL("EnableVertexAttribArray %d\n", location); - CHECK_GL( *this, mGlAbstraction.EnableVertexAttribArray( location ) ); + CHECK_GL( mGlAbstraction, mGlAbstraction.EnableVertexAttribArray( location ) ); } else { LOG_GL("DisableVertexAttribArray %d\n", location); - CHECK_GL( *this, mGlAbstraction.DisableVertexAttribArray( location ) ); + CHECK_GL( mGlAbstraction, mGlAbstraction.DisableVertexAttribArray( location ) ); } } else @@ -235,12 +202,13 @@ void Context::ResetVertexAttributeState() mVertexAttributeCurrentState[ i ] = false; LOG_GL("DisableVertexAttribArray %d\n", i); - CHECK_GL( *this, mGlAbstraction.DisableVertexAttribArray( i ) ); + CHECK_GL( mGlAbstraction, mGlAbstraction.DisableVertexAttribArray( i ) ); } } void Context::ResetGlState() { + DALI_LOG_INFO(gContextLogFilter, Debug::Verbose, "Context::ResetGlState()\n"); DALI_ASSERT_DEBUG(mGlContextCreated); mClearColorSet = false; @@ -258,7 +226,7 @@ void Context::ResetGlState() mBlendEnabled = false; mGlAbstraction.Disable(GL_BLEND); - mDepthTestEnabled = false; + mDepthBufferEnabled = false; mGlAbstraction.Disable(GL_DEPTH_TEST); mDepthMaskEnabled = false; @@ -279,7 +247,7 @@ void Context::ResetGlState() mScissorTestEnabled = false; mGlAbstraction.Disable(GL_SCISSOR_TEST); - mStencilTestEnabled = false; + mStencilBufferEnabled = false; mGlAbstraction.Disable(GL_STENCIL_TEST); mBoundArrayBufferId = 0; @@ -296,7 +264,7 @@ void Context::ResetGlState() mGlAbstraction.BindBuffer(GL_TRANSFORM_FEEDBACK_BUFFER, mBoundTransformFeedbackBufferId); #endif - mActiveTextureUnit = UNINITIALIZED_TEXTURE_UNIT; + mActiveTextureUnit = TEXTURE_UNIT_LAST; mUsingDefaultBlendColor = true; mGlAbstraction.BlendColor( 0.0f, 0.0f, 0.0f, 0.0f ); @@ -318,43 +286,33 @@ void Context::ResetGlState() mGlAbstraction.FrontFace(GL_CCW); mGlAbstraction.CullFace(GL_BACK); - // get max texture units - mGlAbstraction.GetIntegerv(GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS, &mMaxTextureUnits); - DALI_ASSERT_DEBUG(mMaxTextureUnits > 7); // according to GLES 2.0 specification - mBound2dTextureId.reserve(mMaxTextureUnits); - // rebind texture units - for( int i=0; i < mMaxTextureUnits; ++i ) + // rebind texture units to 0 + for( unsigned int i=0; i < MAX_TEXTURE_UNITS; ++i ) { mBound2dTextureId[ i ] = 0; // set active texture mGlAbstraction.ActiveTexture( GL_TEXTURE0 + i ); - // bind the previous texture mGlAbstraction.BindTexture(GL_TEXTURE_2D, mBound2dTextureId[ i ] ); } // get maximum texture size mGlAbstraction.GetIntegerv(GL_MAX_TEXTURE_SIZE, &mMaxTextureSize); - GLint numProgramBinaryFormats; - mGlAbstraction.GetIntegerv(GL_NUM_PROGRAM_BINARY_FORMATS_OES, &numProgramBinaryFormats); - if( GL_NO_ERROR == mGlAbstraction.GetError() && 0 != numProgramBinaryFormats ) - { - mProgramBinaryFormats.resize(numProgramBinaryFormats); - mGlAbstraction.GetIntegerv(GL_PROGRAM_BINARY_FORMATS_OES, &mProgramBinaryFormats[0]); - } - // reset viewport, this will be set to something useful when rendering mViewPort.x = mViewPort.y = mViewPort.width = mViewPort.height = 0; ResetVertexAttributeState(); + + mFrameBufferStateCache.Reset(); } -#ifdef DALI_CONTEXT_LOGGING +#ifdef DEBUG_ENABLED void Context::PrintCurrentState() { - DALI_LOG_INFO(SceneGraph::Context::gGlLogFilter, Debug::General, - "----------------- Context State BEGIN -----------------\n" + const char* cullFaceModes[] = { "CullNone", "CullFront", "CullBack", "CullFrontAndBack" }; + DALI_LOG_INFO( gContextLogFilter, Debug::General, + "\n----------------- Context State BEGIN -----------------\n" "Blend = %s\n" "Cull Face = %s\n" "Depth Test = %s\n" @@ -367,14 +325,15 @@ void Context::PrintCurrentState() "Stencil Test = %s\n" "----------------- Context State END -----------------\n", mBlendEnabled ? "Enabled" : "Disabled", - mDepthTestEnabled ? "Enabled" : "Disabled", + cullFaceModes[ mCullFaceMode ], + mDepthBufferEnabled ? "Enabled" : "Disabled", mDepthMaskEnabled ? "Enabled" : "Disabled", mDitherEnabled ? "Enabled" : "Disabled", mPolygonOffsetFillEnabled ? "Enabled" : "Disabled", mSampleAlphaToCoverageEnabled ? "Enabled" : "Disabled", mSampleCoverageEnabled ? "Enabled" : "Disabled", mScissorTestEnabled ? "Enabled" : "Disabled", - mStencilTestEnabled ? "Enabled" : "Disabled"); + mStencilBufferEnabled ? "Enabled" : "Disabled"); } #endif // DALI_CONTEXT_LOGGING