Fixed overlay now showing on some games

In sanctum2, not writing in our own context makes the game crash.
merge-requests/28/head
Nemirtingas 2019-09-03 17:25:09 +02:00
parent 1016e7f47f
commit 6ebc946607
2 changed files with 39 additions and 12 deletions

View File

@ -60,6 +60,8 @@ void OpenGLX_Hook::resetRenderState()
X11_Hook::Inst()->resetRenderState(); X11_Hook::Inst()->resetRenderState();
ImGui::DestroyContext(); ImGui::DestroyContext();
glXDestroyContext(display, context);
display = nullptr;
initialized = false; initialized = false;
} }
} }
@ -70,7 +72,7 @@ void OpenGLX_Hook::prepareForOverlay(Display* display, GLXDrawable drawable)
PRINT_DEBUG("Called SwapBuffer hook"); PRINT_DEBUG("Called SwapBuffer hook");
if( (Window)drawable != X11_Hook::Inst()->get_game_wnd() ) if( (Window)drawable != X11_Hook::Inst()->get_game_wnd() )
resetRenderState(); X11_Hook::Inst()->resetRenderState();
if( ! initialized ) if( ! initialized )
{ {
@ -79,26 +81,48 @@ void OpenGLX_Hook::prepareForOverlay(Display* display, GLXDrawable drawable)
io.IniFilename = NULL; io.IniFilename = NULL;
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.
GLX_RGBA, //apparently nothing comes after this?
GLX_RED_SIZE, 8,
GLX_GREEN_SIZE, 8,
GLX_BLUE_SIZE, 8,
GLX_ALPHA_SIZE, 8,
//Ideally, the size would be 32 (or at least 24), but I have actually seen
// this size (on a modern OS even).
GLX_DEPTH_SIZE, 16,
GLX_DOUBLEBUFFER, True,
None
};
XVisualInfo* visual_info = glXChooseVisual(display, DefaultScreen(display), attributes);
context = glXCreateContext(display, visual_info, nullptr, True);
this->display = display;
initialized = true; initialized = true;
} }
if( initialized ) ImGuiIO& io = ImGui::GetIO();
{
ImGuiIO& io = ImGui::GetIO();
ImGui_ImplOpenGL3_NewFrame(); auto oldContext = glXGetCurrentContext();
X11_Hook::Inst()->prepareForOverlay(display, (Window)drawable);
ImGui::NewFrame(); glXMakeCurrent(display, drawable, context);
get_steam_client()->steam_overlay->OverlayProc(io.DisplaySize.x, io.DisplaySize.y); ImGui_ImplOpenGL3_NewFrame();
X11_Hook::Inst()->prepareForOverlay(display, (Window)drawable);
ImGui::EndFrame(); ImGui::NewFrame();
ImGui::Render(); get_steam_client()->steam_overlay->OverlayProc(io.DisplaySize.x, io.DisplaySize.y);
ImGui_ImplOpenGL3_RenderDrawData(ImGui::GetDrawData()); ImGui::EndFrame();
}
ImGui::Render();
ImGui_ImplOpenGL3_RenderDrawData(ImGui::GetDrawData());
glXMakeCurrent(display, drawable, oldContext);
} }
void OpenGLX_Hook::MyglXSwapBuffers(Display* display, GLXDrawable drawable) void OpenGLX_Hook::MyglXSwapBuffers(Display* display, GLXDrawable drawable)
@ -123,6 +147,7 @@ OpenGLX_Hook::~OpenGLX_Hook()
{ {
ImGui_ImplOpenGL3_Shutdown(); ImGui_ImplOpenGL3_Shutdown();
ImGui::DestroyContext(); ImGui::DestroyContext();
glXDestroyContext(display, context);
} }
//dlclose(_library); //dlclose(_library);

View File

@ -19,6 +19,8 @@ private:
// Variables // Variables
bool hooked; bool hooked;
bool initialized; bool initialized;
Display *display;
GLXContext context;
// Functions // Functions
OpenGLX_Hook(); OpenGLX_Hook();