From f18bcfd0b42dc69f67b990dbf870db122d89e77a Mon Sep 17 00:00:00 2001 From: hyzboy Date: Tue, 14 May 2019 20:17:53 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0pipelineCreateInfo=E7=9A=84JS?= =?UTF-8?q?ON=E5=8A=A0=E8=BD=BD=E4=BB=A3=E7=A0=81(=E6=9C=AA=E5=AE=8C?= =?UTF-8?q?=E5=B7=A5)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- example/Vulkan/main.cpp | 4 +- .../Vulkan/json/VKPipelineCreateInfo.JSON.cpp | 258 ++++++++++++------ 2 files changed, 180 insertions(+), 82 deletions(-) diff --git a/example/Vulkan/main.cpp b/example/Vulkan/main.cpp index 31d532d7..8a673ce6 100644 --- a/example/Vulkan/main.cpp +++ b/example/Vulkan/main.cpp @@ -109,10 +109,10 @@ private: pipeline_creater->CloseCullFace(); pipeline_creater->Set(PRIM_TRIANGLES); - SaveToJSON(OS_TEXT("pipeline.json"),pipeline_creater->GetInfo()); - pipeline=pipeline_creater->Create(); + SaveToJSON(OS_TEXT("pipeline.json"),pipeline_creater->GetInfo()); + delete pipeline_creater; return pipeline; } diff --git a/src/RenderDevice/Vulkan/json/VKPipelineCreateInfo.JSON.cpp b/src/RenderDevice/Vulkan/json/VKPipelineCreateInfo.JSON.cpp index 381a300c..d58d9788 100644 --- a/src/RenderDevice/Vulkan/json/VKPipelineCreateInfo.JSON.cpp +++ b/src/RenderDevice/Vulkan/json/VKPipelineCreateInfo.JSON.cpp @@ -8,22 +8,40 @@ using namespace hgl; namespace { - #define JSON_BEGIN(struct_name) Json::Value ToJSON(const struct_name *state) \ + #define TO_JSON_BEGIN(struct_name) Json::Value ToJSON(const struct_name *state) \ { \ Json::Value root; - #define JSON_END return root; \ + #define TO_JSON_END return root; \ } - #define JSON_STRUCT(name) root[#name]=ToJSON(&(state->name)); - #define JSON_OBJECT(name) root[#name]=ToJSON(state->name); - #define JSON_BOOL(name) root[#name]=bool(state->name); - #define JSON_INT32(name) root[#name]=Json::Int(state->name); - #define JSON_UINT32(name) root[#name]=Json::UInt(state->name); - #define JSON_INT64(name) root[#name]=Json::Int64(state->name); - #define JSON_UINT64(name) root[#name]=Json::UInt64(state->name); - #define JSON_FLOAT(name) root[#name]=state->name; - #define JSON_STRING(name) root[#name]=state->name; + #define TO_JSON_STRUCT(name) root[#name]=ToJSON(&(state->name)); + #define TO_JSON_OBJECT(name) root[#name]=ToJSON(state->name); + #define TO_JSON_BOOL(name) root[#name]=bool(state->name); + #define TO_JSON_INT32(name) root[#name]=Json::Int(state->name); + #define TO_JSON_UINT32(name) root[#name]=Json::UInt(state->name); + #define TO_JSON_INT64(name) root[#name]=Json::Int64(state->name); + #define TO_JSON_UINT64(name) root[#name]=Json::UInt64(state->name); + #define TO_JSON_FLOAT(name) root[#name]=state->name; + #define TO_JSON_STRING(name) root[#name]=state->name; + + #define FROM_JSON_BEGIN(struct_name) bool FromJSON(const Json::Value &root,struct_name *state) \ + { \ + + #define FROM_JSON_END return true; \ + } + + #define CHECK_MEMBER(name) if(!root.isMember(#name))return(false) + #define FROM_JSON_STRUCT(name) CHECK_MEMBER(name);if(!FromJSON(root[#name],&(state->name)))return(false); + #define FROM_JSON_OBJECT(name) CHECK_MEMBER(name);if(!FromJSON(root[#name],state->name))return(false); + #define FROM_JSON_BOOL(name) CHECK_MEMBER(name);state->name=root[#name].asBool(); + #define FROM_JSON_ENUM(type,name) CHECK_MEMBER(name);state->name=type(root[#name].asUInt()); + #define FROM_JSON_INT32(name) CHECK_MEMBER(name);state->name=root[#name].asInt(); + #define FROM_JSON_UINT32(name) CHECK_MEMBER(name);state->name=root[#name].asUInt(); + #define FROM_JSON_INT64(name) CHECK_MEMBER(name);state->name=root[#name].asInt64(); + #define FROM_JSON_UINT64(name) CHECK_MEMBER(name);state->name=root[#name].asUInt64(); + #define FROM_JSON_FLOAT(name) CHECK_MEMBER(name);state->name=root[#name].asFloat(); + #define FROM_JSON_STRING(name) CHECK_MEMBER(name);state->name=root[#name].asCString(); template Json::Value ToJSON_Array(const T *values,const uint count) @@ -39,7 +57,19 @@ namespace return items; } - #define JSON_ARRAY(name,count) root[#name]=ToJSON_Array(state->name,count); + #define TO_JSON_ARRAY(name,count) root[#name]=ToJSON_Array(state->name,count); + + template void FromJSON_Array(const Json::Value &root,T *object,const uint count); + template<> void FromJSON_Array(const Json::Value &root,float *object,const uint count) + { + for(uint i=0;iname,count); template Json::Value ToJSON_StructArray(const T *object,const uint count) @@ -55,87 +85,148 @@ namespace return items; } - #define JSON_STRUCT_ARRAY(name,count) root[#name]=ToJSON_StructArray(state->name,count) + #define TO_JSON_STRUCT_ARRAY(name,count) root[#name]=ToJSON_StructArray(state->name,count) - JSON_BEGIN(VkStencilOpState) - JSON_UINT32(failOp) - JSON_UINT32(passOp) - JSON_UINT32(depthFailOp) - JSON_UINT32(compareOp) - JSON_UINT32(compareMask) - JSON_UINT32(writeMask) - JSON_UINT32(reference) - JSON_END + template + void FromJSON_StructArray(const Json::Value &root,T *objects,const uint count) + { + for(uint i=0;iname,count); - JSON_BEGIN(VkPipelineColorBlendAttachmentState) - JSON_BOOL(blendEnable) - JSON_UINT32(srcColorBlendFactor) - JSON_UINT32(dstColorBlendFactor) - JSON_UINT32(colorBlendOp) - JSON_UINT32(srcAlphaBlendFactor) - JSON_UINT32(dstAlphaBlendFactor) - JSON_UINT32(alphaBlendOp) - JSON_UINT32(colorWriteMask) - JSON_END + TO_JSON_BEGIN(VkStencilOpState) + TO_JSON_UINT32(failOp) + TO_JSON_UINT32(passOp) + TO_JSON_UINT32(depthFailOp) + TO_JSON_UINT32(compareOp) + TO_JSON_UINT32(compareMask) + TO_JSON_UINT32(writeMask) + TO_JSON_UINT32(reference) + TO_JSON_END - JSON_BEGIN(VkPipelineColorBlendStateCreateInfo) - JSON_BOOL(logicOpEnable) - JSON_UINT32(logicOp) - JSON_ARRAY(blendConstants,4); - JSON_STRUCT_ARRAY(pAttachments,state->attachmentCount); - JSON_END + FROM_JSON_BEGIN(VkStencilOpState) + FROM_JSON_ENUM(VkStencilOp,failOp) + FROM_JSON_ENUM(VkStencilOp,passOp) + FROM_JSON_ENUM(VkStencilOp,depthFailOp) + FROM_JSON_ENUM(VkCompareOp,compareOp) + FROM_JSON_UINT32(compareMask) + FROM_JSON_UINT32(writeMask) + FROM_JSON_UINT32(reference) + FROM_JSON_END - JSON_BEGIN(VkPipelineRasterizationStateCreateInfo) - JSON_BOOL(depthClampEnable) - JSON_BOOL(rasterizerDiscardEnable) - JSON_UINT32(polygonMode) - JSON_UINT32(cullMode) - JSON_UINT32(frontFace) - JSON_BOOL(depthBiasEnable) - JSON_FLOAT(depthBiasConstantFactor) - JSON_FLOAT(depthBiasClamp) - JSON_FLOAT(depthBiasSlopeFactor) - JSON_FLOAT(lineWidth) - JSON_END + TO_JSON_BEGIN(VkPipelineDepthStencilStateCreateInfo) + TO_JSON_BOOL (depthTestEnable) + TO_JSON_BOOL (depthWriteEnable) + TO_JSON_UINT32 (depthCompareOp) + TO_JSON_BOOL (depthBoundsTestEnable) + TO_JSON_BOOL (stencilTestEnable) + TO_JSON_STRUCT (front) + TO_JSON_STRUCT (back) + TO_JSON_FLOAT (minDepthBounds) + TO_JSON_FLOAT (maxDepthBounds) + TO_JSON_END - JSON_BEGIN(VkPipelineMultisampleStateCreateInfo) - JSON_UINT32(rasterizationSamples) - JSON_BOOL(sampleShadingEnable) - JSON_FLOAT(minSampleShading) - JSON_BOOL(alphaToCoverageEnable) - JSON_BOOL(alphaToOneEnable) - JSON_END + FROM_JSON_BEGIN(VkPipelineDepthStencilStateCreateInfo) + FROM_JSON_BOOL (depthTestEnable) + FROM_JSON_BOOL (depthWriteEnable) + FROM_JSON_ENUM (VkCompareOp,depthCompareOp) + FROM_JSON_BOOL (depthBoundsTestEnable) + FROM_JSON_BOOL (stencilTestEnable) + FROM_JSON_STRUCT(front) + FROM_JSON_STRUCT(back) + FROM_JSON_FLOAT (minDepthBounds) + FROM_JSON_FLOAT (maxDepthBounds) + FROM_JSON_END - JSON_BEGIN(VkPipelineInputAssemblyStateCreateInfo) - JSON_UINT32(topology) - JSON_BOOL(primitiveRestartEnable) - JSON_END + TO_JSON_BEGIN(VkPipelineColorBlendAttachmentState) + TO_JSON_BOOL(blendEnable) + TO_JSON_UINT32(srcColorBlendFactor) + TO_JSON_UINT32(dstColorBlendFactor) + TO_JSON_UINT32(colorBlendOp) + TO_JSON_UINT32(srcAlphaBlendFactor) + TO_JSON_UINT32(dstAlphaBlendFactor) + TO_JSON_UINT32(alphaBlendOp) + TO_JSON_UINT32(colorWriteMask) + TO_JSON_END + + FROM_JSON_BEGIN(VkPipelineColorBlendAttachmentState) + FROM_JSON_BOOL(blendEnable) + FROM_JSON_ENUM(VkBlendFactor,srcColorBlendFactor) + FROM_JSON_ENUM(VkBlendFactor,dstColorBlendFactor) + FROM_JSON_ENUM(VkBlendOp,colorBlendOp) + FROM_JSON_ENUM(VkBlendFactor,srcAlphaBlendFactor) + FROM_JSON_ENUM(VkBlendFactor,dstAlphaBlendFactor) + FROM_JSON_ENUM(VkBlendOp,alphaBlendOp) + FROM_JSON_UINT32(colorWriteMask) + FROM_JSON_END + + TO_JSON_BEGIN(VkPipelineColorBlendStateCreateInfo) + TO_JSON_BOOL(logicOpEnable) + TO_JSON_UINT32(logicOp) + TO_JSON_ARRAY(blendConstants,4); + TO_JSON_UINT32(attachmentCount); + TO_JSON_STRUCT_ARRAY(pAttachments,state->attachmentCount); + TO_JSON_END + + FROM_JSON_BEGIN(VkPipelineColorBlendStateCreateInfo) + FROM_JSON_BOOL(logicOpEnable) + FROM_JSON_ENUM(VkLogicOp,logicOp) + FROM_JSON_ARRAY(blendConstants,4); + FROM_JSON_UINT32(attachmentCount); + FROM_JSON_STRUCT_ARRAY(pAttachments,state->attachmentCount); + FROM_JSON_END + + TO_JSON_BEGIN(VkPipelineRasterizationStateCreateInfo) + TO_JSON_BOOL(depthClampEnable) + TO_JSON_BOOL(rasterizerDiscardEnable) + TO_JSON_UINT32(polygonMode) + TO_JSON_UINT32(cullMode) + TO_JSON_UINT32(frontFace) + TO_JSON_BOOL(depthBiasEnable) + TO_JSON_FLOAT(depthBiasConstantFactor) + TO_JSON_FLOAT(depthBiasClamp) + TO_JSON_FLOAT(depthBiasSlopeFactor) + TO_JSON_FLOAT(lineWidth) + TO_JSON_END + + TO_JSON_BEGIN(VkPipelineMultisampleStateCreateInfo) + TO_JSON_UINT32(rasterizationSamples) + TO_JSON_BOOL(sampleShadingEnable) + TO_JSON_FLOAT(minSampleShading) + TO_JSON_BOOL(alphaToCoverageEnable) + TO_JSON_BOOL(alphaToOneEnable) + TO_JSON_END + + TO_JSON_BEGIN(VkPipelineInputAssemblyStateCreateInfo) + TO_JSON_UINT32(topology) + TO_JSON_BOOL(primitiveRestartEnable) + TO_JSON_END + + TO_JSON_BEGIN(VkGraphicsPipelineCreateInfo) + TO_JSON_OBJECT(pDepthStencilState) + TO_JSON_OBJECT(pColorBlendState) + TO_JSON_OBJECT(pRasterizationState) + TO_JSON_OBJECT(pMultisampleState) + TO_JSON_OBJECT(pInputAssemblyState) + TO_JSON_END + + const Json::String STRING_VER="ver", + STRING_VULKAN="vulkan", + STRING_PIPELINE="pipeline"; }//namespace void SaveToJSON(const OSString &filename,const VkGraphicsPipelineCreateInfo *state) { Json::Value root; - root["ver"]=100; - root["vulkan"]=100; - - JSON_OBJECT(pDepthStencilState) - JSON_OBJECT(pColorBlendState) - JSON_OBJECT(pRasterizationState) - JSON_OBJECT(pMultisampleState) - JSON_OBJECT(pInputAssemblyState) + root[STRING_VER]=100; + root[STRING_VULKAN]=100; + root[STRING_PIPELINE]=ToJSON(state); SaveJson(root,filename); } @@ -147,5 +238,12 @@ bool LoadFromJSON(const OSString &filename,const VkGraphicsPipelineCreateInfo *s if(!LoadJson(root,filename)) return(false); + if(!root.isMember(STRING_VER)) return(false); + if(!root.isMember(STRING_VULKAN)) return(false); + if(!root.isMember(STRING_PIPELINE)) return(false); + const uint file_ver =root[STRING_VER].asUInt(), + vulkan_ver =root[STRING_VULKAN].asUInt(); + + FromJSON(root[STRING_PIPELINE],state); }