xref: /aosp_15_r20/external/angle/samples/capture_replay/CaptureReplay.cpp (revision 8975f5c5ed3d1c378011245431ada316dfb6f244)
1*8975f5c5SAndroid Build Coastguard Worker //
2*8975f5c5SAndroid Build Coastguard Worker // Copyright 2019 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 // CaptureReplay: Template for replaying a frame capture with ANGLE.
7*8975f5c5SAndroid Build Coastguard Worker 
8*8975f5c5SAndroid Build Coastguard Worker #include "SampleApplication.h"
9*8975f5c5SAndroid Build Coastguard Worker 
10*8975f5c5SAndroid Build Coastguard Worker #include <functional>
11*8975f5c5SAndroid Build Coastguard Worker 
12*8975f5c5SAndroid Build Coastguard Worker #include "util/capture/frame_capture_test_utils.h"
13*8975f5c5SAndroid Build Coastguard Worker 
14*8975f5c5SAndroid Build Coastguard Worker class CaptureReplaySample : public SampleApplication
15*8975f5c5SAndroid Build Coastguard Worker {
16*8975f5c5SAndroid Build Coastguard Worker   public:
CaptureReplaySample(int argc,char ** argv,const angle::TraceInfo & traceInfo)17*8975f5c5SAndroid Build Coastguard Worker     CaptureReplaySample(int argc, char **argv, const angle::TraceInfo &traceInfo)
18*8975f5c5SAndroid Build Coastguard Worker         : SampleApplication("CaptureReplaySample",
19*8975f5c5SAndroid Build Coastguard Worker                             argc,
20*8975f5c5SAndroid Build Coastguard Worker                             argv,
21*8975f5c5SAndroid Build Coastguard Worker                             ClientType::ES3_0,
22*8975f5c5SAndroid Build Coastguard Worker                             traceInfo.drawSurfaceWidth,
23*8975f5c5SAndroid Build Coastguard Worker                             traceInfo.drawSurfaceHeight),
24*8975f5c5SAndroid Build Coastguard Worker           mTraceInfo(traceInfo)
25*8975f5c5SAndroid Build Coastguard Worker     {}
26*8975f5c5SAndroid Build Coastguard Worker 
initialize()27*8975f5c5SAndroid Build Coastguard Worker     bool initialize() override
28*8975f5c5SAndroid Build Coastguard Worker     {
29*8975f5c5SAndroid Build Coastguard Worker         mTraceLibrary.reset(new angle::TraceLibrary("capture_replay_sample_trace"));
30*8975f5c5SAndroid Build Coastguard Worker         assert(mTraceLibrary->valid());
31*8975f5c5SAndroid Build Coastguard Worker 
32*8975f5c5SAndroid Build Coastguard Worker         std::stringstream binaryPathStream;
33*8975f5c5SAndroid Build Coastguard Worker         binaryPathStream << angle::GetExecutableDirectory() << angle::GetPathSeparator()
34*8975f5c5SAndroid Build Coastguard Worker                          << ANGLE_CAPTURE_REPLAY_SAMPLE_DATA_DIR;
35*8975f5c5SAndroid Build Coastguard Worker         mTraceLibrary->setBinaryDataDir(binaryPathStream.str().c_str());
36*8975f5c5SAndroid Build Coastguard Worker         mTraceLibrary->setupReplay();
37*8975f5c5SAndroid Build Coastguard Worker         return true;
38*8975f5c5SAndroid Build Coastguard Worker     }
39*8975f5c5SAndroid Build Coastguard Worker 
destroy()40*8975f5c5SAndroid Build Coastguard Worker     void destroy() override { mTraceLibrary->finishReplay(); }
41*8975f5c5SAndroid Build Coastguard Worker 
draw()42*8975f5c5SAndroid Build Coastguard Worker     void draw() override
43*8975f5c5SAndroid Build Coastguard Worker     {
44*8975f5c5SAndroid Build Coastguard Worker         // Compute the current frame, looping from frameStart to frameEnd.
45*8975f5c5SAndroid Build Coastguard Worker         uint32_t frame = mTraceInfo.frameStart +
46*8975f5c5SAndroid Build Coastguard Worker                          (mCurrentFrame % ((mTraceInfo.frameEnd - mTraceInfo.frameStart) + 1));
47*8975f5c5SAndroid Build Coastguard Worker         if (mPreviousFrame > frame)
48*8975f5c5SAndroid Build Coastguard Worker         {
49*8975f5c5SAndroid Build Coastguard Worker             mTraceLibrary->resetReplay();
50*8975f5c5SAndroid Build Coastguard Worker         }
51*8975f5c5SAndroid Build Coastguard Worker         mTraceLibrary->replayFrame(frame);
52*8975f5c5SAndroid Build Coastguard Worker         mPreviousFrame = frame;
53*8975f5c5SAndroid Build Coastguard Worker         mCurrentFrame++;
54*8975f5c5SAndroid Build Coastguard Worker     }
55*8975f5c5SAndroid Build Coastguard Worker 
56*8975f5c5SAndroid Build Coastguard Worker   private:
57*8975f5c5SAndroid Build Coastguard Worker     uint32_t mCurrentFrame  = 0;
58*8975f5c5SAndroid Build Coastguard Worker     uint32_t mPreviousFrame = 0;
59*8975f5c5SAndroid Build Coastguard Worker     const angle::TraceInfo mTraceInfo;
60*8975f5c5SAndroid Build Coastguard Worker     std::unique_ptr<angle::TraceLibrary> mTraceLibrary;
61*8975f5c5SAndroid Build Coastguard Worker };
62*8975f5c5SAndroid Build Coastguard Worker 
main(int argc,char ** argv)63*8975f5c5SAndroid Build Coastguard Worker int main(int argc, char **argv)
64*8975f5c5SAndroid Build Coastguard Worker {
65*8975f5c5SAndroid Build Coastguard Worker     std::string exeDir = angle::GetExecutableDirectory();
66*8975f5c5SAndroid Build Coastguard Worker 
67*8975f5c5SAndroid Build Coastguard Worker     std::stringstream traceJsonPathStream;
68*8975f5c5SAndroid Build Coastguard Worker     traceJsonPathStream << exeDir << angle::GetPathSeparator()
69*8975f5c5SAndroid Build Coastguard Worker                         << ANGLE_CAPTURE_REPLAY_SAMPLE_DATA_DIR << angle::GetPathSeparator()
70*8975f5c5SAndroid Build Coastguard Worker                         << "angle_capture.json";
71*8975f5c5SAndroid Build Coastguard Worker 
72*8975f5c5SAndroid Build Coastguard Worker     std::string traceJsonPath = traceJsonPathStream.str();
73*8975f5c5SAndroid Build Coastguard Worker 
74*8975f5c5SAndroid Build Coastguard Worker     angle::TraceInfo traceInfo = {};
75*8975f5c5SAndroid Build Coastguard Worker     if (!angle::LoadTraceInfoFromJSON("capture_replay_sample_trace", traceJsonPath, &traceInfo))
76*8975f5c5SAndroid Build Coastguard Worker     {
77*8975f5c5SAndroid Build Coastguard Worker         std::cout << "Unable to load trace data: " << traceJsonPath << "\n";
78*8975f5c5SAndroid Build Coastguard Worker         return 1;
79*8975f5c5SAndroid Build Coastguard Worker     }
80*8975f5c5SAndroid Build Coastguard Worker 
81*8975f5c5SAndroid Build Coastguard Worker     CaptureReplaySample app(argc, argv, traceInfo);
82*8975f5c5SAndroid Build Coastguard Worker     return app.run();
83*8975f5c5SAndroid Build Coastguard Worker }
84