Browse Source

fix: broken shader cache due to compilation error (#40450)

Refs https://chromium-review.googlesource.com/c/chromium/src/+/4988290
Robo 1 year ago
parent
commit
0b847b0d9f

+ 1 - 0
patches/chromium/.patches

@@ -136,3 +136,4 @@ revert_remove_the_allowaggressivethrottlingwithwebsocket_feature.patch
 fix_handle_no_top_level_aura_window_in_webcontentsimpl.patch
 feat_allow_passing_of_objecttemplate_to_objecttemplatebuilder.patch
 chore_remove_check_is_test_on_script_injection_tracker.patch
+crash_gpu_process_and_clear_shader_cache_when_skia_reports.patch

+ 70 - 0
patches/chromium/crash_gpu_process_and_clear_shader_cache_when_skia_reports.patch

@@ -0,0 +1,70 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: Le Hoang Quyen <[email protected]>
+Date: Tue, 31 Oct 2023 08:52:25 +0000
+Subject: Crash GPU process and clear shader cache when skia reports
+ compileError.
+
+Sometimes Skia failed to compile the cached GLSL because the driver had
+been changed but GL_RENDERER was still the same. In this case, we better
+crash the GPU process and signal the browser to clear the cache & let
+Skia regenerate the GLSL in the next run.
+
+Even if the compile failure wasn't caused by the cached GLSL. It's still
+better to crash the GPU process and let the shaders be re-generated.
+Because a failed compilation would have resulted in wrong rendering
+even if we had allowed the process to continue its execution.
+
+Bug: 1442633
+Change-Id: Ia0e36bd4674877de5be451a6ea9c4e7fa5e34e8e
+Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/4988290
+Reviewed-by: Sunny Sachanandani <[email protected]>
+Commit-Queue: Quyen Le <[email protected]>
+Cr-Commit-Position: refs/heads/main@{#1217461}
+
+diff --git a/gpu/command_buffer/service/shared_context_state.cc b/gpu/command_buffer/service/shared_context_state.cc
+index 63f6c33ad5f41cde0fca08d60e7e10fe1154e165..f422ec52ca74f5a636e11591ba42444773a5c682 100644
+--- a/gpu/command_buffer/service/shared_context_state.cc
++++ b/gpu/command_buffer/service/shared_context_state.cc
+@@ -4,6 +4,7 @@
+ 
+ #include "gpu/command_buffer/service/shared_context_state.h"
+ 
++#include "base/immediate_crash.h"
+ #include "base/observer_list.h"
+ #include "base/strings/stringprintf.h"
+ #include "base/system/sys_info.h"
+@@ -101,6 +102,13 @@ void SharedContextState::compileError(const char* shader, const char* errors) {
+                << "------------------------\n"
+                << shader << "\nErrors:\n"
+                << errors;
++
++    // Increase shader cache shm count and crash the GPU process so that the
++    // browser process would clear the cache.
++    GpuProcessShmCount::ScopedIncrement increment(
++        use_shader_cache_shm_count_.get());
++
++    base::ImmediateCrash();
+   }
+ }
+ 
+@@ -305,6 +313,7 @@ bool SharedContextState::InitializeGanesh(
+     gl::ProgressReporter* progress_reporter) {
+   progress_reporter_ = progress_reporter;
+   gr_shader_cache_ = cache;
++  use_shader_cache_shm_count_ = use_shader_cache_shm_count;
+ 
+   size_t max_resource_cache_bytes;
+   size_t glyph_cache_max_texture_bytes;
+diff --git a/gpu/command_buffer/service/shared_context_state.h b/gpu/command_buffer/service/shared_context_state.h
+index 05822df27221cd5003e8c12f809805f3bd0c597b..7c21a81066afd77e310f0fdfca7da92f8f7cb4e1 100644
+--- a/gpu/command_buffer/service/shared_context_state.h
++++ b/gpu/command_buffer/service/shared_context_state.h
+@@ -392,6 +392,8 @@ class GPU_GLES2_EXPORT SharedContextState
+   std::vector<uint8_t> scratch_deserialization_buffer_;
+   raw_ptr<gpu::raster::GrShaderCache, DanglingUntriaged> gr_shader_cache_ =
+       nullptr;
++  raw_ptr<GpuProcessShmCount, DanglingUntriaged> use_shader_cache_shm_count_ =
++      nullptr;
+ 
+   // |need_context_state_reset| is set whenever Skia may have altered the
+   // driver's GL state.