From 78156cbc00c1af990a32739f0e53e6a932f0c8b7 Mon Sep 17 00:00:00 2001 From: MolassesLover <60114762+MolassesLover@users.noreply.github.com> Date: Sat, 28 Dec 2024 23:13:41 +0100 Subject: [PATCH 1/3] Rudimentary CMake build support, without shader compilation Wrote CMake build files with library configuration options. Files still unfinished as of this commit, but allow the library to be compiled. Example binaries can also be compiled, but do not build shader files. --- .gitignore | 7 +++++ CMakeLists.txt | 73 ++++++++++++++++++++++++++++++++++++++++++++++ run/CMakeLists.txt | 18 ++++++++++++ 3 files changed, 98 insertions(+) create mode 100644 CMakeLists.txt create mode 100644 run/CMakeLists.txt diff --git a/.gitignore b/.gitignore index 41acc78..f6243ee 100644 --- a/.gitignore +++ b/.gitignore @@ -48,3 +48,10 @@ # Precompiled shaders *.spv + +# Common build directories +[Bb]in/* +[Bb]uild/* +[Oo]ut/* +[Rr]esult/* +[Tt]arget/* diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..a97c8db --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,73 @@ +cmake_minimum_required(VERSION 3.14) +project(vkutils) + +set(CMAKE_BUILD_RPATH_USE_ORIGIN ON) +set(CMAKE_C_STANDARD 17) +set(CMAKE_C_STANDARD_REQUIRED ON) +set(CMAKE_EXPORT_COMPILE_COMMANDS ON) +set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS ON) +set(COMPILE_WARNING_AS_ERROR ON) +set(LINKER_LANGUAGE C) + +set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -fno-omit-frame-pointer -fsanitize=address -g") + +option(BUILD_EXAMPLES OFF) +option(BUILD_SHARED OFF) +option(SYSTEM_LIBRARIES OFF) + +if (CMAKE_BUILD_TYPE EQUAL "Debug") + set(CMAKE_C_FLAGS ${CMAKE_C_FLAGS_DEBUG}) + set(CMAKE_LINKER_FLAGS ${CMAKE_LINKER_FLAGS_DEBUG}) +endif() + +set(SOURCE_FILES + src/vkutils.c + lib/vk_mem_alloc/vk_mem_alloc.cpp +) + +set(HEADER_FILES + lib/stb/stb_image.h + lib/vk_mem_alloc/vk_mem_alloc.h + src/vkutils.h +) + +macro(build_library LINKING_TYPE) + message("Building as ${LINKING_TYPE}") + add_library(vkutils ${LINKING_TYPE} ${SOURCE_FILES} ${HEADER_FILES}) +endmacro() + +find_package(Vulkan REQUIRED) +find_package(cglm REQUIRED) +find_package(glfw3 REQUIRED) + +if(SYSTEM_LIBRARIES) + # Find and use system's `stb` and `VulkanMemoryAllocator` files. +endif() + +if(BUILD_SHARED) + build_library(SHARED) +else() + build_library(STATIC) + + target_link_libraries(vkutils + Vulkan::Vulkan + cglm::cglm + glfw + -lm + ) +endif() + +if(BUILD_EXAMPLES) + add_subdirectory(run/) +endif() + +include_directories( + ${Vulkan_INCLUDE_DIR} + ${cglm_INCLUDE_DIR} + ${glfw3_INCLUDE_DIR} +) + +target_include_directories(vkutils PUBLIC + src/ +) + diff --git a/run/CMakeLists.txt b/run/CMakeLists.txt new file mode 100644 index 0000000..64384c8 --- /dev/null +++ b/run/CMakeLists.txt @@ -0,0 +1,18 @@ +macro(link target) + target_link_libraries(${target} + Vulkan::Vulkan + cglm::cglm + glfw + vkutils + -lm + ) +endmacro() + +add_executable(vkuTestBasicCube basic_cube.c) +add_executable(vkuTestPostProcessingCube postprocessing_cube.c) + +link(vkuTestBasicCube) +link(vkuTestPostProcessingCube) + +file(COPY ${CMAKE_SOURCE_DIR}/run/resources + DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/resources) From f15d1b6d01d876eb95f682c3fcee7c35a5a86bc6 Mon Sep 17 00:00:00 2001 From: MolassesLover <60114762+MolassesLover@users.noreply.github.com> Date: Sun, 29 Dec 2024 16:26:00 +0100 Subject: [PATCH 2/3] Fixed `run/resources` copying into the wrong directory --- run/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/run/CMakeLists.txt b/run/CMakeLists.txt index 64384c8..e095b7e 100644 --- a/run/CMakeLists.txt +++ b/run/CMakeLists.txt @@ -15,4 +15,4 @@ link(vkuTestBasicCube) link(vkuTestPostProcessingCube) file(COPY ${CMAKE_SOURCE_DIR}/run/resources - DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/resources) + DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/) From 2f42af591e7df8f1b4346a6fa94a7d500c5e1891 Mon Sep 17 00:00:00 2001 From: MolassesLover <60114762+MolassesLover@users.noreply.github.com> Date: Sun, 29 Dec 2024 16:57:51 +0100 Subject: [PATCH 3/3] Added shader compilation to the CMake build process This commit adds a custom build target to build script responsible for building the examples. The script will now iterate through shaders declared in the `${SHADER_FILES}` variable, use a RegEx pattern to check whether they're a vertex or fragment shader, and then compile them to the right path. --- run/CMakeLists.txt | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/run/CMakeLists.txt b/run/CMakeLists.txt index e095b7e..33b89bb 100644 --- a/run/CMakeLists.txt +++ b/run/CMakeLists.txt @@ -1,3 +1,11 @@ +set(SHADER_FILES + ${CMAKE_SOURCE_DIR}/run/shader/post.frag + ${CMAKE_SOURCE_DIR}/run/shader/post.vert + ${CMAKE_SOURCE_DIR}/run/shader/simple.frag + ${CMAKE_SOURCE_DIR}/run/shader/simple.vert + ${CMAKE_SOURCE_DIR}/run/shader/staticpost.frag +) + macro(link target) target_link_libraries(${target} Vulkan::Vulkan @@ -8,11 +16,38 @@ macro(link target) ) endmacro() +add_custom_target(shaders) + add_executable(vkuTestBasicCube basic_cube.c) add_executable(vkuTestPostProcessingCube postprocessing_cube.c) +add_dependencies(vkuTestBasicCube shaders) +add_dependencies(vkuTestPostProcessingCube shaders) + link(vkuTestBasicCube) link(vkuTestPostProcessingCube) file(COPY ${CMAKE_SOURCE_DIR}/run/resources DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/) + +make_directory(${CMAKE_CURRENT_BINARY_DIR}/shader) + +foreach(FILE ${SHADER_FILES}) + get_filename_component(FILE_WE ${FILE} NAME_WE) + + if(${FILE} MATCHES "(vert)") + set(OUTPUT_FILE "${FILE_WE}_vert.spv") + elseif(${FILE} MATCHES "(frag)") + set(OUTPUT_FILE "${FILE_WE}_frag.spv") + endif() + + message(${OUTPUT_FILE}) + + add_custom_command(TARGET shaders + COMMAND glslc ${FILE} -o "${CMAKE_CURRENT_BINARY_DIR}/shader/${OUTPUT_FILE}" + MAIN_DEPENDENCY ${FILE} + COMMENT "Compiling ${FILE} with glslc" + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} + VERBATIM) +endforeach(FILE) +