/*
- * Copyright (c) 2018 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2019 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.
#include <dali/internal/system/common/time-service.h>
#include <dali/internal/adaptor/common/adaptor-internal-services.h>
#include <dali/devel-api/adaptor-framework/thread-settings.h>
+#include <dali/internal/graphics/gles/egl-graphics.h>
+#include <dali/internal/graphics/gles/egl-implementation.h>
+#include <dali/internal/graphics/common/graphics-interface.h>
namespace Dali
{
SetRenderRefreshRate( environmentOptions.GetRenderRefreshRate() );
// Set the thread-synchronization interface on the render-surface
- RenderSurface* currentSurface = mAdaptorInterfaces.GetRenderSurfaceInterface();
+ Dali::RenderSurfaceInterface* currentSurface = mAdaptorInterfaces.GetRenderSurfaceInterface();
if( currentSurface )
{
currentSurface->SetThreadSynchronization( *this );
sem_wait( &mEventThreadSemaphore );
}
- RenderSurface* currentSurface = mAdaptorInterfaces.GetRenderSurfaceInterface();
+ Integration::RenderSurface* currentSurface = mAdaptorInterfaces.GetRenderSurfaceInterface();
if( currentSurface )
{
currentSurface->StartRender();
LOG_EVENT( "Startup Complete, starting Update/Render Thread" );
RunUpdateRenderThread( CONTINUOUS, false /* No animation progression */ );
+
+ DALI_LOG_RELEASE_INFO( "CombinedUpdateRenderController::Start\n" );
}
void CombinedUpdateRenderController::Pause()
PauseUpdateRenderThread();
AddPerformanceMarker( PerformanceInterface::PAUSED );
+
+ DALI_LOG_RELEASE_INFO( "CombinedUpdateRenderController::Pause\n" );
}
void CombinedUpdateRenderController::Resume()
mRunning = TRUE;
mForceClear = TRUE;
}
+
+ DALI_LOG_RELEASE_INFO( "CombinedUpdateRenderController::Resume\n" );
}
void CombinedUpdateRenderController::Stop()
LOG_EVENT_TRACE;
// Stop Rendering and the Update/Render Thread
- RenderSurface* currentSurface = mAdaptorInterfaces.GetRenderSurfaceInterface();
+ Integration::RenderSurface* currentSurface = mAdaptorInterfaces.GetRenderSurfaceInterface();
if( currentSurface )
{
currentSurface->StopRender();
}
mRunning = FALSE;
+
+ DALI_LOG_RELEASE_INFO( "CombinedUpdateRenderController::Stop\n" );
}
void CombinedUpdateRenderController::RequestUpdate()
}
}
-void CombinedUpdateRenderController::ReplaceSurface( RenderSurface* newSurface )
+void CombinedUpdateRenderController::ReplaceSurface( Dali::RenderSurfaceInterface* newSurface )
{
LOG_EVENT_TRACE;
LOG_UPDATE_RENDER( "THREAD CREATED" );
- RenderSurface* currentSurface = mAdaptorInterfaces.GetRenderSurfaceInterface();
- if( currentSurface )
+ // Initialize EGL & OpenGL
+ Dali::DisplayConnection& displayConnection = mAdaptorInterfaces.GetDisplayConnectionInterface();
+ displayConnection.Initialize();
+
+ RenderSurfaceInterface* currentSurface = nullptr;
+
+ GraphicsInterface& graphics = mAdaptorInterfaces.GetGraphicsInterface();
+ EglGraphics* eglGraphics = static_cast<EglGraphics *>(&graphics);
+
+ // This will only be created once
+ EglInterface* eglInterface = &eglGraphics->GetEglInterface();
+
+ Internal::Adaptor::EglImplementation& eglImpl = static_cast<Internal::Adaptor::EglImplementation&>( *eglInterface );
+
+ // Try to use OpenGL es 3.0
+ // ChooseConfig returns false here when the device only support gles 2.0.
+ // Because eglChooseConfig with gles 3.0 setting fails when the device only support gles 2.0 and Our default setting is gles 3.0.
+ if( !eglImpl.ChooseConfig( true, COLOR_DEPTH_32 ) )
{
- currentSurface->InitializeGraphics( mAdaptorInterfaces.GetGraphicsInterface(), mAdaptorInterfaces.GetDisplayConnectionInterface() );
+ // Retry to use OpenGL es 2.0
+ eglGraphics->SetGlesVersion( 20 );
+ eglImpl.ChooseConfig( true, COLOR_DEPTH_32 );
+ }
+
+ // Check whether surfaceless context is supported
+ bool isSurfacelessContextSupported = eglImpl.IsSurfacelessContextSupported();
+ eglGraphics->SetIsSurfacelessContextSupported( isSurfacelessContextSupported );
+
+ if ( isSurfacelessContextSupported )
+ {
+ // Create a surfaceless OpenGL context for shared resources
+ eglImpl.CreateContext();
+ eglImpl.MakeContextCurrent( EGL_NO_SURFACE, eglImpl.GetContext() );
+ }
+ else
+ {
+ currentSurface = mAdaptorInterfaces.GetRenderSurfaceInterface();
+ if( currentSurface )
+ {
+ currentSurface->InitializeGraphics();
+ currentSurface->MakeContextCurrent();
+ }
}
// Tell core it has a context
// REPLACE SURFACE
//////////////////////////////
- RenderSurface* newSurface = ShouldSurfaceBeReplaced();
+ Integration::RenderSurface* newSurface = ShouldSurfaceBeReplaced();
if( DALI_UNLIKELY( newSurface ) )
{
LOG_UPDATE_RENDER_TRACE_FMT( "Replacing Surface" );
// If the new surface has a different display connection, then the context will be lost
mAdaptorInterfaces.GetDisplayConnectionInterface().Initialize();
+ newSurface->InitializeGraphics();
newSurface->ReplaceGraphicsSurface();
SurfaceReplaced();
}
}
// Check resize
- bool surfaceResized = ShouldSurfaceBeResized();
- if( DALI_UNLIKELY( surfaceResized ) )
+ bool shouldSurfaceBeResized = ShouldSurfaceBeResized();
+ if( DALI_UNLIKELY( shouldSurfaceBeResized ) )
{
if( updateStatus.SurfaceRectChanged() )
{
}
}
- RenderSurface* currentSurface = mAdaptorInterfaces.GetRenderSurfaceInterface();
- if( currentSurface )
+ if( eglImpl.IsSurfacelessContextSupported() )
{
- currentSurface->PreRender( mSurfaceResized );
+ // Make the shared surfaceless context as current before rendering
+ eglImpl.MakeContextCurrent( EGL_NO_SURFACE, eglImpl.GetContext() );
}
Integration::RenderStatus renderStatus;
mForceClear = false;
- if( renderStatus.NeedsPostRender() )
- {
- if( currentSurface )
- {
- currentSurface->PostRender( isRenderingToFbo, ( mNewSurface != NULL ), mSurfaceResized );
- }
- }
-
// Trigger event thread to request Update/Render thread to sleep if update not required
if( ( Integration::KeepUpdating::NOT_REQUESTED == keepUpdatingStatus ) && !renderStatus.NeedsUpdate() )
{
// Inform core of context destruction & shutdown EGL
mCore.ContextDestroyed();
+ currentSurface = mAdaptorInterfaces.GetRenderSurfaceInterface();
if( currentSurface )
{
currentSurface->DestroySurface();
return ! mDestroyUpdateRenderThread;
}
-RenderSurface* CombinedUpdateRenderController::ShouldSurfaceBeReplaced()
+Integration::RenderSurface* CombinedUpdateRenderController::ShouldSurfaceBeReplaced()
{
ConditionalWait::ScopedLock lock( mUpdateRenderThreadWaitCondition );
- RenderSurface* newSurface = mNewSurface;
+ Integration::RenderSurface* newSurface = mNewSurface;
mNewSurface = NULL;
return newSurface;