Skip to content

Commit 46ca8bc

Browse files
BrutPittocornut
authored andcommitted
Backends, Examples: WGPU: wip refactor. (8381)
Rebased and squashed 47 commits. - ImGui WebGPU examples: removed swap-chain in favor of surfaceConfigure (8191) - New SDL2 WGPU example - Code optimization: removed the redundancies of assignment - Changes: ImGui code style - Lambdas RequestAdapter and RequestDevice callbacks declarated as signature - Validation Layer callbacks moved from lambdas to standard functions - Same changes of GLFW example: ImGui code style - Lambdas RequestAdapter and RequestDevice callbacks declarated as signature - Validation Layer callbacks moved from lambdas to standard functions - Scrollbars inhibition - Use of new direct CreateDevice function (w/o callback), added release of all resources used (not present in original example) - If the O.S. is Linux/Unix check if Wayland is the current active session and set DAWN_USE_WAYLAND=ON option (otherwise is always OFF) - example_glfw_wgpu: removed all workarounds - example_sdl2_wgpu: same style and functionality as GLFW example - sdl2wgpu tool to acquire surfaceDescriptor via SDL_syswm and to pass to wgpuInstanceCreateSurface to create WGPU Surface - css style to avoid the scrollbar - added `chek_surface_texture_status` function to check the `WGPUSurfaceTexture .status` and recreate the `Surface` in case of "not optimal" (bad) status. - Changed comment reference to `emwgpudawn` an EMSCRIPTEN WGPU binding maintained by Google - Adaptation to the last Google DAWN commit (1411699ba) Adaptation to the last EMSCRIPTEN 4.0.10, using new "--use-port=emdawnwebgpu" compiler/linker flag - Support for EMSCRIPTEN >= 4.0.10 (using "--use-port=emdawnwebgpu") and NEW support for WGPU-Native - Finalized the support of WGPU-Native for MacOS and minimal code adjustment - WebGPU examples - DAWN / WGPU native and EMSCRIPTEN - for GLFW/SDL2/SDL3 frameworks - "index.html" no more necessary (now the common one is used), "sdl2wgpu.cpp" It has been moved and renamed (sdl2_wgpu.c), "sdl2wgpu.h" no more necessary - added procedure for using CMake - added procedure for using CMake - Updated example_sdl3_wgpu build procedure for EMSCRIPTEN - WGPU+GLFW: Helper to create a WebGPU surface for Native application. Used only with WGPU-Native SDK: DAWN-Native already has a built-in function - WGPU+SDL2: helper to create a WebGPU surface (exclusively!) for Native/Desktop applications and available only together with WebGPU/WGPU backend - WGPU+SDL3: helper to create a WebGPU surface (exclusively!) for Native/Desktop applications and available only together with WebGPU/WGPU backend - WebGPU Helper functions and differentiation between the 4 compilation methods (via defines): Google DAWN (Native/Emscripten) / WGPU (Native/EMscripten) - example_glfw_wgpu: ImGui_ImplGLFW_CreateWGPUSurface_Helper (new helper function in imgui_impl_glfw backend), check status and error callback functions in imgui_impl_wgpu backend - example_sdl2_wgpu: ImGui_ImplSDL2_CreateWGPUSurface_Helper (new helper function in imgui_impl_sdl2 backend), check status and error callback functions in imgui_impl_wgpu backend - example_sdl3_wgpu: ImGui_ImplSDL3_CreateWGPUSurface_Helper (new helper function in imgui_impl_sdl3 backend), check status and error callback functions in imgui_impl_wgpu backend - Functions ImGui_ImplXXXX_CreateWGPUSurface_Helper were inserted into imgui_impl_xxxx (xxxx = GLFW / SDL2 / SDL3), and initialization has been integrated into every example: no more necessary, removed
1 parent cee40f8 commit 46ca8bc

20 files changed

+2583
-288
lines changed

backends/imgui_impl_glfw.cpp

Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1049,6 +1049,97 @@ void ImGui_ImplGlfw_InstallEmscriptenCallbacks(GLFWwindow* window, const char* c
10491049
}
10501050
#endif // #ifdef EMSCRIPTEN_USE_PORT_CONTRIB_GLFW3
10511051

1052+
// GLFW helper to create a WebGPU surface, used only in WGPU-Native, DAWN-Native already has a built-in function
1053+
// At current date (jun/2025) there is no "official" support in GLFW to create a surface for WebGPU backend
1054+
// This stub uses "low level" GLFW calls to acquire information from a specific Window Manager.
1055+
// Currently supported platforms: Windows / Linux (X11 and Wayland) / MacOS
1056+
// Not necessary/available with EMSCRIPTEN
1057+
#if defined(IMGUI_IMPL_WEBGPU_BACKEND_WGPU) && !defined(__EMSCRIPTEN__)
1058+
// GLFW native necessary to get information about current platform / Window Manager
1059+
#include <GLFW/glfw3native.h>
1060+
// MacOS specific: is necessary to compile with "-x objective-c++" flags
1061+
// (e.g. using cmake: set_source_files_properties(${IMGUI_DIR}/backends/imgui_impl_glfw.cpp PROPERTIES COMPILE_FLAGS "-x objective-c++") )
1062+
#if defined(GLFW_EXPOSE_NATIVE_COCOA)
1063+
#include <Foundation/Foundation.h>
1064+
#include <QuartzCore/CAMetalLayer.h>
1065+
#endif
1066+
1067+
WGPUSurface ImGui_ImplGLFW_CreateWGPUSurface_Helper(WGPUInstance instance, GLFWwindow* window)
1068+
{
1069+
WGPUSurfaceDescriptor surfaceDescriptor = {};
1070+
WGPUChainedStruct chainedStruct = {};
1071+
1072+
WGPUSurface surface = {};
1073+
1074+
#if defined(GLFW_EXPOSE_NATIVE_COCOA)
1075+
{
1076+
id metal_layer = NULL;
1077+
NSWindow *ns_window = glfwGetCocoaWindow(window);
1078+
[ns_window.contentView setWantsLayer:YES];
1079+
metal_layer = [CAMetalLayer layer];
1080+
[ns_window.contentView setLayer:metal_layer];
1081+
1082+
chainedStruct.sType = WGPUSType_SurfaceSourceMetalLayer;
1083+
1084+
WGPUSurfaceSourceMetalLayer surfaceMetal = {};
1085+
surfaceMetal.chain = chainedStruct;
1086+
surfaceMetal.layer = metal_layer;
1087+
1088+
surfaceDescriptor.nextInChain = &surfaceMetal.chain;
1089+
surface = wgpuInstanceCreateSurface(instance, &surfaceDescriptor);
1090+
}
1091+
#elif defined(GLFW_EXPOSE_NATIVE_WAYLAND) && defined(GLFW_EXPOSE_NATIVE_X11)
1092+
if (glfwGetPlatform() == GLFW_PLATFORM_X11) {
1093+
Display *x11_display = glfwGetX11Display();
1094+
Window x11_window = glfwGetX11Window(window);
1095+
1096+
chainedStruct.sType = WGPUSType_SurfaceSourceXlibWindow;
1097+
1098+
WGPUSurfaceSourceXlibWindow surfaceXlib = {};
1099+
surfaceXlib.chain = chainedStruct;
1100+
surfaceXlib.display = x11_display;
1101+
surfaceXlib.window = x11_window;
1102+
1103+
surfaceDescriptor.nextInChain = &surfaceXlib.chain;
1104+
surface = wgpuInstanceCreateSurface(instance, &surfaceDescriptor);
1105+
}
1106+
if (glfwGetPlatform() == GLFW_PLATFORM_WAYLAND) {
1107+
struct wl_display *wayland_display = glfwGetWaylandDisplay();
1108+
struct wl_surface *wayland_surface = glfwGetWaylandWindow(window);
1109+
1110+
chainedStruct.sType = WGPUSType_SurfaceSourceWaylandSurface;
1111+
1112+
WGPUSurfaceSourceWaylandSurface surfaceWayland = {};
1113+
surfaceWayland.chain = chainedStruct;
1114+
surfaceWayland.display = wayland_display;
1115+
surfaceWayland.surface = wayland_surface;
1116+
1117+
surfaceDescriptor.nextInChain = &surfaceWayland.chain;
1118+
surface = wgpuInstanceCreateSurface(instance, &surfaceDescriptor);
1119+
}
1120+
#elif defined(GLFW_EXPOSE_NATIVE_WIN32)
1121+
{
1122+
HWND hwnd = glfwGetWin32Window(window);
1123+
HINSTANCE hinstance = GetModuleHandle(NULL);
1124+
1125+
chainedStruct.sType = WGPUSType_SurfaceSourceWindowsHWND;
1126+
1127+
WGPUSurfaceSourceWindowsHWND surfaceHWND = {};
1128+
surfaceHWND.chain = chainedStruct;
1129+
surfaceHWND.hinstance = hinstance;
1130+
surfaceHWND.hwnd = hwnd;
1131+
1132+
surfaceDescriptor.nextInChain = &surfaceHWND.chain;
1133+
surface = wgpuInstanceCreateSurface(instance, &surfaceDescriptor);
1134+
}
1135+
#elif
1136+
#error "Unsupported GLFW/WebGPU native platform"
1137+
#endif
1138+
return surface;
1139+
}
1140+
#endif // defined(IMGUI_IMPL_WEBGPU_BACKEND_WGPU) && !defined(__EMSCRIPTEN__)
1141+
1142+
10521143
//-----------------------------------------------------------------------------
10531144

10541145
#if defined(__clang__)

backends/imgui_impl_glfw.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,5 +66,11 @@ IMGUI_IMPL_API void ImGui_ImplGlfw_Sleep(int milliseconds);
6666
IMGUI_IMPL_API float ImGui_ImplGlfw_GetContentScaleForWindow(GLFWwindow* window);
6767
IMGUI_IMPL_API float ImGui_ImplGlfw_GetContentScaleForMonitor(GLFWmonitor* monitor);
6868

69+
// GLFW helper to create a WebGPU surface for Native/Desktop applications: used only in WGPU-Native, DAWN-Native already has a built-in function
70+
#if defined(IMGUI_IMPL_WEBGPU_BACKEND_WGPU) && !defined(__EMSCRIPTEN__)
71+
#include <webgpu/webgpu.h>
72+
WGPUSurface ImGui_ImplGLFW_CreateWGPUSurface_Helper(WGPUInstance instance, GLFWwindow* window);
73+
#endif
74+
6975

7076
#endif // #ifndef IMGUI_DISABLE

backends/imgui_impl_sdl2.cpp

Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -899,6 +899,92 @@ void ImGui_ImplSDL2_NewFrame()
899899
ImGui_ImplSDL2_UpdateGamepads();
900900
}
901901

902+
// SDL2 helper to create a WebGPU surface (exclusively!) for Native/Desktop applications: available only together with WebGPU/WGPU backend
903+
// At current date (jun/2025) there is no "official" support in SDL2 to create a surface for WebGPU backend
904+
// This stub uses "low level" SDL2 calls to acquire information from a specific Window Manager.
905+
// Currently supported platforms: Windows / Linux (X11 and Wayland) / MacOS
906+
// Not necessary/available with EMSCRIPTEN
907+
#if defined(IMGUI_IMPL_WEBGPU_BACKEND_WGPU) || defined(IMGUI_IMPL_WEBGPU_BACKEND_DAWN) && !defined(__EMSCRIPTEN__)
908+
#ifdef SDL_VIDEO_DRIVER_COCOA
909+
// MacOS specific: is necessary to compile with "-x objective-c++" flags
910+
// (e.g. using cmake: set_source_files_properties(${IMGUI_DIR}/backends/imgui_impl_sdl2.cpp PROPERTIES COMPILE_FLAGS "-x objective-c++") )
911+
#include <Cocoa/Cocoa.h>
912+
#include <QuartzCore/CAMetalLayer.h>
913+
#endif
914+
915+
WGPUSurface ImGui_ImplSDL2_CreateWGPUSurface_Helper(WGPUInstance instance, SDL_Window* window)
916+
{
917+
WGPUSurfaceDescriptor surfaceDescriptor = {};
918+
WGPUChainedStruct chainedStruct = {};
919+
SDL_SysWMinfo sysWMInfo;
920+
SDL_VERSION(&sysWMInfo.version);
921+
SDL_GetWindowWMInfo(window, &sysWMInfo);
922+
923+
WGPUSurface surface = {};
924+
925+
#if defined(SDL_VIDEO_DRIVER_WAYLAND) || defined(SDL_VIDEO_DRIVER_X11)
926+
const char *vidDrv = SDL_GetHint(SDL_HINT_VIDEODRIVER);
927+
if(!vidDrv) return NULL;
928+
929+
if(tolower(vidDrv[0])=='w' && tolower(vidDrv[1])=='a' && tolower(vidDrv[2])=='y' &&
930+
tolower(vidDrv[3])=='l' && tolower(vidDrv[4])=='a' && tolower(vidDrv[5])=='n' && tolower(vidDrv[6])=='d') { // wayland
931+
932+
chainedStruct.sType = WGPUSType_SurfaceSourceWaylandSurface;
933+
934+
WGPUSurfaceSourceWaylandSurface surfaceWayland = {};
935+
surfaceWayland.chain = chainedStruct;
936+
surfaceWayland.display = sysWMInfo.info.wl.display;
937+
surfaceWayland.surface = sysWMInfo.info.wl.surface;
938+
939+
surfaceDescriptor.nextInChain = &surfaceWayland.chain;
940+
surface = wgpuInstanceCreateSurface(instance, &surfaceDescriptor);
941+
942+
} else { // x11
943+
chainedStruct.sType = WGPUSType_SurfaceSourceXlibWindow;
944+
945+
WGPUSurfaceSourceXlibWindow surfaceXlib = {};
946+
surfaceXlib.chain = chainedStruct;
947+
surfaceXlib.display = sysWMInfo.info.x11.display;
948+
surfaceXlib.window = sysWMInfo.info.x11.window;
949+
950+
surfaceDescriptor.nextInChain = &surfaceXlib.chain;
951+
surface = wgpuInstanceCreateSurface(instance, &surfaceDescriptor);
952+
}
953+
#elif defined(SDL_VIDEO_DRIVER_WINDOWS)
954+
{
955+
chainedStruct.sType = WGPUSType_SurfaceSourceWindowsHWND;
956+
957+
WGPUSurfaceSourceWindowsHWND surfaceHWND = {};
958+
surfaceHWND.chain = chainedStruct;
959+
surfaceHWND.hinstance = sysWMInfo.info.win.hinstance;
960+
surfaceHWND.hwnd = sysWMInfo.info.win.window;
961+
962+
surfaceDescriptor.nextInChain = &surfaceHWND.chain;
963+
surface = wgpuInstanceCreateSurface(instance, &surfaceDescriptor);
964+
}
965+
#elif defined(SDL_VIDEO_DRIVER_COCOA)
966+
{
967+
id metal_layer = [CAMetalLayer layer];
968+
NSWindow *ns_window = sysWMInfo.info.cocoa.window;
969+
[ns_window.contentView setWantsLayer:YES];
970+
[ns_window.contentView setLayer:metal_layer];
971+
972+
chainedStruct.sType = WGPUSType_SurfaceSourceMetalLayer;
973+
974+
WGPUSurfaceSourceMetalLayer surfaceMetal = {};
975+
surfaceMetal.chain = chainedStruct;
976+
surfaceMetal.layer = metal_layer;
977+
978+
surfaceDescriptor.nextInChain = &surfaceMetal.chain;
979+
surface = wgpuInstanceCreateSurface(instance, &surfaceDescriptor);
980+
}
981+
#else
982+
#error "Unsupported SDL2/WebGPU Backend"
983+
#endif
984+
return surface;
985+
}
986+
#endif //defined(IMGUI_IMPL_WEBGPU_BACKEND_WGPU) || defined(IMGUI_IMPL_WEBGPU_BACKEND_DAWN) && !defined(__EMSCRIPTEN__)
987+
902988
//-----------------------------------------------------------------------------
903989

904990
#if defined(__clang__)

backends/imgui_impl_sdl2.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,4 +47,10 @@ IMGUI_IMPL_API float ImGui_ImplSDL2_GetContentScaleForDisplay(int display_ind
4747
enum ImGui_ImplSDL2_GamepadMode { ImGui_ImplSDL2_GamepadMode_AutoFirst, ImGui_ImplSDL2_GamepadMode_AutoAll, ImGui_ImplSDL2_GamepadMode_Manual };
4848
IMGUI_IMPL_API void ImGui_ImplSDL2_SetGamepadMode(ImGui_ImplSDL2_GamepadMode mode, struct _SDL_GameController** manual_gamepads_array = nullptr, int manual_gamepads_count = -1);
4949

50+
// SDL2 helper to create a WebGPU surface (exclusively!) for Native/Desktop applications: available only together with WebGPU/WGPU backend
51+
#if defined(IMGUI_IMPL_WEBGPU_BACKEND_WGPU) || defined(IMGUI_IMPL_WEBGPU_BACKEND_DAWN) && !defined(__EMSCRIPTEN__)
52+
#include <webgpu/webgpu.h>
53+
WGPUSurface ImGui_ImplSDL2_CreateWGPUSurface_Helper(WGPUInstance instance, SDL_Window* window);
54+
#endif
55+
5056
#endif // #ifndef IMGUI_DISABLE

backends/imgui_impl_sdl3.cpp

Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -839,6 +839,91 @@ void ImGui_ImplSDL3_NewFrame()
839839
ImGui_ImplSDL3_UpdateGamepads();
840840
}
841841

842+
// SDL3 helper to create a WebGPU surface (exclusively!) for Native/Desktop applications: available only together with WebGPU/WGPU backend
843+
// At current date (jun/2025) there is no "official" support in SDL3 to create a surface for WebGPU backend
844+
// This stub uses "low level" SDL3 calls to acquire information from a specific Window Manager.
845+
// Currently supported platforms: Windows / Linux (X11 and Wayland) / MacOS
846+
// Not necessary/available with EMSCRIPTEN
847+
#if defined(IMGUI_IMPL_WEBGPU_BACKEND_WGPU) || defined(IMGUI_IMPL_WEBGPU_BACKEND_DAWN) && !defined(__EMSCRIPTEN__)
848+
#if defined(SDL_PLATFORM_MACOS)
849+
// MacOS specific: is necessary to compile with "-x objective-c++" flags
850+
// (e.g. using cmake: set_source_files_properties(${IMGUI_DIR}/backends/imgui_impl_sdl3.cpp PROPERTIES COMPILE_FLAGS "-x objective-c++") )
851+
# include <Cocoa/Cocoa.h>
852+
# include <QuartzCore/CAMetalLayer.h>
853+
#elif defined(SDL_PLATFORM_WIN32)
854+
# include <windows.h>
855+
#endif
856+
857+
WGPUSurface ImGui_ImplSDL3_CreateWGPUSurface_Helper(WGPUInstance instance, SDL_Window* window) {
858+
SDL_PropertiesID propertiesID = SDL_GetWindowProperties(window);
859+
WGPUSurfaceDescriptor surfaceDescriptor = {};
860+
861+
WGPUSurface surface = {};
862+
863+
#if defined(SDL_PLATFORM_MACOS)
864+
{
865+
id metal_layer = NULL;
866+
NSWindow *ns_window = (__bridge NSWindow *)SDL_GetPointerProperty(propertiesID, SDL_PROP_WINDOW_COCOA_WINDOW_POINTER, NULL);
867+
if (!ns_window) return NULL;
868+
[ns_window.contentView setWantsLayer : YES];
869+
metal_layer = [CAMetalLayer layer];
870+
[ns_window.contentView setLayer : metal_layer];
871+
872+
WGPUSurfaceSourceMetalLayer surfaceMetal = {};
873+
surfaceMetal.chain.sType = WGPUSType_SurfaceSourceMetalLayer;
874+
surfaceMetal.layer = metal_layer;
875+
876+
surfaceDescriptor.nextInChain = &surfaceMetal.chain;
877+
surface = wgpuInstanceCreateSurface(instance, &surfaceDescriptor);
878+
}
879+
#elif defined(SDL_PLATFORM_LINUX)
880+
if (!SDL_strcmp(SDL_GetCurrentVideoDriver(), "wayland")) {
881+
void *w_display = SDL_GetPointerProperty(propertiesID, SDL_PROP_WINDOW_WAYLAND_DISPLAY_POINTER, NULL);
882+
void *w_surface = SDL_GetPointerProperty(propertiesID, SDL_PROP_WINDOW_WAYLAND_SURFACE_POINTER, NULL);
883+
if (!w_display || !w_surface) return NULL;
884+
885+
WGPUSurfaceSourceWaylandSurface surfaceWayland = {};
886+
surfaceWayland.chain.sType = WGPUSType_SurfaceSourceWaylandSurface;
887+
surfaceWayland.display = w_display;
888+
surfaceWayland.surface = w_surface;
889+
890+
surfaceDescriptor.nextInChain = &surfaceWayland.chain;
891+
surface = wgpuInstanceCreateSurface(instance, &surfaceDescriptor);
892+
} else if (!SDL_strcmp(SDL_GetCurrentVideoDriver(), "x11")) {
893+
void *x_display = SDL_GetPointerProperty(propertiesID, SDL_PROP_WINDOW_X11_DISPLAY_POINTER, NULL);
894+
uint64_t x_window = SDL_GetNumberProperty(propertiesID, SDL_PROP_WINDOW_X11_WINDOW_NUMBER, 0);
895+
if (!x_display || !x_window) return NULL;
896+
897+
WGPUSurfaceSourceXlibWindow surfaceXlib = {};
898+
surfaceXlib.chain.sType = WGPUSType_SurfaceSourceXlibWindow;
899+
surfaceXlib.display = x_display;
900+
surfaceXlib.window = x_window;
901+
902+
surfaceDescriptor.nextInChain = &surfaceXlib.chain;
903+
surface = wgpuInstanceCreateSurface(instance, &surfaceDescriptor);
904+
}
905+
906+
#elif defined(SDL_PLATFORM_WIN32)
907+
{
908+
HWND hwnd = (HWND)SDL_GetPointerProperty(propertiesID, SDL_PROP_WINDOW_WIN32_HWND_POINTER, NULL);
909+
if (!hwnd) return NULL;
910+
HINSTANCE hinstance = GetModuleHandle(NULL);
911+
912+
WGPUSurfaceSourceWindowsHWND surfaceHWND = {};
913+
surfaceHWND.chain.sType = WGPUSType_SurfaceSourceWindowsHWND;
914+
surfaceHWND.hinstance = hinstance;
915+
surfaceHWND.hwnd = hwnd;
916+
917+
surfaceDescriptor.nextInChain = &surfaceHWND.chain;
918+
surface = wgpuInstanceCreateSurface(instance, &surfaceDescriptor);
919+
}
920+
#else
921+
#error "Unsupported SDL3/WebGPU Backend"
922+
#endif
923+
return surface;
924+
}
925+
#endif // defined(IMGUI_IMPL_WEBGPU_BACKEND_WGPU) || defined(IMGUI_IMPL_WEBGPU_BACKEND_DAWN) && !defined(__EMSCRIPTEN__)
926+
842927
//-----------------------------------------------------------------------------
843928

844929
#if defined(__clang__)

backends/imgui_impl_sdl3.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,4 +44,10 @@ IMGUI_IMPL_API bool ImGui_ImplSDL3_ProcessEvent(const SDL_Event* event);
4444
enum ImGui_ImplSDL3_GamepadMode { ImGui_ImplSDL3_GamepadMode_AutoFirst, ImGui_ImplSDL3_GamepadMode_AutoAll, ImGui_ImplSDL3_GamepadMode_Manual };
4545
IMGUI_IMPL_API void ImGui_ImplSDL3_SetGamepadMode(ImGui_ImplSDL3_GamepadMode mode, SDL_Gamepad** manual_gamepads_array = nullptr, int manual_gamepads_count = -1);
4646

47+
// SDL3 helper to create a WebGPU surface for Native/Desktop applications: available only with WebGPU/WGPU backend
48+
#if defined(IMGUI_IMPL_WEBGPU_BACKEND_WGPU) || defined(IMGUI_IMPL_WEBGPU_BACKEND_DAWN) && !defined(__EMSCRIPTEN__)
49+
#include <webgpu/webgpu.h>
50+
WGPUSurface ImGui_ImplSDL3_CreateWGPUSurface_Helper(WGPUInstance instance, SDL_Window* window);
51+
#endif
52+
4753
#endif // #ifndef IMGUI_DISABLE

0 commit comments

Comments
 (0)