VALIDATION_ERROR_1de08403~^~Y~^~Unknown~^~vkCmdSetStencilWriteMask~^~VUID-vkCmdSetStencilWriteMask-faceMask-requiredbitmask~^~core~^~The spec valid usage text states 'faceMask must not be 0' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdSetStencilWriteMask-faceMask-requiredbitmask)~^~implicit
VALIDATION_ERROR_1e00098a~^~Y~^~Unknown~^~vkCmdSetViewport~^~VUID-vkCmdSetViewport-None-01221~^~core~^~The spec valid usage text states 'The currently bound graphics pipeline must have been created with the VK_DYNAMIC_STATE_VIEWPORT dynamic state enabled' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdSetViewport-None-01221)~^~
VALIDATION_ERROR_1e00098c~^~N~^~Unknown~^~vkCmdSetViewport~^~VUID-vkCmdSetViewport-firstViewport-01222~^~core~^~The spec valid usage text states 'firstViewport must be less than VkPhysicalDeviceLimits::maxViewports' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdSetViewport-firstViewport-01222)~^~redundant VU
-VALIDATION_ERROR_1e00098e~^~Y~^~Unknown~^~vkCmdSetViewport~^~VUID-vkCmdSetViewport-firstViewport-01223~^~core~^~The spec valid usage text states 'The sum of firstViewport and viewportCount must be between 1 and VkPhysicalDeviceLimits::maxViewports, inclusive' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdSetViewport-firstViewport-01223)~^~
+VALIDATION_ERROR_1e00098e~^~Y~^~SetDynViewportParamMultiviewportTests~^~vkCmdSetViewport~^~VUID-vkCmdSetViewport-firstViewport-01223~^~core~^~The spec valid usage text states 'The sum of firstViewport and viewportCount must be between 1 and VkPhysicalDeviceLimits::maxViewports, inclusive' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdSetViewport-firstViewport-01223)~^~
VALIDATION_ERROR_1e000990~^~Y~^~SetDynViewportParamTests~^~vkCmdSetViewport~^~VUID-vkCmdSetViewport-firstViewport-01224~^~core~^~The spec valid usage text states 'If the multiple viewports feature is not enabled, firstViewport must be 0' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdSetViewport-firstViewport-01224)~^~
VALIDATION_ERROR_1e000992~^~Y~^~SetDynViewportParamTests~^~vkCmdSetViewport~^~VUID-vkCmdSetViewport-viewportCount-01225~^~core~^~The spec valid usage text states 'If the multiple viewports feature is not enabled, viewportCount must be 1' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdSetViewport-viewportCount-01225)~^~
VALIDATION_ERROR_1e000994~^~N~^~None~^~vkCmdSetViewport~^~VUID-vkCmdSetViewport-pViewports-01226~^~core~^~The spec valid usage text states 'pViewports must be a valid pointer to an array of viewportCount valid VkViewport structures' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdSetViewport-pViewports-01226)~^~removed from spec
}
TEST_F(VkLayerTest, SetDynViewportParamTests) {
- TEST_DESCRIPTION("Test parameters of vkCmdSetViewport");
+ TEST_DESCRIPTION("Test parameters of vkCmdSetViewport without multiViewport feature");
VkPhysicalDeviceFeatures features{};
ASSERT_NO_FATAL_FAILURE(Init(&features));
m_errorMonitor->VerifyFound();
}
+TEST_F(VkLayerTest, SetDynViewportParamMultiviewportTests) {
+ TEST_DESCRIPTION("Test parameters of vkCmdSetViewport with multiViewport feature enabled");
+
+ ASSERT_NO_FATAL_FAILURE(Init());
+
+ if (!m_device->phy().features().multiViewport) {
+ printf(" VkPhysicalDeviceFeatures::multiViewport is not supported -- skipping test.\n");
+ return;
+ }
+
+ const auto max_viewports = m_device->props.limits.maxViewports;
+ const uint32_t too_many_viewports = 65536 + 1; // let's say this is too much to allocate pViewports for
+
+ m_commandBuffer->begin();
+
+ m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_1e030a1b);
+ vkCmdSetViewport(m_commandBuffer->handle(), 0, 0, nullptr);
+ m_errorMonitor->VerifyFound();
+
+ m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_1e03fa01);
+ vkCmdSetViewport(m_commandBuffer->handle(), 0, max_viewports, nullptr);
+ m_errorMonitor->VerifyFound();
+
+ if (max_viewports >= too_many_viewports) {
+ printf(
+ " VkPhysicalDeviceLimits::maxViewports is too large to practically test against -- skipping part of "
+ "test.\n");
+ return;
+ }
+
+ const VkViewport vp = {0.0, 0.0, 64.0, 64.0, 0.0, 1.0};
+ const std::vector<VkViewport> viewports(max_viewports + 1, vp);
+
+ m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_1e00098e);
+ vkCmdSetViewport(m_commandBuffer->handle(), 0, max_viewports + 1, viewports.data());
+ m_errorMonitor->VerifyFound();
+
+ m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_1e00098e);
+ vkCmdSetViewport(m_commandBuffer->handle(), max_viewports, 1, viewports.data());
+ m_errorMonitor->VerifyFound();
+
+ m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_1e00098e);
+ vkCmdSetViewport(m_commandBuffer->handle(), 1, max_viewports, viewports.data());
+ m_errorMonitor->VerifyFound();
+
+ m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_1e030a1b);
+ m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_1e00098e);
+ vkCmdSetViewport(m_commandBuffer->handle(), max_viewports + 1, 0, viewports.data());
+ m_errorMonitor->VerifyFound();
+}
+
//
// POSITIVE VALIDATION TESTS
//