From: Richard Huang Date: Wed, 24 Apr 2019 09:10:28 +0000 (+0100) Subject: Support surfaceless context for OpenGL ES 2 X-Git-Tag: dali_1.4.17~2 X-Git-Url: http://review.tizen.org/git/?p=platform%2Fcore%2Fuifw%2Fdali-adaptor.git;a=commitdiff_plain;h=6206c977d8ec33445d0fa948886b214bee02214d Support surfaceless context for OpenGL ES 2 Change-Id: I6a40a226231fc640ed9bb3722748dbaa6ef072c4 --- diff --git a/dali/internal/adaptor/common/combined-update-render-controller.cpp b/dali/internal/adaptor/common/combined-update-render-controller.cpp index 93e1d9e..5c11f02 100644 --- a/dali/internal/adaptor/common/combined-update-render-controller.cpp +++ b/dali/internal/adaptor/common/combined-update-render-controller.cpp @@ -431,18 +431,29 @@ void CombinedUpdateRenderController::UpdateRenderThread() EglInterface* eglInterface = &eglGraphics->GetEglInterface(); Internal::Adaptor::EglImplementation& eglImpl = static_cast( *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 ) ) + if( !eglImpl.ChooseConfig( true, COLOR_DEPTH_32 ) ) + { + // 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 // Retry to use OpenGL es 2.0 + else { - eglGraphics->SetGlesVersion( 20 ); currentSurface = mAdaptorInterfaces.GetRenderSurfaceInterface(); if( currentSurface ) { @@ -583,7 +594,7 @@ void CombinedUpdateRenderController::UpdateRenderThread() } } - if( eglImpl.GetGlesVersion() >= 30 ) + if( eglImpl.IsSurfacelessContextSupported() ) { // Make the shared surfaceless context as current before rendering eglImpl.MakeContextCurrent( EGL_NO_SURFACE, eglImpl.GetContext() ); diff --git a/dali/internal/graphics/gles/egl-graphics.cpp b/dali/internal/graphics/gles/egl-graphics.cpp index a54b9ed..ace3e93 100644 --- a/dali/internal/graphics/gles/egl-graphics.cpp +++ b/dali/internal/graphics/gles/egl-graphics.cpp @@ -44,6 +44,11 @@ void EglGraphics::SetGlesVersion( const int32_t glesVersion ) mGLES->SetGlesVersion( glesVersion ); } +void EglGraphics::SetIsSurfacelessContextSupported( const bool isSupported ) +{ + mGLES->SetIsSurfacelessContextSupported( isSupported ); +} + void EglGraphics::Initialize( EnvironmentOptions* environmentOptions ) { if( environmentOptions->GetGlesCallTime() > 0 ) diff --git a/dali/internal/graphics/gles/egl-graphics.h b/dali/internal/graphics/gles/egl-graphics.h index 717ffc2..f02d673 100644 --- a/dali/internal/graphics/gles/egl-graphics.h +++ b/dali/internal/graphics/gles/egl-graphics.h @@ -72,6 +72,12 @@ public: void SetGlesVersion( const int32_t glesVersion ); /** + * Set whether the surfaceless context is supported + * @param[in] isSupported Whether the surfaceless context is supported + */ + void SetIsSurfacelessContextSupported( const bool isSupported ); + + /** * Gets the GL abstraction * @return The GL abstraction */ diff --git a/dali/internal/graphics/gles/egl-implementation.cpp b/dali/internal/graphics/gles/egl-implementation.cpp index 6580a6f..91d4fab 100755 --- a/dali/internal/graphics/gles/egl-implementation.cpp +++ b/dali/internal/graphics/gles/egl-implementation.cpp @@ -20,6 +20,7 @@ #include // EXTERNAL INCLUDES +#include #include #include @@ -32,6 +33,11 @@ #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wold-style-cast" +namespace +{ + const std::string EGL_KHR_SURFACELESS_CONTEXT = "EGL_KHR_surfaceless_context"; +} + namespace Dali { @@ -71,7 +77,8 @@ EglImplementation::EglImplementation( int multiSamplingLevel, mIsOwnSurface( true ), mIsWindow( true ), mDepthBufferRequired( depthBufferRequired == Integration::DepthBufferAvailable::TRUE ), - mStencilBufferRequired( stencilBufferRequired == Integration::StencilBufferAvailable::TRUE ) + mStencilBufferRequired( stencilBufferRequired == Integration::StencilBufferAvailable::TRUE ), + mIsSurfacelessContextSupported( false ) { } @@ -107,6 +114,19 @@ bool EglImplementation::InitializeGles( EGLNativeDisplayType display, bool isOwn mIsOwnSurface = isOwnSurface; } + // Query EGL extensions to check whether surfaceless context is supported + const char* const extensionStr = eglQueryString( mEglDisplay, EGL_EXTENSIONS ); + std::istringstream stream(extensionStr); + std::string currentExtension; + while ( std::getline( stream, currentExtension, ' ' ) ) + { + if ( currentExtension == EGL_KHR_SURFACELESS_CONTEXT ) + { + mIsSurfacelessContextSupported = true; + break; + } + } + // We want to display this information all the time, so use the LogMessage directly Integration::Log::LogMessage(Integration::Log::DebugInfo, "EGL Information\n" " Vendor: %s\n" @@ -116,7 +136,7 @@ bool EglImplementation::InitializeGles( EGLNativeDisplayType display, bool isOwn eglQueryString( mEglDisplay, EGL_VENDOR ), eglQueryString( mEglDisplay, EGL_VERSION ), eglQueryString( mEglDisplay, EGL_CLIENT_APIS ), - eglQueryString( mEglDisplay, EGL_EXTENSIONS )); + extensionStr); return mGlesInitialized; } @@ -538,6 +558,11 @@ int32_t EglImplementation::GetGlesVersion() const return mGlesVersion; } +bool EglImplementation::IsSurfacelessContextSupported() const +{ + return mIsSurfacelessContextSupported; +} + } // namespace Adaptor } // namespace Internal diff --git a/dali/internal/graphics/gles/egl-implementation.h b/dali/internal/graphics/gles/egl-implementation.h index 7c2a69b..03c35f4 100644 --- a/dali/internal/graphics/gles/egl-implementation.h +++ b/dali/internal/graphics/gles/egl-implementation.h @@ -199,6 +199,12 @@ public: */ int32_t GetGlesVersion() const; + /** + * Returns whether the surfaceless context is supported + * @return true if the surfaceless context is supported + */ + bool IsSurfacelessContextSupported() const; + private: Vector mContextAttribs; @@ -232,6 +238,7 @@ private: bool mIsWindow; bool mDepthBufferRequired; bool mStencilBufferRequired; + bool mIsSurfacelessContextSupported; }; } // namespace Adaptor diff --git a/dali/internal/graphics/gles/gl-implementation.h b/dali/internal/graphics/gles/gl-implementation.h index be32476..8c279f4 100644 --- a/dali/internal/graphics/gles/gl-implementation.h +++ b/dali/internal/graphics/gles/gl-implementation.h @@ -48,7 +48,8 @@ class GlImplementation : public Dali::Integration::GlAbstraction public: GlImplementation() - : mGlesVersion( 30 ) + : mGlesVersion( 30 ), + mIsSurfacelessContextSupported( false ) { mImpl.reset( new Gles3Implementation() ); } @@ -81,9 +82,14 @@ public: } } + void SetIsSurfacelessContextSupported( const bool isSupported ) + { + mIsSurfacelessContextSupported = isSupported; + } + bool IsSurfacelessContextSupported() const { - return ( mGlesVersion >= 30 ); + return mIsSurfacelessContextSupported; } bool TextureRequiresConverting( const GLenum imageGlFormat, const GLenum textureGlFormat, const bool isSubImage ) const @@ -1333,6 +1339,7 @@ public: private: int32_t mGlesVersion; + bool mIsSurfacelessContextSupported; std::unique_ptr mImpl; };