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:
parent
5f6940f7d6
commit
3a1776f0f8
1 changed files with 26 additions and 12 deletions
|
@ -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;
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue