Files
Xenia-Canary/src/xenia/helper/sdl/sdl_helper.cc
Joel Linn 6267c73c4c [SDL] Add global helper to setup the library.
Call to SDLHelper::Prepare() is needed before first SDL_InitSubSystem().
- Sets hints (SDL configuration vars).
- Configures logging.
2020-04-23 15:44:58 -05:00

82 lines
2.6 KiB
C++

/**
******************************************************************************
* Xenia : Xbox 360 Emulator Research Project *
******************************************************************************
* Copyright 2020 Ben Vanik. All rights reserved. *
* Released under the BSD license - see LICENSE in the root for more details. *
******************************************************************************
*/
#include "xenia/helper/sdl/sdl_helper.h"
#include "xenia/base/assert.h"
#include "xenia/base/logging.h"
namespace xe {
namespace helper {
namespace sdl {
bool SDLHelper::is_prepared_ = false;
bool SDLHelper::Prepare() {
if (is_prepared_) {
return true;
}
is_prepared_ = true;
is_prepared_ &= SetHints();
is_prepared_ &= RedirectLog();
return is_prepared_;
}
bool SDLHelper::SetHints() {
bool suc = true;
// SDL calls timeBeginPeriod(1) but xenia sets this to a lower value before
// using NtSetTimerResolution(). Having that value overwritten causes overall
// fps drops. Use override priority as timer resolution should always be
// managed by xenia. https://bugzilla.libsdl.org/show_bug.cgi?id=5104
suc &= SDL_SetHintWithPriority(SDL_HINT_TIMER_RESOLUTION, "0",
SDL_HINT_OVERRIDE) == SDL_TRUE;
return suc;
}
bool SDLHelper::RedirectLog() {
// Redirect SDL_Log* output (internal library stuff) to our log system.
SDL_LogSetOutputFunction(
[](void* userdata, int category, SDL_LogPriority priority,
const char* message) {
const char* msg_fmt = "SDL: {}";
switch (priority) {
case SDL_LOG_PRIORITY_VERBOSE:
case SDL_LOG_PRIORITY_DEBUG:
XELOGD(msg_fmt, message);
break;
case SDL_LOG_PRIORITY_INFO:
XELOGI(msg_fmt, message);
break;
case SDL_LOG_PRIORITY_WARN:
XELOGW(msg_fmt, message);
break;
case SDL_LOG_PRIORITY_ERROR:
case SDL_LOG_PRIORITY_CRITICAL:
XELOGE(msg_fmt, message);
break;
default:
XELOGI(msg_fmt, message);
assert_always("SDL: Unknown log priority");
break;
}
},
nullptr);
// SDL itself isn't that talkative. Additionally to this settings there are
// hints that can be switched on to output additional internal logging
// information.
SDL_LogSetAllPriority(SDL_LogPriority::SDL_LOG_PRIORITY_VERBOSE);
return true;
}
} // namespace sdl
} // namespace helper
} // namespace xe