layers: Reimplement vkCmdSetViewport param val.
diff --git a/layers/parameter_validation_utils.cpp b/layers/parameter_validation_utils.cpp
index bf90ce1..e584269 100644
--- a/layers/parameter_validation_utils.cpp
+++ b/layers/parameter_validation_utils.cpp
@@ -2221,27 +2221,30 @@
bool skip = false;
layer_data *device_data = GetLayerDataPtr(get_dispatch_key(commandBuffer), layer_data_map);
- if (viewportCount > 0 && pViewports != nullptr) {
- const VkPhysicalDeviceLimits &limits = device_data->device_limits;
- for (uint32_t viewportIndex = 0; viewportIndex < viewportCount; ++viewportIndex) {
- const VkViewport &viewport = pViewports[viewportIndex];
-
- if (device_data->physical_device_features.multiViewport == false) {
- if (viewportCount != 1) {
- skip |= log_msg(
- device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT,
- VALIDATION_ERROR_1e000992, __LINE__, DEVICE_FEATURE, LayerName,
- "vkCmdSetViewport(): The multiViewport feature is not enabled, so viewportCount must be 1 but is %d. %s",
- viewportCount, validation_error_map[VALIDATION_ERROR_1e000992]);
- }
- if (firstViewport != 0) {
- skip |= log_msg(
- device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT,
- VALIDATION_ERROR_1e000990, __LINE__, DEVICE_FEATURE, LayerName,
- "vkCmdSetViewport(): The multiViewport feature is not enabled, so firstViewport must be 0 but is %d. %s",
+ if (!device_data->physical_device_features.multiViewport) {
+ if (firstViewport != 0) {
+ skip |=
+ log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT,
+ HandleToUint64(commandBuffer), __LINE__, VALIDATION_ERROR_1e000990, LayerName,
+ "vkCmdSetViewport: The multiViewport feature is disabled, but firstViewport (=%" PRIu32 ") is not 0. %s",
firstViewport, validation_error_map[VALIDATION_ERROR_1e000990]);
- }
- }
+ }
+ if (viewportCount > 1) {
+ skip |=
+ log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT,
+ HandleToUint64(commandBuffer), __LINE__, VALIDATION_ERROR_1e000992, LayerName,
+ "vkCmdSetViewport: The multiViewport feature is disabled, but viewportCount (=%" PRIu32 ") is not 1. %s",
+ viewportCount, validation_error_map[VALIDATION_ERROR_1e000992]);
+ }
+ } else { // multiViewport enabled
+ const uint64_t sum = (uint64_t)firstViewport + viewportCount;
+ if (sum > device_data->device_limits.maxViewports) {
+ skip |= log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT,
+ HandleToUint64(commandBuffer), __LINE__, VALIDATION_ERROR_1e00098e, LayerName,
+ "vkCmdSetViewport: firstViewport + viewportCount (=%" PRIu32 " + %" PRIu32 " = %" PRIu64
+ ") is greater than VkPhysicalDeviceLimits::maxViewports (=%" PRIu32 "). %s",
+ firstViewport, viewportCount, sum, device_data->device_limits.maxViewports,
+ validation_error_map[VALIDATION_ERROR_1e00098e]);
}
}