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