From aa44622ff4e0a4c64de0df10a1c9528ab2c98cca Mon Sep 17 00:00:00 2001 From: hwinnemoe Date: Mon, 3 Sep 2018 20:13:22 +0200 Subject: [PATCH 1/5] Provide Gecko with ImageRendering property when locking NativeTexture external images, fixes #2993 --- webrender/src/batch.rs | 1 + webrender/src/prim_store.rs | 5 ++++- webrender/src/renderer.rs | 14 +++++++++----- 3 files changed, 14 insertions(+), 6 deletions(-) diff --git a/webrender/src/batch.rs b/webrender/src/batch.rs index 00bd69e215..eefda86fe3 100644 --- a/webrender/src/batch.rs +++ b/webrender/src/batch.rs @@ -1611,6 +1611,7 @@ pub fn resolve_image( deferred_resolves.push(DeferredResolve { image_properties, address: gpu_cache.get_address(&cache_handle), + rendering: request.rendering, }); cache_item diff --git a/webrender/src/prim_store.rs b/webrender/src/prim_store.rs index 2cc22567ab..4f98bff8d7 100644 --- a/webrender/src/prim_store.rs +++ b/webrender/src/prim_store.rs @@ -211,12 +211,15 @@ impl SpaceMapper where F: fmt::Debug { /// images that are visible, a DeferredResolve is created /// that is stored in the frame. This allows the render /// thread to iterate this list and update any changed -/// texture data and update the UV rect. +/// texture data and update the UV rect. Any filtering +/// is handled externally for NativeTexture external +/// images. #[cfg_attr(feature = "capture", derive(Serialize))] #[cfg_attr(feature = "replay", derive(Deserialize))] pub struct DeferredResolve { pub address: GpuCacheAddress, pub image_properties: ImageProperties, + pub rendering: ImageRendering, } #[derive(Debug, Copy, Clone, Eq, PartialEq, Hash, Ord, PartialOrd)] diff --git a/webrender/src/renderer.rs b/webrender/src/renderer.rs index 6e8e603f81..db7c7a58ea 100644 --- a/webrender/src/renderer.rs +++ b/webrender/src/renderer.rs @@ -12,6 +12,7 @@ use api::{BlobImageHandler, ColorF, DeviceIntPoint, DeviceIntRect, DeviceIntSize}; use api::{DeviceUintPoint, DeviceUintRect, DeviceUintSize, DocumentId, Epoch, ExternalImageId}; use api::{ExternalImageType, FontRenderMode, FrameMsg, ImageFormat, PipelineId}; +use api::{ImageRendering}; use api::{RenderApiSender, RenderNotifier, TexelRect, TextureTarget}; use api::{channel}; use api::DebugCommand; @@ -2601,7 +2602,8 @@ impl Renderer { let handler = self.external_image_handler .as_mut() .expect("Found external image, but no handler set!"); - let size = match handler.lock(id, channel_index).source { + // The filter is only relevant for NativeTexture external images. + let size = match handler.lock(id, channel_index, ImageRendering::Auto).source { ExternalImageSource::RawData(data) => { uploader.upload( rect, layer_index, stride, @@ -3453,7 +3455,8 @@ impl Renderer { let ext_image = props .external_image .expect("BUG: Deferred resolves must be external images!"); - let image = handler.lock(ext_image.id, ext_image.channel_index); + // Provide rendering information for NativeTexture external images. + let image = handler.lock(ext_image.id, ext_image.channel_index, deferred_resolve.rendering); let texture_target = match ext_image.image_type { ExternalImageType::TextureHandle(target) => target, ExternalImageType::Buffer => { @@ -4105,8 +4108,8 @@ pub struct ExternalImage<'a> { pub trait ExternalImageHandler { /// Lock the external image. Then, WR could start to read the image content. /// The WR client should not change the image content until the unlock() - /// call. - fn lock(&mut self, key: ExternalImageId, channel_index: u8) -> ExternalImage; + /// call. Provide ImageRendering for NativeTexture external images. + fn lock(&mut self, key: ExternalImageId, channel_index: u8, rendering: ImageRendering) -> ExternalImage; /// Unlock the external image. The WR should not read the image content /// after this call. fn unlock(&mut self, key: ExternalImageId, channel_index: u8); @@ -4435,7 +4438,8 @@ impl Renderer { for def in &deferred_images { info!("\t{}", def.short_path); let ExternalImageData { id, channel_index, image_type } = def.external; - let ext_image = handler.lock(id, channel_index); + // The image rendering parameter is irrelevant because no filtering happens during capturing. + let ext_image = handler.lock(id, channel_index, ImageRendering::Auto); let (data, short_path) = match ext_image.source { ExternalImageSource::RawData(data) => { let arc_id = arc_map.len() + 1; From a87bdec33f9575587514a1e7c6fa7f8c3cf2b299 Mon Sep 17 00:00:00 2001 From: hwinnemoe Date: Mon, 3 Sep 2018 21:18:23 +0200 Subject: [PATCH 2/5] Fixed missing argument for replay version of lock call --- webrender/src/renderer.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/webrender/src/renderer.rs b/webrender/src/renderer.rs index db7c7a58ea..9fe58a7b27 100644 --- a/webrender/src/renderer.rs +++ b/webrender/src/renderer.rs @@ -4306,7 +4306,7 @@ struct DummyExternalImageHandler { #[cfg(feature = "replay")] impl ExternalImageHandler for DummyExternalImageHandler { - fn lock(&mut self, key: ExternalImageId, channel_index: u8) -> ExternalImage { + fn lock(&mut self, key: ExternalImageId, channel_index: u8, rendering: ImageRendering) -> ExternalImage { let (ref captured_data, ref uv) = self.data[&(key, channel_index)]; ExternalImage { uv: *uv, From 935e53b5ca83e937e9a5f8cd697e9408569bbecc Mon Sep 17 00:00:00 2001 From: hwinnemoe Date: Mon, 3 Sep 2018 21:32:24 +0200 Subject: [PATCH 3/5] Fix unused warning. --- webrender/src/renderer.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/webrender/src/renderer.rs b/webrender/src/renderer.rs index 9fe58a7b27..60184dd518 100644 --- a/webrender/src/renderer.rs +++ b/webrender/src/renderer.rs @@ -4306,7 +4306,7 @@ struct DummyExternalImageHandler { #[cfg(feature = "replay")] impl ExternalImageHandler for DummyExternalImageHandler { - fn lock(&mut self, key: ExternalImageId, channel_index: u8, rendering: ImageRendering) -> ExternalImage { + fn lock(&mut self, key: ExternalImageId, channel_index: u8, _rendering: ImageRendering) -> ExternalImage { let (ref captured_data, ref uv) = self.data[&(key, channel_index)]; ExternalImage { uv: *uv, From 9dd6c97f91c1ad997cc399b613325b0746629b40 Mon Sep 17 00:00:00 2001 From: hwinnemoe Date: Tue, 4 Sep 2018 15:54:56 +0200 Subject: [PATCH 4/5] Update examples to new interface of lock() of webrender::ExternalImageHandler. --- examples/frame_output.rs | 2 +- examples/texture_cache_stress.rs | 2 +- examples/yuv.rs | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/examples/frame_output.rs b/examples/frame_output.rs index 5e845a1208..ac261e575d 100644 --- a/examples/frame_output.rs +++ b/examples/frame_output.rs @@ -50,7 +50,7 @@ impl webrender::OutputImageHandler for OutputHandler { } impl webrender::ExternalImageHandler for ExternalHandler { - fn lock(&mut self, _key: ExternalImageId, _channel_index: u8) -> webrender::ExternalImage { + fn lock(&mut self, _key: ExternalImageId, _channel_index: u8, _rendering: ImageRendering) -> webrender::ExternalImage { webrender::ExternalImage { uv: TexelRect::new(0.0, 0.0, 1.0, 1.0), source: webrender::ExternalImageSource::NativeTexture(self.texture_id), diff --git a/examples/texture_cache_stress.rs b/examples/texture_cache_stress.rs index e3356ca796..19260da755 100644 --- a/examples/texture_cache_stress.rs +++ b/examples/texture_cache_stress.rs @@ -61,7 +61,7 @@ impl ImageGenerator { } impl webrender::ExternalImageHandler for ImageGenerator { - fn lock(&mut self, _key: ExternalImageId, channel_index: u8) -> webrender::ExternalImage { + fn lock(&mut self, _key: ExternalImageId, channel_index: u8, _rendering: ImageRendering) -> webrender::ExternalImage { self.generate_image(channel_index as u32); webrender::ExternalImage { uv: TexelRect::new(0.0, 0.0, 1.0, 1.0), diff --git a/examples/yuv.rs b/examples/yuv.rs index daf3b397eb..10a9af23c0 100644 --- a/examples/yuv.rs +++ b/examples/yuv.rs @@ -60,7 +60,7 @@ impl YuvImageProvider { } impl webrender::ExternalImageHandler for YuvImageProvider { - fn lock(&mut self, key: ExternalImageId, _channel_index: u8) -> webrender::ExternalImage { + fn lock(&mut self, key: ExternalImageId, _channel_index: u8, _rendering: ImageRendering) -> webrender::ExternalImage { let id = self.texture_ids[key.0 as usize]; webrender::ExternalImage { uv: TexelRect::new(0.0, 0.0, 1.0, 1.0), From cd93b956ff9caee8c3dd5561c724af5e3a4c6109 Mon Sep 17 00:00:00 2001 From: hwinnemoe Date: Tue, 4 Sep 2018 16:55:34 +0200 Subject: [PATCH 5/5] Fixed too long lines of code. --- examples/frame_output.rs | 7 ++++++- examples/texture_cache_stress.rs | 7 ++++++- examples/yuv.rs | 7 ++++++- 3 files changed, 18 insertions(+), 3 deletions(-) diff --git a/examples/frame_output.rs b/examples/frame_output.rs index ac261e575d..9704c346f9 100644 --- a/examples/frame_output.rs +++ b/examples/frame_output.rs @@ -50,7 +50,12 @@ impl webrender::OutputImageHandler for OutputHandler { } impl webrender::ExternalImageHandler for ExternalHandler { - fn lock(&mut self, _key: ExternalImageId, _channel_index: u8, _rendering: ImageRendering) -> webrender::ExternalImage { + fn lock( + &mut self, + _key: ExternalImageId, + _channel_index: u8, + _rendering: ImageRendering + ) -> webrender::ExternalImage { webrender::ExternalImage { uv: TexelRect::new(0.0, 0.0, 1.0, 1.0), source: webrender::ExternalImageSource::NativeTexture(self.texture_id), diff --git a/examples/texture_cache_stress.rs b/examples/texture_cache_stress.rs index 19260da755..dd5c59ac26 100644 --- a/examples/texture_cache_stress.rs +++ b/examples/texture_cache_stress.rs @@ -61,7 +61,12 @@ impl ImageGenerator { } impl webrender::ExternalImageHandler for ImageGenerator { - fn lock(&mut self, _key: ExternalImageId, channel_index: u8, _rendering: ImageRendering) -> webrender::ExternalImage { + fn lock( + &mut self, + _key: ExternalImageId, + channel_index: u8, + _rendering: ImageRendering + ) -> webrender::ExternalImage { self.generate_image(channel_index as u32); webrender::ExternalImage { uv: TexelRect::new(0.0, 0.0, 1.0, 1.0), diff --git a/examples/yuv.rs b/examples/yuv.rs index 10a9af23c0..d2f444bda8 100644 --- a/examples/yuv.rs +++ b/examples/yuv.rs @@ -60,7 +60,12 @@ impl YuvImageProvider { } impl webrender::ExternalImageHandler for YuvImageProvider { - fn lock(&mut self, key: ExternalImageId, _channel_index: u8, _rendering: ImageRendering) -> webrender::ExternalImage { + fn lock( + &mut self, + key: ExternalImageId, + _channel_index: u8, + _rendering: ImageRendering + ) -> webrender::ExternalImage { let id = self.texture_ids[key.0 as usize]; webrender::ExternalImage { uv: TexelRect::new(0.0, 0.0, 1.0, 1.0),