layers: Require appropriate feature enabled for writable descriptors
authorChris Forbes <chrisforbes@google.com>
Wed, 7 Mar 2018 19:38:08 +0000 (11:38 -0800)
committerChris Forbes <chrisf@ijw.co.nz>
Thu, 8 Mar 2018 17:12:03 +0000 (09:12 -0800)
layers/shader_validation.cpp

index 2c45bb3..019d1a7 100644 (file)
@@ -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);