X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=dali%2Finternal%2Fcommon%2Fcore-impl.cpp;h=ae5a35af166a58447bbe454cdec30cf2754ae819;hb=85a80d48b8627b6029033b9e70776edf7678393f;hp=26717432347372222e7c69ab4864e95bf71ca50a;hpb=539db4f38942263172ca11793621de3ac3b9c3b3;p=platform%2Fcore%2Fuifw%2Fdali-core.git diff --git a/dali/internal/common/core-impl.cpp b/dali/internal/common/core-impl.cpp old mode 100644 new mode 100755 index 2671743..ae5a35a --- a/dali/internal/common/core-impl.cpp +++ b/dali/internal/common/core-impl.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016 Samsung Electronics Co., Ltd. + * Copyright (c) 2017 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. @@ -37,28 +37,21 @@ #include #include #include -#include #include #include #include -#include #include -#include #include -#include #include #include -#include #include using Dali::Internal::SceneGraph::UpdateManager; using Dali::Internal::SceneGraph::RenderManager; using Dali::Internal::SceneGraph::DiscardQueue; using Dali::Internal::SceneGraph::RenderQueue; -using Dali::Internal::SceneGraph::TextureCache; -using Dali::Internal::SceneGraph::TextureCacheDispatcher; namespace { @@ -85,22 +78,17 @@ using Integration::Event; using Integration::UpdateStatus; using Integration::RenderStatus; -Core::Core( RenderController& renderController, PlatformAbstraction& platform, - GlAbstraction& glAbstraction, GlSyncAbstraction& glSyncAbstraction, - GestureManager& gestureManager, ResourcePolicy::DataRetention dataRetentionPolicy) +Core::Core( RenderController& renderController, + PlatformAbstraction& platform, + GlAbstraction& glAbstraction, + GlSyncAbstraction& glSyncAbstraction, + GestureManager& gestureManager, + ResourcePolicy::DataRetention dataRetentionPolicy, + Integration::RenderToFrameBuffer renderToFboEnabled, + Integration::DepthBufferAvailable depthBufferAvailable, + Integration::StencilBufferAvailable stencilBufferAvailable ) : mRenderController( renderController ), mPlatform(platform), - mGestureEventProcessor(NULL), - mEventProcessor(NULL), - mUpdateManager(NULL), - mRenderManager(NULL), - mDiscardQueue(NULL), - mTextureUploadedQueue(), - mNotificationManager(NULL), - mImageFactory(NULL), - mShaderFactory(NULL), - mGeometryBatcher( NULL ), - mIsActive(true), mProcessingEvent(false) { // Create the thread local storage @@ -115,77 +103,43 @@ Core::Core( RenderController& renderController, PlatformAbstraction& platform, mPropertyNotificationManager = PropertyNotificationManager::New(); - mTextureUploadedQueue = new LockedResourceQueue; - - mGeometryBatcher = new SceneGraph::GeometryBatcher(); - mRenderTaskProcessor = new SceneGraph::RenderTaskProcessor(); - mRenderManager = RenderManager::New( glAbstraction, glSyncAbstraction, *mGeometryBatcher, *mTextureUploadedQueue ); + mRenderManager = RenderManager::New( glAbstraction, glSyncAbstraction, depthBufferAvailable, stencilBufferAvailable ); RenderQueue& renderQueue = mRenderManager->GetRenderQueue(); - TextureCache& textureCache = mRenderManager->GetTextureCache(); - - ResourcePolicy::Discardable discardPolicy = ResourcePolicy::OWNED_DISCARD; - if( dataRetentionPolicy == ResourcePolicy::DALI_RETAINS_ALL_DATA ) - { - discardPolicy = ResourcePolicy::OWNED_RETAIN; - } - textureCache.SetDiscardBitmapsPolicy(discardPolicy); - - mTextureCacheDispatcher = new SceneGraph::TextureCacheDispatcher( renderQueue, textureCache ); mDiscardQueue = new DiscardQueue( renderQueue ); - mResourceManager = new ResourceManager( mPlatform, - *mNotificationManager, - *mTextureCacheDispatcher, - *mTextureUploadedQueue, - *mDiscardQueue, - renderQueue ); - mUpdateManager = new UpdateManager( *mNotificationManager, *mAnimationPlaylist, *mPropertyNotificationManager, - *mResourceManager, *mDiscardQueue, renderController, *mRenderManager, renderQueue, - *mTextureCacheDispatcher, - *mGeometryBatcher, *mRenderTaskProcessor ); mRenderManager->SetShaderSaver( *mUpdateManager ); - mStage = IntrusivePtr( Stage::New( *mAnimationPlaylist, *mPropertyNotificationManager, *mUpdateManager, *mNotificationManager ) ); + mStage = IntrusivePtr( Stage::New( *mAnimationPlaylist, *mPropertyNotificationManager, *mUpdateManager, *mNotificationManager, mRenderController ) ); // This must be called after stage is created but before stage initialization mRelayoutController = IntrusivePtr< RelayoutController >( new RelayoutController( mRenderController ) ); - mStage->Initialize(); - - mResourceClient = new ResourceClient( *mResourceManager, *mStage ); + mStage->Initialize( renderToFboEnabled == Integration::RenderToFrameBuffer::TRUE ); - mGestureEventProcessor = new GestureEventProcessor(*mStage, gestureManager, mRenderController); - mEventProcessor = new EventProcessor(*mStage, *mNotificationManager, *mGestureEventProcessor); + mGestureEventProcessor = new GestureEventProcessor( *mStage, *mUpdateManager, gestureManager, mRenderController ); + mEventProcessor = new EventProcessor( *mStage, *mNotificationManager, *mGestureEventProcessor ); - mImageFactory = new ImageFactory( *mResourceClient ); mShaderFactory = new ShaderFactory(); mUpdateManager->SetShaderSaver( *mShaderFactory ); - mShaderFactory->LoadDefaultShaders(); GetImplementation(Dali::TypeRegistry::Get()).CallInitFunctions(); } Core::~Core() { - /** - * TODO this should be done by Adaptor, Core does not know about threading - * First stop the resource loading thread(s) - */ - mPlatform.JoinLoaderThreads(); - /* * The order of destructing these singletons is important!!! */ @@ -197,6 +151,7 @@ Core::~Core() if( tls ) { tls->Remove(); + delete tls; } // Stop relayout requests being raised on stage destruction @@ -208,20 +163,6 @@ Core::~Core() // remove (last?) reference to stage mStage.Reset(); - delete mEventProcessor; - delete mGestureEventProcessor; - delete mNotificationManager; - delete mImageFactory; - delete mShaderFactory; - delete mResourceClient; - delete mResourceManager; - delete mDiscardQueue; - delete mTextureCacheDispatcher; - delete mUpdateManager; - delete mRenderManager; - delete mRenderTaskProcessor; - delete mGeometryBatcher; - delete mTextureUploadedQueue; } Integration::ContextNotifierInterface* Core::GetContextNotifier() @@ -233,7 +174,6 @@ void Core::RecoverFromContextLoss() { DALI_LOG_INFO(gCoreFilter, Debug::Verbose, "Core::RecoverFromContextLoss()\n"); - mImageFactory->RecoverFromContextLoss(); // Reload images from files mStage->GetRenderTaskList().RecoverFromContextLoss(); // Re-trigger render-tasks } @@ -256,6 +196,15 @@ void Core::SurfaceResized( unsigned int width, unsigned int height ) mRelayoutController->SetStageSize( size.width, size.height ); } +void Core::SurfaceResized( unsigned int width, unsigned int height, int orientation ) +{ + mStage->SurfaceResized( width, height, orientation ); + + // The stage-size may be less than surface-size (reduced by top-margin) + Vector2 size = mStage->GetSize(); + mRelayoutController->SetStageSize( size.width, size.height ); +} + void Core::SetTopMargin( unsigned int margin ) { mStage->SetTopMargin( margin ); @@ -270,7 +219,7 @@ void Core::SetDpi( unsigned int dpiHorizontal, unsigned int dpiVertical ) mStage->SetDpi( Vector2( dpiHorizontal , dpiVertical) ); } -void Core::Update( float elapsedSeconds, unsigned int lastVSyncTimeMilliseconds, unsigned int nextVSyncTimeMilliseconds, Integration::UpdateStatus& status ) +void Core::Update( float elapsedSeconds, unsigned int lastVSyncTimeMilliseconds, unsigned int nextVSyncTimeMilliseconds, Integration::UpdateStatus& status, bool renderToFboEnabled, bool isRenderingToFbo ) { // set the time delta so adaptor can easily print FPS with a release build with 0 as // it is cached by frametime @@ -280,43 +229,23 @@ void Core::Update( float elapsedSeconds, unsigned int lastVSyncTimeMilliseconds, // Use the estimated time diff till we render as the elapsed time. status.keepUpdating = mUpdateManager->Update( elapsedSeconds, lastVSyncTimeMilliseconds, - nextVSyncTimeMilliseconds ); + nextVSyncTimeMilliseconds, + renderToFboEnabled, + isRenderingToFbo ); // Check the Notification Manager message queue to set needsNotification status.needsNotification = mNotificationManager->MessagesToProcess(); + // Check if the default surface is changed + status.surfaceRectChanged = mUpdateManager->IsDefaultSurfaceRectChanged(); + // No need to keep update running if there are notifications to process. // Any message to update will wake it up anyways - - if ( mResourceManager->ResourcesToProcess() ) - { - // If we are still processing resources, then we have to continue the update - status.keepUpdating |= Integration::KeepUpdating::LOADING_RESOURCES; - } } void Core::Render( RenderStatus& status ) { - bool updateRequired = mRenderManager->Render( status ); - - status.SetNeedsUpdate( updateRequired ); -} - -void Core::Suspend() -{ - mPlatform.Suspend(); - - mIsActive = false; -} - -void Core::Resume() -{ - mPlatform.Resume(); - - mIsActive = true; - - // trigger processing of events queued up while paused - ProcessEvents(); + mRenderManager->Render( status ); } void Core::SceneCreated() @@ -337,7 +266,7 @@ void Core::ProcessEvents() if( mProcessingEvent ) { DALI_LOG_ERROR( "ProcessEvents should not be called from within ProcessEvents!\n" ); - mRenderController.RequestProcessEventsOnIdle(); + mRenderController.RequestProcessEventsOnIdle( false ); return; } @@ -351,29 +280,27 @@ void Core::ProcessEvents() mNotificationManager->ProcessMessages(); - // Avoid allocating MessageBuffers, triggering size-negotiation or sending any other spam whilst paused - if( mIsActive ) - { - // Emit signal here to inform listeners that event processing has finished. - mStage->EmitEventProcessingFinishedSignal(); + // Emit signal here to inform listeners that event processing has finished. + mStage->EmitEventProcessingFinishedSignal(); - // Run the size negotiation after event processing finished signal - mRelayoutController->Relayout(); + // Run the size negotiation after event processing finished signal + mRelayoutController->Relayout(); - // Flush discard queue for image factory - mImageFactory->FlushReleaseQueue(); + // Rebuild depth tree after event processing has finished + mStage->RebuildDepthTree(); - // Flush any queued messages for the update-thread - const bool messagesToProcess = mUpdateManager->FlushQueue(); + // Flush any queued messages for the update-thread + const bool messagesToProcess = mUpdateManager->FlushQueue(); - // Check if the touch or gestures require updates. - const bool gestureNeedsUpdate = mGestureEventProcessor->NeedsUpdate(); + // Check if the touch or gestures require updates. + const bool gestureNeedsUpdate = mGestureEventProcessor->NeedsUpdate(); + // Check if the next update is forced. + const bool forceUpdate = mStage->IsNextUpdateForced(); - if( messagesToProcess || gestureNeedsUpdate ) - { - // tell the render controller to keep update thread running - mRenderController.RequestUpdate(); - } + if( messagesToProcess || gestureNeedsUpdate || forceUpdate ) + { + // tell the render controller to keep update thread running + mRenderController.RequestUpdate( forceUpdate ); } mRelayoutController->SetProcessingCoreEvents( false ); @@ -437,21 +364,6 @@ NotificationManager& Core::GetNotificationManager() return *(mNotificationManager); } -ResourceManager& Core::GetResourceManager() -{ - return *(mResourceManager); -} - -ResourceClient& Core::GetResourceClient() -{ - return *(mResourceClient); -} - -ImageFactory& Core::GetImageFactory() -{ - return *(mImageFactory); -} - ShaderFactory& Core::GetShaderFactory() { return *(mShaderFactory); @@ -470,7 +382,7 @@ RelayoutController& Core::GetRelayoutController() void Core::CreateThreadLocalStorage() { // a pointer to the ThreadLocalStorage object will be stored in TLS - // and automatically deleted when the thread is killed + // The ThreadLocalStorage object should be deleted by the Core destructor new ThreadLocalStorage(this); }