|
|
@@ -1,6 +1,6 @@
|
|
|
// dear imgui: Renderer for WebGPU
|
|
|
-// This needs to be used along with a Platform Binding (e.g. GLFW)
|
|
|
-// (Please note that WebGPU is currently experimental, will not run on non-beta browsers, and may break.)
|
|
|
+// This needs to be used along with a Platform Binding (e.g. GLFW, SDL2, SDL3)
|
|
|
+// (Please note that WebGPU is a recent API, may not be supported by all browser, and its ecosystem is generally a mess)
|
|
|
|
|
|
// Implemented features:
|
|
|
// [X] Renderer: User texture binding. Use 'WGPUTextureView' as ImTextureID. Read the FAQ about ImTextureID/ImTextureRef!
|
|
|
@@ -8,6 +8,8 @@
|
|
|
// [X] Renderer: Expose selected render state for draw callbacks to use. Access in '(ImGui_ImplXXXX_RenderState*)GetPlatformIO().Renderer_RenderState'.
|
|
|
// [X] Renderer: Texture updates support for dynamic font system (ImGuiBackendFlags_RendererHasTextures).
|
|
|
|
|
|
+// Read imgui_impl_wgpu.h about how to use the IMGUI_IMPL_WEBGPU_BACKEND_WGPU or IMGUI_IMPL_WEBGPU_BACKEND_DAWN flags.
|
|
|
+
|
|
|
// You can use unmodified imgui_impl_* files in your project. See examples/ folder for examples of using this.
|
|
|
// Prefer including the entire imgui/ repository into your project (either as a copy or as a submodule), and only build the backends you need.
|
|
|
// Learn about Dear ImGui:
|
|
|
@@ -18,6 +20,7 @@
|
|
|
|
|
|
// CHANGELOG
|
|
|
// (minor and older changes stripped away, please see git history for details)
|
|
|
+// 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)
|
|
|
// 2025-02-26: Recreate image bind groups during render. (#8426, #8046, #7765, #8027) + Update for latest webgpu-native changes.
|
|
|
@@ -46,20 +49,20 @@
|
|
|
|
|
|
#include "imgui.h"
|
|
|
|
|
|
-// When targeting native platforms (i.e. NOT Emscripten), one of IMGUI_IMPL_WEBGPU_BACKEND_DAWN
|
|
|
-// or IMGUI_IMPL_WEBGPU_BACKEND_WGPU must be provided. See imgui_impl_wgpu.h for more details.
|
|
|
-#ifndef __EMSCRIPTEN__
|
|
|
- #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
|
|
|
-#else
|
|
|
- #if defined(IMGUI_IMPL_WEBGPU_BACKEND_DAWN) || defined(IMGUI_IMPL_WEBGPU_BACKEND_WGPU)
|
|
|
- #error neither IMGUI_IMPL_WEBGPU_BACKEND_DAWN nor IMGUI_IMPL_WEBGPU_BACKEND_WGPU may be defined if targeting emscripten!
|
|
|
- #endif
|
|
|
-#endif
|
|
|
-
|
|
|
#ifndef IMGUI_DISABLE
|
|
|
#include "imgui_impl_wgpu.h"
|
|
|
+
|
|
|
+// One of IMGUI_IMPL_WEBGPU_BACKEND_DAWN or IMGUI_IMPL_WEBGPU_BACKEND_WGPU must be provided. See imgui_impl_wgpu.h for more details.
|
|
|
+#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
|
|
|
+
|
|
|
+// This condition is true when it's built with EMSCRIPTEN using -sUSE_WEBGPU=1 flag (deprecated from 4.0.10)
|
|
|
+// This condition is false for all other 3 cases: WGPU-Native, DAWN-Native or DAWN-EMSCRIPTEN (using --use-port=emdawnwebgpu flag)
|
|
|
+#if defined(__EMSCRIPTEN__) && defined(IMGUI_IMPL_WEBGPU_BACKEND_WGPU)
|
|
|
+#define IMGUI_IMPL_WEBGPU_BACKEND_WGPU_EMSCRIPTEN
|
|
|
+#endif
|
|
|
+
|
|
|
#include <limits.h>
|
|
|
#include <webgpu/webgpu.h>
|
|
|
|
|
|
@@ -259,7 +262,7 @@ static WGPUProgrammableStageDescriptor ImGui_ImplWGPU_CreateShaderModule(const c
|
|
|
{
|
|
|
ImGui_ImplWGPU_Data* bd = ImGui_ImplWGPU_GetBackendData();
|
|
|
|
|
|
-#if defined(IMGUI_IMPL_WEBGPU_BACKEND_DAWN) || defined(IMGUI_IMPL_WEBGPU_BACKEND_WGPU)
|
|
|
+#if !defined(IMGUI_IMPL_WEBGPU_BACKEND_WGPU_EMSCRIPTEN)
|
|
|
WGPUShaderSourceWGSL wgsl_desc = {};
|
|
|
wgsl_desc.chain.sType = WGPUSType_ShaderSourceWGSL;
|
|
|
wgsl_desc.code = { wgsl_source, WGPU_STRLEN };
|
|
|
@@ -275,7 +278,7 @@ static WGPUProgrammableStageDescriptor ImGui_ImplWGPU_CreateShaderModule(const c
|
|
|
WGPUProgrammableStageDescriptor stage_desc = {};
|
|
|
stage_desc.module = wgpuDeviceCreateShaderModule(bd->wgpuDevice, &desc);
|
|
|
|
|
|
-#if defined(IMGUI_IMPL_WEBGPU_BACKEND_DAWN) || defined(IMGUI_IMPL_WEBGPU_BACKEND_WGPU)
|
|
|
+#if !defined(IMGUI_IMPL_WEBGPU_BACKEND_WGPU_EMSCRIPTEN)
|
|
|
stage_desc.entryPoint = { "main", WGPU_STRLEN };
|
|
|
#else
|
|
|
stage_desc.entryPoint = "main";
|
|
|
@@ -398,9 +401,10 @@ void ImGui_ImplWGPU_RenderDrawData(ImDrawData* draw_data, WGPURenderPassEncoder
|
|
|
WGPUBufferDescriptor vb_desc =
|
|
|
{
|
|
|
nullptr,
|
|
|
+#if !defined(IMGUI_IMPL_WEBGPU_BACKEND_WGPU_EMSCRIPTEN)
|
|
|
+ { "Dear ImGui Vertex buffer", WGPU_STRLEN, },
|
|
|
+#else
|
|
|
"Dear ImGui Vertex buffer",
|
|
|
-#if defined(IMGUI_IMPL_WEBGPU_BACKEND_DAWN) || defined(IMGUI_IMPL_WEBGPU_BACKEND_WGPU)
|
|
|
- WGPU_STRLEN,
|
|
|
#endif
|
|
|
WGPUBufferUsage_CopyDst | WGPUBufferUsage_Vertex,
|
|
|
MEMALIGN(fr->VertexBufferSize * sizeof(ImDrawVert), 4),
|
|
|
@@ -425,9 +429,10 @@ void ImGui_ImplWGPU_RenderDrawData(ImDrawData* draw_data, WGPURenderPassEncoder
|
|
|
WGPUBufferDescriptor ib_desc =
|
|
|
{
|
|
|
nullptr,
|
|
|
+#if !defined(IMGUI_IMPL_WEBGPU_BACKEND_WGPU_EMSCRIPTEN)
|
|
|
+ { "Dear ImGui Index buffer", WGPU_STRLEN, },
|
|
|
+#else
|
|
|
"Dear ImGui Index buffer",
|
|
|
-#if defined(IMGUI_IMPL_WEBGPU_BACKEND_DAWN) || defined(IMGUI_IMPL_WEBGPU_BACKEND_WGPU)
|
|
|
- WGPU_STRLEN,
|
|
|
#endif
|
|
|
WGPUBufferUsage_CopyDst | WGPUBufferUsage_Index,
|
|
|
MEMALIGN(fr->IndexBufferSize * sizeof(ImDrawIdx), 4),
|
|
|
@@ -560,7 +565,7 @@ void ImGui_ImplWGPU_UpdateTexture(ImTextureData* tex)
|
|
|
|
|
|
// Create texture
|
|
|
WGPUTextureDescriptor tex_desc = {};
|
|
|
-#if defined(IMGUI_IMPL_WEBGPU_BACKEND_DAWN) || defined(IMGUI_IMPL_WEBGPU_BACKEND_WGPU)
|
|
|
+#if !defined(IMGUI_IMPL_WEBGPU_BACKEND_WGPU_EMSCRIPTEN)
|
|
|
tex_desc.label = { "Dear ImGui Texture", WGPU_STRLEN };
|
|
|
#else
|
|
|
tex_desc.label = "Dear ImGui Texture";
|
|
|
@@ -605,7 +610,7 @@ void ImGui_ImplWGPU_UpdateTexture(ImTextureData* tex)
|
|
|
|
|
|
// Update full texture or selected blocks. We only ever write to textures regions which have never been used before!
|
|
|
// This backend choose to use tex->UpdateRect but you can use tex->Updates[] to upload individual regions.
|
|
|
-#if defined(IMGUI_IMPL_WEBGPU_BACKEND_DAWN) || defined(IMGUI_IMPL_WEBGPU_BACKEND_WGPU)
|
|
|
+#if !defined(IMGUI_IMPL_WEBGPU_BACKEND_WGPU_EMSCRIPTEN)
|
|
|
WGPUTexelCopyTextureInfo dst_view = {};
|
|
|
#else
|
|
|
WGPUImageCopyTexture dst_view = {};
|
|
|
@@ -614,7 +619,7 @@ void ImGui_ImplWGPU_UpdateTexture(ImTextureData* tex)
|
|
|
dst_view.mipLevel = 0;
|
|
|
dst_view.origin = { (uint32_t)upload_x, (uint32_t)upload_y, 0 };
|
|
|
dst_view.aspect = WGPUTextureAspect_All;
|
|
|
-#if defined(IMGUI_IMPL_WEBGPU_BACKEND_DAWN) || defined(IMGUI_IMPL_WEBGPU_BACKEND_WGPU)
|
|
|
+#if !defined(IMGUI_IMPL_WEBGPU_BACKEND_WGPU_EMSCRIPTEN)
|
|
|
WGPUTexelCopyBufferLayout layout = {};
|
|
|
#else
|
|
|
WGPUTextureDataLayout layout = {};
|
|
|
@@ -636,9 +641,10 @@ static void ImGui_ImplWGPU_CreateUniformBuffer()
|
|
|
WGPUBufferDescriptor ub_desc =
|
|
|
{
|
|
|
nullptr,
|
|
|
+#if !defined(IMGUI_IMPL_WEBGPU_BACKEND_WGPU_EMSCRIPTEN)
|
|
|
+ { "Dear ImGui Uniform buffer", WGPU_STRLEN, },
|
|
|
+#else
|
|
|
"Dear ImGui Uniform buffer",
|
|
|
-#if defined(IMGUI_IMPL_WEBGPU_BACKEND_DAWN) || defined(IMGUI_IMPL_WEBGPU_BACKEND_WGPU)
|
|
|
- WGPU_STRLEN,
|
|
|
#endif
|
|
|
WGPUBufferUsage_CopyDst | WGPUBufferUsage_Uniform,
|
|
|
MEMALIGN(sizeof(Uniforms), 16),
|
|
|
@@ -751,7 +757,7 @@ bool ImGui_ImplWGPU_CreateDeviceObjects()
|
|
|
// Create depth-stencil State
|
|
|
WGPUDepthStencilState depth_stencil_state = {};
|
|
|
depth_stencil_state.format = bd->depthStencilFormat;
|
|
|
-#if defined(IMGUI_IMPL_WEBGPU_BACKEND_DAWN) || defined(IMGUI_IMPL_WEBGPU_BACKEND_WGPU)
|
|
|
+#if !defined(IMGUI_IMPL_WEBGPU_BACKEND_WGPU_EMSCRIPTEN)
|
|
|
depth_stencil_state.depthWriteEnabled = WGPUOptionalBool_False;
|
|
|
#else
|
|
|
depth_stencil_state.depthWriteEnabled = false;
|
|
|
@@ -833,14 +839,18 @@ bool ImGui_ImplWGPU_Init(ImGui_ImplWGPU_InitInfo* init_info)
|
|
|
// Setup backend capabilities flags
|
|
|
ImGui_ImplWGPU_Data* bd = IM_NEW(ImGui_ImplWGPU_Data)();
|
|
|
io.BackendRendererUserData = (void*)bd;
|
|
|
+#if defined(IMGUI_IMPL_WEBGPU_BACKEND_DAWN)
|
|
|
#if defined(__EMSCRIPTEN__)
|
|
|
- io.BackendRendererName = "imgui_impl_webgpu_emscripten";
|
|
|
-#elif defined(IMGUI_IMPL_WEBGPU_BACKEND_DAWN)
|
|
|
- io.BackendRendererName = "imgui_impl_webgpu_dawn";
|
|
|
+ io.BackendRendererName = "imgui_impl_wgpu (Dawn, Emscripten)"; // compiled & linked using EMSCRIPTEN with "--use-port=emdawnwebgpu" flag
|
|
|
+#else
|
|
|
+ io.BackendRendererName = "imgui_impl_wgpu (Dawn, Native)";
|
|
|
+#endif
|
|
|
#elif defined(IMGUI_IMPL_WEBGPU_BACKEND_WGPU)
|
|
|
- io.BackendRendererName = "imgui_impl_webgpu_wgpu";
|
|
|
+#if defined(__EMSCRIPTEN__)
|
|
|
+ io.BackendRendererName = "imgui_impl_wgpu (WGPU, Emscripten)"; // linked using EMSCRIPTEN with "-sUSE_WEBGPU=1" flag, deprecated from EMSCRIPTEN 4.0.10
|
|
|
#else
|
|
|
- io.BackendRendererName = "imgui_impl_webgpu";
|
|
|
+ io.BackendRendererName = "imgui_impl_wgpu (WGPU, Native)";
|
|
|
+#endif
|
|
|
#endif
|
|
|
io.BackendFlags |= ImGuiBackendFlags_RendererHasVtxOffset; // We can honor the ImDrawCmd::VtxOffset field, allowing for large meshes.
|
|
|
io.BackendFlags |= ImGuiBackendFlags_RendererHasTextures; // We can honor ImGuiPlatformIO::Textures[] requests during render.
|