1- get_filename_component (PROJECT_ROOT ${CMAKE_CURRENT_SOURCE_DIR} DIRECTORY )
2- get_filename_component (PROJECT_ROOT ${PROJECT_ROOT} DIRECTORY )
3-
4- # Construct potential paths
5- set (FILEPATH_CURRENT_DIR "${CMAKE_CURRENT_SOURCE_DIR} /${FILENAME} " )
6- set (FILEPATH_PROJECT_ROOT "${PROJECT_ROOT} /${FILENAME} " )
7-
8- # Include file finding utility script
9- include ("${CMAKE_CURRENT_SOURCE_DIR} /cmake/find_gpu.cmake" )
10-
11- # Check if the file exists in the current directory
12- find_project_root(${CMAKE_CURRENT_SOURCE_DIR} ${FILENAME} TARGET_FILE_PATH)
13- if ("${TARGET_FILE_PATH} " STREQUAL "" )
14- find_project_root(${FILEPATH_CURRENT_DIR} ${FILENAME} TARGET_FILE_PATH)
15- if ("${TARGET_FILE_PATH} " STREQUAL "" )
16- message (
17- FATAL_ERROR
18- "File ${FILENAME} not found in either ${CMAKE_CURRENT_SOURCE_DIR} or ${CMAKE_CURRENT_SOURCE_DIR} /../../"
19- )
20- endif ()
21- endif ()
1+ set (FILENAME "gpu.hpp" )
222
23- # Define architecture and build type directories or file names
24- if (CMAKE_SIZEOF_VOID_P EQUAL 8)
25- set (ARCH "x64" )
3+ if (EXISTS "${CMAKE_CURRENT_SOURCE_DIR} /${FILENAME} " )
4+ set (FILEPATH_PROJECT_ROOT "${CMAKE_CURRENT_SOURCE_DIR} " )
265else ()
27- set (ARCH "x86" )
6+ get_filename_component (PROJECT_ROOT ${CMAKE_CURRENT_SOURCE_DIR} DIRECTORY )
7+ get_filename_component (PROJECT_ROOT ${PROJECT_ROOT} DIRECTORY )
8+
9+ set (FILEPATH_PROJECT_ROOT "${PROJECT_ROOT} /" )
2810endif ()
2911
30- if (CMAKE_BUILD_TYPE STREQUAL "Debug" )
31- set (BUILD_TYPE "Debug" )
12+
13+ include (FetchContent)
14+
15+ set (FETCHCONTENT_BASE_DIR "${FILEPATH_PROJECT_ROOT} /third_party/fetchcontent/_deps" )
16+ set (DAWN_INSTALL_PREFIX "${FETCHCONTENT_BASE_DIR} /dawn-build/out/${CMAKE_BUILD_TYPE} " CACHE INTERNAL "Dawn install location" FORCE)
17+
18+
19+ # Before fetching, set configuration options for Dawn.
20+ # These CMake variables are “global” (cached INTERNAL) so that Dawn’s own CMakeLists.txt
21+ # will pick them up. Adjust them as needed.
22+ set (DAWN_BUILD_TYPE ${CMAKE_BUILD_TYPE} CACHE INTERNAL "Dawn build type" FORCE)
23+ set (DCMAKE_INSTALL_PREFIX ${DAWN_INSTALL_PREFIX} CACHE INTERNAL "Dawn install location" FORCE)
24+
25+ # Dawn options
26+ set (DAWN_FETCH_DEPENDENCIES ON CACHE INTERNAL "Fetch Dawn dependencies" FORCE)
27+ set (DAWN_ENABLE_INSTALL ON CACHE INTERNAL "Enable Dawn installation" FORCE)
28+ set (DAWN_BUILD_MONOLITHIC_LIBRARY OFF CACHE INTERNAL "Build Dawn monolithically" FORCE)
29+ set (DAWN_BUILD_EXAMPLES OFF CACHE INTERNAL "Build Dawn examples" FORCE)
30+ set (DAWN_BUILD_SAMPLES OFF CACHE INTERNAL "Build Dawn samples" FORCE)
31+ set (DAWN_BUILD_TESTS OFF CACHE INTERNAL "Build Dawn tests" FORCE)
32+ set (DAWN_BUILD_UTILS OFF CACHE INTERNAL "Build Dawn utilities" FORCE)
33+ set (TINT_BUILD_TESTS OFF CACHE INTERNAL "Build Tint Tests" FORCE)
34+ set (TINT_BUILD_IR_BINARY OFF CACHE INTERNAL "Build Tint IR binary" FORCE)
35+ set (TINT_BUILD_CMD_TOOLS OFF CACHE INTERNAL "Build Tint command line tools" FORCE)
36+ set (BUILD_SHARED_LIBS OFF CACHE INTERNAL "Build shared libraries" FORCE)
37+
38+
39+ # Set up an install location for Dawn – you can change this to a specific location.
40+
41+
42+ FetchContent_Declare(
43+ dawn
44+ DOWNLOAD_COMMAND
45+ cd ${FETCHCONTENT_BASE_DIR} /dawn-src &&
46+ git init &&
47+ git fetch --depth=1 https://dawn.googlesource.com/dawn &&
48+ git reset --hard FETCH_HEAD
49+ )
50+
51+
52+ # This call will download the repository and add it as a subdirectory.
53+ FetchContent_MakeAvailable(dawn)
54+
55+
56+ # At this point, assuming Dawn’s CMakeLists.txt is written so that an install step is available,
57+ # we trigger a build of its install target. This custom target will build (and install) Dawn
58+ # into ${DAWN_INSTALL_PREFIX}. (If Dawn already adds an install target, you may simply depend on it.)
59+ add_custom_target (build_dawn_config ALL
60+ COMMAND ${CMAKE_COMMAND} ${FETCHCONTENT_BASE_DIR} /dawn-src
61+ -B ${DAWN_INSTALL_PREFIX}
62+ -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}
63+ -DDAWN_FETCH_DEPENDENCIES=ON
64+ -DDAWN_ENABLE_INSTALL=ON
65+ -DDAWN_BUILD_MONOLITHIC_LIBRARY=OFF
66+ -DDAWN_BUILD_EXAMPLES=OFF
67+ -DDAWN_BUILD_SAMPLES=OFF
68+ -DDAWN_BUILD_TESTS=OFF
69+ -DDAWN_BUILD_UTILS=OFF
70+ -DTINT_BUILD_TESTS=OFF
71+ -DTINT_BUILD_IR_BINARY=OFF
72+ -DTINT_BUILD_CMD_TOOLS=OFF
73+ -DBUILD_SHARED_LIBS=OFF
74+ -G "${CMAKE_GENERATOR} "
75+ COMMENT "Configuring Dawn build with custom options in ${DAWN_INSTALL_PREFIX} "
76+ )
77+
78+ add_custom_target (build_dawn_install ALL
79+ COMMAND ${CMAKE_COMMAND} --build ${DAWN_INSTALL_PREFIX} --target install
80+ COMMENT "Installing Dawn into ${DAWN_INSTALL_PREFIX} "
81+ )
82+
83+ include (${FETCHCONTENT_BASE_DIR} /dawn-build /cmake/DawnTargets.cmake)
84+
85+ set (GPU_SOURCES
86+ "${FILEPATH_PROJECT_ROOT} /gpu.cpp"
87+ "${FILEPATH_PROJECT_ROOT} /numeric_types/half.cpp"
88+ )
89+
90+ set (GPU_HEADERS
91+ "${FILEPATH_PROJECT_ROOT} /gpu.hpp"
92+ "${FILEPATH_PROJECT_ROOT} /utils/logging.hpp"
93+ "${FILEPATH_PROJECT_ROOT} /utils/array_utils.hpp"
94+ "${FILEPATH_PROJECT_ROOT} /numeric_types/half.hpp"
95+ )
96+
97+ if (EMSCRIPTEN)
98+ file (REMOVE "${FILEPATH_PROJECT_ROOT} /webgpu/webgpu.h" )
3299else ()
33- set ( BUILD_TYPE "Release " )
100+ list ( APPEND GPU_HEADERS " ${DAWN_INSTALL_PREFIX} /gen/webgpu-headers/webgpu.h " )
34101endif ()
35102
36- add_library (webgpulib SHARED IMPORTED )
37- add_library (gpu INTERFACE )
38- add_library (wgpu INTERFACE )
39- add_dependencies (gpu webgpulib)
40- # Define the header-only library
41- target_include_directories (gpu INTERFACE ${TARGET_FILE_PATH} )
42-
43- # Add headers webgpu.h
44- target_include_directories (wgpu
45- INTERFACE ${TARGET_FILE_PATH} /third_party/headers)
46- include (ExternalProject)
47-
48- set (DAWN_EXT_PREFIX "${TARGET_FILE_PATH} /third_party/local/dawn" )
49-
50- ExternalProject_Add(
51- dawn_project
52- PREFIX ${DAWN_EXT_PREFIX}
53- GIT_REPOSITORY "https://dawn.googlesource.com/dawn"
54- GIT_TAG "main"
55- SOURCE_DIR "${DAWN_EXT_PREFIX} /source"
56- BINARY_DIR "${DAWN_EXT_PREFIX} /build"
57- INSTALL_DIR "${DAWN_EXT_PREFIX} /install"
58- GIT_SUBMODULES ""
59- # setting cmake args doesn't work and I don't know why
60- CONFIGURE_COMMAND
61- ${CMAKE_COMMAND} -S ${DAWN_EXT_PREFIX} /source -B
62- ${DAWN_EXT_PREFIX} /build -DDAWN_FETCH_DEPENDENCIES=ON
63- -DDAWN_ENABLE_INSTALL=ON -DDAWN_BUILD_MONOLITHIC_LIBRARY=ON
64- -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE} -G ${CMAKE_GENERATOR}
65- INSTALL_COMMAND ${CMAKE_COMMAND} --install . --prefix
66- ${DAWN_EXT_PREFIX} /install
67- LOG_INSTALL ON )
68- find_library (LIBDAWN dawn PATHS "${DAWN_EXT_PREFIX} /install/lib" )
69- target_link_libraries (webgpulib INTERFACE ${LIBDAWN} )
103+
104+ # Create the INTERFACE library ‘gpu’
105+ add_library (gpu STATIC ${GPU_SOURCES} ${GPU_HEADERS} )
106+ target_include_directories (gpu PUBLIC "${FILEPATH_PROJECT_ROOT} " )
107+ target_include_directories (gpu PUBLIC "${FILEPATH_PROJECT_ROOT} /third_party/headers" )
108+
109+ # Ensure that the gpu target is built only after Dawn has been installed.
110+ add_dependencies (gpu build_dawn_install)
111+
112+ find_library (WEBGPU_DAWN
113+ NAMES webgpu_dawn
114+ HINTS "${DAWN_INSTALL_PREFIX} /src/dawn/native/Debug/"
115+ )
0 commit comments