diff --git a/examples/frame_output.rs b/examples/frame_output.rs index 5e845a1208..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) -> 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..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) -> 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..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) -> 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), 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..60184dd518 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); @@ -4303,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, @@ -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;