From 9ef531dfcde2c23bd3d8008c36439ad4f6aa79ce Mon Sep 17 00:00:00 2001 From: =?utf8?q?Jean-Fran=C3=A7ois=20Marquis?= Date: Mon, 30 Oct 2017 18:14:15 -0400 Subject: [PATCH] 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 --- layers/core_validation.cpp | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/layers/core_validation.cpp b/layers/core_validation.cpp index 3af2df0..57bce8c 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; -- 2.7.4