Add CMake support
diff --git a/CMakeLists.txt b/CMakeLists.txt
new file mode 100644
index 0000000..4537e13
--- /dev/null
+++ b/CMakeLists.txt
@@ -0,0 +1,12 @@
+cmake_minimum_required(VERSION 3.9)
+
+project(VulkanMemoryAllocator)
+
+set(CMAKE_DISABLE_IN_SOURCE_BUILD ON)
+
+find_package(Vulkan REQUIRED)
+
+# Put binaries into bin folder
+set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/bin)
+
+add_subdirectory(src)
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
new file mode 100644
index 0000000..aea26cf
--- /dev/null
+++ b/src/CMakeLists.txt
@@ -0,0 +1,112 @@
+add_subdirectory(Shaders)
+add_subdirectory(VmaReplay)
+
+set(VMA_LIBRARY_SOURCE_FILES
+    VmaUsage.cpp
+)
+
+# Use folder structure as filters in project map
+foreach(FILE ${VMA_LIBRARY_SOURCE_FILES})
+    get_filename_component(PARENT_DIR "${FILE}" PATH)
+
+    string(REPLACE "/" "\\" GROUP "${PARENT_DIR}")
+
+    if("${FILE}" MATCHES ".*\\.cpp")
+        set(GROUP "Source Files\\${GROUP}")
+    elseif("${FILE}" MATCHES ".*\\.hpp")
+        set(GROUP "Header Files\\${GROUP}")
+    endif()
+
+    source_group("${GROUP}" FILES "${FILE}")
+endforeach()
+
+add_library(VmaLibrary ${VMA_LIBRARY_SOURCE_FILES})
+
+set_target_properties(
+    VmaLibrary PROPERTIES
+
+    CXX_EXTENSIONS OFF
+    # Use C++14
+    CXX_STANDARD 14
+    CXX_STANDARD_REQUIRED ON
+)
+
+target_include_directories(
+    VmaLibrary
+
+    PUBLIC
+    ${PROJECT_SOURCE_DIR}/include
+)
+
+target_link_libraries(
+    VmaLibrary
+
+    PUBLIC
+    Vulkan::Vulkan
+)
+
+set(VMA_EXAMPLE_SOURCE_FILES
+    Common.cpp
+    SparseBindingTest.cpp
+    Tests.cpp
+    VulkanSample.cpp
+)
+
+# Use folder structure as filters in project map
+foreach(FILE ${VMA_EXAMPLE_SOURCE_FILES})
+    get_filename_component(PARENT_DIR "${FILE}" PATH)
+
+    string(REPLACE "/" "\\" GROUP "${PARENT_DIR}")
+
+    if("${FILE}" MATCHES ".*\\.cpp")
+        set(GROUP "Source Files\\${GROUP}")
+    elseif("${FILE}" MATCHES ".*\\.hpp")
+        set(GROUP "Header Files\\${GROUP}")
+    endif()
+
+    source_group("${GROUP}" FILES "${FILE}")
+endforeach()
+
+IF (WIN32)
+    add_executable(VmaExample ${VMA_EXAMPLE_SOURCE_FILES})
+
+    # Make sure to compile shaders when compiling the example
+    add_dependencies(VmaExample VmaShaders)
+
+    # Visual Studio specific settings
+    if(${CMAKE_GENERATOR} MATCHES "Visual Studio.*")
+        # Use Unicode instead of multibyte set
+        add_definitions(-DUNICODE -D_UNICODE)
+        
+        # Set VmaExample as startup project
+        set_property(DIRECTORY ${PROJECT_SOURCE_DIR} PROPERTY VS_STARTUP_PROJECT "VmaExample")
+        
+        # Enable multithreaded compiling
+        target_compile_options(VmaExample PRIVATE "/MP")
+
+        # Set working directory for Visual Studio debugger
+        set_target_properties(
+            VmaExample
+            PROPERTIES VS_DEBUGGER_WORKING_DIRECTORY "${PROJECT_SOURCE_DIR}/bin"
+        )
+    endif()
+
+    set_target_properties(
+        VmaExample PROPERTIES
+
+        CXX_EXTENSIONS OFF
+        # Use C++14
+        CXX_STANDARD 14
+        CXX_STANDARD_REQUIRED ON
+    )
+
+    target_link_libraries(
+        VmaExample
+
+        PRIVATE
+        VmaLibrary
+    )
+
+ELSE()
+    message(STATUS "VmaExample application is not supported to Linux")
+ENDIF()
diff --git a/src/Shaders/CMakeLists.txt b/src/Shaders/CMakeLists.txt
new file mode 100644
index 0000000..dfc2483
--- /dev/null
+++ b/src/Shaders/CMakeLists.txt
@@ -0,0 +1,30 @@
+find_program(GLSL_VALIDATOR glslangValidator REQUIRED)
+
+if(NOT GLSL_VALIDATOR)
+    message(FATAL_ERROR "glslangValidator not found!")
+endif()
+
+set(SHADERS
+    Shader.vert
+    Shader.frag
+    SparseBindingTest.comp
+)
+
+# Compile each shader using glslangValidator
+foreach(SHADER ${SHADERS})
+    get_filename_component(FILE_NAME ${SHADER} NAME)
+    
+    # Put the .spv files into the bin folder
+    set(SPIRV ${PROJECT_SOURCE_DIR}/bin/${FILE_NAME}.spv)
+
+    add_custom_command(
+        OUTPUT ${SPIRV}
+        # Use the same file name and append .spv to the compiled shader
+        COMMAND ${GLSL_VALIDATOR} -V ${CMAKE_CURRENT_SOURCE_DIR}/${SHADER} -o ${SPIRV}
+        DEPENDS ${SHADER}
+    )
+
+    list(APPEND SPIRV_FILES ${SPIRV})
+endforeach()
+
+add_custom_target(VmaShaders DEPENDS ${SPIRV_FILES})
diff --git a/src/VmaReplay/CMakeLists.txt b/src/VmaReplay/CMakeLists.txt
new file mode 100644
index 0000000..a4d41d5
--- /dev/null
+++ b/src/VmaReplay/CMakeLists.txt
@@ -0,0 +1,19 @@
+IF (WIN32)
+    set(VMA_REPLAY_SOURCE_FILES
+        Common.cpp
+        Constants.cpp
+        VmaReplay.cpp
+        VmaUsage.cpp
+    )
+
+    add_executable(VmaReplay ${VMA_REPLAY_SOURCE_FILES})
+
+    target_link_libraries(
+        VmaReplay
+
+        PRIVATE
+        Vulkan::Vulkan
+    )
+ELSE()
+    message(STATUS "VmaReplay is not supported on Linux")
+ENDIF()