ULRE/src/RenderDevice/Vulkan/json/VKPipelineCreateInfo.JSON.cpp
hyzboy 0ce2f43e2e 完成PipielineCreateInfo的JSON保存版本
***
现发现使用这种方式保存,对于枚举项在文件中使用数字表示不方便阅讯,考虑自设计一种格式,对枚举项可注册使用字符串保存。
***
2019-05-13 13:33:27 +08:00

142 lines
4.1 KiB
C++

#include<json/json.h>
#include<vulkan/vulkan.h>
#include<hgl/type/BaseString.h>
#include<hgl/filesystem/FileSystem.h>
#include<hgl/util/JsonTool.h>
using namespace hgl;
namespace
{
#define JSON_BEGIN(struct_name) Json::Value ToJSON(const struct_name *state) \
{ \
Json::Value root;
#define 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;
template<typename T>
Json::Value ToJSON_Array(const T *values,const uint count)
{
Json::Value items;
for(uint i=0;i<count;i++)
{
items[i]=*values;
++values;
}
return items;
}
#define JSON_ARRAY(name,count) root[#name]=ToJSON_Array(state->name,count);
template<typename T>
Json::Value ToJSON_StructArray(const T *object,const uint count)
{
Json::Value items;
for(uint i=0;i<count;i++)
{
items[i]=ToJSON(object);
++object;
}
return items;
}
#define 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
JSON_BEGIN(VkPipelineDepthStencilStateCreateInfo)
JSON_BOOL (depthTestEnable)
JSON_BOOL (depthWriteEnable)
JSON_UINT32 (depthCompareOp)
JSON_BOOL (depthBoundsTestEnable)
JSON_BOOL (stencilTestEnable)
JSON_STRUCT (front)
JSON_STRUCT (back)
JSON_FLOAT (minDepthBounds)
JSON_FLOAT (maxDepthBounds)
JSON_END
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
JSON_BEGIN(VkPipelineColorBlendStateCreateInfo)
JSON_BOOL(logicOpEnable)
JSON_UINT32(logicOp)
JSON_ARRAY(blendConstants,4);
JSON_STRUCT_ARRAY(pAttachments,state->attachmentCount);
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
JSON_BEGIN(VkPipelineMultisampleStateCreateInfo)
JSON_UINT32(rasterizationSamples)
JSON_BOOL(sampleShadingEnable)
JSON_FLOAT(minSampleShading)
JSON_BOOL(alphaToCoverageEnable)
JSON_BOOL(alphaToOneEnable)
JSON_END
JSON_BEGIN(VkPipelineInputAssemblyStateCreateInfo)
JSON_UINT32(topology)
JSON_BOOL(primitiveRestartEnable)
JSON_END
}//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)
SaveJson(root,filename);
}