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()