xref: /aosp_15_r20/external/angle/src/tests/test_utils/RenderDoc.cpp (revision 8975f5c5ed3d1c378011245431ada316dfb6f244)
1*8975f5c5SAndroid Build Coastguard Worker //
2*8975f5c5SAndroid Build Coastguard Worker // Copyright 2021 The ANGLE Project Authors. All rights reserved.
3*8975f5c5SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
4*8975f5c5SAndroid Build Coastguard Worker // found in the LICENSE file.
5*8975f5c5SAndroid Build Coastguard Worker //
6*8975f5c5SAndroid Build Coastguard Worker // RenderDoc:
7*8975f5c5SAndroid Build Coastguard Worker //   Connection to renderdoc for capturing tests through its API.
8*8975f5c5SAndroid Build Coastguard Worker //
9*8975f5c5SAndroid Build Coastguard Worker 
10*8975f5c5SAndroid Build Coastguard Worker #include "RenderDoc.h"
11*8975f5c5SAndroid Build Coastguard Worker 
12*8975f5c5SAndroid Build Coastguard Worker #include "common/angleutils.h"
13*8975f5c5SAndroid Build Coastguard Worker #include "common/debug.h"
14*8975f5c5SAndroid Build Coastguard Worker 
RenderDoc()15*8975f5c5SAndroid Build Coastguard Worker RenderDoc::RenderDoc() : mRenderDocModule(nullptr), mApi(nullptr) {}
16*8975f5c5SAndroid Build Coastguard Worker 
~RenderDoc()17*8975f5c5SAndroid Build Coastguard Worker RenderDoc::~RenderDoc()
18*8975f5c5SAndroid Build Coastguard Worker {
19*8975f5c5SAndroid Build Coastguard Worker     SafeDelete(mRenderDocModule);
20*8975f5c5SAndroid Build Coastguard Worker }
21*8975f5c5SAndroid Build Coastguard Worker 
22*8975f5c5SAndroid Build Coastguard Worker #if defined(ANGLE_PLATFORM_ANDROID) || defined(ANGLE_PLATFORM_LINUX) || \
23*8975f5c5SAndroid Build Coastguard Worker     defined(ANGLE_PLATFORM_WINDOWS)
24*8975f5c5SAndroid Build Coastguard Worker #    include "third_party/renderdoc/src/renderdoc_app.h"
25*8975f5c5SAndroid Build Coastguard Worker 
26*8975f5c5SAndroid Build Coastguard Worker #    if defined(ANGLE_PLATFORM_WINDOWS)
27*8975f5c5SAndroid Build Coastguard Worker constexpr char kRenderDocModuleName[] = "renderdoc";
28*8975f5c5SAndroid Build Coastguard Worker #    elif defined(ANGLE_PLATFORM_ANDROID)
29*8975f5c5SAndroid Build Coastguard Worker constexpr char kRenderDocModuleName[] = "libVkLayer_GLES_RenderDoc";
30*8975f5c5SAndroid Build Coastguard Worker #    else
31*8975f5c5SAndroid Build Coastguard Worker constexpr char kRenderDocModuleName[] = "librenderdoc";
32*8975f5c5SAndroid Build Coastguard Worker #    endif
33*8975f5c5SAndroid Build Coastguard Worker 
attach()34*8975f5c5SAndroid Build Coastguard Worker void RenderDoc::attach()
35*8975f5c5SAndroid Build Coastguard Worker {
36*8975f5c5SAndroid Build Coastguard Worker     mRenderDocModule = OpenSharedLibrary(kRenderDocModuleName, angle::SearchType::AlreadyLoaded);
37*8975f5c5SAndroid Build Coastguard Worker     if (mRenderDocModule == nullptr || mRenderDocModule->getNative() == nullptr)
38*8975f5c5SAndroid Build Coastguard Worker     {
39*8975f5c5SAndroid Build Coastguard Worker         return;
40*8975f5c5SAndroid Build Coastguard Worker     }
41*8975f5c5SAndroid Build Coastguard Worker     void *getApi = mRenderDocModule->getSymbol("RENDERDOC_GetAPI");
42*8975f5c5SAndroid Build Coastguard Worker     if (getApi == nullptr)
43*8975f5c5SAndroid Build Coastguard Worker     {
44*8975f5c5SAndroid Build Coastguard Worker         return;
45*8975f5c5SAndroid Build Coastguard Worker     }
46*8975f5c5SAndroid Build Coastguard Worker 
47*8975f5c5SAndroid Build Coastguard Worker     int result = reinterpret_cast<pRENDERDOC_GetAPI>(getApi)(eRENDERDOC_API_Version_1_1_2, &mApi);
48*8975f5c5SAndroid Build Coastguard Worker     if (result != 1)
49*8975f5c5SAndroid Build Coastguard Worker     {
50*8975f5c5SAndroid Build Coastguard Worker         ERR() << "RenderDoc module is present but API 1.1.2 is unavailable";
51*8975f5c5SAndroid Build Coastguard Worker         mApi = nullptr;
52*8975f5c5SAndroid Build Coastguard Worker     }
53*8975f5c5SAndroid Build Coastguard Worker }
54*8975f5c5SAndroid Build Coastguard Worker 
startFrame()55*8975f5c5SAndroid Build Coastguard Worker void RenderDoc::startFrame()
56*8975f5c5SAndroid Build Coastguard Worker {
57*8975f5c5SAndroid Build Coastguard Worker     if (mApi)
58*8975f5c5SAndroid Build Coastguard Worker     {
59*8975f5c5SAndroid Build Coastguard Worker         static_cast<RENDERDOC_API_1_1_2 *>(mApi)->StartFrameCapture(nullptr, nullptr);
60*8975f5c5SAndroid Build Coastguard Worker     }
61*8975f5c5SAndroid Build Coastguard Worker }
62*8975f5c5SAndroid Build Coastguard Worker 
endFrame()63*8975f5c5SAndroid Build Coastguard Worker void RenderDoc::endFrame()
64*8975f5c5SAndroid Build Coastguard Worker {
65*8975f5c5SAndroid Build Coastguard Worker     if (mApi)
66*8975f5c5SAndroid Build Coastguard Worker     {
67*8975f5c5SAndroid Build Coastguard Worker         static_cast<RENDERDOC_API_1_1_2 *>(mApi)->EndFrameCapture(nullptr, nullptr);
68*8975f5c5SAndroid Build Coastguard Worker     }
69*8975f5c5SAndroid Build Coastguard Worker }
70*8975f5c5SAndroid Build Coastguard Worker 
71*8975f5c5SAndroid Build Coastguard Worker #else  // defiend(ANGLE_PLATFORM_ANDROID) || defined(ANGLE_PLATFORM_LINUX) ||
72*8975f5c5SAndroid Build Coastguard Worker        // defined(ANGLE_PLATFORM_WINDOWS)
73*8975f5c5SAndroid Build Coastguard Worker 
74*8975f5c5SAndroid Build Coastguard Worker // Stub out the implementation on unsupported platforms.
attach()75*8975f5c5SAndroid Build Coastguard Worker void RenderDoc::attach()
76*8975f5c5SAndroid Build Coastguard Worker {
77*8975f5c5SAndroid Build Coastguard Worker     mApi = nullptr;
78*8975f5c5SAndroid Build Coastguard Worker }
79*8975f5c5SAndroid Build Coastguard Worker 
startFrame()80*8975f5c5SAndroid Build Coastguard Worker void RenderDoc::startFrame() {}
81*8975f5c5SAndroid Build Coastguard Worker 
endFrame()82*8975f5c5SAndroid Build Coastguard Worker void RenderDoc::endFrame() {}
83*8975f5c5SAndroid Build Coastguard Worker 
84*8975f5c5SAndroid Build Coastguard Worker #endif  // defiend(ANGLE_PLATFORM_ANDROID) || defined(ANGLE_PLATFORM_LINUX) ||
85*8975f5c5SAndroid Build Coastguard Worker         // defined(ANGLE_PLATFORM_WINDOWS)
86