Index: vulkan-game.cpp
===================================================================
--- vulkan-game.cpp	(revision c8b0357ff69bc64f21dd13f33b82bb4455bde02c)
+++ vulkan-game.cpp	(revision b8b32bd447f32afb9589680b778624e62dee25df)
@@ -111,5 +111,7 @@
 };
 
-struct BufferInfo {
+struct GraphicsPipelineInfo {
+   VkPipeline pipeline;
+
    VkBuffer vertexBuffer;
    VkDeviceMemory vertexBufferMemory;
@@ -187,5 +189,4 @@
       VkDescriptorSetLayout descriptorSetLayout;
       VkPipelineLayout pipelineLayout;
-      VkPipeline graphicsPipeline;
       VkDescriptorPool descriptorPool;
       vector<VkDescriptorSet> descriptorSets;
@@ -211,6 +212,6 @@
       VkSampler textureSampler;
 
-      BufferInfo sceneBuffers;
-      BufferInfo overlayBuffers;
+      GraphicsPipelineInfo scenePipeline;
+      GraphicsPipelineInfo overlayPipeline;
 
       vector<VkBuffer> uniformBuffers;
@@ -313,5 +314,6 @@
          createRenderPass();
          createDescriptorSetLayout();
-         createGraphicsPipeline();
+         createGraphicsPipeline("shaders/vert.spv", "shaders/frag.spv", &scenePipeline.pipeline);
+         createGraphicsPipeline("shaders/vert.spv", "shaders/frag.spv", &overlayPipeline.pipeline);
          createCommandPool();
          createDepthResources();
@@ -321,5 +323,5 @@
          createTextureSampler();
 
-         createShaderBuffers(sceneBuffers, {
+         createShaderBuffers(scenePipeline, {
             {{-0.5f, -0.5f, -0.5f}, {1.0f, 0.0f, 0.0f}, {0.0f, 1.0f}},
             {{ 0.5f, -0.5f, -0.5f}, {0.0f, 1.0f, 0.0f}, {1.0f, 1.0f}},
@@ -336,5 +338,5 @@
          });
 
-         createShaderBuffers(overlayBuffers, {
+         createShaderBuffers(overlayPipeline, {
             // Filler vertices to increase the overlay vertex indices to at least 8
             {{-1.0f, -1.0f,  3.0f}, {1.0f, 1.0f, 1.0f}, {0.0f, 0.0f}},
@@ -797,7 +799,7 @@
       }
 
-      void createGraphicsPipeline() {
-         auto vertShaderCode = readFile("shaders/vert.spv");
-         auto fragShaderCode = readFile("shaders/frag.spv");
+      void createGraphicsPipeline(string vertShaderFile, string fragShaderFile, VkPipeline* pipeline) {
+         auto vertShaderCode = readFile(vertShaderFile);
+         auto fragShaderCode = readFile(fragShaderFile);
 
          VkShaderModule vertShaderModule = createShaderModule(vertShaderCode);
@@ -929,5 +931,5 @@
          pipelineInfo.basePipelineIndex = -1;
 
-         if (vkCreateGraphicsPipelines(device, VK_NULL_HANDLE, 1, &pipelineInfo, nullptr, &graphicsPipeline) != VK_SUCCESS) {
+         if (vkCreateGraphicsPipelines(device, VK_NULL_HANDLE, 1, &pipelineInfo, nullptr, pipeline) != VK_SUCCESS) {
             throw runtime_error("failed to create graphics pipeline!");
          }
@@ -1334,5 +1336,5 @@
       }
 
-      void createShaderBuffers(BufferInfo& info, const vector<Vertex>& vertices, const vector<uint16_t>& indices) {
+      void createShaderBuffers(GraphicsPipelineInfo& info, const vector<Vertex>& vertices, const vector<uint16_t>& indices) {
          createVertexBuffer(info.vertexBuffer, info.vertexBufferMemory, vertices);
          info.numVertices = vertices.size();
@@ -1610,24 +1612,24 @@
             vkCmdBeginRenderPass(commandBuffers[i], &renderPassInfo, VK_SUBPASS_CONTENTS_INLINE);
 
-            vkCmdBindPipeline(commandBuffers[i], VK_PIPELINE_BIND_POINT_GRAPHICS, graphicsPipeline);
+            vkCmdBindPipeline(commandBuffers[i], VK_PIPELINE_BIND_POINT_GRAPHICS, scenePipeline.pipeline);
 
             vkCmdBindDescriptorSets(commandBuffers[i], VK_PIPELINE_BIND_POINT_GRAPHICS, pipelineLayout, 0, 1, &descriptorSets[i], 0, nullptr);
 
-            VkBuffer vertexBuffers[] = { sceneBuffers.vertexBuffer };
+            VkBuffer vertexBuffers[] = { scenePipeline.vertexBuffer };
             VkDeviceSize offsets[] = { 0 };
             vkCmdBindVertexBuffers(commandBuffers[i], 0, 1, vertexBuffers, offsets);
 
-            vkCmdBindIndexBuffer(commandBuffers[i], sceneBuffers.indexBuffer, 0, VK_INDEX_TYPE_UINT16);
-
-            vkCmdDrawIndexed(commandBuffers[i], static_cast<uint32_t>(sceneBuffers.numIndices), 1, 0, 0, 0);
-
-            vkCmdBindPipeline(commandBuffers[i], VK_PIPELINE_BIND_POINT_GRAPHICS, graphicsPipeline);
-
-            VkBuffer vertexBuffersOverlay[] = { overlayBuffers.vertexBuffer };
+            vkCmdBindIndexBuffer(commandBuffers[i], scenePipeline.indexBuffer, 0, VK_INDEX_TYPE_UINT16);
+
+            vkCmdDrawIndexed(commandBuffers[i], static_cast<uint32_t>(scenePipeline.numIndices), 1, 0, 0, 0);
+
+            vkCmdBindPipeline(commandBuffers[i], VK_PIPELINE_BIND_POINT_GRAPHICS, overlayPipeline.pipeline);
+
+            VkBuffer vertexBuffersOverlay[] = { overlayPipeline.vertexBuffer };
             vkCmdBindVertexBuffers(commandBuffers[i], 0, 1, vertexBuffersOverlay, offsets);
 
-            vkCmdBindIndexBuffer(commandBuffers[i], overlayBuffers.indexBuffer, 0, VK_INDEX_TYPE_UINT16);
-
-            vkCmdDrawIndexed(commandBuffers[i], static_cast<uint32_t>(overlayBuffers.numIndices), 1, 0, 0, 0);
+            vkCmdBindIndexBuffer(commandBuffers[i], overlayPipeline.indexBuffer, 0, VK_INDEX_TYPE_UINT16);
+
+            vkCmdDrawIndexed(commandBuffers[i], static_cast<uint32_t>(overlayPipeline.numIndices), 1, 0, 0, 0);
 
             vkCmdEndRenderPass(commandBuffers[i]);
@@ -1822,5 +1824,6 @@
          createImageViews();
          createRenderPass();
-         createGraphicsPipeline();
+         createGraphicsPipeline("shaders/vert.spv", "shaders/frag.spv", &scenePipeline.pipeline);
+         createGraphicsPipeline("shaders/vert.spv", "shaders/frag.spv", &overlayPipeline.pipeline);
          createDepthResources();
          createFramebuffers();
@@ -1850,13 +1853,13 @@
          vkDestroyDescriptorSetLayout(device, descriptorSetLayout, nullptr);
 
-         vkDestroyBuffer(device, sceneBuffers.vertexBuffer, nullptr);
-         vkFreeMemory(device, sceneBuffers.vertexBufferMemory, nullptr);
-         vkDestroyBuffer(device, sceneBuffers.indexBuffer, nullptr);
-         vkFreeMemory(device, sceneBuffers.indexBufferMemory, nullptr);
-
-         vkDestroyBuffer(device, overlayBuffers.vertexBuffer, nullptr);
-         vkFreeMemory(device, overlayBuffers.vertexBufferMemory, nullptr);
-         vkDestroyBuffer(device, overlayBuffers.indexBuffer, nullptr);
-         vkFreeMemory(device, overlayBuffers.indexBufferMemory, nullptr);
+         vkDestroyBuffer(device, scenePipeline.vertexBuffer, nullptr);
+         vkFreeMemory(device, scenePipeline.vertexBufferMemory, nullptr);
+         vkDestroyBuffer(device, scenePipeline.indexBuffer, nullptr);
+         vkFreeMemory(device, scenePipeline.indexBufferMemory, nullptr);
+
+         vkDestroyBuffer(device, overlayPipeline.vertexBuffer, nullptr);
+         vkFreeMemory(device, overlayPipeline.vertexBufferMemory, nullptr);
+         vkDestroyBuffer(device, overlayPipeline.indexBuffer, nullptr);
+         vkFreeMemory(device, overlayPipeline.indexBufferMemory, nullptr);
 
          for (size_t i = 0; i < MAX_FRAMES_IN_FLIGHT; i++) {
@@ -1917,5 +1920,7 @@
          vkFreeCommandBuffers(device, commandPool, static_cast<uint32_t>(commandBuffers.size()), commandBuffers.data());
 
-         vkDestroyPipeline(device, graphicsPipeline, nullptr);
+         vkDestroyPipeline(device, scenePipeline.pipeline, nullptr);
+         vkDestroyPipeline(device, overlayPipeline.pipeline, nullptr);
+
          vkDestroyPipelineLayout(device, pipelineLayout, nullptr);
          vkDestroyRenderPass(device, renderPass, nullptr);
