aboutsummaryrefslogtreecommitdiff
path: root/layers/descriptor_sets.h
diff options
context:
space:
mode:
Diffstat (limited to 'layers/descriptor_sets.h')
-rw-r--r--layers/descriptor_sets.h58
1 files changed, 29 insertions, 29 deletions
diff --git a/layers/descriptor_sets.h b/layers/descriptor_sets.h
index ed9bd4014..598f4395e 100644
--- a/layers/descriptor_sets.h
+++ b/layers/descriptor_sets.h
@@ -48,7 +48,6 @@ struct IndexRange {
uint32_t start;
uint32_t end;
};
-typedef std::map<uint32_t, descriptor_req> BindingReqMap;
/*
* DescriptorSetLayoutDef/DescriptorSetLayout classes
@@ -359,7 +358,7 @@ class Descriptor {
virtual void WriteUpdate(const VkWriteDescriptorSet *, const uint32_t) = 0;
virtual void CopyUpdate(const Descriptor *) = 0;
// Create binding between resources of this descriptor and given cb_node
- virtual void UpdateDrawState(CoreChecks *, CMD_BUFFER_STATE *) = 0;
+ virtual void UpdateDrawState(ValidationStateTracker *, CMD_BUFFER_STATE *) = 0;
virtual DescriptorClass GetClass() const { return descriptor_class; };
// Special fast-path check for SamplerDescriptors that are immutable
virtual bool IsImmutableSampler() const { return false; };
@@ -380,14 +379,15 @@ bool ValidateDescriptorSetLayoutCreateInfo(const debug_report_data *report_data,
const bool descriptor_indexing_ext,
const VkPhysicalDeviceDescriptorIndexingFeaturesEXT *descriptor_indexing_features,
const VkPhysicalDeviceInlineUniformBlockFeaturesEXT *inline_uniform_block_features,
- const VkPhysicalDeviceInlineUniformBlockPropertiesEXT *inline_uniform_block_props);
+ const VkPhysicalDeviceInlineUniformBlockPropertiesEXT *inline_uniform_block_props,
+ const DeviceExtensions *device_extensions);
class SamplerDescriptor : public Descriptor {
public:
SamplerDescriptor(const VkSampler *);
void WriteUpdate(const VkWriteDescriptorSet *, const uint32_t) override;
void CopyUpdate(const Descriptor *) override;
- void UpdateDrawState(CoreChecks *, CMD_BUFFER_STATE *) override;
+ void UpdateDrawState(ValidationStateTracker *, CMD_BUFFER_STATE *) override;
virtual bool IsImmutableSampler() const override { return immutable_; };
VkSampler GetSampler() const { return sampler_; }
@@ -401,7 +401,7 @@ class ImageSamplerDescriptor : public Descriptor {
ImageSamplerDescriptor(const VkSampler *);
void WriteUpdate(const VkWriteDescriptorSet *, const uint32_t) override;
void CopyUpdate(const Descriptor *) override;
- void UpdateDrawState(CoreChecks *, CMD_BUFFER_STATE *) override;
+ void UpdateDrawState(ValidationStateTracker *, CMD_BUFFER_STATE *) override;
virtual bool IsImmutableSampler() const override { return immutable_; };
VkSampler GetSampler() const { return sampler_; }
VkImageView GetImageView() const { return image_view_; }
@@ -419,7 +419,7 @@ class ImageDescriptor : public Descriptor {
ImageDescriptor(const VkDescriptorType);
void WriteUpdate(const VkWriteDescriptorSet *, const uint32_t) override;
void CopyUpdate(const Descriptor *) override;
- void UpdateDrawState(CoreChecks *, CMD_BUFFER_STATE *) override;
+ void UpdateDrawState(ValidationStateTracker *, CMD_BUFFER_STATE *) override;
virtual bool IsStorage() const override { return storage_; }
VkImageView GetImageView() const { return image_view_; }
VkImageLayout GetImageLayout() const { return image_layout_; }
@@ -435,7 +435,7 @@ class TexelDescriptor : public Descriptor {
TexelDescriptor(const VkDescriptorType);
void WriteUpdate(const VkWriteDescriptorSet *, const uint32_t) override;
void CopyUpdate(const Descriptor *) override;
- void UpdateDrawState(CoreChecks *, CMD_BUFFER_STATE *) override;
+ void UpdateDrawState(ValidationStateTracker *, CMD_BUFFER_STATE *) override;
virtual bool IsStorage() const override { return storage_; }
VkBufferView GetBufferView() const { return buffer_view_; }
@@ -449,7 +449,7 @@ class BufferDescriptor : public Descriptor {
BufferDescriptor(const VkDescriptorType);
void WriteUpdate(const VkWriteDescriptorSet *, const uint32_t) override;
void CopyUpdate(const Descriptor *) override;
- void UpdateDrawState(CoreChecks *, CMD_BUFFER_STATE *) override;
+ void UpdateDrawState(ValidationStateTracker *, CMD_BUFFER_STATE *) override;
virtual bool IsDynamic() const override { return dynamic_; }
virtual bool IsStorage() const override { return storage_; }
VkBuffer GetBuffer() const { return buffer_; }
@@ -472,7 +472,7 @@ class InlineUniformDescriptor : public Descriptor {
}
void WriteUpdate(const VkWriteDescriptorSet *, const uint32_t) override { updated = true; }
void CopyUpdate(const Descriptor *) override { updated = true; }
- void UpdateDrawState(CoreChecks *, CMD_BUFFER_STATE *) override {}
+ void UpdateDrawState(ValidationStateTracker *, CMD_BUFFER_STATE *) override {}
};
class AccelerationStructureDescriptor : public Descriptor {
@@ -483,7 +483,7 @@ class AccelerationStructureDescriptor : public Descriptor {
}
void WriteUpdate(const VkWriteDescriptorSet *, const uint32_t) override { updated = true; }
void CopyUpdate(const Descriptor *) override { updated = true; }
- void UpdateDrawState(CoreChecks *, CMD_BUFFER_STATE *) override {}
+ void UpdateDrawState(ValidationStateTracker *, CMD_BUFFER_STATE *) override {}
};
// Structs to contain common elements that need to be shared between Validate* and Perform* calls below
@@ -559,10 +559,6 @@ class DescriptorSet : public BASE_NODE {
}
// Return true if given binding is present in this set
bool HasBinding(const uint32_t binding) const { return p_layout_->HasBinding(binding); };
- // For given set of bindings, add any buffers and images that will be updated to their respective unordered_sets & return number
- // of objects inserted
- uint32_t GetStorageUpdates(const std::map<uint32_t, descriptor_req> &, std::unordered_set<VkBuffer> *,
- std::unordered_set<VkImageView> *) const;
std::string StringifySetAndLayout() const;
@@ -580,17 +576,17 @@ class DescriptorSet : public BASE_NODE {
std::unordered_set<CMD_BUFFER_STATE *> GetBoundCmdBuffers() const { return cb_bindings; }
// Bind given cmd_buffer to this descriptor set and
// update CB image layout map with image/imagesampler descriptor image layouts
- void UpdateDrawState(CoreChecks *, CMD_BUFFER_STATE *, const std::map<uint32_t, descriptor_req> &);
+ void UpdateDrawState(ValidationStateTracker *, CMD_BUFFER_STATE *, const std::map<uint32_t, descriptor_req> &);
// Track work that has been bound or validated to avoid duplicate work, important when large descriptor arrays
// are present
typedef std::unordered_set<uint32_t> TrackedBindings;
- static void FilterAndTrackOneBindingReq(const BindingReqMap::value_type &binding_req_pair, const BindingReqMap &in_req,
- BindingReqMap *out_req, TrackedBindings *set);
- static void FilterAndTrackOneBindingReq(const BindingReqMap::value_type &binding_req_pair, const BindingReqMap &in_req,
- BindingReqMap *out_req, TrackedBindings *set, uint32_t limit);
- void FilterAndTrackBindingReqs(CMD_BUFFER_STATE *, const BindingReqMap &in_req, BindingReqMap *out_req);
- void FilterAndTrackBindingReqs(CMD_BUFFER_STATE *, PIPELINE_STATE *, const BindingReqMap &in_req, BindingReqMap *out_req);
+ static void FilterOneBindingReq(const BindingReqMap::value_type &binding_req_pair, BindingReqMap *out_req,
+ const TrackedBindings &set, uint32_t limit);
+ void FilterBindingReqs(const CMD_BUFFER_STATE &, const PIPELINE_STATE &, const BindingReqMap &in_req,
+ BindingReqMap *out_req) const;
+ void UpdateValidationCache(const CMD_BUFFER_STATE &cb_state, const PIPELINE_STATE &pipeline,
+ const BindingReqMap &updated_bindings);
void ClearCachedDynamicDescriptorValidation(CMD_BUFFER_STATE *cb_state) {
cached_validation_[cb_state].dynamic_buffers.clear();
}
@@ -623,6 +619,7 @@ class DescriptorSet : public BASE_NODE {
uint32_t GetVariableDescriptorCount() const { return variable_count_; }
DESCRIPTOR_POOL_STATE *GetPoolState() const { return pool_state_; }
const Descriptor *GetDescriptorFromGlobalIndex(const uint32_t index) const { return descriptors_[index].get(); }
+ uint64_t GetChangeCount() const { return change_count_; }
private:
// Private helper to set all bound cmd buffers to INVALID state
@@ -634,6 +631,7 @@ class DescriptorSet : public BASE_NODE {
std::vector<std::unique_ptr<Descriptor>> descriptors_;
StateTracker *state_data_;
uint32_t variable_count_;
+ uint64_t change_count_;
// Cached binding and validation support:
//
@@ -643,12 +641,12 @@ class DescriptorSet : public BASE_NODE {
// Track the validation caching of bindings vs. the command buffer and draw state
typedef std::unordered_map<uint32_t, CMD_BUFFER_STATE::ImageLayoutUpdateCount> VersionedBindings;
struct CachedValidation {
- TrackedBindings command_binding_and_usage; // Persistent for the life of the recording
- TrackedBindings non_dynamic_buffers; // Persistent for the life of the recording
- TrackedBindings dynamic_buffers; // Dirtied (flushed) each BindDescriptorSet
- std::unordered_map<PIPELINE_STATE *, VersionedBindings> image_samplers; // Tested vs. changes to CB's ImageLayout
+ TrackedBindings command_binding_and_usage; // Persistent for the life of the recording
+ TrackedBindings non_dynamic_buffers; // Persistent for the life of the recording
+ TrackedBindings dynamic_buffers; // Dirtied (flushed) each BindDescriptorSet
+ std::unordered_map<const PIPELINE_STATE *, VersionedBindings> image_samplers; // Tested vs. changes to CB's ImageLayout
};
- typedef std::unordered_map<CMD_BUFFER_STATE *, CachedValidation> CachedValidationMap;
+ typedef std::unordered_map<const CMD_BUFFER_STATE *, CachedValidation> CachedValidationMap;
// Image and ImageView bindings are validated per pipeline and not invalidate by repeated binding
CachedValidationMap cached_validation_;
};
@@ -658,10 +656,12 @@ class PrefilterBindRequestMap {
static const uint32_t kManyDescriptors_ = 64; // TODO base this number on measured data
std::unique_ptr<BindingReqMap> filtered_map_;
const BindingReqMap &orig_map_;
+ const DescriptorSet &descriptor_set_;
- PrefilterBindRequestMap(DescriptorSet &ds, const BindingReqMap &in_map, CMD_BUFFER_STATE *cb_state);
- PrefilterBindRequestMap(DescriptorSet &ds, const BindingReqMap &in_map, CMD_BUFFER_STATE *cb_state, PIPELINE_STATE *);
- const BindingReqMap &Map() const { return (filtered_map_) ? *filtered_map_ : orig_map_; }
+ PrefilterBindRequestMap(const DescriptorSet &ds, const BindingReqMap &in_map)
+ : filtered_map_(), orig_map_(in_map), descriptor_set_(ds) {}
+ const BindingReqMap &FilteredMap(const CMD_BUFFER_STATE &cb_state, const PIPELINE_STATE &);
+ bool IsManyDescriptors() const { return descriptor_set_.GetTotalDescriptorCount() > kManyDescriptors_; }
};
} // namespace cvdescriptorset
#endif // CORE_VALIDATION_DESCRIPTOR_SETS_H_