X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=dali%2Finternal%2Fgraphics%2Fgles-impl%2Fgles-sync-pool.cpp;h=c4cd3991697fadc14fee037395b80660b8c03fc1;hb=7b45a4ba923e7cf73359e308e9a638f89b99c9ec;hp=770deb0eee41a0e827158c683301c3ae969954b8;hpb=90f2678cf839da3ccd3cac1b71e1e44f1312a63c;p=platform%2Fcore%2Fuifw%2Fdali-adaptor.git diff --git a/dali/internal/graphics/gles-impl/gles-sync-pool.cpp b/dali/internal/graphics/gles-impl/gles-sync-pool.cpp index 770deb0..c4cd399 100644 --- a/dali/internal/graphics/gles-impl/gles-sync-pool.cpp +++ b/dali/internal/graphics/gles-impl/gles-sync-pool.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022 Samsung Electronics Co., Ltd. + * Copyright (c) 2024 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. @@ -22,46 +22,128 @@ // Internal Headers #include +#include + +#if defined(DEBUG_ENABLED) +extern Debug::Filter* gLogSyncFilter; +#endif namespace Dali::Graphics::GLES { -AgingSyncObject::AgingSyncObject(Graphics::EglGraphicsController& controller, const Context* writeContext) +AgingSyncObject::AgingSyncObject(Graphics::EglGraphicsController& controller, const Context* writeContext, bool _egl) : controller(controller), - writeContext(writeContext) + writeContext(writeContext), + egl(_egl) { - auto gl = controller.GetGL(); - if(gl) + if(egl) + { + eglSyncObject = static_cast(controller.GetEglSyncImplementation().CreateSyncObject()); + DALI_LOG_INFO(gLogSyncFilter, Debug::Verbose, "AgingSyncObject::cons; EGL::CreateSyncObject: %p\n", eglSyncObject); + } + else { - glSyncObject = gl->FenceSync(GL_SYNC_GPU_COMMANDS_COMPLETE, 0); + auto gl = controller.GetGL(); + if(gl) + { + glSyncObject = gl->FenceSync(GL_SYNC_GPU_COMMANDS_COMPLETE, 0); + } } } AgingSyncObject::~AgingSyncObject() { - auto gl = controller.GetGL(); - if(gl && glSyncObject != nullptr) + if(!controller.IsShuttingDown()) { - gl->DeleteSync(glSyncObject); + if(egl) + { + DALI_LOG_INFO(gLogSyncFilter, Debug::Verbose, "AgingSyncObject::dstr; EGL::DestroySyncObject: %p\n", eglSyncObject); + controller.GetEglSyncImplementation().DestroySyncObject(eglSyncObject); + } + else + { + auto gl = controller.GetGL(); + if(gl && glSyncObject != nullptr) + { + gl->DeleteSync(glSyncObject); + } + } + } +} + +bool AgingSyncObject::ClientWait() +{ + bool synced = false; + if(egl) + { + if(eglSyncObject) + { + DALI_LOG_INFO(gLogSyncFilter, Debug::Verbose, "AgingSyncObject::ClientWait(); EGL::ClientWaitSync\n"); + eglSyncObject->ClientWait(); + synced = true; + } + } + else + { + auto gl = controller.GetGL(); + if(gl && glSyncObject) + { + DALI_LOG_INFO(gLogSyncFilter, Debug::Verbose, "AgingSyncObject::ClientWait(); glClientWaitSync 1ms\n"); + const GLuint64 TIMEOUT = 1000000; //1ms! + GLenum result = gl->ClientWaitSync(glSyncObject, GL_SYNC_FLUSH_COMMANDS_BIT, TIMEOUT); + + synced = (result == GL_ALREADY_SIGNALED || result == GL_CONDITION_SATISFIED); + } + } + DALI_LOG_INFO(gLogSyncFilter, Debug::Verbose, "AgingSyncObject::ClientWait(); Result: %s\n", synced ? "Synced" : "NOT SYNCED"); + return synced; +} + +void AgingSyncObject::Wait() +{ + if(egl) + { + if(eglSyncObject) + { + DALI_LOG_INFO(gLogSyncFilter, Debug::Verbose, "AgingSyncObject::Wait(); EGL::WaitSync\n"); + eglSyncObject->Wait(); + } + } + else + { + auto gl = controller.GetGL(); + if(gl && glSyncObject) + { + DALI_LOG_INFO(gLogSyncFilter, Debug::Verbose, "AgingSyncObject::Wait(); glWaitSync\n"); + gl->WaitSync(glSyncObject, 0, 0ull); + } } } SyncPool::~SyncPool() = default; -AgingSyncObject* SyncPool::AllocateSyncObject(const Context* writeContext) +AgingSyncObject* SyncPool::AllocateSyncObject(const Context* writeContext, SyncPool::SyncContext syncContext) { - std::unique_ptr syncObject = std::make_unique(mController, writeContext); + std::unique_ptr syncObject = std::make_unique(mController, writeContext, (syncContext == SyncContext::EGL)); mSyncObjects.push_back(std::move(syncObject)); return mSyncObjects.back().get(); } void SyncPool::Wait(AgingSyncObject* syncPoolObject) { - auto gl = mController.GetGL(); - if(gl && syncPoolObject->glSyncObject != nullptr) + if(syncPoolObject != nullptr) { syncPoolObject->syncing = true; - gl->WaitSync(syncPoolObject->glSyncObject, 0, GL_TIMEOUT_IGNORED); + syncPoolObject->Wait(); + } +} + +bool SyncPool::ClientWait(AgingSyncObject* syncPoolObject) +{ + if(syncPoolObject) + { + return syncPoolObject->ClientWait(); } + return false; } void SyncPool::FreeSyncObject(AgingSyncObject* agingSyncObject) @@ -79,12 +161,14 @@ void SyncPool::FreeSyncObject(AgingSyncObject* agingSyncObject) */ void SyncPool::AgeSyncObjects() { + DALI_LOG_INFO(gLogSyncFilter, Debug::Verbose, "AgeSyncObjects: count: %d\n", mSyncObjects.size()); + if(!mSyncObjects.empty()) { // Age the remaining sync objects. for(auto& agingSyncObject : mSyncObjects) { - if(agingSyncObject != nullptr && agingSyncObject->glSyncObject != 0) + if(agingSyncObject != nullptr && (agingSyncObject->glSyncObject != 0 || agingSyncObject->eglSyncObject != nullptr)) { if(agingSyncObject->age > 0) { @@ -100,6 +184,8 @@ void SyncPool::AgeSyncObjects() // Move any old sync objects to the end of the list, and then remove them all. mSyncObjects.erase(std::remove_if(mSyncObjects.begin(), mSyncObjects.end(), [&](std::unique_ptr& agingSyncObject) { return agingSyncObject == nullptr; }), mSyncObjects.end()); + + DALI_LOG_INFO(gLogSyncFilter, Debug::Verbose, "AgeSyncObjects: count after erase: %d\n", mSyncObjects.size()); } } // namespace Dali::Graphics::GLES