Add a lock to guard the usage of sVkEmulation->queue Test: compile Change-Id: Idd6d3ee9d953529913351230f649008a6dee8abe
diff --git a/stream-servers/vulkan/VkCommonOperations.cpp b/stream-servers/vulkan/VkCommonOperations.cpp index fd23434..37beef0 100644 --- a/stream-servers/vulkan/VkCommonOperations.cpp +++ b/stream-servers/vulkan/VkCommonOperations.cpp
@@ -926,10 +926,14 @@ // LOG(VERBOSE) << "Vulkan logical device created and extension functions obtained.\n"; - dvk->vkGetDeviceQueue( + sVkEmulation->queueLock = std::make_shared<android::base::Lock>(); + { + android::base::AutoLock lock(*sVkEmulation->queueLock); + dvk->vkGetDeviceQueue( sVkEmulation->device, sVkEmulation->deviceInfo.graphicsQueueFamilyIndices[0], 0, &sVkEmulation->queue); + } sVkEmulation->queueFamilyIndex = sVkEmulation->deviceInfo.graphicsQueueFamilyIndices[0]; @@ -1677,7 +1681,10 @@ if (!infoPtr) return false; auto& info = *infoPtr; - + { + android::base::AutoLock lock(*sVkEmulation->queueLock); + VK_CHECK(vk->vkQueueWaitIdle(sVkEmulation->queue)); + } vk->vkDestroyImage(sVkEmulation->device, info.image, nullptr); freeExternalMemoryLocked(vk, &info.memory); @@ -1818,10 +1825,11 @@ 0, nullptr, }; - vk->vkQueueSubmit( - sVkEmulation->queue, - 1, &submitInfo, - sVkEmulation->commandBufferFence); + { + android::base::AutoLock lock(*sVkEmulation->queueLock); + vk->vkQueueSubmit(sVkEmulation->queue, 1, &submitInfo, + sVkEmulation->commandBufferFence); + } static constexpr uint64_t ANB_MAX_WAIT_NS = 5ULL * 1000ULL * 1000ULL * 1000ULL; @@ -2025,10 +2033,11 @@ 0, nullptr, }; - vk->vkQueueSubmit( - sVkEmulation->queue, - 1, &submitInfo, - sVkEmulation->commandBufferFence); + { + android::base::AutoLock lock(*sVkEmulation->queueLock); + vk->vkQueueSubmit(sVkEmulation->queue, 1, &submitInfo, + sVkEmulation->commandBufferFence); + } static constexpr uint64_t ANB_MAX_WAIT_NS = 5ULL * 1000ULL * 1000ULL * 1000ULL; @@ -2333,6 +2342,10 @@ auto infoPtr = android::base::find(sVkEmulation->buffers, bufferHandle); if (!infoPtr) return false; + { + android::base::AutoLock lock(*sVkEmulation->queueLock); + VK_CHECK(vk->vkQueueWaitIdle(sVkEmulation->queue)); + } auto& info = *infoPtr; vk->vkDestroyBuffer(sVkEmulation->device, info.buffer, nullptr);