From c200bc72fdfbba21b97dae62916d899c5736effe Mon Sep 17 00:00:00 2001 From: marz Date: Wed, 19 Jan 2022 08:53:22 +0100 Subject: [PATCH] VK_KHR_ray_tracing_maintenance1 test plan Tests for the new VkTraceRaysIndirectCommand2KHR New tests: dEQP-VK.ray_tracing_pipeline.trace_rays_cmds_maintenance_1.* Components: Vulkan VK-GL-CTS issue: 3242 Change-Id: I209b9b1492cefc61958f38004e88cfcf57e1992c --- .../vk-master-2021-03-01/ray-tracing-pipeline.txt | 20 +++ .../cts/master/vk-master/ray-tracing-pipeline.txt | 20 +++ .../vulkan/ray_tracing/vktRayTracingTests.cpp | 1 + .../ray_tracing/vktRayTracingTraceRaysTests.cpp | 195 ++++++++++++++++++--- .../ray_tracing/vktRayTracingTraceRaysTests.hpp | 1 + .../master/vk-default/ray-tracing-pipeline.txt | 20 +++ 6 files changed, 237 insertions(+), 20 deletions(-) diff --git a/android/cts/master/vk-master-2021-03-01/ray-tracing-pipeline.txt b/android/cts/master/vk-master-2021-03-01/ray-tracing-pipeline.txt index 7335a73..107675e 100644 --- a/android/cts/master/vk-master-2021-03-01/ray-tracing-pipeline.txt +++ b/android/cts/master/vk-master-2021-03-01/ray-tracing-pipeline.txt @@ -1310,6 +1310,26 @@ dEQP-VK.ray_tracing_pipeline.trace_rays_cmds.indirect_gpu.8_8_8 dEQP-VK.ray_tracing_pipeline.trace_rays_cmds.indirect_gpu.11_1_1 dEQP-VK.ray_tracing_pipeline.trace_rays_cmds.indirect_gpu.11_13_1 dEQP-VK.ray_tracing_pipeline.trace_rays_cmds.indirect_gpu.11_13_5 +dEQP-VK.ray_tracing_pipeline.trace_rays_cmds_maintenance_1.indirect2_cpu.0_0_0 +dEQP-VK.ray_tracing_pipeline.trace_rays_cmds_maintenance_1.indirect2_cpu.0_1_1 +dEQP-VK.ray_tracing_pipeline.trace_rays_cmds_maintenance_1.indirect2_cpu.1_0_1 +dEQP-VK.ray_tracing_pipeline.trace_rays_cmds_maintenance_1.indirect2_cpu.1_1_0 +dEQP-VK.ray_tracing_pipeline.trace_rays_cmds_maintenance_1.indirect2_cpu.8_1_1 +dEQP-VK.ray_tracing_pipeline.trace_rays_cmds_maintenance_1.indirect2_cpu.8_8_1 +dEQP-VK.ray_tracing_pipeline.trace_rays_cmds_maintenance_1.indirect2_cpu.8_8_8 +dEQP-VK.ray_tracing_pipeline.trace_rays_cmds_maintenance_1.indirect2_cpu.11_1_1 +dEQP-VK.ray_tracing_pipeline.trace_rays_cmds_maintenance_1.indirect2_cpu.11_13_1 +dEQP-VK.ray_tracing_pipeline.trace_rays_cmds_maintenance_1.indirect2_cpu.11_13_5 +dEQP-VK.ray_tracing_pipeline.trace_rays_cmds_maintenance_1.indirect2_gpu.0_0_0 +dEQP-VK.ray_tracing_pipeline.trace_rays_cmds_maintenance_1.indirect2_gpu.0_1_1 +dEQP-VK.ray_tracing_pipeline.trace_rays_cmds_maintenance_1.indirect2_gpu.1_0_1 +dEQP-VK.ray_tracing_pipeline.trace_rays_cmds_maintenance_1.indirect2_gpu.1_1_0 +dEQP-VK.ray_tracing_pipeline.trace_rays_cmds_maintenance_1.indirect2_gpu.8_1_1 +dEQP-VK.ray_tracing_pipeline.trace_rays_cmds_maintenance_1.indirect2_gpu.8_8_1 +dEQP-VK.ray_tracing_pipeline.trace_rays_cmds_maintenance_1.indirect2_gpu.8_8_8 +dEQP-VK.ray_tracing_pipeline.trace_rays_cmds_maintenance_1.indirect2_gpu.11_1_1 +dEQP-VK.ray_tracing_pipeline.trace_rays_cmds_maintenance_1.indirect2_gpu.11_13_1 +dEQP-VK.ray_tracing_pipeline.trace_rays_cmds_maintenance_1.indirect2_gpu.11_13_5 dEQP-VK.ray_tracing_pipeline.shader_binding_table.indexing_hit.sbt_offset_0.no_shaderrecord.0_0 dEQP-VK.ray_tracing_pipeline.shader_binding_table.indexing_hit.sbt_offset_0.no_shaderrecord.0_1 dEQP-VK.ray_tracing_pipeline.shader_binding_table.indexing_hit.sbt_offset_0.no_shaderrecord.0_2 diff --git a/android/cts/master/vk-master/ray-tracing-pipeline.txt b/android/cts/master/vk-master/ray-tracing-pipeline.txt index 7335a73..107675e 100644 --- a/android/cts/master/vk-master/ray-tracing-pipeline.txt +++ b/android/cts/master/vk-master/ray-tracing-pipeline.txt @@ -1310,6 +1310,26 @@ dEQP-VK.ray_tracing_pipeline.trace_rays_cmds.indirect_gpu.8_8_8 dEQP-VK.ray_tracing_pipeline.trace_rays_cmds.indirect_gpu.11_1_1 dEQP-VK.ray_tracing_pipeline.trace_rays_cmds.indirect_gpu.11_13_1 dEQP-VK.ray_tracing_pipeline.trace_rays_cmds.indirect_gpu.11_13_5 +dEQP-VK.ray_tracing_pipeline.trace_rays_cmds_maintenance_1.indirect2_cpu.0_0_0 +dEQP-VK.ray_tracing_pipeline.trace_rays_cmds_maintenance_1.indirect2_cpu.0_1_1 +dEQP-VK.ray_tracing_pipeline.trace_rays_cmds_maintenance_1.indirect2_cpu.1_0_1 +dEQP-VK.ray_tracing_pipeline.trace_rays_cmds_maintenance_1.indirect2_cpu.1_1_0 +dEQP-VK.ray_tracing_pipeline.trace_rays_cmds_maintenance_1.indirect2_cpu.8_1_1 +dEQP-VK.ray_tracing_pipeline.trace_rays_cmds_maintenance_1.indirect2_cpu.8_8_1 +dEQP-VK.ray_tracing_pipeline.trace_rays_cmds_maintenance_1.indirect2_cpu.8_8_8 +dEQP-VK.ray_tracing_pipeline.trace_rays_cmds_maintenance_1.indirect2_cpu.11_1_1 +dEQP-VK.ray_tracing_pipeline.trace_rays_cmds_maintenance_1.indirect2_cpu.11_13_1 +dEQP-VK.ray_tracing_pipeline.trace_rays_cmds_maintenance_1.indirect2_cpu.11_13_5 +dEQP-VK.ray_tracing_pipeline.trace_rays_cmds_maintenance_1.indirect2_gpu.0_0_0 +dEQP-VK.ray_tracing_pipeline.trace_rays_cmds_maintenance_1.indirect2_gpu.0_1_1 +dEQP-VK.ray_tracing_pipeline.trace_rays_cmds_maintenance_1.indirect2_gpu.1_0_1 +dEQP-VK.ray_tracing_pipeline.trace_rays_cmds_maintenance_1.indirect2_gpu.1_1_0 +dEQP-VK.ray_tracing_pipeline.trace_rays_cmds_maintenance_1.indirect2_gpu.8_1_1 +dEQP-VK.ray_tracing_pipeline.trace_rays_cmds_maintenance_1.indirect2_gpu.8_8_1 +dEQP-VK.ray_tracing_pipeline.trace_rays_cmds_maintenance_1.indirect2_gpu.8_8_8 +dEQP-VK.ray_tracing_pipeline.trace_rays_cmds_maintenance_1.indirect2_gpu.11_1_1 +dEQP-VK.ray_tracing_pipeline.trace_rays_cmds_maintenance_1.indirect2_gpu.11_13_1 +dEQP-VK.ray_tracing_pipeline.trace_rays_cmds_maintenance_1.indirect2_gpu.11_13_5 dEQP-VK.ray_tracing_pipeline.shader_binding_table.indexing_hit.sbt_offset_0.no_shaderrecord.0_0 dEQP-VK.ray_tracing_pipeline.shader_binding_table.indexing_hit.sbt_offset_0.no_shaderrecord.0_1 dEQP-VK.ray_tracing_pipeline.shader_binding_table.indexing_hit.sbt_offset_0.no_shaderrecord.0_2 diff --git a/external/vulkancts/modules/vulkan/ray_tracing/vktRayTracingTests.cpp b/external/vulkancts/modules/vulkan/ray_tracing/vktRayTracingTests.cpp index 7e20fd8..d96054e 100644 --- a/external/vulkancts/modules/vulkan/ray_tracing/vktRayTracingTests.cpp +++ b/external/vulkancts/modules/vulkan/ray_tracing/vktRayTracingTests.cpp @@ -64,6 +64,7 @@ tcu::TestCaseGroup* createTests (tcu::TestContext& testCtx) group->addChild(createBuildTests(testCtx)); group->addChild(createCallableShadersTests(testCtx)); group->addChild(createTraceRaysTests(testCtx)); + group->addChild(createTraceRaysMaintenance1Tests(testCtx)); group->addChild(createShaderBindingTableTests(testCtx)); group->addChild(createTraversalControlTests(testCtx)); group->addChild(createAccelerationStructuresTests(testCtx)); diff --git a/external/vulkancts/modules/vulkan/ray_tracing/vktRayTracingTraceRaysTests.cpp b/external/vulkancts/modules/vulkan/ray_tracing/vktRayTracingTraceRaysTests.cpp index 75743ee..a4e0d3b 100644 --- a/external/vulkancts/modules/vulkan/ray_tracing/vktRayTracingTraceRaysTests.cpp +++ b/external/vulkancts/modules/vulkan/ray_tracing/vktRayTracingTraceRaysTests.cpp @@ -62,12 +62,16 @@ enum class TraceType DIRECT = 0, INDIRECT_CPU = 1, INDIRECT_GPU = 2, + INDIRECT2_GPU = 3, + INDIRECT2_CPU = 4, }; struct TestParams { TraceType traceType; VkTraceRaysIndirectCommandKHR traceDimensions; // Note: to be used for both direct and indirect variants. + bool useKhrMaintenance1Semantics; + VkTraceRaysIndirectCommand2KHR extendedTraceDimensions; }; deUint32 getShaderGroupSize (const InstanceInterface& vki, @@ -88,12 +92,14 @@ deUint32 getShaderGroupBaseAlignment (const InstanceInterface& vki, return rayTracingPropertiesKHR->getShaderGroupBaseAlignment(); } -bool isNullTrace (const VkTraceRaysIndirectCommandKHR& cmd) +template +bool isNullTrace (const T cmd) { return (cmd.width == 0u || cmd.height == 0u || cmd.depth == 0u); } -VkExtent3D getImageExtent (const VkTraceRaysIndirectCommandKHR& cmd) +template +VkExtent3D getImageExtent (const T cmd) { return (isNullTrace(cmd) ? makeExtent3D(8u, 8u, 1u) : makeExtent3D(cmd.width, cmd.height, cmd.depth)); } @@ -149,7 +155,7 @@ protected: de::MovePtr runTest (); private: TestParams m_data; - const VkExtent3D m_imageExtent; + VkExtent3D m_imageExtent; }; @@ -175,6 +181,16 @@ void RayTracingTraceRaysIndirectTestCase::checkSupport(Context& context) const if (rayTracingPipelineFeaturesKHR.rayTracingPipelineTraceRaysIndirect == DE_FALSE) TCU_THROW(NotSupportedError, "Requires VkPhysicalDeviceRayTracingPipelineFeaturesKHR.rayTracingPipelineTraceRaysIndirect"); + if (m_data.useKhrMaintenance1Semantics) { + context.requireDeviceFunctionality("VK_KHR_ray_tracing_maintenance1"); + + const VkPhysicalDeviceFeatures deviceFeatures = getPhysicalDeviceFeatures(context.getInstanceInterface(), context.getPhysicalDevice()); + if (!deviceFeatures.shaderInt64) + { + TCU_THROW(NotSupportedError, "Device feature shaderInt64 is not supported"); + } + } + const VkPhysicalDeviceAccelerationStructureFeaturesKHR& accelerationStructureFeaturesKHR = context.getAccelerationStructureFeatures(); if (accelerationStructureFeaturesKHR.accelerationStructure == DE_FALSE) TCU_THROW(TestError, "VK_KHR_ray_tracing_pipeline requires VkPhysicalDeviceAccelerationStructureFeaturesKHR.accelerationStructure"); @@ -187,8 +203,25 @@ void RayTracingTraceRaysIndirectTestCase::initPrograms (SourceCollections& progr std::stringstream css; css << "#version 460 core\n" + << (m_data.useKhrMaintenance1Semantics ? "#extension GL_ARB_gpu_shader_int64: enable\n" : "\n") << "struct TraceRaysIndirectCommand\n" - "{\n" + "{\n"; + if (m_data.useKhrMaintenance1Semantics) + { + css << + " uint64_t raygenShaderRecordAddress;\n" + " uint64_t raygenShaderRecordSize;\n" + " uint64_t missShaderBindingTableAddress;\n" + " uint64_t missShaderBindingTableSize;\n" + " uint64_t missShaderBindingTableStride;\n" + " uint64_t hitShaderBindingTableAddress;\n" + " uint64_t hitShaderBindingTableSize;\n" + " uint64_t hitShaderBindingTableStride;\n" + " uint64_t callableShaderBindingTableAddress;\n" + " uint64_t callableShaderBindingTableSize;\n" + " uint64_t callableShaderBindingTableStride;\n"; + } + css << " uint width;\n" " uint height;\n" " uint depth;\n" @@ -202,7 +235,23 @@ void RayTracingTraceRaysIndirectTestCase::initPrograms (SourceCollections& progr " TraceRaysIndirectCommand indirectCommands;\n" "};\n" "void main()\n" - "{\n" + "{\n"; + if (m_data.useKhrMaintenance1Semantics) + { + css << + " indirectCommands.raygenShaderRecordAddress = ubo.indirectCommands.raygenShaderRecordAddress;\n" + " indirectCommands.raygenShaderRecordSize = ubo.indirectCommands.raygenShaderRecordSize;\n" + " indirectCommands.missShaderBindingTableAddress = ubo.indirectCommands.missShaderBindingTableAddress;\n" + " indirectCommands.missShaderBindingTableSize = ubo.indirectCommands.missShaderBindingTableSize;\n" + " indirectCommands.missShaderBindingTableStride = ubo.indirectCommands.missShaderBindingTableStride;\n" + " indirectCommands.hitShaderBindingTableAddress = ubo.indirectCommands.hitShaderBindingTableAddress;\n" + " indirectCommands.hitShaderBindingTableSize = ubo.indirectCommands.hitShaderBindingTableSize;\n" + " indirectCommands.hitShaderBindingTableStride = ubo.indirectCommands.hitShaderBindingTableStride;\n" + " indirectCommands.callableShaderBindingTableAddress = ubo.indirectCommands.callableShaderBindingTableAddress;\n" + " indirectCommands.callableShaderBindingTableSize = ubo.indirectCommands.callableShaderBindingTableSize;\n" + " indirectCommands.callableShaderBindingTableStride = ubo.indirectCommands.callableShaderBindingTableStride;\n"; + } + css << " indirectCommands.width = ubo.indirectCommands.width;\n" " indirectCommands.height = ubo.indirectCommands.height;\n" " indirectCommands.depth = ubo.indirectCommands.depth;\n" @@ -269,8 +318,8 @@ TestInstance* RayTracingTraceRaysIndirectTestCase::createInstance (Context& cont RayTracingTraceRaysIndirectTestInstance::RayTracingTraceRaysIndirectTestInstance (Context& context, const TestParams& data) : vkt::TestInstance (context) , m_data (data) - , m_imageExtent (getImageExtent(data.traceDimensions)) { + m_imageExtent = data.useKhrMaintenance1Semantics ? getImageExtent(data.extendedTraceDimensions) : getImageExtent(data.traceDimensions); } RayTracingTraceRaysIndirectTestInstance::~RayTracingTraceRaysIndirectTestInstance (void) @@ -363,7 +412,7 @@ de::MovePtr RayTracingTraceRaysIndirectTestInstance::runTest() Move computeShader; Move computePipeline; - if (m_data.traceType == TraceType::INDIRECT_GPU) + if (m_data.traceType == TraceType::INDIRECT_GPU || m_data.traceType == TraceType::INDIRECT2_GPU) { computeDescriptorSetLayout = DescriptorSetLayoutBuilder() .addSingleBinding(VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, VK_SHADER_STAGE_COMPUTE_BIT) @@ -444,19 +493,33 @@ de::MovePtr RayTracingTraceRaysIndirectTestInstance::runTest() de::MovePtr indirectBuffer; de::MovePtr uniformBuffer; + // Update trace details according to VK_KHR_ray_tracing_maintenance1 semantics + m_data.extendedTraceDimensions.raygenShaderRecordAddress = raygenShaderBindingTableRegion.deviceAddress; + m_data.extendedTraceDimensions.raygenShaderRecordSize = raygenShaderBindingTableRegion.size; + m_data.extendedTraceDimensions.missShaderBindingTableAddress = missShaderBindingTableRegion.deviceAddress; + m_data.extendedTraceDimensions.missShaderBindingTableSize = missShaderBindingTableRegion.size; + m_data.extendedTraceDimensions.missShaderBindingTableStride = missShaderBindingTableRegion.stride; + m_data.extendedTraceDimensions.hitShaderBindingTableAddress = hitShaderBindingTableRegion.deviceAddress; + m_data.extendedTraceDimensions.hitShaderBindingTableSize = hitShaderBindingTableRegion.size; + m_data.extendedTraceDimensions.hitShaderBindingTableStride = hitShaderBindingTableRegion.stride; + m_data.extendedTraceDimensions.callableShaderBindingTableAddress = callableShaderBindingTableRegion.deviceAddress; + m_data.extendedTraceDimensions.callableShaderBindingTableSize = callableShaderBindingTableRegion.size; + m_data.extendedTraceDimensions.callableShaderBindingTableStride = callableShaderBindingTableRegion.stride; + if (m_data.traceType != TraceType::DIRECT) { - const bool indirectGpu = (m_data.traceType == TraceType::INDIRECT_GPU); - VkBufferUsageFlags indirectBufferUsageFlags = VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT | VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT | ( indirectGpu ? VK_BUFFER_USAGE_STORAGE_BUFFER_BIT : VK_BUFFER_USAGE_TRANSFER_DST_BIT ); - const VkBufferCreateInfo indirectBufferCreateInfo = makeBufferCreateInfo(sizeof(VkTraceRaysIndirectCommandKHR), indirectBufferUsageFlags); - vk::MemoryRequirement indirectBufferMemoryRequirement = MemoryRequirement::DeviceAddress | ( indirectGpu ? MemoryRequirement::Any : MemoryRequirement::HostVisible ); - indirectBuffer = de::MovePtr(new BufferWithMemory(vkd, device, allocator, indirectBufferCreateInfo, indirectBufferMemoryRequirement)); + const bool indirectGpu = (m_data.traceType == TraceType::INDIRECT_GPU || m_data.traceType == TraceType::INDIRECT2_GPU); + VkDeviceSize bufferSize = m_data.useKhrMaintenance1Semantics ? sizeof(VkTraceRaysIndirectCommand2KHR) : sizeof(VkTraceRaysIndirectCommandKHR); + VkBufferUsageFlags indirectBufferUsageFlags = VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT | VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT | (indirectGpu ? VK_BUFFER_USAGE_STORAGE_BUFFER_BIT : VK_BUFFER_USAGE_TRANSFER_DST_BIT); + const VkBufferCreateInfo indirectBufferCreateInfo = makeBufferCreateInfo(bufferSize, indirectBufferUsageFlags); + vk::MemoryRequirement indirectBufferMemoryRequirement = MemoryRequirement::DeviceAddress | (indirectGpu ? MemoryRequirement::Any : MemoryRequirement::HostVisible); + indirectBuffer = de::MovePtr(new BufferWithMemory(vkd, device, allocator, indirectBufferCreateInfo, indirectBufferMemoryRequirement)); } if (m_data.traceType == TraceType::INDIRECT_GPU) { - const VkBufferCreateInfo uniformBufferCreateInfo = makeBufferCreateInfo(sizeof(VkTraceRaysIndirectCommandKHR), VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT); - uniformBuffer = de::MovePtr(new BufferWithMemory(vkd, device, allocator, uniformBufferCreateInfo, MemoryRequirement::HostVisible)); + const VkBufferCreateInfo uniformBufferCreateInfo = makeBufferCreateInfo(sizeof(VkTraceRaysIndirectCommandKHR), VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT); + uniformBuffer = de::MovePtr(new BufferWithMemory(vkd, device, allocator, uniformBufferCreateInfo, MemoryRequirement::HostVisible)); deMemcpy(uniformBuffer->getAllocation().getHostPtr(), &m_data.traceDimensions, sizeof(VkTraceRaysIndirectCommandKHR)); flushMappedMemoryRange(vkd, device, uniformBuffer->getAllocation().getMemory(), uniformBuffer->getAllocation().getOffset(), VK_WHOLE_SIZE); } @@ -465,6 +528,18 @@ de::MovePtr RayTracingTraceRaysIndirectTestInstance::runTest() deMemcpy(indirectBuffer->getAllocation().getHostPtr(), &m_data.traceDimensions, sizeof(VkTraceRaysIndirectCommandKHR)); flushMappedMemoryRange(vkd, device, indirectBuffer->getAllocation().getMemory(), indirectBuffer->getAllocation().getOffset(), VK_WHOLE_SIZE); } + else if (m_data.traceType == TraceType::INDIRECT2_GPU) + { + const VkBufferCreateInfo uniformBufferCreateInfo = makeBufferCreateInfo(sizeof(VkTraceRaysIndirectCommand2KHR), VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT); + uniformBuffer = de::MovePtr(new BufferWithMemory(vkd, device, allocator, uniformBufferCreateInfo, MemoryRequirement::HostVisible)); + deMemcpy(uniformBuffer->getAllocation().getHostPtr(), &m_data.extendedTraceDimensions, sizeof(VkTraceRaysIndirectCommand2KHR)); + flushMappedMemoryRange(vkd, device, uniformBuffer->getAllocation().getMemory(), uniformBuffer->getAllocation().getOffset(), VK_WHOLE_SIZE); + } + else if (m_data.traceType == TraceType::INDIRECT2_CPU) + { + deMemcpy(indirectBuffer->getAllocation().getHostPtr(), &m_data.extendedTraceDimensions, sizeof(VkTraceRaysIndirectCommand2KHR)); + flushMappedMemoryRange(vkd, device, indirectBuffer->getAllocation().getMemory(), indirectBuffer->getAllocation().getOffset(), VK_WHOLE_SIZE); + } const Move cmdPool = createCommandPool(vkd, device, 0, queueFamilyIndex); const Move cmdBuffer = allocateCommandBuffer(vkd, device, *cmdPool, VK_COMMAND_BUFFER_LEVEL_PRIMARY); @@ -492,8 +567,9 @@ de::MovePtr RayTracingTraceRaysIndirectTestInstance::runTest() if (m_data.traceType == TraceType::INDIRECT_GPU) { - const VkDescriptorBufferInfo uniformBufferDescriptorInfo = makeDescriptorBufferInfo(uniformBuffer->get(), 0ull, sizeof(VkTraceRaysIndirectCommandKHR)); - const VkDescriptorBufferInfo indirectBufferDescriptorInfo = makeDescriptorBufferInfo(indirectBuffer->get(), 0ull, sizeof(VkTraceRaysIndirectCommandKHR)); + const VkDescriptorBufferInfo uniformBufferDescriptorInfo = makeDescriptorBufferInfo(uniformBuffer->get(), 0ull, sizeof(VkTraceRaysIndirectCommandKHR)); + const VkDescriptorBufferInfo indirectBufferDescriptorInfo = makeDescriptorBufferInfo(indirectBuffer->get(), 0ull, sizeof(VkTraceRaysIndirectCommandKHR)); + DescriptorSetUpdateBuilder() .writeSingle(*computeDescriptorSet, DescriptorSetUpdateBuilder::Location::binding(0u), VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, &uniformBufferDescriptorInfo) .writeSingle(*computeDescriptorSet, DescriptorSetUpdateBuilder::Location::binding(1u), VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, &indirectBufferDescriptorInfo) @@ -507,6 +583,25 @@ de::MovePtr RayTracingTraceRaysIndirectTestInstance::runTest() indirectBuffer->get(), 0ull, sizeof(VkTraceRaysIndirectCommandKHR)); cmdPipelineBufferMemoryBarrier(vkd, *cmdBuffer, VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, VK_PIPELINE_STAGE_DRAW_INDIRECT_BIT, &fillIndirectBufferMemoryBarrier); } + else if (m_data.traceType == TraceType::INDIRECT2_GPU) + { + const VkDescriptorBufferInfo uniformBufferDescriptorInfo = makeDescriptorBufferInfo(uniformBuffer->get(), 0ull, sizeof(VkTraceRaysIndirectCommand2KHR)); + const VkDescriptorBufferInfo indirectBufferDescriptorInfo = makeDescriptorBufferInfo(indirectBuffer->get(), 0ull, sizeof(VkTraceRaysIndirectCommand2KHR)); + + DescriptorSetUpdateBuilder() + .writeSingle(*computeDescriptorSet, DescriptorSetUpdateBuilder::Location::binding(0u), VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, &uniformBufferDescriptorInfo) + .writeSingle(*computeDescriptorSet, DescriptorSetUpdateBuilder::Location::binding(1u), VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, &indirectBufferDescriptorInfo) + .update(vkd, device); + + vkd.cmdBindPipeline(*cmdBuffer, VK_PIPELINE_BIND_POINT_COMPUTE, *computePipeline); + vkd.cmdBindDescriptorSets(*cmdBuffer, VK_PIPELINE_BIND_POINT_COMPUTE, *computePipelineLayout, 0u, 1u, &computeDescriptorSet.get(), 0u, DE_NULL); + vkd.cmdDispatch(*cmdBuffer, 1, 1, 1); + + const VkBufferMemoryBarrier fillIndirectBufferMemoryBarrier = makeBufferMemoryBarrier(VK_ACCESS_SHADER_WRITE_BIT, VK_ACCESS_INDIRECT_COMMAND_READ_BIT, + indirectBuffer->get(), 0ull, sizeof(VkTraceRaysIndirectCommand2KHR)); + cmdPipelineBufferMemoryBarrier(vkd, *cmdBuffer, VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, VK_PIPELINE_STAGE_DRAW_INDIRECT_BIT, &fillIndirectBufferMemoryBarrier); + + } const TopLevelAccelerationStructure* topLevelAccelerationStructurePtr = topLevelAccelerationStructure.get(); VkWriteDescriptorSetAccelerationStructureKHR accelerationStructureWriteDescriptorSet = @@ -537,7 +632,7 @@ de::MovePtr RayTracingTraceRaysIndirectTestInstance::runTest() &callableShaderBindingTableRegion, m_data.traceDimensions.width, m_data.traceDimensions.height, m_data.traceDimensions.depth); } - else + else if(m_data.traceType == TraceType::INDIRECT_CPU || m_data.traceType == TraceType::INDIRECT_GPU) { cmdTraceRaysIndirect(vkd, *cmdBuffer, @@ -547,6 +642,12 @@ de::MovePtr RayTracingTraceRaysIndirectTestInstance::runTest() &callableShaderBindingTableRegion, getBufferDeviceAddress(vkd, device, indirectBuffer->get(), 0)); } + else if (m_data.traceType == TraceType::INDIRECT2_CPU || m_data.traceType == TraceType::INDIRECT2_GPU) + { + vkd.cmdTraceRaysIndirect2KHR( + *cmdBuffer, + getBufferDeviceAddress(vkd, device, indirectBuffer->get(), 0)); + } const VkMemoryBarrier postTraceMemoryBarrier = makeMemoryBarrier(VK_ACCESS_SHADER_WRITE_BIT, VK_ACCESS_TRANSFER_READ_BIT); const VkMemoryBarrier postCopyMemoryBarrier = makeMemoryBarrier(VK_ACCESS_TRANSFER_WRITE_BIT, VK_ACCESS_HOST_READ_BIT); @@ -570,7 +671,7 @@ tcu::TestStatus RayTracingTraceRaysIndirectTestInstance::iterate (void) // run test using arrays of pointers const de::MovePtr buffer = runTest(); const deUint32* bufferPtr = (deUint32*)buffer->getAllocation().getHostPtr(); - const bool noWrites = isNullTrace(m_data.traceDimensions); + const bool noWrites = m_data.useKhrMaintenance1Semantics ? isNullTrace(m_data.extendedTraceDimensions) : isNullTrace(m_data.traceDimensions); deUint32 failures = 0; deUint32 pos = 0; @@ -592,7 +693,8 @@ tcu::TestStatus RayTracingTraceRaysIndirectTestInstance::iterate (void) return tcu::TestStatus::fail("Fail (failures=" + de::toString(failures) + ")"); } -std::string makeDimensionsName (const VkTraceRaysIndirectCommandKHR& cmd) +template +std::string makeDimensionsName (const T cmd) { std::ostringstream name; name << cmd.width << "_" << cmd.height << "_" << cmd.depth; @@ -601,7 +703,7 @@ std::string makeDimensionsName (const VkTraceRaysIndirectCommandKHR& cmd) } // anonymous -tcu::TestCaseGroup* createTraceRaysTests(tcu::TestContext& testCtx) +tcu::TestCaseGroup* createTraceRaysTests(tcu::TestContext& testCtx) { de::MovePtr group(new tcu::TestCaseGroup(testCtx, "trace_rays_cmds", "Tests veryfying vkCmdTraceRays* commands")); @@ -640,6 +742,8 @@ tcu::TestCaseGroup* createTraceRaysTests(tcu::TestContext& testCtx) { bufferSourceTypes[bufferSourceNdx].traceType, traceDimensions[traceDimensionsIdx], + false, + {/* Intentionally empty */}, }; const auto testName = makeDimensionsName(traceDimensions[traceDimensionsIdx]); bufferSourceGroup->addChild(new RayTracingTraceRaysIndirectTestCase(group->getTestContext(), testName.c_str(), "", testParams)); @@ -651,6 +755,57 @@ tcu::TestCaseGroup* createTraceRaysTests(tcu::TestContext& testCtx) return group.release(); } +tcu::TestCaseGroup* createTraceRaysMaintenance1Tests(tcu::TestContext& testCtx) +{ + de::MovePtr group(new tcu::TestCaseGroup(testCtx, "trace_rays_cmds_maintenance_1", "Tests veryfying vkCmdTraceRays* commands")); + + struct BufferSourceTypeData + { + TraceType traceType; + const char* name; + } bufferSourceTypes[] = + { + { TraceType::INDIRECT2_CPU, "indirect2_cpu" }, + { TraceType::INDIRECT2_GPU, "indirect2_gpu" }, + }; + + const VkTraceRaysIndirectCommand2KHR extendedTraceDimensions[] = + { + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 1, 1 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 8, 1 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 8, 8 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 1, 1 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 13, 1 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 13, 5 }, + }; + + for (size_t bufferSourceNdx = 0; bufferSourceNdx < DE_LENGTH_OF_ARRAY(bufferSourceTypes); ++bufferSourceNdx) + { + de::MovePtr bufferSourceGroup(new tcu::TestCaseGroup(group->getTestContext(), bufferSourceTypes[bufferSourceNdx].name, "")); + + for (size_t extendedTraceDimensionsIdx = 0; extendedTraceDimensionsIdx < DE_LENGTH_OF_ARRAY(extendedTraceDimensions); ++extendedTraceDimensionsIdx) + { + TestParams testParams + { + bufferSourceTypes[bufferSourceNdx].traceType, + {/* Intentionally empty */}, + true, + extendedTraceDimensions[extendedTraceDimensionsIdx], + }; + const auto testName = makeDimensionsName(extendedTraceDimensions[extendedTraceDimensionsIdx]); + bufferSourceGroup->addChild(new RayTracingTraceRaysIndirectTestCase(group->getTestContext(), testName.c_str(), "", testParams)); + } + + group->addChild(bufferSourceGroup.release()); + } + + return group.release(); +} + } // RayTracing } // vkt diff --git a/external/vulkancts/modules/vulkan/ray_tracing/vktRayTracingTraceRaysTests.hpp b/external/vulkancts/modules/vulkan/ray_tracing/vktRayTracingTraceRaysTests.hpp index 689cf48..d8609a0 100644 --- a/external/vulkancts/modules/vulkan/ray_tracing/vktRayTracingTraceRaysTests.hpp +++ b/external/vulkancts/modules/vulkan/ray_tracing/vktRayTracingTraceRaysTests.hpp @@ -32,6 +32,7 @@ namespace RayTracing { tcu::TestCaseGroup* createTraceRaysTests(tcu::TestContext& testCtx); +tcu::TestCaseGroup* createTraceRaysMaintenance1Tests(tcu::TestContext& testCtx); } // RayTracing } // vkt diff --git a/external/vulkancts/mustpass/master/vk-default/ray-tracing-pipeline.txt b/external/vulkancts/mustpass/master/vk-default/ray-tracing-pipeline.txt index 94d3adc..1c6b388 100644 --- a/external/vulkancts/mustpass/master/vk-default/ray-tracing-pipeline.txt +++ b/external/vulkancts/mustpass/master/vk-default/ray-tracing-pipeline.txt @@ -1280,6 +1280,26 @@ dEQP-VK.ray_tracing_pipeline.trace_rays_cmds.indirect_gpu.8_8_8 dEQP-VK.ray_tracing_pipeline.trace_rays_cmds.indirect_gpu.11_1_1 dEQP-VK.ray_tracing_pipeline.trace_rays_cmds.indirect_gpu.11_13_1 dEQP-VK.ray_tracing_pipeline.trace_rays_cmds.indirect_gpu.11_13_5 +dEQP-VK.ray_tracing_pipeline.trace_rays_cmds_maintenance_1.indirect2_cpu.0_0_0 +dEQP-VK.ray_tracing_pipeline.trace_rays_cmds_maintenance_1.indirect2_cpu.0_1_1 +dEQP-VK.ray_tracing_pipeline.trace_rays_cmds_maintenance_1.indirect2_cpu.1_0_1 +dEQP-VK.ray_tracing_pipeline.trace_rays_cmds_maintenance_1.indirect2_cpu.1_1_0 +dEQP-VK.ray_tracing_pipeline.trace_rays_cmds_maintenance_1.indirect2_cpu.8_1_1 +dEQP-VK.ray_tracing_pipeline.trace_rays_cmds_maintenance_1.indirect2_cpu.8_8_1 +dEQP-VK.ray_tracing_pipeline.trace_rays_cmds_maintenance_1.indirect2_cpu.8_8_8 +dEQP-VK.ray_tracing_pipeline.trace_rays_cmds_maintenance_1.indirect2_cpu.11_1_1 +dEQP-VK.ray_tracing_pipeline.trace_rays_cmds_maintenance_1.indirect2_cpu.11_13_1 +dEQP-VK.ray_tracing_pipeline.trace_rays_cmds_maintenance_1.indirect2_cpu.11_13_5 +dEQP-VK.ray_tracing_pipeline.trace_rays_cmds_maintenance_1.indirect2_gpu.0_0_0 +dEQP-VK.ray_tracing_pipeline.trace_rays_cmds_maintenance_1.indirect2_gpu.0_1_1 +dEQP-VK.ray_tracing_pipeline.trace_rays_cmds_maintenance_1.indirect2_gpu.1_0_1 +dEQP-VK.ray_tracing_pipeline.trace_rays_cmds_maintenance_1.indirect2_gpu.1_1_0 +dEQP-VK.ray_tracing_pipeline.trace_rays_cmds_maintenance_1.indirect2_gpu.8_1_1 +dEQP-VK.ray_tracing_pipeline.trace_rays_cmds_maintenance_1.indirect2_gpu.8_8_1 +dEQP-VK.ray_tracing_pipeline.trace_rays_cmds_maintenance_1.indirect2_gpu.8_8_8 +dEQP-VK.ray_tracing_pipeline.trace_rays_cmds_maintenance_1.indirect2_gpu.11_1_1 +dEQP-VK.ray_tracing_pipeline.trace_rays_cmds_maintenance_1.indirect2_gpu.11_13_1 +dEQP-VK.ray_tracing_pipeline.trace_rays_cmds_maintenance_1.indirect2_gpu.11_13_5 dEQP-VK.ray_tracing_pipeline.shader_binding_table.indexing_hit.sbt_offset_0.no_shaderrecord.0_0 dEQP-VK.ray_tracing_pipeline.shader_binding_table.indexing_hit.sbt_offset_0.no_shaderrecord.0_1 dEQP-VK.ray_tracing_pipeline.shader_binding_table.indexing_hit.sbt_offset_0.no_shaderrecord.0_2 -- 2.7.4