add support for storage buffers in vulkan

This commit is contained in:
Greg Wells
2025-07-03 13:30:47 -04:00
parent d9937c2833
commit 665ce6847a
15 changed files with 83 additions and 13 deletions

View File

@@ -24,6 +24,26 @@ void updateBufferUniform(gnUniform uniform, gnBufferUniformInfo* info) {
vkUpdateDescriptorSets(uniform->pool->device->outputDevice->device, 1, &write, 0, NULL);
}
void updateVulkanStorageUniform(gnUniform uniform, gnStorageUniformInfo* info) {
VkDescriptorBufferInfo bufferInfo = {
.buffer = info->buffer->buffer->buffer.buffer,
.offset = info->offset,
.range = info->size
};
VkWriteDescriptorSet write = {
.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET,
.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,
.descriptorCount = 1,
.pBufferInfo = &bufferInfo,
.dstSet = uniform->uniform->set,
.dstBinding = info->binding,
.dstArrayElement = 0
};
vkUpdateDescriptorSets(uniform->pool->device->outputDevice->device, 1, &write, 0, NULL);
}
void updateImageUniform(gnUniform uniform, gnImageUniformInfo* info) {
VkDescriptorImageInfo imageInfo = {
.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL,

View File

@@ -7,4 +7,5 @@ typedef struct gnPlatformUniform_t {
} gnPlatformUniform;
void updateBufferUniform(gnUniform uniform, gnBufferUniformInfo* info);
void updateVulkanStorageUniform(gnUniform uniform, gnStorageUniformInfo* info);
void updateImageUniform(gnUniform uniform, gnImageUniformInfo* info);

View File

@@ -50,26 +50,26 @@ gnUniform* allocateUniforms(gnUniformPool pool, gnUniformAllocationInfo allocInf
};
// TODO: redo this, its not warning me IDK why cuz its totally wrong
VkDescriptorPoolSize poolSizes[GN_UNIFORM_TYPE_MAX];
for (int i = 0; i < allocInfo.setCount; i++) {
for (int c = 0; c < allocInfo.sets[i].uniformBindingCount; c++) {
VkDescriptorPoolSize poolSizes[GN_UNIFORM_TYPE_MAX] = { };
for (int i = 0; i < allocInfo.setCount; i++)
for (int c = 0; c < allocInfo.sets[i].uniformBindingCount; c++)
poolSizes[allocInfo.sets[i].uniformBindings[c].type].descriptorCount++;
}
}
uint32_t count = 0;
VkDescriptorPoolSize realPoolSize[GN_UNIFORM_TYPE_MAX] = {};
VkDescriptorPoolSize realPoolSizes[GN_UNIFORM_TYPE_MAX] = {};
for (int i = 0; i < GN_UNIFORM_TYPE_MAX; i++) {
if (poolSizes[i].descriptorCount <= 0) continue;
realPoolSize[count] = poolSizes[i];
count++;
poolSizes[i].type = vkGryphnUniformType(i);
if (poolSizes[i].descriptorCount > 0) {
realPoolSizes[count] = poolSizes[i];
count++;
}
}
VkDescriptorPoolCreateInfo poolInfo = {
.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO,
.poolSizeCount = count,
.pPoolSizes = realPoolSize,
.pPoolSizes = realPoolSizes,
.maxSets = allocInfo.setCount
};