• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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