SpiecsEngine
 
Loading...
Searching...
No Matches
VulkanDeviceGeneratedCommandsNV.cpp
Go to the documentation of this file.
1/**
2* @file VulkanDeviceGeneratedCommandsNV.cpp.
3* @brief The VulkanDeviceGeneratedCommandsNV Class Implementation.
4* @author Spices.
5*/
6
7#include "Pchheader.h"
10
11namespace Spices {
12
14 : VulkanObject(vulkanState)
15 , m_Strides(0)
17 , m_NSequence(0)
18 , m_InputBuffer(nullptr)
19 , m_PreprocessBuffer(nullptr)
21 {}
22
24 {
26
27 m_InputStrides.clear();
28 m_Strides = 0;
29 m_IndirectCmdsLayout = nullptr;
30
31 }
32
34 {
36
37 m_NSequence = 0;
38 m_InputBuffer = nullptr;
39 m_InputStreams.clear();
40 m_PreprocessBuffer = nullptr;
42 }
43
45 {
47
48 m_InputStrides.push_back(stride);
49 m_Strides += stride;
50 }
51
53 {
55
56 m_InputBuffer = std::make_shared<VulkanBuffer>(
57 m_VulkanState,
58 "GDCInputBuffer",
59 size,
60 VK_BUFFER_USAGE_TRANSFER_DST_BIT ,
61 VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT
62 );
63
64 return m_InputBuffer;
65 }
66
68 {
70
71 VkGeneratedCommandsMemoryRequirementsInfoNV memInfo{};
72 memInfo.sType = VK_STRUCTURE_TYPE_GENERATED_COMMANDS_MEMORY_REQUIREMENTS_INFO_NV;
73 memInfo.maxSequencesCount = m_NSequence;
74 memInfo.indirectCommandsLayout = m_IndirectCmdsLayout->Get();
75 memInfo.pipeline = m_Pipeline->GetPipeline();
76 memInfo.pipelineBindPoint = VK_PIPELINE_BIND_POINT_GRAPHICS;
77
78 VkMemoryRequirements2 memReqs{};
79 memReqs.sType = VK_STRUCTURE_TYPE_MEMORY_REQUIREMENTS_2;
80
81 m_VulkanState.m_VkFunc.vkGetGeneratedCommandsMemoryRequirementsNV(m_VulkanState.m_Device, &memInfo, &memReqs);
82
83 m_PreprocessBuffer = std::make_shared<VulkanBuffer>(
84 m_VulkanState ,
85 "GDCPreprocessBuffer" ,
86 memReqs.memoryRequirements.size ,
87 VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT ,
88 VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT |
89 VMA_MEMORY_PROPERTY_DEDICATED_MEMORY_BIT
90 );
91
92 m_PreprocessSize = memReqs.memoryRequirements.size;
93 }
94
95 void VulkanDeviceGeneratedCommandsNV::BuildCommandLayout(const std::vector<VkIndirectCommandsLayoutTokenNV>& inputInfos)
96 {
98
99 m_LayoutTokens = inputInfos;
100
101 /**
102 * @brief Instance a VkIndirectCommandsLayoutCreateInfoNV.
103 */
104 VkIndirectCommandsLayoutCreateInfoNV genInfo{};
105 genInfo.sType = VK_STRUCTURE_TYPE_INDIRECT_COMMANDS_LAYOUT_CREATE_INFO_NV;
106 genInfo.flags = VK_INDIRECT_COMMANDS_LAYOUT_USAGE_UNORDERED_SEQUENCES_BIT_NV;
107 genInfo.tokenCount = static_cast<uint32_t>(inputInfos.size());
108 genInfo.pTokens = inputInfos.data();
109 genInfo.streamCount = static_cast<uint32_t>(m_InputStrides.size());
110 genInfo.pStreamStrides = m_InputStrides.data();
111
112 m_IndirectCmdsLayout = std::make_shared<VulkanIndirectCommandsLayoutNV>(m_VulkanState, genInfo);
113 }
114
115 void VulkanDeviceGeneratedCommandsNV::CreateMeshPipeline(const std::string& pipelineName, const std::string& materialName, PipelineConfigInfo& config)
116 {
118
119 m_Pipeline = std::make_shared<VulkanIndirectMeshPipelineNV>(
120 m_VulkanState ,
121 pipelineName ,
122 materialName ,
123 m_PipelineRef ,
124 config
125 );
126 }
127
128 void VulkanDeviceGeneratedCommandsNV::PreprocessDGC(const VkCommandBuffer& cmdBuffer) const
129 {
131
132 if (m_NSequence == 0) return;
133
134 /**
135 * @brief Instance a VkGeneratedCommandsInfoNV.
136 */
137 VkGeneratedCommandsInfoNV info{};
138 info.sType = VK_STRUCTURE_TYPE_GENERATED_COMMANDS_INFO_NV;
139 info.pipeline = m_Pipeline->GetPipeline();
140 info.pipelineBindPoint = VK_PIPELINE_BIND_POINT_GRAPHICS;
141 info.indirectCommandsLayout = m_IndirectCmdsLayout->Get();
142 info.sequencesCount = m_NSequence;
143 info.streamCount = static_cast<uint32_t>(m_InputStreams.size());
144 info.pStreams = m_InputStreams.data();
145 info.preprocessBuffer = m_PreprocessBuffer->Get();
146 info.preprocessSize = m_PreprocessSize;
147
148 /**
149 * @brief Call vkCmdPreprocessGeneratedCommandsNV.
150 */
151 m_VulkanState.m_VkFunc.vkCmdPreprocessGeneratedCommandsNV(cmdBuffer, &info);
152 }
153
154 void VulkanDeviceGeneratedCommandsNV::ExecuteDGC(const VkCommandBuffer& cmdBuffer) const
155 {
157
158 if (m_NSequence == 0) return;
159
160 /**
161 * @brief Instance a VkGeneratedCommandsInfoNV.
162 */
163 VkGeneratedCommandsInfoNV info{};
164 info.sType = VK_STRUCTURE_TYPE_GENERATED_COMMANDS_INFO_NV;
165 info.pipeline = m_Pipeline->GetPipeline();
166 info.pipelineBindPoint = VK_PIPELINE_BIND_POINT_GRAPHICS;
167 info.indirectCommandsLayout = m_IndirectCmdsLayout->Get();
168 info.sequencesCount = m_NSequence;
169 info.streamCount = static_cast<uint32_t>(m_InputStreams.size());
170 info.pStreams = m_InputStreams.data();
171 info.preprocessBuffer = m_PreprocessBuffer->Get();
172 info.preprocessSize = m_PreprocessSize;
173
174 /**
175 * @brief Call vkCmdExecuteGeneratedCommandsNV.
176 */
177 m_VulkanState.m_VkFunc.vkCmdExecuteGeneratedCommandsNV(cmdBuffer, true, &info);
178 }
179}
#define SPICES_PROFILE_ZONE
This Class is a Wrapper of VulkanBuffer.
void PreprocessDGC(const VkCommandBuffer &cmdBuffer) const
Preprocess with Indirect Command Buffer.
void BuildCommandLayout(const std::vector< VkIndirectCommandsLayoutTokenNV > &inputInfos)
Build CommandLayout.
std::shared_ptr< VulkanBuffer > CreateInputBuffer(uint32_t size)
Create Input Buffer.
void ExecuteDGC(const VkCommandBuffer &cmdBuffer) const
Execute Commands in Indirect Command Buffer.
void CreateMeshPipeline(const std::string &pipelineName, const std::string &materialName, PipelineConfigInfo &config)
Build Raytracing Pipeline.
void AddInputStride(uint32_t stride)
Add a stride to m_InputStrides.
VulkanDeviceGeneratedCommandsNV(VulkanState &vulkanState)
Constructor Function. Create VkCommandPool.
uint32_t m_Strides
DrawCall total Input Strides.
VulkanDeviceGeneratedCommandsNV Class. This class defines the VulkanDeviceGeneratedCommandsNV behaves...
VulkanObject(VulkanState &vulkanState)
Constructor Function. Init member variables.
VulkanObject Class. This class defines the basic behaves of VulkanObject. When we create an new Vulka...
This struct included all infos usd to create a VkPipeline.
This struct contains all Vulkan object in used global.
Definition VulkanUtils.h:74