layers: Add scissor/viewport count checks

Change-Id: I35977325f662d3e4df84d02d2eefa4383fae9c05
diff --git a/layers/parameter_validation.cpp b/layers/parameter_validation.cpp
index a3d5b90..b3c70e3 100644
--- a/layers/parameter_validation.cpp
+++ b/layers/parameter_validation.cpp
@@ -2914,6 +2914,46 @@
                                          i);
                 }
 
+                if (device_data->physical_device_features.multiViewport == false) {
+                    if (pCreateInfos[i].pViewportState->viewportCount != 1) {
+                        skip |=
+                            log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
+                                    __LINE__, VALIDATION_ERROR_01430, LayerName,
+                                    "vkCreateGraphicsPipelines: The multiViewport feature is not enabled, so "
+                                    "pCreateInfos[%d].pViewportState->viewportCount must be 1 but is %d. %s",
+                                    i, pCreateInfos[i].pViewportState->viewportCount, validation_error_map[VALIDATION_ERROR_01430]);
+                    }
+                    if (pCreateInfos[i].pViewportState->scissorCount != 1) {
+                        skip |=
+                            log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
+                                    __LINE__, VALIDATION_ERROR_01431, LayerName,
+                                    "vkCreateGraphicsPipelines: The multiViewport feature is not enabled, so "
+                                    "pCreateInfos[%d].pViewportState->scissorCount must be 1 but is %d. %s",
+                                    i, pCreateInfos[i].pViewportState->scissorCount, validation_error_map[VALIDATION_ERROR_01431]);
+                    }
+                } else {
+                    if ((pCreateInfos[i].pViewportState->viewportCount < 1) ||
+                        (pCreateInfos[i].pViewportState->viewportCount > device_data->device_limits.maxViewports)) {
+                        skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
+                                        __LINE__, VALIDATION_ERROR_01432, LayerName,
+                                        "vkCreateGraphicsPipelines: multiViewport feature is enabled; "
+                                        "pCreateInfos[%d].pViewportState->viewportCount is %d but must be between 1 and "
+                                        "maxViewports (%d), inclusive. %s",
+                                        i, pCreateInfos[i].pViewportState->viewportCount, device_data->device_limits.maxViewports,
+                                        validation_error_map[VALIDATION_ERROR_01432]);
+                    }
+                    if ((pCreateInfos[i].pViewportState->scissorCount < 1) ||
+                        (pCreateInfos[i].pViewportState->scissorCount > device_data->device_limits.maxViewports)) {
+                        skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
+                                        __LINE__, VALIDATION_ERROR_01433, LayerName,
+                                        "vkCreateGraphicsPipelines: multiViewport feature is enabled; "
+                                        "pCreateInfos[%d].pViewportState->scissorCount is %d but must be between 1 and "
+                                        "maxViewports (%d), inclusive. %s",
+                                        i, pCreateInfos[i].pViewportState->scissorCount, device_data->device_limits.maxViewports,
+                                        validation_error_map[VALIDATION_ERROR_01433]);
+                    }
+                }
+
                 if (pCreateInfos[i].pDynamicState != nullptr) {
                     bool has_dynamic_viewport = false;
                     bool has_dynamic_scissor = false;
@@ -2926,15 +2966,6 @@
                         }
                     }
 
-                    // viewportCount must be greater than 0
-                    // TODO: viewportCount must be 1 when multiple_viewport feature is not enabled
-                    if (pCreateInfos[i].pViewportState->viewportCount == 0) {
-                        skip |= log_msg(
-                            report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
-                            REQUIRED_PARAMETER, LayerName,
-                            "vkCreateGraphicsPipelines: pCreateInfos[%d].pViewportState->viewportCount must be greater than 0", i);
-                    }
-
                     // If no element of the pDynamicStates member of pDynamicState is VK_DYNAMIC_STATE_VIEWPORT, the pViewports
                     // member of pViewportState must be a pointer to an array of pViewportState->viewportCount VkViewport structures
                     if (!has_dynamic_viewport && (pCreateInfos[i].pViewportState->pViewports == nullptr)) {
@@ -2946,15 +2977,6 @@
                                     i, i, validation_error_map[VALIDATION_ERROR_02110]);
                     }
 
-                    // scissorCount must be greater than 0
-                    // TODO: scissorCount must be 1 when multiple_viewport feature is not enabled
-                    if (pCreateInfos[i].pViewportState->scissorCount == 0) {
-                        skip |= log_msg(
-                            report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
-                            REQUIRED_PARAMETER, LayerName,
-                            "vkCreateGraphicsPipelines: pCreateInfos[%d].pViewportState->scissorCount must be greater than 0", i);
-                    }
-
                     // If no element of the pDynamicStates member of pDynamicState is VK_DYNAMIC_STATE_SCISSOR, the pScissors member
                     // of pViewportState must be a pointer to an array of pViewportState->scissorCount VkRect2D structures
                     if (!has_dynamic_scissor && (pCreateInfos[i].pViewportState->pScissors == nullptr)) {