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 WorkerRenderDoc::RenderDoc() : mRenderDocModule(nullptr), mApi(nullptr) {} 16*8975f5c5SAndroid Build Coastguard Worker ~RenderDoc()17*8975f5c5SAndroid Build Coastguard WorkerRenderDoc::~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 Workervoid 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 Workervoid 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 Workervoid 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 Workervoid 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 Workervoid RenderDoc::startFrame() {} 81*8975f5c5SAndroid Build Coastguard Worker endFrame()82*8975f5c5SAndroid Build Coastguard Workervoid 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