Skip to content

Commit b748399

Browse files
committed
simplify cmake, build dawn in repo, fix render for windows
1 parent 6447d85 commit b748399

File tree

6 files changed

+132
-169
lines changed

6 files changed

+132
-169
lines changed

.gitignore

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,3 +20,6 @@ build
2020
.cache
2121
compile_commands.json
2222

23+
# editor specific
24+
.vscode/*
25+

CMakeLists.txt

Lines changed: 2 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,11 @@
11
cmake_minimum_required(VERSION 3.28)
22
project(gpu)
33

4-
include("${CMAKE_CURRENT_SOURCE_DIR}/cmake/webgpu.cmake")
5-
64
set(CMAKE_EXPORT_COMPILE_COMMANDS ON) # export compile_commands.json to use with
75
# LSP
8-
set(CMAKE_CXX_STANDARD 17)
6+
set(CMAKE_CXX_STANDARD 20)
97
set(CMAKE_CXX_STANDARD_REQUIRED ON)
108

11-
option(USE_LOCAL_LIBS
12-
"Use local libraries instead of fetching from the internet" OFF)
13-
14-
# Ensure the build type is set
15-
if(NOT CMAKE_BUILD_TYPE)
16-
set(CMAKE_BUILD_TYPE
17-
Release
18-
CACHE STRING "Choose the type of build: Debug or Release" FORCE)
19-
endif()
20-
219
option(FASTBUILD "Option to enable fast builds" OFF)
2210
if(FASTBUILD)
2311
set(CMAKE_BUILD_TYPE None) # Avoid default flags of predefined build types
@@ -30,21 +18,8 @@ if(DEBUG)
3018
set(CMAKE_CXX_FLAGS "-O0 -g")
3119
endif()
3220

33-
if(WIN64)
34-
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DWEBGPU_BACKEND_DAWN")
35-
endif()
36-
3721
include("${CMAKE_CURRENT_SOURCE_DIR}/cmake/gpu.cmake")
3822

39-
message(STATUS "CMAKE_CURRENT_SOURCE_DIR: ${CMAKE_CURRENT_SOURCE_DIR}")
40-
message(
41-
STATUS
42-
"Include directories for wgpu: ${CMAKE_CURRENT_SOURCE_DIR}/third_party/headers"
43-
)
44-
4523
add_library(gpud SHARED gpu.hpp)
4624
set_target_properties(gpud PROPERTIES LINKER_LANGUAGE CXX)
47-
target_link_libraries(gpud PRIVATE wgpu)
48-
target_link_libraries(gpud PRIVATE webgpu)
49-
target_link_libraries(gpud PRIVATE gpu)
50-
install(TARGETS gpud)
25+
target_link_libraries(gpud PRIVATE gpu)

cmake/example.cmake

Lines changed: 13 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,17 @@
11
set(CMAKE_EXPORT_COMPILE_COMMANDS ON) # export compile_commands.json to use with
22
# LSP
3-
set(CMAKE_CXX_STANDARD 17)
3+
set(CMAKE_CXX_STANDARD 20)
44
set(CMAKE_CXX_STANDARD_REQUIRED ON)
55

66
get_filename_component(PROJECT_ROOT ${CMAKE_CURRENT_SOURCE_DIR} DIRECTORY)
77
get_filename_component(PROJECT_ROOT ${PROJECT_ROOT} DIRECTORY)
88

99
# Construct potential paths
10-
set(FILEPATH_CURRENT_DIR "${CMAKE_CURRENT_SOURCE_DIR}/${FILENAME}")
11-
set(FILEPATH_PROJECT_ROOT "${PROJECT_ROOT}/${FILENAME}")
10+
set(FILEPATH_CURRENT_DIR "${DIRECTORY}/")
11+
set(FILEPATH_PROJECT_ROOT "${PROJECT_ROOT}/")
1212

1313
# Include file finding utility script
14-
include("${CMAKE_CURRENT_SOURCE_DIR}/cmake/find_gpu.cmake")
14+
include("${FILEPATH_PROJECT_ROOT}/cmake/find_gpu.cmake")
1515

1616
# Check if the file exists in the current directory
1717
find_project_root(${CMAKE_CURRENT_SOURCE_DIR} ${FILENAME}
@@ -49,20 +49,19 @@ endif()
4949

5050
if(NOT TARGET gpu)
5151
message(STATUS "GPU_LIB not found")
52-
include("${TARGET_FILE_PATH}/cmake/webgpu.cmake")
5352
include("${TARGET_FILE_PATH}/cmake/gpu.cmake")
5453
endif()
55-
5654
add_executable(${PROJECT_NAME} run.cpp)
5755
target_link_libraries(${PROJECT_NAME} PRIVATE gpu)
58-
target_link_libraries(${PROJECT_NAME} PRIVATE wgpu)
59-
target_link_libraries(${PROJECT_NAME} PRIVATE webgpu)
56+
target_link_libraries(${PROJECT_NAME} PRIVATE ${WEBGPU_DAWN})
6057

61-
if(WIN32)
62-
# Ensure DLL is copied if on Windows
58+
if(MSVC)
59+
# Copy webgpu_dawn.dll to the build directory
6360
add_custom_command(
64-
TARGET ${PROJECT_NAME}
65-
POST_BUILD
66-
COMMAND ${CMAKE_COMMAND} -E copy_if_different ${DLL_PATH}
67-
$<TARGET_FILE_DIR:${PROJECT_NAME}>)
61+
TARGET ${PROJECT_NAME} POST_BUILD
62+
COMMAND ${CMAKE_COMMAND} -E copy
63+
${DAWN_INSTALL_PREFIX}/${CMAKE_BUILD_TYPE}/webgpu_dawn.dll
64+
$<TARGET_FILE_DIR:${PROJECT_NAME}>
65+
)
6866
endif()
67+

cmake/gpu.cmake

Lines changed: 108 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -1,69 +1,115 @@
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}")
265
else()
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}/")
2810
endif()
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")
3299
else()
33-
set(BUILD_TYPE "Release")
100+
list(APPEND GPU_HEADERS "${DAWN_INSTALL_PREFIX}/gen/webgpu-headers/webgpu.h")
34101
endif()
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+
)

cmake/webgpu.cmake

Lines changed: 0 additions & 61 deletions
This file was deleted.

examples/render/run.cpp

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -149,11 +149,12 @@ int main(int argc, char **argv) {
149149

150150
std::array<char, screen.size()> raster;
151151
for (size_t i = 0; i < screen.size(); ++i) {
152-
size_t index =
153-
std::min(sizeof(intensity) - 2,
154-
std::max(0ul, static_cast<size_t>(screen[i] *
155-
(sizeof(intensity) - 2))));
156-
raster[i] = intensity[index];
152+
// Convert all values to size_t to ensure proper type matching
153+
const size_t intensity_max = sizeof(intensity) - 2;
154+
const size_t scaled_value = static_cast<size_t>(screen[i] * intensity_max);
155+
size_t index = std::min(intensity_max,
156+
std::max(static_cast<size_t>(0), scaled_value));
157+
raster[i] = intensity[index];
157158
}
158159

159160
char buffer[(NROWS + 2) * (NCOLS + 2)];

0 commit comments

Comments
 (0)