diff options
| author | Mark Lobodzinski <mark@lunarg.com> | 2016-11-15 07:59:58 -0700 |
|---|---|---|
| committer | Mark Lobodzinski <mark@lunarg.com> | 2016-11-16 13:59:47 -0700 |
| commit | b5d21d96f32824e04999e5452d614ff85f48029c (patch) | |
| tree | 10a38c79d9218df4fec9fc480c874a3e56108377 /layers/core_validation.cpp | |
| parent | e284f6741a45735dc7bee9ddd31e7192783a91b3 (diff) | |
| download | usermoji-b5d21d96f32824e04999e5452d614ff85f48029c.tar.xz | |
layers: Fixup MappedMemRanges call ordering
Moved validation out of API calls.
Change-Id: I95f3b24d69d469ea98b7c955bbab56c9b47ad487
Diffstat (limited to 'layers/core_validation.cpp')
| -rw-r--r-- | layers/core_validation.cpp | 42 |
1 files changed, 29 insertions, 13 deletions
diff --git a/layers/core_validation.cpp b/layers/core_validation.cpp index e62a3679..93521c15 100644 --- a/layers/core_validation.cpp +++ b/layers/core_validation.cpp @@ -11260,35 +11260,51 @@ static void CopyNoncoherentMemoryFromDriver(layer_data *dev_data, uint32_t mem_r } } +static bool PreCallValidateFlushMappedMemoryRanges(layer_data *dev_data, uint32_t mem_range_count, + const VkMappedMemoryRange *mem_ranges) { + bool skip = false; + std::lock_guard<std::mutex> lock(global_lock); + skip |= ValidateAndCopyNoncoherentMemoryToDriver(dev_data, mem_range_count, mem_ranges); + skip |= validateMemoryIsMapped(dev_data, "vkFlushMappedMemoryRanges", mem_range_count, mem_ranges); + return skip; +} + VKAPI_ATTR VkResult VKAPI_CALL FlushMappedMemoryRanges(VkDevice device, uint32_t memRangeCount, const VkMappedMemoryRange *pMemRanges) { VkResult result = VK_ERROR_VALIDATION_FAILED_EXT; - bool skip = false; layer_data *dev_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map); - std::unique_lock<std::mutex> lock(global_lock); - skip |= ValidateAndCopyNoncoherentMemoryToDriver(dev_data, memRangeCount, pMemRanges); - skip |= validateMemoryIsMapped(dev_data, "vkFlushMappedMemoryRanges", memRangeCount, pMemRanges); - lock.unlock(); - if (!skip) { + if (!PreCallValidateFlushMappedMemoryRanges(dev_data, memRangeCount, pMemRanges)) { result = dev_data->dispatch_table.FlushMappedMemoryRanges(device, memRangeCount, pMemRanges); } return result; } +static bool PreCallValidateInvalidateMappedMemoryRanges(layer_data *dev_data, uint32_t mem_range_count, + const VkMappedMemoryRange *mem_ranges) { + bool skip = false; + std::lock_guard<std::mutex> lock(global_lock); + skip |= validateMemoryIsMapped(dev_data, "vkInvalidateMappedMemoryRanges", mem_range_count, mem_ranges); + return skip; +} + +static void PostCallRecordInvalidateMappedMemoryRanges(layer_data *dev_data, uint32_t mem_range_count, + const VkMappedMemoryRange *mem_ranges) { + std::lock_guard<std::mutex> lock(global_lock); + // Update our shadow copy with modified driver data + CopyNoncoherentMemoryFromDriver(dev_data, mem_range_count, mem_ranges); +} + VKAPI_ATTR VkResult VKAPI_CALL InvalidateMappedMemoryRanges(VkDevice device, uint32_t memRangeCount, const VkMappedMemoryRange *pMemRanges) { VkResult result = VK_ERROR_VALIDATION_FAILED_EXT; - bool skip = false; layer_data *dev_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map); - std::unique_lock<std::mutex> lock(global_lock); - skip |= validateMemoryIsMapped(dev_data, "vkInvalidateMappedMemoryRanges", memRangeCount, pMemRanges); - lock.unlock(); - if (!skip) { + if (!PreCallValidateInvalidateMappedMemoryRanges(dev_data, memRangeCount, pMemRanges)) { result = dev_data->dispatch_table.InvalidateMappedMemoryRanges(device, memRangeCount, pMemRanges); - // Update our shadow copy with modified driver data - CopyNoncoherentMemoryFromDriver(dev_data, memRangeCount, pMemRanges); + if (result == VK_SUCCESS) { + PostCallRecordInvalidateMappedMemoryRanges(dev_data, memRangeCount, pMemRanges); + } } return result; } |
