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 3,
22 0,
23 traceInfo.drawSurfaceWidth,
24 traceInfo.drawSurfaceHeight),
25 mTraceInfo(traceInfo)
26 {}
27
initialize()28 bool initialize() override
29 {
30 mTraceLibrary.reset(new angle::TraceLibrary("capture_replay_sample_trace"));
31 assert(mTraceLibrary->valid());
32
33 if (mTraceInfo.isBinaryDataCompressed)
34 {
35 mTraceLibrary->setBinaryDataDecompressCallback(angle::DecompressBinaryData);
36 }
37
38 std::stringstream binaryPathStream;
39 binaryPathStream << angle::GetExecutableDirectory() << angle::GetPathSeparator()
40 << ANGLE_CAPTURE_REPLAY_SAMPLE_DATA_DIR;
41 mTraceLibrary->setBinaryDataDir(binaryPathStream.str().c_str());
42 mTraceLibrary->setupReplay();
43 return true;
44 }
45
destroy()46 void destroy() override {}
47
draw()48 void draw() override
49 {
50 // Compute the current frame, looping from frameStart to frameEnd.
51 uint32_t frame = mTraceInfo.frameStart +
52 (mCurrentFrame % ((mTraceInfo.frameEnd - mTraceInfo.frameStart) + 1));
53 if (mPreviousFrame > frame)
54 {
55 mTraceLibrary->resetReplay();
56 }
57 mTraceLibrary->replayFrame(frame);
58 mPreviousFrame = frame;
59 mCurrentFrame++;
60 }
61
62 private:
63 uint32_t mCurrentFrame = 0;
64 uint32_t mPreviousFrame = 0;
65 const angle::TraceInfo mTraceInfo;
66 std::unique_ptr<angle::TraceLibrary> mTraceLibrary;
67 };
68
main(int argc,char ** argv)69 int main(int argc, char **argv)
70 {
71 std::string exeDir = angle::GetExecutableDirectory();
72
73 std::stringstream traceJsonPathStream;
74 traceJsonPathStream << exeDir << angle::GetPathSeparator()
75 << ANGLE_CAPTURE_REPLAY_SAMPLE_DATA_DIR << angle::GetPathSeparator()
76 << "angle_capture.json";
77
78 std::string traceJsonPath = traceJsonPathStream.str();
79
80 angle::TraceInfo traceInfo = {};
81 if (!angle::LoadTraceInfoFromJSON("capture_replay_sample_trace", traceJsonPath, &traceInfo))
82 {
83 std::cout << "Unable to load trace data: " << traceJsonPath << "\n";
84 return 1;
85 }
86
87 CaptureReplaySample app(argc, argv, traceInfo);
88 return app.run();
89 }
90