| 1 | # Building for desktop with Dawn: |
| 2 | # 1. git clone https://github.com/google/dawn dawn |
| 3 | # 2. cmake -B build -DIMGUI_DAWN_DIR=dawn |
| 4 | # 3. cmake --build build |
| 5 | # The resulting binary will be found at one of the following locations: |
| 6 | # * build/example_glfw_wgpu[.exe] or build/Debug/example_glfw_wgpu[.exe] |
| 7 | |
| 8 | # Building for desktop with WGPU-Native: |
| 9 | # 1. download WGPU-Native autogenerated binary modules for your platform/compiler from: https://github.com/gfx-rs/wgpu-native/releases |
| 10 | # 2. unzip the downloaded file in your_preferred_folder |
| 11 | # 3. cmake -B build -DIMGUI_WGPU_DIR=your_preferred_folder ("full path" or "relative" starting from current directory) |
| 12 | # 4. cmake --build build |
| 13 | # The resulting binary will be found at one of the following locations: |
| 14 | # * build/example_glfw_wgpu[.exe] or build/Debug/example_glfw_wgpu[.exe] |
| 15 | |
| 16 | # Building for desktop with WGVK (MUCH EASIER) |
| 17 | # 1. git clone https://github.com/manuel5975p/WGVK wgvk |
| 18 | # 2. cmake -B build -DIMGUI_WGVK_DIR=wgvk |
| 19 | # 3. cmake --build build |
| 20 | # The resulting binary will be found at one of the following locations: |
| 21 | # * build/example_glfw_wgpu[.exe] or build/Debug/example_glfw_wgpu[.exe] |
| 22 | |
| 23 | # Building for Emscripten: |
| 24 | # 1. Install Emscripten SDK following the instructions: https://emscripten.org/docs/getting_started/downloads.html |
| 25 | # 2. Install Ninja build system |
| 26 | # 3. emcmake cmake -G Ninja -B build |
| 27 | # (optional) -DIMGUI_EMSCRIPTEN_WEBGPU_FLAG="--use-port=path/to/emdawnwebgpu_package/emdawnwebgpu.port.py", see ReadMe.md |
| 28 | # 3. cmake --build build |
| 29 | # 4. emrun build/index.html |
| 30 | |
| 31 | cmake_minimum_required(VERSION 3.22) # Dawn requires CMake >= 3.22 |
| 32 | project(imgui_example_glfw_wgpu C CXX) |
| 33 | |
| 34 | set(IMGUI_EXECUTABLE example_glfw_wgpu) |
| 35 | |
| 36 | if(NOT CMAKE_BUILD_TYPE) |
| 37 | set(CMAKE_BUILD_TYPE Debug CACHE STRING "" FORCE) |
| 38 | endif() |
| 39 | |
| 40 | set(CMAKE_CXX_STANDARD 20) # Dawn requires C++20 |
| 41 | |
| 42 | # Dear ImGui |
| 43 | set(IMGUI_DIR ../../) |
| 44 | |
| 45 | set(IMGUI_EXAMPLE_SOURCE_FILES |
| 46 | # Example code |
| 47 | main.cpp |
| 48 | # Dear ImGui Backend files |
| 49 | ${IMGUI_DIR}/backends/imgui_impl_glfw.cpp |
| 50 | ${IMGUI_DIR}/backends/imgui_impl_wgpu.cpp |
| 51 | # Dear ImGui files |
| 52 | ${IMGUI_DIR}/imgui.cpp |
| 53 | ${IMGUI_DIR}/imgui_draw.cpp |
| 54 | ${IMGUI_DIR}/imgui_demo.cpp |
| 55 | ${IMGUI_DIR}/imgui_tables.cpp |
| 56 | ${IMGUI_DIR}/imgui_widgets.cpp |
| 57 | ) |
| 58 | |
| 59 | if(EMSCRIPTEN) |
| 60 | if(EMSCRIPTEN_VERSION VERSION_GREATER_EQUAL "4.0.10") |
| 61 | set(IMGUI_EMSCRIPTEN_WEBGPU_FLAG "--use-port=emdawnwebgpu" CACHE STRING "Default to --use-port=emdawnwebgpu. You can override to provide your own local port.") |
| 62 | else() |
| 63 | message(FATAL_ERROR "emdawnwebgpu needs EMSCRIPTEN version >= 4.0.10") |
| 64 | endif() |
| 65 | |
| 66 | if(NOT IMGUI_EMSCRIPTEN_GLFW3) |
| 67 | # Defaults to contrib.glfw3 because Emscripten version is > 3.1.57 |
| 68 | set(IMGUI_EMSCRIPTEN_GLFW3 "--use-port=contrib.glfw3" CACHE STRING "Choose between --use-port=contrib.glfw3 and -sUSE_GLFW=3 for GLFW implementation (default to --use-port=contrib.glfw3)") |
| 69 | endif() |
| 70 | |
| 71 | set(LIBRARIES glfw) |
| 72 | add_compile_options(-sDISABLE_EXCEPTION_CATCHING=1 -DIMGUI_DISABLE_FILE_FUNCTIONS=1) |
| 73 | else() # Native/Desktop build |
| 74 | |
| 75 | # Check DAWN/WGPU/WGVK directory |
| 76 | # If it's Native/Desktop build, IMGUI_DAWN_DIR or IMGUI_WGPU_DIR or IMGUI_WGVK_DIR must be specified |
| 77 | if(NOT IMGUI_DAWN_DIR AND NOT IMGUI_WGPU_DIR AND NOT IMGUI_WGVK_DIR) |
| 78 | message(FATAL_ERROR "Please specify one of IMGUI_DAWN_DIR/IMGUI_WGPU_DIR/IMGUI_WGVK_DIR base directory.") |
| 79 | endif() |
| 80 | if((IMGUI_DAWN_DIR AND (IMGUI_WGPU_DIR OR IMGUI_WGVK_DIR)) OR (IMGUI_WGPU_DIR AND IMGUI_WGVK_DIR)) |
| 81 | message(FATAL_ERROR "Please specify only one of IMGUI_DAWN_DIR/IMGUI_WGPU_DIR/IMGUI_WGVK_DIR base directory.") |
| 82 | endif() |
| 83 | |
| 84 | if(APPLE) # Add SDL2 module to get Surface, with libs and file property for MacOS build |
| 85 | set_source_files_properties(${IMGUI_DIR}/backends/imgui_impl_wgpu.cpp PROPERTIES COMPILE_FLAGS "-x objective-c++") |
| 86 | set(OS_LIBRARIES "-framework CoreFoundation -framework QuartzCore -framework Metal -framework MetalKit -framework Cocoa") |
| 87 | endif() |
| 88 | |
| 89 | find_package(glfw3 REQUIRED) |
| 90 | |
| 91 | if(IMGUI_DAWN_DIR) |
| 92 | list(APPEND CMAKE_PREFIX_PATH ${IMGUI_DAWN_DIR}) |
| 93 | find_package(Dawn) # Search for a Dawn installation using IMGUI_DAWN_DIR in CMAKE_PREFIX_PATH |
| 94 | if(Dawn_FOUND) |
| 95 | message("Dawn Installation has been found!") |
| 96 | set(LIBRARIES dawn::webgpu_dawn glfw ${OS_LIBRARIES}) |
| 97 | else() |
| 98 | set(IMGUI_DAWN_DIR CACHE PATH "Path to Dawn repository") |
| 99 | |
| 100 | option(DAWN_FETCH_DEPENDENCIES "Use fetch_dawn_dependencies.py as an alternative to using depot_tools" ON) |
| 101 | set(DAWN_BUILD_MONOLITHIC_LIBRARY "STATIC" CACHE STRING "Build monolithic library: SHARED, STATIC, or OFF.") |
| 102 | |
| 103 | option(DAWN_USE_GLFW OFF) # disable builtin GLFW in DAWN when we use SDL2 / SDL3 |
| 104 | |
| 105 | # Dawn builds many things by default - disable things we don't need |
| 106 | option(DAWN_BUILD_SAMPLES "Enables building Dawn's samples" OFF) |
| 107 | option(TINT_BUILD_CMD_TOOLS "Build the Tint command line tools" OFF) |
| 108 | option(TINT_BUILD_DOCS "Build documentation" OFF) |
| 109 | option(TINT_BUILD_TESTS "Build tests" OFF) |
| 110 | if(NOT APPLE) |
| 111 | option(TINT_BUILD_MSL_WRITER "Build the MSL output writer" OFF) |
| 112 | endif() |
| 113 | if(WIN32) |
| 114 | option(DAWN_FORCE_SYSTEM_COMPONENT_LOAD "Allow system component fallback" ON) |
| 115 | option(TINT_BUILD_SPV_READER "Build the SPIR-V input reader" OFF) |
| 116 | option(TINT_BUILD_WGSL_READER "Build the WGSL input reader" ON) |
| 117 | option(TINT_BUILD_GLSL_WRITER "Build the GLSL output writer" OFF) |
| 118 | option(TINT_BUILD_GLSL_VALIDATOR "Build the GLSL output validator" OFF) |
| 119 | option(TINT_BUILD_SPV_WRITER "Build the SPIR-V output writer" ON) |
| 120 | option(TINT_BUILD_WGSL_WRITER "Build the WGSL output writer" ON) |
| 121 | endif() |
| 122 | # check if WAYLAND is the current Session Type and enable DAWN_USE_WAYLAND Wayland option @compile time |
| 123 | # You can override this using: cmake -DDAWN_USE_WAYLAND=X (X = ON | OFF) |
| 124 | if(LINUX) |
| 125 | if($ENV{XDG_SESSION_TYPE} MATCHES wayland) |
| 126 | option(DAWN_USE_WAYLAND "Enable support for Wayland surface" ON) |
| 127 | endif() |
| 128 | endif() |
| 129 | |
| 130 | add_subdirectory("${IMGUI_DAWN_DIR}" "${CMAKE_CURRENT_BINARY_DIR}/dawn" EXCLUDE_FROM_ALL) |
| 131 | |
| 132 | set(LIBRARIES webgpu_dawn glfw) |
| 133 | endif() |
| 134 | endif() |
| 135 | |
| 136 | if(IMGUI_WGPU_DIR) |
| 137 | set(WGPU_NATIVE_LIB_DIR ${IMGUI_WGPU_DIR}/lib) |
| 138 | find_library(WGPU_LIBRARY NAMES libwgpu_native.a wgpu_native.lib wgpu_native HINTS ${WGPU_NATIVE_LIB_DIR} REQUIRED) |
| 139 | if(WIN32) |
| 140 | set(OS_LIBRARIES d3dcompiler ws2_32 userenv bcrypt ntdll opengl32 Propsys RuntimeObject) |
| 141 | elseif(UNIX AND NOT APPLE) |
| 142 | set(OS_LIBRARIES "-lm -ldl") |
| 143 | endif() |
| 144 | |
| 145 | set(LIBRARIES glfw ${WGPU_LIBRARY} ${OS_LIBRARIES}) |
| 146 | endif() |
| 147 | |
| 148 | if(IMGUI_WGVK_DIR) |
| 149 | find_package(Vulkan REQUIRED) |
| 150 | set(WGVK_PLATFORM_LIBS) |
| 151 | set(WGVK_PLATFORM_DEFS) |
| 152 | if(WIN32) |
| 153 | list(APPEND WGVK_PLATFORM_DEFS SUPPORT_WIN32_SURFACE=1) |
| 154 | elseif(APPLE) |
| 155 | list(APPEND WGVK_PLATFORM_DEFS SUPPORT_METAL_SURFACE=1) |
| 156 | elseif(UNIX) |
| 157 | find_package(PkgConfig QUIET) |
| 158 | pkg_check_modules(WAYLAND_CLIENT QUIET wayland-client) |
| 159 | if(WAYLAND_CLIENT_FOUND) |
| 160 | list(APPEND WGVK_PLATFORM_DEFS SUPPORT_WAYLAND_SURFACE=1) |
| 161 | list(APPEND WGVK_PLATFORM_LIBS ${WAYLAND_CLIENT_LIBRARIES}) |
| 162 | endif() |
| 163 | find_package(X11 QUIET) |
| 164 | if(X11_FOUND) |
| 165 | list(APPEND WGVK_PLATFORM_DEFS SUPPORT_XLIB_SURFACE=1) |
| 166 | list(APPEND WGVK_PLATFORM_LIBS X11::X11) |
| 167 | endif() |
| 168 | list(APPEND WGVK_PLATFORM_LIBS m dl pthread) |
| 169 | endif() |
| 170 | set(LIBRARIES glfw Vulkan::Vulkan ${WGVK_PLATFORM_LIBS}) |
| 171 | endif() |
| 172 | endif() |
| 173 | |
| 174 | add_executable(${IMGUI_EXECUTABLE} ${IMGUI_EXAMPLE_SOURCE_FILES}) |
| 175 | |
| 176 | target_include_directories(${IMGUI_EXECUTABLE} PUBLIC |
| 177 | ${IMGUI_DIR} |
| 178 | ${IMGUI_DIR}/backends |
| 179 | ) |
| 180 | |
| 181 | target_compile_definitions(${IMGUI_EXECUTABLE} PUBLIC "IMGUI_EXAMPLE_GLFW_WGPU") |
| 182 | |
| 183 | # compiler option only for IMGUI_EXAMPLE_SOURCE_FILES |
| 184 | if (MSVC) |
| 185 | target_compile_options(${IMGUI_EXECUTABLE} PUBLIC /W4) # warning level 4 |
| 186 | else() |
| 187 | target_compile_options(${IMGUI_EXECUTABLE} PUBLIC -Wall) # -Wextra -Wpedantic |
| 188 | endif() |
| 189 | |
| 190 | # In this example IMGUI_IMPL_WEBGPU_BACKEND_DAWN / IMGUI_IMPL_WEBGPU_BACKEND_WGPU internal define is set according to: |
| 191 | # EMSCRIPTEN: by used FLAG |
| 192 | # --use-port=emdawnwebgpu --> IMGUI_IMPL_WEBGPU_BACKEND_DAWN defined |
| 193 | # NATIVE: by used SDK installation directory |
| 194 | # if IMGUI_DAWN_DIR is valid --> IMGUI_IMPL_WEBGPU_BACKEND_DAWN defined |
| 195 | # if IMGUI_WGPU_DIR is valid --> IMGUI_IMPL_WEBGPU_BACKEND_WGPU defined |
| 196 | |
| 197 | if(NOT EMSCRIPTEN) # WegGPU-Native settings |
| 198 | # Set IMGUI_IMPL_WEBGPU_BACKEND_XXXX based on the SDK (directory) used |
| 199 | if(IMGUI_DAWN_DIR) |
| 200 | target_compile_definitions(${IMGUI_EXECUTABLE} PUBLIC "IMGUI_IMPL_WEBGPU_BACKEND_DAWN") |
| 201 | if(NOT Dawn_FOUND) |
| 202 | target_link_libraries(${IMGUI_EXECUTABLE} INTERFACE webgpu_cpp) |
| 203 | endif() |
| 204 | endif() |
| 205 | if(IMGUI_WGPU_DIR) |
| 206 | target_compile_definitions(${IMGUI_EXECUTABLE} PUBLIC "IMGUI_IMPL_WEBGPU_BACKEND_WGPU") |
| 207 | target_include_directories(${IMGUI_EXECUTABLE} PUBLIC ${IMGUI_WGPU_DIR}/include) |
| 208 | endif() |
| 209 | if(IMGUI_WGVK_DIR) |
| 210 | target_sources(${IMGUI_EXECUTABLE} PRIVATE ${IMGUI_WGVK_DIR}/src/wgvk.c) |
| 211 | target_compile_definitions(${IMGUI_EXECUTABLE} PUBLIC "IMGUI_IMPL_WEBGPU_BACKEND_WGVK") |
| 212 | target_compile_definitions(${IMGUI_EXECUTABLE} PRIVATE ${WGVK_PLATFORM_DEFS}) |
| 213 | target_include_directories(${IMGUI_EXECUTABLE} PUBLIC ${IMGUI_WGVK_DIR}/include) |
| 214 | if (MSVC) |
| 215 | target_compile_options(${IMGUI_EXECUTABLE} PUBLIC /std:clatest /experimental:c11atomics) |
| 216 | endif() |
| 217 | endif() |
| 218 | |
| 219 | target_link_libraries(${IMGUI_EXECUTABLE} PUBLIC ${LIBRARIES}) |
| 220 | |
| 221 | else() # Emscripten settings |
| 222 | set(CMAKE_EXECUTABLE_SUFFIX ".html") |
| 223 | |
| 224 | if("${IMGUI_EMSCRIPTEN_GLFW3}" STREQUAL "--use-port=contrib.glfw3") |
| 225 | target_compile_options(${IMGUI_EXECUTABLE} PUBLIC "${IMGUI_EMSCRIPTEN_GLFW3}") |
| 226 | endif() |
| 227 | message(STATUS "Using ${IMGUI_EMSCRIPTEN_GLFW3} GLFW implementation") |
| 228 | |
| 229 | target_compile_options(${IMGUI_EXECUTABLE} PUBLIC "${IMGUI_EMSCRIPTEN_WEBGPU_FLAG}") |
| 230 | target_compile_definitions(${IMGUI_EXECUTABLE} PUBLIC "IMGUI_IMPL_WEBGPU_BACKEND_DAWN") |
| 231 | message(STATUS "Using ${IMGUI_EMSCRIPTEN_WEBGPU_FLAG} WebGPU implementation") |
| 232 | |
| 233 | target_link_options(${IMGUI_EXECUTABLE} PRIVATE |
| 234 | "${IMGUI_EMSCRIPTEN_WEBGPU_FLAG}" |
| 235 | "${IMGUI_EMSCRIPTEN_GLFW3}" |
| 236 | "-sWASM=1" |
| 237 | "-sASYNCIFY=1" |
| 238 | "-sALLOW_MEMORY_GROWTH=1" |
| 239 | "-sNO_EXIT_RUNTIME=0" |
| 240 | "-sASSERTIONS=1" |
| 241 | "-sDISABLE_EXCEPTION_CATCHING=1" |
| 242 | "-sNO_FILESYSTEM=1" |
| 243 | "--shell-file=${CMAKE_CURRENT_LIST_DIR}/../libs/emscripten/shell_minimal.html" |
| 244 | ) |
| 245 | set_target_properties(${IMGUI_EXECUTABLE} PROPERTIES OUTPUT_NAME "index") |
| 246 | endif() |