| # Quickstart With CMake | |
| This document is designed to allow you to build Dawn with CMake and link to it from other CMake projects. If you're planning to work on Dawn specifically, please use `gclient` and `depot_tools`. It ensures | |
| that you always get the right dependencies and compilers. | |
| ## Prerequisites | |
| - A compatible platform (e.g. Windows, macOS, Linux, etc.). Most platforms are fully supported. | |
| - A compatible C++ compiler supporting at least C++20. Most major compilers are supported. | |
| - Git for interacting with the Dawn source code repository. | |
| - CMake for building your project and Dawn. Dawn supports CMake 3.16+. | |
| ## Getting the Dawn Code | |
| ```shell | |
| # Change to the directory where you want to create the code repository | |
| $ git clone https://dawn.googlesource.com/dawn | |
| Cloning into 'dawn'... | |
| ``` | |
| Git will create the repository within a directory named `dawn`. Navigate into this directory and configure the project. | |
| ## Build and install Dawn with CMake | |
| ```shell | |
| $ cd dawn | |
| $ cmake -S . -B out/Release -DDAWN_FETCH_DEPENDENCIES=ON -DDAWN_ENABLE_INSTALL=ON -DCMAKE_BUILD_TYPE=Release | |
| ... | |
| -- Configuring done (34.9s) | |
| -- Generating done (0.8s) | |
| -- Build files have been written to: ${PWD}/out/Release | |
| ``` | |
| - `DAWN_FETCH_DEPENDENCIES=ON` uses a Python script `fetch_dawn_dependencies.py` as a less tedious alternative to setting up depot_tools and fetching dependencies via `gclient`. | |
| - `DAWN_ENABLE_INSTALL=ON` configures the project to install binaries, headers and cmake configuration files in a directory of your choice. This allows other projects to discover Dawn in CMake and link with it. | |
| Now you can build Dawn: | |
| ```shell | |
| $ cmake --build out/Release | |
| ... | |
| [100%] Linking CXX static library libdawn_utils.a | |
| [100%] Built target dawn_utils | |
| ``` | |
| Once you have built the Dawn library, install it with `cmake` | |
| ```shell | |
| $ cmake --install out/Release --prefix install/Release | |
| ``` | |
| This installs Dawn from the `out/Release` build tree into `install/Release`. | |
| ## Linking your code to the Dawn installation | |
| ### Create test code | |
| ```shell | |
| $ mkdir TestDawn | |
| $ cd TestDawn | |
| ``` | |
| Now, create a `hello_webgpu.cpp` C++ file within the `TestDawn` directory. | |
| ```cpp | |
| #include <webgpu/webgpu_cpp.h> | |
| #include <webgpu/webgpu_cpp_print.h> | |
| #include <cstdlib> | |
| #include <iostream> | |
| int main(int argc, char *argv[]) { | |
| static constexpr auto kTimedWaitAny = wgpu::InstanceFeatureName::TimedWaitAny; | |
| wgpu::InstanceDescriptor instanceDescriptor{ | |
| .requiredFeatureCount = 1, | |
| .requiredFeatures = &kTimedWaitAny | |
| }; | |
| wgpu::Instance instance = wgpu::CreateInstance(&instanceDescriptor); | |
| if (instance == nullptr) { | |
| std::cerr << "Instance creation failed!\n"; | |
| return EXIT_FAILURE; | |
| } | |
| // Synchronously request the adapter. | |
| wgpu::RequestAdapterOptions options = {}; | |
| wgpu::Adapter adapter; | |
| auto callback = [](wgpu::RequestAdapterStatus status, wgpu::Adapter adapter, wgpu::StringView message, void *userdata) { | |
| if (status != wgpu::RequestAdapterStatus::Success) { | |
| std::cerr << "Failed to get an adapter:" << message; | |
| return; | |
| } | |
| *static_cast<wgpu::Adapter *>(userdata) = adapter; | |
| }; | |
| auto callbackMode = wgpu::CallbackMode::WaitAnyOnly; | |
| void *userdata = &adapter; | |
| instance.WaitAny(instance.RequestAdapter(&options, callbackMode, callback, userdata), UINT64_MAX); | |
| if (adapter == nullptr) { | |
| std::cerr << "RequestAdapter failed!\n"; | |
| return EXIT_FAILURE; | |
| } | |
| wgpu::DawnAdapterPropertiesPowerPreference power_props{}; | |
| wgpu::AdapterInfo info{}; | |
| info.nextInChain = &power_props; | |
| adapter.GetInfo(&info); | |
| std::cout << "VendorID: " << std::hex << info.vendorID << std::dec << "\n"; | |
| std::cout << "Vendor: " << info.vendor << "\n"; | |
| std::cout << "Architecture: " << info.architecture << "\n"; | |
| std::cout << "DeviceID: " << std::hex << info.deviceID << std::dec << "\n"; | |
| std::cout << "Name: " << info.device << "\n"; | |
| std::cout << "Driver description: " << info.description << "\n"; | |
| return EXIT_SUCCESS; | |
| } | |
| ``` | |
| ### Create CMakeLists.txt file | |
| Now, create a `CMakeLists.txt` file within the `TestDawn` directory like the following: | |
| ```cmake | |
| cmake_minimum_required(VERSION 3.13) | |
| project(hello_webgpu) | |
| set(CMAKE_CXX_STANDARD 20) | |
| find_package(Dawn REQUIRED) | |
| add_executable(hello_webgpu hello_webgpu.cpp) | |
| # Declare dependency on the dawn::webgpu_dawn library | |
| target_link_libraries(hello_webgpu dawn::webgpu_dawn) | |
| ``` | |
| For more information on how to create CMakeLists.txt files, consult the [CMake Tutorial](https://cmake.org/getting-started/). | |
| ### Build test project | |
| Configure the CMake build from a fresh binary directory. This configuration is called an “out of source” build and is the preferred method for CMake projects. | |
| ```shell | |
| $ export CMAKE_PREFIX_PATH=/path/to/dawn/install/Release | |
| $ cmake -S . -B out/Release -DCMAKE_BUILD_TYPE=Release | |
| ... | |
| -- Configuring done (0.2s) | |
| -- Generating done (0.0s) | |
| -- Build files have been written to: ${PWD}/out/Release | |
| ``` | |
| Now build our test application: | |
| ```shell | |
| $ cmake --build out/Release | |
| [ 50%] Building CXX object CMakeFiles/hello_webgpu.dir/hello_webgpu.cpp.o | |
| [100%] Linking CXX executable hello_webgpu | |
| [100%] Built target hello_webgpu | |
| ``` | |
| Now run your binary: | |
| ```shell | |
| $ ./out/Release/hello_webgpu | |
| VendorID: 8086 | |
| Vendor: intel | |
| Architecture: gen-12lp | |
| DeviceID: 9a60 | |
| Name: Intel(R) UHD Graphics (TGL GT1) | |
| Driver description: Intel open-source Mesa driver: Mesa 23.2.1-1ubuntu3.1~22.04.2 | |
| ``` | |
| Note: You may move the contents of `install/Release` to any other directory and `cmake` will still be able to discover dawn as long as `CMAKE_PREFIX_PATH` points to the new install tree. |