aboutsummaryrefslogtreecommitdiff
path: root/layers/core_validation.cpp
diff options
context:
space:
mode:
authorJean-François Marquis <jfmarquis@gmail.com>2017-10-30 18:14:15 -0400
committerMark Lobodzinski <mark@lunarg.com>2017-11-03 09:19:22 -0600
commit9ef531dfcde2c23bd3d8008c36439ad4f6aa79ce (patch)
treee1f93206874262e3aca56b6119437ba284aaa502 /layers/core_validation.cpp
parent9a8815136e5d086adac39f6e015c6e4728e5dc88 (diff)
downloadusermoji-9ef531dfcde2c23bd3d8008c36439ad4f6aa79ce.tar.xz
layers: Protect GetImage/BufferMemRqmts map access
Lock 'global_lock' while looking for IMAGE_STATE/BUFFER_STATE in GetBufferMemoryRequirements/GetImageMemoryRequirements. This is needed because other threads could add/remove other VkImage handles to/from the maps concurrently. The specs say the VkImage must be externally synchronized, but this doesn't cover the internals of the layers about VkImages in general. vkCreateImage, vkDestroyImage and vkBindImageMemory/vkBindBufferMemory correctly lock 'global_lock'. Change-Id: I93cb00c9a7f99efc927da52e42103ab72516397e
Diffstat (limited to 'layers/core_validation.cpp')
-rw-r--r--layers/core_validation.cpp12
1 files changed, 10 insertions, 2 deletions
diff --git a/layers/core_validation.cpp b/layers/core_validation.cpp
index 3af2df02..57bce8cb 100644
--- a/layers/core_validation.cpp
+++ b/layers/core_validation.cpp
@@ -3887,7 +3887,11 @@ VKAPI_ATTR void VKAPI_CALL GetBufferMemoryRequirements(VkDevice device, VkBuffer
VkMemoryRequirements *pMemoryRequirements) {
layer_data *dev_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
dev_data->dispatch_table.GetBufferMemoryRequirements(device, buffer, pMemoryRequirements);
- auto buffer_state = GetBufferState(dev_data, buffer);
+ BUFFER_STATE* buffer_state;
+ {
+ unique_lock_t lock(global_lock);
+ buffer_state = GetBufferState(dev_data, buffer);
+ }
if (buffer_state) {
buffer_state->requirements = *pMemoryRequirements;
buffer_state->memory_requirements_checked = true;
@@ -3897,7 +3901,11 @@ VKAPI_ATTR void VKAPI_CALL GetBufferMemoryRequirements(VkDevice device, VkBuffer
VKAPI_ATTR void VKAPI_CALL GetImageMemoryRequirements(VkDevice device, VkImage image, VkMemoryRequirements *pMemoryRequirements) {
layer_data *dev_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
dev_data->dispatch_table.GetImageMemoryRequirements(device, image, pMemoryRequirements);
- auto image_state = GetImageState(dev_data, image);
+ IMAGE_STATE* image_state;
+ {
+ unique_lock_t lock(global_lock);
+ image_state = GetImageState(dev_data, image);
+ }
if (image_state) {
image_state->requirements = *pMemoryRequirements;
image_state->memory_requirements_checked = true;