Index: graphics-pipeline_vulkan.cpp
===================================================================
--- graphics-pipeline_vulkan.cpp	(revision 0b1b52d45fd68804c3782b003e6516134b5d1e7f)
+++ graphics-pipeline_vulkan.cpp	(revision 771b33a137aed1be0c097e401feb8e3727bb1166)
@@ -4,9 +4,25 @@
 #include <stdexcept>
 
-GraphicsPipeline_Vulkan::GraphicsPipeline_Vulkan(VkDevice device) {
+GraphicsPipeline_Vulkan::GraphicsPipeline_Vulkan(VkDevice device, Viewport viewport, int vertexSize) {
    this->device = device;
+   this->viewport = viewport;
+
+   this->bindingDescription.binding = 0;
+   this->bindingDescription.stride = vertexSize;
+   this->bindingDescription.inputRate = VK_VERTEX_INPUT_RATE_VERTEX;
 }
 
 GraphicsPipeline_Vulkan::~GraphicsPipeline_Vulkan() {
+}
+
+void GraphicsPipeline_Vulkan::addAttribute(VkFormat format, size_t offset) {
+   VkVertexInputAttributeDescription attributeDesc = {};
+
+   attributeDesc.binding = 0;
+   attributeDesc.location = this->attributeDescriptions.size();
+   attributeDesc.format = format;
+   attributeDesc.offset = offset;
+
+   this->attributeDescriptions.push_back(attributeDesc);
 }
 
@@ -34,4 +50,85 @@
    VkPipelineVertexInputStateCreateInfo vertexInputInfo = {};
    vertexInputInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
+
+   vertexInputInfo.vertexBindingDescriptionCount = 1;
+   vertexInputInfo.vertexAttributeDescriptionCount = static_cast<uint32_t>(this->attributeDescriptions.size());
+   vertexInputInfo.pVertexBindingDescriptions = &this->bindingDescription;
+   vertexInputInfo.pVertexAttributeDescriptions = this->attributeDescriptions.data();
+
+   VkPipelineInputAssemblyStateCreateInfo inputAssembly = {};
+   inputAssembly.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
+   inputAssembly.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST;
+   inputAssembly.primitiveRestartEnable = VK_FALSE;
+
+   VkViewport viewport = {};
+   viewport.x = (float)this->viewport.x;
+   viewport.y = (float)this->viewport.y;
+   viewport.width = (float)this->viewport.width;
+   viewport.height = (float)this->viewport.height;
+   viewport.minDepth = 0.0f;
+   viewport.maxDepth = 1.0f;
+
+   VkRect2D scissor = {};
+   scissor.offset = { 0, 0 };
+   scissor.extent = { (uint32_t)this->viewport.width, (uint32_t)this->viewport.height };
+
+   VkPipelineViewportStateCreateInfo viewportState = {};
+   viewportState.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
+   viewportState.viewportCount = 1;
+   viewportState.pViewports = &viewport;
+   viewportState.scissorCount = 1;
+   viewportState.pScissors = &scissor;
+
+   VkPipelineRasterizationStateCreateInfo rasterizer = {};
+   rasterizer.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
+   rasterizer.depthClampEnable = VK_FALSE;
+   rasterizer.rasterizerDiscardEnable = VK_FALSE;
+   rasterizer.polygonMode = VK_POLYGON_MODE_FILL;
+   rasterizer.lineWidth = 1.0f;
+   rasterizer.cullMode = VK_CULL_MODE_BACK_BIT;
+   rasterizer.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
+   rasterizer.depthBiasEnable = VK_FALSE;
+
+   VkPipelineMultisampleStateCreateInfo multisampling = {};
+   multisampling.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
+   multisampling.sampleShadingEnable = VK_FALSE;
+   multisampling.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
+
+   VkPipelineColorBlendAttachmentState colorBlendAttachment = {};
+   colorBlendAttachment.colorWriteMask = VK_COLOR_COMPONENT_R_BIT | VK_COLOR_COMPONENT_G_BIT | VK_COLOR_COMPONENT_B_BIT | VK_COLOR_COMPONENT_A_BIT;
+   colorBlendAttachment.blendEnable = VK_TRUE;
+   colorBlendAttachment.colorBlendOp = VK_BLEND_OP_ADD;
+   colorBlendAttachment.srcColorBlendFactor = VK_BLEND_FACTOR_SRC_ALPHA;
+   colorBlendAttachment.dstColorBlendFactor = VK_BLEND_FACTOR_ONE_MINUS_SRC_ALPHA;
+   colorBlendAttachment.alphaBlendOp = VK_BLEND_OP_ADD;
+   colorBlendAttachment.srcAlphaBlendFactor = VK_BLEND_FACTOR_SRC_ALPHA;
+   colorBlendAttachment.dstAlphaBlendFactor = VK_BLEND_FACTOR_ONE_MINUS_SRC_ALPHA;
+
+   VkPipelineColorBlendStateCreateInfo colorBlending = {};
+   colorBlending.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
+   colorBlending.logicOpEnable = VK_FALSE;
+   colorBlending.logicOp = VK_LOGIC_OP_COPY;
+   colorBlending.attachmentCount = 1;
+   colorBlending.pAttachments = &colorBlendAttachment;
+   colorBlending.blendConstants[0] = 0.0f;
+   colorBlending.blendConstants[1] = 0.0f;
+   colorBlending.blendConstants[2] = 0.0f;
+   colorBlending.blendConstants[3] = 0.0f;
+
+   VkPipelineDepthStencilStateCreateInfo depthStencil = {};
+   depthStencil.sType = VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO;
+   depthStencil.depthTestEnable = VK_TRUE;
+   depthStencil.depthWriteEnable = VK_TRUE;
+   depthStencil.depthCompareOp = VK_COMPARE_OP_LESS;
+   depthStencil.depthBoundsTestEnable = VK_FALSE;
+   depthStencil.minDepthBounds = 0.0f;
+   depthStencil.maxDepthBounds = 1.0f;
+   depthStencil.stencilTestEnable = VK_FALSE;
+   depthStencil.front = {};
+   depthStencil.back = {};
+
+   VkPipelineLayoutCreateInfo pipelineLayoutInfo = {};
+   pipelineLayoutInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
+   pipelineLayoutInfo.setLayoutCount = 1;
 
    vkDestroyShaderModule(device, vertShaderModule, nullptr);
Index: graphics-pipeline_vulkan.hpp
===================================================================
--- graphics-pipeline_vulkan.hpp	(revision 0b1b52d45fd68804c3782b003e6516134b5d1e7f)
+++ graphics-pipeline_vulkan.hpp	(revision 771b33a137aed1be0c097e401feb8e3727bb1166)
@@ -4,17 +4,20 @@
 #include "graphics-pipeline.hpp"
 
+#include <vector>
+
 #include <vulkan/vulkan.h>
-
-#include <vector>
 
 class GraphicsPipeline_Vulkan : public GraphicsPipeline {
    public:
-      GraphicsPipeline_Vulkan(VkDevice device);
+      GraphicsPipeline_Vulkan(VkDevice device, Viewport viewport, int vertexSize);
       ~GraphicsPipeline_Vulkan();
 
+      void addAttribute(VkFormat format, size_t offset);
       void createPipeline(string vertShaderFile, string fragShaderFile);
    
    private:
       VkDevice device;
+      VkVertexInputBindingDescription bindingDescription;
+      vector<VkVertexInputAttributeDescription> attributeDescriptions;
 
       VkShaderModule createShaderModule(const vector<char>& code);
Index: vulkan-game.cpp
===================================================================
--- vulkan-game.cpp	(revision 0b1b52d45fd68804c3782b003e6516134b5d1e7f)
+++ vulkan-game.cpp	(revision 771b33a137aed1be0c097e401feb8e3727bb1166)
@@ -8,4 +8,5 @@
 #include "logger.hpp"
 
+#include "utils.hpp"
 #include "vulkan-utils.hpp"
 
@@ -106,8 +107,17 @@
    createCommandPool();
 
-   graphicsPipelines.push_back(GraphicsPipeline_Vulkan(device));
+   graphicsPipelines.push_back(GraphicsPipeline_Vulkan(device, viewport, sizeof(Vertex)));
+
+   graphicsPipelines.back().addAttribute(VK_FORMAT_R32G32B32_SFLOAT, offset_of(&Vertex::pos));
+   graphicsPipelines.back().addAttribute(VK_FORMAT_R32G32B32_SFLOAT, offset_of(&Vertex::color));
+   graphicsPipelines.back().addAttribute(VK_FORMAT_R32G32_SFLOAT, offset_of(&Vertex::texCoord));
+
    graphicsPipelines.back().createPipeline("shaders/scene-vert.spv", "shaders/scene-frag.spv");
 
-   graphicsPipelines.push_back(GraphicsPipeline_Vulkan(device));
+   graphicsPipelines.push_back(GraphicsPipeline_Vulkan(device, viewport, sizeof(OverlayVertex)));
+
+   graphicsPipelines.back().addAttribute(VK_FORMAT_R32G32B32_SFLOAT, offset_of(&OverlayVertex::pos));
+   graphicsPipelines.back().addAttribute(VK_FORMAT_R32G32_SFLOAT, offset_of(&OverlayVertex::texCoord));
+
    graphicsPipelines.back().createPipeline("shaders/overlay-vert.spv", "shaders/overlay-frag.spv");
 
@@ -427,5 +437,5 @@
 
    swapChainImageFormat = surfaceFormat.format;
-   swapChainExtent = extent;
+   viewport = { 0, 0, (int)extent.width, (int)extent.height };
 }
 
Index: vulkan-game.hpp
===================================================================
--- vulkan-game.hpp	(revision 0b1b52d45fd68804c3782b003e6516134b5d1e7f)
+++ vulkan-game.hpp	(revision 771b33a137aed1be0c097e401feb8e3727bb1166)
@@ -1,4 +1,6 @@
 #ifndef _VULKAN_GAME_H
 #define _VULKAN_GAME_H
+
+#include <glm/glm.hpp>
 
 #include "game-gui-sdl.hpp"
@@ -11,4 +13,17 @@
 #endif
 
+// TODO: Figure out if these structs should be defined in the VulkanGame class
+
+struct Vertex {
+   glm::vec3 pos;
+   glm::vec3 color;
+   glm::vec2 texCoord;
+};
+
+struct OverlayVertex {
+   glm::vec3 pos;
+   glm::vec2 texCoord;
+};
+
 class VulkanGame {
    public:
@@ -20,4 +35,5 @@
    private:
       GameGui* gui;
+      Viewport viewport;
 
       vector<GraphicsPipeline_Vulkan> graphicsPipelines;
@@ -39,5 +55,4 @@
       vector<VkImage> swapChainImages;
       VkFormat swapChainImageFormat;
-      VkExtent2D swapChainExtent;
       vector<VkImageView> swapChainImageViews;
 
Index: vulkan-ref.cpp
===================================================================
--- vulkan-ref.cpp	(revision 0b1b52d45fd68804c3782b003e6516134b5d1e7f)
+++ vulkan-ref.cpp	(revision 771b33a137aed1be0c097e401feb8e3727bb1166)
@@ -175,5 +175,7 @@
       VkFormat swapChainImageFormat;
 /*** END OF REFACTORED CODE ***/
-      VkExtent2D swapChainExtent; // (This was taken out of vulkan-game for now and replaced with Viewport)
+      // (This was taken out of vulkan-game for now and replaced with Viewport)
+      // It will definitely be needed when creating render passes and I could use it in a few other places
+      VkExtent2D swapChainExtent;
 /*** START OF REFACTORED CODE ***/
       vector<VkImageView> swapChainImageViews;
