TerraForge3D  2.3.1
3D Terrain And Landscape Generator
SharedMemoryManager.cpp
1#include "Shading/SharedMemoryManager.h"
2#include "Base/Shader.h"
3
4#include "glad/glad.h"
5
6static int lastBinding = 1;
7
8void SetSharedMemoryItem(SharedMemoryItem *mi, int i, float val)
9{
10 switch (i)
11 {
12 case 0:
13 mi->d0 = val;
14 break;
15
16 case 1:
17 mi->d1 = val;
18 break;
19
20 case 2:
21 mi->d2 = val;
22 break;
23
24 case 3:
25 mi->d3 = val;
26 break;
27
28 case 4:
29 mi->d4 = val;
30 break;
31
32 case 5:
33 mi->d5 = val;
34 break;
35
36 case 6:
37 mi->d6 = val;
38 break;
39
40 case 7:
41 mi->d7 = val;
42 break;
43
44 case 8:
45 mi->d8 = val;
46 break;
47
48 case 9:
49 mi->d9 = val;
50 break;
51
52 case 10:
53 mi->d10 = val;
54 break;
55
56 case 11:
57 mi->d11 = val;
58 break;
59
60 case 12:
61 mi->d12 = val;
62 break;
63
64 case 13:
65 mi->d13 = val;
66 break;
67
68 case 14:
69 mi->d14 = val;
70 break;
71
72 case 15:
73 mi->d15 = val;
74 break;
75
76 case 16:
77 mi->d16 = val;
78 break;
79
80 case 17:
81 mi->d17 = val;
82 break;
83
84 case 18:
85 mi->d18 = val;
86 break;
87
88 case 19:
89 mi->d19 = val;
90 break;
91
92 case 20:
93 mi->d20 = val;
94 break;
95
96 case 21:
97 mi->d21 = val;
98 break;
99
100 case 22:
101 mi->d22 = val;
102 break;
103
104 case 23:
105 mi->d23 = val;
106 break;
107
108 case 24:
109 mi->d24 = val;
110 break;
111
112 case 25:
113 mi->d25 = val;
114 break;
115
116 case 26:
117 mi->d26 = val;
118 break;
119
120 case 27:
121 mi->d27 = val;
122 break;
123
124 case 28:
125 mi->d28 = val;
126 break;
127
128 case 29:
129 mi->d29 = val;
130 break;
131
132 case 30:
133 mi->d30 = val;
134 break;
135
136 case 31:
137 mi->d31 = val;
138 break;
139 }
140}
141
142float &SharedMemoryItem::operator[](int i)
143{
144 switch (i)
145 {
146 case 0:
147 return d0;
148
149 case 1:
150 return d1;
151
152 case 2:
153 return d2;
154
155 case 3:
156 return d3;
157
158 case 4:
159 return d4;
160
161 case 5:
162 return d5;
163
164 case 6:
165 return d6;
166
167 case 7:
168 return d7;
169
170 case 8:
171 return d8;
172
173 case 9:
174 return d9;
175
176 case 10:
177 return d10;
178
179 case 11:
180 return d11;
181
182 case 12:
183 return d12;
184
185 case 13:
186 return d13;
187
188 case 14:
189 return d14;
190
191 case 15:
192 return d15;
193
194 case 16:
195 return d16;
196
197 case 17:
198 return d17;
199
200 case 18:
201 return d18;
202
203 case 19:
204 return d19;
205
206 case 20:
207 return d20;
208
209 case 21:
210 return d21;
211
212 case 22:
213 return d22;
214
215 case 23:
216 return d23;
217
218 case 24:
219 return d24;
220
221 case 25:
222 return d25;
223
224 case 26:
225 return d26;
226
227 case 27:
228 return d27;
229
230 case 28:
231 return d28;
232
233 case 29:
234 return d29;
235
236 case 30:
237 return d30;
238
239 case 31:
240 return d31;
241 }
242}
243
244SharedMemoryManager::SharedMemoryManager()
245{
246 glGenBuffers(1, &ssbo);
247 glBindBuffer(GL_SHADER_STORAGE_BUFFER, ssbo);
248 glBufferData(GL_SHADER_STORAGE_BUFFER, sizeof(SharedMemoryItem), NULL, GL_DYNAMIC_DRAW);
249 ssboBinding = lastBinding++;
250 glBindBufferBase(GL_SHADER_STORAGE_BUFFER, ssboBinding, ssbo);
251 glBindBuffer(GL_SHADER_STORAGE_BUFFER, 0);
252}
253
254SharedMemoryManager::~SharedMemoryManager()
255{
256 glDeleteBuffers(1, &ssbo);
257}
258
259void SharedMemoryManager::Clear()
260{
261 currentID = 0;
262 sharedMemoryBlobs.clear();
263}
264
265int SharedMemoryManager::AddItem()
266{
267 SharedMemoryItem blob;
268 sharedMemoryBlobs.push_back(blob);
269 return currentID++;
270}
271
272SharedMemoryItem *SharedMemoryManager::At(int id)
273{
274 return sharedMemoryBlobs.data() + id;
275}
276
277void SharedMemoryManager::UpdateShader(Shader *shader)
278{
279 glBindBuffer(GL_SHADER_STORAGE_BUFFER, ssbo);
280 glBufferData(GL_SHADER_STORAGE_BUFFER, sizeof(SharedMemoryItem) * sharedMemoryBlobs.size(), sharedMemoryBlobs.data(), GL_DYNAMIC_DRAW);
281 glBindBufferBase(GL_SHADER_STORAGE_BUFFER, ssboBinding, ssbo);
282 glBindBuffer(GL_SHADER_STORAGE_BUFFER, 0);
283}
284
Definition: Shader.h:7
SharedMemoryItem ! A data structure to be passed to the GPU.