// // Copyright 2021 The ANGLE Project Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // // RenderDoc: // Connection to renderdoc for capturing tests through its API. // #include "RenderDoc.h" #include "common/angleutils.h" #include "common/debug.h" RenderDoc::RenderDoc() : mRenderDocModule(nullptr), mApi(nullptr) {} RenderDoc::~RenderDoc() { SafeDelete(mRenderDocModule); } #if defined(ANGLE_PLATFORM_ANDROID) || defined(ANGLE_PLATFORM_LINUX) || \ defined(ANGLE_PLATFORM_WINDOWS) # include "third_party/renderdoc/src/renderdoc_app.h" # if defined(ANGLE_PLATFORM_WINDOWS) constexpr char kRenderDocModuleName[] = "renderdoc"; # elif defined(ANGLE_PLATFORM_ANDROID) constexpr char kRenderDocModuleName[] = "libVkLayer_GLES_RenderDoc"; # else constexpr char kRenderDocModuleName[] = "librenderdoc"; # endif void RenderDoc::attach() { mRenderDocModule = OpenSharedLibrary(kRenderDocModuleName, angle::SearchType::AlreadyLoaded); if (mRenderDocModule == nullptr || mRenderDocModule->getNative() == nullptr) { return; } void *getApi = mRenderDocModule->getSymbol("RENDERDOC_GetAPI"); if (getApi == nullptr) { return; } int result = reinterpret_cast(getApi)(eRENDERDOC_API_Version_1_1_2, &mApi); if (result != 1) { ERR() << "RenderDoc module is present but API 1.1.2 is unavailable"; mApi = nullptr; } } void RenderDoc::startFrame() { if (mApi) { static_cast(mApi)->StartFrameCapture(nullptr, nullptr); } } void RenderDoc::endFrame() { if (mApi) { static_cast(mApi)->EndFrameCapture(nullptr, nullptr); } } #else // defiend(ANGLE_PLATFORM_ANDROID) || defined(ANGLE_PLATFORM_LINUX) || // defined(ANGLE_PLATFORM_WINDOWS) // Stub out the implementation on unsupported platforms. void RenderDoc::attach() { mApi = nullptr; } void RenderDoc::startFrame() {} void RenderDoc::endFrame() {} #endif // defiend(ANGLE_PLATFORM_ANDROID) || defined(ANGLE_PLATFORM_LINUX) || // defined(ANGLE_PLATFORM_WINDOWS)