From 5222ead8e996d6cee33ec70f104f5624afa6f8ac Mon Sep 17 00:00:00 2001 From: Patoke Date: Sat, 18 Apr 2026 01:47:28 -0400 Subject: [PATCH] feat: new shader building script using cmake --- CMakeLists.txt | 6 ++- impls/Windows_Libs/Render/CMakeLists.txt | 3 ++ impls/Windows_Libs/Render/shaders/build.cmake | 52 +++++++++++++++++++ 3 files changed, 60 insertions(+), 1 deletion(-) create mode 100644 impls/Windows_Libs/Render/shaders/build.cmake diff --git a/CMakeLists.txt b/CMakeLists.txt index 071970c..4c4bb29 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -13,4 +13,8 @@ if(MSVC) set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded$<$:Debug>") endif() -add_subdirectory(impls/Windows_Libs) \ No newline at end of file +if(WIN32) + add_subdirectory(impls/Windows_Libs) +else() + message(FATAL_ERROR "Unsupported platform.") +endif() diff --git a/impls/Windows_Libs/Render/CMakeLists.txt b/impls/Windows_Libs/Render/CMakeLists.txt index 621863d..ae51ffc 100644 --- a/impls/Windows_Libs/Render/CMakeLists.txt +++ b/impls/Windows_Libs/Render/CMakeLists.txt @@ -2,6 +2,8 @@ cmake_minimum_required(VERSION 3.25 FATAL_ERROR) project(4JLibs.Windows.Render LANGUAGES C CXX) +include(shaders/build.cmake) + set(LIBPNG_SOURCES vendor/libpng/png.c vendor/libpng/pngerror.c @@ -31,6 +33,7 @@ add_library(${PROJECT_NAME} STATIC src/RendererTexture.cpp src/RendererVertex.cpp src/stdafx.cpp + ${GENERATED_SHADER_HEADERS} ) target_link_libraries(${PROJECT_NAME} PUBLIC diff --git a/impls/Windows_Libs/Render/shaders/build.cmake b/impls/Windows_Libs/Render/shaders/build.cmake new file mode 100644 index 0000000..83321ec --- /dev/null +++ b/impls/Windows_Libs/Render/shaders/build.cmake @@ -0,0 +1,52 @@ +# new shader build system + +find_program(FXC_COMPILER NAMES fxc + HINTS + "C:/Program Files (x86)/Windows Kits/10/bin/*/x64" + "C:/Program Files (x86)/Windows Kits/8.1/bin/x64" +) + +if(NOT FXC_COMPILER) + message(FATAL_ERROR "Could not find 'fxc.exe', please make sure you have the Windows SDK installed or this file is available in this directory.") +endif() + +set(SHADER_OUT_DIR "${CMAKE_CURRENT_BINARY_DIR}/inc") + +function(compile_hlsl) + set(options) + set(argDescriptor SOURCE PROFILE ENTRY OUT_HEADER VAR_NAME) + set(defDescriptor DEFINES) + cmake_parse_arguments(ARG "${options}" "${argDescriptor}" "${defDescriptor}" ${ARGN}) + + set(OUT_FILE "${SHADER_OUT_DIR}/${ARG_OUT_HEADER}") + + set(FXC_DEFINES "") + foreach(DEF ${ARG_DEFINES}) + list(APPEND FXC_DEFINES "/D" "${DEF}") + endforeach() + + add_custom_command( + OUTPUT "${OUT_FILE}" + # should probably disable optimizations and enable debug flags when building in debug mode, but i don't care enough to do that right now BUAHAHAHA + COMMAND ${FXC_COMPILER} /O3 /nologo /T ${ARG_PROFILE} /E ${ARG_ENTRY} ${FXC_DEFINES} /Fh "${OUT_FILE}" /Vn ${ARG_VAR_NAME} "${CMAKE_CURRENT_LIST_DIR}/${ARG_SOURCE}" + DEPENDS "${CMAKE_CURRENT_LIST_DIR}/${ARG_SOURCE}" + COMMENT "Compiling shader: '${ARG_SOURCE}' into '${ARG_OUT_HEADER}'" + VERBATIM + ) + + # send the generated paths to the parent scope + set(GENERATED_SHADER_HEADERS ${GENERATED_SHADER_HEADERS} "${OUT_FILE}" PARENT_SCOPE) +endfunction() + +compile_hlsl(SOURCE main_VS.hlsl PROFILE vs_4_0 ENTRY main OUT_HEADER VS_Compressed.h VAR_NAME g_main_VS_Compressed DEFINES COMPRESSED) +compile_hlsl(SOURCE main_VS.hlsl PROFILE vs_4_0 ENTRY main OUT_HEADER VS_PF3_TF2_CB4_NB4_XW1.h VAR_NAME g_main_VS_PF3_TF2_CB4_NB4_XW1) +compile_hlsl(SOURCE main_VS.hlsl PROFILE vs_4_0 ENTRY main OUT_HEADER VS_PF3_TF2_CB4_NB4_XW1_LIGHTING.h VAR_NAME g_main_VS_PF3_TF2_CB4_NB4_XW1_LIGHTING DEFINES LIGHTING) +compile_hlsl(SOURCE main_VS.hlsl PROFILE vs_4_0 ENTRY main OUT_HEADER VS_PF3_TF2_CB4_NB4_XW1_TEXGEN.h VAR_NAME g_main_VS_PF3_TF2_CB4_NB4_XW1_TEXGEN DEFINES TEXGEN) +compile_hlsl(SOURCE screen_VS.hlsl PROFILE vs_4_0 ENTRY VS_ScreenSpace OUT_HEADER VS_ScreenSpace.h VAR_NAME g_main_VS_ScreenSpace) +compile_hlsl(SOURCE screen_VS.hlsl PROFILE vs_4_0 ENTRY VS_ScreenClear OUT_HEADER VS_ScreenClear.h VAR_NAME g_main_VS_ScreenClear) + +compile_hlsl(SOURCE main_PS.hlsl PROFILE ps_4_0 ENTRY main OUT_HEADER PS_Standard.h VAR_NAME g_main_PS_Standard) +compile_hlsl(SOURCE main_PS.hlsl PROFILE ps_4_0 ENTRY main OUT_HEADER PS_TextureProjection.h VAR_NAME g_main_PS_TextureProjection DEFINES TEXTURE_PROJECTION) +compile_hlsl(SOURCE main_PS.hlsl PROFILE ps_4_0 ENTRY main OUT_HEADER PS_ForceLOD.h VAR_NAME g_main_PS_ForceLOD DEFINES FORCE_LOD) +compile_hlsl(SOURCE screen_PS.hlsl PROFILE ps_4_0 ENTRY PS_ScreenSpace OUT_HEADER PS_ScreenSpace.h VAR_NAME g_main_PS_ScreenSpace) +compile_hlsl(SOURCE screen_PS.hlsl PROFILE ps_4_0 ENTRY PS_ScreenClear OUT_HEADER PS_ScreenClear.h VAR_NAME g_main_PS_ScreenClear) \ No newline at end of file