diff --git a/base/VulkanRaytracingSample.cpp b/base/VulkanRaytracingSample.cpp index bea1e67a..d4595224 100644 --- a/base/VulkanRaytracingSample.cpp +++ b/base/VulkanRaytracingSample.cpp @@ -205,10 +205,11 @@ void VulkanRaytracingSample::prepare() VkStridedDeviceAddressRegionKHR VulkanRaytracingSample::getSbtEntryStridedDeviceAddressRegion(VkBuffer buffer, uint32_t handleCount) { + const uint32_t handleSizeAligned = vks::tools::alignedSize(rayTracingPipelineProperties.shaderGroupHandleSize, rayTracingPipelineProperties.shaderGroupHandleAlignment); VkStridedDeviceAddressRegionKHR stridedDeviceAddressRegionKHR{}; stridedDeviceAddressRegionKHR.deviceAddress = getBufferDeviceAddress(buffer); - stridedDeviceAddressRegionKHR.stride = rayTracingPipelineProperties.shaderGroupHandleSize; - stridedDeviceAddressRegionKHR.size = rayTracingPipelineProperties.shaderGroupHandleSize * handleCount; + stridedDeviceAddressRegionKHR.stride = handleSizeAligned; + stridedDeviceAddressRegionKHR.size = handleCount * handleSizeAligned; return stridedDeviceAddressRegionKHR; } diff --git a/base/VulkanTools.cpp b/base/VulkanTools.cpp index cd4c9977..387991e5 100644 --- a/base/VulkanTools.cpp +++ b/base/VulkanTools.cpp @@ -378,5 +378,11 @@ namespace vks std::ifstream f(filename.c_str()); return !f.fail(); } + + uint32_t alignedSize(uint32_t value, uint32_t alignment) + { + return (value + alignment - 1) & ~(alignment - 1); + } + } } \ No newline at end of file diff --git a/base/VulkanTools.h b/base/VulkanTools.h index dd9aff69..d392e401 100644 --- a/base/VulkanTools.h +++ b/base/VulkanTools.h @@ -125,5 +125,7 @@ namespace vks /** @brief Checks if a file exists */ bool fileExists(const std::string &filename); + + uint32_t alignedSize(uint32_t value, uint32_t alignment); } } diff --git a/examples/raytracingbasic/raytracingbasic.cpp b/examples/raytracingbasic/raytracingbasic.cpp index aa7c6397..621923c1 100644 --- a/examples/raytracingbasic/raytracingbasic.cpp +++ b/examples/raytracingbasic/raytracingbasic.cpp @@ -539,9 +539,9 @@ public: */ void createShaderBindingTable() { 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(shaderGroups.size()); - const uint32_t sbtSize = handleSize * groupCount; + const uint32_t sbtSize = groupCount * handleSizeAligned; std::vector shaderHandleStorage(sbtSize); VK_CHECK_RESULT(vkGetRayTracingShaderGroupHandlesKHR(device, pipeline, 0, groupCount, sbtSize, shaderHandleStorage.data())); @@ -557,8 +557,8 @@ public: missShaderBindingTable.map(); hitShaderBindingTable.map(); memcpy(raygenShaderBindingTable.mapped, shaderHandleStorage.data(), handleSize); - memcpy(missShaderBindingTable.mapped, shaderHandleStorage.data() + handleAlignment, handleSize); - memcpy(hitShaderBindingTable.mapped, shaderHandleStorage.data() + handleAlignment * 2, handleSize); + memcpy(missShaderBindingTable.mapped, shaderHandleStorage.data() + handleSizeAligned, 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 */ + const uint32_t handleSizeAligned = vks::tools::alignedSize(rayTracingPipelineProperties.shaderGroupHandleSize, rayTracingPipelineProperties.shaderGroupHandleAlignment); + VkStridedDeviceAddressRegionKHR raygenShaderSbtEntry{}; raygenShaderSbtEntry.deviceAddress = getBufferDeviceAddress(raygenShaderBindingTable.buffer); - raygenShaderSbtEntry.stride = rayTracingPipelineProperties.shaderGroupHandleSize; - raygenShaderSbtEntry.size = rayTracingPipelineProperties.shaderGroupHandleSize; + raygenShaderSbtEntry.stride = handleSizeAligned; + raygenShaderSbtEntry.size = handleSizeAligned; VkStridedDeviceAddressRegionKHR missShaderSbtEntry{}; missShaderSbtEntry.deviceAddress = getBufferDeviceAddress(missShaderBindingTable.buffer); - missShaderSbtEntry.stride = rayTracingPipelineProperties.shaderGroupHandleSize; - missShaderSbtEntry.size = rayTracingPipelineProperties.shaderGroupHandleSize; + missShaderSbtEntry.stride = handleSizeAligned; + missShaderSbtEntry.size = handleSizeAligned; VkStridedDeviceAddressRegionKHR hitShaderSbtEntry{}; hitShaderSbtEntry.deviceAddress = getBufferDeviceAddress(hitShaderBindingTable.buffer); - hitShaderSbtEntry.stride = rayTracingPipelineProperties.shaderGroupHandleSize; - hitShaderSbtEntry.size = rayTracingPipelineProperties.shaderGroupHandleSize; + hitShaderSbtEntry.stride = handleSizeAligned; + hitShaderSbtEntry.size = handleSizeAligned; VkStridedDeviceAddressRegionKHR callableShaderSbtEntry{}; diff --git a/examples/raytracingcallable/raytracingcallable.cpp b/examples/raytracingcallable/raytracingcallable.cpp index 83a335cd..26c5a50a 100644 --- a/examples/raytracingcallable/raytracingcallable.cpp +++ b/examples/raytracingcallable/raytracingcallable.cpp @@ -337,9 +337,9 @@ public: */ void createShaderBindingTables() { const uint32_t handleSize = rayTracingPipelineProperties.shaderGroupHandleSize; - const uint32_t handleAlignment = rayTracingPipelineProperties.shaderGroupHandleAlignment; - const uint32_t groupCount = 3 + objectCount; - const uint32_t sbtSize = handleSize * groupCount; + const uint32_t handleSizeAligned = vks::tools::alignedSize(rayTracingPipelineProperties.shaderGroupHandleSize, rayTracingPipelineProperties.shaderGroupHandleAlignment); + const uint32_t groupCount = static_cast(shaderGroups.size()); + const uint32_t sbtSize = groupCount * handleSizeAligned; std::vector shaderHandleStorage(sbtSize); VK_CHECK_RESULT(vkGetRayTracingShaderGroupHandlesKHR(device, pipeline, 0, groupCount, sbtSize, shaderHandleStorage.data())); @@ -352,9 +352,9 @@ public: // Copy handles memcpy(shaderBindingTables.raygen.mapped, shaderHandleStorage.data(), handleSize); - memcpy(shaderBindingTables.miss.mapped, shaderHandleStorage.data() + handleAlignment, handleSize); - memcpy(shaderBindingTables.hit.mapped, shaderHandleStorage.data() + handleAlignment * 2, handleSize); - memcpy(shaderBindingTables.callable.mapped, shaderHandleStorage.data() + handleAlignment * 3, handleSize * 3); + memcpy(shaderBindingTables.miss.mapped, shaderHandleStorage.data() + handleSizeAligned, handleSize); + memcpy(shaderBindingTables.hit.mapped, shaderHandleStorage.data() + handleSizeAligned * 2, handleSize); + memcpy(shaderBindingTables.callable.mapped, shaderHandleStorage.data() + handleSizeAligned * 3, handleSize * 3); } /* diff --git a/examples/raytracingreflections/raytracingreflections.cpp b/examples/raytracingreflections/raytracingreflections.cpp index 3e4a6eef..4c46dabf 100644 --- a/examples/raytracingreflections/raytracingreflections.cpp +++ b/examples/raytracingreflections/raytracingreflections.cpp @@ -279,9 +279,9 @@ public: */ void createShaderBindingTables() { 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(shaderGroups.size()); - const uint32_t sbtSize = handleSize * groupCount; + const uint32_t sbtSize = groupCount * handleSizeAligned; std::vector shaderHandleStorage(sbtSize); VK_CHECK_RESULT(vkGetRayTracingShaderGroupHandlesKHR(device, pipeline, 0, groupCount, sbtSize, shaderHandleStorage.data())); @@ -292,8 +292,8 @@ public: // Copy handles memcpy(shaderBindingTables.raygen.mapped, shaderHandleStorage.data(), handleSize); - memcpy(shaderBindingTables.miss.mapped, shaderHandleStorage.data() + handleAlignment, handleSize); - memcpy(shaderBindingTables.hit.mapped, shaderHandleStorage.data() + handleAlignment * 2, handleSize); + memcpy(shaderBindingTables.miss.mapped, shaderHandleStorage.data() + handleSizeAligned, handleSize); + memcpy(shaderBindingTables.hit.mapped, shaderHandleStorage.data() + handleSizeAligned * 2, handleSize); } /* diff --git a/examples/raytracingshadows/raytracingshadows.cpp b/examples/raytracingshadows/raytracingshadows.cpp index a3e7df6c..7b7b32fd 100644 --- a/examples/raytracingshadows/raytracingshadows.cpp +++ b/examples/raytracingshadows/raytracingshadows.cpp @@ -282,9 +282,9 @@ public: */ void createShaderBindingTables() { 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(shaderGroups.size()); - const uint32_t sbtSize = handleSize * groupCount; + const uint32_t sbtSize = groupCount * handleSizeAligned; std::vector shaderHandleStorage(sbtSize); VK_CHECK_RESULT(vkGetRayTracingShaderGroupHandlesKHR(device, pipeline, 0, groupCount, sbtSize, shaderHandleStorage.data())); @@ -297,8 +297,8 @@ public: // Copy handles 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 - memcpy(shaderBindingTables.miss.mapped, shaderHandleStorage.data() + handleAlignment, handleSize * 2); - memcpy(shaderBindingTables.hit.mapped, shaderHandleStorage.data() + handleAlignment * 3, handleSize); + memcpy(shaderBindingTables.miss.mapped, shaderHandleStorage.data() + handleSizeAligned, handleSize * 2); + memcpy(shaderBindingTables.hit.mapped, shaderHandleStorage.data() + handleSizeAligned * 3, handleSize); } /*