blob: 9a7b3a11199db6fc5969a5184c3fe47603c86e94 [file] [log] [blame]
//
// 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<pRENDERDOC_GetAPI>(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<RENDERDOC_API_1_1_2 *>(mApi)->StartFrameCapture(nullptr, nullptr);
}
}
void RenderDoc::endFrame()
{
if (mApi)
{
static_cast<RENDERDOC_API_1_1_2 *>(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)