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