Merge "Use existing callback ID for recurring callbacks" into devel/master
[platform/core/uifw/dali-adaptor.git] / dali / internal / graphics / gles / egl-implementation.cpp
index d674055..ee4e08e 100755 (executable)
 namespace
 {
   const uint32_t THRESHOLD_SWAPBUFFER_COUNT = 5;
-  const uint32_t CHECK_EXTENSION_NUMBER = 2;
+  const uint32_t CHECK_EXTENSION_NUMBER = 4;
+  const uint32_t EGL_VERSION_SUPPORT_SURFACELESS_CONTEXT = 15;
   const std::string EGL_KHR_SURFACELESS_CONTEXT = "EGL_KHR_surfaceless_context";
   const std::string EGL_KHR_CREATE_CONTEXT = "EGL_KHR_create_context";
+  const std::string EGL_KHR_PARTIAL_UPDATE = "EGL_KHR_partial_update";
+  const std::string EGL_KHR_SWAP_BUFFERS_WITH_DAMAGE = "EGL_KHR_swap_buffers_with_damage";
+
 }
 
 namespace Dali
@@ -128,23 +132,53 @@ bool EglImplementation::InitializeGles( EGLNativeDisplayType display, bool isOwn
     mIsOwnSurface = isOwnSurface;
   }
 
-  // Query EGL extensions to check whether surfaceless context is supported
+  const char* const versionStr = eglQueryString( mEglDisplay, EGL_VERSION );
   const char* const extensionStr = eglQueryString( mEglDisplay, EGL_EXTENSIONS );
-  std::istringstream stream( extensionStr );
-  std::string currentExtension;
+
+  // Query EGL extensions to check whether required extensions are supported
+  std::istringstream versionStream( versionStr );
+  std::string majorVersion, minorVersion;
+  std::getline( versionStream, majorVersion, '.' );
+  std::getline( versionStream, minorVersion );
   uint32_t extensionCheckCount = 0;
-  while( std::getline( stream, currentExtension, ' ' ) && extensionCheckCount < CHECK_EXTENSION_NUMBER )
+  if( stoul( majorVersion ) * 10 + stoul( minorVersion ) >= EGL_VERSION_SUPPORT_SURFACELESS_CONTEXT )
   {
-    if( currentExtension == EGL_KHR_SURFACELESS_CONTEXT )
+    mIsSurfacelessContextSupported = true;
+    mIsKhrCreateContextSupported = true;
+    extensionCheckCount += 2;
+  }
+
+  std::istringstream stream(extensionStr);
+  std::string currentExtension;
+  bool isKhrPartialUpdateSupported = false;
+  bool isKhrSwapBuffersWithDamageSupported = false;
+  while(std::getline(stream, currentExtension, ' ') && extensionCheckCount < CHECK_EXTENSION_NUMBER)
+  {
+    if(currentExtension == EGL_KHR_SURFACELESS_CONTEXT && !mIsSurfacelessContextSupported)
     {
       mIsSurfacelessContextSupported = true;
       extensionCheckCount++;
     }
-    if( currentExtension == EGL_KHR_CREATE_CONTEXT )
+    if(currentExtension == EGL_KHR_CREATE_CONTEXT && !mIsKhrCreateContextSupported)
     {
       mIsKhrCreateContextSupported = true;
       extensionCheckCount++;
     }
+    if(currentExtension == EGL_KHR_PARTIAL_UPDATE)
+    {
+      isKhrPartialUpdateSupported = true;
+      extensionCheckCount++;
+    }
+    if(currentExtension == EGL_KHR_SWAP_BUFFERS_WITH_DAMAGE)
+    {
+      isKhrSwapBuffersWithDamageSupported = true;
+      extensionCheckCount++;
+    }
+  }
+
+  if(!isKhrPartialUpdateSupported || !isKhrSwapBuffersWithDamageSupported)
+  {
+    mPartialUpdateRequired = false;
   }
 
   mGlesInitialized = true;
@@ -158,7 +192,7 @@ bool EglImplementation::InitializeGles( EGLNativeDisplayType display, bool isOwn
       "            Extensions:    %s\n",
       mPartialUpdateRequired,
       eglQueryString( mEglDisplay, EGL_VENDOR ),
-      eglQueryString( mEglDisplay, EGL_VERSION ),
+      versionStr,
       eglQueryString( mEglDisplay, EGL_CLIENT_APIS ),
       extensionStr);