diff --git a/example/Vulkan/main.cpp b/example/Vulkan/main.cpp index 8a673ce6..f227ddc4 100644 --- a/example/Vulkan/main.cpp +++ b/example/Vulkan/main.cpp @@ -7,7 +7,7 @@ using namespace hgl; using namespace hgl::graph; -void SaveToJSON(const OSString &filename,const VkGraphicsPipelineCreateInfo *info); +bool SaveToFile(const OSString &filename,const VkGraphicsPipelineCreateInfo *info); constexpr uint32_t SCREEN_WIDTH=128; constexpr uint32_t SCREEN_HEIGHT=128; @@ -102,18 +102,25 @@ private: bool InitPipeline() { - 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); + 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=pipeline_creater->Create(); - SaveToJSON(OS_TEXT("pipeline.json"),pipeline_creater->GetInfo()); + SaveToFile(PIPELINE_FILENAME,pipeline_creater->GetInfo()); delete pipeline_creater; + delete pipeline; + + + return pipeline; } diff --git a/inc/hgl/io/MemoryOutputStream.h b/inc/hgl/io/MemoryOutputStream.h index ef9c8822..6378d28f 100644 --- a/inc/hgl/io/MemoryOutputStream.h +++ b/inc/hgl/io/MemoryOutputStream.h @@ -45,7 +45,7 @@ namespace hgl * @param len 存放数据长度的指针 * @return 创建好的内存拷贝 */ - void *CreateCopyData(int *len)const + void *CreateCopyData(uint *len)const { if(buf_size<=0) return(nullptr); diff --git a/src/RenderDevice/Vulkan/CMakeLists.txt b/src/RenderDevice/Vulkan/CMakeLists.txt index 767e5d7b..4fe98c55 100644 --- a/src/RenderDevice/Vulkan/CMakeLists.txt +++ b/src/RenderDevice/Vulkan/CMakeLists.txt @@ -48,13 +48,12 @@ SET(RENDER_DEVICE_VULKAN_SOURCE VKFormat.cpp VKMaterial.cpp VKRenderable.cpp) -#SET(RENDER_DEVICE_VULKAN_TOML_SOURCE toml/VKPipelineCreateInfo.TOML.cpp) -SET(RENDER_DEVICE_VULKAN_JSON_SOURCE json/VKPipelineCreateInfo.JSON.cpp) +SET(RENDER_DEVICE_VULKAN_POD_SOURCE pod/VKPipelineCreateInfo.POD.cpp) SOURCE_GROUP("Header Files" FILES ${RENDER_DEVICE_VULKAN_HEADER}) SOURCE_GROUP("Source Files" FILES ${RENDER_DEVICE_VULKAN_SOURCE}) -SOURCE_GROUP("JSON Source Files" FILES ${RENDER_DEVICE_VULKAN_JSON_SOURCE}) +SOURCE_GROUP("POD Source Files" FILES ${RENDER_DEVICE_VULKAN_POD_SOURCE}) add_library(ULRE.RenderDevice.Vulkan STATIC ${RENDER_DEVICE_VULKAN_HEADER} ${RENDER_DEVICE_VULKAN_SOURCE} - ${RENDER_DEVICE_VULKAN_JSON_SOURCE}) + ${RENDER_DEVICE_VULKAN_POD_SOURCE}) diff --git a/src/RenderDevice/Vulkan/POD/VKPipelineCreateInfo.POD.cpp b/src/RenderDevice/Vulkan/POD/VKPipelineCreateInfo.POD.cpp new file mode 100644 index 00000000..6f37dd83 --- /dev/null +++ b/src/RenderDevice/Vulkan/POD/VKPipelineCreateInfo.POD.cpp @@ -0,0 +1,52 @@ +#include +#include +#include +#include +#include + +using namespace hgl; + +namespace +{ + void Write(io::DataOutputStream *dos,const VkPipelineMultisampleStateCreateInfo *info) + { + dos->Write(info); + + if(info->pSampleMask) + dos->WriteUint32(info->pSampleMask,(info->rasterizationSamples+31)/32); + } + + void Write(io::DataOutputStream *dos,const VkPipelineColorBlendStateCreateInfo *info) + { + dos->Write(info,sizeof(VkPipelineColorBlendStateCreateInfo)); + + for(uint32_t i=0;iattachmentCount;i++) + dos->Write(info->pAttachments+i,sizeof(VkPipelineColorBlendAttachmentState)); + } +}//namespace + +bool SaveToFile(const OSString &filename,const VkGraphicsPipelineCreateInfo *info) +{ + if(filename.IsEmpty()||!info) + return(false); + + io::MemoryOutputStream mos; + io::DataOutputStream *dos=new io::LEDataOutputStream(&mos); + + dos->WriteUint16(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); + + delete dos; + + filesystem::SaveMemoryToFile(filename,mos.GetData(),mos.Tell()); + + return(true); +}