diff --git a/gsk/vulkan/gskvulkanmemory.c b/gsk/vulkan/gskvulkanmemory.c index abe59b4808..d5cced20a1 100644 --- a/gsk/vulkan/gskvulkanmemory.c +++ b/gsk/vulkan/gskvulkanmemory.c @@ -9,6 +9,7 @@ struct _GskVulkanMemory gsize size; + VkMemoryType vk_memory_type; VkDeviceMemory vk_memory; }; @@ -41,6 +42,7 @@ gsk_vulkan_memory_new (GdkVulkanContext *context, g_assert (i < properties.memoryTypeCount); + self->vk_memory_type = properties.memoryTypes[i]; GSK_VK_CHECK (vkAllocateMemory, gdk_vulkan_context_get_device (context), &(VkMemoryAllocateInfo) { .sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO, @@ -71,11 +73,33 @@ gsk_vulkan_memory_get_device_memory (GskVulkanMemory *self) return self->vk_memory; } +gboolean +gsk_vulkan_memory_can_map (GskVulkanMemory *self, + gboolean fast) +{ + if (!(self->vk_memory_type.propertyFlags & VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT)) + return FALSE; + + /* FIXME: no support implemented for this */ + if (!(self->vk_memory_type.propertyFlags & VK_MEMORY_PROPERTY_HOST_COHERENT_BIT)) + return FALSE; + + if (!fast) + return TRUE; + + if (!(self->vk_memory_type.propertyFlags & VK_MEMORY_PROPERTY_HOST_CACHED_BIT)) + return FALSE; + + return TRUE; +} + guchar * gsk_vulkan_memory_map (GskVulkanMemory *self) { void *data; + g_assert (gsk_vulkan_memory_can_map (self, FALSE)); + GSK_VK_CHECK (vkMapMemory, gdk_vulkan_context_get_device (self->vulkan), self->vk_memory, 0, diff --git a/gsk/vulkan/gskvulkanmemoryprivate.h b/gsk/vulkan/gskvulkanmemoryprivate.h index e8f0d932ed..5922bbda6f 100644 --- a/gsk/vulkan/gskvulkanmemoryprivate.h +++ b/gsk/vulkan/gskvulkanmemoryprivate.h @@ -14,6 +14,8 @@ void gsk_vulkan_memory_free (GskVulk VkDeviceMemory gsk_vulkan_memory_get_device_memory (GskVulkanMemory *self); +gboolean gsk_vulkan_memory_can_map (GskVulkanMemory *self, + gboolean fast); guchar * gsk_vulkan_memory_map (GskVulkanMemory *self); void gsk_vulkan_memory_unmap (GskVulkanMemory *self);