Remove old NV ray tracing builders

This commit is contained in:
Magnus Norddahl 2021-11-01 02:20:41 +01:00
parent fb86b2054c
commit df1172346d
2 changed files with 42 additions and 323 deletions

View file

@ -129,53 +129,13 @@ private:
int stage = 0; int stage = 0;
}; };
class AccelerationStructureBuilderNV
{
public:
AccelerationStructureBuilderNV();
void setUsage(VmaMemoryUsage memoryUsage, VmaAllocationCreateFlags allocFlags = 0);
void setType(VkAccelerationStructureTypeNV type, VkBuildAccelerationStructureFlagsNV flags = 0);
void setInstanceCount(int instanceCount);
void addTriangles(VkGeometryFlagsNV flags = 0);
void setVertices(VulkanBuffer *vertexData, size_t vertexOffset, size_t vertexCount, size_t vertexStride, VkFormat vertexFormat);
void setIndices(VulkanBuffer *indexData, size_t indexOffset, size_t indexCount, VkIndexType indexType);
void setTransforms(VulkanBuffer *transformData, size_t transformOffset);
void addAABBs(VulkanBuffer *aabbData, size_t numAABBs, size_t stride, size_t offset, VkBuildAccelerationStructureFlagsNV flags = 0);
std::unique_ptr<VulkanAccelerationStructureNV> create(VulkanDevice *device);
private:
VkAccelerationStructureCreateInfoNV createInfo = {};
VmaAllocationCreateInfo allocInfo = {};
std::vector<VkGeometryNV> geometries;
};
class ScratchBufferBuilderNV
{
public:
ScratchBufferBuilderNV();
void setAccelerationStruct(VulkanAccelerationStructureNV *accelstruct);
void setUpdateType();
std::unique_ptr<VulkanBuffer> create(VulkanDevice *device);
private:
VkAccelerationStructureMemoryRequirementsInfoNV reqInfo;
VmaAllocationCreateInfo allocInfo = {};
};
class RayTracingPipelineBuilder class RayTracingPipelineBuilder
{ {
public: public:
RayTracingPipelineBuilder(); RayTracingPipelineBuilder();
void setLayout(VulkanPipelineLayout *layout); void setLayout(VulkanPipelineLayout *layout);
void setMaxRecursionDepth(int depth); void setMaxPipelineRayRecursionDepth(int depth);
void addShader(VkShaderStageFlagBits stage, VulkanShader *shader); void addShader(VkShaderStageFlagBits stage, VulkanShader *shader);
void addRayGenGroup(int rayGenShader); void addRayGenGroup(int rayGenShader);
void addMissGroup(int missShader); void addMissGroup(int missShader);
@ -185,9 +145,9 @@ public:
std::unique_ptr<VulkanPipeline> create(VulkanDevice *device); std::unique_ptr<VulkanPipeline> create(VulkanDevice *device);
private: private:
VkRayTracingPipelineCreateInfoNV pipelineInfo = {}; VkRayTracingPipelineCreateInfoKHR pipelineInfo = {};
std::vector<VkPipelineShaderStageCreateInfo> stages; std::vector<VkPipelineShaderStageCreateInfo> stages;
std::vector<VkRayTracingShaderGroupCreateInfoNV> groups; std::vector<VkRayTracingShaderGroupCreateInfoKHR> groups;
}; };
class ComputePipelineBuilder class ComputePipelineBuilder
@ -415,7 +375,7 @@ public:
void addBuffer(VulkanDescriptorSet *descriptorSet, int binding, VkDescriptorType type, VulkanBuffer *buffer, size_t offset, size_t range); void addBuffer(VulkanDescriptorSet *descriptorSet, int binding, VkDescriptorType type, VulkanBuffer *buffer, size_t offset, size_t range);
void addStorageImage(VulkanDescriptorSet *descriptorSet, int binding, VulkanImageView *view, VkImageLayout imageLayout); void addStorageImage(VulkanDescriptorSet *descriptorSet, int binding, VulkanImageView *view, VkImageLayout imageLayout);
void addCombinedImageSampler(VulkanDescriptorSet *descriptorSet, int binding, VulkanImageView *view, VulkanSampler *sampler, VkImageLayout imageLayout); void addCombinedImageSampler(VulkanDescriptorSet *descriptorSet, int binding, VulkanImageView *view, VulkanSampler *sampler, VkImageLayout imageLayout);
void addAccelerationStructure(VulkanDescriptorSet *descriptorSet, int binding, VulkanAccelerationStructureNV *accelStruct); void addAccelerationStructure(VulkanDescriptorSet *descriptorSet, int binding, VulkanAccelerationStructure *accelStruct);
void updateSets(VulkanDevice *device); void updateSets(VulkanDevice *device);
@ -425,7 +385,7 @@ private:
VkDescriptorImageInfo imageInfo; VkDescriptorImageInfo imageInfo;
VkDescriptorBufferInfo bufferInfo; VkDescriptorBufferInfo bufferInfo;
VkBufferView bufferView; VkBufferView bufferView;
VkWriteDescriptorSetAccelerationStructureNV accelStruct; VkWriteDescriptorSetAccelerationStructureKHR accelStruct;
}; };
std::vector<VkWriteDescriptorSet> writes; std::vector<VkWriteDescriptorSet> writes;
@ -651,182 +611,9 @@ inline std::unique_ptr<VulkanBuffer> BufferBuilder::create(VulkanDevice *device)
///////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////
inline AccelerationStructureBuilderNV::AccelerationStructureBuilderNV()
{
createInfo.sType = VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_CREATE_INFO_NV;
createInfo.info.sType = VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_INFO_NV;
}
inline void AccelerationStructureBuilderNV::setUsage(VmaMemoryUsage memoryUsage, VmaAllocationCreateFlags allocFlags)
{
allocInfo.usage = memoryUsage;
allocInfo.flags = allocFlags;
}
inline void AccelerationStructureBuilderNV::setType(VkAccelerationStructureTypeNV type, VkBuildAccelerationStructureFlagsNV flags)
{
createInfo.info.type = type;
createInfo.info.flags = flags;
}
inline void AccelerationStructureBuilderNV::setInstanceCount(int instanceCount)
{
createInfo.info.instanceCount = instanceCount;
}
inline void AccelerationStructureBuilderNV::addTriangles(VkGeometryFlagsNV flags)
{
VkGeometryNV g = {};
g.sType = VK_STRUCTURE_TYPE_GEOMETRY_NV;
g.flags = flags;
g.geometryType = VK_GEOMETRY_TYPE_TRIANGLES_NV;
g.geometry.triangles.indexType = VK_INDEX_TYPE_NONE_NV;
geometries.push_back(g);
createInfo.info.pGeometries = geometries.data();
createInfo.info.geometryCount = (uint32_t)geometries.size();
}
inline void AccelerationStructureBuilderNV::setVertices(VulkanBuffer *vertexData, size_t vertexOffset, size_t vertexCount, size_t vertexStride, VkFormat vertexFormat)
{
auto &g = geometries.back();
g.geometry.triangles.vertexData = vertexData->buffer;
g.geometry.triangles.vertexOffset = vertexOffset;
g.geometry.triangles.vertexCount = (uint32_t)vertexCount;
g.geometry.triangles.vertexStride = (uint32_t)vertexStride;
g.geometry.triangles.vertexFormat = vertexFormat;
}
inline void AccelerationStructureBuilderNV::setIndices(VulkanBuffer *indexData, size_t indexOffset, size_t indexCount, VkIndexType indexType)
{
auto &g = geometries.back();
g.geometry.triangles.indexData = indexData->buffer;
g.geometry.triangles.indexOffset = indexOffset;
g.geometry.triangles.indexCount = (uint32_t)indexCount;
g.geometry.triangles.indexType = indexType;
}
inline void AccelerationStructureBuilderNV::setTransforms(VulkanBuffer *transformData, size_t transformOffset)
{
auto &g = geometries.back();
g.geometry.triangles.transformData = transformData->buffer;
g.geometry.triangles.transformOffset = transformOffset;
}
inline void AccelerationStructureBuilderNV::addAABBs(VulkanBuffer *aabbData, size_t numAABBs, size_t stride, size_t offset, VkGeometryFlagsNV flags)
{
VkGeometryNV g = {};
g.sType = VK_STRUCTURE_TYPE_GEOMETRY_NV;
g.flags = flags;
g.geometryType = VK_GEOMETRY_TYPE_AABBS_NV;
g.geometry.aabbs.aabbData = aabbData->buffer;
g.geometry.aabbs.numAABBs = (uint32_t)numAABBs;
g.geometry.aabbs.stride = (uint32_t)stride;
g.geometry.aabbs.offset = offset;
geometries.push_back(g);
createInfo.info.pGeometries = geometries.data();
createInfo.info.geometryCount = (uint32_t)geometries.size();
}
inline std::unique_ptr<VulkanAccelerationStructureNV> AccelerationStructureBuilderNV::create(VulkanDevice *device)
{
VkAccelerationStructureNV accelstruct;
VkResult result = vkCreateAccelerationStructureNV(device->device, &createInfo, nullptr, &accelstruct);
if (result != VK_SUCCESS)
throw std::runtime_error("could not create vulkan acceleration structure");
VkAccelerationStructureMemoryRequirementsInfoNV reqInfo = {};
reqInfo.sType = VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_MEMORY_REQUIREMENTS_INFO_NV;
reqInfo.type = VK_ACCELERATION_STRUCTURE_MEMORY_REQUIREMENTS_TYPE_OBJECT_NV;
reqInfo.accelerationStructure = accelstruct;
VkMemoryRequirements2KHR memoryRequirements2 = {};
memoryRequirements2.sType = VK_STRUCTURE_TYPE_MEMORY_REQUIREMENTS_2_KHR;
vkGetAccelerationStructureMemoryRequirementsNV(device->device, &reqInfo, &memoryRequirements2);
VmaAllocation allocation;
VmaAllocationInfo allocResultInfo = {};
result = vmaAllocateMemory(device->allocator, &memoryRequirements2.memoryRequirements, &allocInfo, &allocation, &allocResultInfo);
if (result != VK_SUCCESS)
{
vkDestroyAccelerationStructureNV(device->device, accelstruct, nullptr);
throw std::runtime_error("could not allocate memory for vulkan acceleration structure");
}
VkBindAccelerationStructureMemoryInfoNV bindInfo = {};
bindInfo.sType = VK_STRUCTURE_TYPE_BIND_ACCELERATION_STRUCTURE_MEMORY_INFO_NV;
bindInfo.accelerationStructure = accelstruct;
bindInfo.memory = allocResultInfo.deviceMemory;
bindInfo.memoryOffset = allocResultInfo.offset;
result = vkBindAccelerationStructureMemoryNV(device->device, 1, &bindInfo);
if (result != VK_SUCCESS)
{
vmaFreeMemory(device->allocator, allocation);
vkDestroyAccelerationStructureNV(device->device, accelstruct, nullptr);
throw std::runtime_error("could not bind memory to vulkan acceleration structure");
}
return std::make_unique<VulkanAccelerationStructureNV>(device, accelstruct, allocation, std::move(createInfo.info), std::move(geometries));
}
/////////////////////////////////////////////////////////////////////////////
inline ScratchBufferBuilderNV::ScratchBufferBuilderNV()
{
reqInfo.sType = VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_MEMORY_REQUIREMENTS_INFO_NV;
reqInfo.type = VK_ACCELERATION_STRUCTURE_MEMORY_REQUIREMENTS_TYPE_BUILD_SCRATCH_NV;
allocInfo.usage = VMA_MEMORY_USAGE_GPU_ONLY;
}
inline void ScratchBufferBuilderNV::setAccelerationStruct(VulkanAccelerationStructureNV *accelstruct)
{
reqInfo.accelerationStructure = accelstruct->accelstruct;
}
inline void ScratchBufferBuilderNV::setUpdateType()
{
reqInfo.type = VK_ACCELERATION_STRUCTURE_MEMORY_REQUIREMENTS_TYPE_UPDATE_SCRATCH_NV;
}
inline std::unique_ptr<VulkanBuffer> ScratchBufferBuilderNV::create(VulkanDevice *device)
{
VkMemoryRequirements2KHR memoryRequirements2 = {};
memoryRequirements2.sType = VK_STRUCTURE_TYPE_MEMORY_REQUIREMENTS_2_KHR;
vkGetAccelerationStructureMemoryRequirementsNV(device->device, &reqInfo, &memoryRequirements2);
VmaAllocation allocation;
VmaAllocationInfo allocResultInfo = {};
VkResult result = vmaAllocateMemory(device->allocator, &memoryRequirements2.memoryRequirements, &allocInfo, &allocation, &allocResultInfo);
if (result != VK_SUCCESS)
throw std::runtime_error("could not allocate memory for vulkan scratch buffer");
VkBufferCreateInfo bufferInfo = {};
bufferInfo.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
bufferInfo.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
bufferInfo.size = memoryRequirements2.memoryRequirements.size;
bufferInfo.usage = VK_BUFFER_USAGE_RAY_TRACING_BIT_NV;
VkBuffer buffer;
result = vkCreateBuffer(device->device, &bufferInfo, nullptr, &buffer);
result = vkBindBufferMemory(device->device, buffer, allocResultInfo.deviceMemory, allocResultInfo.offset);
if (result != VK_SUCCESS)
{
vmaFreeMemory(device->allocator, allocation);
vkDestroyBuffer(device->device, buffer, nullptr);
throw std::runtime_error("could not bind memory to vulkan scratch buffer");
}
return std::make_unique<VulkanBuffer>(device, buffer, allocation, (size_t)bufferInfo.size);
}
/////////////////////////////////////////////////////////////////////////////
inline RayTracingPipelineBuilder::RayTracingPipelineBuilder() inline RayTracingPipelineBuilder::RayTracingPipelineBuilder()
{ {
pipelineInfo.sType = VK_STRUCTURE_TYPE_RAY_TRACING_PIPELINE_CREATE_INFO_NV; pipelineInfo.sType = VK_STRUCTURE_TYPE_RAY_TRACING_PIPELINE_CREATE_INFO_KHR;
} }
inline void RayTracingPipelineBuilder::setLayout(VulkanPipelineLayout *layout) inline void RayTracingPipelineBuilder::setLayout(VulkanPipelineLayout *layout)
@ -834,9 +621,9 @@ inline void RayTracingPipelineBuilder::setLayout(VulkanPipelineLayout *layout)
pipelineInfo.layout = layout->layout; pipelineInfo.layout = layout->layout;
} }
inline void RayTracingPipelineBuilder::setMaxRecursionDepth(int depth) inline void RayTracingPipelineBuilder::setMaxPipelineRayRecursionDepth(int depth)
{ {
pipelineInfo.maxRecursionDepth = depth; pipelineInfo.maxPipelineRayRecursionDepth = depth;
} }
inline void RayTracingPipelineBuilder::addShader(VkShaderStageFlagBits stage, VulkanShader *shader) inline void RayTracingPipelineBuilder::addShader(VkShaderStageFlagBits stage, VulkanShader *shader)
@ -853,13 +640,13 @@ inline void RayTracingPipelineBuilder::addShader(VkShaderStageFlagBits stage, Vu
inline void RayTracingPipelineBuilder::addRayGenGroup(int rayGenShader) inline void RayTracingPipelineBuilder::addRayGenGroup(int rayGenShader)
{ {
VkRayTracingShaderGroupCreateInfoNV group = {}; VkRayTracingShaderGroupCreateInfoKHR group = {};
group.sType = VK_STRUCTURE_TYPE_RAY_TRACING_SHADER_GROUP_CREATE_INFO_NV; group.sType = VK_STRUCTURE_TYPE_RAY_TRACING_SHADER_GROUP_CREATE_INFO_KHR;
group.type = VK_RAY_TRACING_SHADER_GROUP_TYPE_GENERAL_NV; group.type = VK_RAY_TRACING_SHADER_GROUP_TYPE_GENERAL_KHR;
group.generalShader = rayGenShader; group.generalShader = rayGenShader;
group.closestHitShader = VK_SHADER_UNUSED_NV; group.closestHitShader = VK_SHADER_UNUSED_KHR;
group.anyHitShader = VK_SHADER_UNUSED_NV; group.anyHitShader = VK_SHADER_UNUSED_KHR;
group.intersectionShader = VK_SHADER_UNUSED_NV; group.intersectionShader = VK_SHADER_UNUSED_KHR;
groups.push_back(group); groups.push_back(group);
pipelineInfo.pGroups = groups.data(); pipelineInfo.pGroups = groups.data();
@ -868,13 +655,13 @@ inline void RayTracingPipelineBuilder::addRayGenGroup(int rayGenShader)
inline void RayTracingPipelineBuilder::addMissGroup(int missShader) inline void RayTracingPipelineBuilder::addMissGroup(int missShader)
{ {
VkRayTracingShaderGroupCreateInfoNV group = {}; VkRayTracingShaderGroupCreateInfoKHR group = {};
group.sType = VK_STRUCTURE_TYPE_RAY_TRACING_SHADER_GROUP_CREATE_INFO_NV; group.sType = VK_STRUCTURE_TYPE_RAY_TRACING_SHADER_GROUP_CREATE_INFO_KHR;
group.type = VK_RAY_TRACING_SHADER_GROUP_TYPE_GENERAL_NV; group.type = VK_RAY_TRACING_SHADER_GROUP_TYPE_GENERAL_KHR;
group.generalShader = missShader; group.generalShader = missShader;
group.closestHitShader = VK_SHADER_UNUSED_NV; group.closestHitShader = VK_SHADER_UNUSED_KHR;
group.anyHitShader = VK_SHADER_UNUSED_NV; group.anyHitShader = VK_SHADER_UNUSED_KHR;
group.intersectionShader = VK_SHADER_UNUSED_NV; group.intersectionShader = VK_SHADER_UNUSED_KHR;
groups.push_back(group); groups.push_back(group);
pipelineInfo.pGroups = groups.data(); pipelineInfo.pGroups = groups.data();
@ -883,13 +670,13 @@ inline void RayTracingPipelineBuilder::addMissGroup(int missShader)
inline void RayTracingPipelineBuilder::addTrianglesHitGroup(int closestHitShader, int anyHitShader) inline void RayTracingPipelineBuilder::addTrianglesHitGroup(int closestHitShader, int anyHitShader)
{ {
VkRayTracingShaderGroupCreateInfoNV group = {}; VkRayTracingShaderGroupCreateInfoKHR group = {};
group.sType = VK_STRUCTURE_TYPE_RAY_TRACING_SHADER_GROUP_CREATE_INFO_NV; group.sType = VK_STRUCTURE_TYPE_RAY_TRACING_SHADER_GROUP_CREATE_INFO_KHR;
group.type = VK_RAY_TRACING_SHADER_GROUP_TYPE_TRIANGLES_HIT_GROUP_NV; group.type = VK_RAY_TRACING_SHADER_GROUP_TYPE_TRIANGLES_HIT_GROUP_KHR;
group.generalShader = VK_SHADER_UNUSED_NV; group.generalShader = VK_SHADER_UNUSED_KHR;
group.closestHitShader = closestHitShader; group.closestHitShader = closestHitShader;
group.anyHitShader = anyHitShader; group.anyHitShader = anyHitShader;
group.intersectionShader = VK_SHADER_UNUSED_NV; group.intersectionShader = VK_SHADER_UNUSED_KHR;
groups.push_back(group); groups.push_back(group);
pipelineInfo.pGroups = groups.data(); pipelineInfo.pGroups = groups.data();
@ -898,10 +685,10 @@ inline void RayTracingPipelineBuilder::addTrianglesHitGroup(int closestHitShader
inline void RayTracingPipelineBuilder::addProceduralHitGroup(int intersectionShader, int closestHitShader, int anyHitShader) inline void RayTracingPipelineBuilder::addProceduralHitGroup(int intersectionShader, int closestHitShader, int anyHitShader)
{ {
VkRayTracingShaderGroupCreateInfoNV group = {}; VkRayTracingShaderGroupCreateInfoKHR group = {};
group.sType = VK_STRUCTURE_TYPE_RAY_TRACING_SHADER_GROUP_CREATE_INFO_NV; group.sType = VK_STRUCTURE_TYPE_RAY_TRACING_SHADER_GROUP_CREATE_INFO_KHR;
group.type = VK_RAY_TRACING_SHADER_GROUP_TYPE_PROCEDURAL_HIT_GROUP_NV; group.type = VK_RAY_TRACING_SHADER_GROUP_TYPE_PROCEDURAL_HIT_GROUP_KHR;
group.generalShader = VK_SHADER_UNUSED_NV; group.generalShader = VK_SHADER_UNUSED_KHR;
group.closestHitShader = closestHitShader; group.closestHitShader = closestHitShader;
group.anyHitShader = anyHitShader; group.anyHitShader = anyHitShader;
group.intersectionShader = intersectionShader; group.intersectionShader = intersectionShader;
@ -914,18 +701,18 @@ inline void RayTracingPipelineBuilder::addProceduralHitGroup(int intersectionSha
inline std::unique_ptr<VulkanPipeline> RayTracingPipelineBuilder::create(VulkanDevice *device) inline std::unique_ptr<VulkanPipeline> RayTracingPipelineBuilder::create(VulkanDevice *device)
{ {
VkPipeline pipeline; VkPipeline pipeline;
VkResult result = vkCreateRayTracingPipelinesNV(device->device, VK_NULL_HANDLE, 1, &pipelineInfo, nullptr, &pipeline); VkResult result = vkCreateRayTracingPipelinesKHR(device->device, VK_NULL_HANDLE, VK_NULL_HANDLE, 1, &pipelineInfo, nullptr, &pipeline);
if (result != VK_SUCCESS) if (result != VK_SUCCESS)
throw std::runtime_error("vkCreateRayTracingPipelinesNV failed"); throw std::runtime_error("vkCreateRayTracingPipelinesKHR failed");
std::vector<uint8_t> shaderGroupHandles(device->physicalDevice.rayTracingProperties.shaderGroupHandleSize * groups.size()); std::vector<uint8_t> shaderGroupHandles(device->physicalDevice.rayTracingProperties.shaderGroupHandleSize * groups.size());
if (!groups.empty()) if (!groups.empty())
{ {
result = vkGetRayTracingShaderGroupHandlesNV(device->device, pipeline, 0, (uint32_t)groups.size(), shaderGroupHandles.size(), shaderGroupHandles.data()); result = vkGetRayTracingShaderGroupHandlesKHR(device->device, pipeline, 0, (uint32_t)groups.size(), shaderGroupHandles.size(), shaderGroupHandles.data());
if (result != VK_SUCCESS) if (result != VK_SUCCESS)
{ {
vkDestroyPipeline(device->device, pipeline, nullptr); vkDestroyPipeline(device->device, pipeline, nullptr);
throw std::runtime_error("vkGetRayTracingShaderGroupHandlesNV failed"); throw std::runtime_error("vkGetRayTracingShaderGroupHandlesKHR failed");
} }
} }
@ -1719,11 +1506,11 @@ inline void WriteDescriptors::addCombinedImageSampler(VulkanDescriptorSet *descr
writeExtras.push_back(std::move(extra)); writeExtras.push_back(std::move(extra));
} }
inline void WriteDescriptors::addAccelerationStructure(VulkanDescriptorSet *descriptorSet, int binding, VulkanAccelerationStructureNV *accelStruct) inline void WriteDescriptors::addAccelerationStructure(VulkanDescriptorSet *descriptorSet, int binding, VulkanAccelerationStructure *accelStruct)
{ {
auto extra = std::make_unique<WriteExtra>(); auto extra = std::make_unique<WriteExtra>();
extra->accelStruct = {}; extra->accelStruct = {};
extra->accelStruct.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET_ACCELERATION_STRUCTURE_NV; extra->accelStruct.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET_ACCELERATION_STRUCTURE_KHR;
extra->accelStruct.accelerationStructureCount = 1; extra->accelStruct.accelerationStructureCount = 1;
extra->accelStruct.pAccelerationStructures = &accelStruct->accelstruct; extra->accelStruct.pAccelerationStructures = &accelStruct->accelstruct;
@ -1732,7 +1519,7 @@ inline void WriteDescriptors::addAccelerationStructure(VulkanDescriptorSet *desc
descriptorWrite.dstSet = descriptorSet->set; descriptorWrite.dstSet = descriptorSet->set;
descriptorWrite.dstBinding = binding; descriptorWrite.dstBinding = binding;
descriptorWrite.dstArrayElement = 0; descriptorWrite.dstArrayElement = 0;
descriptorWrite.descriptorType = VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_NV; descriptorWrite.descriptorType = VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_KHR;
descriptorWrite.descriptorCount = 1; descriptorWrite.descriptorCount = 1;
descriptorWrite.pNext = &extra->accelStruct; descriptorWrite.pNext = &extra->accelStruct;
writes.push_back(descriptorWrite); writes.push_back(descriptorWrite);

View file

@ -238,26 +238,6 @@ private:
VulkanAccelerationStructure& operator=(const VulkanAccelerationStructure&) = delete; VulkanAccelerationStructure& operator=(const VulkanAccelerationStructure&) = delete;
}; };
class VulkanAccelerationStructureNV
{
public:
VulkanAccelerationStructureNV(VulkanDevice *device, VkAccelerationStructureNV accelstruct, VmaAllocation allocation, VkAccelerationStructureInfoNV &&info, std::vector<VkGeometryNV> &&geometries);
~VulkanAccelerationStructureNV();
void SetDebugName(const char *name) { device->setDebugObjectName(name, (uint64_t)accelstruct, VK_OBJECT_TYPE_ACCELERATION_STRUCTURE_NV); }
VulkanDevice *device;
VkAccelerationStructureNV accelstruct;
VmaAllocation allocation;
VkAccelerationStructureInfoNV info;
std::vector<VkGeometryNV> geometries;
private:
VulkanAccelerationStructureNV(const VulkanAccelerationStructureNV &) = delete;
VulkanAccelerationStructureNV &operator=(const VulkanAccelerationStructureNV &) = delete;
};
class VulkanPipeline class VulkanPipeline
{ {
public: public:
@ -392,13 +372,8 @@ public:
void endRenderPass(); void endRenderPass();
void executeCommands(uint32_t commandBufferCount, const VkCommandBuffer* pCommandBuffers); void executeCommands(uint32_t commandBufferCount, const VkCommandBuffer* pCommandBuffers);
void buildAccelerationStructure(const VkAccelerationStructureInfoNV* pInfo, VulkanBuffer *instanceData, VkDeviceSize instanceOffset, VkBool32 update, VulkanAccelerationStructureNV *dst, VulkanAccelerationStructureNV *src, VulkanBuffer *scratch, VkDeviceSize scratchOffset); void traceRays(const VkStridedDeviceAddressRegionKHR* pRaygenShaderBindingTable, const VkStridedDeviceAddressRegionKHR* pMissShaderBindingTable, const VkStridedDeviceAddressRegionKHR* pHitShaderBindingTable, const VkStridedDeviceAddressRegionKHR* pCallableShaderBindingTable, uint32_t width, uint32_t height, uint32_t depth);
void buildAccelerationStructure(const VkAccelerationStructureInfoNV* pInfo, VkBuffer instanceData, VkDeviceSize instanceOffset, VkBool32 update, VkAccelerationStructureNV dst, VkAccelerationStructureNV src, VkBuffer scratch, VkDeviceSize scratchOffset); void writeAccelerationStructuresProperties(uint32_t accelerationStructureCount, const VkAccelerationStructureKHR* pAccelerationStructures, VkQueryType queryType, VkQueryPool queryPool, uint32_t firstQuery);
void copyAccelerationStructure(VulkanAccelerationStructureNV *dst, VulkanAccelerationStructureNV *src, VkCopyAccelerationStructureModeNV mode);
void copyAccelerationStructure(VkAccelerationStructureNV dst, VkAccelerationStructureNV src, VkCopyAccelerationStructureModeNV mode);
void traceRays(VulkanBuffer *raygenShaderBindingTableBuffer, VkDeviceSize raygenShaderBindingOffset, VulkanBuffer *missShaderBindingTableBuffer, VkDeviceSize missShaderBindingOffset, VkDeviceSize missShaderBindingStride, VulkanBuffer *hitShaderBindingTableBuffer, VkDeviceSize hitShaderBindingOffset, VkDeviceSize hitShaderBindingStride, VulkanBuffer *callableShaderBindingTableBuffer, VkDeviceSize callableShaderBindingOffset, VkDeviceSize callableShaderBindingStride, uint32_t width, uint32_t height, uint32_t depth);
void traceRays(VkBuffer raygenShaderBindingTableBuffer, VkDeviceSize raygenShaderBindingOffset, VkBuffer missShaderBindingTableBuffer, VkDeviceSize missShaderBindingOffset, VkDeviceSize missShaderBindingStride, VkBuffer hitShaderBindingTableBuffer, VkDeviceSize hitShaderBindingOffset, VkDeviceSize hitShaderBindingStride, VkBuffer callableShaderBindingTableBuffer, VkDeviceSize callableShaderBindingOffset, VkDeviceSize callableShaderBindingStride, uint32_t width, uint32_t height, uint32_t depth);
void writeAccelerationStructuresProperties(uint32_t accelerationStructureCount, const VkAccelerationStructureNV* pAccelerationStructures, VkQueryType queryType, VkQueryPool queryPool, uint32_t firstQuery);
void debugFullPipelineBarrier(); void debugFullPipelineBarrier();
@ -930,44 +905,14 @@ inline void VulkanCommandBuffer::executeCommands(uint32_t commandBufferCount, co
vkCmdExecuteCommands(buffer, commandBufferCount, pCommandBuffers); vkCmdExecuteCommands(buffer, commandBufferCount, pCommandBuffers);
} }
inline void VulkanCommandBuffer::buildAccelerationStructure(const VkAccelerationStructureInfoNV* pInfo, VulkanBuffer *instanceData, VkDeviceSize instanceOffset, VkBool32 update, VulkanAccelerationStructureNV *dst, VulkanAccelerationStructureNV *src, VulkanBuffer *scratch, VkDeviceSize scratchOffset) inline void VulkanCommandBuffer::traceRays(const VkStridedDeviceAddressRegionKHR* pRaygenShaderBindingTable, const VkStridedDeviceAddressRegionKHR* pMissShaderBindingTable, const VkStridedDeviceAddressRegionKHR* pHitShaderBindingTable, const VkStridedDeviceAddressRegionKHR* pCallableShaderBindingTable, uint32_t width, uint32_t height, uint32_t depth)
{ {
buildAccelerationStructure(pInfo, instanceData->buffer, instanceOffset, update, dst->accelstruct, src->accelstruct, scratch->buffer, scratchOffset); vkCmdTraceRaysKHR(buffer, pRaygenShaderBindingTable, pMissShaderBindingTable, pHitShaderBindingTable, pCallableShaderBindingTable, width, height, depth);
} }
inline void VulkanCommandBuffer::buildAccelerationStructure(const VkAccelerationStructureInfoNV* pInfo, VkBuffer instanceData, VkDeviceSize instanceOffset, VkBool32 update, VkAccelerationStructureNV dst, VkAccelerationStructureNV src, VkBuffer scratch, VkDeviceSize scratchOffset) inline void VulkanCommandBuffer::writeAccelerationStructuresProperties(uint32_t accelerationStructureCount, const VkAccelerationStructureKHR* pAccelerationStructures, VkQueryType queryType, VkQueryPool queryPool, uint32_t firstQuery)
{ {
vkCmdBuildAccelerationStructureNV(buffer, pInfo, instanceData, instanceOffset, update, dst, src, scratch, scratchOffset); vkCmdWriteAccelerationStructuresPropertiesKHR(buffer, accelerationStructureCount, pAccelerationStructures, queryType, queryPool, firstQuery);
}
inline void VulkanCommandBuffer::copyAccelerationStructure(VulkanAccelerationStructureNV *dst, VulkanAccelerationStructureNV *src, VkCopyAccelerationStructureModeNV mode)
{
copyAccelerationStructure(dst->accelstruct, src->accelstruct, mode);
}
inline void VulkanCommandBuffer::copyAccelerationStructure(VkAccelerationStructureNV dst, VkAccelerationStructureNV src, VkCopyAccelerationStructureModeNV mode)
{
vkCmdCopyAccelerationStructureNV(buffer, dst, src, mode);
}
inline void VulkanCommandBuffer::traceRays(VulkanBuffer *raygenShaderBindingTableBuffer, VkDeviceSize raygenShaderBindingOffset, VulkanBuffer *missShaderBindingTableBuffer, VkDeviceSize missShaderBindingOffset, VkDeviceSize missShaderBindingStride, VulkanBuffer *hitShaderBindingTableBuffer, VkDeviceSize hitShaderBindingOffset, VkDeviceSize hitShaderBindingStride, VulkanBuffer *callableShaderBindingTableBuffer, VkDeviceSize callableShaderBindingOffset, VkDeviceSize callableShaderBindingStride, uint32_t width, uint32_t height, uint32_t depth)
{
traceRays(
raygenShaderBindingTableBuffer->buffer, raygenShaderBindingOffset,
missShaderBindingTableBuffer ? missShaderBindingTableBuffer->buffer : VK_NULL_HANDLE, missShaderBindingOffset, missShaderBindingStride,
hitShaderBindingTableBuffer ? hitShaderBindingTableBuffer->buffer : VK_NULL_HANDLE, hitShaderBindingOffset, hitShaderBindingStride,
callableShaderBindingTableBuffer ? callableShaderBindingTableBuffer->buffer : VK_NULL_HANDLE, callableShaderBindingOffset, callableShaderBindingStride,
width, height, depth);
}
inline void VulkanCommandBuffer::traceRays(VkBuffer raygenShaderBindingTableBuffer, VkDeviceSize raygenShaderBindingOffset, VkBuffer missShaderBindingTableBuffer, VkDeviceSize missShaderBindingOffset, VkDeviceSize missShaderBindingStride, VkBuffer hitShaderBindingTableBuffer, VkDeviceSize hitShaderBindingOffset, VkDeviceSize hitShaderBindingStride, VkBuffer callableShaderBindingTableBuffer, VkDeviceSize callableShaderBindingOffset, VkDeviceSize callableShaderBindingStride, uint32_t width, uint32_t height, uint32_t depth)
{
vkCmdTraceRaysNV(buffer, raygenShaderBindingTableBuffer, raygenShaderBindingOffset, missShaderBindingTableBuffer, missShaderBindingOffset, missShaderBindingStride, hitShaderBindingTableBuffer, hitShaderBindingOffset, hitShaderBindingStride, callableShaderBindingTableBuffer, callableShaderBindingOffset, callableShaderBindingStride, width, height, depth);
}
inline void VulkanCommandBuffer::writeAccelerationStructuresProperties(uint32_t accelerationStructureCount, const VkAccelerationStructureNV* pAccelerationStructures, VkQueryType queryType, VkQueryPool queryPool, uint32_t firstQuery)
{
vkCmdWriteAccelerationStructuresPropertiesNV(buffer, accelerationStructureCount, pAccelerationStructures, queryType, queryPool, firstQuery);
} }
inline void VulkanCommandBuffer::SetDebugName(const char *name) inline void VulkanCommandBuffer::SetDebugName(const char *name)
@ -1124,19 +1069,6 @@ inline VulkanAccelerationStructure::~VulkanAccelerationStructure()
///////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////
inline VulkanAccelerationStructureNV::VulkanAccelerationStructureNV(VulkanDevice *device, VkAccelerationStructureNV accelstruct, VmaAllocation allocation, VkAccelerationStructureInfoNV &&info, std::vector<VkGeometryNV> &&geometries)
: device(device), accelstruct(accelstruct), allocation(allocation), info(std::move(info)), geometries(std::move(geometries))
{
}
inline VulkanAccelerationStructureNV::~VulkanAccelerationStructureNV()
{
vkDestroyAccelerationStructureNV(device->device, accelstruct, nullptr);
vmaFreeMemory(device->allocator, allocation);
}
/////////////////////////////////////////////////////////////////////////////
inline VulkanPipeline::VulkanPipeline(VulkanDevice *device, VkPipeline pipeline, std::vector<uint8_t> shaderGroupHandles) : device(device), pipeline(pipeline), shaderGroupHandles(shaderGroupHandles) inline VulkanPipeline::VulkanPipeline(VulkanDevice *device, VkPipeline pipeline, std::vector<uint8_t> shaderGroupHandles) : device(device), pipeline(pipeline), shaderGroupHandles(shaderGroupHandles)
{ {
} }