瀏覽代碼

Textures: Fixed not updating ImTextureData's RefCount when destroying a context using a shared ImFontAtlas. (#8975)

ocornut 1 周之前
父節點
當前提交
9809b0b061
共有 3 個文件被更改,包括 8 次插入1 次删除
  1. 1 1
      backends/imgui_impl_dx11.cpp
  2. 3 0
      docs/CHANGELOG.txt
  3. 4 0
      imgui.cpp

+ 1 - 1
backends/imgui_impl_dx11.cpp

@@ -596,7 +596,7 @@ void    ImGui_ImplDX11_InvalidateDeviceObjects()
         if (tex->RefCount == 1)
             ImGui_ImplDX11_DestroyTexture(tex);
 
-    if (bd->pTexSamplerLinear)    { bd->pTexSamplerLinear->Release(); bd->pTexSamplerLinear = nullptr; }
+    if (bd->pTexSamplerLinear)      { bd->pTexSamplerLinear->Release(); bd->pTexSamplerLinear = nullptr; }
     if (bd->pIB)                    { bd->pIB->Release(); bd->pIB = nullptr; }
     if (bd->pVB)                    { bd->pVB->Release(); bd->pVB = nullptr; }
     if (bd->pBlendState)            { bd->pBlendState->Release(); bd->pBlendState = nullptr; }

+ 3 - 0
docs/CHANGELOG.txt

@@ -71,6 +71,9 @@ Other Changes:
   See misc/debuggers/ for details. (#8950) [@mentlerd]
 - Textures: fixed an issue preventing multi-contexts sharing a ImFontAtlas from
   being possible to destroy in any order.
+- Textures: fixed not updating ImTextureData's RefCount when destroying a context
+  using a shared ImFontAtlas, leading standard backends to not properly free
+  texture resources. (#8975) [@icrashstuff]
 - CI: Updates Windows CI scripts to generate/use VulkanSDK. (#8925, #8778) [@yaz0r]
 - Backends: all backends call ImGuiPlatformIO::ClearPlatformHandlers() and
   ClearRendererHandlers() on shutdown, so as not to leave function pointers

+ 4 - 0
imgui.cpp

@@ -8841,6 +8841,8 @@ void ImGui::RegisterFontAtlas(ImFontAtlas* atlas)
     atlas->RefCount++;
     g.FontAtlases.push_back(atlas);
     ImFontAtlasAddDrawListSharedData(atlas, &g.DrawListSharedData);
+    for (ImTextureData* tex : atlas->TexList)
+        tex->RefCount = (unsigned short)atlas->RefCount;
 }
 
 void ImGui::UnregisterFontAtlas(ImFontAtlas* atlas)
@@ -8850,6 +8852,8 @@ void ImGui::UnregisterFontAtlas(ImFontAtlas* atlas)
     ImFontAtlasRemoveDrawListSharedData(atlas, &g.DrawListSharedData);
     g.FontAtlases.find_erase(atlas);
     atlas->RefCount--;
+    for (ImTextureData* tex : atlas->TexList)
+        tex->RefCount = (unsigned short)atlas->RefCount;
 }
 
 // Use ImDrawList::_SetTexture(), making our shared g.FontStack[] authoritative against window-local ImDrawList.