From 4c677e4dcd7275e1b4056495d6e96d675d2f0641 Mon Sep 17 00:00:00 2001 From: Chun-wei Fan Date: Mon, 27 May 2024 18:55:08 +0800 Subject: [PATCH 1/3] gskvulkanmemory.c: Use VK_NULL_HANDLE for VkDeviceMemory ...rather than NULL, so that things will build fine on non-LLP, non-64-bit systems. --- gsk/gpu/gskvulkanmemory.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) 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); From 5935bc95b772241cbebb157b1790dfab5541ff99 Mon Sep 17 00:00:00 2001 From: Chun-wei Fan Date: Sat, 25 May 2024 10:53:41 +0800 Subject: [PATCH 2/3] gdkvulkancontext.c: Use pointers to hash VkShaderModule VkShaderModule's may or may not be pointers depending on the target platform, so use pointers to hash those handles to be safe, and retrieve them from hashes accordingly. Fixes build on 32-bit Windows at least. --- gdk/gdkvulkancontext.c | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) 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 */ From 9dbdbaca43f5b82d0538c4f125f7c4eaca42ce95 Mon Sep 17 00:00:00 2001 From: Chun-wei Fan Date: Sat, 25 May 2024 10:56:07 +0800 Subject: [PATCH 3/3] gskvulkandevice.c: Put Vk[Pipeline|RenderPass] in structures This way, we can simply duplicate the keys as separate pointers to store the corresponding Vulkan handles so that we can safely hash them, as Vulkan handles may or may not be pointers depending on the target platform. This will fix builds on 32-bit Windows at least. --- gsk/gpu/gskvulkandevice.c | 33 +++++++++++++++++++++++---------- 1 file changed, 23 insertions(+), 10 deletions(-) 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;