From d9f2af5b4be4aad46fcc4d849caa2a9378860550 Mon Sep 17 00:00:00 2001 From: Mark Lobodzinski Date: Sun, 18 Dec 2016 09:43:01 -0700 Subject: layers: Add scissor/viewport count checks Change-Id: I35977325f662d3e4df84d02d2eefa4383fae9c05 --- layers/parameter_validation.cpp | 58 ++++++++++++++++++++++++++++------------- 1 file changed, 40 insertions(+), 18 deletions(-) (limited to 'layers/parameter_validation.cpp') diff --git a/layers/parameter_validation.cpp b/layers/parameter_validation.cpp index a3d5b90f..b3c70e3b 100644 --- a/layers/parameter_validation.cpp +++ b/layers/parameter_validation.cpp @@ -2914,6 +2914,46 @@ VKAPI_ATTR VkResult VKAPI_CALL CreateGraphicsPipelines(VkDevice device, VkPipeli 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 @@ VKAPI_ATTR VkResult VKAPI_CALL CreateGraphicsPipelines(VkDevice device, VkPipeli } } - // 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 @@ VKAPI_ATTR VkResult VKAPI_CALL CreateGraphicsPipelines(VkDevice device, VkPipeli 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)) { -- cgit v1.2.3