aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPetr Kraus <petr_kraus@email.cz>2017-11-16 21:21:58 +0100
committerTobin Ehlis <tobine@google.com>2017-11-17 09:48:49 -0700
commit978799fd689431171dd1457baaf69977570df694 (patch)
tree68f86901b79185d56ed4f1b22b003731ade20f04
parent728c23d5b07fbef3d021165b2fd2fa9dc0468529 (diff)
downloadusermoji-978799fd689431171dd1457baaf69977570df694.tar.xz
layers: Rewrite ViewportState checks and tests
- deal with #1685 - report correct object type - improve? msg texts a bit - add extension structs to pNext check - use correct printf token where possible - make tests to match changes + improve coverage (nullptr + multiViewport) - remove viewport state (and other stuff) from tests that do not use it - merge some tests together that are too related - remove unnecessary dynamic state from PSOLineWidthInvalid) - correct invalid VkViewport in some places - correct missing/null pViewport and pScissors in some places - update and correct the VUID database
-rw-r--r--layers/parameter_validation_utils.cpp196
-rw-r--r--layers/vk_validation_error_database.txt24
2 files changed, 117 insertions, 103 deletions
diff --git a/layers/parameter_validation_utils.cpp b/layers/parameter_validation_utils.cpp
index 24a6f41d..e29d74fb 100644
--- a/layers/parameter_validation_utils.cpp
+++ b/layers/parameter_validation_utils.cpp
@@ -1033,118 +1033,132 @@ bool pv_vkCreateGraphicsPipelines(VkDevice device, VkPipelineCache pipelineCache
if ((pCreateInfos[i].pRasterizationState != nullptr) &&
(pCreateInfos[i].pRasterizationState->rasterizerDiscardEnable == VK_FALSE)) {
if (pCreateInfos[i].pViewportState == nullptr) {
- skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
- __LINE__, VALIDATION_ERROR_096005dc, LayerName,
- "vkCreateGraphicsPipelines: if pCreateInfos[%d].pRasterizationState->rasterizerDiscardEnable "
- "is VK_FALSE, pCreateInfos[%d].pViewportState must be a pointer to a valid "
- "VkPipelineViewportStateCreateInfo structure. %s",
+ skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_EXT,
+ VK_NULL_HANDLE, __LINE__, VALIDATION_ERROR_096005dc, LayerName,
+ "vkCreateGraphicsPipelines: Rasterization is enabled (pCreateInfos[%" PRIu32
+ "].pRasterizationState->rasterizerDiscardEnable is VK_FALSE), but pCreateInfos[%" PRIu32
+ "].pViewportState (=NULL) is not a valid pointer. %s",
i, i, validation_error_map[VALIDATION_ERROR_096005dc]);
} else {
- if (pCreateInfos[i].pViewportState->scissorCount != pCreateInfos[i].pViewportState->viewportCount) {
- skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
- __LINE__, VALIDATION_ERROR_10c00988, LayerName,
- "Graphics Pipeline viewport count (%u) must match scissor count (%u). %s",
- pCreateInfos[i].pViewportState->viewportCount, pCreateInfos[i].pViewportState->scissorCount,
- validation_error_map[VALIDATION_ERROR_10c00988]);
+ const auto &viewport_state = *pCreateInfos[i].pViewportState;
+
+ if (viewport_state.sType != VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO) {
+ skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_EXT,
+ VK_NULL_HANDLE, __LINE__, VALIDATION_ERROR_10c2b00b, LayerName,
+ "vkCreateGraphicsPipelines: pCreateInfos[%" PRIu32
+ "].pViewportState->sType is not VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO. %s",
+ i, validation_error_map[VALIDATION_ERROR_10c2b00b]);
}
+ const VkStructureType allowed_structs_VkPipelineViewportStateCreateInfo[] = {
+ VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_SWIZZLE_STATE_CREATE_INFO_NV,
+ VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_W_SCALING_STATE_CREATE_INFO_NV};
skip |= validate_struct_pnext(
report_data, "vkCreateGraphicsPipelines",
- ParameterName("pCreateInfos[%i].pViewportState->pNext", ParameterName::IndexVector{i}), NULL,
- pCreateInfos[i].pViewportState->pNext, 0, NULL, GeneratedHeaderVersion, VALIDATION_ERROR_10c1c40d);
+ ParameterName("pCreateInfos[%i].pViewportState->pNext", ParameterName::IndexVector{i}),
+ "VkPipelineViewportSwizzleStateCreateInfoNV, VkPipelineViewportWScalingStateCreateInfoNV",
+ viewport_state.pNext, ARRAY_SIZE(allowed_structs_VkPipelineViewportStateCreateInfo),
+ allowed_structs_VkPipelineViewportStateCreateInfo, 65, VALIDATION_ERROR_10c1c40d);
skip |= validate_reserved_flags(
report_data, "vkCreateGraphicsPipelines",
ParameterName("pCreateInfos[%i].pViewportState->flags", ParameterName::IndexVector{i}),
- pCreateInfos[i].pViewportState->flags, VALIDATION_ERROR_10c09005);
-
- if (pCreateInfos[i].pViewportState->sType != VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO) {
- skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
- __LINE__, INVALID_STRUCT_STYPE, LayerName,
- "vkCreateGraphicsPipelines: parameter pCreateInfos[%d].pViewportState->sType must be "
- "VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO",
- 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_10c00980, 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_10c00980]);
+ viewport_state.flags, VALIDATION_ERROR_10c09005);
+
+ if (!device_data->physical_device_features.multiViewport) {
+ if (viewport_state.viewportCount != 1) {
+ skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_EXT,
+ VK_NULL_HANDLE, __LINE__, VALIDATION_ERROR_10c00980, LayerName,
+ "vkCreateGraphicsPipelines: The VkPhysicalDeviceFeatures::multiViewport feature is "
+ "disabled, but pCreateInfos[%" PRIu32 "].pViewportState->viewportCount (=%" PRIu32
+ ") is not 1. %s",
+ i, viewport_state.viewportCount, validation_error_map[VALIDATION_ERROR_10c00980]);
}
- 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_10c00982, 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_10c00982]);
+
+ if (viewport_state.scissorCount != 1) {
+ skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_EXT,
+ VK_NULL_HANDLE, __LINE__, VALIDATION_ERROR_10c00982, LayerName,
+ "vkCreateGraphicsPipelines: The VkPhysicalDeviceFeatures::multiViewport feature is "
+ "disabled, but pCreateInfos[%" PRIu32 "].pViewportState->scissorCount (=%" PRIu32
+ ") is not 1. %s",
+ i, viewport_state.scissorCount, validation_error_map[VALIDATION_ERROR_10c00982]);
}
- } 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_10c00984, 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_10c00984]);
+ } else { // multiViewport enabled
+ if (viewport_state.viewportCount == 0) {
+ skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_EXT,
+ VK_NULL_HANDLE, __LINE__, VALIDATION_ERROR_10c30a1b, LayerName,
+ "vkCreateGraphicsPipelines: The pCreateInfos[%" PRIu32
+ "].pViewportState->viewportCount is 0. %s",
+ i, validation_error_map[VALIDATION_ERROR_10c30a1b]);
+ } else if (viewport_state.viewportCount > device_data->device_limits.maxViewports) {
+ skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_EXT,
+ VK_NULL_HANDLE, __LINE__, VALIDATION_ERROR_10c00984, LayerName,
+ "vkCreateGraphicsPipelines: pCreateInfos[%" PRIu32
+ "].pViewportState->viewportCount (=%" PRIu32
+ ") is greater than VkPhysicalDeviceLimits::maxViewports (=%" PRIu32 "). %s",
+ i, viewport_state.viewportCount, device_data->device_limits.maxViewports,
+ validation_error_map[VALIDATION_ERROR_10c00984]);
}
- 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_10c00986, 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_10c00986]);
+
+ if (viewport_state.scissorCount == 0) {
+ skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_EXT,
+ VK_NULL_HANDLE, __LINE__, VALIDATION_ERROR_10c2b61b, LayerName,
+ "vkCreateGraphicsPipelines: The pCreateInfos[%" PRIu32
+ "].pViewportState->scissorCount is 0. %s",
+ i, validation_error_map[VALIDATION_ERROR_10c2b61b]);
+ } else if (viewport_state.scissorCount > device_data->device_limits.maxViewports) {
+ skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_EXT,
+ VK_NULL_HANDLE, __LINE__, VALIDATION_ERROR_10c00986, LayerName,
+ "vkCreateGraphicsPipelines: pCreateInfos[%" PRIu32
+ "].pViewportState->scissorCount (=%" PRIu32
+ ") is greater than VkPhysicalDeviceLimits::maxViewports (=%" PRIu32 "). %s",
+ i, viewport_state.scissorCount, device_data->device_limits.maxViewports,
+ validation_error_map[VALIDATION_ERROR_10c00986]);
}
}
+ if (viewport_state.scissorCount != viewport_state.viewportCount) {
+ skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_EXT,
+ VK_NULL_HANDLE, __LINE__, VALIDATION_ERROR_10c00988, LayerName,
+ "vkCreateGraphicsPipelines: pCreateInfos[%" PRIu32
+ "].pViewportState->scissorCount (=%" PRIu32 ") is not identical to pCreateInfos[%" PRIu32
+ "].pViewportState->viewportCount (=%" PRIu32 "). %s",
+ i, viewport_state.scissorCount, i, viewport_state.viewportCount,
+ validation_error_map[VALIDATION_ERROR_10c00988]);
+ }
+
+ bool has_dynamic_viewport = false;
+ bool has_dynamic_scissor = false;
if (pCreateInfos[i].pDynamicState != nullptr) {
- bool has_dynamic_viewport = false;
- bool has_dynamic_scissor = false;
-
- for (uint32_t state_index = 0; state_index < pCreateInfos[i].pDynamicState->dynamicStateCount;
- ++state_index) {
- if (pCreateInfos[i].pDynamicState->pDynamicStates[state_index] == VK_DYNAMIC_STATE_VIEWPORT) {
- has_dynamic_viewport = true;
- } else if (pCreateInfos[i].pDynamicState->pDynamicStates[state_index] == VK_DYNAMIC_STATE_SCISSOR) {
- has_dynamic_scissor = true;
- }
+ const auto &dynamic_state_info = *pCreateInfos[i].pDynamicState;
+ for (uint32_t state_index = 0; state_index < dynamic_state_info.dynamicStateCount; ++state_index) {
+ const auto &dynamic_state = dynamic_state_info.pDynamicStates[state_index];
+ if (dynamic_state == VK_DYNAMIC_STATE_VIEWPORT) has_dynamic_viewport = true;
+ if (dynamic_state == VK_DYNAMIC_STATE_SCISSOR) has_dynamic_scissor = true;
}
+ }
- // 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)) {
- skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
- __LINE__, VALIDATION_ERROR_096005d6, LayerName,
- "vkCreateGraphicsPipelines: if pCreateInfos[%d].pDynamicState->pDynamicStates does not "
- "contain VK_DYNAMIC_STATE_VIEWPORT, pCreateInfos[%d].pViewportState->pViewports must "
- "not be NULL. %s",
- i, i, validation_error_map[VALIDATION_ERROR_096005d6]);
- }
+ if (!has_dynamic_viewport && viewport_state.viewportCount > 0 && viewport_state.pViewports == nullptr) {
+ skip |= log_msg(
+ report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_EXT, VK_NULL_HANDLE,
+ __LINE__, VALIDATION_ERROR_096005d6, LayerName,
+ "vkCreateGraphicsPipelines: The viewport state is static (pCreateInfos[%" PRIu32
+ "].pDynamicState->pDynamicStates does not contain VK_DYNAMIC_STATE_VIEWPORT), but pCreateInfos[%" PRIu32
+ "].pViewportState->pViewports (=NULL) is a invalid pointer. %s",
+ i, i, validation_error_map[VALIDATION_ERROR_096005d6]);
+ }
- // 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)) {
- skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
- __LINE__, VALIDATION_ERROR_096005d8, LayerName,
- "vkCreateGraphicsPipelines: if pCreateInfos[%d].pDynamicState->pDynamicStates does not "
- "contain VK_DYNAMIC_STATE_SCISSOR, pCreateInfos[%d].pViewportState->pScissors must not "
- "be NULL. %s",
- i, i, validation_error_map[VALIDATION_ERROR_096005d8]);
- }
+ if (!has_dynamic_scissor && viewport_state.scissorCount > 0 && viewport_state.pScissors == nullptr) {
+ skip |= log_msg(
+ report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_EXT, VK_NULL_HANDLE,
+ __LINE__, VALIDATION_ERROR_096005d8, LayerName,
+ "vkCreateGraphicsPipelines: The scissor state is static (pCreateInfos[%" PRIu32
+ "].pDynamicState->pDynamicStates does not contain VK_DYNAMIC_STATE_SCISSOR), but pCreateInfos[%" PRIu32
+ "].pViewportState->pScissors (=NULL) is a invalid pointer. %s",
+ i, i, validation_error_map[VALIDATION_ERROR_096005d8]);
}
+
+ // TODO: validate the VkViewports in pViewports here
}
if (pCreateInfos[i].pMultisampleState == nullptr) {
diff --git a/layers/vk_validation_error_database.txt b/layers/vk_validation_error_database.txt
index 5082fa02..1389f830 100644
--- a/layers/vk_validation_error_database.txt
+++ b/layers/vk_validation_error_database.txt
@@ -569,10 +569,10 @@ VALIDATION_ERROR_096005ce~^~N~^~Unknown~^~vkCreateGraphicsPipelines~^~VUID-VkGra
VALIDATION_ERROR_096005d0~^~N~^~Unknown~^~vkCreateGraphicsPipelines~^~VUID-VkGraphicsPipelineCreateInfo-subpass-00744~^~core~^~The spec valid usage text states 'If rasterization is not disabled and subpass uses a depth/stencil attachment in renderpass that has a layout of VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkGraphicsPipelineCreateInfo-subpass-00744)~^~
VALIDATION_ERROR_096005d2~^~N~^~Unknown~^~vkCreateGraphicsPipelines~^~VUID-VkGraphicsPipelineCreateInfo-blendEnable-00745~^~core~^~The spec valid usage text states 'If rasterization is not disabled and the subpass uses color attachments, then for each color attachment in the subpass the blendEnable member of the corresponding element of the pAttachment member of pColorBlendState must be VK_FALSE if the format of the attachment does not support color blend operations, as specified by the VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT flag in VkFormatProperties::linearTilingFeatures or VkFormatProperties::optimalTilingFeatures returned by vkGetPhysicalDeviceFormatProperties' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkGraphicsPipelineCreateInfo-blendEnable-00745)~^~
VALIDATION_ERROR_096005d4~^~Y~^~NumBlendAttachMismatch~^~vkCreateGraphicsPipelines~^~VUID-VkGraphicsPipelineCreateInfo-attachmentCount-00746~^~core~^~The spec valid usage text states 'If rasterization is not disabled and the subpass uses color attachments, the attachmentCount member of pColorBlendState must be equal to the colorAttachmentCount used to create subpass' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkGraphicsPipelineCreateInfo-attachmentCount-00746)~^~
-VALIDATION_ERROR_096005d6~^~Y~^~PSOViewportCountWithoutDataAndDynScissorMismatch~^~vkCreateGraphicsPipelines~^~VUID-VkGraphicsPipelineCreateInfo-pDynamicStates-00747~^~core~^~The spec valid usage text states 'If no element of the pDynamicStates member of pDynamicState is VK_DYNAMIC_STATE_VIEWPORT, the pViewports member of pViewportState must be a valid pointer to an array of pViewportState::viewportCount VkViewport structures' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkGraphicsPipelineCreateInfo-pDynamicStates-00747)~^~
-VALIDATION_ERROR_096005d8~^~Y~^~PSOScissorCountWithoutDataAndDynViewportMismatch~^~vkCreateGraphicsPipelines~^~VUID-VkGraphicsPipelineCreateInfo-pDynamicStates-00748~^~core~^~The spec valid usage text states 'If no element of the pDynamicStates member of pDynamicState is VK_DYNAMIC_STATE_SCISSOR, the pScissors member of pViewportState must be a valid pointer to an array of pViewportState::scissorCount VkRect2D structures' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkGraphicsPipelineCreateInfo-pDynamicStates-00748)~^~
+VALIDATION_ERROR_096005d6~^~Y~^~PSOViewportStateTests,PSOViewportStateMultiViewportTests~^~vkCreateGraphicsPipelines~^~VUID-VkGraphicsPipelineCreateInfo-pDynamicStates-00747~^~core~^~The spec valid usage text states 'If no element of the pDynamicStates member of pDynamicState is VK_DYNAMIC_STATE_VIEWPORT, the pViewports member of pViewportState must be a valid pointer to an array of pViewportState::viewportCount VkViewport structures' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkGraphicsPipelineCreateInfo-pDynamicStates-00747)~^~
+VALIDATION_ERROR_096005d8~^~Y~^~PSOViewportStateTests,PSOViewportStateMultiViewportTests~^~vkCreateGraphicsPipelines~^~VUID-VkGraphicsPipelineCreateInfo-pDynamicStates-00748~^~core~^~The spec valid usage text states 'If no element of the pDynamicStates member of pDynamicState is VK_DYNAMIC_STATE_SCISSOR, the pScissors member of pViewportState must be a valid pointer to an array of pViewportState::scissorCount VkRect2D structures' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkGraphicsPipelineCreateInfo-pDynamicStates-00748)~^~
VALIDATION_ERROR_096005da~^~N~^~Unknown~^~vkCreateGraphicsPipelines~^~VUID-VkGraphicsPipelineCreateInfo-pDynamicStates-00749~^~core~^~The spec valid usage text states 'If the wide lines feature is not enabled, and no element of the pDynamicStates member of pDynamicState is VK_DYNAMIC_STATE_LINE_WIDTH, the lineWidth member of pRasterizationState must be 1.0' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkGraphicsPipelineCreateInfo-pDynamicStates-00749)~^~
-VALIDATION_ERROR_096005dc~^~Y~^~PSOViewportStateNotSet~^~vkCreateGraphicsPipelines~^~VUID-VkGraphicsPipelineCreateInfo-rasterizerDiscardEnable-00750~^~core~^~The spec valid usage text states 'If the rasterizerDiscardEnable member of pRasterizationState is VK_FALSE, pViewportState must be a valid pointer to a valid VkPipelineViewportStateCreateInfo structure' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkGraphicsPipelineCreateInfo-rasterizerDiscardEnable-00750)~^~
+VALIDATION_ERROR_096005dc~^~Y~^~PSOViewportStateTests~^~vkCreateGraphicsPipelines~^~VUID-VkGraphicsPipelineCreateInfo-rasterizerDiscardEnable-00750~^~core~^~The spec valid usage text states 'If the rasterizerDiscardEnable member of pRasterizationState is VK_FALSE, pViewportState must be a valid pointer to a valid VkPipelineViewportStateCreateInfo structure' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkGraphicsPipelineCreateInfo-rasterizerDiscardEnable-00750)~^~
VALIDATION_ERROR_096005de~^~Y~^~Unknown~^~vkCreateGraphicsPipelines~^~VUID-VkGraphicsPipelineCreateInfo-rasterizerDiscardEnable-00751~^~core~^~The spec valid usage text states 'If the rasterizerDiscardEnable member of pRasterizationState is VK_FALSE, pMultisampleState must be a valid pointer to a valid VkPipelineMultisampleStateCreateInfo structure' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkGraphicsPipelineCreateInfo-rasterizerDiscardEnable-00751)~^~
VALIDATION_ERROR_096005e0~^~Y~^~Unknown~^~vkCreateGraphicsPipelines~^~VUID-VkGraphicsPipelineCreateInfo-rasterizerDiscardEnable-00752~^~core~^~The spec valid usage text states 'If the rasterizerDiscardEnable member of pRasterizationState is VK_FALSE, and subpass uses a depth/stencil attachment, pDepthStencilState must be a valid pointer to a valid VkPipelineDepthStencilStateCreateInfo structure' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkGraphicsPipelineCreateInfo-rasterizerDiscardEnable-00752)~^~
VALIDATION_ERROR_096005e2~^~Y~^~PipelineRenderpassCompatibility~^~vkCreateGraphicsPipelines~^~VUID-VkGraphicsPipelineCreateInfo-rasterizerDiscardEnable-00753~^~core~^~The spec valid usage text states 'If the rasterizerDiscardEnable member of pRasterizationState is VK_FALSE, and subpass uses color attachments, pColorBlendState must be a valid pointer to a valid VkPipelineColorBlendStateCreateInfo structure' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkGraphicsPipelineCreateInfo-rasterizerDiscardEnable-00753)~^~
@@ -1204,18 +1204,18 @@ VALIDATION_ERROR_10a1c40d~^~Y~^~Unknown~^~vkCmdDrawIndexedIndirectCountAMD~^~VUI
VALIDATION_ERROR_10a26401~^~Y~^~Unknown~^~vkCmdDrawIndexedIndirectCountAMD~^~VUID-VkPipelineVertexInputStateCreateInfo-pVertexAttributeDescriptions-parameter~^~core~^~The spec valid usage text states 'If vertexAttributeDescriptionCount is not 0, pVertexAttributeDescriptions must be a valid pointer to an array of vertexAttributeDescriptionCount valid VkVertexInputAttributeDescription structures' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkPipelineVertexInputStateCreateInfo-pVertexAttributeDescriptions-parameter)~^~implicit
VALIDATION_ERROR_10a26601~^~Y~^~Unknown~^~vkCmdDrawIndexedIndirectCountAMD~^~VUID-VkPipelineVertexInputStateCreateInfo-pVertexBindingDescriptions-parameter~^~core~^~The spec valid usage text states 'If vertexBindingDescriptionCount is not 0, pVertexBindingDescriptions must be a valid pointer to an array of vertexBindingDescriptionCount valid VkVertexInputBindingDescription structures' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkPipelineVertexInputStateCreateInfo-pVertexBindingDescriptions-parameter)~^~implicit
VALIDATION_ERROR_10a2b00b~^~Y~^~Unknown~^~vkCmdDrawIndexedIndirectCountAMD~^~VUID-VkPipelineVertexInputStateCreateInfo-sType-sType~^~core~^~The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkPipelineVertexInputStateCreateInfo-sType-sType)~^~implicit, TBD in parameter validation layer.
-VALIDATION_ERROR_10c00980~^~Y~^~PSOViewportScissorCountTests~^~vkCmdSetViewportWScalingNV~^~VUID-VkPipelineViewportStateCreateInfo-viewportCount-01216~^~core~^~The spec valid usage text states 'If the multiple viewports feature is not enabled, viewportCount must be 1' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkPipelineViewportStateCreateInfo-viewportCount-01216)~^~
-VALIDATION_ERROR_10c00982~^~Y~^~PSOViewportScissorCountTests~^~vkCmdSetViewportWScalingNV~^~VUID-VkPipelineViewportStateCreateInfo-scissorCount-01217~^~core~^~The spec valid usage text states 'If the multiple viewports feature is not enabled, scissorCount must be 1' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkPipelineViewportStateCreateInfo-scissorCount-01217)~^~
-VALIDATION_ERROR_10c00984~^~Y~^~PSOViewportScissorCountTests~^~vkCmdSetViewportWScalingNV~^~VUID-VkPipelineViewportStateCreateInfo-viewportCount-01218~^~core~^~The spec valid usage text states 'viewportCount must be between 1 and VkPhysicalDeviceLimits::maxViewports, inclusive' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkPipelineViewportStateCreateInfo-viewportCount-01218)~^~
-VALIDATION_ERROR_10c00986~^~Y~^~PSOViewportScissorCountTests~^~vkCmdSetViewportWScalingNV~^~VUID-VkPipelineViewportStateCreateInfo-scissorCount-01219~^~core~^~The spec valid usage text states 'scissorCount must be between 1 and VkPhysicalDeviceLimits::maxViewports, inclusive' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkPipelineViewportStateCreateInfo-scissorCount-01219)~^~
-VALIDATION_ERROR_10c00988~^~Y~^~PSOViewportScissorCountTests~^~vkCmdSetViewportWScalingNV~^~VUID-VkPipelineViewportStateCreateInfo-scissorCount-01220~^~core~^~The spec valid usage text states 'scissorCount and viewportCount must be identical' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkPipelineViewportStateCreateInfo-scissorCount-01220)~^~
+VALIDATION_ERROR_10c00980~^~Y~^~PSOViewportStateTests~^~vkCmdSetViewportWScalingNV~^~VUID-VkPipelineViewportStateCreateInfo-viewportCount-01216~^~core~^~The spec valid usage text states 'If the multiple viewports feature is not enabled, viewportCount must be 1' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkPipelineViewportStateCreateInfo-viewportCount-01216)~^~
+VALIDATION_ERROR_10c00982~^~Y~^~PSOViewportStateTests~^~vkCmdSetViewportWScalingNV~^~VUID-VkPipelineViewportStateCreateInfo-scissorCount-01217~^~core~^~The spec valid usage text states 'If the multiple viewports feature is not enabled, scissorCount must be 1' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkPipelineViewportStateCreateInfo-scissorCount-01217)~^~
+VALIDATION_ERROR_10c00984~^~Y~^~PSOViewportStateMultiViewportTests~^~vkCmdSetViewportWScalingNV~^~VUID-VkPipelineViewportStateCreateInfo-viewportCount-01218~^~core~^~The spec valid usage text states 'viewportCount must be between 1 and VkPhysicalDeviceLimits::maxViewports, inclusive' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkPipelineViewportStateCreateInfo-viewportCount-01218)~^~
+VALIDATION_ERROR_10c00986~^~Y~^~PSOViewportStateMultiViewportTests~^~vkCmdSetViewportWScalingNV~^~VUID-VkPipelineViewportStateCreateInfo-scissorCount-01219~^~core~^~The spec valid usage text states 'scissorCount must be between 1 and VkPhysicalDeviceLimits::maxViewports, inclusive' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkPipelineViewportStateCreateInfo-scissorCount-01219)~^~
+VALIDATION_ERROR_10c00988~^~Y~^~PSOViewportStateTests,PSOViewportStateMultiViewportTests~^~vkCmdSetViewportWScalingNV~^~VUID-VkPipelineViewportStateCreateInfo-scissorCount-01220~^~core~^~The spec valid usage text states 'scissorCount and viewportCount must be identical' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkPipelineViewportStateCreateInfo-scissorCount-01220)~^~
VALIDATION_ERROR_10c00d7c~^~N~^~None~^~VkPipelineViewportStateCreateInfo~^~VUID-VkPipelineViewportStateCreateInfo-viewportWScalingEnable-01726~^~(VK_NV_clip_space_w_scaling)~^~The spec valid usage text states 'If the viewportWScalingEnable member of a VkPipelineViewportWScalingStateCreateInfoNV structure chained to the pNext chain is VK_TRUE, the viewportCount member of the VkPipelineViewportWScalingStateCreateInfoNV structure must be equal to viewportCount' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkPipelineViewportStateCreateInfo-viewportWScalingEnable-01726)~^~
VALIDATION_ERROR_10c09005~^~Y~^~Unknown~^~vkCmdSetViewportWScalingNV~^~VUID-VkPipelineViewportStateCreateInfo-flags-zerobitmask~^~core~^~The spec valid usage text states 'flags must be 0' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkPipelineViewportStateCreateInfo-flags-zerobitmask)~^~implicit
-VALIDATION_ERROR_10c1c40d~^~Y~^~Unknown~^~vkCmdSetViewportWScalingNV~^~VUID-VkPipelineViewportStateCreateInfo-pNext-pNext~^~core~^~The spec valid usage text states 'Each pNext member of any structure (including this one) in the pNext chain must be either NULL or a pointer to a valid instance of VkPipelineViewportSwizzleStateCreateInfoNV or VkPipelineViewportWScalingStateCreateInfoNV' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkPipelineViewportStateCreateInfo-pNext-pNext)~^~implicit
-VALIDATION_ERROR_10c2b00b~^~N~^~Unknown~^~vkCmdSetViewportWScalingNV~^~VUID-VkPipelineViewportStateCreateInfo-sType-sType~^~core~^~The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkPipelineViewportStateCreateInfo-sType-sType)~^~implicit
+VALIDATION_ERROR_10c1c40d~^~Y~^~Unknown~^~vvkCmdSetViewportWScalingNV~^~VUID-VkPipelineViewportStateCreateInfo-pNext-pNext~^~core~^~The spec valid usage text states 'Each pNext member of any structure (including this one) in the pNext chain must be either NULL or a pointer to a valid instance of VkPipelineViewportSwizzleStateCreateInfoNV or VkPipelineViewportWScalingStateCreateInfoNV' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkPipelineViewportStateCreateInfo-pNext-pNext)~^~implicit
+VALIDATION_ERROR_10c2b00b~^~Y~^~Unknown~^~vkCmdSetViewportWScalingNV~^~VUID-VkPipelineViewportStateCreateInfo-sType-sType~^~core~^~The spec valid usage text states 'sType must be VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkPipelineViewportStateCreateInfo-sType-sType)~^~implicit
VALIDATION_ERROR_10c2b00f~^~N~^~None~^~VkPipelineViewportStateCreateInfo~^~VUID-VkPipelineViewportStateCreateInfo-sType-unique~^~core~^~The spec valid usage text states 'Each sType member in the pNext chain must be unique' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkPipelineViewportStateCreateInfo-sType-unique)~^~implicit
-VALIDATION_ERROR_10c2b61b~^~N~^~Unknown~^~vkCmdSetViewportWScalingNV~^~VUID-VkPipelineViewportStateCreateInfo-scissorCount-arraylength~^~core~^~The spec valid usage text states 'scissorCount must be greater than 0' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkPipelineViewportStateCreateInfo-scissorCount-arraylength)~^~implicit
-VALIDATION_ERROR_10c30a1b~^~N~^~Unknown~^~vkCmdSetViewportWScalingNV~^~VUID-VkPipelineViewportStateCreateInfo-viewportCount-arraylength~^~core~^~The spec valid usage text states 'viewportCount must be greater than 0' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkPipelineViewportStateCreateInfo-viewportCount-arraylength)~^~implicit
+VALIDATION_ERROR_10c2b61b~^~Y~^~PSOViewportStateMultiViewportTests~^~vkCmdSetViewportWScalingNV~^~VUID-VkPipelineViewportStateCreateInfo-scissorCount-arraylength~^~core~^~The spec valid usage text states 'scissorCount must be greater than 0' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkPipelineViewportStateCreateInfo-scissorCount-arraylength)~^~implicit
+VALIDATION_ERROR_10c30a1b~^~Y~^~PSOViewportStateMultiViewportTests~^~vkCmdSetViewportWScalingNV~^~VUID-VkPipelineViewportStateCreateInfo-viewportCount-arraylength~^~core~^~The spec valid usage text states 'viewportCount must be greater than 0' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkPipelineViewportStateCreateInfo-viewportCount-arraylength)~^~implicit
VALIDATION_ERROR_10e0097e~^~N~^~Unknown~^~vkCmdBindVertexBuffers~^~VUID-VkPipelineViewportSwizzleStateCreateInfoNV-viewportCount-01215~^~core~^~The spec valid usage text states 'viewportCount must match the viewportCount set in VkPipelineViewportStateCreateInfo' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkPipelineViewportSwizzleStateCreateInfoNV-viewportCount-01215)~^~
VALIDATION_ERROR_10e09005~^~N~^~Unknown~^~vkCmdBindVertexBuffers~^~VUID-VkPipelineViewportSwizzleStateCreateInfoNV-flags-zerobitmask~^~core~^~The spec valid usage text states 'flags must be 0' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkPipelineViewportSwizzleStateCreateInfoNV-flags-zerobitmask)~^~implicit, TBD in parameter validation layer.
VALIDATION_ERROR_10e1c40d~^~N~^~Unknown~^~vkCmdBindVertexBuffers~^~VUID-VkPipelineViewportSwizzleStateCreateInfoNV-pNext-pNext~^~core~^~The spec valid usage text states 'pNext must be NULL' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkPipelineViewportSwizzleStateCreateInfoNV-pNext-pNext)~^~implicit, TBD in parameter validation layer.