gtk/gsk/gpu/gskvulkanmemoryprivate.h
Benjamin Otte 057479c284 gpu: Improve memory handling on Vulkan
We now handle the case where memory is not HOST_CACHED.

We also track the memory type now so we can avoid mapping image memory
that is not HOST_CACHED and use buffer transfers instead.
2024-01-07 07:22:52 +01:00

91 lines
3.8 KiB
C

#pragma once
#include <gdk/gdk.h>
G_BEGIN_DECLS
#define GSK_VULKAN_MEMORY_MAPPABLE (VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | \
VK_MEMORY_PROPERTY_HOST_COHERENT_BIT)
typedef struct _GskVulkanAllocator GskVulkanAllocator;
typedef struct _GskVulkanAllocation GskVulkanAllocation;
typedef struct _GskVulkanMemory GskVulkanMemory;
struct _GskVulkanAllocation
{
VkDeviceMemory vk_memory;
guchar *map;
VkDeviceSize offset;
VkDeviceSize size;
VkMemoryPropertyFlags memory_flags;
};
struct _GskVulkanAllocator
{
int ref_count;
void (* free_allocator) (GskVulkanAllocator *allocator);
void (* alloc) (GskVulkanAllocator *allocator,
VkDeviceSize size,
VkDeviceSize alignment,
GskVulkanAllocation *out_alloc);
void (* free) (GskVulkanAllocator *allocator,
GskVulkanAllocation *alloc);
};
static inline void gsk_vulkan_alloc (GskVulkanAllocator *allocator,
VkDeviceSize size,
VkDeviceSize alignment,
GskVulkanAllocation *out_alloc);
static inline void gsk_vulkan_free (GskVulkanAllocator *allocator,
GskVulkanAllocation *alloc);
static inline GskVulkanAllocator *
gsk_vulkan_allocator_ref (GskVulkanAllocator *allocator);
static inline void gsk_vulkan_allocator_unref (GskVulkanAllocator *allocator);
GskVulkanAllocator * gsk_vulkan_direct_allocator_new (VkDevice device,
uint32_t vk_type_index,
const VkMemoryType *vk_type);
GskVulkanAllocator * gsk_vulkan_buddy_allocator_new (GskVulkanAllocator *allocator,
gsize block_size);
GskVulkanAllocator * gsk_vulkan_stats_allocator_new (GskVulkanAllocator *allocator);
GskVulkanAllocator * gsk_vulkan_external_allocator_new (VkDevice device);
static inline void
gsk_vulkan_alloc (GskVulkanAllocator *allocator,
VkDeviceSize size,
VkDeviceSize alignment,
GskVulkanAllocation *out_alloc)
{
allocator->alloc (allocator, size, alignment, out_alloc);
}
static inline void
gsk_vulkan_free (GskVulkanAllocator *allocator,
GskVulkanAllocation *alloc)
{
allocator->free (allocator, alloc);
}
static inline GskVulkanAllocator *
gsk_vulkan_allocator_ref (GskVulkanAllocator *self)
{
self->ref_count++;
return self;
}
static inline void
gsk_vulkan_allocator_unref (GskVulkanAllocator *self)
{
self->ref_count--;
if (self->ref_count > 0)
return;
self->free_allocator (self);
}
G_END_DECLS