Skip to content
Snippets Groups Projects
Commit 1c6f57ce authored by Lars Hoerttrich's avatar Lars Hoerttrich
Browse files

[#92] Minor fixes and experimentation

parent d84055ce
Branches
Tags
1 merge request!75Resolve "RTX-Module"
Pipeline #27278 passed
...@@ -73,7 +73,7 @@ namespace vkcv::rtx { ...@@ -73,7 +73,7 @@ namespace vkcv::rtx {
cpuBufferInstances.bufferType = RTXBufferType::CPU; cpuBufferInstances.bufferType = RTXBufferType::CPU;
cpuBufferInstances.deviceSize = sizeof(accelerationStructureInstanceKhr); cpuBufferInstances.deviceSize = sizeof(accelerationStructureInstanceKhr);
cpuBufferInstances.data = &accelerationStructureInstanceKhr; cpuBufferInstances.data = &accelerationStructureInstanceKhr;
cpuBufferInstances.bufferUsageFlagBits = vk::BufferUsageFlagBits::eShaderDeviceAddressKHR cpuBufferInstances.bufferUsageFlagBits = vk::BufferUsageFlagBits::eShaderDeviceAddress
| vk::BufferUsageFlagBits::eTransferSrc; | vk::BufferUsageFlagBits::eTransferSrc;
cpuBufferInstances.memoryPropertyFlagBits = vk::MemoryPropertyFlagBits::eHostCoherent cpuBufferInstances.memoryPropertyFlagBits = vk::MemoryPropertyFlagBits::eHostCoherent
| vk::MemoryPropertyFlagBits::eHostVisible; | vk::MemoryPropertyFlagBits::eHostVisible;
...@@ -83,7 +83,7 @@ namespace vkcv::rtx { ...@@ -83,7 +83,7 @@ namespace vkcv::rtx {
RTXBuffer gpuBufferInstances; RTXBuffer gpuBufferInstances;
gpuBufferInstances.bufferType = RTXBufferType::GPU; gpuBufferInstances.bufferType = RTXBufferType::GPU;
gpuBufferInstances.deviceSize = sizeof(accelerationStructureInstanceKhr); gpuBufferInstances.deviceSize = sizeof(accelerationStructureInstanceKhr);
gpuBufferInstances.bufferUsageFlagBits = vk::BufferUsageFlagBits::eShaderDeviceAddressKHR gpuBufferInstances.bufferUsageFlagBits = vk::BufferUsageFlagBits::eShaderDeviceAddress
| vk::BufferUsageFlagBits::eTransferDst| vk::BufferUsageFlagBits::eTransferSrc; | vk::BufferUsageFlagBits::eTransferDst| vk::BufferUsageFlagBits::eTransferSrc;
gpuBufferInstances.memoryPropertyFlagBits = vk::MemoryPropertyFlagBits::eDeviceLocal; gpuBufferInstances.memoryPropertyFlagBits = vk::MemoryPropertyFlagBits::eDeviceLocal;
...@@ -99,12 +99,12 @@ namespace vkcv::rtx { ...@@ -99,12 +99,12 @@ namespace vkcv::rtx {
); );
vk::BufferDeviceAddressInfo bufferInstancesDeviceAddressInfo(gpuBufferInstances.vulkanHandle); vk::BufferDeviceAddressInfo bufferInstancesDeviceAddressInfo(gpuBufferInstances.vulkanHandle);
vk::DeviceAddress bufferInstancesAddress = m_core->getContext().getDevice().getBufferAddressKHR(bufferInstancesDeviceAddressInfo, m_rtxDispatcher); vk::DeviceAddress bufferInstancesAddress = m_core->getContext().getDevice().getBufferAddress(bufferInstancesDeviceAddressInfo);
vk::DeviceOrHostAddressConstKHR bufferInstancesDeviceOrHostAddressConst(bufferInstancesAddress); //vk::DeviceOrHostAddressConstKHR bufferInstancesDeviceOrHostAddressConst(bufferInstancesAddress);
vk::AccelerationStructureGeometryInstancesDataKHR asInstances( vk::AccelerationStructureGeometryInstancesDataKHR asInstances(
false, // vk::Bool32 arrayOfPointers false, // vk::Bool32 arrayOfPointers
bufferInstancesDeviceOrHostAddressConst // vk::DeviceOrHostAddressConstKHR data_ = {} bufferInstancesAddress // vk::DeviceOrHostAddressConstKHR data_ = {}
); );
// Like creating the BLAS, point to the geometry (in this case, the instances) in a polymorphic object. // Like creating the BLAS, point to the geometry (in this case, the instances) in a polymorphic object.
...@@ -140,7 +140,7 @@ namespace vkcv::rtx { ...@@ -140,7 +140,7 @@ namespace vkcv::rtx {
tlasBuffer.bufferType = RTXBufferType::ACCELERATION; tlasBuffer.bufferType = RTXBufferType::ACCELERATION;
tlasBuffer.deviceSize = asSizeInfo.accelerationStructureSize; tlasBuffer.deviceSize = asSizeInfo.accelerationStructureSize;
tlasBuffer.bufferUsageFlagBits = vk::BufferUsageFlagBits::eAccelerationStructureStorageKHR tlasBuffer.bufferUsageFlagBits = vk::BufferUsageFlagBits::eAccelerationStructureStorageKHR
| vk::BufferUsageFlagBits::eShaderDeviceAddressKHR | vk::BufferUsageFlagBits::eShaderDeviceAddress
| vk::BufferUsageFlagBits::eStorageBuffer; | vk::BufferUsageFlagBits::eStorageBuffer;
createBuffer(tlasBuffer); createBuffer(tlasBuffer);
...@@ -229,21 +229,21 @@ namespace vkcv::rtx { ...@@ -229,21 +229,21 @@ namespace vkcv::rtx {
RTXBuffer indexBuffer = makeBufferFromData(indices); RTXBuffer indexBuffer = makeBufferFromData(indices);
vk::BufferDeviceAddressInfo vertexBufferDeviceAddressInfo(vertexBuffer.vulkanHandle); vk::BufferDeviceAddressInfo vertexBufferDeviceAddressInfo(vertexBuffer.vulkanHandle);
vk::DeviceAddress vertexBufferAddress = m_core->getContext().getDevice().getBufferAddressKHR(vertexBufferDeviceAddressInfo, m_rtxDispatcher); vk::DeviceAddress vertexBufferAddress = m_core->getContext().getDevice().getBufferAddress(vertexBufferDeviceAddressInfo);
vk::DeviceOrHostAddressConstKHR vertexDeviceOrHostAddressConst(vertexBufferAddress); //vk::DeviceOrHostAddressConstKHR vertexDeviceOrHostAddressConst(vertexBufferAddress);
vk::BufferDeviceAddressInfo indexBufferDeviceAddressInfo(indexBuffer.vulkanHandle); vk::BufferDeviceAddressInfo indexBufferDeviceAddressInfo(indexBuffer.vulkanHandle);
vk::DeviceAddress indexBufferAddress = m_core->getContext().getDevice().getBufferAddressKHR(indexBufferDeviceAddressInfo, m_rtxDispatcher); vk::DeviceAddress indexBufferAddress = m_core->getContext().getDevice().getBufferAddress(indexBufferDeviceAddressInfo);
vk::DeviceOrHostAddressConstKHR indexDeviceOrHostAddressConst(indexBufferAddress); //vk::DeviceOrHostAddressConstKHR indexDeviceOrHostAddressConst(indexBufferAddress);
// Specify triangle mesh data // Specify triangle mesh data
vk::AccelerationStructureGeometryTrianglesDataKHR asTriangles( vk::AccelerationStructureGeometryTrianglesDataKHR asTriangles(
vk::Format::eR32G32B32Sfloat, // vertex format vk::Format::eR32G32B32Sfloat, // vertex format
vertexDeviceOrHostAddressConst, // vertex buffer address (vk::DeviceOrHostAddressConstKHR) vertexBufferAddress, // vertex buffer address (vk::DeviceOrHostAddressConstKHR)
3 * sizeof(float), // vertex stride (vk::DeviceSize) 3 * sizeof(float), // vertex stride (vk::DeviceSize)
uint32_t(vertexCount),//uint32_t(vertexCount - 1), // maxVertex (uint32_t) uint32_t(vertexCount - 1), // maxVertex (uint32_t)
vk::IndexType::eUint16, // indexType (vk::IndexType) --> INFO: UINT16 oder UINT32! vk::IndexType::eUint16, // indexType (vk::IndexType) --> INFO: UINT16 oder UINT32!
indexDeviceOrHostAddressConst, // indexData (vk::DeviceOrHostAddressConstKHR) indexBufferAddress, // indexData (vk::DeviceOrHostAddressConstKHR)
{} // transformData (vk::DeviceOrHostAddressConstKHR) {} // transformData (vk::DeviceOrHostAddressConstKHR)
); );
...@@ -319,28 +319,27 @@ namespace vkcv::rtx { ...@@ -319,28 +319,27 @@ namespace vkcv::rtx {
scratchBuffer.bufferType = RTXBufferType::SCRATCH; scratchBuffer.bufferType = RTXBufferType::SCRATCH;
scratchBuffer.deviceSize = asBuildSizesInfo.buildScratchSize; scratchBuffer.deviceSize = asBuildSizesInfo.buildScratchSize;
scratchBuffer.data = nullptr; scratchBuffer.data = nullptr;
scratchBuffer.bufferUsageFlagBits = vk::BufferUsageFlagBits::eAccelerationStructureBuildInputReadOnlyKHR scratchBuffer.bufferUsageFlagBits = vk::BufferUsageFlagBits::eShaderDeviceAddress
| vk::BufferUsageFlagBits::eShaderDeviceAddress
| vk::BufferUsageFlagBits::eStorageBuffer; | vk::BufferUsageFlagBits::eStorageBuffer;
scratchBuffer.memoryPropertyFlagBits = { vk::MemoryPropertyFlagBits::eDeviceLocal }; scratchBuffer.memoryPropertyFlagBits = { vk::MemoryPropertyFlagBits::eDeviceLocal };
createBuffer(scratchBuffer); createBuffer(scratchBuffer);
asBuildInfo.setScratchData(m_core->getContext().getDevice().getBufferAddressKHR(scratchBuffer.vulkanHandle, m_rtxDispatcher)); asBuildInfo.setScratchData(m_core->getContext().getDevice().getBufferAddress(scratchBuffer.vulkanHandle));
vk::AccelerationStructureBuildRangeInfoKHR* pointerToRangeInfo = &asRangeInfo; vk::AccelerationStructureBuildRangeInfoKHR* pointerToRangeInfo = &asRangeInfo;
SubmitInfo submitInfo; SubmitInfo submitInfo;
submitInfo.queueType = QueueType::Graphics; submitInfo.queueType = QueueType::Graphics;
m_core->recordAndSubmitCommandsImmediate( m_core->recordAndSubmitCommandsImmediate(
submitInfo, submitInfo,
[&](const vk::CommandBuffer& commandBuffer) { [&asBuildInfo,&pointerToRangeInfo,this](const vk::CommandBuffer& commandBuffer) {
commandBuffer.buildAccelerationStructuresKHR(1, &asBuildInfo, &pointerToRangeInfo, m_rtxDispatcher); commandBuffer.buildAccelerationStructuresKHR(1, &asBuildInfo, &pointerToRangeInfo, m_rtxDispatcher);
}, },
nullptr); nullptr);
/*auto cmdStream = m_core->createCommandStream(vkcv::QueueType::Graphics); /*auto cmdStream = m_core->createCommandStream(vkcv::QueueType::Graphics);
auto submitFunction = [&](const vk::CommandBuffer& cmdBuffer) { auto submitFunction = [&](const vk::CommandBuffer& cmdBuffer) {
...@@ -349,6 +348,8 @@ namespace vkcv::rtx { ...@@ -349,6 +348,8 @@ namespace vkcv::rtx {
//m_core->recordAndSubmitCommandsImmediate() //m_core->recordAndSubmitCommandsImmediate()
m_core->submitCommandStream(cmdStream); m_core->submitCommandStream(cmdStream);
*/ */
m_core->getContext().getDevice().waitIdle(m_rtxDispatcher);
m_core->getContext().getDevice().destroyBuffer(scratchBuffer.vulkanHandle, nullptr, m_rtxDispatcher); m_core->getContext().getDevice().destroyBuffer(scratchBuffer.vulkanHandle, nullptr, m_rtxDispatcher);
m_core->getContext().getDevice().freeMemory(scratchBuffer.deviceMemory, nullptr, m_rtxDispatcher); m_core->getContext().getDevice().freeMemory(scratchBuffer.deviceMemory, nullptr, m_rtxDispatcher);
...@@ -387,7 +388,7 @@ namespace vkcv::rtx { ...@@ -387,7 +388,7 @@ namespace vkcv::rtx {
gpuBuffer.bufferUsageFlagBits = vk::BufferUsageFlagBits::eAccelerationStructureBuildInputReadOnlyKHR gpuBuffer.bufferUsageFlagBits = vk::BufferUsageFlagBits::eAccelerationStructureBuildInputReadOnlyKHR
| vk::BufferUsageFlagBits::eTransferDst | vk::BufferUsageFlagBits::eTransferDst
| vk::BufferUsageFlagBits::eStorageBuffer | vk::BufferUsageFlagBits::eStorageBuffer
| vk::BufferUsageFlagBits::eShaderDeviceAddressKHR; | vk::BufferUsageFlagBits::eShaderDeviceAddress;
gpuBuffer.memoryPropertyFlagBits = vk::MemoryPropertyFlagBits::eDeviceLocal; gpuBuffer.memoryPropertyFlagBits = vk::MemoryPropertyFlagBits::eDeviceLocal;
createBuffer(gpuBuffer); createBuffer(gpuBuffer);
...@@ -409,24 +410,34 @@ namespace vkcv::rtx { ...@@ -409,24 +410,34 @@ namespace vkcv::rtx {
{} // uint32_t* queueFamilyIndices {} // uint32_t* queueFamilyIndices
); );
buffer.vulkanHandle = m_core->getContext().getDevice().createBuffer(bufferCreateInfo); buffer.vulkanHandle = m_core->getContext().getDevice().createBuffer(bufferCreateInfo);
vk::MemoryRequirements memoryRequirements = m_core->getContext().getDevice().getBufferMemoryRequirements(buffer.vulkanHandle);
vk::MemoryRequirements2KHR memoryRequirements2;
vk::MemoryDedicatedRequirementsKHR dedicatedRequirements;
vk::BufferMemoryRequirementsInfo2KHR bufferRequirements;
bufferRequirements.setBuffer(buffer.vulkanHandle);
memoryRequirements2.pNext = &dedicatedRequirements;
m_core->getContext().getDevice().getBufferMemoryRequirements2(&bufferRequirements, &memoryRequirements2);
//vk::MemoryRequirements memoryRequirements = m_core->getContext().getDevice().getBufferMemoryRequirements(buffer.vulkanHandle);
vk::PhysicalDeviceMemoryProperties physicalDeviceMemoryProperties = m_core->getContext().getPhysicalDevice().getMemoryProperties(); vk::PhysicalDeviceMemoryProperties physicalDeviceMemoryProperties = m_core->getContext().getPhysicalDevice().getMemoryProperties();
uint32_t memoryTypeIndex = -1; uint32_t memoryTypeIndex = -1;
for (int x = 0; x < physicalDeviceMemoryProperties.memoryTypeCount; x++) { for (int x = 0; x < physicalDeviceMemoryProperties.memoryTypeCount; x++) {
if ((memoryRequirements.memoryTypeBits & (1 << x)) && (physicalDeviceMemoryProperties.memoryTypes[x].propertyFlags & buffer.memoryPropertyFlagBits) == buffer.memoryPropertyFlagBits) { if ((memoryRequirements2.memoryRequirements.memoryTypeBits & (1 << x)) && (physicalDeviceMemoryProperties.memoryTypes[x].propertyFlags & buffer.memoryPropertyFlagBits) == buffer.memoryPropertyFlagBits) {
memoryTypeIndex = x; memoryTypeIndex = x;
break; break;
} }
} }
vk::MemoryAllocateInfo memoryAllocateInfo( vk::MemoryAllocateInfo memoryAllocateInfo(
memoryRequirements.size, // size of allocation in bytes memoryRequirements2.memoryRequirements.size, // size of allocation in bytes
memoryTypeIndex // index identifying a memory type from the memoryTypes array of the vk::PhysicalDeviceMemoryProperties structure. memoryTypeIndex // index identifying a memory type from the memoryTypes array of the vk::PhysicalDeviceMemoryProperties structure.
); );
vk::MemoryAllocateFlagsInfo allocateFlagsInfo( vk::MemoryAllocateFlagsInfo allocateFlagsInfo(
vk::MemoryAllocateFlagBitsKHR::eDeviceAddress // vk::MemoryAllocateFlags vk::MemoryAllocateFlagBits::eDeviceAddress // vk::MemoryAllocateFlags
); );
memoryAllocateInfo.setPNext(&allocateFlagsInfo); // extend memory allocate info with allocate flag info memoryAllocateInfo.setPNext(&allocateFlagsInfo); // extend memory allocate info with allocate flag info
buffer.deviceMemory = m_core->getContext().getDevice().allocateMemory(memoryAllocateInfo); buffer.deviceMemory = m_core->getContext().getDevice().allocateMemory(memoryAllocateInfo);
...@@ -454,6 +465,7 @@ namespace vkcv::rtx { ...@@ -454,6 +465,7 @@ namespace vkcv::rtx {
commandBuffer.copyBuffer(cpuBuffer.vulkanHandle, gpuBuffer.vulkanHandle, 1, &bufferCopy); commandBuffer.copyBuffer(cpuBuffer.vulkanHandle, gpuBuffer.vulkanHandle, 1, &bufferCopy);
}, },
nullptr); nullptr);
m_core->getContext().getDevice().waitIdle();
/* /*
auto cmdStream = m_core->createCommandStream(vkcv::QueueType::Graphics); auto cmdStream = m_core->createCommandStream(vkcv::QueueType::Graphics);
auto submitFunction = [&](const vk::CommandBuffer& cmdBuffer) { auto submitFunction = [&](const vk::CommandBuffer& cmdBuffer) {
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment