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