Skip to content

Commit

Permalink
Fix build time shader compilation for multi config cmake generators
Browse files Browse the repository at this point in the history
  • Loading branch information
andrejnau committed Jan 23, 2024
1 parent 6941505 commit 577507d
Show file tree
Hide file tree
Showing 3 changed files with 17 additions and 10 deletions.
21 changes: 14 additions & 7 deletions cmake/compile_shaders.cmake
Original file line number Diff line number Diff line change
@@ -1,22 +1,29 @@
function(compile_shaders target base_dir output_subdir shaders output_var)
function(compile_shaders base_dir output_subdir shaders output_var)
if (CMAKE_CROSSCOMPILING AND IOS_OR_TVOS)
set(shader_compiler_cli "${CMAKE_BINARY_DIR}/macOS/bin/ShaderCompilerCLI")
else()
set(shader_compiler_cli "$<TARGET_FILE:ShaderCompilerCLI>")
endif()
set(output_dir "${CMAKE_BINARY_DIR}/bin/${output_subdir}/")
if (CMAKE_CONFIGURATION_TYPES)
set(output_dir "${CMAKE_BINARY_DIR}/bin/$<CONFIG>/${output_subdir}/")
else()
set(output_dir "${CMAKE_BINARY_DIR}/bin/${output_subdir}/")
endif()
set(gen_dir "${CMAKE_BINARY_DIR}/compiled_shaders/${output_subdir}/")
unset(compiled_shaders)
foreach(full_shader_path ${shaders})
cmake_path(RELATIVE_PATH full_shader_path BASE_DIRECTORY "${base_dir}" OUTPUT_VARIABLE shader_name)
get_filename_component(shader_folder ${shader_name} DIRECTORY)
set(spirv ${output_dir}/${shader_name}.spirv)
set(dxil ${output_dir}/${shader_name}.dxil)
set(spirv ${gen_dir}/${shader_name}.spirv)
set(dxil ${gen_dir}/${shader_name}.dxil)
get_property(entrypoint SOURCE ${full_shader_path} PROPERTY SHADER_ENTRYPOINT)
get_property(type SOURCE ${full_shader_path} PROPERTY SHADER_TYPE)
get_property(model SOURCE ${full_shader_path} PROPERTY SHADER_MODEL)
add_custom_command(OUTPUT ${spirv} ${dxil}
COMMAND ${CMAKE_COMMAND} -E echo ${shader_name} ${full_shader_path} ${entrypoint} ${type} ${model} ${output_dir}
COMMAND ${CMAKE_COMMAND} -E make_directory ${output_dir}/${shader_folder}
COMMAND ${shader_compiler_cli} ${shader_name} ${full_shader_path} ${entrypoint} ${type} ${model} ${output_dir}
COMMAND ${CMAKE_COMMAND} -E echo ${shader_name} ${full_shader_path} ${entrypoint} ${type} ${model} ${gen_dir}
COMMAND ${CMAKE_COMMAND} -E make_directory ${gen_dir}/${shader_folder}
COMMAND ${shader_compiler_cli} ${shader_name} ${full_shader_path} ${entrypoint} ${type} ${model} ${gen_dir}
COMMAND ${CMAKE_COMMAND} -E copy_directory ${gen_dir}/${shader_folder} ${output_dir}/${shader_folder}
DEPENDS ShaderCompilerCLI
MAIN_DEPENDENCY "${full_shader_path}"
)
Expand Down
2 changes: 1 addition & 1 deletion src/Apps/Triangle/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ set_property(SOURCE ${pixel_shaders} PROPERTY SHADER_TYPE Pixel)
set(shaders_files ${pixel_shaders} ${vertex_shaders})

include(compile_shaders)
compile_shaders(Triangle "${shaders_path}" "asserts/Triangle" "${shaders_files}" resources)
compile_shaders("${shaders_path}" "asserts/Triangle" "${shaders_files}" resources)

add_executable(Triangle WIN32 MACOSX_BUNDLE
${resources}
Expand Down
4 changes: 2 additions & 2 deletions src/Apps/Triangle/main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -89,8 +89,8 @@ void TriangleRenderer::Init(const AppSize& app_size, WindowHandle window)
}
std::string vertex_path = GetAssertPath("asserts/Triangle/VertexShader.hlsl" + shader_blob_ext);
std::string pixel_path = GetAssertPath("asserts/Triangle/PixelShader.hlsl" + shader_blob_ext);
vertex_shader = device->CreateShader(ReadBinaryFile(vertex_path), ShaderBlobType::kSPIRV, ShaderType::kVertex);
pixel_shader = device->CreateShader(ReadBinaryFile(pixel_path), ShaderBlobType::kSPIRV, ShaderType::kPixel);
vertex_shader = device->CreateShader(ReadBinaryFile(vertex_path), blob_type, ShaderType::kVertex);
pixel_shader = device->CreateShader(ReadBinaryFile(pixel_path), blob_type, ShaderType::kPixel);
program = device->CreateProgram({ vertex_shader, pixel_shader });

ViewDesc constant_view_desc = {};
Expand Down

0 comments on commit 577507d

Please sign in to comment.