X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=dali%2Finternal%2Fadaptor%2Fcommon%2Fadaptor-impl.cpp;h=e06310a26957df7c8a41ec4894c649403672c10c;hb=refs%2Fchanges%2F97%2F227397%2F12;hp=2c297e08de933bf7f5ba375c8caf77be141fa11a;hpb=39bf8d66176ecfa1863e294f447cfedba28722c8;p=platform%2Fcore%2Fuifw%2Fdali-adaptor.git diff --git a/dali/internal/adaptor/common/adaptor-impl.cpp b/dali/internal/adaptor/common/adaptor-impl.cpp index 2c297e0..e06310a 100755 --- a/dali/internal/adaptor/common/adaptor-impl.cpp +++ b/dali/internal/adaptor/common/adaptor-impl.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019 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. @@ -34,13 +34,12 @@ #include #include -#include - // INTERNAL INCLUDES #include #include #include #include +#include #include #include // Temporary until Core is abstracted @@ -58,6 +57,7 @@ #include #include #include +#include // For Utils::MakeUnique #include #include @@ -67,7 +67,8 @@ #include #include -#include +#include +#include using Dali::TextAbstraction::FontClient; @@ -84,7 +85,9 @@ namespace Adaptor namespace { + thread_local Adaptor* gThreadLocalAdaptor = NULL; // raw thread specific pointer to allow Adaptor::Get + } // unnamed namespace Dali::Adaptor* Adaptor::New( Dali::Integration::SceneHolder window, Dali::RenderSurfaceInterface *surface, Dali::Configuration::ContextLoss configuration, EnvironmentOptions* environmentOptions ) @@ -142,14 +145,6 @@ void Adaptor::Initialize( GraphicsFactory& graphicsFactory, Dali::Configuration: GetDataStoragePath( path ); mPlatformAbstraction->SetDataStoragePath( path ); - ResourcePolicy::DataRetention dataRetentionPolicy = ResourcePolicy::DALI_DISCARDS_ALL_DATA; - if( configuration == Dali::Configuration::APPLICATION_DOES_NOT_HANDLE_CONTEXT_LOSS ) - { - dataRetentionPolicy = ResourcePolicy::DALI_DISCARDS_ALL_DATA; - } - - // Note, Tizen does not use DALI_RETAINS_ALL_DATA, as it can reload images from files automatically. - if( mEnvironmentOptions->PerformanceServerRequired() ) { mPerformanceInterface = PerformanceInterfaceFactory::CreateInterface( *this, *mEnvironmentOptions ); @@ -181,7 +176,6 @@ void Adaptor::Initialize( GraphicsFactory& graphicsFactory, Dali::Configuration: mGLES, eglSyncImpl, eglContextHelperImpl, - dataRetentionPolicy , ( 0u != mEnvironmentOptions->GetRenderToFboInterval() ) ? Integration::RenderToFrameBuffer::TRUE : Integration::RenderToFrameBuffer::FALSE, mGraphics->GetDepthBufferRequired(), mGraphics->GetStencilBufferRequired() ); @@ -198,7 +192,7 @@ void Adaptor::Initialize( GraphicsFactory& graphicsFactory, Dali::Configuration: mObjectProfiler = new ObjectProfiler( timeInterval ); } - mNotificationTrigger = mTriggerEventFactory.CreateTriggerEvent( MakeCallback( this, &Adaptor::ProcessCoreEvents ), TriggerEventInterface::KEEP_ALIVE_AFTER_TRIGGER); + mNotificationTrigger = TriggerEventFactory::CreateTriggerEvent( MakeCallback( this, &Adaptor::ProcessCoreEvents ), TriggerEventInterface::KEEP_ALIVE_AFTER_TRIGGER); mDisplayConnection = Dali::DisplayConnection::New( *mGraphics, defaultWindow->GetSurface()->GetSurfaceType() ); @@ -281,46 +275,39 @@ void Adaptor::Initialize( GraphicsFactory& graphicsFactory, Dali::Configuration: { Integration::SetPinchGestureMinimumDistance( mEnvironmentOptions->GetMinimumPinchDistance() ); } - - // Set max texture size - if( mEnvironmentOptions->GetMaxTextureSize() > 0 ) + if( mEnvironmentOptions->GetMinimumPinchTouchEvents() >= 0 ) { - Dali::TizenPlatform::ImageLoader::SetMaxTextureSize( mEnvironmentOptions->GetMaxTextureSize() ); + Integration::SetPinchGestureMinimumTouchEvents( mEnvironmentOptions->GetMinimumPinchTouchEvents() ); + } + if( mEnvironmentOptions->GetMinimumPinchTouchEventsAfterStart() >= 0 ) + { + Integration::SetPinchGestureMinimumTouchEventsAfterStart( mEnvironmentOptions->GetMinimumPinchTouchEventsAfterStart() ); + } + if( mEnvironmentOptions->GetMinimumRotationTouchEvents() >= 0 ) + { + Integration::SetRotationGestureMinimumTouchEvents( mEnvironmentOptions->GetMinimumRotationTouchEvents() ); + } + if( mEnvironmentOptions->GetMinimumRotationTouchEventsAfterStart() >= 0 ) + { + Integration::SetRotationGestureMinimumTouchEventsAfterStart( mEnvironmentOptions->GetMinimumRotationTouchEventsAfterStart() ); + } + if( mEnvironmentOptions->GetLongPressMinimumHoldingTime() >= 0 ) + { + Integration::SetLongPressMinimumHoldingTime( mEnvironmentOptions->GetLongPressMinimumHoldingTime() ); } std::string systemCachePath = GetSystemCachePath(); - if ( ! systemCachePath.empty() ) + if( ! systemCachePath.empty() ) { - Dali::FileStream fileStream( systemCachePath + "gpu-environment.conf", Dali::FileStream::READ | Dali::FileStream::TEXT ); - std::fstream& stream = dynamic_cast( fileStream.GetStream() ); - if( stream.is_open() ) + const int dir_err = system( std::string( "mkdir " + systemCachePath ).c_str() ); + if (-1 == dir_err) { - std::string line; - while( std::getline( stream, line ) ) - { - line.erase( line.find_last_not_of( " \t\r\n" ) + 1 ); - line.erase( 0, line.find_first_not_of( " \t\r\n" ) ); - if( '#' == *( line.cbegin() ) || line == "" ) - { - continue; - } - - std::istringstream stream( line ); - std::string environmentVariableName, environmentVariableValue; - std::getline(stream, environmentVariableName, ' '); - if( environmentVariableName == "DALI_ENV_MAX_TEXTURE_SIZE" && mEnvironmentOptions->GetMaxTextureSize() == 0 ) - { - std::getline(stream, environmentVariableValue); - setenv( environmentVariableName.c_str() , environmentVariableValue.c_str(), 1 ); - Dali::TizenPlatform::ImageLoader::SetMaxTextureSize( std::atoi( environmentVariableValue.c_str() ) ); - } - } - } - else - { - DALI_LOG_ERROR( "Fail to open file : %s\n", ( systemCachePath + "gpu-environment.conf" ).c_str() ); + printf( "Error creating system cache directory: %s!\n", systemCachePath.c_str() ); + exit(1); } } + + mConfigurationManager = Utils::MakeUnique( systemCachePath, eglGraphics, mThreadController ); } Adaptor::~Adaptor() @@ -390,29 +377,16 @@ void Adaptor::Start() // Initialize the thread controller mThreadController->Initialize(); - if( !Dali::TizenPlatform::ImageLoader::MaxTextureSizeUpdated() ) + // Set max texture size + if( mEnvironmentOptions->GetMaxTextureSize() > 0 ) { - auto eglGraphics = static_cast( mGraphics ); - GlImplementation& mGLES = eglGraphics->GetGlesInterface(); - Dali::TizenPlatform::ImageLoader::SetMaxTextureSize( mGLES.GetMaxTextureSize() ); - - std::string systemCachePath = GetSystemCachePath(); - if( ! systemCachePath.empty() ) - { - const int dir_err = system( std::string( "mkdir " + systemCachePath ).c_str() ); - if (-1 == dir_err) - { - printf("Error creating directory!n"); - exit(1); - } - - Dali::FileStream fileStream( systemCachePath + "gpu-environment.conf", Dali::FileStream::WRITE | Dali::FileStream::TEXT ); - std::fstream& configFile = dynamic_cast( fileStream.GetStream() ); - if( configFile.is_open() ) - { - configFile << "DALI_ENV_MAX_TEXTURE_SIZE " << mGLES.GetMaxTextureSize() << std::endl; - } - } + Dali::TizenPlatform::ImageLoader::SetMaxTextureSize( mEnvironmentOptions->GetMaxTextureSize() ); + } + else + { + unsigned int maxTextureSize = mConfigurationManager->GetMaxTextureSize(); + setenv( DALI_ENV_MAX_TEXTURE_SIZE, std::to_string( maxTextureSize ).c_str(), 1 ); + Dali::TizenPlatform::ImageLoader::SetMaxTextureSize( maxTextureSize ); } ProcessCoreEvents(); // Ensure any startup messages are processed. @@ -581,16 +555,6 @@ void Adaptor::ReplaceSurface( Dali::Integration::SceneHolder window, Dali::Rende } } -void Adaptor::DeleteSurface( Dali::RenderSurfaceInterface& surface ) -{ - // Flush the event queue to give the update-render thread chance - // to start processing messages for new camera setup etc as soon as possible - ProcessCoreEvents(); - - // This method blocks until the render thread has finished rendering the current surface. - mThreadController->DeleteSurface( &surface ); -} - Dali::RenderSurfaceInterface& Adaptor::GetSurface() const { return *mWindows.front()->GetSurface(); @@ -630,6 +594,12 @@ void Adaptor::RemoveIdle( CallbackBase* callback ) mCallbackManager->RemoveIdleCallback( callback ); } +void Adaptor::ProcessIdle() +{ + bool idleProcessed = mCallbackManager->ProcessIdle(); + mNotificationOnIdleInstalled = mNotificationOnIdleInstalled && !idleProcessed; +} + void Adaptor::SetPreRenderCallback( CallbackBase* callback ) { mThreadController->SetPreRenderCallback( callback ); @@ -643,6 +613,10 @@ bool Adaptor::AddWindow( Dali::Integration::SceneHolder childWindow, const std:: // Add the new Window to the container - the order is not important mWindows.push_back( &windowImpl ); + Dali::RenderSurfaceInterface* surface = windowImpl.GetSurface(); + + mThreadController->AddSurface( surface ); + mWindowCreatedSignal.Emit( childWindow ); return true; @@ -739,11 +713,6 @@ TriggerEventInterface& Adaptor::GetProcessCoreEventsTrigger() return *mNotificationTrigger; } -TriggerEventFactoryInterface& Adaptor::GetTriggerEventFactoryInterface() -{ - return mTriggerEventFactory; -} - SocketFactoryInterface& Adaptor::GetSocketFactoryInterface() { return mSocketFactory; @@ -780,6 +749,11 @@ Integration::PlatformAbstraction& Adaptor::GetPlatformAbstraction() const return *mPlatformAbstraction; } +void Adaptor::GetWindowContainerInterface( WindowContainer& windows ) +{ + windows = mWindows; +} + void Adaptor::DestroyTtsPlayer(Dali::TtsPlayer::Mode mode) { if( mTtsPlayers[mode] ) @@ -889,11 +863,10 @@ void Adaptor::RequestUpdate( bool forceUpdate ) case PAUSED: case PAUSED_WHILE_HIDDEN: { - // When Dali applications are partially visible behind the lock-screen, - // the indicator must be updated (therefore allow updates in the PAUSED state) if( forceUpdate ) { - mThreadController->RequestUpdateOnce(); + // Update (and resource upload) without rendering + mThreadController->RequestUpdateOnce( UpdateMode::SKIP_RENDER ); } break; } @@ -996,11 +969,12 @@ void Adaptor::SurfaceResizePrepare( Dali::RenderSurfaceInterface* surface, Surfa void Adaptor::SurfaceResizeComplete( Dali::RenderSurfaceInterface* surface, SurfaceSize surfaceSize ) { + // Nofify surface resizing before flushing event queue + mThreadController->ResizeSurface(); + // Flush the event queue to give the update-render thread chance // to start processing messages for new camera setup etc as soon as possible ProcessCoreEvents(); - - mThreadController->ResizeSurface(); } void Adaptor::NotifySceneCreated() @@ -1060,11 +1034,21 @@ void Adaptor::UnregisterProcessor( Integration::Processor& processor ) GetCore().UnregisterProcessor(processor); } +bool Adaptor::IsMultipleWindowSupported() const +{ + return mConfigurationManager->IsMultipleWindowSupported(); +} + +bool Adaptor::IsRenderingWindows() const +{ + return ( mThreadController && mThreadController->IsRenderingWindows() ); +} + void Adaptor::RequestUpdateOnce() { if( mThreadController ) { - mThreadController->RequestUpdateOnce(); + mThreadController->RequestUpdateOnce( UpdateMode::NORMAL ); } } @@ -1133,6 +1117,7 @@ Adaptor::Adaptor(Dali::Integration::SceneHolder window, Dali::Adaptor& adaptor, mGraphics( nullptr ), mDisplayConnection( nullptr ), mWindows(), + mConfigurationManager( nullptr ), mPlatformAbstraction( nullptr ), mCallbackManager( nullptr ), mNotificationOnIdleInstalled( false ), @@ -1145,7 +1130,6 @@ Adaptor::Adaptor(Dali::Integration::SceneHolder window, Dali::Adaptor& adaptor, mPerformanceInterface( nullptr ), mKernelTracer(), mSystemTracer(), - mTriggerEventFactory(), mObjectProfiler( nullptr ), mSocketFactory(), mEnvironmentOptionsOwned( environmentOptions ? false : true /* If not provided then we own the object */ ),