diff options
| author | Jean-François Marquis <jfmarquis@gmail.com> | 2017-10-30 18:14:15 -0400 |
|---|---|---|
| committer | Mark Lobodzinski <mark@lunarg.com> | 2017-11-03 09:19:22 -0600 |
| commit | 9ef531dfcde2c23bd3d8008c36439ad4f6aa79ce (patch) | |
| tree | e1f93206874262e3aca56b6119437ba284aaa502 /layers/core_validation.cpp | |
| parent | 9a8815136e5d086adac39f6e015c6e4728e5dc88 (diff) | |
| download | usermoji-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.cpp | 12 |
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; |
