From 00b63708488bc40d89483c1fd4e857f662cd37d0 Mon Sep 17 00:00:00 2001 From: Peter Nimmervoll Date: Mon, 7 Nov 2022 21:35:05 +0100 Subject: [PATCH] Backends: WebGPU: fixed rendering when a depth buffer is enabled. (#5869) --- backends/imgui_impl_wgpu.cpp | 14 ++++++++------ backends/imgui_impl_wgpu.h | 4 ++-- docs/CHANGELOG.txt | 7 ++++--- examples/example_emscripten_wgpu/main.cpp | 2 +- 4 files changed, 15 insertions(+), 12 deletions(-) diff --git a/backends/imgui_impl_wgpu.cpp b/backends/imgui_impl_wgpu.cpp index 671c55427..c4bc5c76c 100644 --- a/backends/imgui_impl_wgpu.cpp +++ b/backends/imgui_impl_wgpu.cpp @@ -13,9 +13,10 @@ // CHANGELOG // (minor and older changes stripped away, please see git history for details) +// 2022-11-10: Fixed rendering when a depth buffer is enabled. Added 'WGPUTextureFormat depth_format' parameter to ImGui_ImplWGPU_Init(). // 2022-10-11: Using 'nullptr' instead of 'NULL' as per our switch to C++11. // 2021-11-29: Passing explicit buffer sizes to wgpuRenderPassEncoderSetVertexBuffer()/wgpuRenderPassEncoderSetIndexBuffer(). -// 2021-08-24: Fix for latest specs. +// 2021-08-24: Fixed for latest specs. // 2021-05-24: Add support for draw_data->FramebufferScale. // 2021-05-19: Replaced direct access to ImDrawCmd::TextureId with a call to ImDrawCmd::GetTexID(). (will become a requirement) // 2021-05-16: Update to latest WebGPU specs (compatible with Emscripten 2.0.20 and Chrome Canary 92). @@ -34,6 +35,7 @@ extern ImGuiID ImHashData(const void* data_p, size_t data_size, ImU32 seed = 0); static WGPUDevice g_wgpuDevice = nullptr; static WGPUQueue g_defaultQueue = nullptr; static WGPUTextureFormat g_renderTargetFormat = WGPUTextureFormat_Undefined; +static WGPUTextureFormat g_depthStencilFormat = WGPUTextureFormat_Undefined; static WGPURenderPipeline g_pipelineState = nullptr; struct RenderResources @@ -602,12 +604,11 @@ bool ImGui_ImplWGPU_CreateDeviceObjects() // Create depth-stencil State WGPUDepthStencilState depth_stencil_state = {}; - depth_stencil_state.depthBias = 0; - depth_stencil_state.depthBiasClamp = 0; - depth_stencil_state.depthBiasSlopeScale = 0; + depth_stencil_state.format = g_depthStencilFormat; + depth_stencil_state.depthWriteEnabled = false; // Configure disabled depth-stencil state - graphics_pipeline_desc.depthStencil = nullptr; + graphics_pipeline_desc.depthStencil = g_depthStencilFormat == WGPUTextureFormat_Undefined ? nullptr : &depth_stencil_state; g_pipelineState = wgpuDeviceCreateRenderPipeline(g_wgpuDevice, &graphics_pipeline_desc); @@ -658,7 +659,7 @@ void ImGui_ImplWGPU_InvalidateDeviceObjects() SafeRelease(g_pFrameResources[i]); } -bool ImGui_ImplWGPU_Init(WGPUDevice device, int num_frames_in_flight, WGPUTextureFormat rt_format) +bool ImGui_ImplWGPU_Init(WGPUDevice device, int num_frames_in_flight, WGPUTextureFormat rt_format, WGPUTextureFormat depth_format) { // Setup backend capabilities flags ImGuiIO& io = ImGui::GetIO(); @@ -668,6 +669,7 @@ bool ImGui_ImplWGPU_Init(WGPUDevice device, int num_frames_in_flight, WGPUTextur g_wgpuDevice = device; g_defaultQueue = wgpuDeviceGetQueue(g_wgpuDevice); g_renderTargetFormat = rt_format; + g_depthStencilFormat = depth_format; g_pFrameResources = new FrameResources[num_frames_in_flight]; g_numFramesInFlight = num_frames_in_flight; g_frameIndex = UINT_MAX; diff --git a/backends/imgui_impl_wgpu.h b/backends/imgui_impl_wgpu.h index ec10768e9..8bc1a39ae 100644 --- a/backends/imgui_impl_wgpu.h +++ b/backends/imgui_impl_wgpu.h @@ -6,7 +6,7 @@ // [X] Renderer: User texture binding. Use 'WGPUTextureView' as ImTextureID. Read the FAQ about ImTextureID! // [X] Renderer: Support for large meshes (64k+ vertices) with 16-bit indices. -// You can use unmodified imgui_impl_* files in your project. See examples/ folder for examples of using this. +// 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. // If you are new to Dear ImGui, read documentation from the docs/ folder + read the top of imgui.cpp. // Read online: https://github.com/ocornut/imgui/tree/master/docs @@ -15,7 +15,7 @@ #include "imgui.h" // IMGUI_IMPL_API #include -IMGUI_IMPL_API bool ImGui_ImplWGPU_Init(WGPUDevice device, int num_frames_in_flight, WGPUTextureFormat rt_format); +IMGUI_IMPL_API bool ImGui_ImplWGPU_Init(WGPUDevice device, int num_frames_in_flight, WGPUTextureFormat rt_format, WGPUTextureFormat depth_format = WGPUTextureFormat_Undefined); IMGUI_IMPL_API void ImGui_ImplWGPU_Shutdown(); IMGUI_IMPL_API void ImGui_ImplWGPU_NewFrame(); IMGUI_IMPL_API void ImGui_ImplWGPU_RenderDrawData(ImDrawData* draw_data, WGPURenderPassEncoder pass_encoder); diff --git a/docs/CHANGELOG.txt b/docs/CHANGELOG.txt index 39b5f95c6..60aa32fab 100644 --- a/docs/CHANGELOG.txt +++ b/docs/CHANGELOG.txt @@ -206,6 +206,9 @@ Other Changes: (e.g. for multi-viewport support) and don't capture mouse when drag and dropping. (#5710) - Backends: Win32: Convert WM_CHAR values with MultiByteToWideChar() when window class was registered as MBCS (not Unicode). (#5725, #1807, #471, #2815, #1060) [@or75, @ocornut] +- Backends: OSX: Fixed mouse inputs on flipped views. (#5756) [@Nemirtingas] +- Backends: OSX: Fixed mouse coordinate before clicking on the host window. (#5842) [@maezawa-akira] +- Backends: OSX: Fixes to support full app creation in C++. (#5403) [@stack] - Backends: OpenGL3: Reverted use of glBufferSubData(), too many corruptions issues were reported, and old leaks issues seemingly can't be reproed with Intel drivers nowadays (revert earlier changes). (#4468, #4504, #3381, #2981, #4825, #4832, #5127). @@ -213,9 +216,7 @@ Other Changes: - Backends: Metal: Add dispatch synchronization. (#5447) [@luigifcruz] - Backends: Metal: Update deprecated property 'sampleCount'->'rasterSampleCount'. (#5603) [@dcvz] - Backends: Vulkan: Added experimental ImGui_ImplVulkan_RemoveTexture() for api symetry. (#914, #5738). -- Backends: OSX: Fixed mouse inputs on flipped views. (#5756) [@Nemirtingas] -- Backends: OSX: Fixed mouse coordinate before clicking on the host window. (#5842) [@maezawa-akira] -- Backends: OSX: Fixes to support full app creation in C++. (#5403) [@stack] +- Backends: WebGPU: fixed rendering when a depth buffer is enabled. (#5869) [@brainlag] ----------------------------------------------------------------------- diff --git a/examples/example_emscripten_wgpu/main.cpp b/examples/example_emscripten_wgpu/main.cpp index 6dbc96a28..c34245935 100644 --- a/examples/example_emscripten_wgpu/main.cpp +++ b/examples/example_emscripten_wgpu/main.cpp @@ -76,7 +76,7 @@ int main(int, char**) // Setup Platform/Renderer backends ImGui_ImplGlfw_InitForOther(window, true); - ImGui_ImplWGPU_Init(wgpu_device, 3, WGPUTextureFormat_RGBA8Unorm); + ImGui_ImplWGPU_Init(wgpu_device, 3, WGPUTextureFormat_RGBA8Unorm, WGPUTextureFormat_Undefined); // Load Fonts // - If no fonts are loaded, dear imgui will use the default font. You can also load multiple fonts and use ImGui::PushFont()/PopFont() to select them.