diff --git a/backends/imgui_impl_wgpu.cpp b/backends/imgui_impl_wgpu.cpp index a01bcf4f1..2b7edb0ba 100644 --- a/backends/imgui_impl_wgpu.cpp +++ b/backends/imgui_impl_wgpu.cpp @@ -20,6 +20,7 @@ // CHANGELOG // (minor and older changes stripped away, please see git history for details) +// 2026-03-09: Removed support for Emscripten < 4.0.10. (#9281) // 2025-10-16: Update to compile with Dawn and Emscripten's 4.0.10+ '--use-port=emdawnwebgpu' ports. (#8381, #8898) // 2025-09-18: Call platform_io.ClearRendererHandlers() on shutdown. // 2025-06-12: Added support for ImGuiBackendFlags_RendererHasTextures, for dynamic font atlas. (#8465) @@ -58,6 +59,9 @@ #if defined(IMGUI_IMPL_WEBGPU_BACKEND_DAWN) == defined(IMGUI_IMPL_WEBGPU_BACKEND_WGPU) #error Exactly one of IMGUI_IMPL_WEBGPU_BACKEND_DAWN or IMGUI_IMPL_WEBGPU_BACKEND_WGPU must be defined! #endif +#if defined(__EMSCRIPTEN__) && defined(IMGUI_IMPL_WEBGPU_BACKEND_WGPU) +#error Emscripten <4.0.10 with '-sUSE_WEBGPU=1' is not supported anymore. +#endif #ifdef IMGUI_IMPL_WEBGPU_BACKEND_DAWN // Dawn renamed WGPUProgrammableStageDescriptor to WGPUComputeState (see: https://github.com/webgpu-native/webgpu-headers/pull/413) diff --git a/backends/imgui_impl_wgpu.h b/backends/imgui_impl_wgpu.h index b0fc99310..346538a4b 100644 --- a/backends/imgui_impl_wgpu.h +++ b/backends/imgui_impl_wgpu.h @@ -5,7 +5,8 @@ // When targeting native platforms: // - One of IMGUI_IMPL_WEBGPU_BACKEND_DAWN or IMGUI_IMPL_WEBGPU_BACKEND_WGPU *must* be provided. // When targeting Emscripten: -// - We now defaults to IMGUI_IMPL_WEBGPU_BACKEND_DAWN is Emscripten version is 4.0.10+, which correspond to using Emscripten '--use-port=emdawnwebgpu'. +// - We now defaults to IMGUI_IMPL_WEBGPU_BACKEND_DAWN and requires Emscripten 4.0.10+, which correspond to using Emscripten '--use-port=emdawnwebgpu'. +// - Emscripten < 4.0.10 is not supported anymore (old '-sUSE_WEBGPU=1' option). // - We can still define IMGUI_IMPL_WEBGPU_BACKEND_WGPU to use Emscripten '-s USE_WEBGPU=1' which is marked as obsolete by Emscripten. // Add #define to your imconfig.h file, or as a compilation flag in your build system. // This requirement may be removed once WebGPU stabilizes and backends converge on a unified interface. @@ -96,7 +97,7 @@ const char* ImGui_ImplWGPU_GetAdapterTypeName(WGPUAdapterType type); #if defined(IMGUI_IMPL_WEBGPU_BACKEND_DAWN) const char* ImGui_ImplWGPU_GetDeviceLostReasonName(WGPUDeviceLostReason type); const char* ImGui_ImplWGPU_GetErrorTypeName(WGPUErrorType type); -#elif defined(IMGUI_IMPL_WEBGPU_BACKEND_WGPU) && !defined(__EMSCRIPTEN__) +#elif defined(IMGUI_IMPL_WEBGPU_BACKEND_WGPU) const char* ImGui_ImplWGPU_GetLogLevelName(WGPULogLevel level); #endif diff --git a/docs/CHANGELOG.txt b/docs/CHANGELOG.txt index 062b1bc90..fba7c64ef 100644 --- a/docs/CHANGELOG.txt +++ b/docs/CHANGELOG.txt @@ -94,12 +94,14 @@ Other Changes: - SDLGPU3: removed unnecessary call to SDL_WaitForGPUIdle when releasing vertex/index buffers. (#9262) [@jaenis] - WebGPU: fixed version check for Emscripten 5.0.0+. + - WebGPU: removed support for Emscripten <4.0.10. (#9281) [@ypujante] - Examples: - Emscripten: added `tabindex=-1` to canvas in our shell_minimal.htm. Without it, the canvas was not focusable in the DOM, which in turn make some backends (e.g. pongasoft/emscripten-glfw) not receive focus loss events. (#9259) [@pthom] - - WGPU: fixed undefined behaviors in example code for requesting adapter + - WebGPU: fixed undefined behaviors in example code for requesting adapter and device. (#9246, #9256) [@r-lyeh] + - GLFW/SDL2/SDL3+WebGPU: removed suport for Emscripten <4.0.10. (#9281) [@ypujante] ----------------------------------------------------------------------- diff --git a/examples/example_glfw_wgpu/README.md b/examples/example_glfw_wgpu/README.md index cee6b8c72..c1c40a59f 100644 --- a/examples/example_glfw_wgpu/README.md +++ b/examples/example_glfw_wgpu/README.md @@ -60,9 +60,10 @@ For the WASM code produced by Emscripten to work correctly, it will also be nece CMake checks the EMSCRIPEN version then: - if EMS >= 4.0.10 uses `--use-port=emdawnwebgpu` flag to build - it set `IMGUI_IMPL_WEBGPU_BACKEND_DAWN` compiler define - - if EMS < 4.0.10 the build aborts (`-sUSE_WEBGPU=1` is no longer supported in ImGui) + - if EMS < 4.0.10 the build aborts (`-sUSE_WEBGPU=1` is no longer supported by our examples and our WGPU backend) #### Generate Emscripten using external WebGPU library (emdawnwebgpu_pkg) + - `emcmake cmake -G Ninja -DIMGUI_EMSCRIPTEN_WEBGPU_FLAG="--use-port=path_to_emdawnwebgpu_pkg" -B where_to_build_dir` - it set `IMGUI_IMPL_WEBGPU_BACKEND_DAWN` compiler define - *To use external WebGPU library it's necessary to have EMS >= 4.0.10 or the minimum requirements specified by the package:* diff --git a/examples/example_glfw_wgpu/main.cpp b/examples/example_glfw_wgpu/main.cpp index eda424372..54dfc6908 100644 --- a/examples/example_glfw_wgpu/main.cpp +++ b/examples/example_glfw_wgpu/main.cpp @@ -341,17 +341,6 @@ static WGPUDevice RequestDevice(wgpu::Instance& instance, wgpu::Adapter& adapter return acquired_device.MoveToCHandle(); } #elif defined(IMGUI_IMPL_WEBGPU_BACKEND_WGPU) -#ifdef __EMSCRIPTEN__ -// Adapter and device initialization via JS -EM_ASYNC_JS( void, getAdapterAndDeviceViaJS, (), -{ - if (!navigator.gpu) - throw Error("WebGPU not supported."); - const adapter = await navigator.gpu.requestAdapter(); - const device = await adapter.requestDevice(); - Module.preinitializedWebGPUDevice = device; -} ); -#else // __EMSCRIPTEN__ static void handle_request_adapter(WGPURequestAdapterStatus status, WGPUAdapter adapter, WGPUStringView message, void* userdata1, void* userdata2) { if (status == WGPURequestAdapterStatus_Success) @@ -408,7 +397,6 @@ static WGPUDevice RequestDevice(WGPUInstance& instance, WGPUAdapter& adapter) IM_ASSERT(local_device && "Error on Device request"); return local_device; } -#endif // __EMSCRIPTEN__ #endif // IMGUI_IMPL_WEBGPU_BACKEND_WGPU bool InitWGPU(GLFWwindow* window) @@ -458,23 +446,6 @@ bool InitWGPU(GLFWwindow* window) instanceDesc.requiredFeatures = &timedWaitAny; wgpu_instance = wgpuCreateInstance(&instanceDesc); -#ifdef __EMSCRIPTEN__ - getAdapterAndDeviceViaJS(); - - wgpu_device = emscripten_webgpu_get_device(); - IM_ASSERT(wgpu_device != nullptr && "Error creating the Device"); - - WGPUSurfaceDescriptorFromCanvasHTMLSelector html_surface_desc = {}; - html_surface_desc.chain.sType = WGPUSType_SurfaceDescriptorFromCanvasHTMLSelector; - html_surface_desc.selector = "#canvas"; - - WGPUSurfaceDescriptor surface_desc = {}; - surface_desc.nextInChain = &html_surface_desc.chain; - - // Create the surface. - wgpu_surface = wgpuInstanceCreateSurface(wgpu_instance, &surface_desc); - preferred_fmt = wgpuSurfaceGetPreferredFormat(wgpu_surface, {} /* adapter */); -#else // __EMSCRIPTEN__ wgpuSetLogCallback( [](WGPULogLevel level, WGPUStringView msg, void* userdata) { fprintf(stderr, "%s: %.*s\n", ImGui_ImplWGPU_GetLogLevelName(level), (int)msg.length, msg.data); }, nullptr ); @@ -494,7 +465,6 @@ bool InitWGPU(GLFWwindow* window) wgpuSurfaceGetCapabilities(wgpu_surface, adapter, &surface_capabilities); preferred_fmt = surface_capabilities.formats[0]; -#endif // __EMSCRIPTEN__ #endif // IMGUI_IMPL_WEBGPU_BACKEND_WGPU wgpu_surface_configuration.presentMode = WGPUPresentMode_Fifo; diff --git a/examples/example_sdl2_wgpu/README.md b/examples/example_sdl2_wgpu/README.md index 7c88cc622..3a0f2a630 100644 --- a/examples/example_sdl2_wgpu/README.md +++ b/examples/example_sdl2_wgpu/README.md @@ -60,9 +60,10 @@ For the WASM code produced by Emscripten to work correctly, it will also be nece CMake checks the EMSCRIPEN version then: - if EMS >= 4.0.10 uses `--use-port=emdawnwebgpu` flag to build - it set `IMGUI_IMPL_WEBGPU_BACKEND_DAWN` compiler define - - if EMS < 4.0.10 the build aborts (`-sUSE_WEBGPU=1` is no longer supported in ImGui) + - if EMS < 4.0.10 the build aborts (`-sUSE_WEBGPU=1` is no longer supported by our examples and our WGPU backend) #### Generate Emscripten using external WebGPU library (emdawnwebgpu_pkg) + - `emcmake cmake -G Ninja -DIMGUI_EMSCRIPTEN_WEBGPU_FLAG="--use-port=path_to_emdawnwebgpu_pkg" -B where_to_build_dir` - it set `IMGUI_IMPL_WEBGPU_BACKEND_DAWN` compiler define - *To use external WebGPU library it's necessary to have EMS >= 4.0.10 or the minimum requirements specified by the package:* diff --git a/examples/example_sdl2_wgpu/main.cpp b/examples/example_sdl2_wgpu/main.cpp index 413097abd..b4c1be965 100644 --- a/examples/example_sdl2_wgpu/main.cpp +++ b/examples/example_sdl2_wgpu/main.cpp @@ -325,17 +325,6 @@ static WGPUDevice RequestDevice(wgpu::Instance& instance, wgpu::Adapter& adapter return acquired_device.MoveToCHandle(); } #elif defined(IMGUI_IMPL_WEBGPU_BACKEND_WGPU) -#ifdef __EMSCRIPTEN__ -// Adapter and device initialization via JS -EM_ASYNC_JS( void, getAdapterAndDeviceViaJS, (), -{ - if (!navigator.gpu) - throw Error("WebGPU not supported."); - const adapter = await navigator.gpu.requestAdapter(); - const device = await adapter.requestDevice(); - Module.preinitializedWebGPUDevice = device; -} ); -#else // __EMSCRIPTEN__ static void handle_request_adapter(WGPURequestAdapterStatus status, WGPUAdapter adapter, WGPUStringView message, void* userdata1, void* userdata2) { if (status == WGPURequestAdapterStatus_Success) @@ -392,7 +381,6 @@ static WGPUDevice RequestDevice(WGPUInstance& instance, WGPUAdapter& adapter) IM_ASSERT(local_device && "Error on Device request"); return local_device; } -#endif // __EMSCRIPTEN__ #endif // IMGUI_IMPL_WEBGPU_BACKEND_WGPU static bool InitWGPU(SDL_Window* window) @@ -443,23 +431,6 @@ static bool InitWGPU(SDL_Window* window) instanceDesc.requiredFeatures = &timedWaitAny; wgpu_instance = wgpuCreateInstance(&instanceDesc); -#ifdef __EMSCRIPTEN__ - getAdapterAndDeviceViaJS(); - - wgpu_device = emscripten_webgpu_get_device(); - assert(wgpu_device != nullptr && "Error creating the Device"); - - WGPUSurfaceDescriptorFromCanvasHTMLSelector html_surface_desc = {}; - html_surface_desc.chain.sType = WGPUSType_SurfaceDescriptorFromCanvasHTMLSelector; - html_surface_desc.selector = "#canvas"; - - WGPUSurfaceDescriptor surface_desc = {}; - surface_desc.nextInChain = &html_surface_desc.chain; - - // Create the surface. - wgpu_surface = wgpuInstanceCreateSurface(wgpu_instance, &surface_desc); - preferred_fmt = wgpuSurfaceGetPreferredFormat(wgpu_surface, {} /* adapter */); -#else // __EMSCRIPTEN__ wgpuSetLogCallback( [](WGPULogLevel level, WGPUStringView msg, void* userdata) { fprintf(stderr, "%s: %.*s\n", ImGui_ImplWGPU_GetLogLevelName(level), (int)msg.length, msg.data); }, nullptr ); @@ -479,7 +450,6 @@ static bool InitWGPU(SDL_Window* window) wgpuSurfaceGetCapabilities(wgpu_surface, adapter, &surface_capabilities); preferred_fmt = surface_capabilities.formats[0]; -#endif // __EMSCRIPTEN__ #endif // IMGUI_IMPL_WEBGPU_BACKEND_WGPU wgpu_surface_configuration.presentMode = WGPUPresentMode_Fifo; diff --git a/examples/example_sdl3_wgpu/README.md b/examples/example_sdl3_wgpu/README.md index 5c44df364..c7d6aec7b 100644 --- a/examples/example_sdl3_wgpu/README.md +++ b/examples/example_sdl3_wgpu/README.md @@ -60,9 +60,10 @@ For the WASM code produced by Emscripten to work correctly, it will also be nece CMake checks the EMSCRIPEN version then: - if EMS >= 4.0.10 uses `--use-port=emdawnwebgpu` flag to build - it set `IMGUI_IMPL_WEBGPU_BACKEND_DAWN` compiler define - - if EMS < 4.0.10 the build aborts (`-sUSE_WEBGPU=1` is no longer supported in ImGui) + - if EMS < 4.0.10 the build aborts (`-sUSE_WEBGPU=1` is no longer supported by our examples and our WGPU backend #### Generate Emscripten using external WebGPU library (emdawnwebgpu_pkg) + - `emcmake cmake -G Ninja -DIMGUI_EMSCRIPTEN_WEBGPU_FLAG="--use-port=path_to_emdawnwebgpu_pkg" -B where_to_build_dir` - it set `IMGUI_IMPL_WEBGPU_BACKEND_DAWN` compiler define - *To use external WebGPU library it's necessary to have EMS >= 4.0.10 or the minimum requirements specified by the package:* diff --git a/examples/example_sdl3_wgpu/main.cpp b/examples/example_sdl3_wgpu/main.cpp index 42b19b7c5..523d62156 100644 --- a/examples/example_sdl3_wgpu/main.cpp +++ b/examples/example_sdl3_wgpu/main.cpp @@ -336,17 +336,6 @@ static WGPUDevice RequestDevice(wgpu::Instance& instance, wgpu::Adapter& adapter return acquired_device.MoveToCHandle(); } #elif defined(IMGUI_IMPL_WEBGPU_BACKEND_WGPU) -#ifdef __EMSCRIPTEN__ -// Adapter and device initialization via JS -EM_ASYNC_JS( void, getAdapterAndDeviceViaJS, (), -{ - if (!navigator.gpu) - throw Error("WebGPU not supported."); - const adapter = await navigator.gpu.requestAdapter(); - const device = await adapter.requestDevice(); - Module.preinitializedWebGPUDevice = device; -} ); -#else // __EMSCRIPTEN__ static void handle_request_adapter(WGPURequestAdapterStatus status, WGPUAdapter adapter, WGPUStringView message, void* userdata1, void* userdata2) { if (status == WGPURequestAdapterStatus_Success) @@ -403,7 +392,6 @@ static WGPUDevice RequestDevice(WGPUInstance& instance, WGPUAdapter& adapter) IM_ASSERT(local_device && "Error on Device request"); return local_device; } -#endif // __EMSCRIPTEN__ #endif // IMGUI_IMPL_WEBGPU_BACKEND_WGPU static bool InitWGPU(SDL_Window* window) @@ -454,23 +442,6 @@ static bool InitWGPU(SDL_Window* window) instanceDesc.requiredFeatures = &timedWaitAny; wgpu_instance = wgpuCreateInstance(&instanceDesc); -#ifdef __EMSCRIPTEN__ - getAdapterAndDeviceViaJS(); - - wgpu_device = emscripten_webgpu_get_device(); - IM_ASSERT(wgpu_device != nullptr && "Error creating the Device"); - - WGPUSurfaceDescriptorFromCanvasHTMLSelector html_surface_desc = {}; - html_surface_desc.chain.sType = WGPUSType_SurfaceDescriptorFromCanvasHTMLSelector; - html_surface_desc.selector = "#canvas"; - - WGPUSurfaceDescriptor surface_desc = {}; - surface_desc.nextInChain = &html_surface_desc.chain; - - // Create the surface. - wgpu_surface = wgpuInstanceCreateSurface(wgpu_instance, &surface_desc); - preferred_fmt = wgpuSurfaceGetPreferredFormat(wgpu_surface, {} /* adapter */); -#else // __EMSCRIPTEN__ wgpuSetLogCallback( [](WGPULogLevel level, WGPUStringView msg, void* userdata) { fprintf(stderr, "%s: %.*s\n", ImGui_ImplWGPU_GetLogLevelName(level), (int)msg.length, msg.data); }, nullptr ); @@ -490,7 +461,6 @@ static bool InitWGPU(SDL_Window* window) wgpuSurfaceGetCapabilities(wgpu_surface, adapter, &surface_capabilities); preferred_fmt = surface_capabilities.formats[0]; -#endif // __EMSCRIPTEN__ #endif // IMGUI_IMPL_WEBGPU_BACKEND_WGPU wgpu_surface_configuration.presentMode = WGPUPresentMode_Fifo;