diff --git a/src/HelloTriangleApplication.cpp b/src/HelloTriangleApplication.cpp index 2508e3c..7c7cd81 100644 --- a/src/HelloTriangleApplication.cpp +++ b/src/HelloTriangleApplication.cpp @@ -43,10 +43,20 @@ struct Vertex { } }; +//const 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.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}}, + {{-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, }; VkShaderModule HelloTriangleApplication::createShaderModule(const std::vector &code) { @@ -423,6 +433,27 @@ void HelloTriangleApplication::createVertexBuffer() { vkFreeMemory(myVkInstance->device, stagingBufferMemory, nullptr); } +void HelloTriangleApplication::createIndexBuffer() { + VkDeviceSize bufferSize = sizeof(indices[0]) * indices.size(); + + VkBuffer stagingBuffer; + VkDeviceMemory stagingBufferMemory; + createBuffer(bufferSize, VK_BUFFER_USAGE_TRANSFER_SRC_BIT, + VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT, stagingBuffer, stagingBufferMemory); + + void* data; + vkMapMemory(myVkInstance->device, stagingBufferMemory, 0, bufferSize, 0, &data); + memcpy(data, indices.data(), (size_t)bufferSize); + vkUnmapMemory(myVkInstance->device, stagingBufferMemory); + + createBuffer(bufferSize, VK_BUFFER_USAGE_TRANSFER_DST_BIT | VK_BUFFER_USAGE_INDEX_BUFFER_BIT, + VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, indexBuffer, indexBufferMemory); + copyBuffer(stagingBuffer, indexBuffer, bufferSize); + + vkDestroyBuffer(myVkInstance->device, stagingBuffer, nullptr); + vkFreeMemory(myVkInstance->device, stagingBufferMemory, nullptr); +} + void HelloTriangleApplication::copyBuffer(VkBuffer srcBuffer, VkBuffer dstBuffer, VkDeviceSize size) { VkCommandBufferAllocateInfo commandBufferAllocateInfo{ .sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, @@ -505,7 +536,8 @@ void HelloTriangleApplication::createCommandBuffers() { VkBuffer vertexBuffers[] = {vertexBuffer}; VkDeviceSize offset[] = {0}; vkCmdBindVertexBuffers(commandBuffers[i], 0, 1, vertexBuffers, offset); - vkCmdDraw(commandBuffers[i], static_cast(vertices.size()), 1, 0, 0); + vkCmdBindIndexBuffer(commandBuffers[i], indexBuffer, 0, VK_INDEX_TYPE_UINT16); + vkCmdDrawIndexed(commandBuffers[i], static_cast(indices.size()), 1, 0, 0, 0); vkCmdEndRenderPass(commandBuffers[i]); if (vkEndCommandBuffer(commandBuffers[i]) != VK_SUCCESS) { throw std::runtime_error{"Failed to record command buffer"}; @@ -543,6 +575,7 @@ void HelloTriangleApplication::initVulkan() { createFrameBuffers(); createCommandPool(); createVertexBuffer(); + createIndexBuffer(); createCommandBuffers(); createSyncObjects(); } @@ -669,6 +702,9 @@ void HelloTriangleApplication::cleanup() { vkDestroyBuffer(myVkInstance->device, vertexBuffer, nullptr); vkFreeMemory(myVkInstance->device, vertexBufferMemory, nullptr); + vkDestroyBuffer(myVkInstance->device, indexBuffer, nullptr); + vkFreeMemory(myVkInstance->device, indexBufferMemory, nullptr); + for (int i = 0; i < MAX_FRAMES_IN_FLIGHT; ++i) { vkDestroySemaphore(myVkInstance->device, renderFinishedSemaphores[i], nullptr); vkDestroySemaphore(myVkInstance->device, imageAvailableSemaphores[i], nullptr); diff --git a/src/HelloTriangleApplication.h b/src/HelloTriangleApplication.h index bd577e1..67c6198 100644 --- a/src/HelloTriangleApplication.h +++ b/src/HelloTriangleApplication.h @@ -32,6 +32,8 @@ private: std::vector swapChainFrameBuffers; VkBuffer vertexBuffer; VkDeviceMemory vertexBufferMemory; + VkBuffer indexBuffer; + VkDeviceMemory indexBufferMemory; VkCommandPool commandPool; std::vector commandBuffers; @@ -50,6 +52,7 @@ private: void createFrameBuffers(); void createCommandPool(); void createVertexBuffer(); + void createIndexBuffer(); void createCommandBuffers(); void createSyncObjects(); void initVulkan();