Skip to content

Commit 9f473b4

Browse files
committed
resource manager update
1 parent d22e780 commit 9f473b4

File tree

5 files changed

+138
-72
lines changed

5 files changed

+138
-72
lines changed

.idea/workspace.xml

Lines changed: 13 additions & 6 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/Engine/DescriptorCache.hpp

Lines changed: 35 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -9,12 +9,13 @@
99

1010

1111

12+
1213
#ifndef DESCRIPTORCACHE_HPP
1314
#define DESCRIPTORCACHE_HPP
1415
namespace ENGINE
1516
{
1617
#define DEFAULT_VAR_DESCRIPTOR_COUNT 1000
17-
class DescriptorCache
18+
class DescriptorCache : SYSTEMS::Watcher
1819
{
1920
struct SamplerBinding
2021
{
@@ -40,6 +41,12 @@ namespace ENGINE
4041
DescriptorCache(Core* core)
4142
{
4243
this->core = core;
44+
resourcesManagerRef = ResourcesManager::GetInstance();
45+
resourcesManagerRef->Attach(this);
46+
}
47+
void UpdateWatcher() override
48+
{
49+
FlushBuffers();
4350
}
4451
void SetDefaultSamplerInfo(ImageView* defaultImageView, Sampler* defaultSampler)
4552
{
@@ -51,12 +58,6 @@ namespace ENGINE
5158
this->defaultStorageImageView = defaultStorageImageView;
5259
this->defaultStorageImage = defaultStorageImage;
5360
}
54-
template <typename T>
55-
void SetSharedBufferPool(T)
56-
{
57-
58-
}
59-
6061
void AddShaderInfo(ShaderParser* parser)
6162
{
6263
std::vector<ShaderResource> uniqueResources;
@@ -101,14 +102,14 @@ namespace ENGINE
101102
break;
102103
case vk::DescriptorType::eUniformBuffer:
103104
bufferBindingsKeys.try_emplace(resource.name, resource);
104-
ubo = ResourcesManager::GetInstance()->GetBuffer(resource.name, vk::BufferUsageFlagBits::eUniformBuffer,
105+
ubo = resourcesManagerRef->GetBuffer(resource.name, vk::BufferUsageFlagBits::eUniformBuffer,
105106
vk::MemoryPropertyFlagBits::eHostVisible |
106107
vk::MemoryPropertyFlagBits::eHostCoherent, 1);
107108
buffersResources.try_emplace(resource.binding, std::move(ubo));
108109
break;
109110
case vk::DescriptorType::eStorageBuffer:
110111
bufferBindingsKeys.try_emplace(resource.name, resource);
111-
ssbo = ResourcesManager::GetInstance()->GetBuffer(resource.name ,vk::BufferUsageFlagBits::eStorageBuffer,
112+
ssbo = resourcesManagerRef->GetBuffer(resource.name ,vk::BufferUsageFlagBits::eStorageBuffer,
112113
vk::MemoryPropertyFlagBits::eHostVisible |
113114
vk::MemoryPropertyFlagBits::eHostCoherent, 1);
114115
buffersResources.try_emplace(resource.binding,std::move(ssbo));
@@ -245,28 +246,13 @@ namespace ENGINE
245246
{
246247
assert(false && "unusported buffer type");
247248
}
248-
if (sizeof(T) * bufferData.size()> bufferRef->deviceSize)
249-
{
250-
buffersResources.at(binding.binding) = ResourcesManager::GetInstance()->SetBuffer(
251-
name,
252-
usageFlags,
253-
vk::MemoryPropertyFlagBits::eHostVisible |
254-
vk::MemoryPropertyFlagBits::eHostCoherent,
255-
sizeof(T) * bufferData.size(), bufferData.data());
256-
UpdateDescriptor();
257-
}else
258-
{
259-
//pending to handle this if is a staged resource
260-
if (bufferRef->mappedMem == nullptr)
261-
{
262-
bufferRef->Map();
263-
}
264-
memcpy(bufferRef->mappedMem, bufferData.data(), bufferData.size() * sizeof(T));
265-
if (usageFlags == vk::BufferUsageFlagBits::eStorageBuffer)
266-
{
267-
bufferRef->Unmap();
268-
}
269-
}
249+
250+
buffersResources.at(binding.binding) = resourcesManagerRef->SetBuffer(
251+
name,
252+
usageFlags,
253+
vk::MemoryPropertyFlagBits::eHostVisible |
254+
vk::MemoryPropertyFlagBits::eHostCoherent,
255+
sizeof(T) * bufferData.size(), bufferData.data());
270256

271257
}
272258

@@ -287,31 +273,14 @@ namespace ENGINE
287273
usageFlags = vk::BufferUsageFlagBits::eStorageBuffer;
288274
}else
289275
{
290-
assert(false && "unusported buffer type");
276+
assert(false && "unsupported buffer type");
291277
}
292-
if (sizeof(T) > bufferRef->deviceSize)
293-
{
294-
buffersResources.at(binding.binding) = ResourcesManager::GetInstance()->SetBuffer(
295-
name,
296-
usageFlags,
297-
vk::MemoryPropertyFlagBits::eHostVisible |
298-
vk::MemoryPropertyFlagBits::eHostCoherent,
299-
sizeof(T), &bufferData);
300-
UpdateDescriptor();
301-
}else
302-
{
303-
//pending to handle this if is a staged resource
304-
if (bufferRef->mappedMem == nullptr)
305-
{
306-
bufferRef->Map();
307-
}
308-
memcpy(bufferRef->mappedMem, &bufferData, sizeof(T));
309-
if (usageFlags == vk::BufferUsageFlagBits::eStorageBuffer)
310-
{
311-
bufferRef->Unmap();
312-
}
313-
}
314-
278+
buffersResources.at(binding.binding) = resourcesManagerRef->SetBuffer(
279+
name,
280+
usageFlags,
281+
vk::MemoryPropertyFlagBits::eHostVisible |
282+
vk::MemoryPropertyFlagBits::eHostCoherent,
283+
sizeof(T), &bufferData);
315284
}
316285
void SetSampler(std::string name, ImageView* imageView, Sampler* sampler = nullptr)
317286
{
@@ -555,8 +524,17 @@ namespace ENGINE
555524
return nullptr;
556525
}
557526
return &storageArrayResources.at(binding.binding);
558-
}
559-
527+
}
528+
void FlushBuffers()
529+
{
530+
for (auto key : bufferBindingsKeys)
531+
{
532+
buffersResources.at(key.second.binding) = resourcesManagerRef->GetBuffFromName(key.first);
533+
}
534+
UpdateDescriptor();
535+
}
536+
537+
ResourcesManager* resourcesManagerRef;
560538
std::unordered_map<std::string, ShaderResource> bufferBindingsKeys;
561539
std::unordered_map<std::string, ShaderResource> imageBindingsKeys;
562540

src/Engine/ResourcesManager.hpp

Lines changed: 84 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,18 +5,30 @@
55
//
66

77

8+
9+
10+
811
#ifndef RESOURCESMANAGER_HPP
912
#define RESOURCESMANAGER_HPP
1013

1114
#define BASE_SIZE 10000
1215

1316
namespace ENGINE
1417
{
15-
class ResourcesManager
18+
class ResourcesManager : SYSTEMS::Subject
1619
{
1720
public:
18-
19-
21+
enum BufferState
22+
{
23+
VALID,
24+
INVALID
25+
};
26+
struct BufferUpdateInfo
27+
{
28+
BufferState state;
29+
size_t size;
30+
void* data;
31+
};
2032
ImageShipper* SetShipperPath(std::string name, std::string path)
2133
{
2234
assert(core!= nullptr &&"core must be set");
@@ -35,7 +47,7 @@ namespace ENGINE
3547
return imageShipper;
3648
}
3749

38-
~ResourcesManager() = default;
50+
3951
ImageShipper* SetShipperDataRaw(std::string name, void* data, int width, int height, vk::DeviceSize size)
4052
{
4153
assert(core!= nullptr &&"core must be set");
@@ -130,6 +142,7 @@ namespace ENGINE
130142

131143
bufferNames.try_emplace(name, (int32_t)buffers.size());
132144
buffers.emplace_back(std::move(buffer));
145+
buffersState.push_back({VALID, deviceSize, data});
133146
return buffers.back().get();
134147
}
135148

@@ -147,6 +160,7 @@ namespace ENGINE
147160

148161
stagedBufferNames.try_emplace(name, (int32_t)buffers.size());
149162
stagedBuffers.emplace_back(std::move(buffer));
163+
buffersState.push_back({VALID, deviceSize});
150164
return stagedBuffers.back().get();
151165
}
152166

@@ -156,12 +170,31 @@ namespace ENGINE
156170
{
157171
assert(core!= nullptr &&"core must be set");
158172
assert(bufferNames.contains(name) && "Buffer dont exist");
159-
160-
buffers.at(bufferNames.at(name)).reset(new Buffer(core->physicalDevice, core->logicalDevice.get(),
161-
bufferUsageFlags, memPropertyFlags, deviceSize, data));
173+
174+
if (deviceSize > buffers.at(bufferNames.at(name))->deviceSize)
175+
{
176+
buffersState.at(bufferNames.at(name)) = {INVALID, deviceSize, data};
177+
invalidateBuffers = true;
178+
179+
}else
180+
{
181+
//pending to handle this if is a staged resource
182+
Buffer* bufferRef = GetBuffFromName(name);
183+
if (bufferRef->mappedMem == nullptr)
184+
{
185+
bufferRef->Map();
186+
}
187+
memcpy(bufferRef->mappedMem, &data, deviceSize);
188+
if (bufferRef->usageFlags == vk::BufferUsageFlagBits::eStorageBuffer)
189+
{
190+
bufferRef->Unmap();
191+
}
192+
}
193+
162194
return buffers.at(bufferNames.at(name)).get();
163195
}
164196

197+
165198
StagedBuffer* SetStageBuffer(std::string name, vk::BufferUsageFlags bufferUsageFlags,
166199
vk::DeviceSize deviceSize
167200
)
@@ -231,6 +264,24 @@ namespace ENGINE
231264
imageShippers.clear();
232265
images.clear();
233266
}
267+
void UpdateBuffers()
268+
{
269+
if (!invalidateBuffers)
270+
for (auto& name : bufferNames)
271+
{
272+
BufferUpdateInfo& bufferUpdateInfo = buffersState.at(name.second);
273+
if (bufferUpdateInfo.state == INVALID)
274+
{
275+
buffers.at(bufferNames.at(name.first)).reset(new Buffer(core->physicalDevice, core->logicalDevice.get(),
276+
buffers.at(name.second)->usageFlags, buffers.at(name.second)->memPropertyFlags, bufferUpdateInfo.size,
277+
bufferUpdateInfo.data));
278+
bufferUpdateInfo.state = VALID;
279+
}
280+
}
281+
Notify();
282+
invalidateBuffers = false;
283+
284+
}
234285

235286
ResourcesManager(Core* coreRefs)
236287
{
@@ -250,6 +301,28 @@ namespace ENGINE
250301
return instance;
251302
}
252303

304+
~ResourcesManager() = default;
305+
306+
void Attach(SYSTEMS::Watcher* watcher) override
307+
{
308+
watchers.push_back(watcher);
309+
}
310+
311+
void Detach(SYSTEMS::Watcher* watcher) override
312+
{
313+
watchers.erase(std::remove(watchers.begin(), watchers.end(), watcher), watchers.end());
314+
}
315+
316+
void Notify() override
317+
{
318+
for (auto& watcher : watchers)
319+
{
320+
watcher->UpdateWatcher();
321+
}
322+
}
323+
324+
std::vector<SYSTEMS::Watcher*> watchers;
325+
253326
std::unordered_map<std::string, int32_t> bufferNames;
254327
std::unordered_map<std::string, int32_t> stagedBufferNames;
255328
std::unordered_map<std::string, int32_t> imagesNames;
@@ -258,16 +331,20 @@ namespace ENGINE
258331

259332

260333
std::vector<std::unique_ptr<Buffer>> buffers;
334+
std::vector<BufferUpdateInfo> buffersState;
261335
std::vector<std::unique_ptr<StagedBuffer>> stagedBuffers;
262336
std::vector<std::unique_ptr<ImageView>> imageViews;
263337
std::vector<std::unique_ptr<ImageView>> storageImagesViews;
264338
std::vector<std::unique_ptr<ImageShipper>> imageShippers;
265339
std::vector<std::unique_ptr<Image>> images;
340+
bool invalidateBuffers = false;
266341

267342
Core* core;
268343
static ResourcesManager* instance;
269344

270345

346+
347+
271348
};
272349

273350
ResourcesManager* ResourcesManager::instance = nullptr;

src/Systems/SystemsInclude.hpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,10 @@
88
#include <iostream>
99
#include <filesystem>
1010
#include <assert.h>
11+
#include <fstream>
1112

1213
#include "InputSystem.hpp"
1314
#include "OS.hpp"
15+
#include "ObserverSystem.hpp"
1416

1517
#endif //SYSTEMSINCLUDE_HPP

0 commit comments

Comments
 (0)