Open dkaste opened 3 days ago
Hello,
Do you have a suggested solution as to how to decently solve this?
I'm not sure WebGPU exposes any kind of truly unique identifier for resources.
The only decent solution I can think of is to remove the cache, use WGPUBindGroup as ImTextureID, and provide a helper function for the user to create bind groups from texture views. It would unfortunately require the user to manually manage those bind groups, which kind of feels like it goes against the spirit of IMGUI.
I don't really know/understand WebGPU yet but I would assume we could call wgpuDeviceCreateBindGroup()
one time per frame with a list of all unique WGPUTextureView, and then call wgpuRenderPassEncoderSetBindGroup()
with the right index?
So we remove bd->ImageBindGroups[]
as a persistent storage, instead we use it as temporary storage during the frame:
That sounds like a reasonable solution. I'm new to WebGPU as well, so that didn't even occur to me.
It might be worth supporting multiple bind groups for "chunks", since WGPULimits::maxBindingsPerBindGroup
could be as low as 640.
Edit: Actually, I think such a solution would require the proposed binding_array
feature, which isn't in the spec yet.
Let's start with a single bind group and we can easily change it to multiple of them based on runtime limits.
I don't have test code for loading a texture in the WebGPU example so one would be helpful but otherwise I'll work toward one eventually.
Version/Branch of Dear ImGui:
Version 1.90.6, Branch: docking (through cimgui)
Back-ends:
imgui_impl_glfw.cpp + imgui_impl_wgpu.cpp
Compiler, OS:
Windows 10 + Zig (MSVC)
Full config/build information:
No response
Details:
My Issue/Question:
The WebGPU backend keeps a cache of
WGPUBindGroup
s that internally referenceWGPUTextureView
s which are simply typedef'd opaque pointers. The backend uses a hash of the texture view pointer as the key for the cache. If a texture view is destroyed and another is created with the same pointer, the old, stale bind group will be used.I ran into this when rapidly creating/destroying textures to resize a custom 3D viewport embedded in IMGUI.
My current workaround is to manually clear the internal bind group cache whenever changing textures used in IMGUI. It works, but it's far from ideal.
Screenshots/Video:
No response
Minimal, Complete and Verifiable Example code:
No response