aboutsummaryrefslogtreecommitdiff
path: root/layers/core_validation.cpp
diff options
context:
space:
mode:
authorMark Lobodzinski <mark@lunarg.com>2016-11-15 07:59:58 -0700
committerMark Lobodzinski <mark@lunarg.com>2016-11-16 13:59:47 -0700
commitb5d21d96f32824e04999e5452d614ff85f48029c (patch)
tree10a38c79d9218df4fec9fc480c874a3e56108377 /layers/core_validation.cpp
parente284f6741a45735dc7bee9ddd31e7192783a91b3 (diff)
downloadusermoji-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.cpp42
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;
}