- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
template <typename T, typename... Ts>
struct StructureChain : T, StructureChain<Ts...>
{
StructureChain(const T &t, const Ts&... a) : T(t), StructureChain<Ts...>(a...)
{
((T*)this)->pNext = (StructureChain<Ts...>*)this;
}
};
template <typename T>
struct StructureChain<T> : T
{
StructureChain(const T &t) : T(t){}
};
// Positional arguments? Im my C++? It's more likely than you think!
template<typename T>
struct SetterFunc;
template<typename T, typename V>
struct SetterVal
{
const SetterFunc<T> &func;
const V &val;
SetterVal(const SetterFunc<T> &f, const V &v) : func(f), val(v){}
};
template<typename T>
struct SetterFunc
{
const T &func;
SetterFunc(const T &data)
: func(data)
{}
template <typename V>
SetterVal<T,V> operator() (const V &v) {return SetterVal(*this,v);}
template <typename V>
SetterVal<T,V> operator= (const V &v) {return SetterVal(*this,v);}
};
template <typename T, typename... Ts>
void FillStructure(T &t, const Ts&... ts)
{
auto filler = [](T &t, const auto &arg){
auto T::*ptr = arg.func.func(t);
t.*ptr = arg.val;
};
(filler(t,ts),...);
}
// todo: remove extra unused copy
#define $(k) SetterFunc([](auto a){return &decltype(a)::k;})
template <typename T, typename... Ts>
T $M(T t, const Ts&... ts)
{
FillStructure(t, ts...);
return t;
}
// ...
VkSubresourceLayout layout = {0};
layout.rowPitch = pitch1;
StructureChain iinfo{
$M(VkImageCreateInfo{VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO},
$(imageType) = VK_IMAGE_TYPE_2D,
$(format) = p010?VK_FORMAT_R16_UNORM:VK_FORMAT_R8_UNORM,
$(extent) = VkExtent3D{ WIDTH, HEIGHT, 1 },
$(mipLevels) = 1,
$(arrayLayers)= 1,
$(samples) =VK_SAMPLE_COUNT_1_BIT,
$(tiling) = VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT,
$(usage) = VK_IMAGE_USAGE_STORAGE_BIT,
$(sharingMode) = VK_SHARING_MODE_EXCLUSIVE
),
$M(VkExternalMemoryImageCreateInfo{VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_IMAGE_CREATE_INFO},
$(handleTypes) = VK_EXTERNAL_MEMORY_HANDLE_TYPE_DMA_BUF_BIT_EXT
),
$M(VkImageDrmFormatModifierExplicitCreateInfoEXT{VK_STRUCTURE_TYPE_IMAGE_DRM_FORMAT_MODIFIER_EXPLICIT_CREATE_INFO_EXT},
$(drmFormatModifierPlaneCount) = 1,
$(drmFormatModifier) = mod,
$(pPlaneLayouts) = &layout
)
};
VK_CHECK_RESULT(vkCreateImage(dev.device, &iinfo, NULL, &texture0.image)); // create image.
Positional arguments? Im my C++? It's more likely than you think!
guest6 15.10.2024 10:57 # 0
Myxa 15.10.2024 16:25 # 0
На вкус, как «PHP».