Skip to content

Commit

Permalink
layers: Add support for VK_EXT_descriptor_indexing
Browse files Browse the repository at this point in the history
Change-Id: Ieeaf9cbdff1c9b383d4f47ef678fe4a7467113cb
  • Loading branch information
jeffbolznv authored and mark-lunarg committed Apr 13, 2018
1 parent fa44374 commit 9fcd42c
Show file tree
Hide file tree
Showing 11 changed files with 1,020 additions and 170 deletions.
251 changes: 225 additions & 26 deletions layers/core_validation.cpp

Large diffs are not rendered by default.

1 change: 1 addition & 0 deletions layers/core_validation_types.h
Original file line number Diff line number Diff line change
Expand Up @@ -892,6 +892,7 @@ shader_module const *GetShaderModuleState(layer_data const *dev_data, VkShaderMo
const PHYS_DEV_PROPERTIES_NODE *GetPhysDevProperties(const layer_data *device_data);
const VkPhysicalDeviceFeatures *GetEnabledFeatures(const layer_data *device_data);
const DeviceExtensions *GetEnabledExtensions(const layer_data *device_data);
const VkPhysicalDeviceDescriptorIndexingFeaturesEXT *GetEnabledDescriptorIndexingFeatures(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 *, UNIQUE_VALIDATION_ERROR_CODE);
Expand Down
353 changes: 315 additions & 38 deletions layers/descriptor_sets.cpp

Large diffs are not rendered by default.

25 changes: 22 additions & 3 deletions layers/descriptor_sets.h
Original file line number Diff line number Diff line change
Expand Up @@ -127,6 +127,10 @@ class DescriptorSetLayoutDef {
VkShaderStageFlags GetStageFlagsFromBinding(const uint32_t binding) const {
return GetStageFlagsFromIndex(GetIndexFromBinding(binding));
}
VkDescriptorBindingFlagsEXT GetDescriptorBindingFlagsFromIndex(const uint32_t) const;
VkDescriptorBindingFlagsEXT GetDescriptorBindingFlagsFromBinding(const uint32_t binding) const {
return GetDescriptorBindingFlagsFromIndex(GetIndexFromBinding(binding));
}
uint32_t GetIndexFromGlobalIndex(const uint32_t global_index) const;
VkDescriptorType GetTypeFromGlobalIndex(const uint32_t global_index) const {
return GetTypeFromIndex(GetIndexFromGlobalIndex(global_index));
Expand Down Expand Up @@ -165,6 +169,7 @@ class DescriptorSetLayoutDef {
// to speed up the various lookups/queries/validations
VkDescriptorSetLayoutCreateFlags flags_;
std::vector<safe_VkDescriptorSetLayoutBinding> bindings_;
std::vector<VkDescriptorBindingFlagsEXT> binding_flags_;

// Convenience data structures for rapid lookup of various descriptor set layout properties
std::set<uint32_t> non_empty_bindings_; // Containing non-emtpy bindings in numerical order
Expand All @@ -175,7 +180,7 @@ class DescriptorSetLayoutDef {
// For a given binding map to associated index in the dynamic offset array
std::unordered_map<uint32_t, uint32_t> binding_to_dynamic_array_idx_map_;

uint32_t binding_count_; // # of bindings in this layout
uint32_t binding_count_; // # of bindings in this layout
uint32_t descriptor_count_; // total # descriptors in this layout
uint32_t dynamic_descriptor_count_;
BindingTypeStats binding_type_stats_;
Expand All @@ -194,7 +199,8 @@ class DescriptorSetLayout {
// Constructors and destructor
DescriptorSetLayout(const VkDescriptorSetLayoutCreateInfo *p_create_info, const VkDescriptorSetLayout layout);
// Validate create info - should be called prior to creation
static bool ValidateCreateInfo(const debug_report_data *, const VkDescriptorSetLayoutCreateInfo *, const bool, const uint32_t);
static bool ValidateCreateInfo(const debug_report_data *, const VkDescriptorSetLayoutCreateInfo *, const bool, const uint32_t,
const bool, const VkPhysicalDeviceDescriptorIndexingFeaturesEXT *descriptor_indexing_features);
bool HasBinding(const uint32_t binding) const { return layout_id_->HasBinding(binding); }
// Return true if this layout is compatible with passed in layout from a pipelineLayout,
// else return false and update error_msg with description of incompatibility
Expand Down Expand Up @@ -231,6 +237,12 @@ class DescriptorSetLayout {
VkShaderStageFlags GetStageFlagsFromBinding(const uint32_t binding) const {
return layout_id_->GetStageFlagsFromBinding(binding);
}
VkDescriptorBindingFlagsEXT GetDescriptorBindingFlagsFromIndex(const uint32_t index) const {
return layout_id_->GetDescriptorBindingFlagsFromIndex(index);
}
VkDescriptorBindingFlagsEXT GetDescriptorBindingFlagsFromBinding(const uint32_t binding) const {
return layout_id_->GetDescriptorBindingFlagsFromBinding(binding);
}
uint32_t GetIndexFromGlobalIndex(const uint32_t global_index) const {
return layout_id_->GetIndexFromGlobalIndex(global_index);
}
Expand Down Expand Up @@ -435,7 +447,7 @@ void PerformAllocateDescriptorSets(const VkDescriptorSetAllocateInfo *, const Vk
class DescriptorSet : public BASE_NODE {
public:
DescriptorSet(const VkDescriptorSet, const VkDescriptorPool, const std::shared_ptr<DescriptorSetLayout const> &,
core_validation::layer_data *);
uint32_t variable_count, core_validation::layer_data *);
~DescriptorSet();
// A number of common Get* functions that return data based on layout from which this set was created
uint32_t GetTotalDescriptorCount() const { return p_layout_->GetTotalDescriptorCount(); };
Expand Down Expand Up @@ -509,6 +521,12 @@ class DescriptorSet : public BASE_NODE {
// Return true if any part of set has ever been updated
bool IsUpdated() const { return some_update_; };
bool IsPushDescriptor() const { return p_layout_->IsPushDescriptor(); };
bool IsVariableDescriptorCount(uint32_t binding) const {
return !!(p_layout_->GetDescriptorBindingFlagsFromBinding(binding) &
VK_DESCRIPTOR_BINDING_VARIABLE_DESCRIPTOR_COUNT_BIT_EXT);
}
uint32_t GetVariableDescriptorCount() const { return variable_count_; }
DESCRIPTOR_POOL_STATE *GetPoolState() const { return pool_state_; }

private:
bool VerifyWriteUpdateContents(const VkWriteDescriptorSet *, const uint32_t, UNIQUE_VALIDATION_ERROR_CODE *,
Expand All @@ -528,6 +546,7 @@ class DescriptorSet : public BASE_NODE {
// Ptr to device data used for various data look-ups
core_validation::layer_data *const device_data_;
const VkPhysicalDeviceLimits limits_;
uint32_t variable_count_;

// Cached binding and validation support:
//
Expand Down
Loading

0 comments on commit 9fcd42c

Please sign in to comment.