Use shared font atlas and fix crash when opening overlay in some games.
							parent
							
								
									de6805dd8b
								
							
						
					
					
						commit
						c9a102ee30
					
				| 
						 | 
					@ -39,7 +39,8 @@ class Renderer_Hook
 | 
				
			||||||
public:
 | 
					public:
 | 
				
			||||||
    Renderer_Hook():
 | 
					    Renderer_Hook():
 | 
				
			||||||
        OverlayProc(&DefaultOverlayProc),
 | 
					        OverlayProc(&DefaultOverlayProc),
 | 
				
			||||||
        OverlayHookReady(&DefaultOverlayHookReady)
 | 
					        OverlayHookReady(&DefaultOverlayHookReady),
 | 
				
			||||||
 | 
					        ImGuiFontAtlas(nullptr)
 | 
				
			||||||
    {}
 | 
					    {}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    static void DefaultOverlayProc() {}
 | 
					    static void DefaultOverlayProc() {}
 | 
				
			||||||
| 
						 | 
					@ -47,6 +48,7 @@ public:
 | 
				
			||||||
    std::function<void()> OverlayProc;
 | 
					    std::function<void()> OverlayProc;
 | 
				
			||||||
    std::function<void(bool)> OverlayHookReady;
 | 
					    std::function<void(bool)> OverlayHookReady;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    void *ImGuiFontAtlas;
 | 
				
			||||||
    virtual bool StartHook(std::function<bool(bool)> key_combination_callback, std::set<ToggleKey> toggle_keys) = 0;
 | 
					    virtual bool StartHook(std::function<bool(bool)> key_combination_callback, std::set<ToggleKey> toggle_keys) = 0;
 | 
				
			||||||
    virtual bool IsStarted() = 0;
 | 
					    virtual bool IsStarted() = 0;
 | 
				
			||||||
    // Returns a Handle to the renderer image ressource or nullptr if it failed to create the resource, the handle can be used in ImGui's Image calls, image_buffer must be RGBA ordered
 | 
					    // Returns a Handle to the renderer image ressource or nullptr if it failed to create the resource, the handle can be used in ImGui's Image calls, image_buffer must be RGBA ordered
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -84,7 +84,7 @@ void OpenGLX_Hook::_PrepareForOverlay(Display* display, GLXDrawable drawable)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    if( !_Initialized )
 | 
					    if( !_Initialized )
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        ImGui::CreateContext();
 | 
					        ImGui::CreateContext((ImFontAtlas *)ImGuiFontAtlas);
 | 
				
			||||||
        ImGui_ImplOpenGL3_Init();
 | 
					        ImGui_ImplOpenGL3_Init();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        //int attributes[] = { //can't be const b/c X11 doesn't like it.  Not sure if that's intentional or just stupid.
 | 
					        //int attributes[] = { //can't be const b/c X11 doesn't like it.  Not sure if that's intentional or just stupid.
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -128,7 +128,8 @@ Steam_Overlay::Steam_Overlay(Settings* settings, SteamCallResults* callback_resu
 | 
				
			||||||
    i_have_lobby(false),
 | 
					    i_have_lobby(false),
 | 
				
			||||||
    show_achievements(false),
 | 
					    show_achievements(false),
 | 
				
			||||||
    show_settings(false),
 | 
					    show_settings(false),
 | 
				
			||||||
    _renderer(nullptr)
 | 
					    _renderer(nullptr),
 | 
				
			||||||
 | 
					    fonts_atlas(nullptr)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    strncpy(username_text, settings->get_local_name(), sizeof(username_text));
 | 
					    strncpy(username_text, settings->get_local_name(), sizeof(username_text));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -709,11 +710,10 @@ void Steam_Overlay::BuildNotifications(int width, int height)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void Steam_Overlay::CreateFonts()
 | 
					void Steam_Overlay::CreateFonts()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    //TODO: remove from dx_whatever hook
 | 
					    if (fonts_atlas) return;
 | 
				
			||||||
    if(ImGui::GetCurrentContext() == nullptr)
 | 
					
 | 
				
			||||||
        ImGui::CreateContext();
 | 
					    ImFontAtlas *Fonts = new ImFontAtlas();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    ImGuiIO& io = ImGui::GetIO();
 | 
					 | 
				
			||||||
    ImFontConfig fontcfg;
 | 
					    ImFontConfig fontcfg;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    float font_size = 16.0;
 | 
					    float font_size = 16.0;
 | 
				
			||||||
| 
						 | 
					@ -727,7 +727,7 @@ void Steam_Overlay::CreateFonts()
 | 
				
			||||||
        font_builder.AddText(x.description.c_str());
 | 
					        font_builder.AddText(x.description.c_str());
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    font_builder.AddRanges(io.Fonts->GetGlyphRangesDefault());
 | 
					    font_builder.AddRanges(Fonts->GetGlyphRangesDefault());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    ImVector<ImWchar> ranges;
 | 
					    ImVector<ImWchar> ranges;
 | 
				
			||||||
    font_builder.BuildRanges(&ranges);
 | 
					    font_builder.BuildRanges(&ranges);
 | 
				
			||||||
| 
						 | 
					@ -744,11 +744,11 @@ void Steam_Overlay::CreateFonts()
 | 
				
			||||||
    ImFont *font = NULL;
 | 
					    ImFont *font = NULL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#if defined(__WINDOWS__)
 | 
					#if defined(__WINDOWS__)
 | 
				
			||||||
    font = io.Fonts->AddFontFromFileTTF("C:\\Windows\\Fonts\\micross.ttf", font_size, &fontcfg);
 | 
					    font = Fonts->AddFontFromFileTTF("C:\\Windows\\Fonts\\micross.ttf", font_size, &fontcfg);
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (!font) {
 | 
					    if (!font) {
 | 
				
			||||||
        font = io.Fonts->AddFontDefault(&fontcfg);
 | 
					        font = Fonts->AddFontDefault(&fontcfg);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    font_notif = font_default = font;
 | 
					    font_notif = font_default = font;
 | 
				
			||||||
| 
						 | 
					@ -757,15 +757,16 @@ void Steam_Overlay::CreateFonts()
 | 
				
			||||||
        PRINT_DEBUG("loading extra fonts\n");
 | 
					        PRINT_DEBUG("loading extra fonts\n");
 | 
				
			||||||
        fontcfg.MergeMode = true;
 | 
					        fontcfg.MergeMode = true;
 | 
				
			||||||
#if defined(__WINDOWS__)
 | 
					#if defined(__WINDOWS__)
 | 
				
			||||||
        io.Fonts->AddFontFromFileTTF("C:\\Windows\\Fonts\\simsun.ttc", font_size, &fontcfg);
 | 
					        Fonts->AddFontFromFileTTF("C:\\Windows\\Fonts\\simsun.ttc", font_size, &fontcfg);
 | 
				
			||||||
        io.Fonts->AddFontFromFileTTF("C:\\Windows\\Fonts\\malgun.ttf", font_size, &fontcfg);
 | 
					        Fonts->AddFontFromFileTTF("C:\\Windows\\Fonts\\malgun.ttf", font_size, &fontcfg);
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    io.Fonts->Build();
 | 
					    Fonts->Build();
 | 
				
			||||||
 | 
					    fonts_atlas = (void *)Fonts;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    ImGuiStyle& style = ImGui::GetStyle();
 | 
					    // ImGuiStyle& style = ImGui::GetStyle();
 | 
				
			||||||
    style.WindowRounding = 0.0; // Disable round window
 | 
					    // style.WindowRounding = 0.0; // Disable round window
 | 
				
			||||||
    reset_LastError();
 | 
					    reset_LastError();
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1048,6 +1049,7 @@ void Steam_Overlay::RunCallbacks()
 | 
				
			||||||
            auto callback = std::bind(&Steam_Overlay::OpenOverlayHook, this, std::placeholders::_1);
 | 
					            auto callback = std::bind(&Steam_Overlay::OpenOverlayHook, this, std::placeholders::_1);
 | 
				
			||||||
            PRINT_DEBUG("start renderer\n", _renderer);
 | 
					            PRINT_DEBUG("start renderer\n", _renderer);
 | 
				
			||||||
            std::set<ingame_overlay::ToggleKey> keys = {ingame_overlay::ToggleKey::SHIFT, ingame_overlay::ToggleKey::TAB};
 | 
					            std::set<ingame_overlay::ToggleKey> keys = {ingame_overlay::ToggleKey::SHIFT, ingame_overlay::ToggleKey::TAB};
 | 
				
			||||||
 | 
					            _renderer->ImGuiFontAtlas = fonts_atlas;
 | 
				
			||||||
            bool started = _renderer->StartHook(callback, keys);
 | 
					            bool started = _renderer->StartHook(callback, keys);
 | 
				
			||||||
            PRINT_DEBUG("tried to start renderer %u\n", started);
 | 
					            PRINT_DEBUG("tried to start renderer %u\n", started);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -102,6 +102,7 @@ class Steam_Overlay
 | 
				
			||||||
    std::string show_url;
 | 
					    std::string show_url;
 | 
				
			||||||
    std::vector<Overlay_Achievement> achievements;
 | 
					    std::vector<Overlay_Achievement> achievements;
 | 
				
			||||||
    bool show_achievements, show_settings;
 | 
					    bool show_achievements, show_settings;
 | 
				
			||||||
 | 
					    void *fonts_atlas;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    bool disable_forced, local_save, warning_forced;
 | 
					    bool disable_forced, local_save, warning_forced;
 | 
				
			||||||
    uint32_t appid;
 | 
					    uint32_t appid;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -115,7 +115,7 @@ void DX10_Hook::_PrepareForOverlay(IDXGISwapChain* pSwapChain)
 | 
				
			||||||
        pDevice->CreateRenderTargetView(pBackBuffer, nullptr, &mainRenderTargetView);
 | 
					        pDevice->CreateRenderTargetView(pBackBuffer, nullptr, &mainRenderTargetView);
 | 
				
			||||||
        pBackBuffer->Release();
 | 
					        pBackBuffer->Release();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        ImGui::CreateContext();
 | 
					        ImGui::CreateContext((ImFontAtlas *)ImGuiFontAtlas);
 | 
				
			||||||
        ImGui_ImplDX10_Init(pDevice);
 | 
					        ImGui_ImplDX10_Init(pDevice);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        Windows_Hook::Inst()->SetInitialWindowSize(desc.OutputWindow);
 | 
					        Windows_Hook::Inst()->SetInitialWindowSize(desc.OutputWindow);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -147,7 +147,7 @@ void DX11_Hook::_PrepareForOverlay(IDXGISwapChain* pSwapChain)
 | 
				
			||||||
            return;
 | 
					            return;
 | 
				
			||||||
        
 | 
					        
 | 
				
			||||||
        if(ImGui::GetCurrentContext() == nullptr)
 | 
					        if(ImGui::GetCurrentContext() == nullptr)
 | 
				
			||||||
            ImGui::CreateContext();
 | 
					            ImGui::CreateContext((ImFontAtlas *)ImGuiFontAtlas);
 | 
				
			||||||
        
 | 
					        
 | 
				
			||||||
        ImGui_ImplDX11_Init(pDevice, pContext);
 | 
					        ImGui_ImplDX11_Init(pDevice, pContext);
 | 
				
			||||||
        
 | 
					        
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -264,7 +264,7 @@ void DX12_Hook::_PrepareForOverlay(IDXGISwapChain* pSwapChain, ID3D12CommandQueu
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        //auto heaps = std::move(get_free_texture_heap());
 | 
					        //auto heaps = std::move(get_free_texture_heap());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        ImGui::CreateContext();
 | 
					        ImGui::CreateContext((ImFontAtlas *)ImGuiFontAtlas);
 | 
				
			||||||
        ImGui_ImplDX12_Init(pDevice, bufferCount, DXGI_FORMAT_R8G8B8A8_UNORM, pSrvDescHeap,
 | 
					        ImGui_ImplDX12_Init(pDevice, bufferCount, DXGI_FORMAT_R8G8B8A8_UNORM, pSrvDescHeap,
 | 
				
			||||||
            pSrvDescHeap->GetCPUDescriptorHandleForHeapStart(),
 | 
					            pSrvDescHeap->GetCPUDescriptorHandleForHeapStart(),
 | 
				
			||||||
            pSrvDescHeap->GetGPUDescriptorHandleForHeapStart());
 | 
					            pSrvDescHeap->GetGPUDescriptorHandleForHeapStart());
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -133,7 +133,7 @@ void DX9_Hook::_PrepareForOverlay(IDirect3DDevice9 *pDevice, HWND destWindow)
 | 
				
			||||||
        pDevice->AddRef();
 | 
					        pDevice->AddRef();
 | 
				
			||||||
        _pDevice = pDevice;
 | 
					        _pDevice = pDevice;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        ImGui::CreateContext();
 | 
					        ImGui::CreateContext((ImFontAtlas *)ImGuiFontAtlas);
 | 
				
			||||||
        ImGui_ImplDX9_Init(pDevice);
 | 
					        ImGui_ImplDX9_Init(pDevice);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        _LastWindow = destWindow;
 | 
					        _LastWindow = destWindow;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -86,7 +86,7 @@ void OpenGL_Hook::_PrepareForOverlay(HDC hDC)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (!_Initialized)
 | 
					    if (!_Initialized)
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        ImGui::CreateContext();
 | 
					        ImGui::CreateContext((ImFontAtlas *)ImGuiFontAtlas);
 | 
				
			||||||
        ImGui_ImplOpenGL3_Init();
 | 
					        ImGui_ImplOpenGL3_Init();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        _LastWindow = hWnd;
 | 
					        _LastWindow = hWnd;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue