Index: makefile
===================================================================
--- makefile	(revision ee75487f4a3240126e497de9d69c1e754c198d4f)
+++ makefile	(revision 5b026765e53c962deceba380c0f0f6c7249eb648)
@@ -25,5 +25,5 @@
 	$(CC) $^ $(DEP) $(CFLAGS) -o $@
 
-openglgame: main-opengl.cpp opengl-game.cpp crash-logger.cpp logger.cpp game-gui-glfw.cpp imgui_impl_glfw_gl3.cpp $(IMGUI_FILES)
+openglgame: main-opengl.cpp opengl-game.cpp crash-logger.cpp logger.cpp game-gui-glfw.cpp imgui_impl_glfw_gl3.cpp graphics-pipeline_opengl.cpp $(IMGUI_FILES)
 	$(CC) $^ $(DEP) $(CFLAGS) -o $@ -DGLEW_STATIC
 
@@ -59,5 +59,5 @@
 	$(CC) $(CXX_FLAGS) -o $@ $^ $(LIB_FLAGS) -DGAMEGUI_INCLUDE_VULKAN
 
-vulkangame: main-vulkan.cpp vulkan-game.cpp crash-logger.cpp logger.cpp vulkan-utils.cpp game-gui-sdl.cpp
+vulkangame: main-vulkan.cpp vulkan-game.cpp crash-logger.cpp logger.cpp vulkan-utils.cpp game-gui-sdl.cpp graphics-pipeline_vulkan.cpp
 	$(CC) $(CXX_FLAGS) -o $@ $^ $(LIB_FLAGS) -DGAMEGUI_INCLUDE_VULKAN
 
Index: new-game.cpp
===================================================================
--- new-game.cpp	(revision ee75487f4a3240126e497de9d69c1e754c198d4f)
+++ new-game.cpp	(revision 5b026765e53c962deceba380c0f0f6c7249eb648)
@@ -166,5 +166,7 @@
 void mouse_button_callback(GLFWwindow* window, int button, int action, int mods);
 void key_callback(GLFWwindow* window, int key, int scancode, int action, int mods);
+/*** START OF REFACTORED CODE ***/
 void window_size_callback(GLFWwindow* window, int width, int height);
+/*** END OF REFACTORED CODE ***/
 
 void APIENTRY debugGlCallback(
@@ -486,4 +488,5 @@
    map<ObjectType, ShaderModelGroup> modelGroups;
 
+/*** START OF REFACTORED CODE ***/
    modelGroups[TYPE_SHIP] = createModelGroup(
       loadShaderProgram("gl-shaders/ship.vert", "gl-shaders/ship.frag"));
@@ -498,4 +501,5 @@
    defineModelGroupAttrib(modelGroups[TYPE_SHIP], "ubo_index", ATTRIB_OBJECT_VARYING,
       1, GL_UNSIGNED_INT, offset_of(&SceneObject::ubo_offset));
+/*** END OF REFACTORED CODE ***/
 
    defineModelGroupUniform(modelGroups[TYPE_SHIP], "view", ATTRIB_UNIFORM,
@@ -506,4 +510,5 @@
    initModelGroupAttribs(modelGroups[TYPE_SHIP]);
 
+/*** START OF REFACTORED CODE ***/
    modelGroups[TYPE_ASTEROID] = createModelGroup(
       loadShaderProgram("gl-shaders/asteroid.vert", "gl-shaders/asteroid.frag"));
@@ -518,4 +523,5 @@
    defineModelGroupAttrib(modelGroups[TYPE_ASTEROID], "ubo_index", ATTRIB_OBJECT_VARYING,
       1, GL_UNSIGNED_INT, offset_of(&SceneObject::ubo_offset));
+/*** END OF REFACTORED CODE ***/
 
    defineModelGroupUniform(modelGroups[TYPE_ASTEROID], "view", ATTRIB_UNIFORM,
@@ -526,4 +532,5 @@
    initModelGroupAttribs(modelGroups[TYPE_ASTEROID]);
 
+/*** START OF REFACTORED CODE ***/
    modelGroups[TYPE_LASER] = createModelGroup(
       loadShaderProgram("gl-shaders/laser.vert", "gl-shaders/laser.frag"));
@@ -536,4 +543,5 @@
    defineModelGroupAttrib(modelGroups[TYPE_LASER], "ubo_index", ATTRIB_OBJECT_VARYING,
       1, GL_UNSIGNED_INT, offset_of(&SceneObject::ubo_offset));
+/*** END OF REFACTORED CODE ***/
 
    defineModelGroupUniform(modelGroups[TYPE_LASER], "view", ATTRIB_UNIFORM,
@@ -546,4 +554,5 @@
    initModelGroupAttribs(modelGroups[TYPE_LASER]);
 
+/*** START OF REFACTORED CODE ***/
    modelGroups[TYPE_EXPLOSION] = createModelGroup(
       loadShaderProgram("gl-shaders/explosion.vert", "gl-shaders/explosion.frag"));
@@ -556,4 +565,5 @@
    defineModelGroupAttrib(modelGroups[TYPE_EXPLOSION], "ubo_index", ATTRIB_OBJECT_VARYING,
       1, GL_UNSIGNED_INT, offset_of(&SceneObject::ubo_offset));
+/*** END OF REFACTORED CODE ***/
 
    defineModelGroupUniform(modelGroups[TYPE_EXPLOSION], "cur_time", ATTRIB_UNIFORM,
@@ -1060,4 +1070,5 @@
 }
 
+/*** START OF REFACTORED CODE ***/
 void window_size_callback(GLFWwindow* window, int width, int height) {
    cout << "Window resized to (" << width << ", " << height << ")" << endl;
@@ -1073,4 +1084,5 @@
    //glfwSetWindowAttrib(window, GLFW_DECORATED, GLFW_FALSE);
 }
+/*** END OF REFACTORED CODE ***/
 
 void APIENTRY debugGlCallback(
@@ -1945,10 +1957,13 @@
 
 void initModelGroupAttribs(ShaderModelGroup& modelGroup) {
+/*** START OF REFACTORED CODE ***/
    glBindVertexArray(modelGroup.vao);
 
    map<string, AttribInfo>::iterator it;
    for (it = modelGroup.attribs.begin(); it != modelGroup.attribs.end(); it++) {
+/*** END OF REFACTORED CODE ***/
       if (it->second.attribType == ATTRIB_UNIFORM) {
          it->second.buffer = glGetUniformLocation(modelGroup.shaderProgram, it->first.c_str());
+/*** START OF REFACTORED CODE ***/
       } else {
          glEnableVertexAttribArray(it->second.index);
@@ -1969,4 +1984,5 @@
       }
    }
+/*** START OF REFACTORED CODE ***/
 }
 
Index: vulkan-ref.cpp
===================================================================
--- vulkan-ref.cpp	(revision ee75487f4a3240126e497de9d69c1e754c198d4f)
+++ vulkan-ref.cpp	(revision 5b026765e53c962deceba380c0f0f6c7249eb648)
@@ -61,5 +61,4 @@
     vector<VkPresentModeKHR> presentModes;
 };
-/*** END OF REFACTORED CODE ***/
 
 struct Vertex {
@@ -73,4 +72,5 @@
    glm::vec2 texCoord;
 };
+/*** END OF REFACTORED CODE ***/
 
 struct UniformBufferObject {
@@ -174,5 +174,7 @@
       vector<VkImage> swapChainImages;
       VkFormat swapChainImageFormat;
-      VkExtent2D swapChainExtent;
+/*** END OF REFACTORED CODE ***/
+      VkExtent2D swapChainExtent; // (This was taken out of vulkan-game for now and replaced with Viewport)
+/*** START OF REFACTORED CODE ***/
       vector<VkImageView> swapChainImageViews;
 /*** END OF REFACTORED CODE ***/
@@ -369,7 +371,9 @@
             sceneIndices.data(), sizeof(uint16_t), sceneIndices.size());
 
+/*** START OF REFACTORED CODE ***/
          addAttributeDescription(scenePipeline, VK_FORMAT_R32G32B32_SFLOAT, offset_of(&Vertex::pos));
          addAttributeDescription(scenePipeline, VK_FORMAT_R32G32B32_SFLOAT, offset_of(&Vertex::color));
          addAttributeDescription(scenePipeline, VK_FORMAT_R32G32_SFLOAT, offset_of(&Vertex::texCoord));
+/*** END OF REFACTORED CODE ***/
 
          addDescriptorInfo(scenePipeline, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, VK_SHADER_STAGE_VERTEX_BIT, &uniformBufferInfoList, nullptr);
@@ -394,6 +398,8 @@
             overlayIndices.data(), sizeof(uint16_t), overlayIndices.size());
 
+/*** START OF REFACTORED CODE ***/
          addAttributeDescription(overlayPipeline, VK_FORMAT_R32G32B32_SFLOAT, offset_of(&OverlayVertex::pos));
          addAttributeDescription(overlayPipeline, VK_FORMAT_R32G32_SFLOAT, offset_of(&OverlayVertex::texCoord));
+/*** END OF REFACTORED CODE ***/
 
          addDescriptorInfo(overlayPipeline, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr, &overlayImageInfo);
@@ -809,4 +815,5 @@
             const void* vertexData, int vertexSize, size_t numVertices,
             const void* indexData, int indexSize, size_t numIndices) {
+/*** START OF REFACTORED CODE ***/
          // Since there is only one array of vertex data, we use binding = 0
          // I'll probably do that for the foreseeable future
@@ -816,4 +823,5 @@
          info.bindingDescription.stride = vertexSize;
          info.bindingDescription.inputRate = VK_VERTEX_INPUT_RATE_VERTEX;
+/*** END OF REFACTORED CODE ***/
 
          info.numVertices = numVertices;
@@ -886,5 +894,4 @@
          VkPipelineVertexInputStateCreateInfo vertexInputInfo = {};
          vertexInputInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
-/*** END OF REFACTORED CODE ***/
 
          vertexInputInfo.vertexBindingDescriptionCount = 1;
@@ -968,4 +975,5 @@
          pipelineLayoutInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
          pipelineLayoutInfo.setLayoutCount = 1;
+/*** END OF REFACTORED CODE ***/
          pipelineLayoutInfo.pSetLayouts = &info.descriptorSetLayout;
          pipelineLayoutInfo.pushConstantRangeCount = 0;
