layers: Add validation for 8-bit storage shader caps
diff --git a/layers/core_validation.cpp b/layers/core_validation.cpp
index f3a6ee7..2a000d7 100644
--- a/layers/core_validation.cpp
+++ b/layers/core_validation.cpp
@@ -211,6 +211,7 @@
         uint32_t max_push_descriptors;  // from VkPhysicalDevicePushDescriptorPropertiesKHR::maxPushDescriptors
         VkPhysicalDeviceDescriptorIndexingPropertiesEXT descriptor_indexing_props;
         VkPhysicalDeviceDescriptorIndexingFeaturesEXT descriptor_indexing_features;
+        VkPhysicalDevice8BitStorageFeaturesKHR eight_bit_storage_features;
     };
     DeviceExtensionProperties phys_dev_ext_props = {};
     bool external_sync_warning = false;
@@ -2349,6 +2350,10 @@
         device_data->phys_dev_ext_props.descriptor_indexing_features = *descriptor_indexing_features;
     }
 
+    const auto *eight_bit_storage_features = lvl_find_in_chain<VkPhysicalDevice8BitStorageFeaturesKHR>(pCreateInfo->pNext);
+    if (eight_bit_storage_features) {
+        device_data->phys_dev_ext_props.eight_bit_storage_features = *eight_bit_storage_features;
+    }
     lock.unlock();
 
     ValidateLayerOrdering(*pCreateInfo);
@@ -4825,6 +4830,9 @@
     return &device_data->phys_dev_ext_props.descriptor_indexing_features;
 }
 
+const VkPhysicalDevice8BitStorageFeaturesKHR *GetEnabled8BitStorageFeatures(const layer_data *device_data) {
+    return &device_data->phys_dev_ext_props.eight_bit_storage_features;
+}
 const DeviceExtensions *GetDeviceExtensions(const layer_data *device_data) { return &device_data->extensions; }
 
 uint32_t GetApiVersion(const layer_data *device_data) { return device_data->api_version; }
diff --git a/layers/core_validation_types.h b/layers/core_validation_types.h
index 4deb32c..d73062e 100644
--- a/layers/core_validation_types.h
+++ b/layers/core_validation_types.h
@@ -1059,6 +1059,7 @@
 const VkPhysicalDeviceFeatures *GetEnabledFeatures(const layer_data *device_data);
 const DeviceExtensions *GetEnabledExtensions(const layer_data *device_data);
 const VkPhysicalDeviceDescriptorIndexingFeaturesEXT *GetEnabledDescriptorIndexingFeatures(const layer_data *device_data);
+const VkPhysicalDevice8BitStorageFeaturesKHR *GetEnabled8BitStorageFeatures(const layer_data *device_data);
 
 void InvalidateCommandBuffers(const layer_data *, std::unordered_set<GLOBAL_CB_NODE *> const &, VK_OBJECT);
 bool ValidateMemoryIsBoundToBuffer(const layer_data *, const BUFFER_STATE *, const char *, const std::string &);
diff --git a/layers/shader_validation.cpp b/layers/shader_validation.cpp
index c1a6f24..afb2bcf 100644
--- a/layers/shader_validation.cpp
+++ b/layers/shader_validation.cpp
@@ -1197,6 +1197,7 @@
     auto const &enabledFeatures = GetEnabledFeatures(dev_data);
     auto const &extensions = GetDeviceExtensions(dev_data);
     auto const &descriptorIndexingFeatures = GetEnabledDescriptorIndexingFeatures(dev_data);
+    auto const &eightBitStorageFeatures = GetEnabled8BitStorageFeatures(dev_data);
 
     struct CapabilityInfo {
         char const *name;
@@ -1280,6 +1281,11 @@
         {spv::CapabilityShaderViewportMaskNV, {VK_NV_VIEWPORT_ARRAY2_EXTENSION_NAME, nullptr, &extensions->vk_nv_viewport_array2}},
         {spv::CapabilitySubgroupBallotKHR, {VK_EXT_SHADER_SUBGROUP_BALLOT_EXTENSION_NAME, nullptr, &extensions->vk_ext_shader_subgroup_ballot }},
         {spv::CapabilitySubgroupVoteKHR, {VK_EXT_SHADER_SUBGROUP_VOTE_EXTENSION_NAME, nullptr, &extensions->vk_ext_shader_subgroup_vote }},
+
+        {spv::CapabilityStorageBuffer8BitAccess , {"VkPhysicalDeviceFeatures::storageBuffer8BitAccess", &eightBitStorageFeatures->storageBuffer8BitAccess, &extensions->vk_khr_8bit_storage}},
+        {spv::CapabilityUniformAndStorageBuffer8BitAccess , {"VkPhysicalDeviceFeatures::uniformAndStorageBuffer8BitAccess", &eightBitStorageFeatures->uniformAndStorageBuffer8BitAccess, &extensions->vk_khr_8bit_storage}},
+        {spv::CapabilityStoragePushConstant8 , {"VkPhysicalDeviceFeatures::storagePushConstant8", &eightBitStorageFeatures->storagePushConstant8, &extensions->vk_khr_8bit_storage}},
+
     };
     // clang-format on