@@ -4,6 +4,10 @@ if (WIN32)
44 option (MARATHON_RECOMP_D3D12 "Add D3D12 support for rendering" ON )
55endif ()
66
7+ if (APPLE )
8+ option (MARATHON_RECOMP_METAL "Add Metal support for rendering" ON )
9+ endif ()
10+
711if (CMAKE_SYSTEM_NAME MATCHES "Linux" )
812 option (MARATHON_RECOMP_FLATPAK "Configure the build for Flatpak compatibility." OFF )
913endif ()
@@ -259,6 +263,10 @@ if (NOT ${CMAKE_BUILD_TYPE} MATCHES "Release")
259263 set (SHOW_GIT_INFO_AND_BUILD_TYPE 1)
260264endif ()
261265
266+ if (MARATHON_RECOMP_METAL)
267+ set (XCRUN_TOOL "/usr/bin/xcrun" )
268+ endif ()
269+
262270GenerateVersionSources (
263271 OUTPUT_DIR ${PROJECT_SOURCE_DIR }
264272 VERSION_TXT ${VERSION_TXT}
@@ -362,6 +370,10 @@ if (MARATHON_RECOMP_D3D12)
362370 target_compile_definitions (MarathonRecomp PRIVATE MARATHON_RECOMP_D3D12 )
363371endif ()
364372
373+ if (MARATHON_RECOMP_METAL)
374+ target_compile_definitions (MarathonRecomp PRIVATE MARATHON_RECOMP_METAL )
375+ endif ()
376+
365377if (CMAKE_SYSTEM_NAME MATCHES "Linux" )
366378 target_compile_definitions (MarathonRecomp PRIVATE SDL_VULKAN_ENABLED )
367379endif ()
@@ -438,22 +450,37 @@ endif()
438450target_precompile_headers (MarathonRecomp PUBLIC ${MARATHON_RECOMP_PRECOMPILED_HEADERS} )
439451
440452function (compile_shader FILE_PATH TARGET_NAME )
441- set (FILE_PATH ${CMAKE_CURRENT_SOURCE_DIR } /gpu/shader/${FILE_PATH} .hlsl)
442- cmake_path (GET FILE_PATH STEM VARIABLE_NAME )
453+ set (HLSL_FILE_PATH ${CMAKE_CURRENT_SOURCE_DIR } /gpu/shader/hlsl/${FILE_PATH} .hlsl)
454+ set (MSL_FILE_PATH ${CMAKE_CURRENT_SOURCE_DIR } /gpu/shader/msl/${FILE_PATH} .metal)
455+ cmake_path (GET HLSL_FILE_PATH STEM HLSL_NAME )
456+ cmake_path (GET MSL_FILE_PATH STEM MSL_NAME )
457+ if (MARATHON_RECOMP_METAL)
458+ add_custom_command (
459+ OUTPUT ${MSL_FILE_PATH} .ir
460+ COMMAND ${XCRUN_TOOL} -sdk macosx metal -o ${MSL_FILE_PATH} .ir -c ${MSL_FILE_PATH} -D__air__ -frecord-sources -gline-tables-only
461+ DEPENDS ${MSL_FILE_PATH}
462+ )
463+ add_custom_command (
464+ OUTPUT ${MSL_FILE_PATH} .metallib
465+ COMMAND ${XCRUN_TOOL} -sdk macosx metallib -o ${MSL_FILE_PATH} .metallib ${MSL_FILE_PATH} .ir
466+ DEPENDS ${MSL_FILE_PATH} .ir
467+ )
468+ BIN2C (TARGET_OBJ MarathonRecomp SOURCE_FILE "${MSL_FILE_PATH} .metallib" DEST_FILE "${MSL_FILE_PATH} .metallib" ARRAY_NAME "g_${MSL_NAME} _air" )
469+ endif ()
443470 if (MARATHON_RECOMP_D3D12)
444471 add_custom_command (
445- OUTPUT ${FILE_PATH } .dxil.h
446- COMMAND ${DIRECTX_DXC_TOOL} -T ${TARGET_NAME} -HV 2021 -all-resources-bound -Wno-ignored-attributes -Fh ${FILE_PATH } .dxil.h ${FILE_PATH } -Vn g_${VARIABLE_NAME }_dxil
447- DEPENDS ${FILE_PATH }
472+ OUTPUT ${HLSL_FILE_PATH } .dxil.h
473+ COMMAND ${DIRECTX_DXC_TOOL} -T ${TARGET_NAME} -HV 2021 -all-resources-bound -Wno-ignored-attributes -Fh ${HLSL_FILE_PATH } .dxil.h ${HLSL_FILE_PATH } -Vn g_${HLSL_NAME }_dxil
474+ DEPENDS ${HLSL_FILE_PATH }
448475 )
449- target_sources (MarathonRecomp PRIVATE ${FILE_PATH } .dxil.h )
476+ target_sources (MarathonRecomp PRIVATE ${HLSL_FILE_PATH } .dxil.h )
450477 endif ()
451478 add_custom_command (
452- OUTPUT ${FILE_PATH } .spirv.h
453- COMMAND ${DIRECTX_DXC_TOOL} -T ${TARGET_NAME} -HV 2021 -all-resources-bound -spirv -fvk-use-dx-layout ${ARGN} -Fh ${FILE_PATH } .spirv.h ${FILE_PATH } -Vn g_${VARIABLE_NAME }_spirv
454- DEPENDS ${FILE_PATH }
479+ OUTPUT ${HLSL_FILE_PATH } .spirv.h
480+ COMMAND ${DIRECTX_DXC_TOOL} -T ${TARGET_NAME} -HV 2021 -all-resources-bound -spirv -fvk-use-dx-layout ${ARGN} -Fh ${HLSL_FILE_PATH } .spirv.h ${HLSL_FILE_PATH } -Vn g_${HLSL_NAME }_spirv
481+ DEPENDS ${HLSL_FILE_PATH }
455482 )
456- target_sources (MarathonRecomp PRIVATE ${FILE_PATH } .spirv.h )
483+ target_sources (MarathonRecomp PRIVATE ${HLSL_FILE_PATH } .spirv.h )
457484endfunction ()
458485
459486function (compile_vertex_shader FILE_PATH )
0 commit comments