Files
Pulse/Sources/Backends/Vulkan/VulkanDescriptor.h
2025-11-15 16:33:36 +01:00

101 lines
2.8 KiB
C

// Copyright (C) 2025 kbz_8
// This file is part of "Pulse"
// For conditions of distribution and use, see copyright notice in LICENSE
#ifdef PULSE_ENABLE_VULKAN_BACKEND
#ifndef PULSE_VULKAN_DESCRIPTOR_H_
#define PULSE_VULKAN_DESCRIPTOR_H_
#include <vulkan/vulkan_core.h>
#include <Pulse.h>
#include "../../PulseInternal.h"
#include "VulkanEnums.h"
#define VULKAN_POOL_SIZE 128
typedef struct VulkanDescriptorSetLayout
{
VkDescriptorSetLayout layout;
union
{
struct
{
uint32_t storage_buffer_count;
uint32_t storage_texture_count;
} ReadOnly;
struct
{
uint32_t storage_buffer_count;
uint32_t storage_texture_count;
} ReadWrite;
struct
{
uint32_t buffer_count;
} Uniform;
};
bool is_used;
} VulkanDescriptorSetLayout;
typedef struct VulkanDescriptorSet
{
PulseDevice device;
VulkanDescriptorSetLayout* layout;
struct VulkanDescriptorSetPool* pool;
VkDescriptorSet set;
} VulkanDescriptorSet;
typedef struct VulkanDescriptorSetPool
{
VulkanDescriptorSet* used_sets[VULKAN_POOL_SIZE];
VulkanDescriptorSet* free_sets[VULKAN_POOL_SIZE];
uint32_t used_index;
uint32_t free_index;
PulseDevice device;
VkDescriptorPool pool;
PulseThreadID thread_id;
uint32_t allocations_count;
} VulkanDescriptorSetPool;
typedef struct VulkanDescriptorSetPoolManager
{
PulseDevice device;
VulkanDescriptorSetPool** pools;
uint32_t pools_capacity;
uint32_t pools_size;
} VulkanDescriptorSetPoolManager;
typedef struct VulkanDescriptorSetLayoutManager
{
PulseDevice device;
VulkanDescriptorSetLayout** layouts;
uint32_t layouts_capacity;
uint32_t layouts_size;
} VulkanDescriptorSetLayoutManager;
void VulkanInitDescriptorSetLayoutManager(VulkanDescriptorSetLayoutManager* manager, PulseDevice device);
VulkanDescriptorSetLayout* VulkanGetDescriptorSetLayout(VulkanDescriptorSetLayoutManager* manager,
uint32_t read_storage_images_count,
uint32_t read_storage_buffers_count,
uint32_t write_storage_images_count,
uint32_t write_storage_buffers_count,
uint32_t uniform_buffers_count);
void VulkanDestroyDescriptorSetLayoutManager(VulkanDescriptorSetLayoutManager* manager);
VulkanDescriptorSet* VulkanRequestDescriptorSetFromPool(VulkanDescriptorSetPool* pool, const VulkanDescriptorSetLayout* layout);
void VulkanReturnDescriptorSetToPool(VulkanDescriptorSetPool* pool, const VulkanDescriptorSet* set);
void VulkanBindDescriptorSets(PulseComputePass pass);
void VulkanInitDescriptorSetPoolManager(VulkanDescriptorSetPoolManager* manager, PulseDevice device);
VulkanDescriptorSetPool* VulkanGetAvailableDescriptorSetPool(VulkanDescriptorSetPoolManager* manager);
void VulkanDestroyDescriptorSetPoolManager(VulkanDescriptorSetPoolManager* manager);
#endif // PULSE_VULKAN_DESCRIPTOR_H_
#endif // PULSE_ENABLE_VULKAN_BACKEND