X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=dali%2Finternal%2Fwindow-system%2Fcommon%2Fwindow-render-surface.cpp;h=eff87457e2e21e73a3e76b2615e31b467f6886fe;hb=c8343f30b5f9674e296388ac1ea27cc59e7d9171;hp=18ae128db90073f52f5d758b61f85a694d546565;hpb=aea5f2061bbea02a524375897ddcd33e9730df96;p=platform%2Fcore%2Fuifw%2Fdali-adaptor.git diff --git a/dali/internal/window-system/common/window-render-surface.cpp b/dali/internal/window-system/common/window-render-surface.cpp old mode 100644 new mode 100755 index 18ae128..eff8745 --- a/dali/internal/window-system/common/window-render-surface.cpp +++ b/dali/internal/window-system/common/window-render-surface.cpp @@ -32,6 +32,7 @@ #include #include #include +#include namespace Dali @@ -45,6 +46,7 @@ namespace { const int MINIMUM_DIMENSION_CHANGE( 1 ); ///< Minimum change for window to be considered to have moved +const int TILE_SIZE = 16u; ///< Unit of tile size at GPU driver #if defined(DEBUG_ENABLED) Debug::Filter* gWindowRenderSurfaceLogFilter = Debug::Filter::New(Debug::Verbose, false, "LOG_WINDOW_RENDER_SURFACE"); @@ -67,11 +69,16 @@ WindowRenderSurface::WindowRenderSurface( Dali::PositionSize positionSize, Any s mOutputTransformedSignal(), mRotationAngle( 0 ), mScreenRotationAngle( 0 ), + mBufferAge( 0 ), + mPreBufferAge( 0 ), mOwnSurface( false ), mRotationSupported( false ), mRotationFinished( true ), mScreenRotationFinished( true ), - mResizeFinished( true ) + mResizeFinished( true ), + mDpiHorizontal( 0 ), + mDpiVertical( 0 ), + mPreDamagedRect() { DALI_LOG_INFO( gWindowRenderSurfaceLogFilter, Debug::Verbose, "Creating Window\n" ); Initialize( surface ); @@ -83,6 +90,11 @@ WindowRenderSurface::~WindowRenderSurface() { delete mRotationTrigger; } + + if ( mEGLSurface ) + { + DestroySurface(); + } } void WindowRenderSurface::Initialize( Any surface ) @@ -109,6 +121,7 @@ void WindowRenderSurface::Initialize( Any surface ) if( mScreenRotationAngle != 0 ) { mScreenRotationFinished = false; + mResizeFinished = false; } } @@ -139,12 +152,6 @@ void WindowRenderSurface::SetTransparency( bool transparent ) void WindowRenderSurface::RequestRotation( int angle, int width, int height ) { - if( !mRotationSupported ) - { - DALI_LOG_INFO( gWindowRenderSurfaceLogFilter, Debug::Verbose, "WindowRenderSurface::Rotate: Rotation is not supported!\n" ); - return; - } - if( !mRotationTrigger ) { TriggerEventFactoryInterface& triggerFactory = Internal::Adaptor::Adaptor::GetImplementation( Adaptor::Get() ).GetTriggerEventFactoryInterface(); @@ -179,7 +186,27 @@ PositionSize WindowRenderSurface::GetPositionSize() const void WindowRenderSurface::GetDpi( unsigned int& dpiHorizontal, unsigned int& dpiVertical ) { - mWindowBase->GetDpi( dpiHorizontal, dpiVertical ); + if( mDpiHorizontal == 0 || mDpiVertical == 0 ) + { + const char* environmentDpiHorizontal = std::getenv( DALI_ENV_DPI_HORIZONTAL ); + mDpiHorizontal = environmentDpiHorizontal ? std::atoi( environmentDpiHorizontal ) : 0; + + const char* environmentDpiVertical = std::getenv( DALI_ENV_DPI_VERTICAL ); + mDpiVertical = environmentDpiVertical ? std::atoi( environmentDpiVertical ) : 0; + + if( mDpiHorizontal == 0 || mDpiVertical == 0 ) + { + mWindowBase->GetDpi( mDpiHorizontal, mDpiVertical ); + } + } + + dpiHorizontal = mDpiHorizontal; + dpiVertical = mDpiVertical; +} + +int WindowRenderSurface::GetOrientation() const +{ + return mWindowBase->GetOrientation(); } void WindowRenderSurface::InitializeGraphics() @@ -229,7 +256,10 @@ void WindowRenderSurface::CreateSurface() // Check rotation capability mRotationSupported = mWindowBase->IsEglWindowRotationSupported(); - DALI_LOG_INFO( gWindowRenderSurfaceLogFilter, Debug::Verbose, "WindowRenderSurface::CreateSurface: w = %d h = %d angle = %d screen rotation = %d\n", mPositionSize.width, mPositionSize.height, mRotationAngle, mScreenRotationAngle ); + int screenWidth, screenHeight; + WindowSystem::GetScreenSize( screenWidth, screenHeight ); + DALI_LOG_RELEASE_INFO("WindowRenderSurface::CreateSurface: w = %d h = %d screenWidth = %d screenHeight = %d angle = %d screen rotation = %d\n", + mPositionSize.width, mPositionSize.height, screenWidth, screenHeight, mRotationAngle, mScreenRotationAngle ); } void WindowRenderSurface::DestroySurface() @@ -331,11 +361,11 @@ bool WindowRenderSurface::PreRender( bool resizingSurface ) if( resizingSurface ) { + int totalAngle = (mRotationAngle + mScreenRotationAngle) % 360; + // Window rotate or screen rotate if( !mRotationFinished || !mScreenRotationFinished ) { - int totalAngle = (mRotationAngle + mScreenRotationAngle) % 360; - mWindowBase->SetEglWindowRotation( totalAngle ); mWindowBase->SetEglWindowBufferTransform( totalAngle ); @@ -352,9 +382,23 @@ bool WindowRenderSurface::PreRender( bool resizingSurface ) } // Resize case - if( !mResizeFinished ) + if ( !mResizeFinished ) { - mWindowBase->ResizeEglWindow( mPositionSize ); + Dali::PositionSize positionSize; + positionSize.x = mPositionSize.x; + positionSize.y = mPositionSize.y; + if( totalAngle == 0 || totalAngle == 180 ) + { + positionSize.width = mPositionSize.width; + positionSize.height = mPositionSize.height; + } + else + { + positionSize.width = mPositionSize.height; + positionSize.height = mPositionSize.width; + } + + mWindowBase->ResizeEglWindow( positionSize ); mResizeFinished = true; DALI_LOG_INFO( gWindowRenderSurfaceLogFilter, Debug::Verbose, "WindowRenderSurface::PreRender: Set resize\n" ); @@ -371,6 +415,95 @@ bool WindowRenderSurface::PreRender( bool resizingSurface ) return true; } +std::vector WindowRenderSurface::MergeRect( const Rect& damagedRect, int bufferAge ) +{ + std::vector mergedRectArray; + // merge bounding + int dx1 = mPositionSize.width, dx2 = 0, dy1 = mPositionSize.height, dy2 = 0; + int checkWidth = mPositionSize.width - TILE_SIZE; + int checkHeight = mPositionSize.height - TILE_SIZE; + + dx1 = std::min( damagedRect.x, dx1 ); + dx2 = std::max( damagedRect.x + damagedRect.width, dx2); + dy1 = std::min( damagedRect.y, dy1 ); + dy2 = std::max( damagedRect.y + damagedRect.height, dy2 ); + + for( int j = 0; j <= bufferAge; j++ ) + { + if( !mPreDamagedRect[j].IsEmpty() ) + { + dx1 = std::min( mPreDamagedRect[j].x, dx1 ); + dx2 = std::max( mPreDamagedRect[j].x + mPreDamagedRect[j].width, dx2); + dy1 = std::min( mPreDamagedRect[j].y, dy1 ); + dy2 = std::max( mPreDamagedRect[j].y + mPreDamagedRect[j].height, dy2 ); + + if( dx1 < TILE_SIZE && dx2 > checkWidth && dy1 < TILE_SIZE && dy2 > checkHeight ) + { + dx1 = 0, dx2 = mPositionSize.width, dy1 = 0, dy2 = mPositionSize.height; + break; + } + } + } + + dx1 = TILE_SIZE * (dx1 / TILE_SIZE); + dy1 = TILE_SIZE * (dy1 / TILE_SIZE); + dx2 = TILE_SIZE * ((dx2 + TILE_SIZE - 1) / TILE_SIZE); + dy2 = TILE_SIZE * ((dy2 + TILE_SIZE - 1) / TILE_SIZE); + + mergedRectArray.push_back( dx1 ); + mergedRectArray.push_back( dy1 ); + mergedRectArray.push_back( dx2 - dx1 ); + mergedRectArray.push_back( dy2 - dy1 ); + + return mergedRectArray; +} + + +Rect WindowRenderSurface::SetDamagedRect( const Rect& damagedRect ) +{ + auto eglGraphics = static_cast( mGraphics ); + std::vector rectArray; + Rect mergedDamagedRect; + if( eglGraphics ) + { + Internal::Adaptor::EglImplementation& eglImpl = eglGraphics->GetEglImplementation(); + + rectArray = MergeRect( damagedRect, mBufferAge ); + + mPreDamagedRect[4] = std::move( mPreDamagedRect[3] ); + mPreDamagedRect[3] = std::move( mPreDamagedRect[2] ); + mPreDamagedRect[2] = std::move( mPreDamagedRect[1] ); + mPreDamagedRect[1] = std::move( mPreDamagedRect[0] ); + mPreDamagedRect[0] = std::move( damagedRect ); + + eglImpl.SetDamagedRect( rectArray, mEGLSurface ); + } + + if( !rectArray.empty() ) + { + mergedDamagedRect.x = rectArray[0]; + mergedDamagedRect.y = rectArray[1]; + mergedDamagedRect.width = rectArray[2]; + mergedDamagedRect.height = rectArray[3]; + } + + return mergedDamagedRect; +} + +int32_t WindowRenderSurface::GetBufferAge() +{ + int result = mBufferAge = 0; + auto eglGraphics = static_cast( mGraphics ); + if( eglGraphics ) + { + Internal::Adaptor::EglImplementation& eglImpl = eglGraphics->GetEglImplementation(); + mBufferAge = eglImpl.GetBufferAge( mEGLSurface );; + result = ( mBufferAge != mPreBufferAge ) ? 0 : mBufferAge; + mPreBufferAge = mBufferAge; + } + return result; +} + void WindowRenderSurface::PostRender( bool renderToFbo, bool replacingSurface, bool resizingSurface ) { // Inform the gl implementation that rendering has finished before informing the surface @@ -405,18 +538,13 @@ void WindowRenderSurface::PostRender( bool renderToFbo, bool replacingSurface, b } Internal::Adaptor::EglImplementation& eglImpl = eglGraphics->GetEglImplementation(); + eglImpl.SwapBuffers( mEGLSurface ); if( mRenderNotification ) { mRenderNotification->Trigger(); } - - if ( eglImpl.IsSurfacelessContextSupported() ) - { - // Switch to the shared context after rendering this surface - eglImpl.MakeContextCurrent( EGL_NO_SURFACE, eglImpl.GetContext() ); - } } } @@ -467,6 +595,7 @@ void WindowRenderSurface::OutputTransformed() { mScreenRotationAngle = screenRotationAngle; mScreenRotationFinished = false; + mResizeFinished = false; mOutputTransformedSignal.Emit();