Add index buffer
This commit is contained in:
@@ -740,6 +740,40 @@ void RenderEngine::allocate_vertex_buffer()
|
|||||||
vkDestroyBuffer(device_, staging_buffer, nullptr);
|
vkDestroyBuffer(device_, staging_buffer, nullptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void RenderEngine::allocate_index_buffer()
|
||||||
|
{
|
||||||
|
QueueFamilyIndices indices = find_queue_family_indices(physical_device_, surface_);
|
||||||
|
std::set<uint32_t> set_indices = {indices.graphics_family.value(),
|
||||||
|
indices.present_family.value(),
|
||||||
|
indices.transfer_family.value()};
|
||||||
|
std::vector<uint32_t> arr_indices;
|
||||||
|
std::vector<uint32_t> 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)
|
void RenderEngine::copy_memory(VkBuffer src, VkBuffer dst, VkDeviceSize size)
|
||||||
{
|
{
|
||||||
QueueFamilyIndices indices = find_queue_family_indices(physical_device_, surface_);
|
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_};
|
VkBuffer vertex_buffers[] = {vertex_buffer_};
|
||||||
VkDeviceSize offset[] = {0};
|
VkDeviceSize offset[] = {0};
|
||||||
vkCmdBindVertexBuffers(command_buffer, 0, 1, vertex_buffers, offset);
|
vkCmdBindVertexBuffers(command_buffer, 0, 1, vertex_buffers, offset);
|
||||||
|
vkCmdBindIndexBuffer(command_buffer, index_buffer_, 0, VK_INDEX_TYPE_UINT16);
|
||||||
|
|
||||||
VkViewport viewport;
|
VkViewport viewport;
|
||||||
viewport.x = 0.0f;
|
viewport.x = 0.0f;
|
||||||
@@ -856,8 +891,9 @@ void RenderEngine::record_command_buffer(VkCommandBuffer command_buffer, uint32_
|
|||||||
scissor.extent = swapchain_extent_;
|
scissor.extent = swapchain_extent_;
|
||||||
vkCmdSetScissor(command_buffer, 0, 1, &scissor);
|
vkCmdSetScissor(command_buffer, 0, 1, &scissor);
|
||||||
|
|
||||||
vkCmdDraw(command_buffer, static_cast<uint32_t>(vertices_.size()), 1, 0, 0);
|
//vkCmdDraw(command_buffer, static_cast<uint32_t>(vertices_.size()), 1, 0, 0);
|
||||||
|
vkCmdDrawIndexed(command_buffer, static_cast<uint32_t>(indices_.size()), 1, 0, 0, 0);
|
||||||
|
|
||||||
vkCmdEndRenderPass(command_buffer);
|
vkCmdEndRenderPass(command_buffer);
|
||||||
VK_CHECK(vkEndCommandBuffer(command_buffer));
|
VK_CHECK(vkEndCommandBuffer(command_buffer));
|
||||||
}
|
}
|
||||||
@@ -924,6 +960,7 @@ window_(window)
|
|||||||
create_command_pool();
|
create_command_pool();
|
||||||
allocate_vertex_buffer();
|
allocate_vertex_buffer();
|
||||||
allocate_command_buffers();
|
allocate_command_buffers();
|
||||||
|
allocate_index_buffer();
|
||||||
create_sync_objects();
|
create_sync_objects();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -931,6 +968,12 @@ RenderEngine::~RenderEngine()
|
|||||||
{
|
{
|
||||||
vkDeviceWaitIdle(device_);
|
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)
|
if (vertex_buffer_memory_ != VK_NULL_HANDLE)
|
||||||
vkFreeMemory(device_, vertex_buffer_memory_, nullptr);
|
vkFreeMemory(device_, vertex_buffer_memory_, nullptr);
|
||||||
|
|
||||||
|
|||||||
@@ -35,7 +35,6 @@ class RenderEngine
|
|||||||
std::vector<VkSurfaceFormatKHR> formats;
|
std::vector<VkSurfaceFormatKHR> formats;
|
||||||
std::vector<VkPresentModeKHR> present_modes;
|
std::vector<VkPresentModeKHR> present_modes;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct Vertex
|
struct Vertex
|
||||||
{
|
{
|
||||||
glm::vec2 pos;
|
glm::vec2 pos;
|
||||||
@@ -43,10 +42,15 @@ class RenderEngine
|
|||||||
static VkVertexInputBindingDescription get_binding_description();
|
static VkVertexInputBindingDescription get_binding_description();
|
||||||
static std::array<VkVertexInputAttributeDescription, 2> get_vertex_attribute_descriptions();
|
static std::array<VkVertexInputAttributeDescription, 2> get_vertex_attribute_descriptions();
|
||||||
};
|
};
|
||||||
std::vector<Vertex> vertices_ = {
|
|
||||||
{{0.0f, -0.5f}, {1.0f, 0.0f, 0.0f}},
|
const std::vector<Vertex> vertices_ = {
|
||||||
{{0.5f, 0.5f}, {0.0f, 1.0f, 0.0f}},
|
{{-0.5f, -0.5f}, {1.0f, 0.0f, 0.0f}},
|
||||||
{{-0.5f, 0.5f}, {0.0f, 0.0f, 1.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<uint16_t> indices_ = {
|
||||||
|
0, 1, 2, 2, 3, 0
|
||||||
};
|
};
|
||||||
|
|
||||||
ModelManager model_manager_;
|
ModelManager model_manager_;
|
||||||
@@ -79,6 +83,8 @@ class RenderEngine
|
|||||||
std::vector<VkCommandBuffer> command_buffers_;
|
std::vector<VkCommandBuffer> command_buffers_;
|
||||||
VkBuffer vertex_buffer_ = VK_NULL_HANDLE;
|
VkBuffer vertex_buffer_ = VK_NULL_HANDLE;
|
||||||
VkDeviceMemory vertex_buffer_memory_ = 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
|
// Sync objects
|
||||||
std::vector<VkSemaphore> image_available_semaphores_, render_finished_semaphores_;
|
std::vector<VkSemaphore> image_available_semaphores_, render_finished_semaphores_;
|
||||||
@@ -116,8 +122,9 @@ class RenderEngine
|
|||||||
void allocate_command_buffers();
|
void allocate_command_buffers();
|
||||||
void create_sync_objects();
|
void create_sync_objects();
|
||||||
void allocate_vertex_buffer();
|
void allocate_vertex_buffer();
|
||||||
|
void allocate_index_buffer();
|
||||||
|
|
||||||
void copy_memory(VkBuffer src, VkBuffer dst, VkDeviceSize size);
|
void copy_memory(VkBuffer src, VkBuffer dst, VkDeviceSize size);
|
||||||
|
|
||||||
void record_command_buffer(VkCommandBuffer command_buffer, uint32_t image_index) const;
|
void record_command_buffer(VkCommandBuffer command_buffer, uint32_t image_index) const;
|
||||||
void draw_frame();
|
void draw_frame();
|
||||||
public:
|
public:
|
||||||
|
|||||||
Reference in New Issue
Block a user