Use Dali::Integration::TimeChecker feature instead duplicate macro (phase 1) 30/320730/2
authorEunki Hong <eunkiki.hong@samsung.com>
Thu, 21 Nov 2024 11:35:33 +0000 (20:35 +0900)
committerEunki, Hong <eunkiki.hong@samsung.com>
Mon, 25 Nov 2024 10:11:46 +0000 (19:11 +0900)
Let we use Dali::Integration::TimeChecker feature for gles

Change-Id: I13f6f7f9015e38a4df9dc29333c91e459935449d
Signed-off-by: Eunki Hong <eunkiki.hong@samsung.com>
dali/internal/graphics/gles/egl-implementation.cpp
dali/internal/graphics/gles/egl-implementation.h
dali/internal/graphics/gles/gl-implementation.cpp
dali/internal/graphics/gles/gl-implementation.h

index 8133376fa520c5f5d2a333ca2681c504474f9905..03d181dde0989107a8fe07c2d1393868236aeae1 100644 (file)
@@ -57,31 +57,7 @@ DALI_INIT_TRACE_FILTER(gTraceFilter, DALI_TRACE_EGL, true);
 DALI_INIT_TRACE_FILTER(gTraceFilter, DALI_TRACE_EGL, false);
 #endif
 
-static uint32_t GetPerformanceLogThresholdTime()
-{
-  auto     timeString = Dali::EnvironmentVariable::GetEnvironmentVariable(DALI_ENV_EGL_PERFORMANCE_LOG_THRESHOLD_TIME);
-  uint32_t time       = timeString ? static_cast<uint32_t>(std::atoi(timeString)) : std::numeric_limits<uint32_t>::max();
-  return time;
-}
-
-#define START_DURATION_CHECK()                         \
-  uint64_t startTimeNanoSeconds = 0ull;                \
-  uint64_t endTimeNanoSeconds   = 0ull;                \
-  if(mLogEnabled)                                      \
-  {                                                    \
-    TimeService::GetNanoseconds(startTimeNanoSeconds); \
-  }
-
-#define FINISH_DURATION_CHECK(functionName)                                                                                                                \
-  if(mLogEnabled)                                                                                                                                          \
-  {                                                                                                                                                        \
-    TimeService::GetNanoseconds(endTimeNanoSeconds);                                                                                                       \
-    if(static_cast<uint32_t>((endTimeNanoSeconds - startTimeNanoSeconds) / 1000000ull) >= mLogThreshold)                                                   \
-    {                                                                                                                                                      \
-      DALI_LOG_RELEASE_INFO("%s takes long time! [%.6lf ms]\n", functionName, static_cast<double>(endTimeNanoSeconds - startTimeNanoSeconds) / 1000000.0); \
-    }                                                                                                                                                      \
-  }
-
+DALI_INIT_TIME_CHECKER_FILTER(gTimeCheckerFilter, DALI_EGL_PERFORMANCE_LOG_THRESHOLD_TIME);
 } // namespace
 
 namespace Dali
@@ -138,9 +114,6 @@ EglImplementation::~EglImplementation()
 
 bool EglImplementation::InitializeGles(EGLNativeDisplayType display, bool isOwnSurface)
 {
-  mLogThreshold = GetPerformanceLogThresholdTime();
-  mLogEnabled   = mLogThreshold < std::numeric_limits<uint32_t>::max() ? true : false;
-
   if(!mGlesInitialized)
   {
     mEglNativeDisplay = display;
@@ -149,10 +122,10 @@ bool EglImplementation::InitializeGles(EGLNativeDisplayType display, bool isOwnS
       DALI_TRACE_BEGIN_WITH_MESSAGE_GENERATOR(gTraceFilter, "DALI_EGL_GET_DISPLAY", [&](std::ostringstream& oss) {
         oss << "[native display:" << mEglNativeDisplay << "]";
       });
-      START_DURATION_CHECK();
+      DALI_TIME_CHECKER_BEGIN(gTimeCheckerFilter);
       // Try to get the display connection for the native display first
       mEglDisplay = eglGetDisplay(mEglNativeDisplay);
-      FINISH_DURATION_CHECK("eglGetDisplay");
+      DALI_TIME_CHECKER_END_WITH_MESSAGE(gTimeCheckerFilter, "eglGetDisplay");
       DALI_TRACE_END_WITH_MESSAGE_GENERATOR(gTraceFilter, "DALI_EGL_GET_DISPLAY", [&](std::ostringstream& oss) {
         oss << "[display:" << mEglDisplay << "]";
       });
@@ -161,10 +134,10 @@ bool EglImplementation::InitializeGles(EGLNativeDisplayType display, bool isOwnS
     if(mEglDisplay == EGL_NO_DISPLAY)
     {
       DALI_TRACE_BEGIN(gTraceFilter, "DALI_EGL_GET_DISPLAY");
-      START_DURATION_CHECK();
+      DALI_TIME_CHECKER_BEGIN(gTimeCheckerFilter);
       // If failed, try to get the default display connection
       mEglDisplay = eglGetDisplay(EGL_DEFAULT_DISPLAY);
-      FINISH_DURATION_CHECK("eglGetDisplay");
+      DALI_TIME_CHECKER_END_WITH_MESSAGE(gTimeCheckerFilter, "eglGetDisplay(default)");
       DALI_TRACE_END_WITH_MESSAGE_GENERATOR(gTraceFilter, "DALI_EGL_GET_DISPLAY", [&](std::ostringstream& oss) {
         oss << "[display:" << mEglDisplay << "]";
       });
@@ -183,9 +156,9 @@ bool EglImplementation::InitializeGles(EGLNativeDisplayType display, bool isOwnS
       DALI_TRACE_BEGIN_WITH_MESSAGE_GENERATOR(gTraceFilter, "DALI_EGL_INITIALIZE", [&](std::ostringstream& oss) {
         oss << "[display:" << mEglDisplay << "]";
       });
-      START_DURATION_CHECK();
+      DALI_TIME_CHECKER_BEGIN(gTimeCheckerFilter);
       bool ret = eglInitialize(mEglDisplay, &majorVersion, &minorVersion);
-      FINISH_DURATION_CHECK("eglInitialize");
+      DALI_TIME_CHECKER_END_WITH_MESSAGE(gTimeCheckerFilter, "eglInitialize");
       DALI_TRACE_END_WITH_MESSAGE_GENERATOR(gTraceFilter, "DALI_EGL_INITIALIZE", [&](std::ostringstream& oss) {
         oss << "[ret:" << ret << " version:" << majorVersion << "." << minorVersion << "]";
       });
@@ -198,21 +171,20 @@ bool EglImplementation::InitializeGles(EGLNativeDisplayType display, bool isOwnS
 
     {
       DALI_TRACE_SCOPE(gTraceFilter, "DALI_EGL_BIND_API");
-      START_DURATION_CHECK();
+      DALI_TIME_CHECKER_SCOPE(gTimeCheckerFilter, "eglBindAPI");
       eglBindAPI(EGL_OPENGL_ES_API);
-      FINISH_DURATION_CHECK("eglBindAPI");
     }
 
     mIsOwnSurface = isOwnSurface;
   }
 
   {
-    START_DURATION_CHECK();
+    DALI_TIME_CHECKER_BEGIN(gTimeCheckerFilter);
     const char* const versionStr   = eglQueryString(mEglDisplay, EGL_VERSION);
     const char* const extensionStr = eglQueryString(mEglDisplay, EGL_EXTENSIONS);
     const char* const vendorStr    = eglQueryString(mEglDisplay, EGL_VENDOR);
     const char* const clientStr    = eglQueryString(mEglDisplay, EGL_CLIENT_APIS);
-    FINISH_DURATION_CHECK("eglQueryString");
+    DALI_TIME_CHECKER_END_WITH_MESSAGE(gTimeCheckerFilter, "eglQueryString");
 
     // Query EGL extensions to check whether required extensions are supported
     std::istringstream versionStream(versionStr);
@@ -289,9 +261,8 @@ bool EglImplementation::CreateContext()
     DALI_TRACE_BEGIN_WITH_MESSAGE_GENERATOR(gTraceFilter, "DALI_EGL_CREATE_CONTEXT", [&](std::ostringstream& oss) {
       oss << "[display:" << mEglDisplay << "]";
     });
-    START_DURATION_CHECK();
+    DALI_TIME_CHECKER_SCOPE(gTimeCheckerFilter, "eglCreateContext");
     mEglContext = eglCreateContext(mEglDisplay, mEglConfig, NULL, &(mContextAttribs[0]));
-    FINISH_DURATION_CHECK("eglCreateContext");
     DALI_TRACE_END_WITH_MESSAGE_GENERATOR(gTraceFilter, "DALI_EGL_CREATE_CONTEXT", [&](std::ostringstream& oss) {
       oss << "[context:" << mEglContext << "]";
     });
@@ -307,24 +278,22 @@ bool EglImplementation::CreateContext()
   DALI_LOG_INFO(Debug::Filter::gShader, Debug::General, "*** Supported Extensions ***\n%s\n\n", glGetString(GL_EXTENSIONS));
 
   {
-    START_DURATION_CHECK();
+    DALI_TIME_CHECKER_SCOPE(gTimeCheckerFilter, "eglGetProcAddress(\"eglSetDamageRegionKHR\")");
     mEglSetDamageRegionKHR = reinterpret_cast<PFNEGLSETDAMAGEREGIONKHRPROC>(eglGetProcAddress("eglSetDamageRegionKHR"));
     if(!mEglSetDamageRegionKHR)
     {
       DALI_LOG_ERROR("Coudn't find eglSetDamageRegionKHR!\n");
       mPartialUpdateRequired = false;
     }
-    FINISH_DURATION_CHECK("eglGetProcAddress(\"eglSetDamageRegionKHR\")");
   }
   {
-    START_DURATION_CHECK();
+    DALI_TIME_CHECKER_SCOPE(gTimeCheckerFilter, "eglGetProcAddress(\"eglSwapBuffersWithDamageKHR\")");
     mEglSwapBuffersWithDamageKHR = reinterpret_cast<PFNEGLSWAPBUFFERSWITHDAMAGEEXTPROC>(eglGetProcAddress("eglSwapBuffersWithDamageKHR"));
     if(!mEglSwapBuffersWithDamageKHR)
     {
       DALI_LOG_ERROR("Coudn't find eglSwapBuffersWithDamageKHR!\n");
       mPartialUpdateRequired = false;
     }
-    FINISH_DURATION_CHECK("eglGetProcAddress(\"eglSwapBuffersWithDamageKHR\")");
   }
   return true;
 }
@@ -338,9 +307,8 @@ bool EglImplementation::CreateWindowContext(EGLContext& eglContext)
     DALI_TRACE_BEGIN_WITH_MESSAGE_GENERATOR(gTraceFilter, "DALI_EGL_CREATE_CONTEXT", [&](std::ostringstream& oss) {
       oss << "[display:" << mEglDisplay << ", share_context:" << mEglContext << "]";
     });
-    START_DURATION_CHECK();
+    DALI_TIME_CHECKER_SCOPE(gTimeCheckerFilter, "eglCreateContext");
     eglContext = eglCreateContext(mEglDisplay, mEglConfig, mEglContext, &(mContextAttribs[0]));
-    FINISH_DURATION_CHECK("eglCreateContext");
     DALI_TRACE_END_WITH_MESSAGE_GENERATOR(gTraceFilter, "DALI_EGL_CREATE_CONTEXT", [&](std::ostringstream& oss) {
       oss << "[context:" << eglContext << "]";
     });
@@ -358,24 +326,22 @@ bool EglImplementation::CreateWindowContext(EGLContext& eglContext)
   mEglWindowContexts.push_back(eglContext);
 
   {
-    START_DURATION_CHECK();
+    DALI_TIME_CHECKER_SCOPE(gTimeCheckerFilter, "eglGetProcAddress(\"eglSetDamageRegionKHR\")");
     mEglSetDamageRegionKHR = reinterpret_cast<PFNEGLSETDAMAGEREGIONKHRPROC>(eglGetProcAddress("eglSetDamageRegionKHR"));
     if(!mEglSetDamageRegionKHR)
     {
       DALI_LOG_ERROR("Coudn't find eglSetDamageRegionKHR!\n");
       mPartialUpdateRequired = false;
     }
-    FINISH_DURATION_CHECK("eglGetProcAddress(\"eglSetDamageRegionKHR\")");
   }
   {
-    START_DURATION_CHECK();
+    DALI_TIME_CHECKER_SCOPE(gTimeCheckerFilter, "eglGetProcAddress(\"eglSwapBuffersWithDamageKHR\")");
     mEglSwapBuffersWithDamageKHR = reinterpret_cast<PFNEGLSWAPBUFFERSWITHDAMAGEEXTPROC>(eglGetProcAddress("eglSwapBuffersWithDamageKHR"));
     if(!mEglSwapBuffersWithDamageKHR)
     {
       DALI_LOG_ERROR("Coudn't find eglSwapBuffersWithDamageKHR!\n");
       mPartialUpdateRequired = false;
     }
-    FINISH_DURATION_CHECK("eglGetProcAddress(\"eglSwapBuffersWithDamageKHR\")");
   }
   return true;
 }
@@ -394,10 +360,10 @@ void EglImplementation::DestroyContext(EGLContext& eglContext)
     DALI_TRACE_BEGIN_WITH_MESSAGE_GENERATOR(gTraceFilter, "DALI_EGL_DESTROY_CONTEXT", [&](std::ostringstream& oss) {
       oss << "[display:" << mEglDisplay << ", context:" << eglContext << "]";
     });
-    START_DURATION_CHECK();
+
+    DALI_TIME_CHECKER_SCOPE(gTimeCheckerFilter, "eglDestroyContext");
     eglDestroyContext(mEglDisplay, eglContext);
     eglContext = 0;
-    FINISH_DURATION_CHECK("eglDestroyContext");
     DALI_TRACE_END(gTraceFilter, "DALI_EGL_DESTROY_CONTEXT");
   }
 }
@@ -411,10 +377,9 @@ void EglImplementation::DestroySurface(EGLSurface& eglSurface)
     DALI_TRACE_BEGIN_WITH_MESSAGE_GENERATOR(gTraceFilter, "DALI_EGL_DESTROY_SURFACE", [&](std::ostringstream& oss) {
       oss << "[display:" << mEglDisplay << ", surface:" << eglSurface << "]";
     });
-    START_DURATION_CHECK();
+    DALI_TIME_CHECKER_SCOPE(gTimeCheckerFilter, "eglDestroySurface");
     eglDestroySurface(mEglDisplay, eglSurface);
     eglSurface = 0;
-    FINISH_DURATION_CHECK("eglDestroySurface");
     DALI_TRACE_END(gTraceFilter, "DALI_EGL_DESTROY_SURFACE");
   }
 }
@@ -430,11 +395,10 @@ void EglImplementation::MakeContextCurrent(EGLSurface eglSurface, EGLContext egl
 
   if(mIsOwnSurface)
   {
-    START_DURATION_CHECK();
+    DALI_TIME_CHECKER_SCOPE(gTimeCheckerFilter, "eglMakeCurrent");
     eglMakeCurrent(mEglDisplay, eglSurface, eglSurface, eglContext);
 
     mCurrentEglContext = eglContext;
-    FINISH_DURATION_CHECK("eglMakeCurrent");
   }
 
   EGLint error = eglGetError();
@@ -459,11 +423,10 @@ void EglImplementation::MakeCurrent(EGLNativePixmapType pixmap, EGLSurface eglSu
 
   if(mIsOwnSurface)
   {
-    START_DURATION_CHECK();
+    DALI_TIME_CHECKER_SCOPE(gTimeCheckerFilter, "eglMakeCurrent(pixmap)");
     eglMakeCurrent(mEglDisplay, eglSurface, eglSurface, mEglContext);
 
     mCurrentEglContext = mEglContext;
-    FINISH_DURATION_CHECK("eglMakeCurrent");
   }
 
   EGLint error = eglGetError();
@@ -479,10 +442,9 @@ void EglImplementation::MakeCurrent(EGLNativePixmapType pixmap, EGLSurface eglSu
 void EglImplementation::MakeContextNull()
 {
   // clear the current context
-  START_DURATION_CHECK();
+  DALI_TIME_CHECKER_SCOPE(gTimeCheckerFilter, "eglMakeCurrent(null)");
   eglMakeCurrent(mEglDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
   mCurrentEglContext = EGL_NO_CONTEXT;
-  FINISH_DURATION_CHECK("eglMakeCurrent(null)");
 }
 
 void EglImplementation::TerminateGles()
@@ -501,9 +463,8 @@ void EglImplementation::TerminateGles()
           DALI_TRACE_BEGIN_WITH_MESSAGE_GENERATOR(gTraceFilter, "DALI_EGL_DESTROY_SURFACE", [&](std::ostringstream& oss) {
             oss << "[display:" << mEglDisplay << ", surface:" << eglSurface << "]";
           });
-          START_DURATION_CHECK();
+          DALI_TIME_CHECKER_SCOPE(gTimeCheckerFilter, "eglDestroySurface");
           eglDestroySurface(mEglDisplay, eglSurface);
-          FINISH_DURATION_CHECK("eglDestroySurface");
           DALI_TRACE_END(gTraceFilter, "DALI_EGL_DESTROY_SURFACE");
         }
       }
@@ -512,9 +473,8 @@ void EglImplementation::TerminateGles()
       DALI_TRACE_BEGIN_WITH_MESSAGE_GENERATOR(gTraceFilter, "DALI_EGL_DESTROY_CONTEXT", [&](std::ostringstream& oss) {
         oss << "[display:" << mEglDisplay << ", context:" << mEglContext << "]";
       });
-      START_DURATION_CHECK();
+      DALI_TIME_CHECKER_SCOPE(gTimeCheckerFilter, "eglDestroyContext");
       eglDestroyContext(mEglDisplay, mEglContext);
-      FINISH_DURATION_CHECK("eglDestroyContext");
       DALI_TRACE_END(gTraceFilter, "DALI_EGL_DESTROY_CONTEXT");
     }
     for(auto eglContext : mEglWindowContexts)
@@ -522,9 +482,8 @@ void EglImplementation::TerminateGles()
       DALI_TRACE_BEGIN_WITH_MESSAGE_GENERATOR(gTraceFilter, "DALI_EGL_DESTROY_CONTEXT", [&](std::ostringstream& oss) {
         oss << "[display:" << mEglDisplay << ", context:" << eglContext << "]";
       });
-      START_DURATION_CHECK();
+      DALI_TIME_CHECKER_SCOPE(gTimeCheckerFilter, "eglDestroyContext");
       eglDestroyContext(mEglDisplay, eglContext);
-      FINISH_DURATION_CHECK("eglDestroyContext");
       DALI_TRACE_END(gTraceFilter, "DALI_EGL_DESTROY_CONTEXT");
     }
 
@@ -532,9 +491,8 @@ void EglImplementation::TerminateGles()
       DALI_TRACE_BEGIN_WITH_MESSAGE_GENERATOR(gTraceFilter, "DALI_EGL_TERMINATE", [&](std::ostringstream& oss) {
         oss << "[display:" << mEglDisplay << "]";
       });
-      START_DURATION_CHECK();
+      DALI_TIME_CHECKER_SCOPE(gTimeCheckerFilter, "eglTerminate");
       eglTerminate(mEglDisplay);
-      FINISH_DURATION_CHECK("eglTerminate");
       DALI_TRACE_END(gTraceFilter, "DALI_EGL_TERMINATE");
     }
 
@@ -557,7 +515,7 @@ void EglImplementation::SwapBuffers(EGLSurface& eglSurface)
 {
   if(eglSurface != EGL_NO_SURFACE) // skip if using surfaceless context
   {
-    START_DURATION_CHECK();
+    DALI_TIME_CHECKER_SCOPE(gTimeCheckerFilter, "eglSwapBuffers");
 
 #ifndef DALI_PROFILE_UBUNTU
     if(mSwapBufferCountAfterResume < THRESHOLD_SWAPBUFFER_COUNT)
@@ -578,14 +536,12 @@ void EglImplementation::SwapBuffers(EGLSurface& eglSurface)
       mSwapBufferCountAfterResume++;
     }
 #endif //DALI_PROFILE_UBUNTU
-
-    FINISH_DURATION_CHECK("eglSwapBuffers");
   }
 }
 
 int EglImplementation::GetBufferAge(EGLSurface& eglSurface) const
 {
-  START_DURATION_CHECK();
+  DALI_TIME_CHECKER_SCOPE(gTimeCheckerFilter, "eglQuerySurface");
 
   int age = 0;
   eglQuerySurface(mEglDisplay, eglSurface, EGL_BUFFER_AGE_EXT, &age);
@@ -595,8 +551,6 @@ int EglImplementation::GetBufferAge(EGLSurface& eglSurface) const
     age = 0;
   }
 
-  FINISH_DURATION_CHECK("eglQuerySurface");
-
   return age;
 }
 
@@ -609,13 +563,12 @@ void EglImplementation::SetDamageRegion(EGLSurface& eglSurface, std::vector<Rect
 
   if(eglSurface != EGL_NO_SURFACE) // skip if using surfaceless context
   {
-    START_DURATION_CHECK();
+    DALI_TIME_CHECKER_SCOPE(gTimeCheckerFilter, "eglSetDamageRegionKHR");
     EGLBoolean result = mEglSetDamageRegionKHR(mEglDisplay, eglSurface, reinterpret_cast<int*>(damagedRects.data()), 1);
     if(result == EGL_FALSE)
     {
       DALI_LOG_ERROR("eglSetDamageRegionKHR(0x%x)\n", eglGetError());
     }
-    FINISH_DURATION_CHECK("eglSetDamageRegionKHR");
   }
 }
 
@@ -629,7 +582,7 @@ void EglImplementation::SwapBuffers(EGLSurface& eglSurface, const std::vector<Re
       return;
     }
 
-    START_DURATION_CHECK();
+    DALI_TIME_CHECKER_SCOPE(gTimeCheckerFilter, "eglSwapBuffersWithDamageKHR");
 
 #ifndef DALI_PROFILE_UBUNTU
     if(mSwapBufferCountAfterResume < THRESHOLD_SWAPBUFFER_COUNT)
@@ -653,23 +606,19 @@ void EglImplementation::SwapBuffers(EGLSurface& eglSurface, const std::vector<Re
       mSwapBufferCountAfterResume++;
     }
 #endif //DALI_PROFILE_UBUNTU
-
-    FINISH_DURATION_CHECK("eglSwapBuffersWithDamageKHR");
   }
 }
 
 void EglImplementation::CopyBuffers(EGLSurface& eglSurface)
 {
-  START_DURATION_CHECK();
+  DALI_TIME_CHECKER_SCOPE(gTimeCheckerFilter, "eglCopyBuffers");
   eglCopyBuffers(mEglDisplay, eglSurface, mCurrentEglNativePixmap);
-  FINISH_DURATION_CHECK("eglCopyBuffers");
 }
 
 void EglImplementation::WaitGL()
 {
-  START_DURATION_CHECK();
+  DALI_TIME_CHECKER_SCOPE(gTimeCheckerFilter, "eglWaitGL");
   eglWaitGL();
-  FINISH_DURATION_CHECK("eglWaitGL");
 }
 
 bool EglImplementation::ChooseConfig(bool isWindowType, ColorDepth depth)
@@ -740,9 +689,9 @@ bool EglImplementation::ChooseConfig(bool isWindowType, ColorDepth depth)
   configAttribs.PushBack(EGL_NONE);
 
   DALI_TRACE_BEGIN(gTraceFilter, "DALI_EGL_CHOOSE_CONFIG");
-  START_DURATION_CHECK();
+  DALI_TIME_CHECKER_BEGIN(gTimeCheckerFilter);
   auto ret = eglChooseConfig(mEglDisplay, &(configAttribs[0]), &mEglConfig, 1, &numConfigs);
-  FINISH_DURATION_CHECK("eglChooseConfig");
+  DALI_TIME_CHECKER_END_WITH_MESSAGE(gTimeCheckerFilter, "eglChooseConfig");
   DALI_TRACE_END(gTraceFilter, "DALI_EGL_CHOOSE_CONFIG");
 
   // Ensure number of configs is set to 1 as on some drivers,
@@ -826,15 +775,16 @@ EGLSurface EglImplementation::CreateSurfaceWindow(EGLNativeWindowType window, Co
   // egl choose config
   ChooseConfig(mIsWindow, mColorDepth);
 
-  DALI_TRACE_BEGIN_WITH_MESSAGE_GENERATOR(gTraceFilter, "DALI_EGL_CREATE_SURFACE", [&](std::ostringstream& oss) {
-    oss << "[display:" << mEglDisplay << "]";
-  });
-  START_DURATION_CHECK();
-  mCurrentEglSurface = eglCreateWindowSurface(mEglDisplay, mEglConfig, mEglNativeWindow, NULL);
-  FINISH_DURATION_CHECK("eglCreateWindowSurface");
-  DALI_TRACE_END_WITH_MESSAGE_GENERATOR(gTraceFilter, "DALI_EGL_CREATE_SURFACE", [&](std::ostringstream& oss) {
-    oss << "[window surface:" << mCurrentEglSurface << "]";
-  });
+  {
+    DALI_TRACE_BEGIN_WITH_MESSAGE_GENERATOR(gTraceFilter, "DALI_EGL_CREATE_SURFACE", [&](std::ostringstream& oss) {
+      oss << "[display:" << mEglDisplay << "]";
+    });
+    DALI_TIME_CHECKER_SCOPE(gTimeCheckerFilter, "eglCreateWindowSurface");
+    mCurrentEglSurface = eglCreateWindowSurface(mEglDisplay, mEglConfig, mEglNativeWindow, NULL);
+    DALI_TRACE_END_WITH_MESSAGE_GENERATOR(gTraceFilter, "DALI_EGL_CREATE_SURFACE", [&](std::ostringstream& oss) {
+      oss << "[window surface:" << mCurrentEglSurface << "]";
+    });
+  }
 
   TEST_EGL_ERROR("eglCreateWindowSurface");
 
@@ -852,15 +802,16 @@ EGLSurface EglImplementation::CreateSurfacePixmap(EGLNativePixmapType pixmap, Co
   // egl choose config
   ChooseConfig(mIsWindow, mColorDepth);
 
-  DALI_TRACE_BEGIN_WITH_MESSAGE_GENERATOR(gTraceFilter, "DALI_EGL_CREATE_SURFACE", [&](std::ostringstream& oss) {
-    oss << "[display:" << mEglDisplay << "]";
-  });
-  START_DURATION_CHECK();
-  mCurrentEglSurface = eglCreatePixmapSurface(mEglDisplay, mEglConfig, mCurrentEglNativePixmap, NULL);
-  FINISH_DURATION_CHECK("eglCreatePixmapSurface");
-  DALI_TRACE_END_WITH_MESSAGE_GENERATOR(gTraceFilter, "DALI_EGL_CREATE_SURFACE", [&](std::ostringstream& oss) {
-    oss << "[pixmap surface:" << mCurrentEglSurface << "]";
-  });
+  {
+    DALI_TRACE_BEGIN_WITH_MESSAGE_GENERATOR(gTraceFilter, "DALI_EGL_CREATE_SURFACE", [&](std::ostringstream& oss) {
+      oss << "[display:" << mEglDisplay << "]";
+    });
+    DALI_TIME_CHECKER_SCOPE(gTimeCheckerFilter, "eglCreatePixmapSurface");
+    mCurrentEglSurface = eglCreatePixmapSurface(mEglDisplay, mEglConfig, mCurrentEglNativePixmap, NULL);
+    DALI_TRACE_END_WITH_MESSAGE_GENERATOR(gTraceFilter, "DALI_EGL_CREATE_SURFACE", [&](std::ostringstream& oss) {
+      oss << "[pixmap surface:" << mCurrentEglSurface << "]";
+    });
+  }
 
   TEST_EGL_ERROR("eglCreatePixmapSurface");
 
@@ -938,13 +889,12 @@ bool EglImplementation::IsSurfacelessContextSupported() const
 
 void EglImplementation::WaitClient()
 {
-  START_DURATION_CHECK();
+  DALI_TIME_CHECKER_SCOPE(gTimeCheckerFilter, "eglWaitClient");
   // Wait for EGL to finish executing all rendering calls for the current context
   if(eglWaitClient() != EGL_TRUE)
   {
     TEST_EGL_ERROR("eglWaitClient");
   }
-  FINISH_DURATION_CHECK("eglWaitClient");
 }
 
 bool EglImplementation::IsPartialUpdateRequired() const
index 57fdb16a72c6c5ca95a2499b1e087f954289028b..a22cc301c175d15bb5a68d9dd9cdeaa374b1e6a0 100644 (file)
@@ -247,7 +247,6 @@ private:
 
   int32_t  mMultiSamplingLevel;
   int32_t  mGlesVersion;
-  uint32_t mLogThreshold{0};
 
   ColorDepth mColorDepth;
 
@@ -259,7 +258,6 @@ private:
   bool mPartialUpdateRequired;
   bool mIsSurfacelessContextSupported;
   bool mIsKhrCreateContextSupported;
-  bool mLogEnabled{false};
 
   uint32_t                           mSwapBufferCountAfterResume;
   PFNEGLSETDAMAGEREGIONKHRPROC       mEglSetDamageRegionKHR;
index 812843abe01c7382e70e22095b3e8b6b06249254..5aa582dc3f15c5cba9c5f68701a050153583d8b9 100644 (file)
@@ -56,13 +56,6 @@ static constexpr const char* FRAGMENT_SHADER_OUTPUT_COLOR_STRING =
 static constexpr const char* OES_EGL_IMAGE_EXTERNAL_STRING = "#extension GL_OES_EGL_image_external:require\n";
 
 static constexpr const char* OES_EGL_IMAGE_EXTERNAL_STRING_ESSL3 = "#extension GL_OES_EGL_image_external_essl3:require\n";
-
-static uint32_t GetPerformanceLogThresholdTime()
-{
-  auto     timeString = Dali::EnvironmentVariable::GetEnvironmentVariable(DALI_ENV_EGL_PERFORMANCE_LOG_THRESHOLD_TIME);
-  uint32_t time       = timeString ? static_cast<uint32_t>(std::atoi(timeString)) : std::numeric_limits<uint32_t>::max();
-  return time;
-}
 } // namespace
 
 GlImplementation::GlImplementation()
@@ -196,8 +189,7 @@ void GlImplementation::ContextCreated()
     }
   }
 
-  mLogThreshold = GetPerformanceLogThresholdTime();
-  mLogEnabled   = mLogThreshold < std::numeric_limits<uint32_t>::max() ? true : false;
+  mTimeCheckerFilter = Dali::Integration::TimeChecker::ThresholdFilter::New(std::numeric_limits<uint32_t>::max(), DALI_ENV_EGL_PERFORMANCE_LOG_THRESHOLD_TIME);
 
   {
     ConditionalWait::ScopedLock lock(mContextCreatedWaitCondition);
index 0af190cf08da7979318516c7a64b3f3bef32e8e9..48543b786cdc0698b34de9e15932ba98416a78aa 100644 (file)
@@ -22,6 +22,7 @@
 #include <GLES2/gl2.h>
 #include <GLES2/gl2ext.h>
 #include <dali/devel-api/threading/conditional-wait.h>
+#include <dali/integration-api/debug.h>
 #include <dali/integration-api/gl-abstraction.h>
 #include <dali/internal/graphics/common/egl-include.h>
 #include <dali/public-api/common/vector-wrapper.h>
@@ -43,42 +44,6 @@ namespace Internal
 {
 namespace Adaptor
 {
-namespace
-{
-#ifndef START_DURATION_CHECK
-#define START_DURATION_CHECK()                         \
-  uint64_t startTimeNanoSeconds = 0ull;                \
-  uint64_t endTimeNanoSeconds   = 0ull;                \
-  if(mLogEnabled)                                      \
-  {                                                    \
-    TimeService::GetNanoseconds(startTimeNanoSeconds); \
-  }
-#endif
-
-#ifndef FINISH_DURATION_CHECK
-#define FINISH_DURATION_CHECK(functionName)                                                                                                                \
-  if(mLogEnabled)                                                                                                                                          \
-  {                                                                                                                                                        \
-    TimeService::GetNanoseconds(endTimeNanoSeconds);                                                                                                       \
-    if(static_cast<uint32_t>((endTimeNanoSeconds - startTimeNanoSeconds) / 1000000ull) >= mLogThreshold)                                                   \
-    {                                                                                                                                                      \
-      DALI_LOG_RELEASE_INFO("%s takes long time! [%.6lf ms]\n", functionName, static_cast<double>(endTimeNanoSeconds - startTimeNanoSeconds) / 1000000.0); \
-    }                                                                                                                                                      \
-  }
-#endif
-
-#ifndef FINISH_DURATION_CHECK_WITH_FORMAT
-#define FINISH_DURATION_CHECK_WITH_FORMAT(functionName, format, ...)                                                                                                                 \
-  if(mLogEnabled)                                                                                                                                                                    \
-  {                                                                                                                                                                                  \
-    TimeService::GetNanoseconds(endTimeNanoSeconds);                                                                                                                                 \
-    if(static_cast<uint32_t>((endTimeNanoSeconds - startTimeNanoSeconds) / 1000000ull) >= mLogThreshold)                                                                             \
-    {                                                                                                                                                                                \
-      DALI_LOG_RELEASE_INFO("%s takes long time! [%.6lf ms] " format "\n", functionName, static_cast<double>(endTimeNanoSeconds - startTimeNanoSeconds) / 1000000.0, ##__VA_ARGS__); \
-    }                                                                                                                                                                                \
-  }
-#endif
-} // namespace
 /**
  * GlImplementation is a concrete implementation for GlAbstraction.
  * The class provides an OpenGL-ES 2.0 or 3.0 implementation.
@@ -402,11 +367,8 @@ public:
 
   void Clear(GLbitfield mask) override
   {
-    START_DURATION_CHECK();
-
+    DALI_TIME_CHECKER_SCOPE(mTimeCheckerFilter, "glClear");
     glClear(mask);
-
-    FINISH_DURATION_CHECK("glClear");
   }
 
   void ClearColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha) override
@@ -431,29 +393,35 @@ public:
 
   void CompileShader(GLuint shader) override
   {
-    START_DURATION_CHECK();
+    DALI_TIME_CHECKER_BEGIN(mTimeCheckerFilter);
 
     glCompileShader(shader);
 
-    FINISH_DURATION_CHECK_WITH_FORMAT("glCompileShader", "shader id : %u", shader);
+    DALI_TIME_CHECKER_END_WITH_MESSAGE_GENERATOR(mTimeCheckerFilter, [&](std::ostringstream& oss) {
+      oss << "glCompileShader shader id : " << shader;
+    });
   }
 
   void CompressedTexImage2D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void* data) override
   {
-    START_DURATION_CHECK();
+    DALI_TIME_CHECKER_BEGIN(mTimeCheckerFilter);
 
     glCompressedTexImage2D(target, level, internalformat, width, height, border, imageSize, data);
 
-    FINISH_DURATION_CHECK_WITH_FORMAT("glCompressedTexImage2D", "size : %u x %u", width, height);
+    DALI_TIME_CHECKER_END_WITH_MESSAGE_GENERATOR(mTimeCheckerFilter, [&](std::ostringstream& oss) {
+      oss << "glCompressedTexImage2D size : " << width << " x " << height;
+    });
   }
 
   void CompressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void* data) override
   {
-    START_DURATION_CHECK();
+    DALI_TIME_CHECKER_BEGIN(mTimeCheckerFilter);
 
     glCompressedTexSubImage2D(target, level, xoffset, yoffset, width, height, format, imageSize, data);
 
-    FINISH_DURATION_CHECK_WITH_FORMAT("glCompressedTexSubImage2D", "size : %u x %u", width, height);
+    DALI_TIME_CHECKER_END_WITH_MESSAGE_GENERATOR(mTimeCheckerFilter, [&](std::ostringstream& oss) {
+      oss << "glCompressedTexSubImage2D size : " << width << " x " << height;
+    });
   }
 
   void CopyTexImage2D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border) override
@@ -563,20 +531,14 @@ public:
 
   void Finish(void) override
   {
-    START_DURATION_CHECK();
-
+    DALI_TIME_CHECKER_SCOPE(mTimeCheckerFilter, "glFinish");
     glFinish();
-
-    FINISH_DURATION_CHECK("glFinish");
   }
 
   void Flush(void) override
   {
-    START_DURATION_CHECK();
-
+    DALI_TIME_CHECKER_SCOPE(mTimeCheckerFilter, "glFlush");
     glFlush();
-
-    FINISH_DURATION_CHECK("glFlush");
   }
 
   void FramebufferRenderbuffer(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer) override
@@ -601,6 +563,7 @@ public:
 
   void GenerateMipmap(GLenum target) override
   {
+    DALI_TIME_CHECKER_SCOPE(mTimeCheckerFilter, "glGenerateMipmap");
     glGenerateMipmap(target);
   }
 
@@ -796,11 +759,13 @@ public:
 
   void LinkProgram(GLuint program) override
   {
-    START_DURATION_CHECK();
+    DALI_TIME_CHECKER_BEGIN(mTimeCheckerFilter);
 
     glLinkProgram(program);
 
-    FINISH_DURATION_CHECK_WITH_FORMAT("glLinkProgram", "program id : %u", program);
+    DALI_TIME_CHECKER_END_WITH_MESSAGE_GENERATOR(mTimeCheckerFilter, [&](std::ostringstream& oss) {
+      oss << "glLinkProgram program id : " << program;
+    });
   }
 
   void PixelStorei(GLenum pname, GLint param) override
@@ -815,7 +780,13 @@ public:
 
   void ReadPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, void* pixels) override
   {
+    DALI_TIME_CHECKER_BEGIN(mTimeCheckerFilter);
+
     glReadPixels(x, y, width, height, format, type, pixels);
+
+    DALI_TIME_CHECKER_END_WITH_MESSAGE_GENERATOR(mTimeCheckerFilter, [&](std::ostringstream& oss) {
+      oss << "glReadPixels size : (" << x << "," << y << ") " << width << "x" << height << ", format : " << format << ", type : " << type;
+    });
   }
 
   void ReleaseShaderCompiler(void) override
@@ -880,11 +851,13 @@ public:
 
   void TexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void* pixels) override
   {
-    START_DURATION_CHECK();
+    DALI_TIME_CHECKER_BEGIN(mTimeCheckerFilter);
 
     glTexImage2D(target, level, internalformat, width, height, border, format, type, pixels);
 
-    FINISH_DURATION_CHECK_WITH_FORMAT("glTexImage2D", "size : %u x %u, format : %d, type : %d", width, height, static_cast<int>(format), static_cast<int>(type));
+    DALI_TIME_CHECKER_END_WITH_MESSAGE_GENERATOR(mTimeCheckerFilter, [&](std::ostringstream& oss) {
+      oss << "glTexImage2D size : " << width << " x " << height << ", format : " << format << ", type : " << type;
+    });
   }
 
   void TexParameterf(GLenum target, GLenum pname, GLfloat param) override
@@ -909,11 +882,13 @@ public:
 
   void TexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void* pixels) override
   {
-    START_DURATION_CHECK();
+    DALI_TIME_CHECKER_BEGIN(mTimeCheckerFilter);
 
     glTexSubImage2D(target, level, xoffset, yoffset, width, height, format, type, pixels);
 
-    FINISH_DURATION_CHECK_WITH_FORMAT("glTexSubImage2D", "size : %u x %u, format : %d, type : %d", width, height, static_cast<int>(format), static_cast<int>(type));
+    DALI_TIME_CHECKER_END_WITH_MESSAGE_GENERATOR(mTimeCheckerFilter, [&](std::ostringstream& oss) {
+      oss << "glTexSubImage2D size : " << width << " x " << height << ", format : " << format << ", type : " << type;
+    });
   }
 
   void Uniform1f(GLint location, GLfloat x) override
@@ -1616,6 +1591,8 @@ private:
 
   GlExtensionCache::GlExtensionSupportedCacheList mGlExtensionSupportedCacheList;
 
+  Dali::Integration::TimeChecker::ThresholdFilter* mTimeCheckerFilter{nullptr}; ///< For duration checking. (not owned)
+
   ConditionalWait mContextCreatedWaitCondition;
   GLint           mMaxTextureSize;
   GLint           mMaxCombinedTextureUnits;
@@ -1625,23 +1602,10 @@ private:
   std::string     mFragmentShaderPrefix;
   int32_t         mGlesVersion;
   int32_t         mShadingLanguageVersion;
-  uint32_t        mLogThreshold{0};
   bool            mShadingLanguageVersionCached;
   bool            mIsSurfacelessContextSupported;
   bool            mIsContextCreated;
-  bool            mLogEnabled{false};
 };
-#ifdef START_DURATION_CHECK
-#undef START_DURATION_CHECK
-#endif
-
-#ifdef FINISH_DURATION_CHECK
-#undef FINISH_DURATION_CHECK
-#endif
-
-#ifdef FINISH_DURATION_CHECK_WITH_FORMAT
-#undef FINISH_DURATION_CHECK_WITH_FORMAT
-#endif
 
 } // namespace Adaptor