• 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/frame_capture_test_utils.h"
13 
14 // Build the right context header based on replay ID
15 // This will expand to "angle_capture_context<#>.h"
16 #include ANGLE_MACRO_STRINGIZE(ANGLE_CAPTURE_REPLAY_SAMPLE_HEADER)
17 
18 // Assign the context numbered functions based on GN arg selecting replay ID
19 std::function<void()> SetupContextReplay = reinterpret_cast<void (*)()>(
20     ANGLE_MACRO_CONCAT(SetupContext,
21                        ANGLE_MACRO_CONCAT(ANGLE_CAPTURE_REPLAY_SAMPLE_CONTEXT_ID, Replay)));
22 std::function<void(int)> ReplayContextFrame = reinterpret_cast<void (*)(int)>(
23     ANGLE_MACRO_CONCAT(ReplayContext,
24                        ANGLE_MACRO_CONCAT(ANGLE_CAPTURE_REPLAY_SAMPLE_CONTEXT_ID, Frame)));
25 std::function<void()> ResetContextReplay = reinterpret_cast<void (*)()>(
26     ANGLE_MACRO_CONCAT(ResetContext,
27                        ANGLE_MACRO_CONCAT(ANGLE_CAPTURE_REPLAY_SAMPLE_CONTEXT_ID, Replay)));
28 
29 class CaptureReplaySample : public SampleApplication
30 {
31   public:
CaptureReplaySample(int argc,char ** argv)32     CaptureReplaySample(int argc, char **argv)
33         : SampleApplication("CaptureReplaySample",
34                             argc,
35                             argv,
36                             3,
37                             0,
38                             kReplayDrawSurfaceWidth,
39                             kReplayDrawSurfaceHeight)
40     {}
41 
initialize()42     bool initialize() override
43     {
44         // Set CWD to executable directory.
45         std::string exeDir = angle::GetExecutableDirectory();
46         if (!angle::SetCWD(exeDir.c_str()))
47             return false;
48         if (kIsBinaryDataCompressed)
49         {
50             SetBinaryDataDecompressCallback(angle::DecompressBinaryData);
51         }
52         SetBinaryDataDir(ANGLE_CAPTURE_REPLAY_SAMPLE_DATA_DIR);
53         SetupContextReplay();
54         return true;
55     }
56 
destroy()57     void destroy() override {}
58 
draw()59     void draw() override
60     {
61         // Compute the current frame, looping from kReplayFrameStart to kReplayFrameEnd.
62         uint32_t frame =
63             kReplayFrameStart + (mCurrentFrame % ((kReplayFrameEnd - kReplayFrameStart) + 1));
64         if (mPreviousFrame > frame)
65         {
66             ResetContextReplay();
67         }
68         ReplayContextFrame(frame);
69         mPreviousFrame = frame;
70         mCurrentFrame++;
71     }
72 
73   private:
74     uint32_t mCurrentFrame  = 0;
75     uint32_t mPreviousFrame = 0;
76 };
77 
main(int argc,char ** argv)78 int main(int argc, char **argv)
79 {
80     CaptureReplaySample app(argc, argv);
81     return app.run();
82 }
83