Cache original data.
Move original to caches.
Create ProcessBuffer.
2059 {
2061
2062 auto indirectPtr = std::make_shared<VulkanDeviceGeneratedCommandsNV>(
m_VulkanState);
2064
2068 indirectPtr->SetInputStride(srcPtr->GetInputStrides());
2069 indirectPtr->SetStrides(srcPtr->GetStrides());
2070 indirectPtr->SetCommandLayout(srcPtr->GetCommandLayout());
2071 indirectPtr->SetLayoutTokens(srcPtr->GetLayoutTokens());
2072
2077
2081 uint32_t nSequences = 0;
2082 {
2084
2085 std::unordered_map<std::string, uint32_t> pipelineMap;
2086
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 {
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;
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 {
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 {
2239
2241 }
2242
2246 {
2248
2249 indirectPtr->CreatePreprocessBuffer();
2250 }
2251
2252 return indirectPtr;
2253 }
#define SPICES_PROFILE_ZONEN(...)
#define SPICES_PROFILE_ZONE
static FrameInfo & Get()
Get FrameInfo.
std::shared_ptr< World > m_World
The shared pointer of specific world.
scl::thread_unordered_map< std::string, std::shared_ptr< VulkanPipeline > > m_Pipelines
Renderer stored material pipelines.
std::shared_ptr< RendererCache > m_RenderCache
RendererCache.
std::shared_ptr< VulkanDevice > m_Device
VulkanDevice , Passed by instanced.
VulkanState & m_VulkanState
This variable is passed while renderer instanced.
std::unordered_map< std::string, std::shared_ptr< VulkanDeviceGeneratedCommandsNV > > m_DGCData
Data of dgc DGC Draw.
void CreateDGCMaterial(const std::string &subPass, VulkanDeviceGeneratedCommandsNV *indirectPtr)
Create Specific Renderer DGC Material.