diff --git a/json_mods.hpp b/json_mods.hpp new file mode 100644 index 0000000..85481af --- /dev/null +++ b/json_mods.hpp @@ -0,0 +1,34 @@ +#pragma once +#include +#include +#include + +#define ENROLL_COMPONENT(COMPONENT, ...) \ + NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE(COMPONENT, __VA_ARGS__); \ + template <> struct NameOf { \ + static constexpr const char *name = #COMPONENT; \ + }; + +// partial specialization (full specialization works too) +namespace nlohmann { + template + struct adl_serializer> { + static void to_json(json& j, const std::optional& opt) { + if (opt == std::nullopt) { + j = nullptr; + } else { + j = *opt; // this will call adl_serializer::to_json which will + // find the free function to_json in T's namespace! + } + } + + static void from_json(const json& j, std::optional& opt) { + if (j.is_null() || j == false) { + opt = std::nullopt; + } else { + opt = std::make_optional(j.template get()); + // same as above, but with adl_serializer::from_json + } + } + }; +} diff --git a/meson.build b/meson.build index deacd3f..9d89fea 100644 --- a/meson.build +++ b/meson.build @@ -104,6 +104,7 @@ else }) endif +json = subproject('nlohmann_json').get_variable('nlohmann_json_dep') vkbootstrap_proj = cmake.subproject('vk-bootstrap', options: vk_opts) vkbootstrap = vkbootstrap_proj.get_variable('vk_bootstrap_dep') @@ -113,6 +114,7 @@ dependencies += [ glm, imgui, sdl2, + json, ] sources = [ diff --git a/trash_test.hpp b/trash_test.hpp new file mode 100644 index 0000000..e750836 --- /dev/null +++ b/trash_test.hpp @@ -0,0 +1,8 @@ +#include "vk_types.h" +#include "json_mods.hpp" + +template struct NameOf; + +ENROLL_COMPONENT(VkSemaphoreCreateInfo, sType); +ENROLL_COMPONENT(VkFenceCreateInfo, sType); +ENROLL_COMPONENT(VkImageViewCreateInfo, sType, viewType, subresourceRange.baseMipLevel, subresourceRange.levelCount, subresourceRange.baseArrayLayer, subresourceRange.layerCount); diff --git a/vk_engine.cpp b/vk_engine.cpp index da914ab..7fcec8f 100644 --- a/vk_engine.cpp +++ b/vk_engine.cpp @@ -19,7 +19,7 @@ #define VMA_IMPLEMENTATION #include "vk_mem_alloc.h" -constexpr bool bUseValidationLayers = true; +constexpr bool bUseValidationLayers = false; VulkanEngine* loadedEngine = nullptr; diff --git a/vk_initializers.cpp b/vk_initializers.cpp index 3c30974..c31d17b 100644 --- a/vk_initializers.cpp +++ b/vk_initializers.cpp @@ -1,4 +1,40 @@ #include +#include +#include "trash_test.hpp" + +nlohmann::json DATA = nlohmann::json::parse(R"( + { + "VkSemaphoreCreateInfo": { + "draw": { + "sType": 9 + } + }, + "VkFenceCreateInfo": { + "draw": { + "sType": 8 + } + }, + "VkImageViewCreateInfo": { + "draw": { + "sType": 15, + "viewType": 1, + "subresourceRange.baseMipLevel": 0, + "subresourceRange.levelCount": 1, + "subresourceRange.baseArrayLayer": 0, + "subresourceRange.layerCount": 1 + } + } + } +)"); + +template COMPONENT load(nlohmann::json &data, const std::string& profile) { + COMPONENT result{}; + auto& type_stuff = data[NameOf::name]; + auto& profile_data = type_stuff[profile]; + nlohmann::from_json(profile_data, result); + return result; +} + VkCommandPoolCreateInfo vkinit::command_pool_create_info(uint32_t queueFamilyIndex, VkCommandPoolCreateFlags flags /*= 0*/) @@ -27,19 +63,16 @@ VkCommandBufferAllocateInfo vkinit::command_buffer_allocate_info( VkFenceCreateInfo vkinit::fence_create_info(VkFenceCreateFlags flags /*=0*/) { - VkFenceCreateInfo info = {}; - info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO; - info.pNext = nullptr; + auto info = load(DATA, "draw"); info.flags = flags; return info; } VkSemaphoreCreateInfo vkinit::semaphore_create_info(VkSemaphoreCreateFlags flags/*=0*/) { - VkSemaphoreCreateInfo info = {}; - info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO; - info.pNext = nullptr; + auto info = load(DATA, "draw"); info.flags = flags; + return info; } @@ -133,17 +166,10 @@ VkImageCreateInfo vkinit::image_create_info(VkFormat format, VkImageUsageFlags u VkImageViewCreateInfo vkinit::imageview_create_info(VkFormat format, VkImage image, VkImageAspectFlags aspectFlags) { - VkImageViewCreateInfo info{}; - info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO; - info.pNext = nullptr; + auto info = load(DATA, "draw"); - info.viewType = VK_IMAGE_VIEW_TYPE_2D; info.image = image; info.format = format; - info.subresourceRange.baseMipLevel = 0; - info.subresourceRange.levelCount = 1; - info.subresourceRange.baseArrayLayer = 0; - info.subresourceRange.layerCount = 1; info.subresourceRange.aspectMask = aspectFlags; return info; diff --git a/wraps/nlohmann_json.wrap b/wraps/nlohmann_json.wrap new file mode 100644 index 0000000..8c46676 --- /dev/null +++ b/wraps/nlohmann_json.wrap @@ -0,0 +1,11 @@ +[wrap-file] +directory = nlohmann_json-3.11.3 +lead_directory_missing = true +source_url = https://github.com/nlohmann/json/releases/download/v3.11.3/include.zip +source_filename = nlohmann_json-3.11.3.zip +source_hash = a22461d13119ac5c78f205d3df1db13403e58ce1bb1794edc9313677313f4a9d +source_fallback_url = https://github.com/mesonbuild/wrapdb/releases/download/nlohmann_json_3.11.3-1/nlohmann_json-3.11.3.zip +wrapdb_version = 3.11.3-1 + +[provide] +nlohmann_json = nlohmann_json_dep