diff --git a/src/main.cpp b/src/main.cpp index 8067e78..975baf2 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -109,10 +109,8 @@ class VulkanExampleApplication { } } vk_physical_card_info; - std::unique_ptr vk_buffer_vertex_memory; // in order to get a clean desctruction sequence, instantiate the DeviceMemory for the vertex buffer first - std::unique_ptr vk_buffer_vertex; // https://github.com/KhronosGroup/Vulkan-Hpp/blob/6f72ceca515d59f40d64b64cf2734f6261e1f9f2/RAII_Samples/13_InitVertexBuffer/13_InitVertexBuffer.cpp - std::unique_ptr vk_buffer_vertex_staging_memory; // optional, but speeds things up! - std::unique_ptr vk_buffer_vertex_staging; + std::pair, std::unique_ptr> vk_buffer_vertex; // in order to get a clean desctruction sequence, instantiate the DeviceMemory for the vertex buffer first // https://github.com/KhronosGroup/Vulkan-Hpp/blob/6f72ceca515d59f40d64b64cf2734f6261e1f9f2/RAII_Samples/13_InitVertexBuffer/13_InitVertexBuffer.cpp + std::pair, std::unique_ptr> vk_buffer_index; // used to make rendering models more efficent by sharing values struct Vertex { glm::vec2 pos; @@ -142,10 +140,14 @@ class VulkanExampleApplication { return attribute_descriptions; } }; - static inline const std::vector triangle_vertices = { - { { 0.0f, -0.5f }, { 1.0f, 1.0f, 1.0f } }, - { { 0.5f, 0.5f }, { 0.0f, 1.0f, 0.0f } }, - { { -0.5f, 0.5f }, { 0.0f, 0.0f, 1.0f } } + static inline const std::vector quad_vertices = { + { { -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, 0.0f, 1.0f } }, + { { -0.5f, 0.5f }, { 1.0f, 1.0f, 1.0f } } + }; + static inline const std::vector quad_indexes = { + 0, 1, 2, 2, 3, 0 // Wraps a quad-box's 2 triangles around itself. // https://docs.vulkan.org/tutorial/latest/04_Vertex_buffers/03_Index_buffer.html }; public: @@ -646,15 +648,27 @@ public: this->vk_command_buffers = std::make_unique(*this->vk_gpu, command_buffer_alloc_info); } { - const auto vertex_buffer_size = sizeof(triangle_vertices[0]) * triangle_vertices.size(); - std::tie(this->vk_buffer_vertex_staging, this->vk_buffer_vertex_staging_memory) = CreateBuffer(vertex_buffer_size, vk::BufferUsageFlagBits::eTransferSrc, vk::MemoryPropertyFlagBits::eHostVisible | vk::MemoryPropertyFlagBits::eHostCoherent); + // vertex + const auto vertex_buffer_size = sizeof(quad_vertices[0]) * quad_vertices.size(); + const auto vertex_buffer_staging = this->CreateBuffer(vertex_buffer_size, vk::BufferUsageFlagBits::eTransferSrc, vk::MemoryPropertyFlagBits::eHostVisible | vk::MemoryPropertyFlagBits::eHostCoherent); - std::uint8_t* const vertex_buffer_data = static_cast(this->vk_buffer_vertex_staging_memory->mapMemory(0, vertex_buffer_size)); - memcpy(vertex_buffer_data, triangle_vertices.data(), vertex_buffer_size); - this->vk_buffer_vertex_staging_memory->unmapMemory(); + std::uint8_t* const vertex_buffer_data = static_cast(vertex_buffer_staging.second->mapMemory(0, vertex_buffer_size)); + memcpy(vertex_buffer_data, quad_vertices.data(), vertex_buffer_size); + vertex_buffer_staging.second->unmapMemory(); - std::tie(this->vk_buffer_vertex, this->vk_buffer_vertex_memory) = CreateBuffer(vertex_buffer_size, vk::BufferUsageFlagBits::eTransferDst | vk::BufferUsageFlagBits::eVertexBuffer, vk::MemoryPropertyFlagBits::eDeviceLocal); - this->CopyBuffer(*this->vk_buffer_vertex_staging, *this->vk_buffer_vertex, vertex_buffer_size); + this->vk_buffer_vertex = CreateBuffer(vertex_buffer_size, vk::BufferUsageFlagBits::eTransferDst | vk::BufferUsageFlagBits::eVertexBuffer, vk::MemoryPropertyFlagBits::eDeviceLocal); + this->CopyBuffer(*vertex_buffer_staging.first, *this->vk_buffer_vertex.first, vertex_buffer_size); + + // index + const auto index_buffer_size = sizeof(quad_indexes[0]) * quad_indexes.size(); + const auto index_buffer_staging = this->CreateBuffer(index_buffer_size, vk::BufferUsageFlagBits::eTransferSrc, vk::MemoryPropertyFlagBits::eHostVisible | vk::MemoryPropertyFlagBits::eHostCoherent); + + std::uint8_t* const indicies_buffer_data = static_cast(index_buffer_staging.second->mapMemory(0, index_buffer_size)); + memcpy(indicies_buffer_data, quad_indexes.data(), index_buffer_size); + index_buffer_staging.second->unmapMemory(); + + this->vk_buffer_index = CreateBuffer(index_buffer_size, vk::BufferUsageFlagBits::eTransferDst | vk::BufferUsageFlagBits::eIndexBuffer, vk::MemoryPropertyFlagBits::eDeviceLocal); + this->CopyBuffer(*index_buffer_staging.first, *this->vk_buffer_index.first, index_buffer_size); } { // syncronizing vars this->vk_semephore_image_available = std::make_unique(*this->vk_gpu, vk::SemaphoreCreateInfo {}); @@ -676,7 +690,8 @@ public: } protected: - std::pair, std::unique_ptr> CreateBuffer(vk::DeviceSize wanted_size, vk::BufferUsageFlags wanted_usage, vk::MemoryPropertyFlags wanted_properties) { + std::pair, std::unique_ptr> + CreateBuffer(vk::DeviceSize wanted_size, vk::BufferUsageFlags wanted_usage, vk::MemoryPropertyFlags wanted_properties) { const vk::BufferCreateInfo buffer_create_info { .size = wanted_size, .usage = wanted_usage, @@ -833,10 +848,11 @@ public: command_buffer.beginRenderPass(render_pass_info, vk::SubpassContents::eInline); command_buffer.bindPipeline(vk::PipelineBindPoint::eGraphics, **this->vk_pipeline); command_buffer.bindDescriptorSets(vk::PipelineBindPoint::eGraphics, *this->vk_pipeline_layout, 0, { this->vk_descriptor_sets->front() }, nullptr); - command_buffer.bindVertexBuffers(0, { **this->vk_buffer_vertex }, { 0 }); + command_buffer.bindVertexBuffers(0, { **this->vk_buffer_vertex.first }, { 0 }); + command_buffer.bindIndexBuffer(**this->vk_buffer_index.first, 0, vk::IndexType::eUint16); this->RecordDynamic(command_buffer); - command_buffer.draw(3, 1, 0, 0); + command_buffer.drawIndexed(static_cast(quad_indexes.size()), 1, 0, 0, 0); command_buffer.endRenderPass(); command_buffer.end();