tests: Add checks for new scissor/viewport validation

Added tests for checks 1430-1433.

Change-Id: I66090077eb18083765d7383777e0d1e9c0cadbbc
diff --git a/tests/layer_validation_tests.cpp b/tests/layer_validation_tests.cpp
index 88eacb4..fb39177 100644
--- a/tests/layer_validation_tests.cpp
+++ b/tests/layer_validation_tests.cpp
@@ -7134,8 +7134,6 @@
 
     TEST_DESCRIPTION("Test various cases of viewport and scissor count validation");
 
-    m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01434);
-
     ASSERT_NO_FATAL_FAILURE(InitState());
     ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
 
@@ -7187,12 +7185,10 @@
     ASSERT_VK_SUCCESS(err);
 
     VkViewport vp = {};
-
     VkPipelineViewportStateCreateInfo vp_state_ci = {};
     vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
     vp_state_ci.scissorCount = 1;
-    // Count mismatch should cause error
-    vp_state_ci.viewportCount = 2;
+    vp_state_ci.viewportCount = 1;
     vp_state_ci.pViewports = &vp;
 
     VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
@@ -7229,7 +7225,6 @@
 
     VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
     VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
-    // We shouldn't need a fragment shader but add it to be able to run on more devices
     shaderStages[0] = vs.GetStageCreateInfo();
     shaderStages[1] = fs.GetStageCreateInfo();
 
@@ -7251,12 +7246,44 @@
 
     VkPipeline pipeline;
     VkPipelineCache pipelineCache;
-
     err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
     ASSERT_VK_SUCCESS(err);
-    err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
 
-    m_errorMonitor->VerifyFound();
+    if (!m_device->phy().features().multiViewport) {
+        printf("MultiViewport feature is disabled -- skipping enabled-state checks.\n");
+
+        // Check case where multiViewport is disabled and viewport count is not 1
+        // We check scissor/viewport simultaneously since separating them would trigger the mismatch error, 1434.
+        m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01430);
+        m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01431);
+        vp_state_ci.scissorCount = 0;
+        vp_state_ci.viewportCount = 0;
+        err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
+        m_errorMonitor->VerifyFound();
+    } else {
+        if (m_device->props.limits.maxViewports == 1) {
+            printf("Device limit maxViewports is 1, skipping tests that require higher limits.\n");
+        } else {
+            printf("MultiViewport feature is enabled -- skipping disabled-state checks.\n");
+
+            // Check is that viewportcount and scissorcount match
+            m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01434);
+            vp_state_ci.scissorCount = 1;
+            vp_state_ci.viewportCount = m_device->props.limits.maxViewports;
+            err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
+            m_errorMonitor->VerifyFound();
+
+
+            // Check case where multiViewport is enabled and viewport count is greater than max
+            // We check scissor/viewport simultaneously since separating them would trigger the mismatch error, 1434.
+            m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01432);
+            m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01433);
+            vp_state_ci.scissorCount = m_device->props.limits.maxViewports + 1;
+            vp_state_ci.viewportCount = m_device->props.limits.maxViewports + 1;
+            err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
+            m_errorMonitor->VerifyFound();
+        }
+    }
 
     vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
     vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);