Index: vulkan-game.cpp
===================================================================
--- vulkan-game.cpp	(revision 054d9eddab1a5e7ed131f514937c5d24f409337a)
+++ vulkan-game.cpp	(revision f94eea9cc8966583fd608bcd0f1a25213a8e8d71)
@@ -101,4 +101,5 @@
    createLogicalDevice(validationLayers, deviceExtensions);
    createSwapChain();
+   createImageViews();
 }
 
@@ -175,8 +176,4 @@
    gui->shutdown();
    delete gui;
-}
-
-void VulkanGame::cleanupSwapChain() {
-   vkDestroySwapchainKHR(device, swapChain, nullptr);
 }
 
@@ -389,6 +386,5 @@
       createInfo.queueFamilyIndexCount = 2;
       createInfo.pQueueFamilyIndices = queueFamilyIndices;
-   }
-   else {
+   } else {
       createInfo.imageSharingMode = VK_SHARING_MODE_EXCLUSIVE;
       createInfo.queueFamilyIndexCount = 0;
@@ -413,2 +409,19 @@
    swapChainExtent = extent;
 }
+
+void VulkanGame::createImageViews() {
+   swapChainImageViews.resize(swapChainImages.size());
+
+   for (size_t i = 0; i < swapChainImages.size(); i++) {
+      swapChainImageViews[i] = VulkanUtils::createImageView(device, swapChainImages[i], swapChainImageFormat,
+         VK_IMAGE_ASPECT_COLOR_BIT);
+   }
+}
+
+void VulkanGame::cleanupSwapChain() {
+   for (auto imageView : swapChainImageViews) {
+      vkDestroyImageView(device, imageView, nullptr);
+   }
+
+   vkDestroySwapchainKHR(device, swapChain, nullptr);
+}
Index: vulkan-game.hpp
===================================================================
--- vulkan-game.hpp	(revision 054d9eddab1a5e7ed131f514937c5d24f409337a)
+++ vulkan-game.hpp	(revision f94eea9cc8966583fd608bcd0f1a25213a8e8d71)
@@ -37,4 +37,5 @@
       VkFormat swapChainImageFormat;
       VkExtent2D swapChainExtent;
+      vector<VkImageView> swapChainImageViews;
 
       bool initWindow(int width, int height, unsigned char guiFlags);
@@ -55,4 +56,6 @@
          const vector<const char*>& deviceExtensions);
       void createSwapChain();
+      void createImageViews();
+
       void cleanupSwapChain();
 
Index: vulkan-ref.cpp
===================================================================
--- vulkan-ref.cpp	(revision 054d9eddab1a5e7ed131f514937c5d24f409337a)
+++ vulkan-ref.cpp	(revision f94eea9cc8966583fd608bcd0f1a25213a8e8d71)
@@ -173,6 +173,6 @@
       VkFormat swapChainImageFormat;
       VkExtent2D swapChainExtent;
+      vector<VkImageView> swapChainImageViews;
 /*** END OF REFACTORED CODE ***/
-      vector<VkImageView> swapChainImageViews;
       vector<VkFramebuffer> swapChainFramebuffers;
 
@@ -317,7 +317,7 @@
          pickPhysicalDevice();
          createLogicalDevice();
-/*** END OF REFACTORED CODE ***/
          createSwapChain();
          createImageViews();
+/*** END OF REFACTORED CODE ***/
          createRenderPass();
 
@@ -685,5 +685,4 @@
          return details;
       }
-/*** END OF REFACTORED CODE ***/
 
       VkSurfaceFormatKHR chooseSwapSurfaceFormat(const vector<VkSurfaceFormatKHR>& availableFormats) {
@@ -735,4 +734,5 @@
          }
       }
+/*** END OF REFACTORED CODE ***/
 
       void createRenderPass() {
@@ -1330,4 +1330,5 @@
       }
 
+/*** START OF REFACTORED CODE ***/
       VkImageView createImageView(VkImage image, VkFormat format, VkImageAspectFlags aspectFlags) {
          VkImageViewCreateInfo viewInfo = {};
@@ -1355,4 +1356,5 @@
          return imageView;
       }
+/*** END OF REFACTORED CODE ***/
 
       void createTextureSampler() {
@@ -1708,7 +1710,7 @@
          vkDeviceWaitIdle(device);
       }
+
+      void drawFrame() {
 /*** END OF REFACTORED CODE ***/
-
-      void drawFrame() {
          vkWaitForFences(device, 1, &inFlightFences[currentFrame], VK_TRUE, numeric_limits<uint64_t>::max());
 
@@ -1772,7 +1774,9 @@
          currentFrame = (currentFrame + 1) % MAX_FRAMES_IN_FLIGHT;
          currentFrame = (currentFrame + 1) % MAX_FRAMES_IN_FLIGHT;
+/*** START OF REFACTORED CODE ***/
       }
 
       void drawUI() {
+/*** END OF REFACTORED CODE ***/
          // TODO: Since I currently don't use any other render targets,
          // I may as well set this once before the render loop
@@ -1801,5 +1805,7 @@
 
          populateImageFromSDLTexture(uiOverlay, sdlOverlayImage);
-      }
+/*** START OF REFACTORED CODE ***/
+      }
+/*** END OF REFACTORED CODE ***/
 
       void updateUniformBuffer(uint32_t currentImage) {
@@ -1944,9 +1950,9 @@
          vkDestroyRenderPass(device, renderPass, nullptr);
 
+/*** START OF REFACTORED CODE ***/
          for (auto imageView : swapChainImageViews) {
             vkDestroyImageView(device, imageView, nullptr);
          }
 
-/*** START OF REFACTORED CODE ***/
          vkDestroySwapchainKHR(device, swapChain, nullptr);
 /*** END OF REFACTORED CODE ***/
Index: vulkan-utils.cpp
===================================================================
--- vulkan-utils.cpp	(revision 054d9eddab1a5e7ed131f514937c5d24f409337a)
+++ vulkan-utils.cpp	(revision f94eea9cc8966583fd608bcd0f1a25213a8e8d71)
@@ -166,2 +166,28 @@
    }
 }
+
+VkImageView VulkanUtils::createImageView(VkDevice device, VkImage image, VkFormat format, VkImageAspectFlags aspectFlags) {
+   VkImageViewCreateInfo viewInfo = {};
+   viewInfo.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
+   viewInfo.image = image;
+   viewInfo.viewType = VK_IMAGE_VIEW_TYPE_2D;
+   viewInfo.format = format;
+
+   viewInfo.components.r = VK_COMPONENT_SWIZZLE_IDENTITY;
+   viewInfo.components.g = VK_COMPONENT_SWIZZLE_IDENTITY;
+   viewInfo.components.b = VK_COMPONENT_SWIZZLE_IDENTITY;
+   viewInfo.components.a = VK_COMPONENT_SWIZZLE_IDENTITY;
+
+   viewInfo.subresourceRange.aspectMask = aspectFlags;
+   viewInfo.subresourceRange.baseMipLevel = 0;
+   viewInfo.subresourceRange.levelCount = 1;
+   viewInfo.subresourceRange.baseArrayLayer = 0;
+   viewInfo.subresourceRange.layerCount = 1;
+
+   VkImageView imageView;
+   if (vkCreateImageView(device, &viewInfo, nullptr, &imageView) != VK_SUCCESS) {
+      throw runtime_error("failed to create image view!");
+   }
+
+   return imageView;
+}
Index: vulkan-utils.hpp
===================================================================
--- vulkan-utils.hpp	(revision 054d9eddab1a5e7ed131f514937c5d24f409337a)
+++ vulkan-utils.hpp	(revision f94eea9cc8966583fd608bcd0f1a25213a8e8d71)
@@ -43,4 +43,5 @@
       static VkPresentModeKHR chooseSwapPresentMode(const vector<VkPresentModeKHR>& availablePresentModes);
       static VkExtent2D chooseSwapExtent(const VkSurfaceCapabilitiesKHR& capabilities, int width, int height);
+      static VkImageView createImageView(VkDevice device, VkImage image, VkFormat format, VkImageAspectFlags aspectFlags);
 };
 
