diff options
| author | Tobin Ehlis <tobine@google.com> | 2017-07-20 08:38:33 -0600 |
|---|---|---|
| committer | Tobin Ehlis <tobine@google.com> | 2017-07-20 09:06:20 -0600 |
| commit | 0cd9410c29a460219ce62c2476e9471b36a213cc (patch) | |
| tree | 6347bf98d8e314625052893738cce7abd7176c50 /layers/core_validation.cpp | |
| parent | 071ee0516183ae9d7e992efe73ec0d3c91bf1921 (diff) | |
| download | usermoji-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.cpp | 15 |
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); } } |
