Initial commit: VKZip GPU Compressor
This commit is contained in:
+107
@@ -0,0 +1,107 @@
|
||||
cmake_minimum_required(VERSION 3.20)
|
||||
project(vkzip VERSION 1.0.0 LANGUAGES C)
|
||||
|
||||
set(CMAKE_C_STANDARD 11)
|
||||
set(CMAKE_C_STANDARD_REQUIRED ON)
|
||||
|
||||
# ── Platform detection ──────────────────────────────────────────────
|
||||
if(WIN32)
|
||||
add_definitions(-D_CRT_SECURE_NO_WARNINGS -DPLATFORM_WINDOWS)
|
||||
else()
|
||||
add_definitions(-DPLATFORM_LINUX)
|
||||
endif()
|
||||
|
||||
# ── Find Vulkan ─────────────────────────────────────────────────────
|
||||
find_package(Vulkan REQUIRED)
|
||||
|
||||
# ── Source files ────────────────────────────────────────────────────
|
||||
set(SOURCES
|
||||
src/main.c
|
||||
src/vkz_format.c
|
||||
src/gpu_context.c
|
||||
src/gpu_compress.c
|
||||
src/gpu_decompress.c
|
||||
src/cpu_fallback.c
|
||||
)
|
||||
|
||||
# ── Executable ──────────────────────────────────────────────────────
|
||||
add_executable(vkzip ${SOURCES})
|
||||
|
||||
target_include_directories(vkzip PRIVATE
|
||||
${CMAKE_SOURCE_DIR}/src
|
||||
${Vulkan_INCLUDE_DIRS}
|
||||
)
|
||||
|
||||
target_link_libraries(vkzip PRIVATE
|
||||
${Vulkan_LIBRARIES}
|
||||
)
|
||||
|
||||
if(NOT WIN32)
|
||||
target_link_libraries(vkzip PRIVATE m pthread)
|
||||
endif()
|
||||
|
||||
# ── Compile shaders (GLSL → SPIR-V) ────────────────────────────────
|
||||
find_program(GLSLC glslc HINTS "$ENV{VULKAN_SDK}/bin")
|
||||
if(NOT GLSLC)
|
||||
find_program(GLSLC glslangValidator HINTS "$ENV{VULKAN_SDK}/bin")
|
||||
endif()
|
||||
|
||||
if(GLSLC)
|
||||
set(SHADER_SRC_DIR "${CMAKE_SOURCE_DIR}/shaders")
|
||||
set(SHADER_BIN_DIR "${CMAKE_BINARY_DIR}/shaders")
|
||||
file(MAKE_DIRECTORY ${SHADER_BIN_DIR})
|
||||
|
||||
set(SHADER_SOURCES
|
||||
${SHADER_SRC_DIR}/compress.comp
|
||||
${SHADER_SRC_DIR}/decompress.comp
|
||||
)
|
||||
|
||||
foreach(SHADER ${SHADER_SOURCES})
|
||||
get_filename_component(SHADER_NAME ${SHADER} NAME)
|
||||
set(SPIRV_OUTPUT "${SHADER_BIN_DIR}/${SHADER_NAME}.spv")
|
||||
|
||||
add_custom_command(
|
||||
OUTPUT ${SPIRV_OUTPUT}
|
||||
COMMAND ${GLSLC} -o ${SPIRV_OUTPUT} ${SHADER}
|
||||
DEPENDS ${SHADER}
|
||||
COMMENT "Compiling shader ${SHADER_NAME} -> SPIR-V"
|
||||
)
|
||||
list(APPEND SPIRV_OUTPUTS ${SPIRV_OUTPUT})
|
||||
endforeach()
|
||||
|
||||
add_custom_target(shaders ALL DEPENDS ${SPIRV_OUTPUTS})
|
||||
add_dependencies(vkzip shaders)
|
||||
|
||||
# Embed shader directory path at compile time
|
||||
target_compile_definitions(vkzip PRIVATE
|
||||
SHADER_DIR="${SHADER_BIN_DIR}"
|
||||
)
|
||||
else()
|
||||
message(WARNING "glslc/glslangValidator not found! Shaders will not be compiled.")
|
||||
message(WARNING "Install Vulkan SDK: https://vulkan.lunarg.com/sdk/home")
|
||||
endif()
|
||||
|
||||
# ── Install ─────────────────────────────────────────────────────────
|
||||
install(TARGETS vkzip RUNTIME DESTINATION bin)
|
||||
if(GLSLC)
|
||||
install(DIRECTORY ${SHADER_BIN_DIR}/ DESTINATION share/vkzip/shaders)
|
||||
endif()
|
||||
|
||||
# ── Compiler warnings ──────────────────────────────────────────────
|
||||
if(MSVC)
|
||||
target_compile_options(vkzip PRIVATE /W4)
|
||||
else()
|
||||
target_compile_options(vkzip PRIVATE -Wall -Wextra -O2)
|
||||
endif()
|
||||
|
||||
message(STATUS "")
|
||||
message(STATUS "╔══════════════════════════════════════════╗")
|
||||
message(STATUS "║ VKZip - GPU File Compressor ║")
|
||||
message(STATUS "║ Vulkan Compute Shader Acceleration ║")
|
||||
message(STATUS "╠══════════════════════════════════════════╣")
|
||||
message(STATUS "║ Platform: ${CMAKE_SYSTEM_NAME}")
|
||||
message(STATUS "║ Compiler: ${CMAKE_C_COMPILER_ID} ${CMAKE_C_COMPILER_VERSION}")
|
||||
message(STATUS "║ Vulkan: ${Vulkan_LIBRARY}")
|
||||
message(STATUS "║ Shaders: ${GLSLC}")
|
||||
message(STATUS "╚══════════════════════════════════════════╝")
|
||||
message(STATUS "")
|
||||
Reference in New Issue
Block a user