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;
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;
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 Grindstone::GraphicsAPI::DescriptorSetLayout* GetMaterialDescriptorLayout() {
67 if (passes.size() == 0) {
71 return passes[0].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 std::vector<Grindstone::GraphicsAPI::GraphicsPipeline::ShaderStageData> stages;
96 stages.resize(passes[0].pipelineData.shaderStageCreateInfoCount);
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];
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();
109 Grindstone::GraphicsAPI::Core* graphicsCore = Grindstone::EngineCore::GetInstance().GetGraphicsCore();
110 return graphicsCore->GetOrCreateGraphicsPipelineFromCache(passes[0].pipelineData, vertexInputLayout);
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;
122 if (selectedPass ==
nullptr) {
126 std::vector<Grindstone::GraphicsAPI::GraphicsPipeline::ShaderStageData> stages;
127 stages.resize(selectedPass->pipelineData.shaderStageCreateInfoCount);
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];
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();
141 Grindstone::GraphicsAPI::Core* graphicsCore = Grindstone::EngineCore::GetInstance().GetGraphicsCore();
142 return graphicsCore->GetOrCreateGraphicsPipelineFromCache(pipelineData, vertexInputLayout);
145 const Grindstone::GraphicsPipelineAsset::Pass* GetPass(Grindstone::HashedString renderQueue)
const {
146 for (
const Grindstone::GraphicsPipelineAsset::Pass& pass : passes) {
147 if (pass.renderQueue == renderQueue) {
155 DEFINE_ASSET_TYPE(
"Graphics PipelineSet", AssetType::GraphicsPipelineSet)