diff --git a/imgui.cpp b/imgui.cpp index d869da7fe..f5c4330e8 100644 --- a/imgui.cpp +++ b/imgui.cpp @@ -5211,16 +5211,24 @@ void ImGui::UpdateHoveredWindowAndCaptureFlags(const ImVec2& mouse_pos) io.WantTextInput = (g.WantTextInputNextFrame != -1) ? (g.WantTextInputNextFrame != 0) : false; } -// FIXME-NEWATLAS-V2: If we aim to support multiple atlases used by same context: how to reach/target all atlases? static void ImGui::UpdateTexturesNewFrame() { + // Cannot update every atlases based on atlas's FrameCount < g.FrameCount, because an atlas may be shared by multiple contexts with different frame count. ImGuiContext& g = *GImGui; + const bool has_textures = (g.IO.BackendFlags & ImGuiBackendFlags_RendererHasTextures) != 0; for (ImFontAtlas* atlas : g.FontAtlases) + { if (atlas->OwnerContext == &g) { - atlas->RendererHasTextures = (g.IO.BackendFlags & ImGuiBackendFlags_RendererHasTextures) != 0; + atlas->RendererHasTextures = has_textures; ImFontAtlasUpdateNewFrame(atlas, g.FrameCount); } + else + { + IM_ASSERT(atlas->Builder != NULL && atlas->Builder->FrameCount != -1 && "If you manage font atlases yourself you need to call ImFontAtlasUpdateNewFrame() on it."); + IM_ASSERT(atlas->RendererHasTextures == has_textures && "If you manage font atlases yourself make sure atlas->RendererHasTextures is set consistently with all contexts using it."); + } + } } // Build a single texture list diff --git a/imgui_draw.cpp b/imgui_draw.cpp index e84de2baa..e0d34c977 100644 --- a/imgui_draw.cpp +++ b/imgui_draw.cpp @@ -2715,11 +2715,14 @@ static void ImFontAtlasBuildUpdateRendererHasTexturesFromContext(ImFontAtlas* at } } -// Called by NewFrame(). When multiple context own the atlas, only the first one calls this. -// If you are calling this yourself, ensure atlas->RendererHasTextures is set. +// Called by NewFrame() for atlases owned by a context. +// If you manually manage font atlases, you'll need to call this yourself + ensure atlas->RendererHasTextures is set. // 'frame_count' needs to be provided because we can gc/prioritize baked fonts based on their age. +// 'frame_count' may not match those of imgui contexts using this atlas, as contexts may be updated as different frequencies. void ImFontAtlasUpdateNewFrame(ImFontAtlas* atlas, int frame_count) { + IM_ASSERT(atlas->Builder == NULL || atlas->Builder->FrameCount < frame_count); // Protection against being called twice? + // Check that font atlas was built or backend support texture reload in which case we can build now if (atlas->RendererHasTextures) { diff --git a/imgui_internal.h b/imgui_internal.h index 55ca3ba89..62b98f1f0 100644 --- a/imgui_internal.h +++ b/imgui_internal.h @@ -3787,7 +3787,7 @@ struct ImFontAtlasBuilder ImFontAtlasRectId PackIdMouseCursors; // White pixel + mouse cursors. Also happen to be fallback in case of packing failure. ImFontAtlasRectId PackIdLinesTexData; - ImFontAtlasBuilder() { memset(this, 0, sizeof(*this)); RectsIndexFreeListStart = -1; PackIdMouseCursors = PackIdLinesTexData = -1; } + ImFontAtlasBuilder() { memset(this, 0, sizeof(*this)); FrameCount = -1; RectsIndexFreeListStart = -1; PackIdMouseCursors = PackIdLinesTexData = -1; } }; IMGUI_API void ImFontAtlasBuildInit(ImFontAtlas* atlas);