1 //
2 // Copyright 2021 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 // trace_fixture.h:
7 //   Common code for the ANGLE trace replays.
8 //
9 
10 #ifndef ANGLE_TRACE_FIXTURE_H_
11 #define ANGLE_TRACE_FIXTURE_H_
12 
13 #include <EGL/egl.h>
14 #include "angle_gl.h"
15 
16 #include <cstdint>
17 #include <cstdio>
18 #include <cstring>
19 #include <limits>
20 #include <unordered_map>
21 #include <vector>
22 
23 #if !defined(ANGLE_REPLAY_EXPORT)
24 #    if defined(_WIN32)
25 #        if defined(ANGLE_REPLAY_IMPLEMENTATION)
26 #            define ANGLE_REPLAY_EXPORT __declspec(dllexport)
27 #        else
28 #            define ANGLE_REPLAY_EXPORT __declspec(dllimport)
29 #        endif
30 #    elif defined(__GNUC__)
31 #        define ANGLE_REPLAY_EXPORT __attribute__((visibility("default")))
32 #    else
33 #        define ANGLE_REPLAY_EXPORT
34 #    endif
35 #endif  // !defined(ANGLE_REPLAY_EXPORT)
36 
37 using DecompressCallback = uint8_t *(*)(const std::vector<uint8_t> &);
38 
39 extern "C" {
40 ANGLE_REPLAY_EXPORT void SetBinaryDataDecompressCallback(DecompressCallback callback);
41 ANGLE_REPLAY_EXPORT void SetBinaryDataDir(const char *dataDir);
42 ANGLE_REPLAY_EXPORT void SetupReplay();
43 ANGLE_REPLAY_EXPORT void ReplayFrame(uint32_t frameIndex);
44 ANGLE_REPLAY_EXPORT void ResetReplay();
45 ANGLE_REPLAY_EXPORT void FinishReplay();
46 
47 // Only defined if serialization is enabled.
48 ANGLE_REPLAY_EXPORT const char *GetSerializedContextState(uint32_t frameIndex);
49 }  // extern "C"
50 
51 // Maps from <captured Program ID, captured location> to run-time location.
52 using LocationsMap = std::unordered_map<GLuint, std::unordered_map<GLint, GLint>>;
53 extern LocationsMap gUniformLocations;
54 using BlockIndexesMap = std::unordered_map<GLuint, std::unordered_map<GLuint, GLuint>>;
55 extern BlockIndexesMap gUniformBlockIndexes;
56 extern GLuint gCurrentProgram;
57 void UpdateUniformLocation(GLuint program, const char *name, GLint location);
58 void DeleteUniformLocations(GLuint program);
59 void UpdateUniformBlockIndex(GLuint program, const char *name, GLuint index);
60 void UpdateCurrentProgram(GLuint program);
61 
62 // Maps from captured Resource ID to run-time Resource ID.
63 class ResourceMap
64 {
65   public:
ResourceMap()66     ResourceMap() {}
67     GLuint &operator[](GLuint index)
68     {
69         if (mIDs.size() <= static_cast<size_t>(index))
70             mIDs.resize(index + 1, 0);
71         return mIDs[index];
72     }
73 
74   private:
75     std::vector<GLuint> mIDs;
76 };
77 
78 void InitializeReplay(const char *binaryDataFileName,
79                       size_t maxClientArraySize,
80                       size_t readBufferSize);
81 
82 // Global state
83 
84 constexpr size_t kMaxClientArrays = 16;
85 
86 extern uint8_t *gBinaryData;
87 extern uint8_t *gReadBuffer;
88 extern uint8_t *gClientArrays[kMaxClientArrays];
89 extern ResourceMap gBufferMap;
90 extern ResourceMap gFenceNVMap;
91 extern ResourceMap gFramebufferMap;
92 extern ResourceMap gMemoryObjectMap;
93 extern ResourceMap gProgramPipelineMap;
94 extern ResourceMap gQueryMap;
95 extern ResourceMap gRenderbufferMap;
96 extern ResourceMap gSamplerMap;
97 extern ResourceMap gSemaphoreMap;
98 extern ResourceMap gShaderProgramMap;
99 extern ResourceMap gTextureMap;
100 extern ResourceMap gTransformFeedbackMap;
101 extern ResourceMap gVertexArrayMap;
102 using SyncResourceMap = std::unordered_map<uintptr_t, GLsync>;
103 extern SyncResourceMap gSyncMap;
104 
105 void UpdateClientArrayPointer(int arrayIndex, const void *data, uint64_t size);
106 using BufferHandleMap = std::unordered_map<GLuint, void *>;
107 extern BufferHandleMap gMappedBufferData;
108 void UpdateClientBufferData(GLuint bufferID, const void *source, GLsizei size);
109 void UpdateBufferID(GLuint id, GLsizei readBufferOffset);
110 void UpdateFenceNVID(GLuint id, GLsizei readBufferOffset);
111 void UpdateFramebufferID(GLuint id, GLsizei readBufferOffset);
112 void UpdateMemoryObjectID(GLuint id, GLsizei readBufferOffset);
113 void UpdateProgramPipelineID(GLuint id, GLsizei readBufferOffset);
114 void UpdateQueryID(GLuint id, GLsizei readBufferOffset);
115 void UpdateRenderbufferID(GLuint id, GLsizei readBufferOffset);
116 void UpdateSamplerID(GLuint id, GLsizei readBufferOffset);
117 void UpdateSemaphoreID(GLuint id, GLsizei readBufferOffset);
118 void UpdateShaderProgramID(GLuint id, GLsizei readBufferOffset);
119 void UpdateTextureID(GLuint id, GLsizei readBufferOffset);
120 void UpdateTransformFeedbackID(GLuint id, GLsizei readBufferOffset);
121 void UpdateVertexArrayID(GLuint id, GLsizei readBufferOffset);
122 
123 #endif  // ANGLE_TRACE_FIXTURE_H_
124