try to create renderer only when required (needs testing)

This commit is contained in:
thrust26 2020-05-19 12:33:01 +02:00
parent 2722435f36
commit 29c54ec143
2 changed files with 82 additions and 18 deletions

View File

@ -221,6 +221,7 @@ bool FrameBufferSDL2::setVideoMode(const string& title, const VideoMode& mode)
const bool fullScreen = mode.fsIndex != -1;
const bool shouldAdapt = fullScreen && myOSystem.settings().getBool("tia.fs_refresh")
&& refreshRate() != gameRefreshRate();
bool forceCreateRenderer = false;
// TODO: On multiple displays, switching from centered mode, does not respect
// current window's display (which many not be centered anymore)
@ -230,12 +231,12 @@ bool FrameBufferSDL2::setVideoMode(const string& title, const VideoMode& mode)
// Get windowed window's last position
myWindowedPos = myOSystem.settings().getPoint(getPositionKey());
// Always recreate renderer (some systems need this)
if(myRenderer)
{
SDL_DestroyRenderer(myRenderer);
myRenderer = nullptr;
}
//// Always recreate renderer (some systems need this)
//if(myRenderer)
//{
// SDL_DestroyRenderer(myRenderer);
// myRenderer = nullptr;
//}
int posX, posY;
@ -313,6 +314,7 @@ bool FrameBufferSDL2::setVideoMode(const string& title, const VideoMode& mode)
#endif
else
{
forceCreateRenderer = true;
myWindow = SDL_CreateWindow(title.c_str(), posX, posY,
mode.screen.w, mode.screen.h, flags);
if(myWindow == nullptr)
@ -340,11 +342,64 @@ bool FrameBufferSDL2::setVideoMode(const string& title, const VideoMode& mode)
}
}
return createRenderer(forceCreateRenderer);
//uInt32 renderFlags = SDL_RENDERER_ACCELERATED;
//if(myOSystem.settings().getBool("vsync")
// && !myOSystem.settings().getBool("turbo")) // V'synced blits option
// renderFlags |= SDL_RENDERER_PRESENTVSYNC;
//const string& video = myOSystem.settings().getString("video"); // Render hint
//if(video != "")
// SDL_SetHint(SDL_HINT_RENDER_DRIVER, video.c_str());
//myRenderer = SDL_CreateRenderer(myWindow, -1, renderFlags);
//detectFeatures();
//determineDimensions();
//if(myRenderer == nullptr)
//{
// string msg = "ERROR: Unable to create SDL renderer: " + string(SDL_GetError());
// Logger::error(msg);
// return false;
//}
//clear();
//SDL_RendererInfo renderinfo;
//if(SDL_GetRendererInfo(myRenderer, &renderinfo) >= 0)
// myOSystem.settings().setValue("video", renderinfo.name);
//return true;
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
bool FrameBufferSDL2::createRenderer(bool force)
{
// A new renderer is only created when necessary:
// - new myWindow (force = true)
// - no renderer existing
// - different renderer flags
// - different renderer name
bool recreate = force || myRenderer == nullptr;
uInt32 renderFlags = SDL_RENDERER_ACCELERATED;
const string& video = myOSystem.settings().getString("video"); // Render hint
SDL_RendererInfo renderInfo;
if(myOSystem.settings().getBool("vsync")
&& !myOSystem.settings().getBool("turbo")) // V'synced blits option
renderFlags |= SDL_RENDERER_PRESENTVSYNC;
const string& video = myOSystem.settings().getString("video"); // Render hint
// check renderer flags and name
recreate |= (SDL_GetRendererInfo(myRenderer, &renderInfo) != 0)
|| ((renderInfo.flags & (SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC)) != renderFlags
|| (video != renderInfo.name));
if(recreate)
{
cerr << "Create new renderer " << int(myBufferType) << endl;
if(myRenderer)
SDL_DestroyRenderer(myRenderer);
if(video != "")
SDL_SetHint(SDL_HINT_RENDER_DRIVER, video.c_str());
@ -359,6 +414,7 @@ bool FrameBufferSDL2::setVideoMode(const string& title, const VideoMode& mode)
Logger::error(msg);
return false;
}
}
clear();
SDL_RendererInfo renderinfo;
@ -482,7 +538,7 @@ int FrameBufferSDL2::gameRefreshRate() const
const string format = myOSystem.console().getFormatString();
const bool isNtsc = format == "NTSC" || format == "PAL60" || format == "SECAM60";
return isNtsc ? 60 : 50; // TODO: check for multiples e.g. 120/100 too
return isNtsc ? 75 : 50; // TODO: check for multiples e.g. 120/100 too
}
return 60;
}

View File

@ -181,6 +181,14 @@ class FrameBufferSDL2 : public FrameBuffer
*/
bool setVideoMode(const string& title, const VideoMode& mode) override;
/**
Create a new renderer if required
@param force If true, force new renderer creation
@return False on any errors, else true
*/
bool createRenderer(bool force);
/**
Checks if the display refresh rate should be adapted to game refresh rate in (real) fullscreen mode