diff --git a/gdk/gdkvulkancontext.c b/gdk/gdkvulkancontext.c index 729f9e1d36..162cc3b46e 100644 --- a/gdk/gdkvulkancontext.c +++ b/gdk/gdkvulkancontext.c @@ -1859,8 +1859,9 @@ gdk_display_unref_vulkan (GdkDisplay *display) { g_free (key); vkDestroyShaderModule (display->vk_device, - value, + *((VkShaderModule *)value), NULL); + g_free (value); } g_hash_table_unref (display->vk_shader_modules); @@ -1988,13 +1989,13 @@ VkShaderModule gdk_display_get_vk_shader_module (GdkDisplay *self, const char *resource_name) { - VkShaderModule shader; + VkShaderModule *shader; GError *error = NULL; GBytes *bytes; shader = g_hash_table_lookup (self->vk_shader_modules, resource_name); if (shader) - return shader; + return *shader; bytes = g_resources_lookup_data (resource_name, 0, &error); if (bytes == NULL) @@ -2004,6 +2005,7 @@ gdk_display_get_vk_shader_module (GdkDisplay *self, return VK_NULL_HANDLE; } + shader = g_new0 (VkShaderModule, 1); if (GDK_VK_CHECK (vkCreateShaderModule, self->vk_device, &(VkShaderModuleCreateInfo) { .sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO, @@ -2011,18 +2013,20 @@ gdk_display_get_vk_shader_module (GdkDisplay *self, .pCode = (uint32_t *) g_bytes_get_data (bytes, NULL), }, NULL, - &shader) == VK_SUCCESS) + shader) == VK_SUCCESS) { g_hash_table_insert (self->vk_shader_modules, g_strdup (resource_name), shader); } else { - shader = VK_NULL_HANDLE; + g_free (shader); + + return VK_NULL_HANDLE; } g_bytes_unref (bytes); - return shader; + return *shader; } #else /* GDK_RENDERING_VULKAN */ diff --git a/gsk/gpu/gskvulkandevice.c b/gsk/gpu/gskvulkandevice.c index 5ee7e5764d..2188008f47 100644 --- a/gsk/gpu/gskvulkandevice.c +++ b/gsk/gpu/gskvulkandevice.c @@ -81,6 +81,7 @@ struct _PipelineCacheKey GskGpuShaderClip clip; GskGpuBlend blend; VkFormat format; + VkPipeline pipeline; }; struct _RenderPassCacheKey @@ -88,6 +89,7 @@ struct _RenderPassCacheKey VkFormat format; VkImageLayout from_layout; VkImageLayout to_layout; + VkRenderPass render_pass; }; static guint @@ -297,8 +299,10 @@ gsk_vulkan_pipeline_layout_unref (GskVulkanDevice *self, g_hash_table_iter_init (&iter, layout->pipeline_cache); while (g_hash_table_iter_next (&iter, &key, &value)) { + vkDestroyPipeline (display->vk_device, + ((PipelineCacheKey *)key)->pipeline, + NULL); g_free (key); - vkDestroyPipeline (display->vk_device, value, NULL); } g_hash_table_unref (layout->pipeline_cache); @@ -463,8 +467,10 @@ gsk_vulkan_device_finalize (GObject *object) g_hash_table_iter_init (&iter, self->render_pass_cache); while (g_hash_table_iter_next (&iter, &key, &value)) { + vkDestroyRenderPass (display->vk_device, + ((RenderPassCacheKey *)key)->render_pass, + NULL); g_free (key); - vkDestroyRenderPass (display->vk_device, value, NULL); } g_hash_table_unref (self->render_pass_cache); @@ -824,6 +830,7 @@ gsk_vulkan_device_get_vk_render_pass (GskVulkanDevice *self, VkImageLayout to_layout) { RenderPassCacheKey cache_key; + RenderPassCacheKey *cached_result; VkRenderPass render_pass; GdkDisplay *display; @@ -832,9 +839,9 @@ gsk_vulkan_device_get_vk_render_pass (GskVulkanDevice *self, .from_layout = from_layout, .to_layout = to_layout, }; - render_pass = g_hash_table_lookup (self->render_pass_cache, &cache_key); - if (render_pass) - return render_pass; + cached_result = g_hash_table_lookup (self->render_pass_cache, &cache_key); + if (cached_result) + return cached_result->render_pass; display = gsk_gpu_device_get_display (GSK_GPU_DEVICE (self)); @@ -878,7 +885,10 @@ gsk_vulkan_device_get_vk_render_pass (GskVulkanDevice *self, NULL, &render_pass); - g_hash_table_insert (self->render_pass_cache, g_memdup (&cache_key, sizeof (RenderPassCacheKey)), render_pass); + cached_result = g_memdup (&cache_key, sizeof (RenderPassCacheKey)); + cached_result->render_pass = render_pass; + + g_hash_table_insert (self->render_pass_cache, cached_result, cached_result); return render_pass; } @@ -946,6 +956,7 @@ gsk_vulkan_device_get_vk_pipeline (GskVulkanDevice *self, VkRenderPass render_pass) { PipelineCacheKey cache_key; + PipelineCacheKey *cached_result; VkPipeline pipeline; GdkDisplay *display; const char *version_string; @@ -961,9 +972,9 @@ gsk_vulkan_device_get_vk_pipeline (GskVulkanDevice *self, .blend = blend, .format = format, }; - pipeline = g_hash_table_lookup (layout->pipeline_cache, &cache_key); - if (pipeline) - return pipeline; + cached_result = g_hash_table_lookup (layout->pipeline_cache, &cache_key); + if (cached_result) + return cached_result->pipeline; display = gsk_gpu_device_get_display (GSK_GPU_DEVICE (self)); if (gsk_vulkan_device_has_feature (self, GDK_VULKAN_FEATURE_DYNAMIC_INDEXING) && @@ -1153,7 +1164,9 @@ gsk_vulkan_device_get_vk_pipeline (GskVulkanDevice *self, g_free (fragment_shader_name); g_free (vertex_shader_name); - g_hash_table_insert (layout->pipeline_cache, g_memdup (&cache_key, sizeof (PipelineCacheKey)), pipeline); + cached_result = g_memdup (&cache_key, sizeof (PipelineCacheKey)); + cached_result->pipeline = pipeline; + g_hash_table_insert (layout->pipeline_cache, cached_result, cached_result); gdk_display_vulkan_pipeline_cache_updated (display); return pipeline; diff --git a/gsk/gpu/gskvulkanmemory.c b/gsk/gpu/gskvulkanmemory.c index 4e6672caa9..45dbf034b1 100644 --- a/gsk/gpu/gskvulkanmemory.c +++ b/gsk/gpu/gskvulkanmemory.c @@ -178,7 +178,7 @@ gsk_vulkan_buddy_allocator_alloc (GskVulkanAllocator *allocator, if (self->cache.vk_memory) { *alloc = self->cache; - self->cache.vk_memory = NULL; + self->cache.vk_memory = VK_NULL_HANDLE; } else { @@ -240,7 +240,7 @@ restart: alloc->size <<= 1; if (slot == 0) { - if (self->cache.vk_memory == NULL) + if (self->cache.vk_memory == VK_NULL_HANDLE) self->cache = *alloc; else gsk_vulkan_free (self->allocator, alloc);