Vulkan Schnee 0.0.1
High-performance rendering engine
Loading...
Searching...
No Matches
NextChainBuilder.h
Go to the documentation of this file.
1#pragma once
2#include <type_traits>
3#include <vulkan/vulkan_core.h>
4
9namespace Vulkan {
11 public:
12 ChainBuilder() : head(nullptr), tail(nullptr) {};
13
14 template<typename VulkanStruct>
15 ChainBuilder& add(VulkanStruct &object);
16
17 template<typename T>
18 T* getHead() {
19 return head;
20 }
21
22 void* getHead() {
23 return head;
24 }
25
26 private:
27
28 struct BaseChain {
29 VkStructureType sType;
30 void* pNext;
31 };
32
33 template<typename T, typename = void>
34 struct has_pNext : std::false_type {};
35
36 template<typename T>
37 struct has_pNext<T, std::void_t<decltype(std::declval<T>().pNext)>> : std::true_type {};
38
39 void* head;
40 void* tail;
41
42 };
43
44 template<typename VulkanStruct>
45 ChainBuilder & ChainBuilder::add(VulkanStruct &object) {
46 static_assert(has_pNext<VulkanStruct>::value, "Type must have pNext member");
47
48 object.pNext = nullptr;
49
50 if (!head) {
51 head = &object;
52 tail = &object;
53 } else {
54 static_cast<BaseChain*>(tail)->pNext = &object;
55 tail = &object;
56 }
57 return *this;
58 }
59}
ChainBuilder & add(VulkanStruct &object)
Used for vulkan specific helpers like something to chain pNexts together.
STL namespace.