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));
16 VkMemoryRequirements2 reqMem{};
18 VkAccelerationStructureMemoryRequirementsInfoNV memoryRequirementsInfo{};
19 memoryRequirementsInfo.sType = VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_MEMORY_REQUIREMENTS_INFO_NV;
20 memoryRequirementsInfo.accelerationStructure = accel.
astruct;
22 memoryRequirementsInfo.type = VK_ACCELERATION_STRUCTURE_MEMORY_REQUIREMENTS_TYPE_BUILD_SCRATCH_NV;
23 vkGetAccelerationStructureMemoryRequirementsNV($device, &memoryRequirementsInfo, &reqMem);
24 accel.
mem.
req = reqMem.memoryRequirements.size;
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;
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));
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;
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);
66 if (!$tank.takeout(
vobjVk, 0)) {
67 log_bad(
" not found VisibleObjectVk.");
73 vobjVk->
$createBuffer$(sbt, VK_BUFFER_USAGE_RAY_TRACING_BIT_NV, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT);
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++) {
82 delete[] shaderHandleStorage;
90 VkBuildAccelerationStructureFlagsNV flags)
95 _blas.resize(geoms.size());
97 VkDeviceSize maxScratch{ 0 };
98 VkDeviceSize cumSize{ 0 };
105 for (
size_t i = 0; i < geoms.size(); i++)
107 Blas& blas{ _blas[i] };
110 accel.
asInfo.geometryCount =
static_cast<uint32_t
>(geoms[i].size());
111 accel.
asInfo.pGeometries = geoms[i].data();
112 accel.
asInfo.flags = flags;
117 maxScratch = __max(maxScratch, accel.
mem.
req);
121 allocateAS(cumSize,
cache.memTypeOrgin, _blas[0].accel.mem.memory,std::move(_blas));
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;
138 ainfo.
pool = VK_NULL_HANDLE;
143 strcpy(ainfo.
name,
"rtobj_temp1");
167 cmds.allocCmd(_blas.size());
168 cmds.setInfo(VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT);
169 for (
int i = 0; i < _blas.size(); i++) {
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);
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);
256 std::vector<VkGeometryInstanceNV> geometryInstances;
258 geometryInstances.reserve(instances.size());
269 transp.copy(&(
instance.transform))->transpose()->toFloat();
275 memcpy(gInst.transform, &transp.f[0],
sizeof(gInst.transform));
276 gInst.instanceId =
instance.instanceId;
278 gInst.hitGroupId =
instance.hitGroupId;
279 gInst.flags =
static_cast<uint32_t
>(
instance.flags);
280 gInst.accelerationStructureHandle = blas.accel.handle;
282 geometryInstances.push_back(gInst);
289 objVk->
$createBuffer$(cmd, bach, geometryInstances, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, VK_BUFFER_USAGE_RAY_TRACING_BIT_NV);
296 VkBuildAccelerationStructureFlagsNV flags)
300 tlas.
accel.
asInfo.type = VK_ACCELERATION_STRUCTURE_TYPE_TOP_LEVEL_NV;
302 tlas.
accel.
asInfo.instanceCount =
static_cast<uint32_t
>(instances.size());
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);
353 if (
objVk ==
nullptr) {
354 if (!$tank.takeout(
objVk, 0)) {
355 log_bad(
" not found ObjectVk.");
360 std::vector<std::vector<VkGeometryNV>> geoms;
361 std::vector<int> geomID;
363 std::map< uint64_t, int> cacheGeom;
365 for (
auto& obj : objs) {
367 std::vector<VkGeometryNV> geom;
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)];
375 obj->geometry->nums = geomNum++;
376 cacheGeom[uint64_t(obj->geometry->attributes)] = 1;
379 auto vary = obj->geometry->attributes->buffer->array;
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;
386 geometry.geometry.triangles.vertexCount = vary.arraySize;
387 geometry.geometry.triangles.vertexStride = vary.structSize;
388 geometry.geometry.triangles.vertexFormat = VK_FORMAT_R32G32B32_SFLOAT;
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;
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;
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;
429 geom.push_back(geometry);
430 geoms.push_back(geom);
431 geomID.push_back(obj->draw.gid);
435 std::vector<std::vector<VkGeometryNV>> _geoms(geomID.size());
437 for (
auto&
id : geomID) _geoms[id] = geoms[i++];
439 std::vector<Blas> blas;
444 std::vector<Instance> instances;
446 instances.resize(objs.size());
448 std::vector<int> IID(geomID.size(),0);
450 for (
auto& obj : objs) {
451 auto& inst = instances[i];
454 inst.transform.copy(obj->matrix);
455 inst.instanceId = obj->draw.gid;
456 inst.blasId = obj->draw.gid;
457 inst.hitGroupId = obj->draw.pid;
464 return tlas.accel.astruct;
470 return shaderGroupHandleSize;
@ ALLOCATION_CREATE_DEDICATED_MEMORY_BIT
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)
bool DeleteMB(Geom &hach)
std::unordered_map< std::string, VkAccelerationStructureNV > asmap
VkDeviceSize copyShaderIdentifier(uint8_t *data, const uint8_t *shaderHandleStorage, uint32_t groupIndex)
VkPhysicalDeviceRayTracingPropertiesNV rayTracingProperties
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)
struct RtObjectsVk::@13 cache
vkmm::Allocator * allocator
VisibleObjectsVk * vobjVk
VkAccelerationStructureNV createBTlas(std::vector< Object3D * > &&objs)
void probeMemorySizeAS(ray::AccelerationStructure &accel)
void createShaderBindingTable(T &sbt, VkPipeline pipe, uint32_t groupN)
ray::Tlas buildTlas(const std::vector< ray::Instance > &instances, VkBuffer insta, VkBuildAccelerationStructureFlagsNV flags=VK_BUILD_ACCELERATION_STRUCTURE_PREFER_FAST_TRACE_BIT_NV)
bool allocateAS(VkDeviceSize cumSize, uint32_t memoryTypeBits, VkDeviceMemory &mem, std::vector< T > &&las)
bool createInstances(StoBache &bach, std::vector< ray::Instance > &instances, std::vector< ray::Blas > &_blas)
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)
VkAccelerationStructureNV astruct
VkAccelerationStructureInfoNV asInfo
AccelerationStructure accel
VkMemoryPropertyFlags requiredFlags
VkMemoryPropertyFlags preferredFlags
AllocationCreateFlags flags
Use #VmaAllocationCreateFlagBits enum.