diff --git a/src/main/cpp/config/settings.cpp b/src/main/cpp/config/settings.cpp index 88dabb3..7e7b408 100644 --- a/src/main/cpp/config/settings.cpp +++ b/src/main/cpp/config/settings.cpp @@ -20,6 +20,7 @@ void init_settings() { global_settings.ext_compute_shader = false; global_settings.max_glsl_cache_size = 30 * 1024 * 1024; global_settings.multidraw_mode = multidraw_mode_t::DrawElements; + global_settings.angle_depth_clear_fix_mode = AngleDepthClearFixMode::Disabled; #else int success = initialized; @@ -36,7 +37,8 @@ void init_settings() { bool enableExtComputeShader = success ? (config_get_int("enableExtComputeShader") != 0) : false; int enableCompatibleMode = success ? config_get_int("enableCompatibleMode") : 0; multidraw_mode_t multidrawMode = success ? static_cast(config_get_int("multidrawMode")) : multidraw_mode_t::Auto; - + AngleDepthClearFixMode angleDepthClearFixMode = success ? static_cast(config_get_int("angleDepthClearFixMode")) : AngleDepthClearFixMode::Disabled; + size_t maxGlslCacheSize = 0; if (config_get_int("maxGlslCacheSize") > 0) { maxGlslCacheSize = success ? config_get_int("maxGlslCacheSize") * 1024 * 1024 : 0; @@ -51,6 +53,9 @@ void init_settings() { if (static_cast(multidrawMode) < 0 || static_cast(multidrawMode) >= static_cast(multidraw_mode_t::MaxValue)) { multidrawMode = multidraw_mode_t::Auto; } + if (static_cast(angleDepthClearFixMode) < 0 || static_cast(angleDepthClearFixMode) >= static_cast(AngleDepthClearFixMode::MaxValue)) { + angleDepthClearFixMode = AngleDepthClearFixMode::Disabled; + } if (enableCompatibleMode < 0 || enableCompatibleMode > 1) { enableCompatibleMode = 0; } @@ -72,6 +77,7 @@ void init_settings() { enableExtComputeShader = false; maxGlslCacheSize = 0; enableCompatibleMode = 0; + angleDepthClearFixMode = AngleDepthClearFixMode::Disabled; } AngleMode finalAngleMode = AngleMode::Disabled; @@ -146,6 +152,7 @@ void init_settings() { global_settings.ext_compute_shader = enableExtComputeShader; global_settings.max_glsl_cache_size = maxGlslCacheSize; global_settings.multidraw_mode = multidrawMode; + global_settings.angle_depth_clear_fix_mode = angleDepthClearFixMode; #endif std::string draw_mode_str; @@ -173,6 +180,7 @@ void init_settings() { 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()) + LOG_V("[MobileGlues] Setting: angleDepthClearFixMode = %i", static_cast(angleDepthClearFixMode)) } void init_settings_post() { diff --git a/src/main/cpp/config/settings.h b/src/main/cpp/config/settings.h index 532a2fc..8f1514e 100644 --- a/src/main/cpp/config/settings.h +++ b/src/main/cpp/config/settings.h @@ -50,6 +50,12 @@ extern "C" { Level2 = 3 }; + enum class AngleDepthClearFixMode : int { + Disabled = 0, + Mode1 = 1, + MaxValue + }; + struct global_settings_t { AngleMode angle; IgnoreErrorLevel ignore_error; @@ -57,6 +63,7 @@ extern "C" { bool ext_compute_shader; size_t max_glsl_cache_size; multidraw_mode_t multidraw_mode; + AngleDepthClearFixMode angle_depth_clear_fix_mode; }; extern struct global_settings_t global_settings; diff --git a/src/main/cpp/gl/gl.cpp b/src/main/cpp/gl/gl.cpp index cd8d5b9..406407f 100644 --- a/src/main/cpp/gl/gl.cpp +++ b/src/main/cpp/gl/gl.cpp @@ -111,7 +111,10 @@ void glClear(GLbitfield mask) { LOG(); LOG_D("glClear, mask = 0x%x", mask); - if (global_settings.angle == AngleMode::Enabled && mask == GL_DEPTH_BUFFER_BIT && fabs(currentDepthValue - 1.0f) <= 0.001f) { + if (global_settings.angle_depth_clear_fix_mode == AngleDepthClearFixMode::Mode1 && + global_settings.angle == AngleMode::Enabled && + mask == GL_DEPTH_BUFFER_BIT && + fabs(currentDepthValue - 1.0f) <= 0.001f) { // Workaround for ANGLE depth-clear bug: if depth≈1.0, draw a fullscreen triangle at z=1.0 to force actual depth buffer write. DrawDepthClearTri(); // Clear again