vulkan: Add gsk_vulkan_memory_can_map()
authorBenjamin Otte <otte@redhat.com>
Wed, 14 Jun 2023 00:55:32 +0000 (02:55 +0200)
committerBenjamin Otte <otte@redhat.com>
Wed, 14 Jun 2023 01:34:07 +0000 (03:34 +0200)
.. nd use it to assert memory is mappable when mapping it.

gsk/vulkan/gskvulkanmemory.c
gsk/vulkan/gskvulkanmemoryprivate.h

index abe59b48084417d80a952d5ac438f567dbd7ec06..d5cced20a11308455f99afbd8b8b244204d4590d 100644 (file)
@@ -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,
index e8f0d932ed4b3a60e714817b9ceadc42180d577d..5922bbda6fa06d0bf8bbfb9a59229aa77206a907 100644 (file)
@@ -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);