working on Vulkan descriptor sets

This commit is contained in:
2025-02-19 21:07:16 +01:00
parent 4bbbf4e5dd
commit c8f6245c2c
12 changed files with 127 additions and 36 deletions

View File

@@ -34,16 +34,46 @@ void VulkanDestroyComputePass(PulseDevice device, PulseComputePass pass)
free(pass);
}
void VulkanBindStorageBuffers(PulseComputePass pass, uint32_t starting_slot, PulseBuffer* const* buffers, uint32_t num_buffers)
void VulkanBindStorageBuffers(PulseComputePass pass, uint32_t starting_slot, const PulseBuffer* buffers, uint32_t num_buffers)
{
PulseBufferUsageFlags usage = buffers[0]->usage;
PulseBuffer* array = ((usage & PULSE_BUFFER_USAGE_STORAGE_WRITE) == 1) ? pass->readwrite_storage_buffers : pass->readonly_storage_buffers;
VulkanComputePass* vulkan_pass = VULKAN_RETRIEVE_DRIVER_DATA_AS(pass, VulkanComputePass*);
for(uint32_t i = 0; i < num_buffers; i++)
{
if(array[starting_slot + i] == buffers[i])
continue;
array[starting_slot + i] = buffers[i];
if((usage & PULSE_BUFFER_USAGE_STORAGE_WRITE) == 1)
vulkan_pass->should_recreate_write_descriptor_sets = true;
else
vulkan_pass->should_recreate_read_only_descriptor_sets = true;
}
}
void VulkanBindUniformData(PulseComputePass pass, uint32_t slot, const void* data, uint32_t data_size)
{
}
void VulkanBindStorageImages(PulseComputePass pass, uint32_t starting_slot, PulseImage* const* images, uint32_t num_images)
void VulkanBindStorageImages(PulseComputePass pass, uint32_t starting_slot, const PulseImage* images, uint32_t num_images)
{
PulseImageUsageFlags usage = images[0]->usage;
PulseImage* array = ((usage & PULSE_IMAGE_USAGE_STORAGE_WRITE) == 1) ? pass->readwrite_images : pass->readonly_images;
VulkanComputePass* vulkan_pass = VULKAN_RETRIEVE_DRIVER_DATA_AS(pass, VulkanComputePass*);
for(uint32_t i = 0; i < num_images; i++)
{
if(array[starting_slot + i] == images[i])
continue;
array[starting_slot + i] = images[i];
if((usage & PULSE_IMAGE_USAGE_STORAGE_WRITE) == 1)
vulkan_pass->should_recreate_write_descriptor_sets = true;
else
vulkan_pass->should_recreate_read_only_descriptor_sets = true;
}
}
void VulkanBindComputePipeline(PulseComputePass pass, PulseComputePipeline pipeline)
@@ -51,8 +81,13 @@ void VulkanBindComputePipeline(PulseComputePass pass, PulseComputePipeline pipel
VulkanComputePipeline* vulkan_pipeline = VULKAN_RETRIEVE_DRIVER_DATA_AS(pipeline, VulkanComputePipeline*);
VulkanDevice* vulkan_device = VULKAN_RETRIEVE_DRIVER_DATA_AS(pass->cmd->device, VulkanDevice*);
VulkanCommandList* vulkan_cmd = VULKAN_RETRIEVE_DRIVER_DATA_AS(pass->cmd, VulkanCommandList*);
VulkanComputePass* vulkan_pass = VULKAN_RETRIEVE_DRIVER_DATA_AS(pass, VulkanComputePass*);
vulkan_device->vkCmdBindPipeline(vulkan_cmd->cmd, VK_PIPELINE_BIND_POINT_COMPUTE, vulkan_pipeline->pipeline);
vulkan_pass->should_recreate_read_only_descriptor_sets = true;
vulkan_pass->should_recreate_write_descriptor_sets = true;
vulkan_pass->should_recreate_uniform_descriptor_sets = true;
}
void VulkanDispatchComputations(PulseComputePass pass, uint32_t groupcount_x, uint32_t groupcount_y, uint32_t groupcount_z)
@@ -60,6 +95,8 @@ void VulkanDispatchComputations(PulseComputePass pass, uint32_t groupcount_x, ui
VulkanDevice* vulkan_device = VULKAN_RETRIEVE_DRIVER_DATA_AS(pass->cmd->device, VulkanDevice*);
VulkanCommandList* vulkan_cmd = VULKAN_RETRIEVE_DRIVER_DATA_AS(pass->cmd, VulkanCommandList*);
VulkanBindDescriptorSets(pass);
vulkan_device->vkCmdDispatch(vulkan_cmd->cmd, groupcount_x, groupcount_y, groupcount_z);
}

View File

@@ -31,9 +31,9 @@ void VulkanDestroyComputePass(PulseDevice device, PulseComputePass pass);
PulseComputePass VulkanBeginComputePass(PulseCommandList cmd);
void VulkanEndComputePass(PulseComputePass pass);
void VulkanBindStorageBuffers(PulseComputePass pass, uint32_t starting_slot, PulseBuffer* const* buffers, uint32_t num_buffers);
void VulkanBindStorageBuffers(PulseComputePass pass, uint32_t starting_slot, const PulseBuffer* buffers, uint32_t num_buffers);
void VulkanBindUniformData(PulseComputePass pass, uint32_t slot, const void* data, uint32_t data_size);
void VulkanBindStorageImages(PulseComputePass pass, uint32_t starting_slot, PulseImage* const* images, uint32_t num_images);
void VulkanBindStorageImages(PulseComputePass pass, uint32_t starting_slot, const PulseImage* images, uint32_t num_images);
void VulkanBindComputePipeline(PulseComputePass pass, PulseComputePipeline pipeline);
void VulkanDispatchComputations(PulseComputePass pass, uint32_t groupcount_x, uint32_t groupcount_y, uint32_t groupcount_z);

View File

@@ -9,9 +9,7 @@
#include "Vulkan.h"
#include "VulkanDevice.h"
#include "VulkanDescriptor.h"
#undef NDEBUG
#include <assert.h>
#include "VulkanComputePass.h"
void VulkanInitDescriptorSetLayoutManager(VulkanDescriptorSetLayoutManager* manager, PulseDevice device)
{
@@ -235,6 +233,37 @@ void VulkanReturnDescriptorSetToPool(VulkanDescriptorSetPool* pool, const Vulkan
}
}
void VulkanBindDescriptorSets(PulseComputePass pass)
{
VulkanComputePass* vulkan_pass = VULKAN_RETRIEVE_DRIVER_DATA_AS(pass, VulkanComputePass*);
if(!vulkan_pass->should_recreate_read_only_descriptor_sets && !vulkan_pass->should_recreate_write_descriptor_sets && !vulkan_pass->should_recreate_uniform_descriptor_sets)
return;
VkWriteDescriptorSet writes[
PULSE_MAX_READ_TEXTURES_BOUND +
PULSE_MAX_READ_BUFFERS_BOUND +
PULSE_MAX_WRITE_TEXTURES_BOUND +
PULSE_MAX_WRITE_BUFFERS_BOUND +
PULSE_MAX_UNIFORM_BUFFERS_BOUND];
VkDescriptorBufferInfo buffer_infos[PULSE_MAX_UNIFORM_BUFFERS_BOUND + PULSE_MAX_WRITE_BUFFERS_BOUND + PULSE_MAX_READ_BUFFERS_BOUND];
VkDescriptorImageInfo image_infos[PULSE_MAX_READ_TEXTURES_BOUND + PULSE_MAX_WRITE_TEXTURES_BOUND];
uint32_t write_count = 0;
uint32_t buffer_info_count = 0;
uint32_t image_info_count = 0;
if(vulkan_pass->should_recreate_read_only_descriptor_sets)
{
}
if(vulkan_pass->should_recreate_write_descriptor_sets)
{
}
if(vulkan_pass->should_recreate_uniform_descriptor_sets)
{
}
}
void VulkanDestroyDescriptorSetPool(VulkanDescriptorSetPool* pool)
{
if(pool->pool == VK_NULL_HANDLE)

View File

@@ -87,6 +87,8 @@ void VulkanDestroyDescriptorSetLayoutManager(VulkanDescriptorSetLayoutManager* m
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);