VulkanRaytracingCycles 0.0.0
Cycles Render Engine With VulkanRaytracingShaderModules. ( Experiment , in progress)
rtobjectVk.cpp
Go to the documentation of this file.
1#include "pch_mm.h"
2#include "working_mm.h"
3
4using namespace ray;
6
7
8
9 VkAccelerationStructureCreateInfoNV createinfo{ VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_CREATE_INFO_NV };
10 createinfo.info = accel.asInfo;
11 VK_CHECK_RESULT(vkCreateAccelerationStructureNV($device, &createinfo, nullptr, &accel.astruct));
12
13
14
15
16 VkMemoryRequirements2 reqMem{};
17
18 VkAccelerationStructureMemoryRequirementsInfoNV memoryRequirementsInfo{};
19 memoryRequirementsInfo.sType = VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_MEMORY_REQUIREMENTS_INFO_NV;
20 memoryRequirementsInfo.accelerationStructure = accel.astruct;
21
22 memoryRequirementsInfo.type = VK_ACCELERATION_STRUCTURE_MEMORY_REQUIREMENTS_TYPE_BUILD_SCRATCH_NV;
23 vkGetAccelerationStructureMemoryRequirementsNV($device, &memoryRequirementsInfo, &reqMem);
24 accel.mem.req = reqMem.memoryRequirements.size;
25
26 memoryRequirementsInfo.type = VK_ACCELERATION_STRUCTURE_MEMORY_REQUIREMENTS_TYPE_OBJECT_NV;
27 vkGetAccelerationStructureMemoryRequirementsNV($device, &memoryRequirementsInfo, &reqMem);
28 accel.mem.origin = reqMem.memoryRequirements.size;
29 cache.memTypeOrgin = reqMem.memoryRequirements.memoryTypeBits;
30
31
32};
33
34template<typename T >
35bool RtObjectsVk::allocateAS(VkDeviceSize cumSize, uint32_t memoryTypeBits, VkDeviceMemory& mem, std::vector<T>&& las) {
36
37
38
39 VkMemoryAllocateInfo memoryAllocateInfo = {}; memoryAllocateInfo.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
40 memoryAllocateInfo.allocationSize = cumSize;
41 memoryAllocateInfo.memoryTypeIndex = vka::shelve::getMemoryType(memoryTypeBits, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT);
42 VK_CHECK_RESULT(vkAllocateMemory($device, &memoryAllocateInfo, nullptr, &mem));
43;
44
45 VkDeviceSize ofs = 0;
46
47 for (auto& as : las) {
48 VkBindAccelerationStructureMemoryInfoNV accelerationStructureMemoryInfo{};
49 accelerationStructureMemoryInfo.sType = VK_STRUCTURE_TYPE_BIND_ACCELERATION_STRUCTURE_MEMORY_INFO_NV;
50 accelerationStructureMemoryInfo.accelerationStructure = as.accel.astruct;
51 accelerationStructureMemoryInfo.memory = mem;
52 accelerationStructureMemoryInfo.memoryOffset = ofs;
53 VK_CHECK_RESULT(vkBindAccelerationStructureMemoryNV($device, 1, &accelerationStructureMemoryInfo));
54 VK_CHECK_RESULT(vkGetAccelerationStructureHandleNV($device, as.accel.astruct, sizeof(uint64_t), &as.accel.handle));
55 ofs += as.accel.mem.origin;
56 };
57 return true;
58
59}
60template bool RtObjectsVk::allocateAS(VkDeviceSize cumSize, uint32_t memoryTypeBits, VkDeviceMemory& mem, std::vector<Blas>&& las);
61template bool RtObjectsVk::allocateAS(VkDeviceSize cumSize, uint32_t memoryTypeBits, VkDeviceMemory& mem,std::vector<Tlas>&& las);
62
63template<typename T>
64void RtObjectsVk::createShaderBindingTable(T& sbt, VkPipeline pipe, uint32_t groupN) {
65 if (vobjVk == nullptr) {
66 if (!$tank.takeout(vobjVk, 0)) {
67 log_bad(" not found VisibleObjectVk.");
68 };
69 };
70
71 sbt.size = rayTracingProperties.shaderGroupBaseAlignment * groupN;
72 sbt.buffer.id = -1;
73 vobjVk->$createBuffer$(sbt, VK_BUFFER_USAGE_RAY_TRACING_BIT_NV, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT);
74
75 auto shaderHandleStorage = new uint8_t[sbt.size];
76 VK_CHECK_RESULT(vkGetRayTracingShaderGroupHandlesNV($device, pipe, 0, groupN, sbt.size, shaderHandleStorage));
77 auto* data = static_cast<uint8_t*>(sbt.mapped);
78 for (uint32_t i = 0; i < groupN; i++) {
79 data += copyShaderIdentifier(data, shaderHandleStorage, i);
80 }
81
82 delete[] shaderHandleStorage;
83
84}
85
86template void RtObjectsVk::createShaderBindingTable(StoBache& sbt, VkPipeline pipe, uint32_t groupN);
87
88
89 bool RtObjectsVk::buildBlas(std::vector<Blas> & _blas,const std::vector<std::vector<VkGeometryNV>>& geoms,
90 VkBuildAccelerationStructureFlagsNV flags)
91{
95 _blas.resize(geoms.size());
96
97 VkDeviceSize maxScratch{ 0 };
98 VkDeviceSize cumSize{ 0 };
99 /* Is compaction requested?
100 bool doCompaction = (flags & VK_BUILD_ACCELERATION_STRUCTURE_ALLOW_COMPACTION_BIT_NV)
101 == VK_BUILD_ACCELERATION_STRUCTURE_ALLOW_COMPACTION_BIT_NV;
103 */
104 // Iterate over the groups of geometries, creating one BLAS for each group
105 for (size_t i = 0; i < geoms.size(); i++)
106 {
107 Blas& blas{ _blas[i] };
108 AccelerationStructure& accel = blas.accel;
109 // Set the geometries that will be part of the BLAS
110 accel.asInfo.geometryCount = static_cast<uint32_t>(geoms[i].size());
111 accel.asInfo.pGeometries = geoms[i].data();
112 accel.asInfo.flags = flags;
113
114 probeMemorySizeAS(accel);
115 storage.asmap["geom" + std::to_string(i)] = accel.astruct;
117 maxScratch = __max(maxScratch, accel.mem.req);
118 cumSize += accel.mem.origin;
119 }
120
121 allocateAS(cumSize, cache.memTypeOrgin, _blas[0].accel.mem.memory,std::move(_blas));
122 storage.memory = _blas[0].accel.mem.memory;
123
124
125 // Allocate the scratch buffers holding the temporary data of the acceleration structure builder
126
127 StoBache tmp;
128
129 vkmm::Allocation_T* alloc = {};
130 VkBufferCreateInfo BufferInfo = {};
131 BufferInfo.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
132 BufferInfo.size = maxScratch;
133 BufferInfo.usage = VK_BUFFER_USAGE_RAY_TRACING_BIT_NV | VK_BUFFER_USAGE_TRANSFER_DST_BIT;
134
137 ainfo.usage = vkmm::MEMORY_USAGE_GPU_ONLY; //vkmm::MEMORY_USAGE_CPU_TO_GPU;
138 ainfo.pool = VK_NULL_HANDLE;
139 ainfo.memoryTypeBits = 0;
140 ainfo.requiredFlags = 0;
141 ainfo.preferredFlags = 0;
142
143 strcpy(ainfo.name, "rtobj_temp1");
144 vkmm::CreateBuffer(*allocator, &BufferInfo, ainfo, &tmp.vkBuffer, &alloc, NULL);
145
146 /*
147 tmp.id = -1;
148 tmp.size = maxScratch;
149 objVk->$createBuffer$(tmp, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT);
150 */
151
152 /* Query size of compact BLAS
153 VkQueryPoolCreateInfo qpci{ VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO };
154 qpci.queryCount = (uint32_t)m_blas.size();
155 qpci.queryType = VK_QUERY_TYPE_ACCELERATION_STRUCTURE_COMPACTED_SIZE_NV;
156 VkQueryPool queryPool;
157 vkCreateQueryPool(m_device, &qpci, nullptr, &queryPool);
158 */
159 // Create a command buffer containing all the BLAS builds
160 /*
161 nvvk::CommandPool genCmdBuf(m_device, m_queueIndex);
162 std::vector<VkCommandBuffer> allCmdBufs;
163 allCmdBufs.reserve(m_blas.size());
164 */
167 cmds.allocCmd(_blas.size());
168 cmds.setInfo(VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT);
169 for (int i = 0; i < _blas.size(); i++) {
170
171 auto& blas = _blas[i];
172 VkCommandBuffer cmdBuf = cmds.begin(i);
173 vkCmdBuildAccelerationStructureNV(cmdBuf, &blas.accel.asInfo, nullptr, 0, VK_FALSE, blas.accel.astruct, nullptr, tmp.vkBuffer, 0);
174
175 // Since the scratch buffer is reused across builds, we need a barrier to ensure one build
176 // is finished before starting the next one
177 VkMemoryBarrier barrier{ VK_STRUCTURE_TYPE_MEMORY_BARRIER };
178 barrier.srcAccessMask = VK_ACCESS_ACCELERATION_STRUCTURE_WRITE_BIT_NV;
179 barrier.dstAccessMask = VK_ACCESS_ACCELERATION_STRUCTURE_READ_BIT_NV;
180 vkCmdPipelineBarrier(cmdBuf, VK_PIPELINE_STAGE_ACCELERATION_STRUCTURE_BUILD_BIT_NV,
181 VK_PIPELINE_STAGE_ACCELERATION_STRUCTURE_BUILD_BIT_NV, 0, 1, &barrier, 0, nullptr, 0, nullptr);
182 /*Query the compact size
183 if (doCompaction)
184 {
185 vkCmdWriteAccelerationStructuresPropertiesNV(cmdBuf, 1, &blas.as.accel,
186 VK_QUERY_TYPE_ACCELERATION_STRUCTURE_COMPACTED_SIZE_NV, queryPool, ctr++);
187 }
188 */
189 cmds.end();
190 }
191
192 cmds.submit(-1);
193 cmds.wait();
194
195
196
197 /* Compacting all BLAS
198 if (doCompaction)
199 {
200 VkCommandBuffer cmdBuf = genCmdBuf.createCommandBuffer();
201
202 // Get the size result back
203 std::vector<VkDeviceSize> compactSizes(m_blas.size());
204 vkGetQueryPoolResults(m_device, queryPool, 0, (uint32_t)compactSizes.size(), compactSizes.size() * sizeof(VkDeviceSize),
205 compactSizes.data(), sizeof(VkDeviceSize), VK_QUERY_RESULT_WAIT_BIT);
206
207
208 // Compacting
209 std::vector<nvvk::AccelNV> cleanupAS(m_blas.size());
210 uint32_t totOriginalSize{ 0 }, totCompactSize{ 0 };
211 for (int i = 0; i < m_blas.size(); i++)
212 {
213 LOGI("Reducing %i, from %d to %d \n", i, originalSizes[i], compactSizes[i]);
214 totOriginalSize += (uint32_t)originalSizes[i];
215 totCompactSize += (uint32_t)compactSizes[i];
216
217 // Creating a compact version of the AS
218 VkAccelerationStructureInfoNV asInfo{ VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_INFO_NV };
219 asInfo.type = VK_ACCELERATION_STRUCTURE_TYPE_BOTTOM_LEVEL_NV;
220 asInfo.flags = flags;
221 VkAccelerationStructureCreateInfoNV asCreateInfo{ VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_CREATE_INFO_NV };
222 asCreateInfo.compactedSize = compactSizes[i];
223 asCreateInfo.info = asInfo;
224 auto as = m_alloc->createAcceleration(asCreateInfo);
225
226 // Copy the original BLAS to a compact version
227 vkCmdCopyAccelerationStructureNV(cmdBuf, as.accel, m_blas[i].as.accel, VK_COPY_ACCELERATION_STRUCTURE_MODE_COMPACT_NV);
228
229 cleanupAS[i] = m_blas[i].as;
230 m_blas[i].as = as;
231 }
232 genCmdBuf.submitAndWait(cmdBuf);
233
234 // Destroying the previous version
235 for (auto as : cleanupAS)
236 m_alloc->destroy(as);
237
238 LOGI("------------------\n");
239 LOGI("Total: %d -> %d = %d (%2.2f%s smaller) \n", totOriginalSize, totCompactSize,
240 totOriginalSize - totCompactSize, (totOriginalSize - totCompactSize) / float(totOriginalSize) * 100.f, "%%");
241 }
242 vkDestroyQueryPool(m_device, queryPool, nullptr);
243 */
244
246 //objVk->DeleteMB(tmp.buffer);
247
248
249
250 return true;
251
252};
253
254bool RtObjectsVk::createInstances(StoBache& bach, std::vector<Instance>& instances, std::vector<Blas>& _blas)
255{
256 std::vector<VkGeometryInstanceNV> geometryInstances;
257
258 geometryInstances.reserve(instances.size());
259 Matrix4 transp;
260 for (auto& instance : instances)
261 {
262
263 Blas& blas{ _blas[instance.blasId] };
264 // For each BLAS, fetch the acceleration structure handle that will allow the builder to
265 // directly access it from the device
266 VkGeometryInstanceNV gInst{};
267 // The matrices for the instance transforms are row-major, instead of column-major in the
268 // rest of the application
269 transp.copy(&(instance.transform))->transpose()->toFloat();
270
271
272 // The gInst.transform value only contains 12 values, corresponding to a 4x3 matrix, hence
273 // saving the last row that is anyway always (0,0,0,1). Since the matrix is row-major,
274 // we simply copy the first 12 values of the original 4x4 matrix
275 memcpy(gInst.transform, &transp.f[0], sizeof(gInst.transform));
276 gInst.instanceId = instance.instanceId;
277 gInst.mask = instance.mask;
278 gInst.hitGroupId = instance.hitGroupId;
279 gInst.flags = static_cast<uint32_t>(instance.flags);
280 gInst.accelerationStructureHandle = blas.accel.handle;
281
282 geometryInstances.push_back(gInst);
283
284 }
285
287
288 bach.id = -1;
289 objVk->$createBuffer$(cmd, bach, geometryInstances, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, VK_BUFFER_USAGE_RAY_TRACING_BIT_NV);
290 //m_debug.setObjectName(m_instBuffer.buffer, "TLASInstances");
291 return true;
292}
293
294
295Tlas RtObjectsVk::buildTlas(const std::vector<Instance>& instances, VkBuffer insta,
296 VkBuildAccelerationStructureFlagsNV flags)
297{
298
299 Tlas tlas;
300 tlas.accel.asInfo.type = VK_ACCELERATION_STRUCTURE_TYPE_TOP_LEVEL_NV;
301
302 tlas.accel.asInfo.instanceCount = static_cast<uint32_t>(instances.size());
303 tlas.accel.asInfo.flags = flags;
304
306
307 allocateAS(tlas.accel.mem.origin, cache.memTypeOrgin, tlas.accel.mem.memory,std::vector<Tlas>{ tlas });
308 storageT.asmap["tlas1"] = tlas.accel.astruct;
310
311
312
314 // Allocate the scratch memory
315 StoBache tmp;
316 tmp.id = -1;
317 tmp.size = tlas.accel.mem.req;
318 //objVk->$createBuffer$(tmp, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT);
319 objVk->$createBuffer$(tmp, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
320
321 // Building the TLAS
322
323
325 cmds.begin();
326 // Make sure the copy of the instance buffer are copied before triggering the
327 // acceleration structure build
328 VkMemoryBarrier barrier{ VK_STRUCTURE_TYPE_MEMORY_BARRIER };
329 barrier.srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
330 barrier.dstAccessMask = VK_ACCESS_ACCELERATION_STRUCTURE_WRITE_BIT_KHR;
331 vkCmdPipelineBarrier(cmds.cmd, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_ACCELERATION_STRUCTURE_BUILD_BIT_NV,
332 0, 1, &barrier, 0, nullptr, 0, nullptr);
333
334
335 // Build the TLAS
336 vkCmdBuildAccelerationStructureNV(cmds.cmd, &tlas.accel.asInfo, insta, 0, VK_FALSE, tlas.accel.astruct, nullptr, tmp.vkBuffer, 0);
337
338 cmds.end();
339 cmds.submit();
340 cmds.wait();
341
342
343 objVk->DeleteMB(tmp.buffer);
344
345
346 return tlas;
347
348}
349
350
351VkAccelerationStructureNV RtObjectsVk::createBTlas(std::vector<Object3D*>&& objs) {
352
353 if (objVk == nullptr) {
354 if (!$tank.takeout(objVk, 0)) {
355 log_bad(" not found ObjectVk.");
356 };
357 };
358
359
360 std::vector<std::vector<VkGeometryNV>> geoms;
361 std::vector<int> geomID;
362
363 std::map< uint64_t, int> cacheGeom;
364 int geomNum = 0;
365 for (auto& obj : objs) {
366
367 std::vector<VkGeometryNV> geom;
368
369 if (cacheGeom.count(uint64_t(obj->geometry->attributes)) > 0) {
370 cacheGeom[uint64_t(obj->geometry->attributes)]++;
371 obj->Type.ID = cacheGeom[uint64_t(obj->geometry->attributes)];
372 continue;
373 }
374
375 obj->geometry->nums = geomNum++;
376 cacheGeom[uint64_t(obj->geometry->attributes)] = 1;
377
378
379 auto vary = obj->geometry->attributes->buffer->array;
380
381 VkGeometryNV geometry{};
382 geometry.sType = VK_STRUCTURE_TYPE_GEOMETRY_NV;
383 geometry.geometryType = VK_GEOMETRY_TYPE_TRIANGLES_NV;
384 geometry.geometry.triangles.sType = VK_STRUCTURE_TYPE_GEOMETRY_TRIANGLES_NV;
385
386 geometry.geometry.triangles.vertexCount = vary.arraySize;
387 geometry.geometry.triangles.vertexStride = vary.structSize;
388 geometry.geometry.triangles.vertexFormat = VK_FORMAT_R32G32B32_SFLOAT;
389
390 geometry.geometry.triangles.indexCount = obj->geometry->attributes->buffer->updateRange.count;
391 geometry.geometry.triangles.indexType = VK_INDEX_TYPE_UINT32;
392 geometry.geometry.triangles.transformData = VK_NULL_HANDLE;
393 geometry.geometry.triangles.transformOffset = 0;
394 geometry.geometry.aabbs = {};
395 geometry.geometry.aabbs.sType = { VK_STRUCTURE_TYPE_GEOMETRY_AABB_NV };
396 geometry.flags = VK_GEOMETRY_NO_DUPLICATE_ANY_HIT_INVOCATION_BIT_KHR;// VK_GEOMETRY_OPAQUE_BIT_NV;
397
398 obj->Type.ID = 1;
399#ifndef VKMM_ALLOC
400 auto vinfo = obj->geometry->attributes->buffer->info.vert;
401 auto iinfo = obj->geometry->attributes->buffer->info.index;
402 geometry.geometry.triangles.vertexData = vinfo.buffer;
403 geometry.geometry.triangles.vertexOffset = vinfo.offset;
404 geometry.geometry.triangles.indexData = iinfo.buffer;
405 geometry.geometry.triangles.indexOffset = iinfo.offset;
406 /*
407 MBvk vert;
408 MBvk index;
409 obj->Type.ID = 1;
410 if (!objVk->getBuffer(vert, obj->geometry->attributes->buffer))log_bad("Mutable Group can't get Buffer Information.\n");
411 if (!objVk->getIndex(index, obj->geometry->attributes->buffer))log_bad("Mutable Group can't get Index Buffer Information.\n");
412 geometry.geometry.triangles.vertexData = vert.buffer;
413 geometry.geometry.triangles.vertexOffset = 0;
414 geometry.geometry.triangles.indexData = index.buffer;
415 geometry.geometry.triangles.indexOffset = 0;
416 */
417#else
418
419
420 auto vinfo = obj->geometry->attributes->buffer->info.vert;
421 auto iinfo = obj->geometry->attributes->buffer->info.index;
422 geometry.geometry.triangles.vertexData = vinfo.buffer;
423 geometry.geometry.triangles.vertexOffset = vinfo.offset;
424 geometry.geometry.triangles.indexData = iinfo.buffer;
425 geometry.geometry.triangles.indexOffset = iinfo.offset;
426
427#endif
428
429 geom.push_back(geometry);
430 geoms.push_back(geom);
431 geomID.push_back(obj->draw.gid);
432
433 }
434
435 std::vector<std::vector<VkGeometryNV>> _geoms(geomID.size());
436 int i = 0;
437 for (auto& id : geomID) _geoms[id] = geoms[i++];
438
439 std::vector<Blas> blas;
440
441 buildBlas(blas,_geoms);
442
443 StoBache insta; insta.id = -1;
444 std::vector<Instance> instances;
445
446 instances.resize(objs.size());
447 i = 0;
448 std::vector<int> IID(geomID.size(),0);
449
450 for (auto& obj : objs) {
451 auto& inst = instances[i];
452
453 inst.mask = 0xFF;
454 inst.transform.copy(obj->matrix);
455 inst.instanceId = obj->draw.gid;// obj->draw.gid * 100 + IID[obj->draw.gid]++;//0x800000 | (50 - uint32_t(i++));// uint32_t(i++);
456 inst.blasId = obj->draw.gid;
457 inst.hitGroupId = obj->draw.pid;
458 i++;
459 }
460 createInstances(insta, instances, blas);
461
462 auto tlas = buildTlas(instances, insta.vkBuffer);
463
464 return tlas.accel.astruct;
465};
466
467VkDeviceSize RtObjectsVk::copyShaderIdentifier(uint8_t* data, const uint8_t* shaderHandleStorage, uint32_t groupIndex) {
468 const uint32_t shaderGroupHandleSize = rayTracingProperties.shaderGroupBaseAlignment;// ;
469 memcpy(data, shaderHandleStorage + groupIndex * rayTracingProperties.shaderGroupHandleSize, rayTracingProperties.shaderGroupHandleSize);// , rayTracingProperties.shaderGroupHandleSize);
470 return shaderGroupHandleSize;
471}
472
473
474
475
#define log_bad(...)
Definition: log.hpp:37
Definition: ObjectVk.h:1421
@ ALLOCATION_CREATE_DEDICATED_MEMORY_BIT
Definition: AllocatorVk.h:609
@ MEMORY_USAGE_GPU_ONLY
Definition: AllocatorVk.h:601
void DestroyBuffer(Allocator allocator, VkBuffer buffer, Allocation allocation)
VkResult CreateBuffer(Allocator allocator, const VkBufferCreateInfo *pBufferCreateInfo, AllocationCreateInfo &pAllocationCreateInfo, VkBuffer *pBuffer, Allocation *pAllocation, AllocationInfo *pAllocationInfo)
bool $createBuffer$(T &bach, VkMemoryPropertyFlags memTy)
Definition: ObjectVk.h:441
bool DeleteMB(Geom &hach)
Definition: ObjectVk.h:1017
std::unordered_map< std::string, VkAccelerationStructureNV > asmap
Definition: ObjectVk.h:1499
VkDeviceMemory memory
Definition: ObjectVk.h:1494
ObjectsVk * objVk
Definition: ObjectVk.h:1487
VkDeviceSize copyShaderIdentifier(uint8_t *data, const uint8_t *shaderHandleStorage, uint32_t groupIndex)
Definition: rtobjectVk.cpp:467
VkPhysicalDeviceRayTracingPropertiesNV rayTracingProperties
Definition: ObjectVk.h:1490
bool buildBlas(std::vector< ray::Blas > &blas, const std::vector< std::vector< VkGeometryNV > > &geoms, VkBuildAccelerationStructureFlagsNV flags=VK_BUILD_ACCELERATION_STRUCTURE_PREFER_FAST_TRACE_BIT_NV)
Definition: rtobjectVk.cpp:89
struct RtObjectsVk::@13 cache
vkmm::Allocator * allocator
Definition: ObjectVk.h:1489
VisibleObjectsVk * vobjVk
Definition: ObjectVk.h:1488
VkAccelerationStructureNV createBTlas(std::vector< Object3D * > &&objs)
Definition: rtobjectVk.cpp:351
void probeMemorySizeAS(ray::AccelerationStructure &accel)
Definition: rtobjectVk.cpp:5
void createShaderBindingTable(T &sbt, VkPipeline pipe, uint32_t groupN)
Definition: rtobjectVk.cpp:64
AsCache storage
Definition: ObjectVk.h:1504
ray::Tlas buildTlas(const std::vector< ray::Instance > &instances, VkBuffer insta, VkBuildAccelerationStructureFlagsNV flags=VK_BUILD_ACCELERATION_STRUCTURE_PREFER_FAST_TRACE_BIT_NV)
Definition: rtobjectVk.cpp:295
bool allocateAS(VkDeviceSize cumSize, uint32_t memoryTypeBits, VkDeviceMemory &mem, std::vector< T > &&las)
Definition: rtobjectVk.cpp:35
AsCache storageT
Definition: ObjectVk.h:1505
bool createInstances(StoBache &bach, std::vector< ray::Instance > &instances, std::vector< ray::Blas > &_blas)
Definition: rtobjectVk.cpp:254
VkBuffer vkBuffer
Definition: incomplete.h:217
VkDeviceSize size
Definition: incomplete.h:213
Hache buffer
Definition: incomplete.h:209
long id
Definition: incomplete.h:208
void $createBuffer$(O &obj, VkBufferUsageFlags usage=VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, VkMemoryPropertyFlags memTy=VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT|VK_MEMORY_PROPERTY_HOST_COHERENT_BIT)
Definition: ObjectVk.h:1182
VkDeviceSize req
Definition: ObjectVk.h:1441
VkDeviceMemory memory
Definition: ObjectVk.h:1444
VkDeviceSize origin
Definition: ObjectVk.h:1442
VkAccelerationStructureNV astruct
Definition: ObjectVk.h:1454
VkAccelerationStructureInfoNV asInfo
Definition: ObjectVk.h:1450
AccelerationStructure accel
Definition: ObjectVk.h:1476
VkMemoryPropertyFlags requiredFlags
Definition: AllocatorVk.h:633
VkMemoryPropertyFlags preferredFlags
Definition: AllocatorVk.h:635
AllocationCreateFlags flags
Use #VmaAllocationCreateFlagBits enum.
Definition: AllocatorVk.h:629
#define instance