Fix what !785 tried to fix, but correctly

This commit is contained in:
Jaime Passos 2020-02-17 21:58:32 -03:00
parent fd23294cc4
commit 43abd53c55
2 changed files with 53 additions and 14 deletions

View file

@ -6611,7 +6611,6 @@ void HWR_Shutdown(void)
CONS_Printf("HWR_Shutdown()\n"); CONS_Printf("HWR_Shutdown()\n");
HWR_FreeExtraSubsectors(); HWR_FreeExtraSubsectors();
HWR_FreePolyPool(); HWR_FreePolyPool();
HWR_FreeMipmapCache();
HWR_FreeTextureCache(); HWR_FreeTextureCache();
HWD.pfnFlushScreenTextures(); HWD.pfnFlushScreenTextures();
} }

View file

@ -1493,7 +1493,8 @@ void VID_CheckGLLoaded(rendermode_t oldrender)
void VID_CheckRenderer(void) void VID_CheckRenderer(void)
{ {
SDL_bool rendererchanged = SDL_FALSE; boolean rendererchanged = false;
boolean contextcreated = false;
rendermode_t oldrenderer = rendermode; rendermode_t oldrenderer = rendermode;
if (dedicated) if (dedicated)
@ -1502,21 +1503,51 @@ void VID_CheckRenderer(void)
if (setrenderneeded) if (setrenderneeded)
{ {
rendermode = setrenderneeded; rendermode = setrenderneeded;
rendererchanged = SDL_TRUE; rendererchanged = true;
#ifdef HWRENDER #ifdef HWRENDER
if (rendermode == render_opengl) if (rendermode == render_opengl)
{ {
VID_CheckGLLoaded(oldrenderer); VID_CheckGLLoaded(oldrenderer);
// Initialise OpenGL before calling SDLSetMode!!! // Initialise OpenGL before calling SDLSetMode!!!
if (vid_opengl_state != 1) // This is because SDLSetMode calls OglSdlSurface.
if (vid_opengl_state == 0)
{
VID_StartupOpenGL(); VID_StartupOpenGL();
// Loaded successfully!
if (vid_opengl_state == 1)
{
// Destroy the current window, if it exists.
if (window)
{
SDL_DestroyWindow(window);
window = NULL;
}
// Destroy the current window rendering context, if that also exists.
if (renderer)
{
SDL_DestroyRenderer(renderer);
renderer = NULL;
}
// Create a new window.
Impl_CreateWindow(USE_FULLSCREEN);
// From there, the OpenGL context was already created.
contextcreated = true;
}
}
else if (vid_opengl_state == -1) else if (vid_opengl_state == -1)
rendererchanged = SDL_FALSE; rendererchanged = false;
} }
#endif #endif
Impl_CreateContext(); if (!contextcreated)
Impl_CreateContext();
setrenderneeded = 0;
} }
SDLSetMode(vid.width, vid.height, USE_FULLSCREEN, (rendererchanged ? SDL_FALSE : SDL_TRUE)); SDLSetMode(vid.width, vid.height, USE_FULLSCREEN, (rendererchanged ? SDL_FALSE : SDL_TRUE));
@ -1529,15 +1560,22 @@ void VID_CheckRenderer(void)
SDL_FreeSurface(bufSurface); SDL_FreeSurface(bufSurface);
bufSurface = NULL; bufSurface = NULL;
} }
if (rendererchanged)
{
#ifdef HWRENDER #ifdef HWRENDER
if (vid_opengl_state == 1) // Only if OpenGL ever loaded! if (vid_opengl_state == 1) // Only if OpenGL ever loaded!
HWR_FreeTextureCache(); HWR_FreeTextureCache();
#endif #endif
SCR_SetDrawFuncs(); SCR_SetDrawFuncs();
}
} }
#ifdef HWRENDER #ifdef HWRENDER
else if (rendermode == render_opengl) else if (rendermode == render_opengl)
R_InitHardwareMode(); {
if (rendererchanged)
R_InitHardwareMode();
}
#else #else
(void)oldrenderer; (void)oldrenderer;
#endif #endif
@ -1581,7 +1619,7 @@ static SDL_bool Impl_CreateWindow(SDL_bool fullscreen)
flags |= SDL_WINDOW_BORDERLESS; flags |= SDL_WINDOW_BORDERLESS;
#ifdef HWRENDER #ifdef HWRENDER
if (vid_opengl_state != -1) if (vid_opengl_state == 1)
flags |= SDL_WINDOW_OPENGL; flags |= SDL_WINDOW_OPENGL;
#endif #endif
@ -1715,10 +1753,11 @@ void I_StartupGraphics(void)
//SDL_EnableKeyRepeat(SDL_DEFAULT_REPEAT_DELAY>>1,SDL_DEFAULT_REPEAT_INTERVAL<<2); //SDL_EnableKeyRepeat(SDL_DEFAULT_REPEAT_DELAY>>1,SDL_DEFAULT_REPEAT_INTERVAL<<2);
VID_Command_ModeList_f(); VID_Command_ModeList_f();
#ifdef HWRENDER #ifdef HWRENDER
if (M_CheckParm("-nogl")) if (M_CheckParm("-nogl"))
vid_opengl_state = -1; // Don't call SDL_GL_LoadLibrary vid_opengl_state = -1; // Don't startup OpenGL
else else if (chosenrendermode == render_opengl)
VID_StartupOpenGL(); VID_StartupOpenGL();
#endif #endif
@ -1780,6 +1819,7 @@ void VID_StartupOpenGL(void)
static boolean glstartup = false; static boolean glstartup = false;
if (!glstartup) if (!glstartup)
{ {
CONS_Printf("VID_StartupOpenGL()...\n");
HWD.pfnInit = hwSym("Init",NULL); HWD.pfnInit = hwSym("Init",NULL);
HWD.pfnFinishUpdate = NULL; HWD.pfnFinishUpdate = NULL;
HWD.pfnDraw2DLine = hwSym("Draw2DLine",NULL); HWD.pfnDraw2DLine = hwSym("Draw2DLine",NULL);
@ -1811,7 +1851,7 @@ void VID_StartupOpenGL(void)
// check gl renderer lib // check gl renderer lib
if (HWD.pfnGetRenderVersion() != VERSION) if (HWD.pfnGetRenderVersion() != VERSION)
{ {
CONS_Alert(CONS_ERROR, M_GetText("The version of the renderer doesn't match the version of the executable\nBe sure you have installed SRB2 properly.\n")); CONS_Alert(CONS_ERROR, M_GetText("The version of the renderer doesn't match the version of the executable!\nBe sure you have installed SRB2 properly.\n"));
vid_opengl_state = -1; vid_opengl_state = -1;
} }
else else