|
|
@ -40,9 +40,15 @@ std::array<VkVertexInputAttributeDescription, 2> Vertex::attributes_description( |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const std::vector<Vertex> vertices = { |
|
|
const std::vector<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 std::vector<uint16_t> indices = { |
|
|
|
|
|
0, 1, 2, |
|
|
|
|
|
2, 1, 3, |
|
|
}; |
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@ -66,12 +72,13 @@ void VulkanTutorial::initialize(SDL_Window* window) { |
|
|
.with_window(window); |
|
|
.with_window(window); |
|
|
m_context.initialize(context_settings); |
|
|
m_context.initialize(context_settings); |
|
|
|
|
|
|
|
|
|
|
|
create_command_pool(); |
|
|
|
|
|
create_vertex_buffer(); |
|
|
|
|
|
create_index_buffer(); |
|
|
|
|
|
|
|
|
auto const swapchain_settings = Vulkan::SwapchainSettings(&m_context) |
|
|
auto const swapchain_settings = Vulkan::SwapchainSettings(&m_context) |
|
|
.with_queue(m_context.queue_family(GRAPHIC_QUEUE)); |
|
|
.with_queue(m_context.queue_family(GRAPHIC_QUEUE)); |
|
|
m_swapchain.initialize(swapchain_settings); |
|
|
m_swapchain.initialize(swapchain_settings); |
|
|
|
|
|
|
|
|
create_command_pool(); |
|
|
|
|
|
create_vertex_buffer(); |
|
|
|
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
void VulkanTutorial::shutdown() { |
|
|
void VulkanTutorial::shutdown() { |
|
|
@ -84,8 +91,10 @@ void VulkanTutorial::shutdown() { |
|
|
|
|
|
|
|
|
m_context.free_memory(m_vertex_buffer_memory); |
|
|
m_context.free_memory(m_vertex_buffer_memory); |
|
|
m_context.destroy_command_pool(m_command_pool); |
|
|
m_context.destroy_command_pool(m_command_pool); |
|
|
m_context.destroy_buffer(m_vertex_buffer); |
|
|
m_context.free_memory(m_index_buffer_memory); |
|
|
|
|
|
m_context.destroy_buffer(m_index_buffer); |
|
|
m_context.free_memory(m_vertex_buffer_memory); |
|
|
m_context.free_memory(m_vertex_buffer_memory); |
|
|
|
|
|
m_context.destroy_buffer(m_vertex_buffer); |
|
|
|
|
|
|
|
|
for(VkSemaphore semaphore: m_render_done) |
|
|
for(VkSemaphore semaphore: m_render_done) |
|
|
m_context.destroy_semaphore(semaphore); |
|
|
m_context.destroy_semaphore(semaphore); |
|
|
@ -436,57 +445,29 @@ void VulkanTutorial::create_vertex_buffer() { |
|
|
if(m_vertex_buffer != VK_NULL_HANDLE) |
|
|
if(m_vertex_buffer != VK_NULL_HANDLE) |
|
|
return; |
|
|
return; |
|
|
|
|
|
|
|
|
VkDeviceSize buffer_size = sizeof(vertices[0]) * vertices.size(); |
|
|
VkDeviceSize size = sizeof(vertices[0]) * vertices.size(); |
|
|
|
|
|
|
|
|
VkBuffer tmp_buffer = VK_NULL_HANDLE; |
|
|
|
|
|
VkDeviceMemory tmp_buffer_memory = VK_NULL_HANDLE; |
|
|
|
|
|
std::tie(tmp_buffer, tmp_buffer_memory) = m_context.create_buffer( |
|
|
|
|
|
buffer_size, |
|
|
|
|
|
VK_BUFFER_USAGE_TRANSFER_SRC_BIT, |
|
|
|
|
|
VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT |
|
|
|
|
|
| VK_MEMORY_PROPERTY_HOST_COHERENT_BIT |
|
|
|
|
|
); |
|
|
|
|
|
auto const tmp_buffer_guard = make_guard([&] { |
|
|
|
|
|
m_context.free_memory(tmp_buffer_memory); |
|
|
|
|
|
m_context.destroy_buffer(tmp_buffer); |
|
|
|
|
|
}); |
|
|
|
|
|
|
|
|
|
|
|
std::tie(m_vertex_buffer, m_vertex_buffer_memory) = m_context.create_buffer( |
|
|
std::tie(m_vertex_buffer, m_vertex_buffer_memory) = m_context.create_buffer( |
|
|
buffer_size, |
|
|
size, (char*)vertices.data(), |
|
|
VK_BUFFER_USAGE_VERTEX_BUFFER_BIT |
|
|
VK_BUFFER_USAGE_VERTEX_BUFFER_BIT, |
|
|
| VK_BUFFER_USAGE_TRANSFER_DST_BIT, |
|
|
VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, |
|
|
VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT |
|
|
m_context.queue_family(GRAPHIC_QUEUE) |
|
|
); |
|
|
); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
void* buffer = nullptr; |
|
|
void VulkanTutorial::create_index_buffer() { |
|
|
vkMapMemory( |
|
|
if(m_index_buffer != VK_NULL_HANDLE) |
|
|
m_context.device(), |
|
|
return; |
|
|
tmp_buffer_memory, |
|
|
|
|
|
0, |
|
|
|
|
|
buffer_size, |
|
|
|
|
|
0, |
|
|
|
|
|
&buffer |
|
|
|
|
|
); |
|
|
|
|
|
|
|
|
|
|
|
memcpy(buffer, vertices.data(), size_t(buffer_size)); |
|
|
|
|
|
|
|
|
|
|
|
vkUnmapMemory( |
|
|
|
|
|
m_context.device(), |
|
|
|
|
|
tmp_buffer_memory |
|
|
|
|
|
); |
|
|
|
|
|
|
|
|
|
|
|
m_context.copy_buffer( |
|
|
VkDeviceSize size = sizeof(indices[0]) * indices.size(); |
|
|
m_vertex_buffer, |
|
|
std::tie(m_index_buffer, m_index_buffer_memory) = m_context.create_buffer( |
|
|
tmp_buffer, |
|
|
size, (char*)indices.data(), |
|
|
m_context.queue_family(GRAPHIC_QUEUE), |
|
|
VK_BUFFER_USAGE_INDEX_BUFFER_BIT, |
|
|
buffer_size |
|
|
VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, |
|
|
|
|
|
m_context.queue_family(GRAPHIC_QUEUE) |
|
|
); |
|
|
); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
void VulkanTutorial::create_command_buffers() { |
|
|
void VulkanTutorial::create_command_buffers() { |
|
|
create_command_pool(); |
|
|
|
|
|
create_vertex_buffer(); |
|
|
|
|
|
|
|
|
|
|
|
m_command_buffers.resize(m_framebuffers.size()); |
|
|
m_command_buffers.resize(m_framebuffers.size()); |
|
|
|
|
|
|
|
|
VkCommandBufferAllocateInfo allocate_info { |
|
|
VkCommandBufferAllocateInfo allocate_info { |
|
|
@ -564,11 +545,19 @@ void VulkanTutorial::create_command_buffers() { |
|
|
offsets |
|
|
offsets |
|
|
); |
|
|
); |
|
|
|
|
|
|
|
|
vkCmdDraw( |
|
|
vkCmdBindIndexBuffer( |
|
|
|
|
|
command_buffer, |
|
|
|
|
|
m_index_buffer, |
|
|
|
|
|
0, |
|
|
|
|
|
VK_INDEX_TYPE_UINT16 |
|
|
|
|
|
); |
|
|
|
|
|
|
|
|
|
|
|
vkCmdDrawIndexed( |
|
|
command_buffer, |
|
|
command_buffer, |
|
|
uint32_t(vertices.size()), |
|
|
uint32_t(indices.size()), |
|
|
1, |
|
|
1, |
|
|
0, |
|
|
0, |
|
|
|
|
|
0, |
|
|
0 |
|
|
0 |
|
|
); |
|
|
); |
|
|
|
|
|
|
|
|
|