#include #include #include #include #include #include #include using namespace hgl; VK_NAMESPACE_BEGIN #define WRITE_AND_CHECK_SIZE(ptr,type) if(dos->Write(ptr,sizeof(type))!=sizeof(type))return(false); bool PipelineCreater::SaveToStream(io::DataOutputStream *dos) { if(!dos)return(false); if(!dos->WriteUint16(1))return(false); //file ver WRITE_AND_CHECK_SIZE(&pipelineInfo,VkGraphicsPipelineCreateInfo); WRITE_AND_CHECK_SIZE(pipelineInfo.pInputAssemblyState, VkPipelineInputAssemblyStateCreateInfo ); WRITE_AND_CHECK_SIZE(pipelineInfo.pTessellationState, VkPipelineTessellationStateCreateInfo ); WRITE_AND_CHECK_SIZE(pipelineInfo.pRasterizationState, VkPipelineRasterizationStateCreateInfo ); WRITE_AND_CHECK_SIZE(pipelineInfo.pMultisampleState, VkPipelineMultisampleStateCreateInfo ); if(pipelineInfo.pMultisampleState->pSampleMask) { const uint count=(pipelineInfo.pMultisampleState->rasterizationSamples+31)/32; if(!dos->WriteUint8(count))return(false); if(dos->WriteUint32(pipelineInfo.pMultisampleState->pSampleMask,count)!=count)return(false); } else { if(!dos->WriteUint8(0))return(false); } WRITE_AND_CHECK_SIZE(pipelineInfo.pDepthStencilState, VkPipelineDepthStencilStateCreateInfo); WRITE_AND_CHECK_SIZE(pipelineInfo.pColorBlendState, VkPipelineColorBlendStateCreateInfo); for(uint32_t i=0;iattachmentCount;i++) WRITE_AND_CHECK_SIZE(pipelineInfo.pColorBlendState->pAttachments+i,VkPipelineColorBlendAttachmentState); return(true); } #define CHECK_SIZE_AND_COPY(ptr,type) if(size0) { memcpy(sample_mask,data,count); multisampling.pSampleMask=sample_mask; data+=count; size=count; } else { multisampling.pSampleMask=nullptr; } CHECK_SIZE_AND_COPY(depthStencilState,VkPipelineDepthStencilStateCreateInfo); CHECK_SIZE_AND_COPY(colorBlending,VkPipelineColorBlendStateCreateInfo); if(colorBlending.attachmentCount>0) { if(sizeSaveToStream(dos); delete dos; filesystem::SaveMemoryToFile(filename,mos.GetData(),mos.Tell()); return(true); } bool LoadFromFile(const OSString &filename,VK_NAMESPACE::PipelineCreater *pc) { if(filename.IsEmpty()||!pc) return(false); void *data; uint size=filesystem::LoadFileToMemory(filename,(void **)&data); bool result=pc->LoadFromMemory((uchar *)data,size); delete[] data; return result; }