mirror of
https://github.com/thunderbrewhq/thunderbrew
synced 2025-10-26 22:06:06 +03:00
feat(console): allow graphics device to be initialized using hints from CVar as well as a command-line override
This commit is contained in:
parent
f03ea10648
commit
8fe559c2d8
@ -11,11 +11,39 @@ CVar* s_cvGxMaximize;
|
|||||||
CVar* s_cvGxResolution;
|
CVar* s_cvGxResolution;
|
||||||
CVar* s_cvGxWidescreen;
|
CVar* s_cvGxWidescreen;
|
||||||
CVar* s_cvGxWindow;
|
CVar* s_cvGxWindow;
|
||||||
|
CVar* s_cvGxApi;
|
||||||
DefaultSettings s_defaults;
|
DefaultSettings s_defaults;
|
||||||
bool s_hwDetect;
|
bool s_hwDetect;
|
||||||
bool s_hwChanged;
|
bool s_hwChanged;
|
||||||
CGxFormat s_requestedFormat;
|
CGxFormat s_requestedFormat;
|
||||||
|
|
||||||
|
const char* g_gxApiNames[GxApis_Last] = {
|
||||||
|
"OpenGL", // GxApi_OpenGl
|
||||||
|
"D3D9", // GxApi_D3d9
|
||||||
|
"D3D9Ex", // GxApi_D3d9Ex
|
||||||
|
"D3D10", // GxApi_D3d10
|
||||||
|
"D3D11", // GxApi_D3d11
|
||||||
|
"GLL", // GxApi_GLL
|
||||||
|
"GLSDL" // GxApi_GLSDL
|
||||||
|
};
|
||||||
|
|
||||||
|
EGxApi g_gxApiSupported[] = {
|
||||||
|
#if defined(WHOA_SYSTEM_WIN)
|
||||||
|
GxApi_D3d9,
|
||||||
|
GxApi_GLSDL
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(WHOA_SYSTEM_MAC)
|
||||||
|
GxApi_GLL
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(WHOA_SYSTEM_LINUX)
|
||||||
|
GxApi_GLSDL
|
||||||
|
#endif
|
||||||
|
};
|
||||||
|
|
||||||
|
size_t g_numGxApiSupported = sizeof(g_gxApiSupported) / sizeof(EGxApi);
|
||||||
|
|
||||||
bool CVGxMaximizeCallback(CVar*, const char*, const char*, void*) {
|
bool CVGxMaximizeCallback(CVar*, const char*, const char*, void*) {
|
||||||
// TODO
|
// TODO
|
||||||
return true;
|
return true;
|
||||||
@ -35,6 +63,49 @@ bool CVGxWindowCallback(CVar*, const char*, const char*, void*) {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool CVGxApiCallback(CVar* h, const char* oldValue, const char* newValue, void* arg) {
|
||||||
|
for (size_t api = 0; api < g_numGxApiSupported; api++) {
|
||||||
|
auto apiString = g_gxApiNames[g_gxApiSupported[api]];
|
||||||
|
if (SStrCmpI(newValue, apiString, STORM_MAX_STR) == 0) {
|
||||||
|
// New gxApi is supported, pass
|
||||||
|
ConsoleWrite("GxApi set pending gxRestart", DEFAULT_COLOR);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Supported gxApi not supplied, show available apis
|
||||||
|
constexpr size_t msgsize = 1024;
|
||||||
|
char msg[msgsize] = {0};
|
||||||
|
SStrPack(msg, "unsupported api, must be one of ", msgsize);
|
||||||
|
|
||||||
|
for (size_t api = 0; api < g_numGxApiSupported; api++) {
|
||||||
|
if (api > 0) {
|
||||||
|
SStrPack(msg, ", ", msgsize);
|
||||||
|
}
|
||||||
|
auto apiString = g_gxApiNames[g_gxApiSupported[api]];
|
||||||
|
SStrPack(msg, "'", msgsize);
|
||||||
|
SStrPack(msg, apiString, msgsize);
|
||||||
|
SStrPack(msg, "'", msgsize);
|
||||||
|
}
|
||||||
|
|
||||||
|
ConsoleWrite(msg, DEFAULT_COLOR);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
EGxApi GxApiDefault() {
|
||||||
|
#if defined(WHOA_SYSTEM_WIN)
|
||||||
|
return GxApi_D3d9;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(WHOA_SYSTEM_MAC)
|
||||||
|
return GxApi_GLL;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(WHOA_SYSTEM_LINUX)
|
||||||
|
return GxApi_GLSDL;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
void RegisterGxCVars() {
|
void RegisterGxCVars() {
|
||||||
auto& format = s_defaults.format;
|
auto& format = s_defaults.format;
|
||||||
|
|
||||||
@ -97,6 +168,19 @@ void RegisterGxCVars() {
|
|||||||
// TODO s_cvGxRefresh
|
// TODO s_cvGxRefresh
|
||||||
// TODO s_cvGxTripleBuffer
|
// TODO s_cvGxTripleBuffer
|
||||||
// TODO s_cvGxApi
|
// TODO s_cvGxApi
|
||||||
|
|
||||||
|
s_cvGxApi = CVar::Register(
|
||||||
|
"gxApi",
|
||||||
|
"graphics api",
|
||||||
|
0x1 | 0x2,
|
||||||
|
g_gxApiNames[GxApiDefault()],
|
||||||
|
CVGxApiCallback,
|
||||||
|
1,
|
||||||
|
false,
|
||||||
|
nullptr,
|
||||||
|
false
|
||||||
|
);
|
||||||
|
|
||||||
// TODO s_cvGxVSync
|
// TODO s_cvGxVSync
|
||||||
// TODO s_cvGxAspect
|
// TODO s_cvGxAspect
|
||||||
// TODO s_cvGxCursor
|
// TODO s_cvGxCursor
|
||||||
@ -194,17 +278,24 @@ void ConsoleDeviceInitialize(const char* title) {
|
|||||||
CGxFormat format;
|
CGxFormat format;
|
||||||
memcpy(&format, &s_requestedFormat, sizeof(s_requestedFormat));
|
memcpy(&format, &s_requestedFormat, sizeof(s_requestedFormat));
|
||||||
|
|
||||||
// TODO proper api selection
|
// Select gxApi based on user CVars and command-line parameters
|
||||||
EGxApi api = GxApi_OpenGl;
|
EGxApi api = GxApiDefault();
|
||||||
#if defined(WHOA_SYSTEM_WIN)
|
|
||||||
api = GxApi_D3d9;
|
|
||||||
|
|
||||||
if (CmdLineGetBool(CMD_OPENGL)) {
|
auto gxApiName = s_cvGxApi->GetString();
|
||||||
api = GxApi_OpenGl;
|
|
||||||
|
auto gxOverride = CmdLineGetString(WOWCMD_GX_OVERRIDE);
|
||||||
|
if (*gxOverride != '\0') {
|
||||||
|
gxApiName = gxOverride;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Sanitize chosen gxApi against list of supported gxApis
|
||||||
|
for (size_t i = 0; i < g_numGxApiSupported; i++) {
|
||||||
|
EGxApi supportedApi = g_gxApiSupported[i];
|
||||||
|
if (SStrCmp(gxApiName, g_gxApiNames[supported], STORM_MAX_STR) == 0) {
|
||||||
|
api = supportedApi;
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
#elif defined(WHOA_SYSTEM_MAC)
|
|
||||||
api = GxApi_GLL;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
CGxDevice* device = GxDevCreate(api, OsWindowProc, format);
|
CGxDevice* device = GxDevCreate(api, OsWindowProc, format);
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user