diff --git a/layers/descriptor_sets.cpp b/layers/descriptor_sets.cpp
index 41da912..bd5028e 100644
--- a/layers/descriptor_sets.cpp
+++ b/layers/descriptor_sets.cpp
@@ -1133,7 +1133,6 @@
     VkImageLayout image_layout = image_descriptor.GetImageLayout();
     const auto binding = binding_info.first;
     const auto reqs = binding_info.second.reqs;
-    const auto all_reqs = binding_info.second.all_reqs;
 
     if (image_descriptor.GetClass() == cvdescriptorset::DescriptorClass::ImageSampler) {
         sampler_states.emplace_back(
@@ -1168,8 +1167,8 @@
         const auto &image_view_ci = image_view_state->create_info;
         const auto *image_state = image_view_state->image_state.get();
 
-        if (all_reqs & DESCRIPTOR_REQ_ALL_VIEW_TYPE_BITS) {
-            if (~all_reqs & (1 << image_view_ci.viewType)) {
+        if (reqs & DESCRIPTOR_REQ_ALL_VIEW_TYPE_BITS) {
+            if (~reqs & (1 << image_view_ci.viewType)) {
                 auto set = descriptor_set->GetSet();
                 return LogError(set, vuids.descriptor_valid,
                                 "Descriptor set %s encountered the following validation error at %s time: Descriptor "
@@ -1177,8 +1176,7 @@
                                 report_data->FormatHandle(set).c_str(), caller, binding, index,
                                 StringDescriptorReqViewType(reqs).c_str(), string_VkImageViewType(image_view_ci.viewType));
             }
-        }
-        if (reqs & DESCRIPTOR_REQ_ALL_VIEW_TYPE_BITS) {
+
             if (!(reqs & image_view_state->descriptor_format_bits)) {
                 // bad component type
                 auto set = descriptor_set->GetSet();
diff --git a/layers/pipeline_state.cpp b/layers/pipeline_state.cpp
index f1de2e9..24f9a1a 100644
--- a/layers/pipeline_state.cpp
+++ b/layers/pipeline_state.cpp
@@ -66,9 +66,7 @@
       stage_flag(stage->stage),
       entrypoint(module_state->FindEntrypoint(stage->pName, stage->stage)),
       accessible_ids(module_state->MarkAccessibleIds(entrypoint)),
-      variable_ids(module_state->MarkVariableIds()),
       descriptor_uses(module_state->CollectInterfaceByDescriptorSlot(accessible_ids)),
-      all_descriptor_uses(module_state->CollectInterfaceByDescriptorSlot(variable_ids)),
       has_writable_descriptor(HasWriteableDescriptor(descriptor_uses)),
       has_atomic_descriptor(HasAtomicDescriptor(descriptor_uses)),
       wrote_primitive_shading_rate(WrotePrimitiveShadingRate(stage_flag, entrypoint, module_state.get())) {}
@@ -179,28 +177,6 @@
                 }
             }
         }
-        for (const auto &use : stage.all_descriptor_uses) {
-            // Don't add new sets, only new bindings
-            bool set_exists = false;
-            for (const auto &set : active_slots) {
-                if (set.first == use.first.set) {
-                    set_exists = true;
-                    break;
-                }
-            }
-            if (!set_exists) {
-                continue;
-            }
-            auto &entry = active_slots[use.first.set][use.first.binding];
-            auto &reqs = entry.all_reqs;
-            reqs |= stage.module_state->DescriptorTypeToReqs(use.second.type_id);
-            if (use.second.is_atomic_operation) reqs |= DESCRIPTOR_REQ_VIEW_ATOMIC_OPERATION;
-            if (use.second.is_sampler_implicitLod_dref_proj) reqs |= DESCRIPTOR_REQ_SAMPLER_IMPLICITLOD_DREF_PROJ;
-            if (use.second.is_sampler_bias_offset) reqs |= DESCRIPTOR_REQ_SAMPLER_BIAS_OFFSET;
-            if (use.second.is_read_without_format) reqs |= DESCRIPTOR_REQ_IMAGE_READ_WITHOUT_FORMAT;
-            if (use.second.is_write_without_format) reqs |= DESCRIPTOR_REQ_IMAGE_WRITE_WITHOUT_FORMAT;
-            if (use.second.is_dref_operation) reqs |= DESCRIPTOR_REQ_IMAGE_DREF;
-        }
     }
     return active_slots;
 }
diff --git a/layers/pipeline_state.h b/layers/pipeline_state.h
index 012fc31..896a882 100644
--- a/layers/pipeline_state.h
+++ b/layers/pipeline_state.h
@@ -85,11 +85,10 @@
 
 struct DescriptorRequirement {
     DescriptorReqFlags reqs;
-    DescriptorReqFlags all_reqs;
     bool is_writable;
     // Copy from StageState.interface_var. It combines from plural shader stages. The index of array is index of image.
     std::vector<layer_data::unordered_set<SamplerUsedByImage>> samplers_used_by_image;
-    DescriptorRequirement() : reqs(0), all_reqs(0), is_writable(false) {}
+    DescriptorRequirement() : reqs(0), is_writable(false) {}
 };
 
 inline bool operator==(const DescriptorRequirement &a, const DescriptorRequirement &b) NOEXCEPT { return a.reqs == b.reqs; }
@@ -104,10 +103,8 @@
     VkShaderStageFlagBits stage_flag;
     spirv_inst_iter entrypoint;
     layer_data::unordered_set<uint32_t> accessible_ids;
-    layer_data::unordered_set<uint32_t> variable_ids;
     using DescriptorUse = std::pair<DescriptorSlot, interface_var>;
     std::vector<DescriptorUse> descriptor_uses;
-    std::vector<DescriptorUse> all_descriptor_uses;
     bool has_writable_descriptor;
     bool has_atomic_descriptor;
     bool wrote_primitive_shading_rate;
diff --git a/layers/shader_module.cpp b/layers/shader_module.cpp
index 728a440..0f2169c 100644
--- a/layers/shader_module.cpp
+++ b/layers/shader_module.cpp
@@ -268,16 +268,6 @@
     return ids;
 }
 
-layer_data::unordered_set<uint32_t> SHADER_MODULE_STATE::MarkVariableIds() const {
-    layer_data::unordered_set<uint32_t> variable_ids;
-    for (const auto insn : *this) {
-        if (insn.opcode() == spv::OpVariable) {
-            variable_ids.insert(insn.word(2));
-        }
-    }
-    return variable_ids;
-}
-
 layer_data::optional<VkPrimitiveTopology> SHADER_MODULE_STATE::GetTopology(const spirv_inst_iter &entrypoint) const {
     layer_data::optional<VkPrimitiveTopology> result;
 
@@ -1533,11 +1523,11 @@
 }
 
 std::vector<std::pair<DescriptorSlot, interface_var>> SHADER_MODULE_STATE::CollectInterfaceByDescriptorSlot(
-    layer_data::unordered_set<uint32_t> const &ids) const {
+    layer_data::unordered_set<uint32_t> const &accessible_ids) const {
     std::vector<std::pair<DescriptorSlot, interface_var>> out;
     shader_module_used_operators operators;
 
-    for (auto id : ids) {
+    for (auto id : accessible_ids) {
         auto insn = get_def(id);
         assert(insn != end());
 
diff --git a/layers/shader_module.h b/layers/shader_module.h
index 5783eab..48d7f29 100644
--- a/layers/shader_module.h
+++ b/layers/shader_module.h
@@ -347,7 +347,6 @@
     std::string DescribeInstruction(const spirv_inst_iter &insn) const;
 
     layer_data::unordered_set<uint32_t> MarkAccessibleIds(spirv_inst_iter entrypoint) const;
-    layer_data::unordered_set<uint32_t> MarkVariableIds() const;
     layer_data::optional<VkPrimitiveTopology> GetTopology(const spirv_inst_iter &entrypoint) const;
     // TODO (https://github.com/KhronosGroup/Vulkan-ValidationLayers/issues/2450)
     // Since we currently don't support multiple entry points, this is a helper to return the topology
@@ -388,7 +387,7 @@
     void IsSpecificDescriptorType(const spirv_inst_iter &id_it, bool is_storage_buffer, bool is_check_writable,
                                   interface_var &out_interface_var, shader_module_used_operators &used_operators) const;
     std::vector<std::pair<DescriptorSlot, interface_var>> CollectInterfaceByDescriptorSlot(
-        layer_data::unordered_set<uint32_t> const &ids) const;
+        layer_data::unordered_set<uint32_t> const &accessible_ids) const;
     layer_data::unordered_set<uint32_t> CollectWritableOutputLocationinFS(const spirv_inst_iter &entrypoint) const;
     bool CollectInterfaceBlockMembers(std::map<location_t, interface_var> *out, bool is_array_of_verts, uint32_t id,
                                       uint32_t type_id, bool is_patch, uint32_t first_location) const;
