11 KB、246行 生 Blame 履歴
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
31cmake_minimum_required(VERSION 3.22) # Dawn requires CMake >= 3.22
32project(imgui_example_glfw_wgpu C CXX)
33
34set(IMGUI_EXECUTABLE example_glfw_wgpu)
35
36if(NOT CMAKE_BUILD_TYPE)
37 set(CMAKE_BUILD_TYPE Debug CACHE STRING "" FORCE)
38endif()
39
40set(CMAKE_CXX_STANDARD 20) # Dawn requires C++20
41
42# Dear ImGui
43set(IMGUI_DIR ../../)
44
45set(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
59if(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)
73else() # 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()
172endif()
173
174add_executable(${IMGUI_EXECUTABLE} ${IMGUI_EXAMPLE_SOURCE_FILES})
175
176target_include_directories(${IMGUI_EXECUTABLE} PUBLIC
177 ${IMGUI_DIR}
178 ${IMGUI_DIR}/backends
179)
180
181target_compile_definitions(${IMGUI_EXECUTABLE} PUBLIC "IMGUI_EXAMPLE_GLFW_WGPU")
182
183# compiler option only for IMGUI_EXAMPLE_SOURCE_FILES
184if (MSVC)
185 target_compile_options(${IMGUI_EXECUTABLE} PUBLIC /W4) # warning level 4
186else()
187 target_compile_options(${IMGUI_EXECUTABLE} PUBLIC -Wall) # -Wextra -Wpedantic
188endif()
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
197if(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
221else() # 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")
246endif()