diff --git a/Core/Core/RenderEngine/RenderEngine.cpp b/Core/Core/RenderEngine/RenderEngine.cpp index ef3089c..6fbbd8c 100644 --- a/Core/Core/RenderEngine/RenderEngine.cpp +++ b/Core/Core/RenderEngine/RenderEngine.cpp @@ -740,6 +740,40 @@ void RenderEngine::allocate_vertex_buffer() vkDestroyBuffer(device_, staging_buffer, nullptr); } +void RenderEngine::allocate_index_buffer() +{ + QueueFamilyIndices indices = find_queue_family_indices(physical_device_, surface_); + std::set set_indices = {indices.graphics_family.value(), + indices.present_family.value(), + indices.transfer_family.value()}; + std::vector arr_indices; + std::vector transfer_index = {indices.transfer_family.value()}; + arr_indices.reserve(set_indices.size()); + for (auto& i : set_indices) + arr_indices.push_back(i); + + VkBuffer staging_buffer = VK_NULL_HANDLE; + VkDeviceMemory staging_buffer_memory = VK_NULL_HANDLE; + VkDeviceSize size_buffer = sizeof(indices_[0]) * indices_.size(); + create_buffer(size_buffer, VK_BUFFER_USAGE_TRANSFER_SRC_BIT, &staging_buffer, transfer_index); + allocate_memory(staging_buffer, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT, &staging_buffer_memory); + vkBindBufferMemory(device_, staging_buffer, staging_buffer_memory, 0); + + void* data; + vkMapMemory(device_, staging_buffer_memory, 0, size_buffer, 0, &data); + memcpy(data, indices_.data(), size_buffer); + vkUnmapMemory(device_, staging_buffer_memory); + + create_buffer(size_buffer, VK_BUFFER_USAGE_TRANSFER_DST_BIT | VK_BUFFER_USAGE_INDEX_BUFFER_BIT, &index_buffer_, arr_indices); + allocate_memory(index_buffer_, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, &index_buffer_memory_); + vkBindBufferMemory(device_, index_buffer_, index_buffer_memory_, 0); + + copy_memory(staging_buffer, index_buffer_, size_buffer); + + vkDestroyBuffer(device_, staging_buffer, nullptr); + vkFreeMemory(device_, staging_buffer_memory, nullptr); +} + void RenderEngine::copy_memory(VkBuffer src, VkBuffer dst, VkDeviceSize size) { QueueFamilyIndices indices = find_queue_family_indices(physical_device_, surface_); @@ -841,6 +875,7 @@ void RenderEngine::record_command_buffer(VkCommandBuffer command_buffer, uint32_ VkBuffer vertex_buffers[] = {vertex_buffer_}; VkDeviceSize offset[] = {0}; vkCmdBindVertexBuffers(command_buffer, 0, 1, vertex_buffers, offset); + vkCmdBindIndexBuffer(command_buffer, index_buffer_, 0, VK_INDEX_TYPE_UINT16); VkViewport viewport; viewport.x = 0.0f; @@ -856,8 +891,9 @@ void RenderEngine::record_command_buffer(VkCommandBuffer command_buffer, uint32_ scissor.extent = swapchain_extent_; vkCmdSetScissor(command_buffer, 0, 1, &scissor); - vkCmdDraw(command_buffer, static_cast(vertices_.size()), 1, 0, 0); - + //vkCmdDraw(command_buffer, static_cast(vertices_.size()), 1, 0, 0); + vkCmdDrawIndexed(command_buffer, static_cast(indices_.size()), 1, 0, 0, 0); + vkCmdEndRenderPass(command_buffer); VK_CHECK(vkEndCommandBuffer(command_buffer)); } @@ -924,6 +960,7 @@ window_(window) create_command_pool(); allocate_vertex_buffer(); allocate_command_buffers(); + allocate_index_buffer(); create_sync_objects(); } @@ -931,6 +968,12 @@ RenderEngine::~RenderEngine() { vkDeviceWaitIdle(device_); + if (index_buffer_memory_ != VK_NULL_HANDLE) + vkFreeMemory(device_, index_buffer_memory_, nullptr); + + if (index_buffer_ != VK_NULL_HANDLE) + vkDestroyBuffer(device_, index_buffer_, nullptr); + if (vertex_buffer_memory_ != VK_NULL_HANDLE) vkFreeMemory(device_, vertex_buffer_memory_, nullptr); diff --git a/Core/Core/RenderEngine/RenderEngine.hpp b/Core/Core/RenderEngine/RenderEngine.hpp index 9d47584..2a35d9b 100644 --- a/Core/Core/RenderEngine/RenderEngine.hpp +++ b/Core/Core/RenderEngine/RenderEngine.hpp @@ -35,7 +35,6 @@ class RenderEngine std::vector formats; std::vector present_modes; }; - struct Vertex { glm::vec2 pos; @@ -43,10 +42,15 @@ class RenderEngine static VkVertexInputBindingDescription get_binding_description(); static std::array get_vertex_attribute_descriptions(); }; - std::vector vertices_ = { - {{0.0f, -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}} + + const std::vector 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}} + }; + const std::vector indices_ = { + 0, 1, 2, 2, 3, 0 }; ModelManager model_manager_; @@ -79,6 +83,8 @@ class RenderEngine std::vector command_buffers_; VkBuffer vertex_buffer_ = VK_NULL_HANDLE; VkDeviceMemory vertex_buffer_memory_ = VK_NULL_HANDLE; + VkBuffer index_buffer_ = VK_NULL_HANDLE; + VkDeviceMemory index_buffer_memory_ = VK_NULL_HANDLE; // Sync objects std::vector image_available_semaphores_, render_finished_semaphores_; @@ -116,8 +122,9 @@ class RenderEngine void allocate_command_buffers(); void create_sync_objects(); void allocate_vertex_buffer(); + void allocate_index_buffer(); + void copy_memory(VkBuffer src, VkBuffer dst, VkDeviceSize size); - void record_command_buffer(VkCommandBuffer command_buffer, uint32_t image_index) const; void draw_frame(); public: