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;
32 std::array<GraphicsAPI::DescriptorSetLayout*, 16> descriptorSetLayouts;
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 Grindstone::GraphicsAPI::DescriptorSetLayout* GetMaterialDescriptorLayout() {
67 if (passes.size() == 0) {
68 return nullptr;
69 }
70
71 return passes[0].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 std::vector<Grindstone::GraphicsAPI::GraphicsPipeline::ShaderStageData> stages;
96 stages.resize(passes[0].pipelineData.shaderStageCreateInfoCount);
97
98 for (size_t stageIndex = 0; stageIndex < passes[0].pipelineData.shaderStageCreateInfoCount; ++stageIndex) {
99 stages[stageIndex].content = reinterpret_cast<const char*>(passes[0].stageBuffers[stageIndex].Get());
100 stages[stageIndex].size = static_cast<uint32_t>(passes[0].stageBuffers[stageIndex].GetCapacity());
101 stages[stageIndex].type = passes[0].stageTypes[stageIndex];
102 }
103
104 passes[0].pipelineData.debugName = passes[0].passPipelineName.c_str();
105 passes[0].pipelineData.colorAttachmentData = passes[0].colorAttachmentData.data();
106 passes[0].pipelineData.descriptorSetLayouts = passes[0].descriptorSetLayouts.data();
107 passes[0].pipelineData.shaderStageCreateInfos = stages.data();
108
109 Grindstone::GraphicsAPI::Core* graphicsCore = Grindstone::EngineCore::GetInstance().GetGraphicsCore();
110 return graphicsCore->GetOrCreateGraphicsPipelineFromCache(passes[0].pipelineData, vertexInputLayout);
111 }
112
113 const Grindstone::GraphicsAPI::GraphicsPipeline* GetPassPipeline(Grindstone::HashedString renderQueue, const Grindstone::GraphicsAPI::VertexInputLayout* vertexInputLayout) const {
114 const Grindstone::GraphicsPipelineAsset::Pass* selectedPass = nullptr;
115 for (const Grindstone::GraphicsPipelineAsset::Pass& pass : passes) {
116 if (pass.renderQueue == renderQueue) {
117 selectedPass = &pass;
118 break;
119 }
120 }
121
122 if (selectedPass == nullptr) {
123 return nullptr;
124 }
125
126 std::vector<Grindstone::GraphicsAPI::GraphicsPipeline::ShaderStageData> stages;
127 stages.resize(selectedPass->pipelineData.shaderStageCreateInfoCount);
128
129 for (size_t stageIndex = 0; stageIndex < selectedPass->pipelineData.shaderStageCreateInfoCount; ++stageIndex) {
130 stages[stageIndex].content = reinterpret_cast<const char*>(selectedPass->stageBuffers[stageIndex].Get());
131 stages[stageIndex].size = static_cast<uint32_t>(selectedPass->stageBuffers[stageIndex].GetCapacity());
132 stages[stageIndex].type = selectedPass->stageTypes[stageIndex];
133 }
134
135 GraphicsAPI::GraphicsPipeline::PipelineData pipelineData = selectedPass->pipelineData;
136 pipelineData.debugName = selectedPass->passPipelineName.c_str();
137 pipelineData.colorAttachmentData = selectedPass->colorAttachmentData.data();
138 pipelineData.descriptorSetLayouts = selectedPass->descriptorSetLayouts.data();
139 pipelineData.shaderStageCreateInfos = stages.data();
140
141 Grindstone::GraphicsAPI::Core* graphicsCore = Grindstone::EngineCore::GetInstance().GetGraphicsCore();
142 return graphicsCore->GetOrCreateGraphicsPipelineFromCache(pipelineData, vertexInputLayout);
143 }
144
145 const Grindstone::GraphicsPipelineAsset::Pass* GetPass(Grindstone::HashedString renderQueue) const {
146 for (const Grindstone::GraphicsPipelineAsset::Pass& pass : passes) {
147 if (pass.renderQueue == renderQueue) {
148 return &pass;
149 }
150 }
151
152 return nullptr;
153 }
154
155 DEFINE_ASSET_TYPE("Graphics PipelineSet", AssetType::GraphicsPipelineSet)
156 };
157}
Definition DescriptorSetLayout.hpp:13
Definition GraphicsPipeline.hpp:19
Definition HashedString.hpp:9
Definition Uuid.hpp:7
Definition GraphicsPipelineAsset.hpp:38
Definition GraphicsPipelineAsset.hpp:28
Definition PipelineAsset.hpp:72