parent
21f9cd5251
commit
a369e6ed96
7 changed files with 37 additions and 26 deletions
|
|
@ -205,10 +205,11 @@ void VulkanRaytracingSample::prepare()
|
||||||
|
|
||||||
VkStridedDeviceAddressRegionKHR VulkanRaytracingSample::getSbtEntryStridedDeviceAddressRegion(VkBuffer buffer, uint32_t handleCount)
|
VkStridedDeviceAddressRegionKHR VulkanRaytracingSample::getSbtEntryStridedDeviceAddressRegion(VkBuffer buffer, uint32_t handleCount)
|
||||||
{
|
{
|
||||||
|
const uint32_t handleSizeAligned = vks::tools::alignedSize(rayTracingPipelineProperties.shaderGroupHandleSize, rayTracingPipelineProperties.shaderGroupHandleAlignment);
|
||||||
VkStridedDeviceAddressRegionKHR stridedDeviceAddressRegionKHR{};
|
VkStridedDeviceAddressRegionKHR stridedDeviceAddressRegionKHR{};
|
||||||
stridedDeviceAddressRegionKHR.deviceAddress = getBufferDeviceAddress(buffer);
|
stridedDeviceAddressRegionKHR.deviceAddress = getBufferDeviceAddress(buffer);
|
||||||
stridedDeviceAddressRegionKHR.stride = rayTracingPipelineProperties.shaderGroupHandleSize;
|
stridedDeviceAddressRegionKHR.stride = handleSizeAligned;
|
||||||
stridedDeviceAddressRegionKHR.size = rayTracingPipelineProperties.shaderGroupHandleSize * handleCount;
|
stridedDeviceAddressRegionKHR.size = handleCount * handleSizeAligned;
|
||||||
return stridedDeviceAddressRegionKHR;
|
return stridedDeviceAddressRegionKHR;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -378,5 +378,11 @@ namespace vks
|
||||||
std::ifstream f(filename.c_str());
|
std::ifstream f(filename.c_str());
|
||||||
return !f.fail();
|
return !f.fail();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
uint32_t alignedSize(uint32_t value, uint32_t alignment)
|
||||||
|
{
|
||||||
|
return (value + alignment - 1) & ~(alignment - 1);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -125,5 +125,7 @@ namespace vks
|
||||||
|
|
||||||
/** @brief Checks if a file exists */
|
/** @brief Checks if a file exists */
|
||||||
bool fileExists(const std::string &filename);
|
bool fileExists(const std::string &filename);
|
||||||
|
|
||||||
|
uint32_t alignedSize(uint32_t value, uint32_t alignment);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -539,9 +539,9 @@ public:
|
||||||
*/
|
*/
|
||||||
void createShaderBindingTable() {
|
void createShaderBindingTable() {
|
||||||
const uint32_t handleSize = rayTracingPipelineProperties.shaderGroupHandleSize;
|
const uint32_t handleSize = rayTracingPipelineProperties.shaderGroupHandleSize;
|
||||||
const uint32_t handleAlignment = rayTracingPipelineProperties.shaderGroupHandleAlignment;
|
const uint32_t handleSizeAligned = vks::tools::alignedSize(rayTracingPipelineProperties.shaderGroupHandleSize, rayTracingPipelineProperties.shaderGroupHandleAlignment);
|
||||||
const uint32_t groupCount = static_cast<uint32_t>(shaderGroups.size());
|
const uint32_t groupCount = static_cast<uint32_t>(shaderGroups.size());
|
||||||
const uint32_t sbtSize = handleSize * groupCount;
|
const uint32_t sbtSize = groupCount * handleSizeAligned;
|
||||||
|
|
||||||
std::vector<uint8_t> shaderHandleStorage(sbtSize);
|
std::vector<uint8_t> shaderHandleStorage(sbtSize);
|
||||||
VK_CHECK_RESULT(vkGetRayTracingShaderGroupHandlesKHR(device, pipeline, 0, groupCount, sbtSize, shaderHandleStorage.data()));
|
VK_CHECK_RESULT(vkGetRayTracingShaderGroupHandlesKHR(device, pipeline, 0, groupCount, sbtSize, shaderHandleStorage.data()));
|
||||||
|
|
@ -557,8 +557,8 @@ public:
|
||||||
missShaderBindingTable.map();
|
missShaderBindingTable.map();
|
||||||
hitShaderBindingTable.map();
|
hitShaderBindingTable.map();
|
||||||
memcpy(raygenShaderBindingTable.mapped, shaderHandleStorage.data(), handleSize);
|
memcpy(raygenShaderBindingTable.mapped, shaderHandleStorage.data(), handleSize);
|
||||||
memcpy(missShaderBindingTable.mapped, shaderHandleStorage.data() + handleAlignment, handleSize);
|
memcpy(missShaderBindingTable.mapped, shaderHandleStorage.data() + handleSizeAligned, handleSize);
|
||||||
memcpy(hitShaderBindingTable.mapped, shaderHandleStorage.data() + handleAlignment * 2, handleSize);
|
memcpy(hitShaderBindingTable.mapped, shaderHandleStorage.data() + handleSizeAligned * 2, handleSize);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
@ -760,20 +760,22 @@ public:
|
||||||
Setup the buffer regions pointing to the shaders in our shader binding table
|
Setup the buffer regions pointing to the shaders in our shader binding table
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
const uint32_t handleSizeAligned = vks::tools::alignedSize(rayTracingPipelineProperties.shaderGroupHandleSize, rayTracingPipelineProperties.shaderGroupHandleAlignment);
|
||||||
|
|
||||||
VkStridedDeviceAddressRegionKHR raygenShaderSbtEntry{};
|
VkStridedDeviceAddressRegionKHR raygenShaderSbtEntry{};
|
||||||
raygenShaderSbtEntry.deviceAddress = getBufferDeviceAddress(raygenShaderBindingTable.buffer);
|
raygenShaderSbtEntry.deviceAddress = getBufferDeviceAddress(raygenShaderBindingTable.buffer);
|
||||||
raygenShaderSbtEntry.stride = rayTracingPipelineProperties.shaderGroupHandleSize;
|
raygenShaderSbtEntry.stride = handleSizeAligned;
|
||||||
raygenShaderSbtEntry.size = rayTracingPipelineProperties.shaderGroupHandleSize;
|
raygenShaderSbtEntry.size = handleSizeAligned;
|
||||||
|
|
||||||
VkStridedDeviceAddressRegionKHR missShaderSbtEntry{};
|
VkStridedDeviceAddressRegionKHR missShaderSbtEntry{};
|
||||||
missShaderSbtEntry.deviceAddress = getBufferDeviceAddress(missShaderBindingTable.buffer);
|
missShaderSbtEntry.deviceAddress = getBufferDeviceAddress(missShaderBindingTable.buffer);
|
||||||
missShaderSbtEntry.stride = rayTracingPipelineProperties.shaderGroupHandleSize;
|
missShaderSbtEntry.stride = handleSizeAligned;
|
||||||
missShaderSbtEntry.size = rayTracingPipelineProperties.shaderGroupHandleSize;
|
missShaderSbtEntry.size = handleSizeAligned;
|
||||||
|
|
||||||
VkStridedDeviceAddressRegionKHR hitShaderSbtEntry{};
|
VkStridedDeviceAddressRegionKHR hitShaderSbtEntry{};
|
||||||
hitShaderSbtEntry.deviceAddress = getBufferDeviceAddress(hitShaderBindingTable.buffer);
|
hitShaderSbtEntry.deviceAddress = getBufferDeviceAddress(hitShaderBindingTable.buffer);
|
||||||
hitShaderSbtEntry.stride = rayTracingPipelineProperties.shaderGroupHandleSize;
|
hitShaderSbtEntry.stride = handleSizeAligned;
|
||||||
hitShaderSbtEntry.size = rayTracingPipelineProperties.shaderGroupHandleSize;
|
hitShaderSbtEntry.size = handleSizeAligned;
|
||||||
|
|
||||||
VkStridedDeviceAddressRegionKHR callableShaderSbtEntry{};
|
VkStridedDeviceAddressRegionKHR callableShaderSbtEntry{};
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -337,9 +337,9 @@ public:
|
||||||
*/
|
*/
|
||||||
void createShaderBindingTables() {
|
void createShaderBindingTables() {
|
||||||
const uint32_t handleSize = rayTracingPipelineProperties.shaderGroupHandleSize;
|
const uint32_t handleSize = rayTracingPipelineProperties.shaderGroupHandleSize;
|
||||||
const uint32_t handleAlignment = rayTracingPipelineProperties.shaderGroupHandleAlignment;
|
const uint32_t handleSizeAligned = vks::tools::alignedSize(rayTracingPipelineProperties.shaderGroupHandleSize, rayTracingPipelineProperties.shaderGroupHandleAlignment);
|
||||||
const uint32_t groupCount = 3 + objectCount;
|
const uint32_t groupCount = static_cast<uint32_t>(shaderGroups.size());
|
||||||
const uint32_t sbtSize = handleSize * groupCount;
|
const uint32_t sbtSize = groupCount * handleSizeAligned;
|
||||||
|
|
||||||
std::vector<uint8_t> shaderHandleStorage(sbtSize);
|
std::vector<uint8_t> shaderHandleStorage(sbtSize);
|
||||||
VK_CHECK_RESULT(vkGetRayTracingShaderGroupHandlesKHR(device, pipeline, 0, groupCount, sbtSize, shaderHandleStorage.data()));
|
VK_CHECK_RESULT(vkGetRayTracingShaderGroupHandlesKHR(device, pipeline, 0, groupCount, sbtSize, shaderHandleStorage.data()));
|
||||||
|
|
@ -352,9 +352,9 @@ public:
|
||||||
|
|
||||||
// Copy handles
|
// Copy handles
|
||||||
memcpy(shaderBindingTables.raygen.mapped, shaderHandleStorage.data(), handleSize);
|
memcpy(shaderBindingTables.raygen.mapped, shaderHandleStorage.data(), handleSize);
|
||||||
memcpy(shaderBindingTables.miss.mapped, shaderHandleStorage.data() + handleAlignment, handleSize);
|
memcpy(shaderBindingTables.miss.mapped, shaderHandleStorage.data() + handleSizeAligned, handleSize);
|
||||||
memcpy(shaderBindingTables.hit.mapped, shaderHandleStorage.data() + handleAlignment * 2, handleSize);
|
memcpy(shaderBindingTables.hit.mapped, shaderHandleStorage.data() + handleSizeAligned * 2, handleSize);
|
||||||
memcpy(shaderBindingTables.callable.mapped, shaderHandleStorage.data() + handleAlignment * 3, handleSize * 3);
|
memcpy(shaderBindingTables.callable.mapped, shaderHandleStorage.data() + handleSizeAligned * 3, handleSize * 3);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
||||||
|
|
@ -279,9 +279,9 @@ public:
|
||||||
*/
|
*/
|
||||||
void createShaderBindingTables() {
|
void createShaderBindingTables() {
|
||||||
const uint32_t handleSize = rayTracingPipelineProperties.shaderGroupHandleSize;
|
const uint32_t handleSize = rayTracingPipelineProperties.shaderGroupHandleSize;
|
||||||
const uint32_t handleAlignment = rayTracingPipelineProperties.shaderGroupHandleAlignment;
|
const uint32_t handleSizeAligned = vks::tools::alignedSize(rayTracingPipelineProperties.shaderGroupHandleSize, rayTracingPipelineProperties.shaderGroupHandleAlignment);
|
||||||
const uint32_t groupCount = static_cast<uint32_t>(shaderGroups.size());
|
const uint32_t groupCount = static_cast<uint32_t>(shaderGroups.size());
|
||||||
const uint32_t sbtSize = handleSize * groupCount;
|
const uint32_t sbtSize = groupCount * handleSizeAligned;
|
||||||
|
|
||||||
std::vector<uint8_t> shaderHandleStorage(sbtSize);
|
std::vector<uint8_t> shaderHandleStorage(sbtSize);
|
||||||
VK_CHECK_RESULT(vkGetRayTracingShaderGroupHandlesKHR(device, pipeline, 0, groupCount, sbtSize, shaderHandleStorage.data()));
|
VK_CHECK_RESULT(vkGetRayTracingShaderGroupHandlesKHR(device, pipeline, 0, groupCount, sbtSize, shaderHandleStorage.data()));
|
||||||
|
|
@ -292,8 +292,8 @@ public:
|
||||||
|
|
||||||
// Copy handles
|
// Copy handles
|
||||||
memcpy(shaderBindingTables.raygen.mapped, shaderHandleStorage.data(), handleSize);
|
memcpy(shaderBindingTables.raygen.mapped, shaderHandleStorage.data(), handleSize);
|
||||||
memcpy(shaderBindingTables.miss.mapped, shaderHandleStorage.data() + handleAlignment, handleSize);
|
memcpy(shaderBindingTables.miss.mapped, shaderHandleStorage.data() + handleSizeAligned, handleSize);
|
||||||
memcpy(shaderBindingTables.hit.mapped, shaderHandleStorage.data() + handleAlignment * 2, handleSize);
|
memcpy(shaderBindingTables.hit.mapped, shaderHandleStorage.data() + handleSizeAligned * 2, handleSize);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
||||||
|
|
@ -282,9 +282,9 @@ public:
|
||||||
*/
|
*/
|
||||||
void createShaderBindingTables() {
|
void createShaderBindingTables() {
|
||||||
const uint32_t handleSize = rayTracingPipelineProperties.shaderGroupHandleSize;
|
const uint32_t handleSize = rayTracingPipelineProperties.shaderGroupHandleSize;
|
||||||
const uint32_t handleAlignment = rayTracingPipelineProperties.shaderGroupHandleAlignment;
|
const uint32_t handleSizeAligned = vks::tools::alignedSize(rayTracingPipelineProperties.shaderGroupHandleSize, rayTracingPipelineProperties.shaderGroupHandleAlignment);
|
||||||
const uint32_t groupCount = static_cast<uint32_t>(shaderGroups.size());
|
const uint32_t groupCount = static_cast<uint32_t>(shaderGroups.size());
|
||||||
const uint32_t sbtSize = handleSize * groupCount;
|
const uint32_t sbtSize = groupCount * handleSizeAligned;
|
||||||
|
|
||||||
std::vector<uint8_t> shaderHandleStorage(sbtSize);
|
std::vector<uint8_t> shaderHandleStorage(sbtSize);
|
||||||
VK_CHECK_RESULT(vkGetRayTracingShaderGroupHandlesKHR(device, pipeline, 0, groupCount, sbtSize, shaderHandleStorage.data()));
|
VK_CHECK_RESULT(vkGetRayTracingShaderGroupHandlesKHR(device, pipeline, 0, groupCount, sbtSize, shaderHandleStorage.data()));
|
||||||
|
|
@ -297,8 +297,8 @@ public:
|
||||||
// Copy handles
|
// Copy handles
|
||||||
memcpy(shaderBindingTables.raygen.mapped, shaderHandleStorage.data(), handleSize);
|
memcpy(shaderBindingTables.raygen.mapped, shaderHandleStorage.data(), handleSize);
|
||||||
// We are using two miss shaders, so we need to get two handles for the miss shader binding table
|
// We are using two miss shaders, so we need to get two handles for the miss shader binding table
|
||||||
memcpy(shaderBindingTables.miss.mapped, shaderHandleStorage.data() + handleAlignment, handleSize * 2);
|
memcpy(shaderBindingTables.miss.mapped, shaderHandleStorage.data() + handleSizeAligned, handleSize * 2);
|
||||||
memcpy(shaderBindingTables.hit.mapped, shaderHandleStorage.data() + handleAlignment * 3, handleSize);
|
memcpy(shaderBindingTables.hit.mapped, shaderHandleStorage.data() + handleSizeAligned * 3, handleSize);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue