From 7bced67a7092676ec262a436ddd9e227dc5aa201 Mon Sep 17 00:00:00 2001 From: Chris Forbes Date: Wed, 7 Mar 2018 11:38:08 -0800 Subject: layers: Require appropriate feature enabled for writable descriptors --- layers/shader_validation.cpp | 25 +++++++++++++++++++++---- 1 file changed, 21 insertions(+), 4 deletions(-) diff --git a/layers/shader_validation.cpp b/layers/shader_validation.cpp index 2c45bb3a..019d1a76 100644 --- a/layers/shader_validation.cpp +++ b/layers/shader_validation.cpp @@ -1175,7 +1175,8 @@ static bool require_extension(debug_report_data const *report_data, bool extensi return false; } -static bool validate_shader_capabilities(layer_data *dev_data, shader_module const *src) { +static bool validate_shader_capabilities(layer_data *dev_data, shader_module const *src, VkShaderStageFlagBits stage, + bool has_writable_descriptor) { bool skip = false; auto report_data = GetReportData(dev_data); @@ -1289,6 +1290,22 @@ static bool validate_shader_capabilities(layer_data *dev_data, shader_module con } } + if (has_writable_descriptor) { + switch (stage) { + case VK_SHADER_STAGE_COMPUTE_BIT: + /* No feature requirements for writes and atomics from compute + * stage */ + break; + case VK_SHADER_STAGE_FRAGMENT_BIT: + skip |= require_feature(report_data, enabledFeatures->fragmentStoresAndAtomics, "fragmentStoresAndAtomics"); + break; + default: + skip |= + require_feature(report_data, enabledFeatures->vertexPipelineStoresAndAtomics, "vertexPipelineStoresAndAtomics"); + break; + } + } + return skip; } @@ -1361,9 +1378,6 @@ static bool validate_pipeline_shader_stage(layer_data *dev_data, VkPipelineShade } } - // Validate shader capabilities against enabled device features - skip |= validate_shader_capabilities(dev_data, module); - // Mark accessible ids auto accessible_ids = mark_accessible_ids(module, entrypoint); @@ -1371,6 +1385,9 @@ static bool validate_pipeline_shader_stage(layer_data *dev_data, VkPipelineShade bool has_writable_descriptor = false; auto descriptor_uses = collect_interface_by_descriptor_slot(report_data, module, accessible_ids, &has_writable_descriptor); + // Validate shader capabilities against enabled device features + skip |= validate_shader_capabilities(dev_data, module, pStage->stage, has_writable_descriptor); + skip |= validate_specialization_offsets(report_data, pStage); skip |= validate_push_constant_usage(report_data, pipeline->pipeline_layout.push_constant_ranges.get(), module, accessible_ids, pStage->stage); -- cgit v1.2.3