fixes #834 (major renderer memory leak)

This commit is contained in:
Thomas Jentzsch 2021-10-14 19:35:49 +02:00
parent 43c26ed3e8
commit 6c5a3acea8
3 changed files with 8 additions and 13 deletions

View File

@ -230,7 +230,6 @@ bool FBBackendSDL2::setVideoMode(const VideoModeHandler::Mode& mode,
return false; return false;
const bool fullScreen = mode.fsIndex != -1; const bool fullScreen = mode.fsIndex != -1;
bool forceCreateRenderer = false;
Int32 displayIndex = std::min(myNumDisplays - 1, winIdx); Int32 displayIndex = std::min(myNumDisplays - 1, winIdx);
int posX, posY; int posX, posY;
@ -292,6 +291,9 @@ bool FBBackendSDL2::setVideoMode(const VideoModeHandler::Mode& mode,
if(d != displayIndex || uInt32(w) != mode.screenS.w || if(d != displayIndex || uInt32(w) != mode.screenS.w ||
uInt32(h) != mode.screenS.h || adaptRefresh) uInt32(h) != mode.screenS.h || adaptRefresh)
{ {
// Renderer has to be destroyed *before* the window gets destroyed to avoid memory leaks
SDL_DestroyRenderer(myRenderer);
myRenderer = nullptr;
SDL_DestroyWindow(myWindow); SDL_DestroyWindow(myWindow);
myWindow = nullptr; myWindow = nullptr;
} }
@ -305,7 +307,6 @@ bool FBBackendSDL2::setVideoMode(const VideoModeHandler::Mode& mode,
} }
else else
{ {
forceCreateRenderer = true;
myWindow = SDL_CreateWindow(myScreenTitle.c_str(), posX, posY, myWindow = SDL_CreateWindow(myScreenTitle.c_str(), posX, posY,
mode.screenS.w, mode.screenS.h, flags); mode.screenS.w, mode.screenS.h, flags);
if(myWindow == nullptr) if(myWindow == nullptr)
@ -337,7 +338,7 @@ bool FBBackendSDL2::setVideoMode(const VideoModeHandler::Mode& mode,
} }
#endif #endif
return createRenderer(forceCreateRenderer); return createRenderer();
} }
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
@ -400,16 +401,15 @@ bool FBBackendSDL2::adaptRefreshRate(Int32 displayIndex,
} }
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
bool FBBackendSDL2::createRenderer(bool force) bool FBBackendSDL2::createRenderer()
{ {
ASSERT_MAIN_THREAD; ASSERT_MAIN_THREAD;
// A new renderer is only created when necessary: // A new renderer is only created when necessary:
// - new myWindow (force = true)
// - no renderer existing // - no renderer existing
// - different renderer flags // - different renderer flags
// - different renderer name // - different renderer name
bool recreate = force || myRenderer == nullptr; bool recreate = myRenderer == nullptr;
uInt32 renderFlags = SDL_RENDERER_ACCELERATED; uInt32 renderFlags = SDL_RENDERER_ACCELERATED;
const string& video = myOSystem.settings().getString("video"); // Render hint const string& video = myOSystem.settings().getString("video"); // Render hint
SDL_RendererInfo renderInfo; SDL_RendererInfo renderInfo;
@ -426,9 +426,6 @@ bool FBBackendSDL2::createRenderer(bool force)
if(recreate) if(recreate)
{ {
//cerr << "Create new renderer for buffer type #" << int(myBufferType) << endl; //cerr << "Create new renderer for buffer type #" << int(myBufferType) << endl;
if(myRenderer)
SDL_DestroyRenderer(myRenderer);
if(video != "") if(video != "")
SDL_SetHint(SDL_HINT_RENDER_DRIVER, video.c_str()); SDL_SetHint(SDL_HINT_RENDER_DRIVER, video.c_str());

View File

@ -208,11 +208,9 @@ class FBBackendSDL2 : public FBBackend
/** /**
Create a new renderer if required. Create a new renderer if required.
@param force If true, force new renderer creation
@return False on any errors, else true @return False on any errors, else true
*/ */
bool createRenderer(bool force); bool createRenderer();
/** /**
This method must be called after all drawing is done, and indicates This method must be called after all drawing is done, and indicates

View File

@ -346,7 +346,7 @@ void Dialog::render()
_renderCallback(); _renderCallback();
// A dialog is still on top if a non-shading dialog (e.g. ContextMenu) // A dialog is still on top if a non-shading dialog (e.g. ContextMenu)
// is opended above it. // is opened above it.
bool onTop = parent().myDialogStack.top() == this bool onTop = parent().myDialogStack.top() == this
|| (parent().myDialogStack.get(parent().myDialogStack.size() - 2) == this || (parent().myDialogStack.get(parent().myDialogStack.size() - 2) == this
&& !parent().myDialogStack.top()->isShading()); && !parent().myDialogStack.top()->isShading());