Create procedure for setting up GPU buffers

This commit is contained in:
Camden Dixie O'Brien committed 2025-09-26 14:30:38 +01:00
1 parent d4214941b1
commit b2b1a256fe
1 file changed
+48 -39
+48 -39
View File
@@ -47,6 +47,50 @@ load_shader_module(VkDevice dev, const char *code, size_t code_size)
return mod;
}
static void create_buffer(
const gpu_ctx_t *ctx, VkDeviceSize size, VkBufferUsageFlags usage,
VkMemoryPropertyFlags props, VkBuffer *buf_out, VkDeviceMemory *mem_out)
{
VkResult result;
// Create buffer
const VkBufferCreateInfo buf_config = {
.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO,
.size = size,
.usage = usage,
.sharingMode = VK_SHARING_MODE_EXCLUSIVE,
};
result = vkCreateBuffer(ctx->dev, &buf_config, nullptr, buf_out);
assert(result == VK_SUCCESS);
// Find appropriate memory type
VkMemoryRequirements requirements;
vkGetBufferMemoryRequirements(ctx->dev, *buf_out, &requirements);
VkPhysicalDeviceMemoryProperties mem_props;
vkGetPhysicalDeviceMemoryProperties(ctx->physical_dev, &mem_props);
uint32_t mem_type = UINT32_MAX;
for (unsigned i = 0; i < mem_props.memoryTypeCount; ++i) {
if ((requirements.memoryTypeBits & (1 << i)) == 0)
continue;
if ((mem_props.memoryTypes[i].propertyFlags & props) == props) {
mem_type = i;
break;
}
}
assert(mem_type != UINT32_MAX);
// Allocate memory
VkMemoryAllocateInfo allocate_config = {
.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO,
.allocationSize = requirements.size,
.memoryTypeIndex = mem_type,
};
result = vkAllocateMemory(ctx->dev, &allocate_config, nullptr, mem_out);
assert(result == VK_SUCCESS);
vkBindBufferMemory(ctx->dev, *buf_out, *mem_out, 0);
}
void gpu_init(gpu_ctx_t *ctx, const gpu_config_t *config)
{
// Initialise Vulkan instance.
@@ -435,47 +479,12 @@ void gpu_init(gpu_ctx_t *ctx, const gpu_config_t *config)
// Create vertex buffer
ctx->vertex_data_size = config->vertex_data_size;
const VkBufferCreateInfo vertex_buf_config = {
.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO,
.size = ctx->vertex_data_size,
.usage = VK_BUFFER_USAGE_VERTEX_BUFFER_BIT,
.sharingMode = VK_SHARING_MODE_EXCLUSIVE,
};
result = vkCreateBuffer(
ctx->dev, &vertex_buf_config, nullptr, &ctx->vertex_buf);
assert(result == VK_SUCCESS);
// Allocate memory to vertex buffer
const VkMemoryPropertyFlags mem_flags
const VkMemoryPropertyFlags vertex_buf_props
= VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT
| VK_MEMORY_PROPERTY_HOST_COHERENT_BIT;
VkMemoryRequirements mem_requirements;
vkGetBufferMemoryRequirements(
ctx->dev, ctx->vertex_buf, &mem_requirements);
VkPhysicalDeviceMemoryProperties mem_props;
vkGetPhysicalDeviceMemoryProperties(ctx->physical_dev, &mem_props);
uint32_t mem_type = UINT32_MAX;
for (unsigned i = 0; i < mem_props.memoryTypeCount; ++i) {
const bool valid_type
= (mem_requirements.memoryTypeBits & (1 << i)) != 0;
const bool has_flags
= (mem_props.memoryTypes[i].propertyFlags & mem_flags)
== mem_flags;
if (valid_type && has_flags) {
mem_type = i;
break;
}
}
assert(mem_type != UINT32_MAX);
VkMemoryAllocateInfo allocate_config = {
.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO,
.allocationSize = mem_requirements.size,
.memoryTypeIndex = mem_type,
};
result = vkAllocateMemory(
ctx->dev, &allocate_config, nullptr, &ctx->vertex_buf_mem);
assert(result == VK_SUCCESS);
vkBindBufferMemory(ctx->dev, ctx->vertex_buf, ctx->vertex_buf_mem, 0);
create_buffer(
ctx, ctx->vertex_data_size, VK_BUFFER_USAGE_VERTEX_BUFFER_BIT,
vertex_buf_props, &ctx->vertex_buf, &ctx->vertex_buf_mem);
// Copy vertex data into vertex buffer
void *vertex_buf_ptr;