From 3a1776f0f8f5602963b4de5c8b7906b9c7df2f1e Mon Sep 17 00:00:00 2001 From: Bas Nieuwenhuizen Date: Sun, 14 Nov 2021 02:07:56 +0100 Subject: [PATCH] Properly lock the id->CVulkanTexture map. Only locks the map itself, the lifetime of the texture itself has still to be known to be valid. --- src/rendervulkan.cpp | 38 ++++++++++++++++++++++++++------------ 1 file changed, 26 insertions(+), 12 deletions(-) diff --git a/src/rendervulkan.cpp b/src/rendervulkan.cpp index 8752dd7..bd454a3 100644 --- a/src/rendervulkan.cpp +++ b/src/rendervulkan.cpp @@ -108,6 +108,7 @@ struct VkPhysicalDeviceMemoryProperties memoryProperties; VulkanOutput_t g_output; std::unordered_map g_mapVulkanTextures; +std::mutex g_mapVulkanTexturesMutex; std::atomic g_nMaxVulkanTexHandle; struct VulkanSamplerCacheEntry_t @@ -296,6 +297,19 @@ static VkResult getModifierProps( const VkImageCreateInfo *imageInfo, uint64_t m return vkGetPhysicalDeviceImageFormatProperties2(physicalDevice, &imageFormatInfo, &imageProps); } + +static CVulkanTexture *getVulkanTexture( VulkanTexture_t tex ) +{ + std::lock_guard m( g_mapVulkanTexturesMutex ); + return g_mapVulkanTextures[ tex ]; +} + +static void setVulkanTexture( VulkanTexture_t tex, CVulkanTexture *val ) +{ + std::lock_guard m( g_mapVulkanTexturesMutex ); + g_mapVulkanTextures[ tex ] = val; +} + bool CVulkanTexture::BInit( uint32_t width, uint32_t height, VkFormat format, createFlags flags, wlr_dmabuf_attributes *pDMA /* = nullptr */ ) { VkResult res = VK_ERROR_INITIALIZATION_FAILED; @@ -1856,7 +1870,7 @@ void vulkan_garbage_collect( void ) if ( pTex->nRefCount == 0 ) { - g_mapVulkanTextures[ pTex->handle ] = nullptr; + setVulkanTexture( pTex->handle, nullptr); delete pTex; } } @@ -1883,7 +1897,7 @@ VulkanTexture_t vulkan_create_texture_from_dmabuf( struct wlr_dmabuf_attributes } ret = ++g_nMaxVulkanTexHandle; - g_mapVulkanTextures[ ret ] = pTex; + setVulkanTexture( ret, pTex ); pTex->handle = ret; @@ -1931,7 +1945,7 @@ VulkanTexture_t vulkan_create_texture_from_bits( uint32_t width, uint32_t height submit_command_buffer( handle, refs ); ret = ++g_nMaxVulkanTexHandle; - g_mapVulkanTextures[ ret ] = pTex; + setVulkanTexture( ret, pTex ); pTex->handle = ret; @@ -1943,7 +1957,7 @@ void vulkan_free_texture( VulkanTexture_t vulkanTex ) if ( vulkanTex == 0 ) return; - CVulkanTexture *pTex = g_mapVulkanTextures[ vulkanTex ]; + CVulkanTexture *pTex = getVulkanTexture( vulkanTex ); assert( pTex != nullptr ); assert( pTex->handle == vulkanTex ); @@ -1953,7 +1967,7 @@ void vulkan_free_texture( VulkanTexture_t vulkanTex ) if ( pTex->nRefCount == 0 ) { delete pTex; - g_mapVulkanTextures[ vulkanTex ] = nullptr; + setVulkanTexture( vulkanTex, nullptr ); } } @@ -2040,11 +2054,11 @@ void vulkan_update_descriptor( struct Composite_t *pComposite, struct VulkanPipe if ( pPipeline->layerBindings[ i ].tex != 0 ) { - pTex = g_mapVulkanTextures[ pPipeline->layerBindings[ i ].tex ]; + pTex = getVulkanTexture( pPipeline->layerBindings[ i ].tex ); } else { - pTex = g_mapVulkanTextures[ g_emptyTex ]; + pTex = getVulkanTexture( g_emptyTex ); } // First try to look up the sampler in the cache. @@ -2149,7 +2163,7 @@ bool vulkan_composite( struct Composite_t *pComposite, struct VulkanPipeline_t * { if ( pPipeline->layerBindings[ i ].tex != 0 ) { - CVulkanTexture *pTex = g_mapVulkanTextures[ pPipeline->layerBindings[ i ].tex ]; + CVulkanTexture *pTex = getVulkanTexture( pPipeline->layerBindings[ i ].tex ); if (pTex->m_format == VK_FORMAT_G8_B8R8_2PLANE_420_UNORM) pComposite->nYCBCRMask |= 1 << i; } @@ -2411,9 +2425,9 @@ uint32_t vulkan_texture_get_fbid( VulkanTexture_t vulkanTex ) if ( vulkanTex == 0 ) return 0; - assert( g_mapVulkanTextures[ vulkanTex ] != nullptr ); + assert( getVulkanTexture( vulkanTex ) != nullptr ); - uint32_t ret = g_mapVulkanTextures[ vulkanTex ]->m_FBID; + uint32_t ret = getVulkanTexture( vulkanTex )->m_FBID; assert( ret != 0 ); @@ -2427,7 +2441,7 @@ int vulkan_texture_get_fence( VulkanTexture_t vulkanTex ) const VkMemoryGetFdInfoKHR memory_get_fd_info = { .sType = VK_STRUCTURE_TYPE_MEMORY_GET_FD_INFO_KHR, .pNext = NULL, - .memory = g_mapVulkanTextures[ vulkanTex ]->m_vkImageMemory, + .memory = getVulkanTexture( vulkanTex )->m_vkImageMemory, .handleType = VK_EXTERNAL_MEMORY_HANDLE_TYPE_DMA_BUF_BIT_EXT, }; int fence = -1; @@ -2644,7 +2658,7 @@ VulkanTexture_t vulkan_create_texture_from_wlr_buffer( struct wlr_buffer *buf ) VulkanTexture_t texid = ++g_nMaxVulkanTexHandle; pTex->handle = texid; - g_mapVulkanTextures[ texid ] = pTex; + setVulkanTexture( texid, pTex ); return texid; }