Index: vulkan-game.cpp
===================================================================
--- vulkan-game.cpp	(revision 909b51a30b250501c0b2977cede5b8ce89f45278)
+++ vulkan-game.cpp	(revision b3671b599464ef62888e2dfd385ef73aa19dafca)
@@ -13,4 +13,5 @@
 #include <iostream>
 #include <vector>
+#include <set>
 #include <stdexcept>
 #include <cstdlib>
@@ -37,7 +38,8 @@
 struct QueueFamilyIndices {
     optional<uint32_t> graphicsFamily;
+    optional<uint32_t> presentFamily;
 
     bool isComplete() {
-        return graphicsFamily.has_value();
+        return graphicsFamily.has_value() && presentFamily.has_value();
     }
 };
@@ -94,7 +96,11 @@
       VkInstance instance;
       VkDebugUtilsMessengerEXT debugMessenger;
+      VkSurfaceKHR surface;
+
       VkPhysicalDevice physicalDevice = VK_NULL_HANDLE;
       VkDevice device;
+
       VkQueue graphicsQueue;
+      VkQueue presentQueue;
 
       // both SDL and GLFW create window functions return NULL on failure
@@ -125,4 +131,5 @@
          createInstance();
          setupDebugMessenger();
+         createSurface();
          pickPhysicalDevice();
          createLogicalDevice();
@@ -150,4 +157,10 @@
          createInfo.ppEnabledExtensionNames = extensions.data();
 
+         cout << endl << "SDL extensions:" << endl;
+         for (const char* extensionName : extensions) {
+            cout << extensionName << endl;
+         }
+         cout << endl;
+
          VkDebugUtilsMessengerCreateInfoEXT debugCreateInfo;
          if (enableValidationLayers) {
@@ -177,4 +190,18 @@
             throw runtime_error("failed to setup debug messenger!");
          }
+      }
+
+      void createSurface() {
+         //SDL_Surface* screenSurface = nullptr;
+
+         if (!SDL_Vulkan_CreateSurface(window, instance, &surface)) {
+            throw runtime_error("failed to create window surface!");
+         }
+
+         /*
+         if (glfwCreateWindowSurface(instance, window, nullptr, &surface) != VK_SUCCESS) {
+            throw runtime_error("failed to create window surface!");
+         }
+         */
       }
 
@@ -221,11 +248,18 @@
          QueueFamilyIndices indices = findQueueFamilies(physicalDevice);
 
-         VkDeviceQueueCreateInfo queueCreateInfo = {};
-         queueCreateInfo.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
-         queueCreateInfo.queueFamilyIndex = indices.graphicsFamily.value();
-         queueCreateInfo.queueCount = 1;
+         vector<VkDeviceQueueCreateInfo> queueCreateInfos;
+         set<uint32_t> uniqueQueueFamilies = {indices.graphicsFamily.value(), indices.presentFamily.value()};
 
          float queuePriority = 1.0f;
-         queueCreateInfo.pQueuePriorities = &queuePriority;
+         for (uint32_t queueFamily : uniqueQueueFamilies) {
+            VkDeviceQueueCreateInfo queueCreateInfo = {};
+
+            queueCreateInfo.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
+            queueCreateInfo.queueFamilyIndex = queueFamily;
+            queueCreateInfo.queueCount = 1;
+            queueCreateInfo.pQueuePriorities = &queuePriority;
+
+            queueCreateInfos.push_back(queueCreateInfo);
+         }
 
          VkPhysicalDeviceFeatures deviceFeatures = {};
@@ -234,6 +268,6 @@
          createInfo.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
 
-         createInfo.pQueueCreateInfos = &queueCreateInfo;
-         createInfo.queueCreateInfoCount = 1;
+         createInfo.queueCreateInfoCount = static_cast<uint32_t>(queueCreateInfos.size());;
+         createInfo.pQueueCreateInfos = queueCreateInfos.data();
 
          createInfo.pEnabledFeatures = &deviceFeatures;
@@ -255,4 +289,5 @@
 
          vkGetDeviceQueue(device, indices.graphicsFamily.value(), 0, &graphicsQueue);
+         vkGetDeviceQueue(device, indices.presentFamily.value(), 0, &presentQueue);
       }
 
@@ -295,4 +330,11 @@
             if (queueFamily.queueCount > 0 && queueFamily.queueFlags & VK_QUEUE_GRAPHICS_BIT) {
                indices.graphicsFamily = i;
+            }
+
+            VkBool32 presentSupport = false;
+            vkGetPhysicalDeviceSurfaceSupportKHR(device, i, surface, &presentSupport);
+
+            if (queueFamily.queueCount > 0 && presentSupport) {
+               indices.presentFamily = i;
             }
 
@@ -335,11 +377,4 @@
 
          /*
-         SDL_Surface* screenSurface = nullptr;
-         VkSurfaceKHR surface;
-
-         if (!SDL_Vulkan_CreateSurface(window, instance, &surface)) {
-            cout << "Couild not create Vulkan surface" << endl;
-         }
-
          screenSurface = SDL_GetWindowSurface(window);
          cout << "Got here" << endl;
@@ -375,4 +410,5 @@
          }
 
+         vkDestroySurfaceKHR(instance, surface, nullptr);
          vkDestroyInstance(instance, nullptr);
 
