Grindstone Game Engine v0.2.0
An open source game engine and toolkit.
Loading...
Searching...
No Matches
GraphicsPipelineAsset.hpp
1#pragma once
2
3#include <string>
4#include <vector>
5
6#include <Common/Buffer.hpp>
7#include <Common/HashedString.hpp>
8#include <Common/Graphics/Core.hpp>
9#include <Common/Graphics/GraphicsPipeline.hpp>
10#include <EngineCore/Assets/Asset.hpp>
11#include <EngineCore/Assets/Textures/TextureAsset.hpp>
12#include <EngineCore/EngineCore.hpp>
13
14#include "PipelineAsset.hpp"
15
16namespace Grindstone {
17 namespace GraphicsAPI {
18 class GraphicsPipeline;
20 }
21
22 struct GraphicsPipelineAsset : public Asset {
23 constexpr static size_t noMaterialBufferIndex = SIZE_MAX;
24
25 GraphicsPipelineAsset(Uuid uuid) : Asset(uuid, uuid.ToString()) {}
26
27 // TODO: Support Configurations
28 struct Pass {
29 std::string passDebugName;
30 std::string passPipelineName;
31 Grindstone::HashedString renderQueue;
32 GraphicsAPI::PipelineLayout* pipelineLayout = nullptr;
34 std::array<Grindstone::Buffer, GraphicsAPI::numShaderGraphicStage> stageBuffers;
35 std::array<GraphicsAPI::ShaderStage, GraphicsAPI::numShaderGraphicStage> stageTypes;
36 std::array<GraphicsAPI::GraphicsPipeline::AttachmentData, 8> colorAttachmentData;
37 };
38
39 struct MetaData {
40 std::vector<Grindstone::PipelineAssetMetaData::Buffer> buffers;
41
42 // Images and Samplers
43 std::vector<Grindstone::PipelineAssetMetaData::ResourceSlot> resources;
44
45 size_t materialBufferIndex = SIZE_MAX;
46 };
47
48 MetaData metaData;
49 std::vector<Pass> passes;
50
51 const Grindstone::PipelineAssetMetaData::Buffer* GetBufferMetaData() const {
52 if (metaData.materialBufferIndex == SIZE_MAX) {
53 return nullptr;
54 }
55
56 return &(metaData.buffers[metaData.materialBufferIndex]);
57 }
58
59 const Grindstone::PipelineAssetMetaData::ResourceSlot& GetTextureMetaDataByIndex(size_t index) const {
60 return metaData.resources[index];
61 }
62
63 size_t GetTextureMetaDataSize() const {
64 return metaData.resources.size();
65 }
66
67 const Grindstone::GraphicsAPI::DescriptorSetLayout* GetMaterialDescriptorLayout() const {
68 if (passes.size() == 0) {
69 return nullptr;
70 }
71
72 return passes[0].pipelineLayout->descriptorSetLayouts[1];
73 }
74
75 const Grindstone::GraphicsPipelineAsset::Pass* GetFirstPass() const {
76 if (passes.size() == 0) {
77 return nullptr;
78 }
79
80 return &passes[0];
81 }
82
83 const Grindstone::GraphicsAPI::GraphicsPipeline::PipelineData* GetFirstPassPipelineData() const {
84 if (passes.size() == 0) {
85 return nullptr;
86 }
87
88 return &passes[0].pipelineData;
89 }
90
91 Grindstone::GraphicsAPI::GraphicsPipeline* GetFirstPassPipeline(const Grindstone::GraphicsAPI::VertexInputLayout* vertexInputLayout) {
92 if (passes.size() == 0) {
93 return nullptr;
94 }
95
96 auto& pass = passes[0];
97 return GetPassPipeline(pass, vertexInputLayout);
98 }
99
100 Grindstone::GraphicsAPI::PipelineLayout* GetFirstPassPipelineLayout() {
101 if (passes.size() == 0) {
102 return nullptr;
103 }
104
105 auto& pass = passes[0];
106 return pass.pipelineLayout;
107 }
108
109 Grindstone::GraphicsAPI::PipelineLayout* GetPassPipelineLayout(Grindstone::HashedString renderQueue) {
110 const Grindstone::GraphicsPipelineAsset::Pass* selectedPass = GetPassByRenderQueue(renderQueue);
111
112 if (selectedPass == nullptr) {
113 return nullptr;
114 }
115
116 auto& pass = passes[0];
117 return pass.pipelineLayout;
118 }
119
120 Grindstone::GraphicsAPI::GraphicsPipeline* GetPassPipelineByRenderQueue(Grindstone::HashedString renderQueue, const Grindstone::GraphicsAPI::VertexInputLayout* vertexInputLayout) const {
121 const Grindstone::GraphicsPipelineAsset::Pass* selectedPass = GetPassByRenderQueue(renderQueue);
122
123 if (selectedPass == nullptr) {
124 return nullptr;
125 }
126
127 return GetPassPipeline(*selectedPass, vertexInputLayout);
128 }
129
130 Grindstone::GraphicsAPI::GraphicsPipeline* GetPassPipelineByName(std::string name, const Grindstone::GraphicsAPI::VertexInputLayout* vertexInputLayout) const {
131 const Grindstone::GraphicsPipelineAsset::Pass* selectedPass = GetPassByName(name);
132
133 if (selectedPass == nullptr) {
134 return nullptr;
135 }
136
137 return GetPassPipeline(*selectedPass, vertexInputLayout);
138 }
139
140 Grindstone::GraphicsAPI::GraphicsPipeline* GetPassPipeline(const Grindstone::GraphicsPipelineAsset::Pass& pass, const Grindstone::GraphicsAPI::VertexInputLayout* vertexInputLayout) const {
141 std::vector<Grindstone::GraphicsAPI::GraphicsPipeline::ShaderStageData> stages;
142 stages.resize(pass.pipelineData.shaderStageCreateInfoCount);
143
144 for (size_t stageIndex = 0; stageIndex < pass.pipelineData.shaderStageCreateInfoCount; ++stageIndex) {
145 stages[stageIndex].content = reinterpret_cast<const char*>(pass.stageBuffers[stageIndex].Get());
146 stages[stageIndex].size = static_cast<uint32_t>(pass.stageBuffers[stageIndex].GetCapacity());
147 stages[stageIndex].type = pass.stageTypes[stageIndex];
148 }
149
150 GraphicsAPI::PipelineLayout* pipelineLayout = pass.pipelineLayout;
151 GraphicsAPI::GraphicsPipeline::PipelineData pipelineData = pass.pipelineData;
152 pipelineData.debugName = pass.passDebugName.c_str();
153 pipelineData.colorAttachmentData = pass.colorAttachmentData.data();
154 pipelineData.shaderStageCreateInfos = stages.data();
155
156 Grindstone::GraphicsAPI::Core* graphicsCore = Grindstone::EngineCore::GetInstance().GetGraphicsCore();
157 return graphicsCore->GetOrCreateGraphicsPipelineFromCache(pipelineLayout, pipelineData, vertexInputLayout);
158 }
159
160 const Grindstone::GraphicsPipelineAsset::Pass* GetPassByName(std::string name) const {
161 for (const Grindstone::GraphicsPipelineAsset::Pass& pass : passes) {
162 if (pass.passPipelineName == name) {
163 return &pass;
164 }
165 }
166
167 return nullptr;
168 }
169
170 const Grindstone::GraphicsPipelineAsset::Pass* GetPassByRenderQueue(Grindstone::HashedString renderQueue) const {
171 for (const Grindstone::GraphicsPipelineAsset::Pass& pass : passes) {
172 if (pass.renderQueue == renderQueue) {
173 return &pass;
174 }
175 }
176
177 return nullptr;
178 }
179
180 DEFINE_ASSET_TYPE("Graphics PipelineSet", AssetType::GraphicsPipelineSet)
181 };
182}
Definition DescriptorSetLayout.hpp:14
Definition GraphicsPipeline.hpp:20
Definition PipelineLayout.hpp:18
Definition HashedString.hpp:9
Definition Uuid.hpp:7
Definition GraphicsPipelineAsset.hpp:39
Definition GraphicsPipelineAsset.hpp:28
Definition PipelineAsset.hpp:72