Foray Library
rapid prototyping framework for crossplatform development of vulkan hardware ray tracing applications
Loading...
Searching...
No Matches
foray_basesbt.hpp
Go to the documentation of this file.
1#pragma once
2#include "../core/foray_managedbuffer.hpp"
3#include "../core/foray_shadermodule.hpp"
6#include <unordered_map>
7#include <vector>
8
9namespace foray::rtpipe {
10
35 {
36 public:
37 explicit ShaderBindingTableBase(VkDeviceSize entryDataSize = 0);
38
40 {
41 int32_t Start = -1;
42 int32_t Count = 0;
43 };
44
49 virtual void Build(core::Context* context, const VkPhysicalDeviceRayTracingPipelinePropertiesKHR& pipelineProperties, const std::vector<const uint8_t*>& handles);
50
51 FORAY_GETTER_V(EntryDataSize)
52 FORAY_GETTER_V(AddressRegion)
53 FORAY_GETTER_CR(Buffer)
54
55
56 std::vector<uint8_t>& GroupDataAt(GroupIndex groupIndex);
58 const std::vector<uint8_t>& GroupDataAt(GroupIndex groupIndex) const;
59
61 template <typename TData>
62 TData* GroupDataAt(GroupIndex groupIndex)
63 {
64 std::vector<uint8_t>& data = GroupDataAt(groupIndex);
65 if(data.size() > 0)
66 {
67 Assert(sizeof(TData) == data.size(), "Custom data and sizeof(TData) size mismatch!");
68 return reinterpret_cast<TData*>(data.data());
69 }
70 else
71 {
72 return nullptr;
73 }
74 }
75
77 template <typename TData>
78 const TData* GroupDataAt(GroupIndex groupIndex) const
79 {
80 const std::vector<uint8_t>& data = GroupDataAt(groupIndex);
81 if(data.size() > 0)
82 {
83 Assert(sizeof(TData) == data.size(), "Custom data and sizeof(TData) size mismatch!");
84 return reinterpret_cast<const TData*>(data.data());
85 }
86 else
87 {
88 return nullptr;
89 }
90 }
91
93 void SetData(GroupIndex groupIndex, const void* data);
94
96 template <typename TData>
97 void SetData(GroupIndex groupIndex, const TData& data)
98 {
99 Assert(sizeof(TData) == mEntryDataSize);
100 SetData(groupIndex, &data);
101 }
102
104 virtual ShaderBindingTableBase& SetEntryDataSize(VkDeviceSize newSize);
105
107 virtual void WriteToShaderCollection(RtShaderCollection& collection) const = 0;
111 virtual VectorRange WriteToShaderGroupCiVector(std::vector<VkRayTracingShaderGroupCreateInfoKHR>& groupCis, const RtShaderCollection& shaderCollection) const = 0;
112
113 virtual void Destroy();
114
115 inline virtual ~ShaderBindingTableBase() { Destroy(); }
116
117
118 protected:
120 VkStridedDeviceAddressRegionKHR mAddressRegion{};
121
122 VkDeviceSize mEntryDataSize{};
123
124 std::vector<std::vector<uint8_t>> mGroupData{};
125
126 virtual size_t GetGroupArrayCount() const = 0;
127 void ArrayResized(size_t newSize);
128 };
129} // namespace foray::rtpipe
Wraps allocation and lifetime functionality of a VkBuffer.
Definition foray_managedbuffer.hpp:12
Helper class to manage unique Rt ShaderModules.
Definition foray_rtshadercollection.hpp:11
Shader Binding Table base class, providing functions to manage custom generic shader group data and S...
Definition foray_basesbt.hpp:35
core::ManagedBuffer mBuffer
Definition foray_basesbt.hpp:119
virtual size_t GetGroupArrayCount() const =0
virtual void WriteToShaderCollection(RtShaderCollection &collection) const =0
For any shader group defined, register it with the collection.
virtual VectorRange WriteToShaderGroupCiVector(std::vector< VkRayTracingShaderGroupCreateInfoKHR > &groupCis, const RtShaderCollection &shaderCollection) const =0
Write the shader groups to groupCis vector.
const TData * GroupDataAt(GroupIndex groupIndex) const
Access the custom data entry for a group. May return nullptr!
Definition foray_basesbt.hpp:78
void SetData(GroupIndex groupIndex, const TData &data)
Set the custom data entry for a group.
Definition foray_basesbt.hpp:97
VkDeviceSize mEntryDataSize
Definition foray_basesbt.hpp:122
void SetData(GroupIndex groupIndex, const void *data)
Set the custom data entry for a group.
ShaderBindingTableBase(VkDeviceSize entryDataSize=0)
VkStridedDeviceAddressRegionKHR mAddressRegion
Definition foray_basesbt.hpp:120
std::vector< uint8_t > & GroupDataAt(GroupIndex groupIndex)
Access the custom data entry for a group.
virtual ~ShaderBindingTableBase()
Definition foray_basesbt.hpp:115
std::vector< std::vector< uint8_t > > mGroupData
Definition foray_basesbt.hpp:124
virtual void Build(core::Context *context, const VkPhysicalDeviceRayTracingPipelinePropertiesKHR &pipelineProperties, const std::vector< const uint8_t * > &handles)
Rebuilds the SBT buffer according to the pipeline properties and matching indices.
virtual ShaderBindingTableBase & SetEntryDataSize(VkDeviceSize newSize)
Set the custom entry data size. Any non-zero custom data is resized according to std::vector<uint8_t>...
#define FORAY_GETTER_V(member)
Return value.
Definition foray_basics.hpp:39
#define FORAY_GETTER_CR(member)
Return constant reference.
Definition foray_basics.hpp:60
Definition foray_basesbt.hpp:9
int32_t GroupIndex
Type used for indexing ShaderGroups in SBTs.
Definition foray_rtshadertypes.hpp:45
void Assert(bool condition, const source_location location=source_location::current())
Asserts condition. Throws a generic error message if conditition is false.
Definition foray_exception.hpp:52
Definition foray_env.hpp:92
Non owning context object.
Definition foray_context.hpp:16
int32_t Count
Definition foray_basesbt.hpp:42
int32_t Start
Definition foray_basesbt.hpp:41