From 164862ee0985613ae7e94e63a75f4587b401293d Mon Sep 17 00:00:00 2001 From: BZLZHH Date: Sun, 13 Jul 2025 14:17:49 +0800 Subject: [PATCH] [Refactor] (Config): Improve code. --- src/main/cpp/config/settings.cpp | 198 +++++++++++++++---------------- src/main/cpp/config/settings.h | 66 +++++++---- src/main/cpp/gl/framebuffer.cpp | 2 +- src/main/cpp/gl/program.cpp | 2 +- src/main/cpp/gl/shader.cpp | 2 +- src/main/cpp/gl/texture.cpp | 2 +- src/main/cpp/gles/loader.cpp | 4 +- 7 files changed, 150 insertions(+), 126 deletions(-) diff --git a/src/main/cpp/config/settings.cpp b/src/main/cpp/config/settings.cpp index 4dd2d9e..44571d7 100644 --- a/src/main/cpp/config/settings.cpp +++ b/src/main/cpp/config/settings.cpp @@ -14,10 +14,10 @@ struct global_settings_t global_settings; void init_settings() { #if defined(__APPLE__) - global_settings.angle = 0; - global_settings.ignore_error = 1; - global_settings.ext_gl43 = 0; - global_settings.ext_compute_shader = 0; + global_settings.angle = AngleMode::Disabled; + global_settings.ignore_error = IgnoreErrorLevel::Partial; + global_settings.ext_gl43 = false; + global_settings.ext_compute_shader = false; global_settings.max_glsl_cache_size = 30 * 1024 * 1024; global_settings.multidraw_mode = multidraw_mode_t::DrawElements; #else @@ -30,154 +30,154 @@ void init_settings() { } } - int enableANGLE = success ? config_get_int("enableANGLE") : 0; - int enableNoError = success ? config_get_int("enableNoError") : 0; - int enableExtGL43 = success ? config_get_int("enableExtGL43") : 0; - int enableExtComputeShader = success ? config_get_int("enableExtComputeShader") : 0; + AngleConfig angleConfig = success ? static_cast(config_get_int("enableANGLE")) : AngleConfig::DisableIfPossible; + NoErrorConfig noErrorConfig = success ? static_cast(config_get_int("enableNoError")) : NoErrorConfig::Auto; + bool enableExtGL43 = success ? (config_get_int("enableExtGL43") != 0) : false; + bool enableExtComputeShader = success ? (config_get_int("enableExtComputeShader") != 0) : false; int enableCompatibleMode = success ? config_get_int("enableCompatibleMode") : 0; - multidraw_mode_t multidrawMode = success ? (multidraw_mode_t)config_get_int("multidrawMode") : multidraw_mode_t::Auto; -// multidraw_mode_t multidrawMode = multidraw_mode_t::PreferUnroll; + multidraw_mode_t multidrawMode = success ? static_cast(config_get_int("multidrawMode")) : multidraw_mode_t::Auto; + size_t maxGlslCacheSize = 0; - if (config_get_int("maxGlslCacheSize") > 0) + if (config_get_int("maxGlslCacheSize") > 0) { maxGlslCacheSize = success ? config_get_int("maxGlslCacheSize") * 1024 * 1024 : 0; + } - if (enableANGLE < 0 || enableANGLE > 3) - enableANGLE = 0; - if (enableNoError < 0 || enableNoError > 3) - enableNoError = 0; - if (enableExtGL43 < 0 || enableExtGL43 > 1) - enableExtGL43 = 0; - if (enableExtComputeShader < 0 || enableExtComputeShader > 1) - enableExtComputeShader = 0; - if (enableCompatibleMode < 0 || enableCompatibleMode > 1) - enableCompatibleMode = 0; - if ((int)multidrawMode < 0 || (int)multidrawMode >= (int)multidraw_mode_t::MaxValue) + if (static_cast(angleConfig) < 0 || static_cast(angleConfig) > 3) { + angleConfig = AngleConfig::DisableIfPossible; + } + if (static_cast(noErrorConfig) < 0 || static_cast(noErrorConfig) > 3) { + noErrorConfig = NoErrorConfig::Auto; + } + if (static_cast(multidrawMode) < 0 || static_cast(multidrawMode) >= static_cast(multidraw_mode_t::MaxValue)) { multidrawMode = multidraw_mode_t::Auto; + } + if (enableCompatibleMode < 0 || enableCompatibleMode > 1) { + enableCompatibleMode = 0; + } - // 1205 int fclVersion = 0; GetEnvVarInt("FCL_VERSION_CODE", &fclVersion, 0); - // 140000 int zlVersion = 0; GetEnvVarInt("ZALITH_VERSION_CODE", &zlVersion, 0); - // unknown int pgwVersion = 0; GetEnvVarInt("PGW_VERSION_CODE", &pgwVersion, 0); - char* var = getenv("MG_DIR_PATH"); - LOG_V("MG_DIR_PATH = %s", var ? var : "(null)") if (fclVersion == 0 && zlVersion == 0 && pgwVersion == 0 && !var) { LOG_V("Unsupported launcher detected, force using default config.") - enableANGLE = 0; - enableNoError = 0; - enableExtGL43 = 0; - enableExtComputeShader = 0; + angleConfig = AngleConfig::DisableIfPossible; + noErrorConfig = NoErrorConfig::Auto; + enableExtGL43 = false; + enableExtComputeShader = false; maxGlslCacheSize = 0; enableCompatibleMode = 0; } - // Determining actual ANGLE mode + AngleMode finalAngleMode = AngleMode::Disabled; std::string gpuString = getGPUInfo(); const char* gpu_cstr = gpuString.c_str(); LOG_D("GPU: %s", gpu_cstr ? gpu_cstr : "(unknown)") - if (enableANGLE == 2 || enableANGLE == 3) { - // Force enable / disable - global_settings.angle = enableANGLE - 2; - } else { - int isQcom = isAdreno(gpu_cstr); - int is740 = isAdreno740(gpu_cstr); - //int is830 = isAdreno830(gpu_cstr); - int hasVk13 = hasVulkan13(); + switch (angleConfig) { + case AngleConfig::ForceDisable: + finalAngleMode = AngleMode::Disabled; + LOG_D("ANGLE: Force disabled"); + break; + + case AngleConfig::ForceEnable: + finalAngleMode = AngleMode::Enabled; + LOG_D("ANGLE: Force enabled"); + break; + + case AngleConfig::EnableIfPossible: { + int isQcom = isAdreno(gpu_cstr); + int is740 = isAdreno740(gpu_cstr); + int hasVk13 = hasVulkan13(); - LOG_D("Is Adreno? = %s", isQcom ? "true" : "false") - //LOG_D("Is Adreno 830? = %s", is830 ? "true" : "false") - LOG_D("Is Adreno 740? = %s", is740 ? "true" : "false") - LOG_D("Has Vulkan 1.3? = %s", hasVk13 ? "true" : "false") + LOG_D("Is Adreno? = %s", isQcom ? "true" : "false") + LOG_D("Is Adreno 740? = %s", is740 ? "true" : "false") + LOG_D("Has Vulkan 1.3? = %s", hasVk13 ? "true" : "false") - //if (is830) - // global_settings.angle = 1; - if (is740) - global_settings.angle = 0; - else - global_settings.angle = hasVk13 && enableANGLE; + finalAngleMode = (is740 || !hasVk13) ? AngleMode::Disabled : AngleMode::Enabled; + LOG_D("ANGLE: Conditionally %s", (finalAngleMode == AngleMode::Enabled) ? "enabled" : "disabled"); + break; + } + + case AngleConfig::DisableIfPossible: + default: + finalAngleMode = AngleMode::Disabled; + LOG_D("ANGLE: Disabled by default"); + break; } - LOG_D("enableANGLE = %d", enableANGLE) - LOG_D("global_settings.angle = %d", global_settings.angle) + + global_settings.angle = finalAngleMode; + LOG_D("Final ANGLE setting: %d", static_cast(global_settings.angle)) -// if (enableANGLE == 1) { -// global_settings.angle = (isAdreno740(gpuString) || !hasVulkan13()) ? 0 : 1; -// } else if (enableANGLE == 2 || enableANGLE == 3) { -// global_settings.angle = enableANGLE - 2; -// } else { -// int is830 = isAdreno830(gpuString); -// LOG_D("Is Adreno 830? = %s", is830 ? "true" : "false") -// global_settings.angle = is830 ? 1 : 0; -// } - - - if (global_settings.angle) { + if (global_settings.angle == AngleMode::Enabled) { setenv("LIBGL_GLES", "libGLESv2_angle.so", 1); setenv("LIBGL_EGL", "libEGL_angle.so", 1); } - if (enableNoError == 1 || enableNoError == 2 || enableNoError == 3) { - global_settings.ignore_error = enableNoError - 1; - } else { - global_settings.ignore_error = 0; + switch (noErrorConfig) { + case NoErrorConfig::Level1: + global_settings.ignore_error = IgnoreErrorLevel::Partial; + LOG_D("Error ignoring: Level 1 (Partial)"); + break; + + case NoErrorConfig::Level2: + global_settings.ignore_error = IgnoreErrorLevel::Full; + LOG_D("Error ignoring: Level 2 (Full)"); + break; + + case NoErrorConfig::Auto: + case NoErrorConfig::Disable: + default: + global_settings.ignore_error = IgnoreErrorLevel::None; + LOG_D("Error ignoring: Disabled"); + break; } global_settings.ext_gl43 = enableExtGL43; - global_settings.ext_compute_shader = enableExtComputeShader; - global_settings.max_glsl_cache_size = maxGlslCacheSize; - global_settings.multidraw_mode = multidrawMode; #endif std::string draw_mode_str; switch (global_settings.multidraw_mode) { - case multidraw_mode_t::PreferIndirect: - draw_mode_str = "Indirect"; - break; - case multidraw_mode_t::PreferBaseVertex: - draw_mode_str = "Unroll"; - break; - case multidraw_mode_t::PreferMultidrawIndirect: - draw_mode_str = "Multidraw indirect"; - break; - case multidraw_mode_t::DrawElements: - draw_mode_str = "DrawElements"; - break; - case multidraw_mode_t::Compute: - draw_mode_str = "Compute"; - break; - case multidraw_mode_t::Auto: - draw_mode_str = "Auto"; - break; + case multidraw_mode_t::PreferIndirect: draw_mode_str = "Indirect"; break; + case multidraw_mode_t::PreferBaseVertex: draw_mode_str = "Unroll"; break; + case multidraw_mode_t::PreferMultidrawIndirect: draw_mode_str = "Multidraw indirect"; break; + case multidraw_mode_t::DrawElements: draw_mode_str = "DrawElements"; break; + case multidraw_mode_t::Compute: draw_mode_str = "Compute"; break; + case multidraw_mode_t::Auto: draw_mode_str = "Auto"; break; default: draw_mode_str = "(Unknown)"; global_settings.multidraw_mode = multidraw_mode_t::Auto; break; } - LOG_V("[MobileGlues] Setting: enableAngle = %s", global_settings.angle ? "true" : "false") - LOG_V("[MobileGlues] Setting: ignoreError = %i", global_settings.ignore_error) - LOG_V("[MobileGlues] Setting: enableExtComputeShader = %s", global_settings.ext_compute_shader ? "true" : "false") - LOG_V("[MobileGlues] Setting: enableExtGL43 = %s", global_settings.ext_gl43 ? "true" : "false") - LOG_V("[MobileGlues] Setting: maxGlslCacheSize = %i", global_settings.max_glsl_cache_size / 1024 / 1024) + LOG_V("[MobileGlues] Setting: enableAngle = %s", + global_settings.angle == AngleMode::Enabled ? "true" : "false") + LOG_V("[MobileGlues] Setting: ignoreError = %i", + static_cast(global_settings.ignore_error)) + LOG_V("[MobileGlues] Setting: enableExtComputeShader = %s", + global_settings.ext_compute_shader ? "true" : "false") + LOG_V("[MobileGlues] Setting: enableExtGL43 = %s", + global_settings.ext_gl43 ? "true" : "false") + LOG_V("[MobileGlues] Setting: maxGlslCacheSize = %i", + static_cast(global_settings.max_glsl_cache_size / 1024 / 1024)) LOG_V("[MobileGlues] Setting: multidrawMode = %s", draw_mode_str.c_str()) } void init_settings_post() { bool multidraw = g_gles_caps.GL_EXT_multi_draw_indirect; - bool basevertex = - g_gles_caps.GL_OES_draw_elements_base_vertex || - (g_gles_caps.major == 3 && g_gles_caps.minor >= 2) || (g_gles_caps.major > 3); - bool indirect = (g_gles_caps.major == 3 && g_gles_caps.minor >= 1) || (g_gles_caps.major > 3); + bool basevertex = g_gles_caps.GL_OES_draw_elements_base_vertex || + (g_gles_caps.major == 3 && g_gles_caps.minor >= 2) || + (g_gles_caps.major > 3); + bool indirect = (g_gles_caps.major == 3 && g_gles_caps.minor >= 1) || + (g_gles_caps.major > 3); switch (global_settings.multidraw_mode) { case multidraw_mode_t::PreferIndirect: @@ -237,4 +237,4 @@ void init_settings_post() { } break; } -} \ No newline at end of file +} diff --git a/src/main/cpp/config/settings.h b/src/main/cpp/config/settings.h index 175a949..532a2fc 100644 --- a/src/main/cpp/config/settings.h +++ b/src/main/cpp/config/settings.h @@ -12,33 +12,57 @@ extern "C" { #if !defined(__APPLE__) #include <__stddef_size_t.h> #else -typedef unsigned long size_t; + typedef unsigned long size_t; #endif -enum class multidraw_mode_t: int { - Auto = 0, - PreferIndirect, - PreferBaseVertex, - PreferMultidrawIndirect, - DrawElements, - Compute, - MaxValue -}; + enum class multidraw_mode_t : int { + Auto = 0, + PreferIndirect, + PreferBaseVertex, + PreferMultidrawIndirect, + DrawElements, + Compute, + MaxValue + }; -struct global_settings_t { - int angle; // 0, 1 - int ignore_error; // 0, 1, 2 - int ext_gl43; // 0, 1 - int ext_compute_shader; // 0, 1 - size_t max_glsl_cache_size; // 0~ - multidraw_mode_t multidraw_mode; // 0, 1, 2, 3, 4 -}; + enum class AngleConfig : int { + DisableIfPossible = 0, + EnableIfPossible = 1, + ForceDisable = 2, + ForceEnable = 3 + }; -extern struct global_settings_t global_settings; + enum class AngleMode : int { + Disabled = 0, + Enabled = 1 + }; -void init_settings(); + enum class IgnoreErrorLevel : int { + None = 0, + Partial = 1, + Full = 2 + }; -void init_settings_post(); + enum class NoErrorConfig : int { + Auto = 0, + Disable = 1, + Level1 = 2, + Level2 = 3 + }; + + struct global_settings_t { + AngleMode angle; + IgnoreErrorLevel ignore_error; + bool ext_gl43; + bool ext_compute_shader; + size_t max_glsl_cache_size; + multidraw_mode_t multidraw_mode; + }; + + extern struct global_settings_t global_settings; + + void init_settings(); + void init_settings_post(); #ifdef __cplusplus } diff --git a/src/main/cpp/gl/framebuffer.cpp b/src/main/cpp/gl/framebuffer.cpp index 728a8f6..0dda33b 100644 --- a/src/main/cpp/gl/framebuffer.cpp +++ b/src/main/cpp/gl/framebuffer.cpp @@ -171,7 +171,7 @@ void glReadBuffer(GLenum src) { GLenum glCheckFramebufferStatus(GLenum target) { LOG() GLenum status = GLES.glCheckFramebufferStatus(target); - if(global_settings.ignore_error >= 2 && status != GL_FRAMEBUFFER_COMPLETE) { + if(global_settings.ignore_error == IgnoreErrorLevel::Full && status != GL_FRAMEBUFFER_COMPLETE) { LOG_W_FORCE("Framebuffer %d isn't GL_FRAMEBUFFER_COMPLETE: %d", target, status) LOG_W_FORCE("Now try to cheat.") return GL_FRAMEBUFFER_COMPLETE; diff --git a/src/main/cpp/gl/program.cpp b/src/main/cpp/gl/program.cpp index bad47ee..a6d9e73 100644 --- a/src/main/cpp/gl/program.cpp +++ b/src/main/cpp/gl/program.cpp @@ -116,7 +116,7 @@ void glLinkProgram(GLuint program) { void glGetProgramiv(GLuint program, GLenum pname, GLint *params) { LOG() GLES.glGetProgramiv(program, pname, params); - if(global_settings.ignore_error >= 1 && (pname == GL_LINK_STATUS || pname == GL_VALIDATE_STATUS) && !*params) { + if(global_settings.ignore_error >= IgnoreErrorLevel::Partial && (pname == GL_LINK_STATUS || pname == GL_VALIDATE_STATUS) && !*params) { GLchar infoLog[512]; GLES.glGetProgramInfoLog(program, 512, nullptr, infoLog); diff --git a/src/main/cpp/gl/shader.cpp b/src/main/cpp/gl/shader.cpp index 33a6ea3..578851a 100644 --- a/src/main/cpp/gl/shader.cpp +++ b/src/main/cpp/gl/shader.cpp @@ -113,7 +113,7 @@ void glShaderSource(GLuint shader, GLsizei count, const GLchar *const* string, c void glGetShaderiv(GLuint shader, GLenum pname, GLint *params) { LOG() GLES.glGetShaderiv(shader, pname, params); - if(global_settings.ignore_error >= 1 && pname == GL_COMPILE_STATUS && !*params) { + if(global_settings.ignore_error >= IgnoreErrorLevel::Partial && pname == GL_COMPILE_STATUS && !*params) { GLchar infoLog[512]; GLES.glGetShaderInfoLog(shader, 512, nullptr, infoLog); LOG_W_FORCE("Shader %d compilation failed: \n%s", shader, infoLog) diff --git a/src/main/cpp/gl/texture.cpp b/src/main/cpp/gl/texture.cpp index f6e2b15..c4106e3 100644 --- a/src/main/cpp/gl/texture.cpp +++ b/src/main/cpp/gl/texture.cpp @@ -63,7 +63,7 @@ void internal_convert(GLenum* internal_format, GLenum* type, GLenum* format) { break; case GL_DEPTH_COMPONENT: - LOG_D("Find GL_DEPTH_COMPONENT: internalFormat: %s, format: %s, type: %s", glEnumToString(*internal_format), glEnumToString(*format), glEnumToString(*type)) + LOG_V("Find GL_DEPTH_COMPONENT: internalFormat: %s, format: %s, type: %s", glEnumToString(*internal_format), glEnumToString(*format), glEnumToString(*type)) if (type) { switch (*type) { case GL_UNSIGNED_SHORT: diff --git a/src/main/cpp/gles/loader.cpp b/src/main/cpp/gles/loader.cpp index e7620a5..e543407 100644 --- a/src/main/cpp/gles/loader.cpp +++ b/src/main/cpp/gles/loader.cpp @@ -91,8 +91,8 @@ void load_libs() { static int first = 1; if (!first) return; first = 0; - const char *gles_override = global_settings.angle ? GLES_ANGLE : nullptr; - const char *egl_override = global_settings.angle ? EGL_ANGLE : nullptr; + const char *gles_override = global_settings.angle == AngleMode::Enabled ? GLES_ANGLE : nullptr; + const char *egl_override = global_settings.angle == AngleMode::Enabled ? EGL_ANGLE : nullptr; gles = open_lib(gles3_lib, gles_override); egl = open_lib(egl_lib, egl_override); #else