X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=dali%2Finternal%2Frender%2Fcommon%2Frender-manager.cpp;h=d8192287da01709a50e475714561d12273f3de71;hb=38c9e1749272ac03d2588492614b456c6570a1bd;hp=116037a7816816872f60b6c82312bb7288c3a3de;hpb=3093e25cc4f139eb4b40541202fe9341b9ab6610;p=platform%2Fcore%2Fuifw%2Fdali-core.git diff --git a/dali/internal/render/common/render-manager.cpp b/dali/internal/render/common/render-manager.cpp old mode 100644 new mode 100755 index 116037a..d819228 --- a/dali/internal/render/common/render-manager.cpp +++ b/dali/internal/render/common/render-manager.cpp @@ -48,53 +48,6 @@ Debug::Filter* gLogFilter = Debug::Filter::New(Debug::NoLogging, false, "LOG_REN } // unnamed namespace #endif -struct DirtyRect -{ - DirtyRect(Node* node, Render::Renderer* renderer, int frame, Rect& rect) - : node(node), - renderer(renderer), - frame(frame), - rect(rect), - visited(true) - { - } - - DirtyRect() - : node(nullptr), - renderer(nullptr), - frame(0), - rect(), - visited(true) - { - } - - bool operator<(const DirtyRect& rhs) const - { - if (node == rhs.node) - { - if (renderer == rhs.renderer) - { - return frame > rhs.frame; // Most recent rects come first - } - else - { - return renderer < rhs.renderer; - } - } - else - { - return node < rhs.node; - } - } - - Node* node; - Render::Renderer* renderer; - int frame; - - Rect rect; - bool visited; -}; - /** * Structure to contain internal data */ @@ -125,7 +78,6 @@ struct RenderManager::Impl depthBufferAvailable( depthBufferAvailableParam ), stencilBufferAvailable( stencilBufferAvailableParam ), partialUpdateAvailable( partialUpdateAvailableParam ), - itemsCheckSum(0), defaultSurfaceOrientation( 0 ) { // Create thread pool with just one thread ( there may be a need to create more threads in the future ). @@ -151,22 +103,27 @@ struct RenderManager::Impl Context* CreateSceneContext() { - sceneContextContainer.push_back( new Context( glAbstraction ) ); - return sceneContextContainer[ sceneContextContainer.size() - 1 ]; + Context* context = new Context( glAbstraction ); + sceneContextContainer.PushBack( context ); + return context; } void DestroySceneContext( Context* sceneContext ) { - auto iter = std::find( sceneContextContainer.begin(), sceneContextContainer.end(), sceneContext ); - if( iter != sceneContextContainer.end() ) + auto iter = std::find( sceneContextContainer.Begin(), sceneContextContainer.End(), sceneContext ); + if( iter != sceneContextContainer.End() ) { - sceneContextContainer.erase( iter ); + ( *iter )->GlContextDestroyed(); + sceneContextContainer.Erase( iter ); } } Context* ReplaceSceneContext( Context* oldSceneContext ) { Context* newContext = new Context( glAbstraction ); + + oldSceneContext->GlContextDestroyed(); + std::replace( sceneContextContainer.begin(), sceneContextContainer.end(), oldSceneContext, newContext ); return newContext; } @@ -183,7 +140,7 @@ struct RenderManager::Impl // programs are owned by context at the moment. Context context; ///< Holds the GL state of the share resource context Context* currentContext; ///< Holds the GL state of the current context for rendering - std::vector< Context* > sceneContextContainer; ///< List of owned contexts holding the GL state per scene + OwnerContainer< Context* > sceneContextContainer; ///< List of owned contexts holding the GL state per scene Integration::GlAbstraction& glAbstraction; ///< GL abstraction Integration::GlSyncAbstraction& glSyncAbstraction; ///< GL sync abstraction Integration::GlContextHelperAbstraction& glContextHelperAbstraction; ///< GL context helper abstraction @@ -202,7 +159,7 @@ struct RenderManager::Impl OwnerContainer< Render::Sampler* > samplerContainer; ///< List of owned samplers OwnerContainer< Render::Texture* > textureContainer; ///< List of owned textures OwnerContainer< Render::FrameBuffer* > frameBufferContainer; ///< List of owned framebuffers - OwnerContainer< Render::PropertyBuffer* > propertyBufferContainer; ///< List of owned property buffers + OwnerContainer< Render::VertexBuffer* > vertexBufferContainer; ///< List of owned vertex buffers OwnerContainer< Render::Geometry* > geometryContainer; ///< List of owned Geometries bool lastFrameWasRendered; ///< Keeps track of the last frame being rendered due to having render instructions @@ -218,8 +175,6 @@ struct RenderManager::Impl std::unique_ptr threadPool; ///< The thread pool Vector boundTextures; ///< The textures bound for rendering Vector textureDependencyList; ///< The dependency list of binded textures - std::size_t itemsCheckSum; ///< The damaged render items checksum from previous prerender phase. - std::vector itemsDirtyRects; int defaultSurfaceOrientation; ///< defaultSurfaceOrientation for the default surface we are rendering to }; @@ -241,7 +196,7 @@ RenderManager* RenderManager::New( Integration::GlAbstraction& glAbstraction, } RenderManager::RenderManager() -: mImpl(NULL) +: mImpl(nullptr) { } @@ -287,10 +242,10 @@ void RenderManager::ContextDestroyed() renderer->GlContextDestroyed(); } - // inform scenes - for( auto&& scene : mImpl->sceneContainer ) + // inform context + for( auto&& context : mImpl->sceneContextContainer ) { - scene->GlContextDestroyed(); + context->GlContextDestroyed(); } } @@ -438,24 +393,24 @@ void RenderManager::AttachDepthStencilTextureToFrameBuffer( Render::FrameBuffer* frameBuffer->AttachDepthStencilTexture( mImpl->context, texture, mipmapLevel ); } -void RenderManager::AddPropertyBuffer( OwnerPointer< Render::PropertyBuffer >& propertyBuffer ) +void RenderManager::AddVertexBuffer( OwnerPointer< Render::VertexBuffer >& vertexBuffer ) { - mImpl->propertyBufferContainer.PushBack( propertyBuffer.Release() ); + mImpl->vertexBufferContainer.PushBack( vertexBuffer.Release() ); } -void RenderManager::RemovePropertyBuffer( Render::PropertyBuffer* propertyBuffer ) +void RenderManager::RemoveVertexBuffer( Render::VertexBuffer* vertexBuffer ) { - mImpl->propertyBufferContainer.EraseObject( propertyBuffer ); + mImpl->vertexBufferContainer.EraseObject( vertexBuffer ); } -void RenderManager::SetPropertyBufferFormat( Render::PropertyBuffer* propertyBuffer, OwnerPointer< Render::PropertyBuffer::Format>& format ) +void RenderManager::SetVertexBufferFormat( Render::VertexBuffer* vertexBuffer, OwnerPointer< Render::VertexBuffer::Format>& format ) { - propertyBuffer->SetFormat( format.Release() ); + vertexBuffer->SetFormat( format.Release() ); } -void RenderManager::SetPropertyBufferData( Render::PropertyBuffer* propertyBuffer, OwnerPointer< Vector >& data, uint32_t size ) +void RenderManager::SetVertexBufferData( Render::VertexBuffer* vertexBuffer, OwnerPointer< Vector >& data, uint32_t size ) { - propertyBuffer->SetData( data.Release(), size ); + vertexBuffer->SetData( data.Release(), size ); } void RenderManager::SetIndexBuffer( Render::Geometry* geometry, Dali::Vector& indices ) @@ -473,7 +428,7 @@ void RenderManager::RemoveGeometry( Render::Geometry* geometry ) mImpl->geometryContainer.EraseObject( geometry ); } -void RenderManager::AttachVertexBuffer( Render::Geometry* geometry, Render::PropertyBuffer* propertyBuffer ) +void RenderManager::AttachVertexBuffer( Render::Geometry* geometry, Render::VertexBuffer* vertexBuffer ) { DALI_ASSERT_DEBUG( NULL != geometry ); @@ -482,13 +437,13 @@ void RenderManager::AttachVertexBuffer( Render::Geometry* geometry, Render::Prop { if ( iter == geometry ) { - iter->AddPropertyBuffer( propertyBuffer ); + iter->AddVertexBuffer( vertexBuffer ); break; } } } -void RenderManager::RemoveVertexBuffer( Render::Geometry* geometry, Render::PropertyBuffer* propertyBuffer ) +void RenderManager::RemoveVertexBuffer( Render::Geometry* geometry, Render::VertexBuffer* vertexBuffer ) { DALI_ASSERT_DEBUG( NULL != geometry ); @@ -497,7 +452,7 @@ void RenderManager::RemoveVertexBuffer( Render::Geometry* geometry, Render::Prop { if ( iter == geometry ) { - iter->RemovePropertyBuffer( propertyBuffer ); + iter->RemoveVertexBuffer( vertexBuffer ); break; } } @@ -650,15 +605,19 @@ void RenderManager::PreRender( Integration::Scene& scene, std::vector> // Clean collected dirty/damaged rects on exit if 3d layer or 3d node or other conditions. DamagedRectsCleaner damagedRectCleaner(damagedRects); + + + Internal::Scene& sceneInternal = GetImplementation(scene); + SceneGraph::Scene* sceneObject = sceneInternal.GetSceneObject(); + // Mark previous dirty rects in the sorted array. The array is already sorted by node and renderer, frame number. - // so you don't need to sort: std::stable_sort(mImpl->itemsDirtyRects.begin(), mImpl->itemsDirtyRects.end()); - for (DirtyRect& dirtyRect : mImpl->itemsDirtyRects) + // so you don't need to sort: std::stable_sort(itemsDirtyRects.begin(), itemsDirtyRects.end()); + std::vector& itemsDirtyRects = sceneInternal.GetItemsDirtyRects(); + for (DirtyRect& dirtyRect : itemsDirtyRects) { dirtyRect.visited = false; } - Internal::Scene& sceneInternal = GetImplementation(scene); - SceneGraph::Scene* sceneObject = sceneInternal.GetSceneObject(); uint32_t count = sceneObject->GetRenderInstructions().Count( mImpl->renderBufferIndex ); for (uint32_t i = 0; i < count; ++i) { @@ -761,11 +720,11 @@ void RenderManager::PreRender( Integration::Scene& scene, std::vector> // 2. Mark the related dirty rects as visited so they will not be removed below. // 3. Keep only last 3 dirty rects for the same node and renderer (Tizen uses 3 back buffers, Ubuntu 1). dirtyRect.rect = rect; - auto dirtyRectPos = std::lower_bound(mImpl->itemsDirtyRects.begin(), mImpl->itemsDirtyRects.end(), dirtyRect); - dirtyRectPos = mImpl->itemsDirtyRects.insert(dirtyRectPos, dirtyRect); + auto dirtyRectPos = std::lower_bound(itemsDirtyRects.begin(), itemsDirtyRects.end(), dirtyRect); + dirtyRectPos = itemsDirtyRects.insert(dirtyRectPos, dirtyRect); int c = 1; - while (++dirtyRectPos != mImpl->itemsDirtyRects.end()) + while (++dirtyRectPos != itemsDirtyRects.end()) { if (dirtyRectPos->node != item.mNode || dirtyRectPos->renderer != item.mRenderer) { @@ -779,7 +738,7 @@ void RenderManager::PreRender( Integration::Scene& scene, std::vector> c++; if (c > 3) // no more then 3 previous rects { - mImpl->itemsDirtyRects.erase(dirtyRectPos); + itemsDirtyRects.erase(dirtyRectPos); break; } } @@ -791,8 +750,8 @@ void RenderManager::PreRender( Integration::Scene& scene, std::vector> { // 1. The item is not dirty, the node and renderer referenced by the item are still exist. // 2. Mark the related dirty rects as visited so they will not be removed below. - auto dirtyRectPos = std::lower_bound(mImpl->itemsDirtyRects.begin(), mImpl->itemsDirtyRects.end(), dirtyRect); - while (dirtyRectPos != mImpl->itemsDirtyRects.end()) + auto dirtyRectPos = std::lower_bound(itemsDirtyRects.begin(), itemsDirtyRects.end(), dirtyRect); + while (dirtyRectPos != itemsDirtyRects.end()) { if (dirtyRectPos->node != item.mNode || dirtyRectPos->renderer != item.mRenderer) { @@ -810,9 +769,9 @@ void RenderManager::PreRender( Integration::Scene& scene, std::vector> } // Check removed nodes or removed renderers dirty rects - auto i = mImpl->itemsDirtyRects.begin(); - auto j = mImpl->itemsDirtyRects.begin(); - while (i != mImpl->itemsDirtyRects.end()) + auto i = itemsDirtyRects.begin(); + auto j = itemsDirtyRects.begin(); + while (i != itemsDirtyRects.end()) { if (i->visited) { @@ -826,7 +785,7 @@ void RenderManager::PreRender( Integration::Scene& scene, std::vector> i++; } - mImpl->itemsDirtyRects.resize(j - mImpl->itemsDirtyRects.begin()); + itemsDirtyRects.resize(j - itemsDirtyRects.begin()); damagedRectCleaner.SetCleanOnReturn(false); } @@ -906,7 +865,8 @@ void RenderManager::RenderScene( Integration::RenderStatus& status, Integration: surfaceRect = Rect( 0, 0, static_cast( scene.GetSize().width ), static_cast( scene.GetSize().height ) ); } - DALI_ASSERT_DEBUG( mImpl->currentContext->IsGlContextCreated() ); + // Make sure that GL context must be created + mImpl->currentContext->GlContextCreated(); // reset the program matrices for all programs once per frame // this ensures we will set view and projection matrix once per program per camera @@ -956,7 +916,7 @@ void RenderManager::RenderScene( Integration::RenderStatus& status, Integration: clearMask |= GL_STENCIL_BUFFER_BIT; } - if( !instruction.mIgnoreRenderToFbo && ( instruction.mFrameBuffer != 0 ) ) + if( !instruction.mIgnoreRenderToFbo && ( instruction.mFrameBuffer != nullptr ) ) { // Offscreen buffer rendering if ( instruction.mIsViewportSet ) @@ -994,7 +954,7 @@ void RenderManager::RenderScene( Integration::RenderStatus& status, Integration: } bool clearFullFrameRect = true; - if( instruction.mFrameBuffer != 0 ) + if( instruction.mFrameBuffer != nullptr ) { Viewport frameRect( 0, 0, instruction.mFrameBuffer->GetWidth(), instruction.mFrameBuffer->GetHeight() ); clearFullFrameRect = ( frameRect == viewportRect );