From 22e121f4e47542a41c6301ee2438b075f689942d Mon Sep 17 00:00:00 2001 From: pedrosland Date: Sat, 11 Jul 2026 15:19:12 +0100 Subject: [PATCH] Fix unreadable overlay elements in 3D view on XWayland/Intel (#11557) Fix unreadable overlay elements in 3D view on XWayland/Intel - closes #10287 --- src/slic3r/GUI/ImGuiWrapper.cpp | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/src/slic3r/GUI/ImGuiWrapper.cpp b/src/slic3r/GUI/ImGuiWrapper.cpp index d4d08aa84f..c7609be5ef 100644 --- a/src/slic3r/GUI/ImGuiWrapper.cpp +++ b/src/slic3r/GUI/ImGuiWrapper.cpp @@ -2781,6 +2781,11 @@ void ImGuiWrapper::init_font(bool compress) builder.BuildRanges(&ranges); // Build the final result (ordered ranges with all the unique characters submitted) io.Fonts->Flags |= ImFontAtlasFlags_NoPowerOfTwoHeight; + // TexDesiredWidth will be increased adaptively below if the built height + // exceeds GL_MAX_TEXTURE_SIZE. Leave it at 0 so ImGui picks the minimum + // width for small glyph sets and we only widen when actually necessary. + io.Fonts->TexDesiredWidth = 0; + ImFontConfig cfg = ImFontConfig(); cfg.OversampleH = cfg.OversampleV = 1; //FIXME replace with io.Fonts->AddFontFromMemoryTTF(buf_decompressed_data, (int)buf_decompressed_size, m_font_size, nullptr, ranges.Data); @@ -2852,7 +2857,23 @@ void ImGuiWrapper::init_font(bool compress) io.Fonts->AddCustomRectFontGlyph(default_font, icon.first, icon_sz * 4, icon_sz * 4, 3.0 * font_scale + icon_sz * 4); } - // Build texture atlas + // Build texture atlas, widening it if the height would exceed GL_MAX_TEXTURE_SIZE. + // Increasing the width allows the packing algorithm to grow more horizontally which reduces the height. + io.Fonts->Build(); + GLint gl_max_tex_size = 0; + glsafe(::glGetIntegerv(GL_MAX_TEXTURE_SIZE, &gl_max_tex_size)); + constexpr int max_retries = 6; + for (int attempt = 0; attempt < max_retries && io.Fonts->TexHeight > gl_max_tex_size; ++attempt) { + io.Fonts->TexDesiredWidth = (io.Fonts->TexDesiredWidth > 0 ? io.Fonts->TexDesiredWidth : io.Fonts->TexWidth) * 2; + io.Fonts->Build(); + } + if (io.Fonts->TexHeight > gl_max_tex_size) { + // Shouldn't really happen + BOOST_LOG_TRIVIAL(error) << "Font atlas height " << io.Fonts->TexHeight + << " still exceeds GL_MAX_TEXTURE_SIZE (" << gl_max_tex_size << ")" + << " after " << max_retries << " attempts; rendering may be incomplete"; + } + unsigned char* pixels; int width, height; io.Fonts->GetTexDataAsRGBA32(&pixels, &width, &height); // Load as RGBA 32-bits (75% of the memory is wasted, but default font is so small) because it is more likely to be compatible with user's existing shaders. If your ImTextureId represent a higher-level concept than just a GL texture id, consider calling GetTexDataAsAlpha8() instead to save on GPU memory.