add support for storage buffers in vulkan
This commit is contained in:
@@ -41,6 +41,7 @@ gnDeviceFunctions loadVulkanDeviceFunctions() {
|
||||
|
||||
._gnCreateBuffer = createBuffer,
|
||||
._gnBufferData = bufferData,
|
||||
._gnBufferSubData = vulkanBufferSubData,
|
||||
._gnMapBuffer = mapBuffer,
|
||||
._gnDestroyBuffer = destroyBuffer,
|
||||
|
||||
@@ -49,6 +50,7 @@ gnDeviceFunctions loadVulkanDeviceFunctions() {
|
||||
._gnDestroyUniformPool = destroyUniformPool,
|
||||
|
||||
._gnUpdateBufferUniform = updateBufferUniform,
|
||||
._gnUpdateStorageUniform = updateVulkanStorageUniform,
|
||||
._gnUpdateImageUniform = updateImageUniform,
|
||||
|
||||
._gnCreateTexture = createTexture,
|
||||
|
@@ -11,6 +11,7 @@ VkBufferUsageFlags vkGryphnBufferType(gnBufferType type) {
|
||||
case GN_VERTEX_BUFFER: usageFlags |= VK_BUFFER_USAGE_VERTEX_BUFFER_BIT; break;
|
||||
case GN_INDEX_BUFFER: usageFlags |= VK_BUFFER_USAGE_INDEX_BUFFER_BIT; break;
|
||||
case GN_UNIFORM_BUFFER: usageFlags |= VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT; break;
|
||||
case GN_STORAGE_BUFFER: usageFlags |= VK_BUFFER_USAGE_STORAGE_BUFFER_BIT; break;
|
||||
}
|
||||
return usageFlags;
|
||||
}
|
||||
@@ -114,6 +115,22 @@ void bufferData(gnBufferHandle buffer, size_t dataSize, void* data) {
|
||||
vkUnmapMemory(buffer->device->outputDevice->device, buffer->buffer->buffer.memory);
|
||||
}
|
||||
}
|
||||
void vulkanBufferSubData(gnBufferHandle buffer, size_t offset, size_t dataSize, void* data) {
|
||||
void* bufferData;
|
||||
if (buffer->buffer->useStagingBuffer) {
|
||||
vkMapMemory(buffer->device->outputDevice->device, buffer->buffer->stagingBuffer.memory, 0, dataSize, 0, &bufferData);
|
||||
memcpy(bufferData + offset, data, dataSize);
|
||||
vkUnmapMemory(buffer->device->outputDevice->device, buffer->buffer->stagingBuffer.memory);
|
||||
VkCopyBuffer(
|
||||
buffer->buffer->stagingBuffer.buffer, buffer->buffer->buffer.buffer, dataSize,
|
||||
buffer->device->outputDevice->transferCommandPool, buffer->device->outputDevice->device,
|
||||
buffer->device->outputDevice->transferQueue);
|
||||
} else {
|
||||
vkMapMemory(buffer->device->outputDevice->device, buffer->buffer->buffer.memory, 0, dataSize, 0, &bufferData);
|
||||
memcpy(bufferData + offset, data, dataSize);
|
||||
vkUnmapMemory(buffer->device->outputDevice->device, buffer->buffer->buffer.memory);
|
||||
}
|
||||
}
|
||||
void* mapBuffer(gnBufferHandle buffer) {
|
||||
void* data;
|
||||
vkMapMemory(buffer->device->outputDevice->device, buffer->buffer->buffer.memory, 0, buffer->info.size, 0, &data);
|
||||
|
@@ -25,5 +25,6 @@ uint32_t VkMemoryIndex(VkPhysicalDevice device, uint32_t memoryType, VkMemoryPro
|
||||
|
||||
gnReturnCode createBuffer(gnBufferHandle buffer, gnOutputDeviceHandle device, gnBufferInfo info);
|
||||
void bufferData(gnBufferHandle buffer, size_t dataSize, void* data);
|
||||
void vulkanBufferSubData(gnBufferHandle buffer, size_t offset, size_t dataSize, void* data);
|
||||
void* mapBuffer(gnBufferHandle buffer);
|
||||
void destroyBuffer(gnBufferHandle buffer);
|
||||
|
@@ -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,
|
||||
|
@@ -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);
|
||||
|
@@ -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
|
||||
};
|
||||
|
||||
|
Reference in New Issue
Block a user