From 1ce1abf95a5c4ebbf46023a57dbeb6a5020c59b3 Mon Sep 17 00:00:00 2001 From: Dave Houlton Date: Tue, 16 Jan 2018 14:56:08 -0700 Subject: [PATCH] tests: Add tests for CmdDispatch params Change-Id: I087f412f3eccd02f040936d917eeea057e55407e --- layers/vk_validation_error_database.txt | 18 ++--- tests/layer_validation_tests.cpp | 112 ++++++++++++++++++++++++++++++++ 2 files changed, 121 insertions(+), 9 deletions(-) diff --git a/layers/vk_validation_error_database.txt b/layers/vk_validation_error_database.txt index fb330f9..5581de3 100644 --- a/layers/vk_validation_error_database.txt +++ b/layers/vk_validation_error_database.txt @@ -2022,9 +2022,9 @@ VALIDATION_ERROR_19a02413~^~N~^~Unknown~^~vkCmdDebugMarkerInsertEXT~^~VUID-vkCmd VALIDATION_ERROR_19a02415~^~N~^~Unknown~^~vkCmdDebugMarkerInsertEXT~^~VUID-vkCmdDebugMarkerInsertEXT-commandBuffer-cmdpool~^~core~^~The spec valid usage text states 'The VkCommandPool that commandBuffer was allocated from must support graphics, or compute operations' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDebugMarkerInsertEXT-commandBuffer-cmdpool)~^~implicit VALIDATION_ERROR_19a1a601~^~N~^~Unknown~^~vkCmdDebugMarkerInsertEXT~^~VUID-vkCmdDebugMarkerInsertEXT-pMarkerInfo-parameter~^~core~^~The spec valid usage text states 'pMarkerInfo must be a valid pointer to a valid VkDebugMarkerMarkerInfoEXT structure' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDebugMarkerInsertEXT-pMarkerInfo-parameter)~^~implicit VALIDATION_ERROR_19c00017~^~Y~^~Unknown~^~vkCmdDispatch~^~VUID-vkCmdDispatch-renderpass~^~core~^~The spec valid usage text states 'This command must only be called outside of a render pass instance' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDispatch-renderpass)~^~implicit -VALIDATION_ERROR_19c00304~^~Y~^~Unknown~^~vkCmdDispatch~^~VUID-vkCmdDispatch-groupCountX-00386~^~core~^~The spec valid usage text states 'groupCountX must be less than or equal to VkPhysicalDeviceLimits::maxComputeWorkGroupCount[0]' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDispatch-groupCountX-00386)~^~ -VALIDATION_ERROR_19c00306~^~Y~^~Unknown~^~vkCmdDispatch~^~VUID-vkCmdDispatch-groupCountY-00387~^~core~^~The spec valid usage text states 'groupCountY must be less than or equal to VkPhysicalDeviceLimits::maxComputeWorkGroupCount[1]' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDispatch-groupCountY-00387)~^~ -VALIDATION_ERROR_19c00308~^~Y~^~Unknown~^~vkCmdDispatch~^~VUID-vkCmdDispatch-groupCountZ-00388~^~core~^~The spec valid usage text states 'groupCountZ must be less than or equal to VkPhysicalDeviceLimits::maxComputeWorkGroupCount[2]' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDispatch-groupCountZ-00388)~^~ +VALIDATION_ERROR_19c00304~^~Y~^~CmdDispatchExceedLimits~^~vkCmdDispatch~^~VUID-vkCmdDispatch-groupCountX-00386~^~core~^~The spec valid usage text states 'groupCountX must be less than or equal to VkPhysicalDeviceLimits::maxComputeWorkGroupCount[0]' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDispatch-groupCountX-00386)~^~ +VALIDATION_ERROR_19c00306~^~Y~^~CmdDispatchExceedLimits~^~vkCmdDispatch~^~VUID-vkCmdDispatch-groupCountY-00387~^~core~^~The spec valid usage text states 'groupCountY must be less than or equal to VkPhysicalDeviceLimits::maxComputeWorkGroupCount[1]' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDispatch-groupCountY-00387)~^~ +VALIDATION_ERROR_19c00308~^~Y~^~CmdDispatchExceedLimits~^~vkCmdDispatch~^~VUID-vkCmdDispatch-groupCountZ-00388~^~core~^~The spec valid usage text states 'groupCountZ must be less than or equal to VkPhysicalDeviceLimits::maxComputeWorkGroupCount[2]' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDispatch-groupCountZ-00388)~^~ VALIDATION_ERROR_19c0030a~^~N~^~Unknown~^~vkCmdDispatch~^~VUID-vkCmdDispatch-None-00389~^~core~^~The spec valid usage text states 'For each set n that is statically used by the VkPipeline currently bound to VK_PIPELINE_BIND_POINT_COMPUTE, a descriptor set must have been bound to n at VK_PIPELINE_BIND_POINT_COMPUTE, with a VkPipelineLayout that is compatible for set n, with the VkPipelineLayout used to create the current VkPipeline, as described in Pipeline Layout Compatibility' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDispatch-None-00389)~^~ VALIDATION_ERROR_19c0030c~^~N~^~Unknown~^~vkCmdDispatch~^~VUID-vkCmdDispatch-None-00390~^~core~^~The spec valid usage text states 'Descriptors in each bound descriptor set, specified via vkCmdBindDescriptorSets, must be valid if they are statically used by the currently bound VkPipeline object, specified via vkCmdBindPipeline' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDispatch-None-00390)~^~ VALIDATION_ERROR_19c0030e~^~N~^~Unknown~^~vkCmdDispatch~^~VUID-vkCmdDispatch-None-00391~^~core~^~The spec valid usage text states 'A valid compute pipeline must be bound to the current command buffer with VK_PIPELINE_BIND_POINT_COMPUTE' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDispatch-None-00391)~^~ @@ -2042,12 +2042,12 @@ VALIDATION_ERROR_19c02413~^~N~^~Unknown~^~vkCmdDispatch~^~VUID-vkCmdDispatch-com VALIDATION_ERROR_19c02415~^~Y~^~Unknown~^~vkCmdDispatch~^~VUID-vkCmdDispatch-commandBuffer-cmdpool~^~core~^~The spec valid usage text states 'The VkCommandPool that commandBuffer was allocated from must support compute operations' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDispatch-commandBuffer-cmdpool)~^~implicit VALIDATION_ERROR_19e00017~^~N~^~Unknown~^~vkCmdDispatchBaseKHX~^~VUID-vkCmdDispatchBaseKHX-renderpass~^~core~^~The spec valid usage text states 'This command must only be called outside of a render pass instance' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDispatchBaseKHX-renderpass)~^~implicit VALIDATION_ERROR_19e00348~^~N~^~Unknown~^~vkCmdDispatchBaseKHX~^~VUID-vkCmdDispatchBaseKHX-None-00420~^~core~^~The spec valid usage text states 'All valid usage rules from vkCmdDispatch apply' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDispatchBaseKHX-None-00420)~^~ -VALIDATION_ERROR_19e0034a~^~Y~^~Unknown~^~vkCmdDispatchBaseKHX~^~VUID-vkCmdDispatchBaseKHX-baseGroupX-00421~^~core~^~The spec valid usage text states 'baseGroupX must be less than VkPhysicalDeviceLimits::maxComputeWorkGroupCount[0]' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDispatchBaseKHX-baseGroupX-00421)~^~ -VALIDATION_ERROR_19e0034c~^~Y~^~Unknown~^~vkCmdDispatchBaseKHX~^~VUID-vkCmdDispatchBaseKHX-baseGroupX-00422~^~core~^~The spec valid usage text states 'baseGroupX must be less than VkPhysicaYDeviceLimits::maxComputeWorkGroupCount[1]' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDispatchBaseKHX-baseGroupX-00422)~^~ -VALIDATION_ERROR_19e0034e~^~Y~^~Unknown~^~vkCmdDispatchBaseKHX~^~VUID-vkCmdDispatchBaseKHX-baseGroupZ-00423~^~core~^~The spec valid usage text states 'baseGroupZ must be less than VkPhysicalDeviceLimits::maxComputeWorkGroupCount[2]' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDispatchBaseKHX-baseGroupZ-00423)~^~ -VALIDATION_ERROR_19e00350~^~Y~^~Unknown~^~vkCmdDispatchBaseKHX~^~VUID-vkCmdDispatchBaseKHX-groupCountX-00424~^~core~^~The spec valid usage text states 'groupCountX must be less than or equal to VkPhysicalDeviceLimits::maxComputeWorkGroupCount[0] minus baseGroupX' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDispatchBaseKHX-groupCountX-00424)~^~ -VALIDATION_ERROR_19e00352~^~Y~^~Unknown~^~vkCmdDispatchBaseKHX~^~VUID-vkCmdDispatchBaseKHX-groupCountY-00425~^~core~^~The spec valid usage text states 'groupCountY must be less than or equal to VkPhysicalDeviceLimits::maxComputeWorkGroupCount[1] minus baseGroupY' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDispatchBaseKHX-groupCountY-00425)~^~ -VALIDATION_ERROR_19e00354~^~Y~^~Unknown~^~vkCmdDispatchBaseKHX~^~VUID-vkCmdDispatchBaseKHX-groupCountZ-00426~^~core~^~The spec valid usage text states 'groupCountZ must be less than or equal to VkPhysicalDeviceLimits::maxComputeWorkGroupCount[2] minus baseGroupZ' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDispatchBaseKHX-groupCountZ-00426)~^~ +VALIDATION_ERROR_19e0034a~^~Y~^~CmdDispatchExceedLimits~^~vkCmdDispatchBaseKHX~^~VUID-vkCmdDispatchBaseKHX-baseGroupX-00421~^~core~^~The spec valid usage text states 'baseGroupX must be less than VkPhysicalDeviceLimits::maxComputeWorkGroupCount[0]' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDispatchBaseKHX-baseGroupX-00421)~^~ +VALIDATION_ERROR_19e0034c~^~Y~^~CmdDispatchExceedLimits~^~vkCmdDispatchBaseKHX~^~VUID-vkCmdDispatchBaseKHX-baseGroupX-00422~^~core~^~The spec valid usage text states 'baseGroupX must be less than VkPhysicaYDeviceLimits::maxComputeWorkGroupCount[1]' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDispatchBaseKHX-baseGroupX-00422)~^~ +VALIDATION_ERROR_19e0034e~^~Y~^~CmdDispatchExceedLimits~^~vkCmdDispatchBaseKHX~^~VUID-vkCmdDispatchBaseKHX-baseGroupZ-00423~^~core~^~The spec valid usage text states 'baseGroupZ must be less than VkPhysicalDeviceLimits::maxComputeWorkGroupCount[2]' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDispatchBaseKHX-baseGroupZ-00423)~^~ +VALIDATION_ERROR_19e00350~^~Y~^~CmdDispatchExceedLimits~^~vkCmdDispatchBaseKHX~^~VUID-vkCmdDispatchBaseKHX-groupCountX-00424~^~core~^~The spec valid usage text states 'groupCountX must be less than or equal to VkPhysicalDeviceLimits::maxComputeWorkGroupCount[0] minus baseGroupX' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDispatchBaseKHX-groupCountX-00424)~^~ +VALIDATION_ERROR_19e00352~^~Y~^~CmdDispatchExceedLimits~^~vkCmdDispatchBaseKHX~^~VUID-vkCmdDispatchBaseKHX-groupCountY-00425~^~core~^~The spec valid usage text states 'groupCountY must be less than or equal to VkPhysicalDeviceLimits::maxComputeWorkGroupCount[1] minus baseGroupY' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDispatchBaseKHX-groupCountY-00425)~^~ +VALIDATION_ERROR_19e00354~^~Y~^~CmdDispatchExceedLimits~^~vkCmdDispatchBaseKHX~^~VUID-vkCmdDispatchBaseKHX-groupCountZ-00426~^~core~^~The spec valid usage text states 'groupCountZ must be less than or equal to VkPhysicalDeviceLimits::maxComputeWorkGroupCount[2] minus baseGroupZ' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDispatchBaseKHX-groupCountZ-00426)~^~ VALIDATION_ERROR_19e00356~^~N~^~Unknown~^~vkCmdDispatchBaseKHX~^~VUID-vkCmdDispatchBaseKHX-baseGroupX-00427~^~core~^~The spec valid usage text states 'If any of baseGroupX, baseGroupY, or baseGroupZ are not zero, then the currently bound compute pipeline must have been created with the VK_PIPELINE_CREATE_DISPATCH_BASE_KHX flag.' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDispatchBaseKHX-baseGroupX-00427)~^~ VALIDATION_ERROR_19e02401~^~Y~^~Unknown~^~vkCmdDispatchBaseKHX~^~VUID-vkCmdDispatchBaseKHX-commandBuffer-parameter~^~core~^~The spec valid usage text states 'commandBuffer must be a valid VkCommandBuffer handle' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDispatchBaseKHX-commandBuffer-parameter)~^~implicit VALIDATION_ERROR_19e02413~^~N~^~Unknown~^~vkCmdDispatchBaseKHX~^~VUID-vkCmdDispatchBaseKHX-commandBuffer-recording~^~core~^~The spec valid usage text states 'commandBuffer must be in the recording state' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdDispatchBaseKHX-commandBuffer-recording)~^~implicit diff --git a/tests/layer_validation_tests.cpp b/tests/layer_validation_tests.cpp index ca5229a..23efe79 100644 --- a/tests/layer_validation_tests.cpp +++ b/tests/layer_validation_tests.cpp @@ -8408,6 +8408,118 @@ TEST_F(VkLayerTest, InvalidPipeline) { m_errorMonitor->VerifyFound(); } +TEST_F(VkLayerTest, CmdDispatchExceedLimits) { + TEST_DESCRIPTION("Compute dispatch with dimensions that exceed device limits"); + + // Enable KHX device group extensions, if available + if (InstanceExtensionSupported(VK_KHX_DEVICE_GROUP_CREATION_EXTENSION_NAME)) { + m_instance_extension_names.push_back(VK_KHX_DEVICE_GROUP_CREATION_EXTENSION_NAME); + } + ASSERT_NO_FATAL_FAILURE(InitFramework(myDbgFunc, m_errorMonitor)); + bool khx_dg_ext_available = false; + if (DeviceExtensionSupported(gpu(), nullptr, VK_KHX_DEVICE_GROUP_EXTENSION_NAME)) { + m_device_extension_names.push_back(VK_KHX_DEVICE_GROUP_EXTENSION_NAME); + khx_dg_ext_available = true; + } + ASSERT_NO_FATAL_FAILURE(InitState()); + + uint32_t x_limit = m_device->props.limits.maxComputeWorkGroupCount[0]; + uint32_t y_limit = m_device->props.limits.maxComputeWorkGroupCount[1]; + uint32_t z_limit = m_device->props.limits.maxComputeWorkGroupCount[2]; + if (std::max({x_limit, y_limit, z_limit}) == UINT32_MAX) { + printf(" device maxComputeWorkGroupCount limit reports UINT32_MAX, test not possible, skipping.\n"); + return; + } + + // Create a minimal compute pipeline + std::string cs_text = "#version 450\nvoid main() {}\n"; // minimal no-op shader + VkShaderObj cs_obj(m_device, cs_text.c_str(), VK_SHADER_STAGE_COMPUTE_BIT, this); + + VkPipelineLayoutCreateInfo info = {}; + info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO; + info.pNext = nullptr; + VkPipelineLayout pipe_layout; + vkCreatePipelineLayout(device(), &info, nullptr, &pipe_layout); + + VkComputePipelineCreateInfo pipeline_info = {}; + pipeline_info.sType = VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO; + pipeline_info.pNext = nullptr; + pipeline_info.flags = khx_dg_ext_available ? VK_PIPELINE_CREATE_DISPATCH_BASE_KHX : 0; + pipeline_info.layout = pipe_layout; + pipeline_info.basePipelineHandle = VK_NULL_HANDLE; + pipeline_info.basePipelineIndex = -1; + pipeline_info.stage.sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO; + pipeline_info.stage.pNext = nullptr; + pipeline_info.stage.flags = 0; + pipeline_info.stage.stage = VK_SHADER_STAGE_COMPUTE_BIT; + pipeline_info.stage.module = cs_obj.handle(); + pipeline_info.stage.pName = "main"; + pipeline_info.stage.pSpecializationInfo = nullptr; + VkPipeline cs_pipeline; + vkCreateComputePipelines(device(), VK_NULL_HANDLE, 1, &pipeline_info, nullptr, &cs_pipeline); + + // Bind pipeline to command buffer + m_commandBuffer->begin(); + vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_COMPUTE, cs_pipeline); + + // Dispatch counts that exceed device limits + m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_19c00304); + vkCmdDispatch(m_commandBuffer->handle(), x_limit + 1, y_limit, z_limit); + m_errorMonitor->VerifyFound(); + + m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_19c00306); + vkCmdDispatch(m_commandBuffer->handle(), x_limit, y_limit + 1, z_limit); + m_errorMonitor->VerifyFound(); + + m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_19c00308); + vkCmdDispatch(m_commandBuffer->handle(), x_limit, y_limit, z_limit + 1); + m_errorMonitor->VerifyFound(); + + if (khx_dg_ext_available) { + PFN_vkCmdDispatchBaseKHX fp_vkCmdDispatchBaseKHX = + (PFN_vkCmdDispatchBaseKHX)vkGetInstanceProcAddr(instance(), "vkCmdDispatchBaseKHX"); + + // Base equals or exceeds limit + m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_19e0034a); + fp_vkCmdDispatchBaseKHX(m_commandBuffer->handle(), x_limit, y_limit - 1, z_limit - 1, 0, 0, 0); + m_errorMonitor->VerifyFound(); + + m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_19e0034c); + fp_vkCmdDispatchBaseKHX(m_commandBuffer->handle(), x_limit - 1, y_limit, z_limit - 1, 0, 0, 0); + m_errorMonitor->VerifyFound(); + + m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_19e0034e); + fp_vkCmdDispatchBaseKHX(m_commandBuffer->handle(), x_limit - 1, y_limit - 1, z_limit, 0, 0, 0); + m_errorMonitor->VerifyFound(); + + // (Base + count) exceeds limit + uint32_t x_base = x_limit / 2; + uint32_t y_base = y_limit / 2; + uint32_t z_base = z_limit / 2; + x_limit -= x_base; + y_limit -= y_base; + z_limit -= z_base; + + m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_19e00350); + fp_vkCmdDispatchBaseKHX(m_commandBuffer->handle(), x_base, y_base, z_base, x_limit + 1, y_limit, z_limit); + m_errorMonitor->VerifyFound(); + + m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_19e00352); + fp_vkCmdDispatchBaseKHX(m_commandBuffer->handle(), x_base, y_base, z_base, x_limit, y_limit + 1, z_limit); + m_errorMonitor->VerifyFound(); + + m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_19e00354); + fp_vkCmdDispatchBaseKHX(m_commandBuffer->handle(), x_base, y_base, z_base, x_limit, y_limit, z_limit + 1); + m_errorMonitor->VerifyFound(); + } else { + printf(" KHX_DEVICE_GROUP_* extensions not supported, skipping CmdDispatchBaseKHX() tests.\n"); + } + + // Clean up + vkDestroyPipeline(device(), cs_pipeline, nullptr); + vkDestroyPipelineLayout(device(), pipe_layout, nullptr); +} + TEST_F(VkLayerTest, DescriptorSetNotUpdated) { TEST_DESCRIPTION("Bind a descriptor set that hasn't been updated."); VkResult err; -- 2.7.4