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 passPipelineName;
30 Grindstone::HashedString renderQueue;
31 GraphicsAPI::PipelineLayout* pipelineLayout = nullptr;
33 std::array<Grindstone::Buffer, GraphicsAPI::numShaderGraphicStage> stageBuffers;
34 std::array<GraphicsAPI::ShaderStage, GraphicsAPI::numShaderGraphicStage> stageTypes;
35 std::array<GraphicsAPI::GraphicsPipeline::AttachmentData, 8> colorAttachmentData;
36 };
37
38 struct MetaData {
39 std::vector<Grindstone::PipelineAssetMetaData::Buffer> buffers;
40
41 // Images and Samplers
42 std::vector<Grindstone::PipelineAssetMetaData::ResourceSlot> resources;
43
44 size_t materialBufferIndex = SIZE_MAX;
45 };
46
47 MetaData metaData;
48 std::vector<Pass> passes;
49
50 const Grindstone::PipelineAssetMetaData::Buffer* GetBufferMetaData() const {
51 if (metaData.materialBufferIndex == SIZE_MAX) {
52 return nullptr;
53 }
54
55 return &(metaData.buffers[metaData.materialBufferIndex]);
56 }
57
58 const Grindstone::PipelineAssetMetaData::ResourceSlot& GetTextureMetaDataByIndex(size_t index) const {
59 return metaData.resources[index];
60 }
61
62 size_t GetTextureMetaDataSize() const {
63 return metaData.resources.size();
64 }
65
66 const Grindstone::GraphicsAPI::DescriptorSetLayout* GetMaterialDescriptorLayout() const {
67 if (passes.size() == 0) {
68 return nullptr;
69 }
70
71 return passes[0].pipelineLayout->descriptorSetLayouts[1];
72 }
73
74 const Grindstone::GraphicsPipelineAsset::Pass* GetFirstPass() const {
75 if (passes.size() == 0) {
76 return nullptr;
77 }
78
79 return &passes[0];
80 }
81
82 const Grindstone::GraphicsAPI::GraphicsPipeline::PipelineData* GetFirstPassPipelineData() const {
83 if (passes.size() == 0) {
84 return nullptr;
85 }
86
87 return &passes[0].pipelineData;
88 }
89
90 Grindstone::GraphicsAPI::GraphicsPipeline* GetFirstPassPipeline(const Grindstone::GraphicsAPI::VertexInputLayout* vertexInputLayout) {
91 if (passes.size() == 0) {
92 return nullptr;
93 }
94
95 auto& pass = passes[0];
96
97 std::vector<Grindstone::GraphicsAPI::GraphicsPipeline::ShaderStageData> stages;
98 stages.resize(pass.pipelineData.shaderStageCreateInfoCount);
99
100 for (size_t stageIndex = 0; stageIndex < pass.pipelineData.shaderStageCreateInfoCount; ++stageIndex) {
101 stages[stageIndex].content = reinterpret_cast<const char*>(pass.stageBuffers[stageIndex].Get());
102 stages[stageIndex].size = static_cast<uint32_t>(pass.stageBuffers[stageIndex].GetCapacity());
103 stages[stageIndex].type = pass.stageTypes[stageIndex];
104 }
105
106 pass.pipelineData.debugName = pass.passPipelineName.c_str();
107 pass.pipelineData.colorAttachmentData = pass.colorAttachmentData.data();
108 pass.pipelineData.shaderStageCreateInfos = stages.data();
109
110 Grindstone::GraphicsAPI::Core* graphicsCore = Grindstone::EngineCore::GetInstance().GetGraphicsCore();
111 return graphicsCore->GetOrCreateGraphicsPipelineFromCache(pass.pipelineLayout, pass.pipelineData, vertexInputLayout);
112 }
113
114 Grindstone::GraphicsAPI::PipelineLayout* GetFirstPassPipelineLayout() {
115 if (passes.size() == 0) {
116 return nullptr;
117 }
118
119 auto& pass = passes[0];
120 return pass.pipelineLayout;
121 }
122
123 const Grindstone::GraphicsAPI::GraphicsPipeline* GetPassPipeline(Grindstone::HashedString renderQueue, const Grindstone::GraphicsAPI::VertexInputLayout* vertexInputLayout) const {
124 const Grindstone::GraphicsPipelineAsset::Pass* selectedPass = nullptr;
125 for (const Grindstone::GraphicsPipelineAsset::Pass& pass : passes) {
126 if (pass.renderQueue == renderQueue) {
127 selectedPass = &pass;
128 break;
129 }
130 }
131
132 if (selectedPass == nullptr) {
133 return nullptr;
134 }
135
136 std::vector<Grindstone::GraphicsAPI::GraphicsPipeline::ShaderStageData> stages;
137 stages.resize(selectedPass->pipelineData.shaderStageCreateInfoCount);
138
139 for (size_t stageIndex = 0; stageIndex < selectedPass->pipelineData.shaderStageCreateInfoCount; ++stageIndex) {
140 stages[stageIndex].content = reinterpret_cast<const char*>(selectedPass->stageBuffers[stageIndex].Get());
141 stages[stageIndex].size = static_cast<uint32_t>(selectedPass->stageBuffers[stageIndex].GetCapacity());
142 stages[stageIndex].type = selectedPass->stageTypes[stageIndex];
143 }
144
145 GraphicsAPI::PipelineLayout* pipelineLayout = selectedPass->pipelineLayout;
146 GraphicsAPI::GraphicsPipeline::PipelineData pipelineData = selectedPass->pipelineData;
147 pipelineData.debugName = selectedPass->passPipelineName.c_str();
148 pipelineData.colorAttachmentData = selectedPass->colorAttachmentData.data();
149 pipelineData.shaderStageCreateInfos = stages.data();
150
151 Grindstone::GraphicsAPI::Core* graphicsCore = Grindstone::EngineCore::GetInstance().GetGraphicsCore();
152 return graphicsCore->GetOrCreateGraphicsPipelineFromCache(pipelineLayout, pipelineData, vertexInputLayout);
153 }
154
155 const Grindstone::GraphicsPipelineAsset::Pass* GetPass(Grindstone::HashedString renderQueue) const {
156 for (const Grindstone::GraphicsPipelineAsset::Pass& pass : passes) {
157 if (pass.renderQueue == renderQueue) {
158 return &pass;
159 }
160 }
161
162 return nullptr;
163 }
164
165 DEFINE_ASSET_TYPE("Graphics PipelineSet", AssetType::GraphicsPipelineSet)
166 };
167}
Definition DescriptorSetLayout.hpp:14
Definition GraphicsPipeline.hpp:20
Definition PipelineLayout.hpp:18
Definition HashedString.hpp:9
Definition Uuid.hpp:7
Definition GraphicsPipelineAsset.hpp:38
Definition GraphicsPipelineAsset.hpp:28
Definition PipelineAsset.hpp:72