cmake_minimum_required(VERSION 3.20) project(XC3DGSD3D12MVS LANGUAGES CXX) set(CMAKE_CXX_STANDARD 20) set(CMAKE_CXX_STANDARD_REQUIRED ON) find_program(XC_DXC_EXECUTABLE NAMES dxc) if(NOT XC_DXC_EXECUTABLE) message(FATAL_ERROR "dxc is required to build the 3DGS D3D12 MVS sort shaders.") endif() get_filename_component(XCENGINE_ROOT "${CMAKE_CURRENT_SOURCE_DIR}/../.." ABSOLUTE) set(XCENGINE_BUILD_DIR "${XCENGINE_ROOT}/build") set(XCENGINE_INCLUDE_DIR "${XCENGINE_ROOT}/engine/include") set(XCENGINE_LIBRARY_DEBUG "${XCENGINE_BUILD_DIR}/engine/Debug/XCEngine.lib") if(NOT EXISTS "${XCENGINE_LIBRARY_DEBUG}") message(FATAL_ERROR "Prebuilt XCEngine library was not found: ${XCENGINE_LIBRARY_DEBUG}") endif() add_library(XCEngine STATIC IMPORTED GLOBAL) set_target_properties(XCEngine PROPERTIES IMPORTED_CONFIGURATIONS "Debug;Release;RelWithDebInfo;MinSizeRel" IMPORTED_LOCATION_DEBUG "${XCENGINE_LIBRARY_DEBUG}" IMPORTED_LOCATION_RELEASE "${XCENGINE_LIBRARY_DEBUG}" IMPORTED_LOCATION_RELWITHDEBINFO "${XCENGINE_LIBRARY_DEBUG}" IMPORTED_LOCATION_MINSIZEREL "${XCENGINE_LIBRARY_DEBUG}" ) add_executable(xc_3dgs_d3d12_mvs WIN32 src/main.cpp src/App.cpp src/GaussianPlyLoader.cpp include/XC3DGSD3D12/App.h include/XC3DGSD3D12/GaussianPlyLoader.h shaders/PreparedSplatView.hlsli shaders/PrepareGaussiansCS.hlsl shaders/BuildSortKeysCS.hlsl shaders/SortCommon.hlsl shaders/DeviceRadixSort.hlsl shaders/DebugPointsVS.hlsl shaders/DebugPointsPS.hlsl shaders/CompositeVS.hlsl shaders/CompositePS.hlsl ) set_source_files_properties( shaders/PreparedSplatView.hlsli shaders/PrepareGaussiansCS.hlsl shaders/BuildSortKeysCS.hlsl shaders/SortCommon.hlsl shaders/DeviceRadixSort.hlsl shaders/DebugPointsVS.hlsl shaders/DebugPointsPS.hlsl shaders/CompositeVS.hlsl shaders/CompositePS.hlsl PROPERTIES HEADER_FILE_ONLY TRUE ) target_include_directories(xc_3dgs_d3d12_mvs PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include ${XCENGINE_INCLUDE_DIR} ) target_compile_definitions(xc_3dgs_d3d12_mvs PRIVATE UNICODE _UNICODE NOMINMAX WIN32_LEAN_AND_MEAN ) if(MSVC) target_compile_options(xc_3dgs_d3d12_mvs PRIVATE /utf-8) endif() target_link_libraries(xc_3dgs_d3d12_mvs PRIVATE XCEngine d3d12 dxgi dxguid d3dcompiler winmm delayimp bcrypt opengl32 ) set_target_properties(xc_3dgs_d3d12_mvs PROPERTIES VS_DEBUGGER_WORKING_DIRECTORY "$" ) add_custom_command(TARGET xc_3dgs_d3d12_mvs POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy_if_different "${CMAKE_CURRENT_SOURCE_DIR}/room.ply" "$/room.ply" ) add_custom_command(TARGET xc_3dgs_d3d12_mvs POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy_directory "${CMAKE_CURRENT_SOURCE_DIR}/shaders" "$/shaders" ) add_custom_command(TARGET xc_3dgs_d3d12_mvs POST_BUILD COMMAND "${XC_DXC_EXECUTABLE}" -T cs_6_6 -E MainCS -Fo "$/shaders/BuildSortKeysCS.dxil" "${CMAKE_CURRENT_SOURCE_DIR}/shaders/BuildSortKeysCS.hlsl" COMMAND "${XC_DXC_EXECUTABLE}" -T cs_6_6 -E InitDeviceRadixSort -D KEY_UINT=1 -D PAYLOAD_UINT=1 -D SORT_PAIRS=1 -D SHOULD_ASCEND=1 -Fo "$/shaders/RadixInit.dxil" "${CMAKE_CURRENT_SOURCE_DIR}/shaders/DeviceRadixSort.hlsl" COMMAND "${XC_DXC_EXECUTABLE}" -T cs_6_6 -E Upsweep -D KEY_UINT=1 -D PAYLOAD_UINT=1 -D SORT_PAIRS=1 -D SHOULD_ASCEND=1 -Fo "$/shaders/RadixUpsweep.dxil" "${CMAKE_CURRENT_SOURCE_DIR}/shaders/DeviceRadixSort.hlsl" COMMAND "${XC_DXC_EXECUTABLE}" -T cs_6_6 -E BuildGlobalHistogram -D KEY_UINT=1 -D PAYLOAD_UINT=1 -D SORT_PAIRS=1 -D SHOULD_ASCEND=1 -Fo "$/shaders/RadixGlobalHistogram.dxil" "${CMAKE_CURRENT_SOURCE_DIR}/shaders/DeviceRadixSort.hlsl" COMMAND "${XC_DXC_EXECUTABLE}" -T cs_6_6 -E Scan -D KEY_UINT=1 -D PAYLOAD_UINT=1 -D SORT_PAIRS=1 -D SHOULD_ASCEND=1 -Fo "$/shaders/RadixScan.dxil" "${CMAKE_CURRENT_SOURCE_DIR}/shaders/DeviceRadixSort.hlsl" COMMAND "${XC_DXC_EXECUTABLE}" -T cs_6_6 -E Downsweep -D KEY_UINT=1 -D PAYLOAD_UINT=1 -D SORT_PAIRS=1 -D SHOULD_ASCEND=1 -Fo "$/shaders/RadixDownsweep.dxil" "${CMAKE_CURRENT_SOURCE_DIR}/shaders/DeviceRadixSort.hlsl" )