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)