SpiecsEngine
 
Loading...
Searching...
No Matches

◆ FillIndirectRenderData()

template<typename T >
std::shared_ptr< VulkanDeviceGeneratedCommandsNV > Spices::Renderer::FillIndirectRenderData ( const std::string & subPassName,
std::shared_ptr< std::vector< uint32_t > > view )
inlineinherited

Fill in World RenderAble data to IndirectBuffer.

Template Parameters
TSpecific Component.
Parameters
[in]subPassName.
[in]viewComponent View.
Returns
Returns new VulkanDeviceGeneratedCommandsNV.

Cache original data.

Move original to caches.

Prepare ShaderGroup

Fill in Input Buffer

Fill in Streams

Regenerate dgc pipeline

Create ProcessBuffer.

Definition at line 2058 of file Renderer.h.

2059 {
2061
2062 auto indirectPtr = std::make_shared<VulkanDeviceGeneratedCommandsNV>(m_VulkanState);
2063 auto srcPtr = m_DGCData[subPassName];
2064
2068 indirectPtr->SetInputStride(srcPtr->GetInputStrides());
2069 indirectPtr->SetStrides(srcPtr->GetStrides());
2070 indirectPtr->SetCommandLayout(srcPtr->GetCommandLayout());
2071 indirectPtr->SetLayoutTokens(srcPtr->GetLayoutTokens());
2072
2076 m_RenderCache->PushToCaches(srcPtr);
2077
2081 uint32_t nSequences = 0;
2082 {
2083 SPICES_PROFILE_ZONEN("FillIndirectRenderData::Prepare ShaderGroup");
2084
2085 std::unordered_map<std::string, uint32_t> pipelineMap;
2086
2087 FrameInfo::Get().m_World->ViewComponent<T>(*view, [&](const auto& e, auto& meshComp){
2088
2089 meshComp.GetMesh()->GetPacks().for_each([&](const auto& k, const std::shared_ptr<MeshPack>& v) {
2090
2091 if (pipelineMap.find(v->GetMaterial()->GetName()) == pipelineMap.end())
2092 {
2093 pipelineMap[v->GetMaterial()->GetName()] = pipelineMap.size();
2094 }
2095
2096 v->SetShaderGroupHandle(pipelineMap[v->GetMaterial()->GetName()]);
2097 nSequences++;
2098
2099 return false;
2100 });
2101 });
2102 indirectPtr->SetSequenceCount(nSequences);
2103
2104 indirectPtr->GetPipelineRef().resize(pipelineMap.size(), nullptr);
2105
2106 for (auto& pair : pipelineMap)
2107 {
2108 indirectPtr->GetPipelineRef()[pair.second] = m_Pipelines.Find(pair.first)->GetPipeline();
2109 }
2110 }
2111
2115 std::vector<size_t> offset;
2116 std::shared_ptr<VulkanBuffer> inputBuffer = nullptr;
2117 {
2118 SPICES_PROFILE_ZONEN("FillIndirectRenderData::Fill in Input Buffer");
2119
2120 size_t totalSize = 0;
2121 size_t alignSeqIndexMask = m_Device->GetDGCProperties().minSequencesIndexBufferOffsetAlignment - 1;
2122 size_t alignMask = m_Device->GetDGCProperties().minIndirectCommandsBufferOffsetAlignment - 1;
2123
2124 auto& inputStrides = indirectPtr->GetInputStrides();
2125
2126 for (int i = 0; i < inputStrides.size(); i++)
2127 {
2128 offset.push_back(totalSize);
2129 totalSize += ((inputStrides[i] * nSequences + alignMask) & (~alignMask));
2130 }
2131
2132 VulkanBuffer stagingBuffer(
2134 "StagingBuffer",
2135 totalSize,
2136 VK_BUFFER_USAGE_TRANSFER_SRC_BIT,
2137 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT |
2138 VK_MEMORY_PROPERTY_HOST_COHERENT_BIT
2139 );
2140
2141 auto& layoutTokens = indirectPtr->GetLayoutTokens();
2142
2143 int index = 0;
2144 FrameInfo::Get().m_World->ViewComponent<T>(*view, [&](const auto& e, auto& meshComp){
2145
2146 meshComp.GetMesh()->GetPacks().for_each([&](const auto& k, const std::shared_ptr<MeshPack>& v) {
2147
2148 for (int i = 0; i < layoutTokens.size(); i++)
2149 {
2150 switch (layoutTokens[i].tokenType)
2151 {
2152 case VK_INDIRECT_COMMANDS_TOKEN_TYPE_SHADER_GROUP_NV:
2153 {
2154 VkBindShaderGroupIndirectCommandNV shader;
2155 shader.groupIndex = v->GetShaderGroupHandle() + 1;
2156 stagingBuffer.WriteToBuffer(&shader, inputStrides[i], index * inputStrides[i] + offset[i]);
2157 break;
2158 }
2159 case VK_INDIRECT_COMMANDS_TOKEN_TYPE_VERTEX_BUFFER_NV:
2160 {
2161 VkBindVertexBufferIndirectCommandNV vbo;
2162 vbo.bufferAddress = v->GetResource().positions.buffer->GetAddress();
2163 vbo.size = sizeof(v->GetResource().positions.attributes);
2164 vbo.stride = sizeof(glm::vec3);
2165 stagingBuffer.WriteToBuffer(&vbo, inputStrides[i], index * inputStrides[i] + offset[i]);
2166 break;
2167 }
2168 case VK_INDIRECT_COMMANDS_TOKEN_TYPE_INDEX_BUFFER_NV:
2169 {
2170 VkBindIndexBufferIndirectCommandNV ibo;
2171 ibo.bufferAddress = v->GetResource().primitivePoints.buffer->GetAddress();
2172 ibo.size = sizeof(v->GetResource().primitivePoints.attributes);
2173 ibo.indexType = VK_INDEX_TYPE_UINT32;
2174 stagingBuffer.WriteToBuffer(&ibo, inputStrides[i], index * inputStrides[i] + offset[i]);
2175 break;
2176 }
2177 case VK_INDIRECT_COMMANDS_TOKEN_TYPE_PUSH_CONSTANT_NV:
2178 {
2179 VkDeviceAddress push;
2180 push = v->GetMeshDesc().GetBufferAddress();
2181 stagingBuffer.WriteToBuffer(&push, inputStrides[i], index * inputStrides[i] + offset[i]);
2182 break;
2183 }
2184 case VK_INDIRECT_COMMANDS_TOKEN_TYPE_DRAW_INDEXED_NV:
2185 {
2186 VkDrawIndexedIndirectCommand drawIndexed;
2187 drawIndexed.firstIndex = 0;
2188 drawIndexed.firstInstance = 0;
2189 drawIndexed.indexCount = v->GetResource().primitivePoints.attributes->size();
2190 drawIndexed.instanceCount = 1;
2191 drawIndexed.vertexOffset = 0;
2192 stagingBuffer.WriteToBuffer(&drawIndexed, inputStrides[i], index* inputStrides[i] + offset[i]);
2193 break;
2194 }
2195 case VK_INDIRECT_COMMANDS_TOKEN_TYPE_DRAW_TASKS_NV:
2196 {
2197 VkDrawMeshTasksIndirectCommandNV drawMesh;
2198 drawMesh = v->GetDrawCommand();
2199 stagingBuffer.WriteToBuffer(&drawMesh, inputStrides[i], index * inputStrides[i] + offset[i]);
2200 break;
2201 }
2202 default:
2203 SPICES_CORE_ERROR("Not Supported Token Type.");
2204 break;
2205 }
2206 }
2207
2208 index++;
2209 return false;
2210 });
2211 });
2212 stagingBuffer.Flush();
2213
2214 inputBuffer = indirectPtr->CreateInputBuffer(totalSize);
2215 inputBuffer->CopyBuffer(stagingBuffer.Get(), inputBuffer->Get(), totalSize);
2216 }
2217
2221 {
2222 SPICES_PROFILE_ZONEN("FillIndirectRenderData::Fill in Streams");
2223
2224 std::vector<VkIndirectCommandsStreamNV> inputs;
2225 inputs.resize(offset.size());
2226 for (int i = 0; i < offset.size(); i++)
2227 {
2228 inputs[i].buffer = inputBuffer->Get();
2229 inputs[i].offset = offset[i];
2230 }
2231 indirectPtr->SetInputStreams(inputs);
2232 }
2233
2237 {
2238 SPICES_PROFILE_ZONEN("FillIndirectRenderData::Regenerate dgc pipeline");
2239
2240 CreateDGCMaterial(subPassName, indirectPtr.get());
2241 }
2242
2246 {
2247 SPICES_PROFILE_ZONEN("FillIndirectRenderData:: Create ProcessBuffer");
2248
2249 indirectPtr->CreatePreprocessBuffer();
2250 }
2251
2252 return indirectPtr;
2253 }
#define SPICES_PROFILE_ZONEN(...)
#define SPICES_PROFILE_ZONE
static FrameInfo & Get()
Get FrameInfo.
Definition FrameInfo.cpp:14
std::shared_ptr< World > m_World
The shared pointer of specific world.
Definition FrameInfo.h:94
scl::thread_unordered_map< std::string, std::shared_ptr< VulkanPipeline > > m_Pipelines
Renderer stored material pipelines.
Definition Renderer.h:2022
std::shared_ptr< RendererCache > m_RenderCache
RendererCache.
Definition Renderer.h:2047
std::shared_ptr< VulkanDevice > m_Device
VulkanDevice , Passed by instanced.
Definition Renderer.h:2002
VulkanState & m_VulkanState
This variable is passed while renderer instanced.
Definition Renderer.h:1992
std::unordered_map< std::string, std::shared_ptr< VulkanDeviceGeneratedCommandsNV > > m_DGCData
Data of dgc DGC Draw.
Definition Renderer.h:2042
void CreateDGCMaterial(const std::string &subPass, VulkanDeviceGeneratedCommandsNV *indirectPtr)
Create Specific Renderer DGC Material.
Definition Renderer.cpp:258

References Spices::Renderer::m_VulkanState.