/
tomilov
/
sah_kd_tree
Обзор
Документация
Войти
/
tomilov
/
sah_kd_tree
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
Аналитика
Безопасность
develop
src/debug_utils/renderdoc.cpp
115 строк
3 KB
Anatoliy Tomilov
works
25 июл 2024, 11:26
25 июл 2024, 11:26
a2b9854
Код
Авторство
О чём код?
#include <debug_utils/renderdoc.hpp> #include <utils/auto_cast.hpp> #include <fmt/format.h> #include <spdlog/spdlog.h> #include <memory> #include <dlfcn.h> #include <renderdoc_app.h> namespace debug_utils { namespace { RENDERDOC_DevicePointer getDevice(vk::Instance instance) { if (!instance) { return nullptr; } return RENDERDOC_DEVICEPOINTER_FROM_VKINSTANCE(VkInstance(instance)); } } // namespace struct Renderdoc::Impl { static constexpr const char * kLibraryName = "librenderdoc.so"; #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wignored-attributes" std::unique_ptr<void, decltype((::dlclose))> library{::dlopen(kLibraryName, RTLD_NOW | RTLD_NOLOAD), ::dlclose}; #pragma GCC diagnostic pop pRENDERDOC_GetAPI getApi = nullptr; RENDERDOC_API_1_6_0 * api = nullptr; mutable std::mutex mutex; Impl() { SPDLOG_INFO("About to create Renderdoc API"); if (!library) { SPDLOG_INFO("Cannot load dynamic library {}", kLibraryName); return; } constexpr const char * kGetApiFunctionName = "RENDERDOC_GetAPI"; getApi = reinterpret_cast<pRENDERDOC_GetAPI>(::dlsym(library.get(), kGetApiFunctionName)); if (!getApi) { SPDLOG_INFO("Cannot load function {}", kGetApiFunctionName); return; } constexpr RENDERDOC_Version kRenderdocVersion = eRENDERDOC_API_Version_1_6_0; if (getApi(kRenderdocVersion, utils::autoCast(&api)) != 1) { SPDLOG_INFO("Cannot load API of version {}", fmt::underlying(kRenderdocVersion)); return; } } }; Renderdoc::Renderdoc() = default; Renderdoc::~Renderdoc() = default; const Renderdoc & Renderdoc::renderdoc() { static Renderdoc renderdoc; return renderdoc; } Renderdoc::FrameCapture::~FrameCapture() { if (!lock.mutex()) { return; } if (!impl.api) { return; } SPDLOG_INFO("Frame capture end"); ASSERT(Renderdoc::isFrameCapturing()); impl.api->EndFrameCapture(getDevice(instance), window); ASSERT(!Renderdoc::isFrameCapturing()); } void Renderdoc::FrameCapture::completeClassContext() { checkTraits(); } Renderdoc::FrameCapture::FrameCapture(const Impl & impl, vk::Instance instance, WindowHandle window) : impl{impl} , instance{instance} , window{window} , lock{impl.mutex} { if (!impl.api) { return; } SPDLOG_INFO("Frame capture begin"); ASSERT(!Renderdoc::isFrameCapturing()); impl.api->StartFrameCapture(getDevice(instance), window); ASSERT(Renderdoc::isFrameCapturing()); } auto Renderdoc::makeFrameCapture(vk::Instance instance, WindowHandle window) -> FrameCapture { return {*renderdoc().impl_, instance, window}; } bool Renderdoc::isFrameCapturing() { if (!renderdoc().impl_->api) { return false; } return renderdoc().impl_->api->IsFrameCapturing() == 1; } } // namespace debug_utils