Grindstone Game Engine v0.2.0
An open source game engine and toolkit.
Loading...
Searching...
No Matches
RenderGraphFrameResources.hpp
1#pragma once
2
3#include <unordered_map>
4
5#include "TransientResourceManager.hpp"
6
7namespace Grindstone::Renderer {
9 std::unordered_map<Grindstone::Renderer::ResourceId, Grindstone::Renderer::TransientImageData> externalImages;
10 std::unordered_map<Grindstone::Renderer::ResourceId, Grindstone::Renderer::TransientBufferData> externalBuffers;
11 std::unordered_map<Grindstone::Renderer::ResourceId, Grindstone::Renderer::TransientImageKey> imageKeys;
12 std::unordered_map<Grindstone::Renderer::ResourceId, Grindstone::Renderer::TransientBufferKey> bufferKeys;
13 std::unordered_map<Grindstone::Renderer::ResourceId, Grindstone::Renderer::TransientImageData*> images;
14 std::unordered_map<Grindstone::Renderer::ResourceId, Grindstone::Renderer::TransientBufferData*> buffers;
15
16 void RealizeKeys(Grindstone::Renderer::TransientResourceManager* resourceManager) {
17 for (auto& [id, key] : imageKeys) {
18 if (key.poolIndex == SIZE_MAX) {
19 images[id] = &externalImages[id];
20 }
21 else {
22 images[id] = &resourceManager->GetTrackedImage(key);
23 }
24 }
25
26 for (auto& [id, key] : bufferKeys) {
27 buffers[id] = &resourceManager->GetTrackedBuffer(key);
28 }
29 }
30
31 Grindstone::GraphicsAPI::Image* GetImage(Grindstone::Renderer::ResourceId id) {
32 auto externalIt = externalImages.find(id);
33 if (externalIt != externalImages.end()) {
34 return externalIt->second.image;
35 }
36
37 auto it = images.find(id);
38 GS_ASSERT(it != images.end());
39 return it->second->image;
40 }
41
42 Grindstone::GraphicsAPI::Buffer* GetBuffer(Grindstone::Renderer::ResourceId id) {
43 auto it = buffers.find(id);
44 GS_ASSERT(it != buffers.end());
45 return it->second->buffer;
46 }
47
48 // Layout tracking - updated as passes execute and emit barriers
49 void SetLayout(
50 Grindstone::Renderer::ResourceId id,
51 Grindstone::GraphicsAPI::ImageLayout layout,
52 Grindstone::GraphicsAPI::AccessFlags access,
53 Grindstone::GraphicsAPI::PipelineStageBit pipelineStage
54 ) {
55 auto externalIt = externalImages.find(id);
56 if (externalIt != externalImages.end()) {
57 TransientImageData& externalResource = externalIt->second;
58 externalResource.currentLayout = layout;
59 externalResource.currentAccessFlags = access;
60 externalResource.currentPipelineStage = pipelineStage;
61 return;
62 }
63
64 auto& transientResource = *images.at(id);
65 transientResource.currentLayout = layout;
66 transientResource.currentAccessFlags = access;
67 transientResource.currentPipelineStage = pipelineStage;
68 }
69
70 std::tuple<Grindstone::GraphicsAPI::ImageLayout, Grindstone::GraphicsAPI::AccessFlags, Grindstone::GraphicsAPI::PipelineStageBit> GetLayout(
71 Grindstone::Renderer::ResourceId id
72 ) {
73 auto externalIt = externalImages.find(id);
74 if (externalIt != externalImages.end()) {
75 TransientImageData& externalResource = externalIt->second;
76 return { externalResource.currentLayout, externalResource.currentAccessFlags, externalResource.currentPipelineStage };
77 }
78
79 TransientImageData& transientResource = *images.at(id);
80 return { transientResource.currentLayout, transientResource.currentAccessFlags, transientResource.currentPipelineStage };
81 }
82 };
83}
Definition Buffer.hpp:49
Definition Image.hpp:49
Definition TransientResourceManager.hpp:142
Definition RenderGraphFrameResources.hpp:8
Definition TransientResourceManager.hpp:66