From 0cd9410c29a460219ce62c2476e9471b36a213cc Mon Sep 17 00:00:00 2001 From: Tobin Ehlis Date: Thu, 20 Jul 2017 08:38:33 -0600 Subject: 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. --- layers/core_validation.cpp | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) (limited to 'layers/core_validation.cpp') 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); } } -- cgit v1.2.3