22 struct GraphicsPipelineAsset :
public Asset {
23 constexpr static size_t noMaterialBufferIndex = SIZE_MAX;
25 GraphicsPipelineAsset(
Uuid uuid) : Asset(uuid, uuid.ToString()) {}
29 std::string passPipelineName;
33 std::array<Grindstone::Buffer, GraphicsAPI::numShaderGraphicStage> stageBuffers;
34 std::array<GraphicsAPI::ShaderStage, GraphicsAPI::numShaderGraphicStage> stageTypes;
35 std::array<GraphicsAPI::GraphicsPipeline::AttachmentData, 8> colorAttachmentData;
39 std::vector<Grindstone::PipelineAssetMetaData::Buffer> buffers;
42 std::vector<Grindstone::PipelineAssetMetaData::ResourceSlot> resources;
44 size_t materialBufferIndex = SIZE_MAX;
48 std::vector<Pass> passes;
51 if (metaData.materialBufferIndex == SIZE_MAX) {
55 return &(metaData.buffers[metaData.materialBufferIndex]);
59 return metaData.resources[index];
62 size_t GetTextureMetaDataSize()
const {
63 return metaData.resources.size();
66 const Grindstone::GraphicsAPI::DescriptorSetLayout* GetMaterialDescriptorLayout()
const {
67 if (passes.size() == 0) {
71 return passes[0].pipelineLayout->descriptorSetLayouts[1];
74 const Grindstone::GraphicsPipelineAsset::Pass* GetFirstPass()
const {
75 if (passes.size() == 0) {
82 const Grindstone::GraphicsAPI::GraphicsPipeline::PipelineData* GetFirstPassPipelineData()
const {
83 if (passes.size() == 0) {
87 return &passes[0].pipelineData;
90 Grindstone::GraphicsAPI::GraphicsPipeline* GetFirstPassPipeline(
const Grindstone::GraphicsAPI::VertexInputLayout* vertexInputLayout) {
91 if (passes.size() == 0) {
95 auto& pass = passes[0];
97 std::vector<Grindstone::GraphicsAPI::GraphicsPipeline::ShaderStageData> stages;
98 stages.resize(pass.pipelineData.shaderStageCreateInfoCount);
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];
106 pass.pipelineData.debugName = pass.passPipelineName.c_str();
107 pass.pipelineData.colorAttachmentData = pass.colorAttachmentData.data();
108 pass.pipelineData.shaderStageCreateInfos = stages.data();
110 Grindstone::GraphicsAPI::Core* graphicsCore = Grindstone::EngineCore::GetInstance().GetGraphicsCore();
111 return graphicsCore->GetOrCreateGraphicsPipelineFromCache(pass.pipelineLayout, pass.pipelineData, vertexInputLayout);
114 Grindstone::GraphicsAPI::PipelineLayout* GetFirstPassPipelineLayout() {
115 if (passes.size() == 0) {
119 auto& pass = passes[0];
120 return pass.pipelineLayout;
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;
132 if (selectedPass ==
nullptr) {
136 std::vector<Grindstone::GraphicsAPI::GraphicsPipeline::ShaderStageData> stages;
137 stages.resize(selectedPass->pipelineData.shaderStageCreateInfoCount);
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];
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();
151 Grindstone::GraphicsAPI::Core* graphicsCore = Grindstone::EngineCore::GetInstance().GetGraphicsCore();
152 return graphicsCore->GetOrCreateGraphicsPipelineFromCache(pipelineLayout, pipelineData, vertexInputLayout);
155 const Grindstone::GraphicsPipelineAsset::Pass* GetPass(Grindstone::HashedString renderQueue)
const {
156 for (
const Grindstone::GraphicsPipelineAsset::Pass& pass : passes) {
157 if (pass.renderQueue == renderQueue) {
165 DEFINE_ASSET_TYPE(
"Graphics PipelineSet", AssetType::GraphicsPipelineSet)