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.
This commit is contained in:
Bas Nieuwenhuizen 2021-11-14 02:07:56 +01:00 committed by Pierre-Loup A. Griffais
parent 5f6940f7d6
commit 3a1776f0f8

View file

@ -108,6 +108,7 @@ struct VkPhysicalDeviceMemoryProperties memoryProperties;
VulkanOutput_t g_output;
std::unordered_map<VulkanTexture_t, CVulkanTexture *> g_mapVulkanTextures;
std::mutex g_mapVulkanTexturesMutex;
std::atomic<VulkanTexture_t> 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<std::mutex> m( g_mapVulkanTexturesMutex );
return g_mapVulkanTextures[ tex ];
}
static void setVulkanTexture( VulkanTexture_t tex, CVulkanTexture *val )
{
std::lock_guard<std::mutex> 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;
}