158 lines
3.7 KiB
C++
158 lines
3.7 KiB
C++
|
|
#pragma once
|
|
|
|
#if !defined(VK_CAPTURE_VARIANT_POOL_HPP_INCLUDED)
|
|
#define VK_CAPTURE_VARIANT_POOL_HPP_INCLUDED 1
|
|
|
|
#include <array>
|
|
#include <cstddef>
|
|
#include <cstring>
|
|
#include <memory>
|
|
#include <vector>
|
|
#include "common.hpp"
|
|
#include "variant_wrap.hpp"
|
|
#include "vk_capture.h"
|
|
|
|
namespace vk_capture
|
|
{
|
|
|
|
//
|
|
// public defines
|
|
//
|
|
|
|
//
|
|
// public constants
|
|
//
|
|
|
|
//
|
|
// public types
|
|
//
|
|
|
|
struct VariantPool
|
|
{
|
|
static constexpr std::size_t PAGE_SIZE = 1024;
|
|
using page_t = std::array<VkVariantMWN, PAGE_SIZE>;
|
|
using page_ptr_t = std::unique_ptr<page_t>;
|
|
|
|
std::vector<page_ptr_t> pages;
|
|
std::size_t nextIndex = 0;
|
|
|
|
VkVariantMWN* allocate(std::size_t num = 1);
|
|
inline void reset() { nextIndex = 0; }
|
|
};
|
|
|
|
//
|
|
// public functions
|
|
//
|
|
|
|
template<typename TValue>
|
|
inline void variantWrap(const TValue& /* value */, VkVariantMWN& outVariant)
|
|
{
|
|
outVariant.type = VK_VARIANT_TYPE_UNKNOWN_MWN;
|
|
}
|
|
|
|
inline void variantWrap(bool value, VkVariantMWN& outVariant)
|
|
{
|
|
outVariant.type = VK_VARIANT_TYPE_BOOL_MWN;
|
|
outVariant.uintValue = value;
|
|
}
|
|
|
|
inline void variantWrap(std::uint8_t value, VkVariantMWN& outVariant)
|
|
{
|
|
outVariant.type = VK_VARIANT_TYPE_UINT8_MWN;
|
|
outVariant.uintValue = value;
|
|
}
|
|
|
|
inline void variantWrap(std::int8_t value, VkVariantMWN& outVariant)
|
|
{
|
|
outVariant.type = VK_VARIANT_TYPE_INT8_MWN;
|
|
outVariant.intValue = value;
|
|
}
|
|
|
|
inline void variantWrap(std::uint16_t value, VkVariantMWN& outVariant)
|
|
{
|
|
outVariant.type = VK_VARIANT_TYPE_UINT16_MWN;
|
|
outVariant.uintValue = value;
|
|
}
|
|
|
|
inline void variantWrap(std::int16_t value, VkVariantMWN& outVariant)
|
|
{
|
|
outVariant.type = VK_VARIANT_TYPE_INT16_MWN;
|
|
outVariant.intValue = value;
|
|
}
|
|
|
|
inline void variantWrap(std::uint32_t value, VkVariantMWN& outVariant)
|
|
{
|
|
outVariant.type = VK_VARIANT_TYPE_UINT32_MWN;
|
|
outVariant.uintValue = value;
|
|
}
|
|
|
|
inline void variantWrap(std::int32_t value, VkVariantMWN& outVariant)
|
|
{
|
|
outVariant.type = VK_VARIANT_TYPE_INT32_MWN;
|
|
outVariant.intValue = value;
|
|
}
|
|
|
|
inline void variantWrap(std::uint64_t value, VkVariantMWN& outVariant)
|
|
{
|
|
outVariant.type = VK_VARIANT_TYPE_UINT64_MWN;
|
|
outVariant.uintValue = value;
|
|
}
|
|
|
|
inline void variantWrap(std::int64_t value, VkVariantMWN& outVariant)
|
|
{
|
|
outVariant.type = VK_VARIANT_TYPE_INT64_MWN;
|
|
outVariant.intValue = value;
|
|
}
|
|
|
|
inline void variantWrap(const void* value, VkVariantMWN& outVariant)
|
|
{
|
|
outVariant.type = VK_VARIANT_TYPE_VOID_POINTER_MWN;
|
|
outVariant.voidPointerValue = value;
|
|
}
|
|
|
|
inline void variantWrap(const char* value, VkVariantMWN& outVariant)
|
|
{
|
|
const std::size_t len = std::strlen(value);
|
|
outVariant.type = VK_VARIANT_TYPE_STRING_MWN;
|
|
|
|
char* copy = allocType<char>(len + 1);
|
|
std::memcpy(copy, value, len + 1);
|
|
outVariant.stringValue = copy;
|
|
}
|
|
|
|
template<typename TPointed>
|
|
inline void variantWrap(const TPointed* value, VkVariantMWN& outVariant);
|
|
|
|
template<typename TEle, std::size_t count>
|
|
inline void variantWrap(const TEle (&value)[count], VkVariantMWN& outVariant)
|
|
{
|
|
outVariant.type = VK_VARIANT_TYPE_ARRAY_MWN;
|
|
outVariant.arrayValue.numElements = count;
|
|
outVariant.arrayValue.elements = allocVariant(count);
|
|
|
|
for (std::size_t idx = 0; idx < count; ++idx) {
|
|
variantWrap(value[idx], outVariant.arrayValue.elements[idx]);
|
|
}
|
|
}
|
|
|
|
template<typename TPointed>
|
|
inline void variantWrap(const TPointed* value, VkVariantMWN& outVariant)
|
|
{
|
|
outVariant.type = VK_VARIANT_TYPE_POINTER_MWN;
|
|
if (value != nullptr)
|
|
{
|
|
outVariant.pointerValue = allocVariant(1);
|
|
variantWrap(*value, *outVariant.pointerValue);
|
|
}
|
|
else
|
|
{
|
|
// TODO: now the type is missing ...
|
|
outVariant.pointerValue = nullptr;
|
|
}
|
|
}
|
|
|
|
} // namespace vk_capture
|
|
|
|
#endif // !defined(VK_CAPTURE_VARIANT_POOL_HPP_INCLUDED)
|