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)) {