Create procedure for setting up GPU buffers
This commit is contained in:
1 parent
d4214941b1
commit
b2b1a256fe
1 file changed
+48
-39
@@ -47,6 +47,50 @@ load_shader_module(VkDevice dev, const char *code, size_t code_size)
|
|||||||
return mod;
|
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)
|
void gpu_init(gpu_ctx_t *ctx, const gpu_config_t *config)
|
||||||
{
|
{
|
||||||
// Initialise Vulkan instance.
|
// Initialise Vulkan instance.
|
||||||
@@ -435,47 +479,12 @@ void gpu_init(gpu_ctx_t *ctx, const gpu_config_t *config)
|
|||||||
|
|
||||||
// Create vertex buffer
|
// Create vertex buffer
|
||||||
ctx->vertex_data_size = config->vertex_data_size;
|
ctx->vertex_data_size = config->vertex_data_size;
|
||||||
const VkBufferCreateInfo vertex_buf_config = {
|
const VkMemoryPropertyFlags vertex_buf_props
|
||||||
.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
|
|
||||||
= VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT
|
= VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT
|
||||||
| VK_MEMORY_PROPERTY_HOST_COHERENT_BIT;
|
| VK_MEMORY_PROPERTY_HOST_COHERENT_BIT;
|
||||||
VkMemoryRequirements mem_requirements;
|
create_buffer(
|
||||||
vkGetBufferMemoryRequirements(
|
ctx, ctx->vertex_data_size, VK_BUFFER_USAGE_VERTEX_BUFFER_BIT,
|
||||||
ctx->dev, ctx->vertex_buf, &mem_requirements);
|
vertex_buf_props, &ctx->vertex_buf, &ctx->vertex_buf_mem);
|
||||||
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);
|
|
||||||
|
|
||||||
// Copy vertex data into vertex buffer
|
// Copy vertex data into vertex buffer
|
||||||
void *vertex_buf_ptr;
|
void *vertex_buf_ptr;
|
||||||
|
|||||||
Reference in new issue
Block a user