| author | Glenn Watson <git@intuitionlibrary.com> |
| Tue, 17 Dec 2019 21:51:30 +0000 | |
| changeset 507463 | 35af0b925215124a619bc054aeeb8d01e99b4e63 |
| parent 507462 | fa79d18ffe93d415c9e953fb8127914248e3b701 |
| child 507464 | c81cf0c409bcaea6a6e6299cb2f421e4528e023b |
| push id | 36927 |
| push user | aiakab@mozilla.com |
| push date | Wed, 18 Dec 2019 00:51:03 +0000 |
| treeherder | mozilla-central@35af0b925215 [default view] [failures only] |
| perfherder | [talos] [build metrics] [platform microbench] (compared to previous push) |
| reviewers | kvark |
| bugs | 1604625 |
| milestone | 73.0a1 |
| first release with | nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
|
| last release without | nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
|
--- a/gfx/webrender_bindings/WebRenderAPI.cpp +++ b/gfx/webrender_bindings/WebRenderAPI.cpp @@ -65,16 +65,25 @@ class NewRenderer : public RendererEvent // nullptr return; } *mUseANGLE = compositor->UseANGLE(); *mUseDComp = compositor->UseDComp(); *mUseTripleBuffering = compositor->UseTripleBuffering(); + // Only allow the panic on GL error functionality in nightly builds, + // since it (deliberately) crashes the GPU process if any GL call + // returns an error code. + bool panic_on_gl_error = false; +#ifdef NIGHTLY_BUILD + panic_on_gl_error = + StaticPrefs::gfx_webrender_panic_on_gl_error_AtStartup(); +#endif + bool allow_texture_swizzling = gfx::gfxVars::UseGLSwizzle(); bool isMainWindow = true; // TODO! bool supportLowPriorityTransactions = isMainWindow; bool supportLowPriorityThreadpool = supportLowPriorityTransactions && StaticPrefs::gfx_webrender_enable_low_priority_pool(); bool supportPictureCaching = isMainWindow; wr::Renderer* wrRenderer = nullptr; @@ -99,17 +108,18 @@ class NewRenderer : public RendererEvent aRenderThread.ThreadPool().Raw(), aRenderThread.ThreadPoolLP().Raw(), &WebRenderMallocSizeOf, &WebRenderMallocEnclosingSizeOf, (uint32_t)wr::RenderRoot::Default, compositor->ShouldUseNativeCompositor() ? compositor.get() : nullptr, compositor->GetMaxUpdateRects(), compositor->GetMaxPartialPresentRects(), mDocHandle, &wrRenderer, mMaxTextureSize, - StaticPrefs::gfx_webrender_enable_gpu_markers_AtStartup())) { + StaticPrefs::gfx_webrender_enable_gpu_markers_AtStartup(), + panic_on_gl_error)) { // wr_window_new puts a message into gfxCriticalNote if it returns false return; } MOZ_ASSERT(wrRenderer); RefPtr<RenderThread> thread = &aRenderThread; auto renderer = MakeUnique<RendererOGL>(std::move(thread), std::move(compositor),
--- a/gfx/webrender_bindings/src/bindings.rs +++ b/gfx/webrender_bindings/src/bindings.rs @@ -1213,17 +1213,28 @@ fn wr_device_new(gl_context: *mut c_void } }; let cached_programs = match pc { Some(cached_programs) => Some(Rc::clone(cached_programs.rc_get())), None => None, }; - Device::new(gl, resource_override_path, upload_method, cached_programs, false, true, true, None, false) + Device::new( + gl, + resource_override_path, + upload_method, + cached_programs, + false, + true, + true, + None, + false, + false, + ) } extern "C" { fn wr_compositor_create_surface( compositor: *mut c_void, id: NativeSurfaceId, size: DeviceIntSize, is_opaque: bool, @@ -1368,17 +1379,18 @@ pub extern "C" fn wr_window_new(window_i enclosing_size_of_op: VoidPtrToSizeFn, document_id: u32, compositor: *mut c_void, max_update_rects: usize, max_partial_present_rects: usize, out_handle: &mut *mut DocumentHandle, out_renderer: &mut *mut Renderer, out_max_texture_size: *mut i32, - enable_gpu_markers: bool) + enable_gpu_markers: bool, + panic_on_gl_error: bool) -> bool { assert!(unsafe { is_in_render_thread() }); let recorder: Option<Box<dyn ApiRecordingReceiver>> = if unsafe { gfx_use_wrench() } { let name = format!("wr-record-{}.bin", window_id.0); Some(Box::new(BinaryRecorder::new(&PathBuf::from(name)))) } else { None @@ -1474,16 +1486,17 @@ pub extern "C" fn wr_window_new(window_i precache_flags, namespace_alloc_by_client: true, enable_picture_caching, allow_pixel_local_storage_support: false, start_debug_server, surface_origin_is_top_left, compositor_config, enable_gpu_markers, + panic_on_gl_error, ..Default::default() }; // Ensure the WR profiler callbacks are hooked up to the Gecko profiler. set_profiler_hooks(Some(&PROFILER_HOOKS)); let window_size = DeviceIntSize::new(window_width, window_height); let notifier = Box::new(CppNotifier {
--- a/gfx/wr/webrender/src/device/gl.rs +++ b/gfx/wr/webrender/src/device/gl.rs @@ -1248,16 +1248,17 @@ impl Device { resource_override_path: Option<PathBuf>, upload_method: UploadMethod, cached_programs: Option<Rc<ProgramCache>>, allow_pixel_local_storage_support: bool, allow_texture_storage_support: bool, allow_texture_swizzling: bool, dump_shader_source: Option<String>, surface_origin_is_top_left: bool, + panic_on_gl_error: bool, ) -> Device { let mut max_texture_size = [0]; let mut max_texture_layers = [0]; unsafe { gl.get_integer_v(gl::MAX_TEXTURE_SIZE, &mut max_texture_size); gl.get_integer_v(gl::MAX_ARRAY_TEXTURE_LAYERS, &mut max_texture_layers); } @@ -1274,21 +1275,22 @@ impl Device { for i in 0 .. extension_count { extensions.push(gl.get_string_i(gl::EXTENSIONS, i)); } // On debug builds, assert that each GL call is error-free. We don't do // this on release builds because the synchronous call can stall the // pipeline. let supports_khr_debug = supports_extension(&extensions, "GL_KHR_debug"); - if cfg!(debug_assertions) { + if panic_on_gl_error || cfg!(debug_assertions) { gl = gl::ErrorReactingGl::wrap(gl, move |gl, name, code| { if supports_khr_debug { Self::log_driver_messages(gl); } + println!("Caught GL error {:x} at {}", code, name); panic!("Caught GL error {:x} at {}", code, name); }); } if supports_extension(&extensions, "GL_ANGLE_provoking_vertex") { gl.provoking_vertex_angle(gl::FIRST_VERTEX_CONVENTION); }
--- a/gfx/wr/webrender/src/renderer.rs +++ b/gfx/wr/webrender/src/renderer.rs @@ -1969,16 +1969,17 @@ impl Renderer { options.resource_override_path.clone(), options.upload_method.clone(), options.cached_programs.take(), options.allow_pixel_local_storage_support, options.allow_texture_storage_support, options.allow_texture_swizzling, options.dump_shader_source.take(), options.surface_origin_is_top_left, + options.panic_on_gl_error, ); let color_cache_formats = device.preferred_color_formats(); let swizzle_settings = device.swizzle_settings(); let supports_dual_source_blending = match gl_type { gl::GlType::Gl => device.supports_extension("GL_ARB_blend_func_extended") && device.supports_extension("GL_ARB_explicit_attrib_location"), gl::GlType::Gles => device.supports_extension("GL_EXT_blend_func_extended"), @@ -6173,16 +6174,19 @@ pub struct RendererOptions { /// Start the debug server for this renderer. pub start_debug_server: bool, /// Output the source of the shader with the given name. pub dump_shader_source: Option<String>, pub surface_origin_is_top_left: bool, /// The configuration options defining how WR composites the final scene. pub compositor_config: CompositorConfig, pub enable_gpu_markers: bool, + /// If true, panic whenever a GL error occurs. This has a significant + /// performance impact, so only use when debugging specific problems! + pub panic_on_gl_error: bool, } impl Default for RendererOptions { fn default() -> Self { RendererOptions { device_pixel_ratio: 1.0, resource_override_path: None, enable_aa: true, @@ -6228,16 +6232,17 @@ impl Default for RendererOptions { // that if the debugger feature is enabled, the debug server will // be started automatically. Users can explicitly disable this as // needed. start_debug_server: true, dump_shader_source: None, surface_origin_is_top_left: false, compositor_config: CompositorConfig::default(), enable_gpu_markers: true, + panic_on_gl_error: false, } } } pub trait DebugServer { fn send(&mut self, _message: String); }
--- a/modules/libpref/init/StaticPrefList.yaml +++ b/modules/libpref/init/StaticPrefList.yaml @@ -3720,16 +3720,25 @@ #else value: false #endif mirror: once #ifdef NIGHTLY_BUILD # Keep this pref hidden on non-nightly builds to avoid people accidentally # turning it on. +- name: gfx.webrender.panic-on-gl-error + type: bool + value: false + mirror: once +#endif + +#ifdef NIGHTLY_BUILD + # Keep this pref hidden on non-nightly builds to avoid people accidentally + # turning it on. - name: gfx.webrender.start-debug-server type: RelaxedAtomicBool value: false mirror: always #endif #ifdef XP_WIN # Enables display of performance debugging counters when DirectComposition