From 6f82da9debd5cdeda59f388250b506c59e7d8d54 Mon Sep 17 00:00:00 2001
From: Mark Lobodzinski <mark@lunarg.com>
Date: Thu, 23 Mar 2017 14:47:03 -0600
Subject: [PATCH] layers: Support viewport_array2 ext shader caps

Recognize and validate shader capabilities added in the new
VK_NV_viewport_array2 extension.

Change-Id: Ifeb21d9230ca071a56246acc928add0a572b55f9
---
 layers/core_validation.cpp     | 11 +++++++++++
 layers/core_validation_types.h |  1 +
 2 files changed, 12 insertions(+)

diff --git a/layers/core_validation.cpp b/layers/core_validation.cpp
index 5d481a9da..374103bf9 100644
--- a/layers/core_validation.cpp
+++ b/layers/core_validation.cpp
@@ -2541,6 +2541,12 @@ static bool validate_shader_capabilities(layer_data *dev_data, shader_module con
                                               VK_NV_SAMPLE_MASK_OVERRIDE_COVERAGE_EXTENSION_NAME);
                     break;
 
+                case spv::CapabilityShaderViewportIndexLayerNV:
+                case spv::CapabilityShaderViewportMaskNV:
+                    pass &= require_extension(report_data, dev_data->device_extensions.nv_viewport_array2_enabled,
+                                              VK_NV_VIEWPORT_ARRAY2_EXTENSION_NAME);
+                    break;
+
                 default:
                     // Spirv-validator should catch these errors
                     break;
@@ -3854,6 +3860,8 @@ static void checkDeviceRegisterExtensions(const VkDeviceCreateInfo *pCreateInfo,
     dev_data->device_extensions.khr_maintenance1_enabled = false;
     dev_data->device_extensions.nv_geometry_shader_passthrough_enabled = false;
     dev_data->device_extensions.nv_sample_mask_override_coverage_enabled = false;
+    dev_data->device_extensions.nv_viewport_array2_enabled = false;
+
 
     for (i = 0; i < pCreateInfo->enabledExtensionCount; i++) {
         if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_SWAPCHAIN_EXTENSION_NAME) == 0) {
@@ -3880,6 +3888,9 @@ static void checkDeviceRegisterExtensions(const VkDeviceCreateInfo *pCreateInfo,
         if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_NV_SAMPLE_MASK_OVERRIDE_COVERAGE_EXTENSION_NAME) == 0) {
             dev_data->device_extensions.nv_sample_mask_override_coverage_enabled = true;
         }
+        if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_NV_VIEWPORT_ARRAY2_EXTENSION_NAME) == 0) {
+            dev_data->device_extensions.nv_viewport_array2_enabled = true;
+        }
     }
 }
 
diff --git a/layers/core_validation_types.h b/layers/core_validation_types.h
index b8f261b70..1ab611cc6 100644
--- a/layers/core_validation_types.h
+++ b/layers/core_validation_types.h
@@ -793,6 +793,7 @@ struct devExts {
     bool khr_maintenance1_enabled;
     bool nv_geometry_shader_passthrough_enabled;
     bool nv_sample_mask_override_coverage_enabled;
+    bool nv_viewport_array2_enabled;
     std::unordered_map<VkSwapchainKHR, std::unique_ptr<SWAPCHAIN_NODE>> swapchainMap;
     std::unordered_map<VkImage, VkSwapchainKHR> imageToSwapchainMap;
 };
-- 
GitLab