diff --git a/main.cpp b/main.cpp index 23c11c9..4ce022f 100644 --- a/main.cpp +++ b/main.cpp @@ -45,11 +45,14 @@ const std::vector gValidationLayers = { }; const std::vector vertices = { - {{0.f, -0.5f}, {1.f, 0.f, 0.f}}, - {{0.5f, 0.5f}, {0.f, 1.f, 0.f}}, - {{-0.5f, 0.5f}, {0.f, 0.f, 1.f}}, + {{-0.5f, -0.5f}, {1.f, 0.f, 0.f}}, + {{0.5f, -0.5f}, {0.f, 1.f, 0.f}}, + {{0.5f, 0.5f}, {0.f, 0.f, 1.f}}, + {{-0.5f, 0.5f}, {1.f, 1.f, 1.f}}, }; +const std::vector indices = { 0, 1, 2, 2, 3, 0 }; + class Application { public: void run() { @@ -107,6 +110,7 @@ private: createSynchronizationObjects(); createVertexBuffer(); + createIndexBuffer(); } void mainLoop() { @@ -782,7 +786,32 @@ private: } throw std::runtime_error("no suitable memory for vertex buffer found"); - return {}; + } + + void createIndexBuffer() { + VkDeviceSize size = sizeof(indices[0]) * indices.size(); + + VkBuffer stagingBuffer; + VkDeviceMemory stagingBufferMemory; + + createBuffer(&stagingBuffer, &stagingBufferMemory, + VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT, size, + VK_BUFFER_USAGE_TRANSFER_SRC_BIT); + + { + void* memory; + vkMapMemory(mDevice, stagingBufferMemory, 0, size, 0, &memory); + memcpy(memory, indices.data(), size); + vkUnmapMemory(mDevice, stagingBufferMemory); + } + + createBuffer(&mIndexBuffer, &mIndexBufferMemory, + VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, size, + VK_BUFFER_USAGE_TRANSFER_DST_BIT | VK_BUFFER_USAGE_INDEX_BUFFER_BIT); + + copyBuffer(stagingBuffer, mIndexBuffer, size); + + destroyBuffer(stagingBuffer, stagingBufferMemory); } void createVertexBuffer() { @@ -931,8 +960,9 @@ private: VkBuffer vertexBuffers[] = { mVertexBuffer }; VkDeviceSize offsets[] = { 0 }; vkCmdBindVertexBuffers(commandBuffer, 0, 1, vertexBuffers, offsets); + vkCmdBindIndexBuffer(commandBuffer, mIndexBuffer, 0, VK_INDEX_TYPE_UINT16); - vkCmdDraw(commandBuffer, vertices.size(), 1, 0, 0); + vkCmdDrawIndexed(commandBuffer, indices.size(), 1, 0, 0, 0); vkCmdEndRenderPass(commandBuffer); @@ -1014,10 +1044,6 @@ private: */ } - void createBuffer() { - - } - static VkVertexInputBindingDescription getShaderVertexInputDescription() { return { .binding = 0, @@ -1054,6 +1080,7 @@ private: void cleanup() { destroyBuffer(mVertexBuffer, mVertexBufferMemory); + destroyBuffer(mIndexBuffer, mIndexBufferMemory); destroySynchronizationObjects(); @@ -1115,6 +1142,8 @@ private: VkBuffer mVertexBuffer = VK_NULL_HANDLE; VkDeviceMemory mVertexBufferMemory = VK_NULL_HANDLE; + VkBuffer mIndexBuffer = VK_NULL_HANDLE; + VkDeviceMemory mIndexBufferMemory = VK_NULL_HANDLE; }; int main() {