Browse Source

Use index buffers.

master
Amber 2 years ago
parent
commit
2ee55ac3ad
  1. 43
      src/main.c

43
src/main.c

@ -73,6 +73,9 @@ typedef struct ApplicationState {
VkBuffer vertex_buffer; VkBuffer vertex_buffer;
VkDeviceMemory vertex_buffer_memory; VkDeviceMemory vertex_buffer_memory;
VkBuffer index_buffer;
VkDeviceMemory index_buffer_memory;
} ApplicationState; } ApplicationState;
typedef struct QueueFamilyIndices { typedef struct QueueFamilyIndices {
@ -88,9 +91,14 @@ typedef struct Vertex {
} Vertex; } Vertex;
const Vertex vertices[] = { const Vertex vertices[] = {
{{0.0f, -0.5f}, {1.0f, 0.0f, 0.0f}}, {{-0.5f, -0.5f}, {1.0f, 0.0f, 0.0f}},
{{0.5f, 0.5f}, {0.0f, 1.0f, 0.0f}}, {{0.5f, -0.5f}, {0.0f, 1.0f, 0.0f}},
{{-0.5f, 0.5f}, {0.0f, 0.0f, 1.0f}} {{0.5f, 0.5f}, {0.0f, 0.0f, 1.0f}},
{{-0.5f, 0.5f}, {1.0f, 1.0f, 1.0f}}
};
const uint16_t indices[] = {
0, 1, 2, 2, 3, 0
}; };
void create_window(ApplicationState* state) { void create_window(ApplicationState* state) {
@ -999,6 +1007,29 @@ void create_vertex_buffer(ApplicationState* state) {
vkFreeMemory(state->device, staging_buffer_memory, NULL); vkFreeMemory(state->device, staging_buffer_memory, NULL);
} }
void create_index_buffer(ApplicationState* state) {
VkDeviceSize buffer_size = sizeof(uint16_t) * ARRSIZE(indices);
//we use a staging buffer for transferring data in order to use a more efficient memory type for the index buffer
VkBuffer staging_buffer;
VkDeviceMemory staging_buffer_memory;
create_buffer(state, buffer_size, VK_BUFFER_USAGE_TRANSFER_SRC_BIT, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT,
&staging_buffer, &staging_buffer_memory);
void* data;
vkMapMemory(state->device, staging_buffer_memory, 0, buffer_size, 0, &data);
memcpy(data, indices, buffer_size);
vkUnmapMemory(state->device, staging_buffer_memory);
create_buffer(state, buffer_size, VK_BUFFER_USAGE_TRANSFER_DST_BIT | VK_BUFFER_USAGE_INDEX_BUFFER_BIT, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT,
&state->index_buffer, &state->index_buffer_memory);
copy_buffer(state, staging_buffer, state->index_buffer, buffer_size);
vkDestroyBuffer(state->device, staging_buffer, NULL);
vkFreeMemory(state->device, staging_buffer_memory, NULL);
}
void create_command_buffer(ApplicationState* state) { void create_command_buffer(ApplicationState* state) {
VkCommandBufferAllocateInfo command_buf_allocate_info = {0}; VkCommandBufferAllocateInfo command_buf_allocate_info = {0};
command_buf_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO; command_buf_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
@ -1049,6 +1080,7 @@ void record_command_buffer(ApplicationState* state, VkCommandBuffer command_buff
VkBuffer vertex_buffers[] = {state->vertex_buffer}; VkBuffer vertex_buffers[] = {state->vertex_buffer};
VkDeviceSize offsets[] = {0}; VkDeviceSize offsets[] = {0};
vkCmdBindVertexBuffers(command_buffer, 0, 1, vertex_buffers, offsets); vkCmdBindVertexBuffers(command_buffer, 0, 1, vertex_buffers, offsets);
vkCmdBindIndexBuffer(command_buffer, state->index_buffer, 0, VK_INDEX_TYPE_UINT16);
//setup dynamic state //setup dynamic state
VkViewport viewport = {0}; VkViewport viewport = {0};
@ -1069,7 +1101,7 @@ void record_command_buffer(ApplicationState* state, VkCommandBuffer command_buff
vkCmdSetScissor(command_buffer, 0, 1, &scissor); vkCmdSetScissor(command_buffer, 0, 1, &scissor);
//vertex count, instance count, first vertex and first instance //vertex count, instance count, first vertex and first instance
vkCmdDraw(command_buffer, ARRSIZE(vertices), 1, 0, 0); vkCmdDrawIndexed(command_buffer, ARRSIZE(indices), 1, 0, 0, 0);
vkCmdEndRenderPass(command_buffer); vkCmdEndRenderPass(command_buffer);
@ -1112,6 +1144,7 @@ void init_vulkan(ApplicationState* state) {
create_framebuffers(state); create_framebuffers(state);
create_command_pool(state); create_command_pool(state);
create_vertex_buffer(state); create_vertex_buffer(state);
create_index_buffer(state);
create_command_buffer(state); create_command_buffer(state);
create_sync_objects(state); create_sync_objects(state);
} }
@ -1194,6 +1227,8 @@ void terminate(ApplicationState* state) {
} }
vkDestroyBuffer(state->device, state->vertex_buffer, NULL); vkDestroyBuffer(state->device, state->vertex_buffer, NULL);
vkFreeMemory(state->device, state->vertex_buffer_memory, NULL); vkFreeMemory(state->device, state->vertex_buffer_memory, NULL);
vkDestroyBuffer(state->device, state->index_buffer, NULL);
vkFreeMemory(state->device, state->index_buffer_memory, NULL);
vkDestroySwapchainKHR(state->device, state->swapchain, NULL); vkDestroySwapchainKHR(state->device, state->swapchain, NULL);
vkDestroyDevice(state->device, NULL); vkDestroyDevice(state->device, NULL);

Loading…
Cancel
Save