Index: makefile
===================================================================
--- makefile	(revision 5289665e52b303253d01370b8daac39ffae30fd2)
+++ makefile	(revision cb01aff8c1cbf5776d9d368a03abddcc899f8224)
@@ -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 game-gui-sdl.cpp
+vulkangame: main-vulkan.cpp vulkan-game.cpp crash-logger.cpp logger.cpp vulkan-utils.cpp game-gui-sdl.cpp
 	$(CC) $(CXX_FLAGS) -o $@ $^ $(LIB_FLAGS) -DGAMEGUI_INCLUDE_VULKAN
 
Index: vulkan-utils.cpp
===================================================================
--- vulkan-utils.cpp	(revision cb01aff8c1cbf5776d9d368a03abddcc899f8224)
+++ vulkan-utils.cpp	(revision cb01aff8c1cbf5776d9d368a03abddcc899f8224)
@@ -0,0 +1,49 @@
+#include "vulkan-utils.hpp"
+
+bool VulkanUtils::checkValidationLayerSupport(const vector<const char*> &validationLayers) {
+   uint32_t layerCount;
+   vkEnumerateInstanceLayerProperties(&layerCount, nullptr);
+
+   vector<VkLayerProperties> availableLayers(layerCount);
+   vkEnumerateInstanceLayerProperties(&layerCount, availableLayers.data());
+
+   for (const char* layerName : validationLayers) {
+      bool layerFound = false;
+
+      for (const auto& layerProperties : availableLayers) {
+         if (strcmp(layerName, layerProperties.layerName) == 0) {
+            layerFound = true;
+            break;
+         }
+      }
+
+      if (!layerFound) {
+         return false;
+      }
+   }
+
+   return true;
+}
+
+VkResult VulkanUtils::createDebugUtilsMessengerEXT(VkInstance instance,
+      const VkDebugUtilsMessengerCreateInfoEXT* pCreateInfo,
+      const VkAllocationCallbacks* pAllocator,
+      VkDebugUtilsMessengerEXT* pDebugMessenger) {
+   auto func = (PFN_vkCreateDebugUtilsMessengerEXT) vkGetInstanceProcAddr(instance, "vkCreateDebugUtilsMessengerEXT");
+
+   if (func != nullptr) {
+      return func(instance, pCreateInfo, pAllocator, pDebugMessenger);
+   } else {
+      return VK_ERROR_EXTENSION_NOT_PRESENT;
+   }
+}
+
+void VulkanUtils::destroyDebugUtilsMessengerEXT(VkInstance instance,
+      VkDebugUtilsMessengerEXT debugMessenger,
+      const VkAllocationCallbacks* pAllocator) {
+   auto func = (PFN_vkDestroyDebugUtilsMessengerEXT) vkGetInstanceProcAddr(instance, "vkDestroyDebugUtilsMessengerEXT");
+
+   if (func != nullptr) {
+      func(instance, debugMessenger, pAllocator);
+   }
+}
Index: vulkan-utils.hpp
===================================================================
--- vulkan-utils.hpp	(revision cb01aff8c1cbf5776d9d368a03abddcc899f8224)
+++ vulkan-utils.hpp	(revision cb01aff8c1cbf5776d9d368a03abddcc899f8224)
@@ -0,0 +1,24 @@
+#ifndef _VULKAN_UTILS_H
+#define _VULKAN_UTILS_H
+
+#include <vector>
+
+#include <vulkan/vulkan.h>
+
+using namespace std;
+
+class VulkanUtils {
+   public:
+      static bool checkValidationLayerSupport(const vector<const char*> &validationLayers);
+
+      static VkResult createDebugUtilsMessengerEXT(VkInstance instance,
+            const VkDebugUtilsMessengerCreateInfoEXT* pCreateInfo,
+            const VkAllocationCallbacks* pAllocator,
+            VkDebugUtilsMessengerEXT* pDebugMessenger);
+
+      static void destroyDebugUtilsMessengerEXT(VkInstance instance,
+            VkDebugUtilsMessengerEXT debugMessenger,
+            const VkAllocationCallbacks* pAllocator);
+};
+
+#endif // _VULKAN_UTILS_H
