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