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
bool EglImplementation::InitializeGles(EGLNativeDisplayType display, bool isOwnSurface)
{
- mLogThreshold = GetPerformanceLogThresholdTime();
- mLogEnabled = mLogThreshold < std::numeric_limits<uint32_t>::max() ? true : false;
-
if(!mGlesInitialized)
{
mEglNativeDisplay = display;
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 << "]";
});
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 << "]";
});
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 << "]";
});
{
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);
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 << "]";
});
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;
}
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 << "]";
});
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;
}
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");
}
}
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");
}
}
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();
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();
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()
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");
}
}
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)
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");
}
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");
}
{
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)
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);
age = 0;
}
- FINISH_DURATION_CHECK("eglQuerySurface");
-
return age;
}
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");
}
}
return;
}
- START_DURATION_CHECK();
+ DALI_TIME_CHECKER_SCOPE(gTimeCheckerFilter, "eglSwapBuffersWithDamageKHR");
#ifndef DALI_PROFILE_UBUNTU
if(mSwapBufferCountAfterResume < THRESHOLD_SWAPBUFFER_COUNT)
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)
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,
// 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");
// 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");
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
#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>
{
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.
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
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
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
void GenerateMipmap(GLenum target) override
{
+ DALI_TIME_CHECKER_SCOPE(mTimeCheckerFilter, "glGenerateMipmap");
glGenerateMipmap(target);
}
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
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
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
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
GlExtensionCache::GlExtensionSupportedCacheList mGlExtensionSupportedCacheList;
+ Dali::Integration::TimeChecker::ThresholdFilter* mTimeCheckerFilter{nullptr}; ///< For duration checking. (not owned)
+
ConditionalWait mContextCreatedWaitCondition;
GLint mMaxTextureSize;
GLint mMaxCombinedTextureUnits;
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