diff --git a/gsk/gpu/gskvulkanbuffer.c b/gsk/gpu/gskvulkanbuffer.c index 7a5e79c76b..9059529ef3 100644 --- a/gsk/gpu/gskvulkanbuffer.c +++ b/gsk/gpu/gskvulkanbuffer.c @@ -74,6 +74,7 @@ gsk_vulkan_buffer_new_internal (GskVulkanDevice *device, { VkMemoryRequirements requirements; GskVulkanBuffer *self; + gsize memory_index; self = g_object_new (GSK_TYPE_VULKAN_BUFFER, NULL); @@ -94,11 +95,14 @@ gsk_vulkan_buffer_new_internal (GskVulkanDevice *device, self->vk_buffer, &requirements); - self->allocator = gsk_vulkan_device_find_allocator (device, - requirements.memoryTypeBits, - GSK_VULKAN_MEMORY_MAPPABLE, - GSK_VULKAN_MEMORY_MAPPABLE | - VK_MEMORY_PROPERTY_HOST_CACHED_BIT); + memory_index = gsk_vulkan_device_find_allocator (device, + requirements.memoryTypeBits, + GSK_VULKAN_MEMORY_MAPPABLE, + GSK_VULKAN_MEMORY_MAPPABLE | + VK_MEMORY_PROPERTY_HOST_CACHED_BIT); + self->allocator = gsk_vulkan_device_get_allocator (device, memory_index); + gsk_vulkan_allocator_ref (self->allocator); + gsk_vulkan_alloc (self->allocator, requirements.size, requirements.alignment, diff --git a/gsk/gpu/gskvulkandevice.c b/gsk/gpu/gskvulkandevice.c index cc2a232004..a33ade73aa 100644 --- a/gsk/gpu/gskvulkandevice.c +++ b/gsk/gpu/gskvulkandevice.c @@ -1033,16 +1033,20 @@ gsk_vulkan_device_get_vk_pipeline (GskVulkanDevice *self, return vk_pipeline; } -static GskVulkanAllocator * +GskVulkanAllocator * gsk_vulkan_device_get_allocator (GskVulkanDevice *self, - gsize index, - const VkMemoryType *type) + gsize index) { if (self->allocators[index] == NULL) { + VkPhysicalDeviceMemoryProperties properties; + + vkGetPhysicalDeviceMemoryProperties (gsk_vulkan_device_get_vk_physical_device (self), + &properties); + self->allocators[index] = gsk_vulkan_direct_allocator_new (gsk_vulkan_device_get_vk_device (self), index, - type); + &properties.memoryTypes[index]); self->allocators[index] = gsk_vulkan_buddy_allocator_new (self->allocators[index], 1024 * 1024); //allocators[index] = gsk_vulkan_stats_allocator_new (allocators[index]); @@ -1053,11 +1057,11 @@ gsk_vulkan_device_get_allocator (GskVulkanDevice *self, /* following code found in * https://registry.khronos.org/vulkan/specs/1.3-extensions/man/html/VkPhysicalDeviceMemoryProperties.html */ -GskVulkanAllocator * -gsk_vulkan_device_find_allocator (GskVulkanDevice *self, - uint32_t allowed_types, - VkMemoryPropertyFlags required_flags, - VkMemoryPropertyFlags desired_flags) + gsize + gsk_vulkan_device_find_allocator (GskVulkanDevice *self, + uint32_t allowed_types, + VkMemoryPropertyFlags required_flags, + VkMemoryPropertyFlags desired_flags) { VkPhysicalDeviceMemoryProperties properties; uint32_t i, found; @@ -1085,7 +1089,7 @@ gsk_vulkan_device_find_allocator (GskVulkanDevice *self, g_assert (found < properties.memoryTypeCount); - return gsk_vulkan_allocator_ref (gsk_vulkan_device_get_allocator (self, found, &properties.memoryTypes[found])); + return found; } GskVulkanAllocator * diff --git a/gsk/gpu/gskvulkandeviceprivate.h b/gsk/gpu/gskvulkandeviceprivate.h index c9e9e18132..94a23901cc 100644 --- a/gsk/gpu/gskvulkandeviceprivate.h +++ b/gsk/gpu/gskvulkandeviceprivate.h @@ -67,10 +67,14 @@ VkPipeline gsk_vulkan_device_get_vk_pipeline (GskVulk VkRenderPass render_pass); GskVulkanAllocator * gsk_vulkan_device_get_external_allocator (GskVulkanDevice *self); -GskVulkanAllocator * gsk_vulkan_device_find_allocator (GskVulkanDevice *self, +GskVulkanAllocator * gsk_vulkan_device_get_allocator (GskVulkanDevice *self, + gsize index); + +gsize gsk_vulkan_device_find_allocator (GskVulkanDevice *self, uint32_t allowed_types, VkMemoryPropertyFlags required_flags, VkMemoryPropertyFlags desired_flags); + static inline VkResult gsk_vulkan_handle_result (VkResult res, const char *called_function) diff --git a/gsk/gpu/gskvulkanimage.c b/gsk/gpu/gskvulkanimage.c index 98178453c5..6fa9d59fd9 100644 --- a/gsk/gpu/gskvulkanimage.c +++ b/gsk/gpu/gskvulkanimage.c @@ -266,6 +266,7 @@ gsk_vulkan_image_new (GskVulkanDevice *device, GskGpuImageFlags flags; VkFormat vk_format, vk_srgb_format; VkComponentMapping vk_components; + gsize memory_index; g_assert (width > 0 && height > 0); @@ -387,10 +388,13 @@ gsk_vulkan_image_new (GskVulkanDevice *device, self->vk_image, &requirements); - self->allocator = gsk_vulkan_device_find_allocator (device, - requirements.memoryTypeBits, - 0, - tiling == VK_IMAGE_TILING_LINEAR ? GSK_VULKAN_MEMORY_MAPPABLE : 0); + memory_index = gsk_vulkan_device_find_allocator (device, + requirements.memoryTypeBits, + 0, + tiling == VK_IMAGE_TILING_LINEAR ? GSK_VULKAN_MEMORY_MAPPABLE : 0); + self->allocator = gsk_vulkan_device_get_allocator (device, memory_index); + gsk_vulkan_allocator_ref (self->allocator); + gsk_vulkan_alloc (self->allocator, requirements.size, requirements.alignment, @@ -677,6 +681,7 @@ gsk_vulkan_image_new_dmabuf (GskVulkanDevice *device, VkFormat vk_format, vk_srgb_format; VkComponentMapping vk_components; VkMemoryRequirements requirements; + gsize memory_index; GskVulkanImage *self; VkResult res; gsize n_modifiers; @@ -810,6 +815,10 @@ gsk_vulkan_image_new_dmabuf (GskVulkanDevice *device, self->vk_image, &requirements); + memory_index = gsk_vulkan_device_find_allocator (device, + requirements.memoryTypeBits, + 0, + VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT); self->allocator = gsk_vulkan_device_get_external_allocator (device); gsk_vulkan_allocator_ref (self->allocator); @@ -822,7 +831,7 @@ gsk_vulkan_image_new_dmabuf (GskVulkanDevice *device, &(VkMemoryAllocateInfo) { .sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO, .allocationSize = requirements.size, - .memoryTypeIndex = g_bit_nth_lsf (requirements.memoryTypeBits, -1), + .memoryTypeIndex = memory_index, .pNext = &(VkExportMemoryAllocateInfo) { .sType = VK_STRUCTURE_TYPE_EXPORT_MEMORY_ALLOCATE_INFO, .handleTypes = VK_EXTERNAL_MEMORY_HANDLE_TYPE_DMA_BUF_BIT_EXT, @@ -995,6 +1004,7 @@ gsk_vulkan_image_new_for_dmabuf (GskVulkanDevice *device, VkMemoryRequirements2 requirements = { .sType = VK_STRUCTURE_TYPE_MEMORY_REQUIREMENTS_2, }; + gsize memory_index; GSK_VK_CHECK (func_vkGetMemoryFdPropertiesKHR, vk_device, VK_EXTERNAL_MEMORY_HANDLE_TYPE_DMA_BUF_BIT_EXT, @@ -1038,6 +1048,10 @@ gsk_vulkan_image_new_for_dmabuf (GskVulkanDevice *device, } } + memory_index = gsk_vulkan_device_find_allocator (device, + fd_props.memoryTypeBits, + 0, + VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT); gsk_vulkan_alloc (self->allocator, requirements.memoryRequirements.size, requirements.memoryRequirements.alignment, @@ -1046,7 +1060,7 @@ gsk_vulkan_image_new_for_dmabuf (GskVulkanDevice *device, &(VkMemoryAllocateInfo) { .sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO, .allocationSize = requirements.memoryRequirements.size, - .memoryTypeIndex = g_bit_nth_lsf (fd_props.memoryTypeBits, -1), + .memoryTypeIndex = memory_index, .pNext = &(VkImportMemoryFdInfoKHR) { .sType = VK_STRUCTURE_TYPE_IMPORT_MEMORY_FD_INFO_KHR, .handleType = VK_EXTERNAL_MEMORY_HANDLE_TYPE_DMA_BUF_BIT_EXT,