aboutsummaryrefslogtreecommitdiff
path: root/layers/core_validation.cpp
diff options
context:
space:
mode:
authorTobin Ehlis <tobine@google.com>2017-07-20 08:38:33 -0600
committerTobin Ehlis <tobine@google.com>2017-07-20 09:06:20 -0600
commit0cd9410c29a460219ce62c2476e9471b36a213cc (patch)
tree6347bf98d8e314625052893738cce7abd7176c50 /layers/core_validation.cpp
parent071ee0516183ae9d7e992efe73ec0d3c91bf1921 (diff)
downloadusermoji-0cd9410c29a460219ce62c2476e9471b36a213cc.tar.xz
layers:Update descriptor state earlier
This change arises from an issue reported by Alon at Samsung. He reports that a driver bug is modifying the descriptor set state on UpdateDescriptorSets() call, so the data is getting corrupted in validation. Since UpdateDescriptorSets() is a void function, it doesn't make a difference in validation if we update state before or after the call, since the call itself won't change the state being updated. It actually saves us a lock call to update pre-call.
Diffstat (limited to 'layers/core_validation.cpp')
-rw-r--r--layers/core_validation.cpp15
1 files changed, 7 insertions, 8 deletions
diff --git a/layers/core_validation.cpp b/layers/core_validation.cpp
index 19c68420..57f9d4ef 100644
--- a/layers/core_validation.cpp
+++ b/layers/core_validation.cpp
@@ -4869,9 +4869,9 @@ static bool PreCallValidateUpdateDescriptorSets(layer_data *dev_data, uint32_t d
descriptorCopyCount, pDescriptorCopies);
}
// PostCallRecord* handles recording state updates following call down chain to UpdateDescriptorSets()
-static void PostCallRecordUpdateDescriptorSets(layer_data *dev_data, uint32_t descriptorWriteCount,
- const VkWriteDescriptorSet *pDescriptorWrites, uint32_t descriptorCopyCount,
- const VkCopyDescriptorSet *pDescriptorCopies) {
+static void PreCallRecordUpdateDescriptorSets(layer_data *dev_data, uint32_t descriptorWriteCount,
+ const VkWriteDescriptorSet *pDescriptorWrites, uint32_t descriptorCopyCount,
+ const VkCopyDescriptorSet *pDescriptorCopies) {
cvdescriptorset::PerformUpdateDescriptorSets(dev_data, descriptorWriteCount, pDescriptorWrites, descriptorCopyCount,
pDescriptorCopies);
}
@@ -4884,14 +4884,13 @@ VKAPI_ATTR void VKAPI_CALL UpdateDescriptorSets(VkDevice device, uint32_t descri
unique_lock_t lock(global_lock);
bool skip = PreCallValidateUpdateDescriptorSets(dev_data, descriptorWriteCount, pDescriptorWrites, descriptorCopyCount,
pDescriptorCopies);
- lock.unlock();
if (!skip) {
+ // Since UpdateDescriptorSets() is void, nothing to check prior to updating state & we can update before call down chain
+ PreCallRecordUpdateDescriptorSets(dev_data, descriptorWriteCount, pDescriptorWrites, descriptorCopyCount,
+ pDescriptorCopies);
+ lock.unlock();
dev_data->dispatch_table.UpdateDescriptorSets(device, descriptorWriteCount, pDescriptorWrites, descriptorCopyCount,
pDescriptorCopies);
- lock.lock();
- // Since UpdateDescriptorSets() is void, nothing to check prior to updating state
- PostCallRecordUpdateDescriptorSets(dev_data, descriptorWriteCount, pDescriptorWrites, descriptorCopyCount,
- pDescriptorCopies);
}
}