22 struct GraphicsPipelineAsset :
public Asset {
23 constexpr static size_t noMaterialBufferIndex = SIZE_MAX;
25 GraphicsPipelineAsset(
Uuid uuid) : Asset(uuid, uuid.ToString()) {}
29 std::string passDebugName;
30 std::string passPipelineName;
34 std::array<Grindstone::Buffer, GraphicsAPI::numShaderGraphicStage> stageBuffers;
35 std::array<GraphicsAPI::ShaderStage, GraphicsAPI::numShaderGraphicStage> stageTypes;
36 std::array<GraphicsAPI::GraphicsPipeline::AttachmentData, 8> colorAttachmentData;
40 std::vector<Grindstone::PipelineAssetMetaData::Buffer> buffers;
43 std::vector<Grindstone::PipelineAssetMetaData::ResourceSlot> resources;
45 size_t materialBufferIndex = SIZE_MAX;
49 std::vector<Pass> passes;
52 if (metaData.materialBufferIndex == SIZE_MAX) {
56 return &(metaData.buffers[metaData.materialBufferIndex]);
60 return metaData.resources[index];
63 size_t GetTextureMetaDataSize()
const {
64 return metaData.resources.size();
67 const Grindstone::GraphicsAPI::DescriptorSetLayout* GetMaterialDescriptorLayout()
const {
68 if (passes.size() == 0) {
72 return passes[0].pipelineLayout->descriptorSetLayouts[1];
75 const Grindstone::GraphicsPipelineAsset::Pass* GetFirstPass()
const {
76 if (passes.size() == 0) {
83 const Grindstone::GraphicsAPI::GraphicsPipeline::PipelineData* GetFirstPassPipelineData()
const {
84 if (passes.size() == 0) {
88 return &passes[0].pipelineData;
91 Grindstone::GraphicsAPI::GraphicsPipeline* GetFirstPassPipeline(
const Grindstone::GraphicsAPI::VertexInputLayout* vertexInputLayout) {
92 if (passes.size() == 0) {
96 auto& pass = passes[0];
97 return GetPassPipeline(pass, vertexInputLayout);
100 Grindstone::GraphicsAPI::PipelineLayout* GetFirstPassPipelineLayout() {
101 if (passes.size() == 0) {
105 auto& pass = passes[0];
106 return pass.pipelineLayout;
109 Grindstone::GraphicsAPI::PipelineLayout* GetPassPipelineLayout(Grindstone::HashedString renderQueue) {
110 const Grindstone::GraphicsPipelineAsset::Pass* selectedPass = GetPassByRenderQueue(renderQueue);
112 if (selectedPass ==
nullptr) {
116 auto& pass = passes[0];
117 return pass.pipelineLayout;
120 Grindstone::GraphicsAPI::GraphicsPipeline* GetPassPipelineByRenderQueue(Grindstone::HashedString renderQueue,
const Grindstone::GraphicsAPI::VertexInputLayout* vertexInputLayout)
const {
121 const Grindstone::GraphicsPipelineAsset::Pass* selectedPass = GetPassByRenderQueue(renderQueue);
123 if (selectedPass ==
nullptr) {
127 return GetPassPipeline(*selectedPass, vertexInputLayout);
130 Grindstone::GraphicsAPI::GraphicsPipeline* GetPassPipelineByName(std::string name,
const Grindstone::GraphicsAPI::VertexInputLayout* vertexInputLayout)
const {
131 const Grindstone::GraphicsPipelineAsset::Pass* selectedPass = GetPassByName(name);
133 if (selectedPass ==
nullptr) {
137 return GetPassPipeline(*selectedPass, vertexInputLayout);
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);
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];
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();
156 Grindstone::GraphicsAPI::Core* graphicsCore = Grindstone::EngineCore::GetInstance().GetGraphicsCore();
157 return graphicsCore->GetOrCreateGraphicsPipelineFromCache(pipelineLayout, pipelineData, vertexInputLayout);
160 const Grindstone::GraphicsPipelineAsset::Pass* GetPassByName(std::string name)
const {
161 for (
const Grindstone::GraphicsPipelineAsset::Pass& pass : passes) {
162 if (pass.passPipelineName == name) {
170 const Grindstone::GraphicsPipelineAsset::Pass* GetPassByRenderQueue(Grindstone::HashedString renderQueue)
const {
171 for (
const Grindstone::GraphicsPipelineAsset::Pass& pass : passes) {
172 if (pass.renderQueue == renderQueue) {
180 DEFINE_ASSET_TYPE(
"Graphics PipelineSet", AssetType::GraphicsPipelineSet)