diff options
author | Locke <locke@lunarg.com> | 2019-04-03 14:39:18 -0600 |
---|---|---|
committer | Locke Lin <47329816+locke-lunarg@users.noreply.github.com> | 2019-04-29 12:04:04 -0600 |
commit | afec8b9f6f9262c362e3c9be9f94f1cd6e00a210 (patch) | |
tree | 48c61a62a9c51b87f9b8ef8910923fe01ad28886 /tests/layer_validation_tests.cpp | |
parent | f39c07711e12d7ec02b5a69c573ab4c11bafe78e (diff) | |
download | vulkan-validation-layers-afec8b9f6f9262c362e3c9be9f94f1cd6e00a210.tar.gz |
tests: Test exceed limits
Test maxComputeWorkGroupSize & maxComputeWorkGroupInvocations. Because
glslangValidator will check if local_size is vaild if the shader is
glsl, I use assembly language of shader for testing
maxComputeWorkGroupSize.
Change-Id: I3c8c23f1c472c426aec595a677ecfe6a7c43131f
Diffstat (limited to 'tests/layer_validation_tests.cpp')
-rw-r--r-- | tests/layer_validation_tests.cpp | 99 |
1 files changed, 70 insertions, 29 deletions
diff --git a/tests/layer_validation_tests.cpp b/tests/layer_validation_tests.cpp index bb03cb281..d53815af4 100644 --- a/tests/layer_validation_tests.cpp +++ b/tests/layer_validation_tests.cpp @@ -12176,17 +12176,34 @@ TEST_F(VkLayerTest, CmdDispatchExceedLimits) { } 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) { + uint32_t x_count_limit = m_device->props.limits.maxComputeWorkGroupCount[0]; + uint32_t y_count_limit = m_device->props.limits.maxComputeWorkGroupCount[1]; + uint32_t z_count_limit = m_device->props.limits.maxComputeWorkGroupCount[2]; + if (std::max({x_count_limit, y_count_limit, z_count_limit}) == UINT32_MAX) { printf("%s device maxComputeWorkGroupCount limit reports UINT32_MAX, test not possible, skipping.\n", kSkipPrefix); 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); + uint32_t x_size_limit = m_device->props.limits.maxComputeWorkGroupSize[0]; + uint32_t y_size_limit = m_device->props.limits.maxComputeWorkGroupSize[1]; + uint32_t z_size_limit = m_device->props.limits.maxComputeWorkGroupSize[2]; + + std::string spv_source = R"( + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint GLCompute %main "main" + OpExecutionMode %main LocalSize )"; + spv_source.append(std::to_string(x_size_limit + 1) + " " + std::to_string(y_size_limit + 1) + " " + + std::to_string(z_size_limit + 1)); + spv_source.append(R"( + %void = OpTypeVoid + %3 = OpTypeFunction %void + %main = OpFunction %void None %3 + %5 = OpLabel + OpReturn + OpFunctionEnd)"); + + VkShaderObj cs_obj_asm(m_device, spv_source, VK_SHADER_STAGE_COMPUTE_BIT, this); VkPipelineLayoutCreateInfo info = {}; info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO; @@ -12201,31 +12218,55 @@ TEST_F(VkLayerTest, CmdDispatchExceedLimits) { 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; + pipeline_info.stage = cs_obj_asm.GetStageCreateInfo(); VkPipeline cs_pipeline; + + m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "exceeds device limit maxComputeWorkGroupSize[0]"); + m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "exceeds device limit maxComputeWorkGroupSize[1]"); + m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "exceeds device limit maxComputeWorkGroupSize[2]"); + m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "features-limits-maxComputeWorkGroupInvocations"); + vkCreateComputePipelines(device(), VK_NULL_HANDLE, 1, &pipeline_info, nullptr, &cs_pipeline); + m_errorMonitor->VerifyFound(); + + // Create a minimal compute pipeline + x_size_limit = (x_size_limit > 1024) ? 1024 : x_size_limit; + y_size_limit = (y_size_limit > 1024) ? 1024 : y_size_limit; + z_size_limit = (z_size_limit > 64) ? 64 : z_size_limit; + + uint32_t invocations_limit = m_device->props.limits.maxComputeWorkGroupInvocations; + x_size_limit = (x_size_limit > invocations_limit) ? invocations_limit : x_size_limit; + invocations_limit /= x_size_limit; + y_size_limit = (y_size_limit > invocations_limit) ? invocations_limit : y_size_limit; + invocations_limit /= y_size_limit; + z_size_limit = (z_size_limit > invocations_limit) ? invocations_limit : z_size_limit; + + char cs_text[128] = ""; + sprintf(cs_text, "#version 450\nlayout(local_size_x = %d, local_size_y = %d, local_size_z = %d) in;\nvoid main() {}\n", + x_size_limit, y_size_limit, z_size_limit); + + VkShaderObj cs_obj(m_device, cs_text, VK_SHADER_STAGE_COMPUTE_BIT, this); + pipeline_info.stage = cs_obj.GetStageCreateInfo(); 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); + m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "features-limits-maxComputeWorkGroupInvocations"); + vkCmdDispatch(m_commandBuffer->handle(), x_count_limit, y_count_limit, z_count_limit); + m_errorMonitor->VerifyFound(); + // Dispatch counts that exceed device limits m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdDispatch-groupCountX-00386"); - vkCmdDispatch(m_commandBuffer->handle(), x_limit + 1, y_limit, z_limit); + vkCmdDispatch(m_commandBuffer->handle(), x_count_limit + 1, y_count_limit, z_count_limit); m_errorMonitor->VerifyFound(); m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdDispatch-groupCountY-00387"); - vkCmdDispatch(m_commandBuffer->handle(), x_limit, y_limit + 1, z_limit); + vkCmdDispatch(m_commandBuffer->handle(), x_count_limit, y_count_limit + 1, z_count_limit); m_errorMonitor->VerifyFound(); m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdDispatch-groupCountZ-00388"); - vkCmdDispatch(m_commandBuffer->handle(), x_limit, y_limit, z_limit + 1); + vkCmdDispatch(m_commandBuffer->handle(), x_count_limit, y_count_limit, z_count_limit + 1); m_errorMonitor->VerifyFound(); if (khx_dg_ext_available) { @@ -12234,35 +12275,35 @@ TEST_F(VkLayerTest, CmdDispatchExceedLimits) { // Base equals or exceeds limit m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdDispatchBase-baseGroupX-00421"); - fp_vkCmdDispatchBaseKHR(m_commandBuffer->handle(), x_limit, y_limit - 1, z_limit - 1, 0, 0, 0); + fp_vkCmdDispatchBaseKHR(m_commandBuffer->handle(), x_count_limit, y_count_limit - 1, z_count_limit - 1, 0, 0, 0); m_errorMonitor->VerifyFound(); m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdDispatchBase-baseGroupX-00422"); - fp_vkCmdDispatchBaseKHR(m_commandBuffer->handle(), x_limit - 1, y_limit, z_limit - 1, 0, 0, 0); + fp_vkCmdDispatchBaseKHR(m_commandBuffer->handle(), x_count_limit - 1, y_count_limit, z_count_limit - 1, 0, 0, 0); m_errorMonitor->VerifyFound(); m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdDispatchBase-baseGroupZ-00423"); - fp_vkCmdDispatchBaseKHR(m_commandBuffer->handle(), x_limit - 1, y_limit - 1, z_limit, 0, 0, 0); + fp_vkCmdDispatchBaseKHR(m_commandBuffer->handle(), x_count_limit - 1, y_count_limit - 1, z_count_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; + uint32_t x_base = x_count_limit / 2; + uint32_t y_base = y_count_limit / 2; + uint32_t z_base = z_count_limit / 2; + x_count_limit -= x_base; + y_count_limit -= y_base; + z_count_limit -= z_base; m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdDispatchBase-groupCountX-00424"); - fp_vkCmdDispatchBaseKHR(m_commandBuffer->handle(), x_base, y_base, z_base, x_limit + 1, y_limit, z_limit); + fp_vkCmdDispatchBaseKHR(m_commandBuffer->handle(), x_base, y_base, z_base, x_count_limit + 1, y_count_limit, z_count_limit); m_errorMonitor->VerifyFound(); m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdDispatchBase-groupCountY-00425"); - fp_vkCmdDispatchBaseKHR(m_commandBuffer->handle(), x_base, y_base, z_base, x_limit, y_limit + 1, z_limit); + fp_vkCmdDispatchBaseKHR(m_commandBuffer->handle(), x_base, y_base, z_base, x_count_limit, y_count_limit + 1, z_count_limit); m_errorMonitor->VerifyFound(); m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdDispatchBase-groupCountZ-00426"); - fp_vkCmdDispatchBaseKHR(m_commandBuffer->handle(), x_base, y_base, z_base, x_limit, y_limit, z_limit + 1); + fp_vkCmdDispatchBaseKHR(m_commandBuffer->handle(), x_base, y_base, z_base, x_count_limit, y_count_limit, z_count_limit + 1); m_errorMonitor->VerifyFound(); } else { printf("%s KHX_DEVICE_GROUP_* extensions not supported, skipping CmdDispatchBaseKHR() tests.\n", kSkipPrefix); |