Skip to content

Commit 9042771

Browse files
authored
Merge pull request #78 from MichealReed/support_ints
Support additional data types
2 parents cd37551 + 6fc7373 commit 9042771

File tree

6 files changed

+1628
-247
lines changed

6 files changed

+1628
-247
lines changed

cmake/dawn.cmake

Lines changed: 147 additions & 104 deletions
Original file line numberDiff line numberDiff line change
@@ -1,124 +1,167 @@
1-
# Setup directories
2-
set(FETCHCONTENT_BASE_DIR "${PROJECT_ROOT}/third_party")
3-
set(DAWN_DIR "${FETCHCONTENT_BASE_DIR}/dawn" CACHE INTERNAL "")
4-
set(DAWN_BUILD_DIR "${DAWN_DIR}/build" CACHE INTERNAL "")
1+
cmake_minimum_required(VERSION 3.14)
52

3+
include(ExternalProject)
4+
include(FetchContent)
5+
6+
# include("${CMAKE_CURRENT_SOURCE_DIR}/cmake/print_target.cmake")
7+
8+
9+
# Setup directories and basic paths
10+
set(FETCHCONTENT_BASE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/external")
11+
set(DAWN_DIR "${FETCHCONTENT_BASE_DIR}/dawn" CACHE INTERNAL "Dawn source directory")
12+
13+
# For Emscripten builds (if desired)
14+
set(EM_SDK_DIR $ENV{EMSDK} CACHE INTERNAL "")
15+
set(EMSCRIPTEN_DIR "${EM_SDK_DIR}/upstream/emscripten" CACHE INTERNAL "")
16+
17+
# Decide where to build Dawn’s build files.
618
if(EMSCRIPTEN)
7-
set(EM_SDK_DIR $ENV{EMSDK} CACHE INTERNAL "")
8-
set(DAWN_BUILD_DIR "${DAWN_DIR}/build_web" CACHE INTERNAL "")
9-
set(DAWN_EMSCRIPTEN_TOOLCHAIN ${EM_SDK_DIR}/upstream/emscripten CACHE INTERNAL "" FORCE)
19+
set(DAWN_BUILD_DIR "${DAWN_DIR}/build_web" CACHE INTERNAL "web build directory" FORCE)
20+
elseif(WIN32)
21+
set(DAWN_BUILD_DIR "${DAWN_DIR}/build_win" CACHE INTERNAL "windows build directory" FORCE)
22+
elseif(IOS)
23+
set(DAWN_BUILD_DIR "${DAWN_DIR}/build_ios" CACHE INTERNAL "ios build directory" FORCE)
24+
elseif(APPLE)
25+
set(DAWN_BUILD_DIR "${DAWN_DIR}/build_mac" CACHE INTERNAL "mac build directory" FORCE)
26+
elseif(ANDROID)
27+
set(DAWN_BUILD_DIR "${DAWN_DIR}/build_android" CACHE INTERNAL "android build directory" FORCE)
1028
else()
11-
add_compile_definitions(USE_DAWN_API)
29+
set(DAWN_BUILD_DIR "${DAWN_DIR}/build_unix" CACHE INTERNAL "linux build directory" FORCE)
1230
endif()
1331

14-
# Enable find for no dawn rebuilds with flutter run
15-
set(ENABLE_DAWN_FIND OFF CACHE BOOL "Enable finding Dawn" FORCE)
32+
# Add Dawn header include directories so that they are available later.
33+
include_directories(BEFORE PUBLIC
34+
"${DAWN_BUILD_DIR}/src/dawn/native/"
35+
"${DAWN_BUILD_DIR}/src/dawn/native/Debug"
36+
"${DAWN_BUILD_DIR}/src/dawn/native/Release"
37+
)
38+
39+
40+
# Optionally try to find an existing Dawn build.
41+
set(ENABLE_DAWN_FIND OFF CACHE BOOL "Attempt to find an existing Dawn build" FORCE)
1642
set(DAWN_BUILD_FOUND OFF CACHE BOOL "Dawn build found" FORCE)
43+
1744
if(ENABLE_DAWN_FIND)
18-
# find_library, windows adds extra folder
19-
if(MSVC)
20-
find_library(WEBGPU_DAWN_DEBUG webgpu_dawn
21-
NAMES webgpu_dawn
22-
HINTS "${DAWN_BUILD_DIR}/src/dawn/native/Debug"
23-
)
24-
find_library(WEBGPU_DAWN_RELEASE webgpu_dawn
25-
NAMES webgpu_dawn
26-
HINTS "${DAWN_BUILD_DIR}/src/dawn/native/Release"
27-
)
28-
set(DAWN_BUILD_FOUND ON)
29-
elseif(NOT EMSCRIPTEN AND NOT MSVC)
30-
find_library(WEBGPU_DAWN_LIB
31-
NAMES webgpu_dawn
32-
PATHS "${DAWN_BUILD_DIR}/src/dawn/native"
33-
REQUIRED
34-
)
35-
set(DAWN_BUILD_FOUND ON)
36-
else()
37-
set(DAWN_BUILD_FOUND ON)
45+
message(STATUS "Attempting to find an existing Dawn build...")
46+
if(WIN32)
47+
find_library(WEBGPU_DAWN_DEBUG NAMES webgpu_dawn HINTS "${DAWN_BUILD_DIR}/src/dawn/native/Debug")
48+
find_library(WEBGPU_DAWN_RELEASE NAMES webgpu_dawn HINTS "${DAWN_BUILD_DIR}/src/dawn/native/Release")
49+
50+
if(WEBGPU_DAWN_DEBUG OR WEBGPU_DAWN_RELEASE)
51+
message(STATUS "Dawn build found on Windows. Debug: ${WEBGPU_DAWN_DEBUG}, Release: ${WEBGPU_DAWN_RELEASE}")
52+
set(DAWN_BUILD_FOUND ON)
53+
endif()
54+
elseif(NOT EMSCRIPTEN AND NOT WIN32)
55+
find_library(WEBGPU_DAWN_LIB NAMES webgpu_dawn.so PATHS "${DAWN_BUILD_DIR}/src/dawn/native")
56+
57+
if(WEBGPU_DAWN_LIB)
58+
message(STATUS "Dawn build found on Linux/Unix. Library: ${WEBGPU_DAWN_LIB}")
59+
set(DAWN_BUILD_FOUND ON)
3860
endif()
61+
endif()
3962
endif()
4063

41-
# Dawn options for more,
42-
# see https://dawn.googlesource.com/dawn/+/refs/heads/main/CMakeLists.txt
43-
set(DAWN_ALWAYS_ASSERT OFF CACHE INTERNAL "Always assert in Dawn" FORCE)
44-
set(DAWN_BUILD_MONOLITHIC_LIBRARY ON CACHE INTERNAL "Build Dawn monolithically" FORCE)
45-
set(DAWN_BUILD_EXAMPLES OFF CACHE INTERNAL "Build Dawn examples" FORCE)
46-
set(DAWN_BUILD_SAMPLES OFF CACHE INTERNAL "Build Dawn samples" FORCE)
47-
set(DAWN_BUILD_TESTS OFF CACHE INTERNAL "Build Dawn tests" FORCE)
48-
set(DAWN_ENABLE_INSTALL OFF CACHE INTERNAL "Enable Dawn installation" FORCE)
49-
set(DAWN_FETCH_DEPENDENCIES ON CACHE INTERNAL "Fetch Dawn dependencies" FORCE)
50-
set(TINT_BUILD_TESTS OFF CACHE INTERNAL "Build Tint Tests" FORCE)
51-
set(TINT_BUILD_IR_BINARY OFF CACHE INTERNAL "Build Tint IR binary" FORCE)
52-
set(TINT_BUILD_CMD_TOOLS OFF CACHE INTERNAL "Build Tint command line tools" FORCE)
5364

65+
# Pre-build Dawn at configuration time if not already built.
5466
if(NOT DAWN_BUILD_FOUND)
55-
include(FetchContent)
56-
message("webgpu_dawn not found start building")
57-
if(EMSCRIPTEN)
58-
set(EMSCRIPTEN_DIR "${EM_SDK_DIR}/upstream/emscripten" CACHE INTERNAL "" FORCE)
59-
set(DAWN_EMSCRIPTEN_TOOLCHAIN ${EMSCRIPTEN_DIR} CACHE INTERNAL "" FORCE)
60-
endif()
67+
message(STATUS "Dawn build not found - pre-building Dawn.")
6168

62-
FetchContent_Declare(
63-
dawn
64-
DOWNLOAD_DIR ${DAWN_DIR}
65-
SOURCE_DIR ${DAWN_DIR}
66-
SUBBUILD_DIR ${DAWN_BUILD_DIR}/tmp
67-
BINARY_DIR ${DAWN_BUILD_DIR}
68-
DOWNLOAD_COMMAND
69-
cd ${DAWN_DIR} &&
70-
git init &&
71-
git fetch --depth=1 https://dawn.googlesource.com/dawn &&
72-
git reset --hard FETCH_HEAD
73-
)
69+
# Force Dawn build options.
70+
set(DAWN_ALWAYS_ASSERT ON CACHE INTERNAL "Always assert in Dawn" FORCE)
71+
set(DAWN_BUILD_MONOLITHIC_LIBRARY ON CACHE INTERNAL "Build Dawn monolithically" FORCE)
72+
set(DAWN_BUILD_EXAMPLES OFF CACHE INTERNAL "Build Dawn examples" FORCE)
73+
set(DAWN_BUILD_SAMPLES OFF CACHE INTERNAL "Build Dawn samples" FORCE)
74+
set(DAWN_BUILD_TESTS OFF CACHE INTERNAL "Build Dawn tests" FORCE)
75+
set(DAWN_ENABLE_INSTALL OFF CACHE INTERNAL "Enable Dawn installation" FORCE)
76+
set(DAWN_FETCH_DEPENDENCIES ON CACHE INTERNAL "Fetch Dawn dependencies" FORCE)
77+
set(TINT_BUILD_TESTS OFF CACHE INTERNAL "Build Tint Tests" FORCE)
78+
set(TINT_BUILD_IR_BINARY OFF CACHE INTERNAL "Build Tint IR binary" FORCE)
79+
set(TINT_BUILD_CMD_TOOLS OFF CACHE INTERNAL "Build Tint command line tools" FORCE)
80+
set(DAWN_EMSCRIPTEN_TOOLCHAIN ${EMSCRIPTEN_DIR} CACHE INTERNAL "Emscripten toolchain" FORCE)
7481

75-
# Download the repository and add it as a subdirectory.
76-
FetchContent_MakeAvailable(dawn)
82+
set(DAWN_COMMIT "66d57f910357befb441b91162f29a97f687af6d9" CACHE STRING "Dawn commit to checkout" FORCE)
83+
84+
file(MAKE_DIRECTORY ${DAWN_DIR})
85+
# Initialize Git and set/update remote.
86+
execute_process(COMMAND git init
87+
WORKING_DIRECTORY "${DAWN_DIR}"
88+
)
89+
execute_process(
90+
COMMAND git remote add origin https://dawn.googlesource.com/dawn
91+
WORKING_DIRECTORY "${DAWN_DIR}"
92+
)
93+
# Fetch and checkout the specified commit.
94+
execute_process(
95+
COMMAND git fetch origin ${DAWN_COMMIT}
96+
WORKING_DIRECTORY "${DAWN_DIR}"
97+
)
98+
execute_process(
99+
COMMAND git checkout ${DAWN_COMMIT}
100+
WORKING_DIRECTORY "${DAWN_DIR}"
101+
)
102+
execute_process(
103+
COMMAND git reset --hard ${DAWN_COMMIT}
104+
WORKING_DIRECTORY "${DAWN_DIR}"
105+
)
106+
# Fetch the Dawn repository if not already present.
107+
FetchContent_Declare(
108+
dawn
109+
SOURCE_DIR ${DAWN_DIR}
110+
SUBBUILD_DIR ${DAWN_BUILD_DIR}/tmp
111+
BINARY_DIR ${DAWN_BUILD_DIR}
112+
)
113+
FetchContent_MakeAvailable(dawn)
77114

78-
# attempt fix flutter rebuilds
79-
set(CMAKE_INCLUDE_PATH "${CMAKE_INCLUDE_PATH};${DAWN_DIR}/src" CACHE INTERNAL "")
115+
set(CMAKE_INCLUDE_PATH "${CMAKE_INCLUDE_PATH};${DAWN_DIR}/src" CACHE INTERNAL "")
80116

81-
execute_process(
82-
WORKING_DIRECTORY ${DAWN_DIR}
83-
COMMAND ${CMAKE_COMMAND} -S ${DAWN_DIR}
84-
-B ${DAWN_BUILD_DIR}
85-
)
117+
set(DAWN_BUILD_FOUND ON)
118+
endif() # End pre-build Dawn
86119

87-
# Build Dawn
88-
execute_process(
89-
COMMAND ${CMAKE_COMMAND} --build ${DAWN_BUILD_DIR}
90-
)
91-
92-
# find_library, windows adds extra folder
93-
if(MSVC)
94-
find_library(WEBGPU_DAWN_DEBUG webgpu_dawn
95-
NAMES webgpu_dawn
96-
HINTS "${DAWN_BUILD_DIR}/src/dawn/native/Debug"
97-
)
98-
find_library(WEBGPU_DAWN_RELEASE webgpu_dawn
99-
NAMES webgpu_dawn
100-
HINTS "${DAWN_BUILD_DIR}/src/dawn/native/Release"
101-
)
102-
set(DAWN_BUILD_FOUND ON)
103-
elseif(NOT EMSCRIPTEN AND NOT MSVC)
104-
find_library(WEBGPU_DAWN_LIB
105-
NAMES webgpu_dawn
106-
PATHS "${DAWN_BUILD_DIR}/src/dawn/native"
107-
REQUIRED
108-
)
109-
set(DAWN_BUILD_FOUND ON)
110-
else()
111-
set(DAWN_BUILD_FOUND ON)
112-
endif()
120+
# Create an IMPORTED target for the Dawn library.
121+
# Adjust the expected output name/extension per platform.
122+
if(MSVC)
123+
message(STATUS "Dawn build found on Windows.")
124+
# MSVC: use separate debug and release dlls.
125+
if((NOT WEBGPU_DAWN_DEBUG) OR (WEBGPU_DAWN_DEBUG MATCHES "NOTFOUND"))
126+
find_library(WEBGPU_DAWN_DEBUG NAMES webgpu_dawn PATHS "${DAWN_BUILD_DIR}/src/dawn/native/Debug")
127+
endif()
128+
if((NOT WEBGPU_DAWN_RELEASE) OR (WEBGPU_DAWN_RELEASE MATCHES "NOTFOUND"))
129+
find_library(WEBGPU_DAWN_RELEASE NAMES webgpu_dawn PATHS "${DAWN_BUILD_DIR}/src/dawn/native/Release")
113130
endif()
114131

115-
if(EMSCRIPTEN)
116-
add_library(webgpu_dawn INTERFACE IMPORTED)
117-
target_include_directories(webgpu_dawn INTERFACE ${DAWN_BUILD_DIR}/gen/src/emdawnwebgpu/include)
118-
target_include_directories(webgpu_dawn INTERFACE ${DAWN_BUILD_DIR}/gen/src/emdawnwebgpu/include/webgpu/webgpu.h)
119-
target_link_libraries(webgpu_dawn INTERFACE ${DAWN_BUILD_DIR}/gen/src/emdawnwebgpu/library_webgpu_enum_tables.js)
120-
target_link_libraries(webgpu_dawn INTERFACE ${DAWN_BUILD_DIR}/gen/src/emdawnwebgpu/library_webgpu_generated_struct_info.js)
121-
target_link_libraries(webgpu_dawn INTERFACE ${DAWN_BUILD_DIR}/gen/src/emdawnwebgpu/library_webgpu_generated_sig_info.js)
122-
target_link_libraries(webgpu_dawn INTERFACE ${DAWN_DIR}/third_party/emdawnwebgpu/library_webgpu.js)
123-
else()
132+
if(WEBGPU_DAWN_DEBUG OR WEBGPU_DAWN_RELEASE)
133+
if(NOT TARGET webgpu_dawn)
134+
add_library(webgpu_dawn INTERFACE)
135+
target_link_libraries(webgpu_dawn INTERFACE
136+
$<$<CONFIG:Debug>:${WEBGPU_DAWN_DEBUG}>
137+
$<$<CONFIG:Release>:${WEBGPU_DAWN_RELEASE}>
138+
)
139+
endif()
124140
endif()
141+
elseif(IOS)
142+
# On iOS, it is common to build a static library.
143+
if(NOT TARGET webgpu_dawn)
144+
add_library(webgpu_dawn STATIC IMPORTED)
145+
set_target_properties(webgpu_dawn PROPERTIES
146+
IMPORTED_LOCATION "${DAWN_BUILD_DIR}/src/dawn/native/webgpu_dawn.a")
147+
endif()
148+
elseif(APPLE)
149+
# On macOS (non-iOS), typically a dynamic library (.dylib) is built.
150+
if(NOT TARGET webgpu_dawn)
151+
add_library(webgpu_dawn SHARED IMPORTED)
152+
set_target_properties(webgpu_dawn PROPERTIES
153+
IMPORTED_LOCATION "${DAWN_BUILD_DIR}/src/dawn/native/webgpu_dawn.dylib")
154+
endif()
155+
elseif(ANDROID)
156+
if(NOT TARGET webgpu_dawn)
157+
add_library(webgpu_dawn SHARED IMPORTED)
158+
set_target_properties(webgpu_dawn PROPERTIES
159+
IMPORTED_LOCATION "${DAWN_BUILD_DIR}/src/dawn/native/webgpu_dawn.so")
160+
endif()
161+
elseif(NOT EMSCRIPTEN) # For Linux and other Unix-like systems.
162+
if(NOT TARGET webgpu_dawn)
163+
add_library(webgpu_dawn SHARED IMPORTED)
164+
set_target_properties(webgpu_dawn PROPERTIES
165+
IMPORTED_LOCATION "${DAWN_BUILD_DIR}/src/dawn/native/webgpu_dawn.so")
166+
endif()
167+
endif()

cmake/gpu.cmake

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@ message(STATUS "PROJECT_ROOT: ${PROJECT_ROOT}")
1515
set(GPU_SOURCES
1616
"${PROJECT_ROOT}/gpu.cpp"
1717
"${PROJECT_ROOT}/numeric_types/half.cpp"
18-
"${DAWN_BUILD_DIR}/gen/include/dawn/webgpu.h"
1918
)
2019

2120
# Add headers

0 commit comments

Comments
 (0)