Index: vulkan-game.cpp
===================================================================
--- vulkan-game.cpp	(revision d9ef6abf8f84c3924d1d1742f0dd473aac90c71f)
+++ vulkan-game.cpp	(revision cae7a2c45c3b45a16da4eccb3767ade8c9c58df1)
@@ -1,2 +1,8 @@
+/*
+DESIGN GUIDE
+
+I should store multiple buffers (e.g. vertex and index buffers) in the same VkBuffer and use offsets into it
+*/
+
 #include "game-gui-glfw.hpp"
 
@@ -85,7 +91,12 @@
 
 const vector<Vertex> 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}}
+   {{-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 vector<uint16_t> indices = {
+   0, 1, 2, 2, 3, 0 
 };
 
@@ -153,4 +164,6 @@
       VkBuffer vertexBuffer;
       VkDeviceMemory vertexBufferMemory;
+      VkBuffer indexBuffer;
+      VkDeviceMemory indexBufferMemory;
 
       vector<VkFramebuffer> swapChainFramebuffers;
@@ -194,4 +207,5 @@
          createCommandPool();
          createVertexBuffer();
+         createIndexBuffer();
          createCommandBuffers();
          createSyncObjects();
@@ -879,4 +893,27 @@
       }
 
+      void 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(device, stagingBufferMemory, 0, bufferSize, 0, &data);
+         memcpy(data, indices.data(), (size_t)bufferSize);
+         vkUnmapMemory(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(device, stagingBuffer, nullptr);
+         vkFreeMemory(device, stagingBufferMemory, nullptr);
+      }
+
       void createBuffer(VkDeviceSize size, VkBufferUsageFlags usage, VkMemoryPropertyFlags properties,
             VkBuffer& buffer, VkDeviceMemory& bufferMemory) {
@@ -996,5 +1033,7 @@
             vkCmdBindVertexBuffers(commandBuffers[i], 0, 1, vertexBuffers, offsets);
 
-            vkCmdDraw(commandBuffers[i], static_cast<uint32_t>(vertices.size()), 1, 0, 0);
+            vkCmdBindIndexBuffer(commandBuffers[i], indexBuffer, 0, VK_INDEX_TYPE_UINT16);
+
+            vkCmdDrawIndexed(commandBuffers[i], static_cast<uint32_t>(indices.size()), 1, 0, 0, 0);
             vkCmdEndRenderPass(commandBuffers[i]);
 
@@ -1124,4 +1163,7 @@
          cleanupSwapChain();
 
+         vkDestroyBuffer(device, indexBuffer, nullptr);
+         vkFreeMemory(device, indexBufferMemory, nullptr);
+
          vkDestroyBuffer(device, vertexBuffer, nullptr);
          vkFreeMemory(device, vertexBufferMemory, nullptr);
