diff --git a/example/Vulkan/main.cpp b/example/Vulkan/main.cpp index f227ddc4..8fd18389 100644 --- a/example/Vulkan/main.cpp +++ b/example/Vulkan/main.cpp @@ -7,7 +7,8 @@ using namespace hgl; using namespace hgl::graph; -bool SaveToFile(const OSString &filename,const VkGraphicsPipelineCreateInfo *info); +bool SaveToFile(const OSString &filename,VK_NAMESPACE::PipelineCreater *pc); +bool LoadFromFile(const OSString &filename,VK_NAMESPACE::PipelineCreater *pc); constexpr uint32_t SCREEN_WIDTH=128; constexpr uint32_t SCREEN_HEIGHT=128; @@ -104,22 +105,26 @@ private: { constexpr os_char PIPELINE_FILENAME[]=OS_TEXT("2DSolid.pipeline"); - //vulkan::PipelineCreater *pipeline_creater=new vulkan::PipelineCreater(device,material,device->GetRenderPass()); - //pipeline_creater->SetDepthTest(false); - //pipeline_creater->SetDepthWrite(false); - //pipeline_creater->CloseCullFace(); - //pipeline_creater->Set(PRIM_TRIANGLES); + { + vulkan::PipelineCreater *pipeline_creater=new vulkan::PipelineCreater(device,material,device->GetRenderPass()); + pipeline_creater->SetDepthTest(false); + pipeline_creater->SetDepthWrite(false); + pipeline_creater->CloseCullFace(); + pipeline_creater->Set(PRIM_TRIANGLES); - vulkan::PipelineCreater *pipeline_creater=new vulkan::PipelineCreater(device,material,device->GetRenderPass()); + SaveToFile(PIPELINE_FILENAME,pipeline_creater); - pipeline=pipeline_creater->Create(); + delete pipeline_creater; + } - SaveToFile(PIPELINE_FILENAME,pipeline_creater->GetInfo()); + { + vulkan::PipelineCreater *pipeline_creater=new vulkan::PipelineCreater(device,material,device->GetRenderPass()); - delete pipeline_creater; - delete pipeline; + LoadFromFile(PIPELINE_FILENAME,pipeline_creater); + pipeline=pipeline_creater->Create(); - + delete pipeline_creater; + } return pipeline; } diff --git a/inc/hgl/graph/vulkan/VKPipeline.h b/inc/hgl/graph/vulkan/VKPipeline.h index 2d470be9..39c71f5e 100644 --- a/inc/hgl/graph/vulkan/VKPipeline.h +++ b/inc/hgl/graph/vulkan/VKPipeline.h @@ -2,6 +2,7 @@ #define HGL_GRAPH_VULKAN_PIPELINE_INCLUDE #include +#include VK_NAMESPACE_BEGIN class Pipeline { @@ -103,7 +104,9 @@ public: void SetBlendConstans(float *blend_constans) {hgl_typecpy(colorBlending.blendConstants,blend_constans,4);} - const VkGraphicsPipelineCreateInfo *GetInfo()const{return &pipelineInfo;} + bool SaveToStream(io::DataOutputStream *dos); + bool LoadFromMemory(uchar *,uint); + Pipeline *Create(); };//class PipelineCreater VK_NAMESPACE_END diff --git a/src/RenderDevice/Vulkan/POD/VKPipelineCreateInfo.POD.cpp b/src/RenderDevice/Vulkan/POD/VKPipelineCreateInfo.POD.cpp index 6f37dd83..0a72a67e 100644 --- a/src/RenderDevice/Vulkan/POD/VKPipelineCreateInfo.POD.cpp +++ b/src/RenderDevice/Vulkan/POD/VKPipelineCreateInfo.POD.cpp @@ -1,48 +1,114 @@ -#include +#include #include #include #include +#include +#include #include using namespace hgl; -namespace +VK_NAMESPACE_BEGIN +bool PipelineCreater::SaveToStream(io::DataOutputStream *dos) { - void Write(io::DataOutputStream *dos,const VkPipelineMultisampleStateCreateInfo *info) - { - dos->Write(info); + if(!dos)return(false); - if(info->pSampleMask) - dos->WriteUint32(info->pSampleMask,(info->rasterizationSamples+31)/32); + dos->WriteUint16(1); //file ver + + dos->Write(&pipelineInfo,sizeof(VkGraphicsPipelineCreateInfo)); + + dos->Write(pipelineInfo.pInputAssemblyState, sizeof(VkPipelineInputAssemblyStateCreateInfo)); + dos->Write(pipelineInfo.pTessellationState, sizeof(VkPipelineTessellationStateCreateInfo)); + dos->Write(pipelineInfo.pRasterizationState, sizeof(VkPipelineRasterizationStateCreateInfo)); + + dos->Write(pipelineInfo.pMultisampleState, sizeof(VkPipelineMultisampleStateCreateInfo)); + if(pipelineInfo.pMultisampleState->pSampleMask) + { + const uint count=(pipelineInfo.pMultisampleState->rasterizationSamples+31)/32; + dos->WriteUint8(count); + dos->WriteUint32(pipelineInfo.pMultisampleState->pSampleMask,count); + } + else + { + dos->WriteUint8(0); } - void Write(io::DataOutputStream *dos,const VkPipelineColorBlendStateCreateInfo *info) - { - dos->Write(info,sizeof(VkPipelineColorBlendStateCreateInfo)); + dos->Write(pipelineInfo.pDepthStencilState, sizeof(VkPipelineDepthStencilStateCreateInfo)); - for(uint32_t i=0;iattachmentCount;i++) - dos->Write(info->pAttachments+i,sizeof(VkPipelineColorBlendAttachmentState)); - } -}//namespace + dos->Write(pipelineInfo.pColorBlendState,sizeof(VkPipelineColorBlendStateCreateInfo)); + for(uint32_t i=0;iattachmentCount;i++) + dos->Write(pipelineInfo.pColorBlendState->pAttachments+i,sizeof(VkPipelineColorBlendAttachmentState)); -bool SaveToFile(const OSString &filename,const VkGraphicsPipelineCreateInfo *info) + return(true); +} + +bool PipelineCreater::LoadFromMemory(uchar *data,uint size) { - if(filename.IsEmpty()||!info) + uint16 ver=*(uint16 *)data; + + if(ver!=1) + return(false); + + data+=sizeof(uint16); + size-=sizeof(uint16); + + if(size0) + { + pipelineInfo.pMultisampleState->pSampleMask=(const VkSampleMask *)data; + data+=count; + size=count; + } + else + { + pipelineInfo.pMultisampleState->pSampleMask=nullptr; + } + + if(sizeWriteUint16(1); //file ver - - dos->Write(info,sizeof(VkGraphicsPipelineCreateInfo)); - - dos->Write(info->pInputAssemblyState, sizeof(VkPipelineInputAssemblyStateCreateInfo)); - dos->Write(info->pTessellationState, sizeof(VkPipelineTessellationStateCreateInfo)); - dos->Write(info->pRasterizationState, sizeof(VkPipelineRasterizationStateCreateInfo)); - Write(dos,info->pMultisampleState); - dos->Write(info->pDepthStencilState, sizeof(VkPipelineDepthStencilStateCreateInfo)); - Write(dos,info->pColorBlendState); + pc->SaveToStream(dos); delete dos; @@ -50,3 +116,17 @@ bool SaveToFile(const OSString &filename,const VkGraphicsPipelineCreateInfo *inf 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; +} \ No newline at end of file