|
1 | 1 | cmake_minimum_required(VERSION 3.28) |
2 | | -project(gpu) |
| 2 | +project(gpu.cpp LANGUAGES CXX) |
3 | 3 |
|
4 | | -include("${CMAKE_CURRENT_SOURCE_DIR}/cmake/webgpu.cmake") |
5 | | - |
6 | | -set(CMAKE_EXPORT_COMPILE_COMMANDS ON) # export compile_commands.json to use with |
7 | | - # LSP |
8 | | -set(CMAKE_CXX_STANDARD 17) |
| 4 | +set(CMAKE_CXX_STANDARD 20) |
9 | 5 | set(CMAKE_CXX_STANDARD_REQUIRED ON) |
| 6 | +set(CMAKE_CXX_EXTENSIONS OFF) |
| 7 | +set(CMAKE_EXPORT_COMPILE_COMMANDS ON) |
| 8 | + |
| 9 | +if(EMSCRIPTEN) |
| 10 | + set(GPUCPP_BUILD_PYTHON_DEFAULT OFF) |
| 11 | + set(GPUCPP_BUILD_EXAMPLES_DEFAULT OFF) |
| 12 | +else() |
| 13 | + set(GPUCPP_BUILD_PYTHON_DEFAULT ${PROJECT_IS_TOP_LEVEL}) |
| 14 | + set(GPUCPP_BUILD_EXAMPLES_DEFAULT ON) |
| 15 | +endif() |
| 16 | +option(GPUCPP_BUILD_PYTHON "Build the Python binding" ${GPUCPP_BUILD_PYTHON_DEFAULT}) |
| 17 | +option(GPUCPP_BUILD_EXAMPLES "Build gpu.cpp examples" ${GPUCPP_BUILD_EXAMPLES_DEFAULT}) |
| 18 | + |
| 19 | +add_library(gpucpp INTERFACE) |
| 20 | +target_include_directories(gpucpp INTERFACE "${CMAKE_CURRENT_SOURCE_DIR}") |
10 | 21 |
|
11 | | -option(USE_LOCAL_LIBS |
12 | | - "Use local libraries instead of fetching from the internet" OFF) |
| 22 | +if(EMSCRIPTEN) |
| 23 | + set(GPUCPP_EMDAWN_ROOT |
| 24 | + "${CMAKE_CURRENT_SOURCE_DIR}/third_party/emdawnwebgpu" CACHE PATH |
| 25 | + "Staged Emdawnwebgpu package") |
| 26 | + set(EMDAWN_PORT |
| 27 | + "--use-port=${GPUCPP_EMDAWN_ROOT}/emdawnwebgpu.port.py") |
| 28 | + if(NOT EXISTS "${GPUCPP_EMDAWN_ROOT}/emdawnwebgpu.port.py") |
| 29 | + message(FATAL_ERROR "Emdawnwebgpu is not built; run tools/build_emdawn.sh") |
| 30 | + endif() |
| 31 | + target_compile_options(gpucpp INTERFACE "${EMDAWN_PORT}" "-fwasm-exceptions") |
| 32 | + target_link_options(gpucpp INTERFACE "${EMDAWN_PORT}" "-fwasm-exceptions" |
| 33 | + "-sJSPI=1" "--closure=1") |
| 34 | + if(CMAKE_HOST_APPLE) |
| 35 | + target_link_options(gpucpp INTERFACE "--closure-args=--platform=java") |
| 36 | + endif() |
| 37 | +else() |
13 | 38 |
|
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) |
| 39 | +set(GPUCPP_DAWN_ROOT "${CMAKE_CURRENT_SOURCE_DIR}/third_party/dawn" CACHE PATH |
| 40 | + "Staged Dawn distribution") |
| 41 | +set(GPUCPP_LOCAL_DAWN "${CMAKE_CURRENT_SOURCE_DIR}/third_party/local/dawn" CACHE PATH |
| 42 | + "Developer Dawn source/build tree") |
| 43 | + |
| 44 | +if(EXISTS "${GPUCPP_DAWN_ROOT}/include/dawn/webgpu_cpp.h") |
| 45 | + set(DAWN_INCLUDE_DIRS "${GPUCPP_DAWN_ROOT}/include") |
| 46 | + if(APPLE) |
| 47 | + set(DAWN_LIBRARY "${GPUCPP_DAWN_ROOT}/lib/libwebgpu_dawn.dylib") |
| 48 | + elseif(UNIX) |
| 49 | + set(DAWN_LIBRARY "${GPUCPP_DAWN_ROOT}/lib/libwebgpu_dawn.so") |
| 50 | + endif() |
| 51 | + set(SPIRV_AS "${GPUCPP_DAWN_ROOT}/bin/spirv-as") |
| 52 | +elseif(EXISTS "${GPUCPP_LOCAL_DAWN}/build-latest/gen/include/dawn/webgpu_cpp.h") |
| 53 | + set(DAWN_INCLUDE_DIRS |
| 54 | + "${GPUCPP_LOCAL_DAWN}/build-latest/gen/include" |
| 55 | + "${GPUCPP_LOCAL_DAWN}/source/include") |
| 56 | + if(APPLE) |
| 57 | + set(DAWN_LIBRARY |
| 58 | + "${GPUCPP_LOCAL_DAWN}/build-latest/src/dawn/native/libwebgpu_dawn.dylib") |
| 59 | + elseif(UNIX) |
| 60 | + set(DAWN_LIBRARY |
| 61 | + "${GPUCPP_LOCAL_DAWN}/build-latest/src/dawn/native/libwebgpu_dawn.so") |
| 62 | + endif() |
| 63 | + set(SPIRV_AS "${GPUCPP_LOCAL_DAWN}/build-spirv-tools/tools/spirv-as") |
| 64 | +else() |
| 65 | + message(FATAL_ERROR "Dawn is not built; run tools/build_dawn.sh") |
19 | 66 | endif() |
20 | 67 |
|
21 | | -option(FASTBUILD "Option to enable fast builds" OFF) |
22 | | -if(FASTBUILD) |
23 | | - set(CMAKE_BUILD_TYPE None) # Avoid default flags of predefined build types |
24 | | - set(CMAKE_CXX_FLAGS "-O0") |
| 68 | +if(NOT EXISTS "${DAWN_LIBRARY}") |
| 69 | + message(FATAL_ERROR "Dawn library not found at ${DAWN_LIBRARY}") |
| 70 | +endif() |
| 71 | +if(NOT EXISTS "${SPIRV_AS}") |
| 72 | + message(FATAL_ERROR "spirv-as not found at ${SPIRV_AS}") |
25 | 73 | endif() |
26 | 74 |
|
27 | | -option(DEBUG "Option to enable debug flags" OFF) |
28 | | -if(DEBUG) |
29 | | - set(CMAKE_BUILD_TYPE Debug) |
30 | | - set(CMAKE_CXX_FLAGS "-O0 -g") |
| 75 | +add_library(Dawn::webgpu SHARED IMPORTED) |
| 76 | +set_target_properties(Dawn::webgpu PROPERTIES |
| 77 | + IMPORTED_LOCATION "${DAWN_LIBRARY}" |
| 78 | + INTERFACE_INCLUDE_DIRECTORIES "${DAWN_INCLUDE_DIRS}") |
| 79 | + |
| 80 | +target_link_libraries(gpucpp INTERFACE Dawn::webgpu) |
31 | 81 | endif() |
32 | 82 |
|
33 | | -if(WIN64) |
34 | | - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DWEBGPU_BACKEND_DAWN") |
| 83 | +if(GPUCPP_BUILD_PYTHON) |
| 84 | + find_package(Python 3.9 COMPONENTS Interpreter Development.Module REQUIRED) |
| 85 | + include(FetchContent) |
| 86 | + FetchContent_Declare(pybind11 |
| 87 | + GIT_REPOSITORY https://github.com/pybind/pybind11.git |
| 88 | + GIT_TAG v3.0.4 |
| 89 | + GIT_SHALLOW TRUE) |
| 90 | + FetchContent_MakeAvailable(pybind11) |
| 91 | + |
| 92 | + pybind11_add_module(gpu_cpp bindings/python/gpu_cpp.cpp) |
| 93 | + target_link_libraries(gpu_cpp PRIVATE gpucpp) |
35 | 94 | endif() |
36 | 95 |
|
37 | | -include("${CMAKE_CURRENT_SOURCE_DIR}/cmake/gpu.cmake") |
| 96 | +if(GPUCPP_BUILD_EXAMPLES) |
| 97 | + add_executable(hello_gpu examples/hello_world/run.cpp) |
| 98 | + add_executable(float16_gpu examples/float16/run.cpp) |
| 99 | + add_executable(gpu_puzzles examples/gpu_puzzles/run.cpp) |
| 100 | + add_executable(gpu_puzzles_key examples/gpu_puzzles/key.cpp) |
| 101 | + add_executable(matmul_gpu examples/matmul/run.cpp) |
| 102 | + add_executable(physics_gpu examples/physics/run.cpp) |
| 103 | + add_executable(render_gpu examples/render/run.cpp) |
| 104 | + add_executable(shadertui_gpu examples/shadertui/run.cpp) |
| 105 | + add_executable(transpose_gpu examples/transpose/run.cpp) |
38 | 106 |
|
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 | | -) |
| 107 | + foreach(target IN ITEMS hello_gpu float16_gpu gpu_puzzles gpu_puzzles_key |
| 108 | + matmul_gpu physics_gpu render_gpu shadertui_gpu |
| 109 | + transpose_gpu) |
| 110 | + target_link_libraries(${target} PRIVATE gpucpp) |
| 111 | + endforeach() |
| 112 | + target_include_directories(matmul_gpu PRIVATE third_party/headers) |
| 113 | + target_include_directories(transpose_gpu PRIVATE third_party/headers) |
44 | 114 |
|
45 | | -add_library(gpud SHARED gpu.hpp) |
46 | | -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) |
| 115 | +endif() |
| 116 | + |
| 117 | +enable_testing() |
| 118 | +if(EMSCRIPTEN) |
| 119 | + add_library(gpu_cpp_web_bindings OBJECT bindings/web/gpu_cpp.cpp) |
| 120 | + target_link_libraries(gpu_cpp_web_bindings PRIVATE gpucpp) |
| 121 | + |
| 122 | + add_executable(gpu_cpp_web $<TARGET_OBJECTS:gpu_cpp_web_bindings>) |
| 123 | + set_target_properties(gpu_cpp_web PROPERTIES SUFFIX ".mjs") |
| 124 | + target_link_libraries(gpu_cpp_web PRIVATE gpucpp) |
| 125 | + target_link_options(gpu_cpp_web PRIVATE "--bind" "--no-entry" |
| 126 | + "-sMODULARIZE=1" "-sEXPORT_ES6=1" "-sEXPORT_NAME=createGpuCpp" |
| 127 | + "-sENVIRONMENT=web" "-sALLOW_MEMORY_GROWTH=1") |
| 128 | + |
| 129 | + add_executable(web_binding_test tests/web_binding_test.cpp |
| 130 | + $<TARGET_OBJECTS:gpu_cpp_web_bindings>) |
| 131 | + set_target_properties(web_binding_test PROPERTIES SUFFIX ".html") |
| 132 | + target_link_libraries(web_binding_test PRIVATE gpucpp) |
| 133 | + target_link_options(web_binding_test PRIVATE "--bind" "--emrun" |
| 134 | + "-sMODULARIZE=1" "-sEXPORT_ES6=1" |
| 135 | + "-sALLOW_MEMORY_GROWTH=1") |
| 136 | +else() |
| 137 | + set(TEST_SPIRV "${CMAKE_CURRENT_BINARY_DIR}/write42.spv") |
| 138 | + add_custom_command( |
| 139 | + OUTPUT "${TEST_SPIRV}" |
| 140 | + COMMAND "${SPIRV_AS}" --target-env spv1.3 |
| 141 | + "${CMAKE_CURRENT_SOURCE_DIR}/tests/write42.spvasm" -o "${TEST_SPIRV}" |
| 142 | + DEPENDS tests/write42.spvasm |
| 143 | + VERBATIM) |
| 144 | + |
| 145 | + add_executable(gpu_test tests/gpu_test.cpp "${TEST_SPIRV}") |
| 146 | + target_link_libraries(gpu_test PRIVATE gpucpp) |
| 147 | + add_test(NAME gpu COMMAND gpu_test "${TEST_SPIRV}") |
| 148 | +endif() |
| 149 | +if(GPUCPP_BUILD_PYTHON) |
| 150 | + add_test(NAME python |
| 151 | + COMMAND "${Python_EXECUTABLE}" "${CMAKE_CURRENT_SOURCE_DIR}/bindings/python/test_gpu_cpp.py") |
| 152 | + set_tests_properties(python PROPERTIES |
| 153 | + ENVIRONMENT "PYTHONPATH=$<TARGET_FILE_DIR:gpu_cpp>") |
| 154 | +endif() |
0 commit comments