From 3c50dc47af67a81ec7c405a62ec967b9c3ba6b2d Mon Sep 17 00:00:00 2001 From: Patrick Walton Date: Thu, 20 Sep 2018 17:51:00 -0700 Subject: [PATCH] Stop using `glBlitFramebuffer()` for scaling tasks. The driver is allowed to read outside of the source rect, and this can cause incorrect results. This patch makes `preserve-3d.png` test have some minor rounding differences in its colors from the previous implementation, so I regenerated the reference image. Closes #3088. --- webrender/res/cs_scale.glsl | 68 +++++++++++++++ webrender/src/gpu_types.rs | 9 ++ webrender/src/render_task.rs | 36 ++++++-- webrender/src/renderer.rs | 82 +++++++++++++----- webrender/src/shade.rs | 26 +++++- webrender/src/tiling.rs | 49 +++++++---- .../boxshadow/inset-border-radius.png | Bin 3390 -> 3391 bytes wrench/reftests/filters/reftest.list | 2 +- wrench/reftests/snap/preserve-3d.png | Bin 6046 -> 6822 bytes 9 files changed, 222 insertions(+), 50 deletions(-) create mode 100644 webrender/res/cs_scale.glsl diff --git a/webrender/res/cs_scale.glsl b/webrender/res/cs_scale.glsl new file mode 100644 index 0000000000..13070d05c9 --- /dev/null +++ b/webrender/res/cs_scale.glsl @@ -0,0 +1,68 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#include shared,prim_shared + +varying vec3 vUv; +flat varying vec4 vUvRect; + +#ifdef WR_VERTEX_SHADER + +in int aScaleRenderTaskAddress; +in int aScaleSourceTaskAddress; + +struct ScaleTask { + RenderTaskCommonData common_data; +}; + +ScaleTask fetch_scale_task(int address) { + RenderTaskData task_data = fetch_render_task_data(address); + + ScaleTask task = ScaleTask(task_data.common_data); + + return task; +} + +void main(void) { + ScaleTask scale_task = fetch_scale_task(aScaleRenderTaskAddress); + RenderTaskCommonData src_task = fetch_render_task_common_data(aScaleSourceTaskAddress); + + RectWithSize src_rect = src_task.task_rect; + RectWithSize target_rect = scale_task.common_data.task_rect; + +#if defined WR_FEATURE_COLOR_TARGET + vec2 texture_size = vec2(textureSize(sCacheRGBA8, 0).xy); +#else + vec2 texture_size = vec2(textureSize(sCacheA8, 0).xy); +#endif + + vUv.z = src_task.texture_layer_index; + + vUvRect = vec4(src_rect.p0 + vec2(0.5), + src_rect.p0 + src_rect.size - vec2(0.5)) / texture_size.xyxy; + + vec2 pos = target_rect.p0 + target_rect.size * aPosition.xy; + vUv.xy = (src_rect.p0 + src_rect.size * aPosition.xy) / texture_size; + + gl_Position = uTransform * vec4(pos, 0.0, 1.0); +} + +#endif + +#ifdef WR_FRAGMENT_SHADER + +#if defined WR_FEATURE_COLOR_TARGET +#define SAMPLE_TYPE vec4 +#define SAMPLE_TEXTURE(uv) texture(sCacheRGBA8, uv) +#else +#define SAMPLE_TYPE float +#define SAMPLE_TEXTURE(uv) texture(sCacheA8, uv).r +#endif + +void main(void) { + vec2 st = clamp(vUv.xy, vUvRect.xy, vUvRect.zw); + oFragColor = vec4(SAMPLE_TEXTURE(vec3(st, vUv.z))); +} + +#endif diff --git a/webrender/src/gpu_types.rs b/webrender/src/gpu_types.rs index 50beff47f4..9ef9e7bec8 100644 --- a/webrender/src/gpu_types.rs +++ b/webrender/src/gpu_types.rs @@ -80,6 +80,15 @@ pub struct BlurInstance { pub blur_direction: BlurDirection, } +#[derive(Debug)] +#[repr(C)] +#[cfg_attr(feature = "capture", derive(Serialize))] +#[cfg_attr(feature = "replay", derive(Deserialize))] +pub struct ScalingInstance { + pub task_address: RenderTaskAddress, + pub src_task_address: RenderTaskAddress, +} + #[derive(Debug, Copy, Clone, PartialEq)] #[repr(C)] #[cfg_attr(feature = "capture", derive(Serialize))] diff --git a/webrender/src/render_task.rs b/webrender/src/render_task.rs index ba77a73761..1f0fab652d 100644 --- a/webrender/src/render_task.rs +++ b/webrender/src/render_task.rs @@ -229,6 +229,15 @@ impl BlurTask { } } +#[derive(Debug)] +#[cfg_attr(feature = "capture", derive(Serialize))] +#[cfg_attr(feature = "replay", derive(Deserialize))] +pub struct ScalingTask { + pub target_kind: RenderTargetKind, + pub uv_rect_handle: GpuCacheHandle, + uv_rect_kind: UvRectKind, +} + #[derive(Debug)] #[cfg(feature = "pathfinder")] #[cfg_attr(feature = "capture", derive(Serialize))] @@ -295,7 +304,7 @@ pub enum RenderTaskKind { #[allow(dead_code)] Glyph(GlyphTask), Readback(DeviceIntRect), - Scaling(RenderTargetKind), + Scaling(ScalingTask), Blit(BlitTask), Border(BorderTask), } @@ -569,8 +578,9 @@ impl RenderTask { scale_factor *= 2.0; adjusted_blur_target_size = (blur_target_size.to_f32() / scale_factor).to_i32(); let downscaling_task = RenderTask::new_scaling( - target_kind, downscaling_src_task_id, + render_tasks, + target_kind, adjusted_blur_target_size, ); downscaling_src_task_id = render_tasks.add(downscaling_task); @@ -618,14 +628,21 @@ impl RenderTask { } pub fn new_scaling( - target_kind: RenderTargetKind, src_task_id: RenderTaskId, + render_tasks: &mut RenderTaskTree, + target_kind: RenderTargetKind, target_size: DeviceIntSize, ) -> Self { + let uv_rect_kind = render_tasks[src_task_id].uv_rect_kind(); + RenderTask::with_dynamic_location( target_size, vec![src_task_id], - RenderTaskKind::Scaling(target_kind), + RenderTaskKind::Scaling(ScalingTask { + target_kind, + uv_rect_handle: GpuCacheHandle::new(), + uv_rect_kind, + }), match target_kind { RenderTargetKind::Color => ClearMode::Transparent, RenderTargetKind::Alpha => ClearMode::One, @@ -659,8 +676,7 @@ impl RenderTask { fn uv_rect_kind(&self) -> UvRectKind { match self.kind { RenderTaskKind::CacheMask(..) | - RenderTaskKind::Readback(..) | - RenderTaskKind::Scaling(..) => { + RenderTaskKind::Readback(..) => { unreachable!("bug: unexpected render task"); } @@ -673,6 +689,10 @@ impl RenderTask { task.uv_rect_kind } + RenderTaskKind::Scaling(ref task) => { + task.uv_rect_kind + } + RenderTaskKind::ClipRegion(..) | RenderTaskKind::Glyph(_) | RenderTaskKind::Border(..) | @@ -836,8 +856,8 @@ impl RenderTask { RenderTargetKind::Color } - RenderTaskKind::Scaling(target_kind) => { - target_kind + RenderTaskKind::Scaling(ref task_info) => { + task_info.target_kind } RenderTaskKind::Border(..) | diff --git a/webrender/src/renderer.rs b/webrender/src/renderer.rs index 818d04f820..f90c5ccee7 100644 --- a/webrender/src/renderer.rs +++ b/webrender/src/renderer.rs @@ -38,6 +38,7 @@ use gpu_cache::{GpuBlockData, GpuCacheUpdate, GpuCacheUpdateList}; use gpu_cache::GpuDebugChunk; #[cfg(feature = "pathfinder")] use gpu_glyph_renderer::GpuGlyphRenderer; +use gpu_types::ScalingInstance; use internal_types::{SourceTexture, ORTHO_FAR_PLANE, ORTHO_NEAR_PLANE, ResourceCacheError}; use internal_types::{CacheTextureId, DebugOutput, FastHashMap, RenderedDocument, ResultMsg}; use internal_types::{TextureUpdateList, TextureUpdateOp, TextureUpdateSource}; @@ -70,7 +71,7 @@ use texture_cache::TextureCache; use thread_profiler::{register_thread_with_profiler, write_profile}; use tiling::{AlphaRenderTarget, ColorRenderTarget}; use tiling::{BlitJob, BlitJobSource, RenderPass, RenderPassKind, RenderTargetList}; -use tiling::{Frame, RenderTarget, RenderTargetKind, ScalingInfo, TextureCacheRenderTarget}; +use tiling::{Frame, RenderTarget, RenderTargetKind, TextureCacheRenderTarget}; #[cfg(not(feature = "pathfinder"))] use tiling::GlyphJob; use time::precise_time_ns; @@ -432,6 +433,28 @@ pub(crate) mod desc { ], }; + pub const SCALE: VertexDescriptor = VertexDescriptor { + vertex_attributes: &[ + VertexAttribute { + name: "aPosition", + count: 2, + kind: VertexAttributeKind::F32, + }, + ], + instance_attributes: &[ + VertexAttribute { + name: "aScaleRenderTaskAddress", + count: 1, + kind: VertexAttributeKind::I32, + }, + VertexAttribute { + name: "aScaleSourceTaskAddress", + count: 1, + kind: VertexAttributeKind::I32, + }, + ], + }; + pub const CLIP: VertexDescriptor = VertexDescriptor { vertex_attributes: &[ VertexAttribute { @@ -578,6 +601,7 @@ pub(crate) enum VertexArrayKind { VectorStencil, VectorCover, Border, + Scale, } #[derive(Clone, Debug, PartialEq)] @@ -1319,11 +1343,14 @@ impl LazyInitializedDebugRenderer { } } +// NB: If you add more VAOs here, be sure to deinitialize them in +// `Renderer::deinit()` below. pub struct RendererVAOs { prim_vao: VAO, blur_vao: VAO, clip_vao: VAO, border_vao: VAO, + scale_vao: VAO, } /// The renderer is responsible for submitting to the GPU the work prepared by the @@ -1622,8 +1649,8 @@ impl Renderer { let blur_vao = device.create_vao_with_new_instances(&desc::BLUR, &prim_vao); let clip_vao = device.create_vao_with_new_instances(&desc::CLIP, &prim_vao); - let border_vao = - device.create_vao_with_new_instances(&desc::BORDER, &prim_vao); + let border_vao = device.create_vao_with_new_instances(&desc::BORDER, &prim_vao); + let scale_vao = device.create_vao_with_new_instances(&desc::SCALE, &prim_vao); let texture_cache_upload_pbo = device.create_pbo(); let texture_resolver = SourceTextureResolver::new(&mut device); @@ -1814,6 +1841,7 @@ impl Renderer { blur_vao, clip_vao, border_vao, + scale_vao, }, transforms_texture, prim_header_i_texture, @@ -2826,26 +2854,35 @@ impl Renderer { fn handle_scaling( &mut self, - render_tasks: &RenderTaskTree, - scalings: &Vec, + scalings: &[ScalingInstance], source: SourceTexture, + projection: &Transform3D, + stats: &mut RendererStats, ) { - let cache_texture = self.texture_resolver - .resolve(&source) - .unwrap(); - for scaling in scalings { - let source = &render_tasks[scaling.src_task_id]; - let dest = &render_tasks[scaling.dest_task_id]; - - let (source_rect, source_layer) = source.get_target_rect(); - let (dest_rect, _) = dest.get_target_rect(); - - let cache_draw_target = (cache_texture, source_layer.0 as i32); - self.device - .bind_read_target(Some(cache_draw_target)); + if scalings.is_empty() { + return + } - self.device.blit_render_target(source_rect, dest_rect); + match source { + SourceTexture::CacheRGBA8 => { + self.shaders.cs_scale_rgba8.bind(&mut self.device, + &projection, + &mut self.renderer_errors); + } + SourceTexture::CacheA8 => { + self.shaders.cs_scale_a8.bind(&mut self.device, + &projection, + &mut self.renderer_errors); + } + _ => unreachable!(), } + + self.draw_instanced_batch( + &scalings, + VertexArrayKind::Scale, + &BatchTextures::no_texture(), + stats, + ); } fn draw_color_target( @@ -2954,7 +2991,7 @@ impl Renderer { } } - self.handle_scaling(render_tasks, &target.scalings, SourceTexture::CacheRGBA8); + self.handle_scaling(&target.scalings, SourceTexture::CacheRGBA8, projection, stats); //TODO: record the pixel count for cached primitives @@ -3246,7 +3283,7 @@ impl Renderer { } } - self.handle_scaling(render_tasks, &target.scalings, SourceTexture::CacheA8); + self.handle_scaling(&target.scalings, SourceTexture::CacheA8, projection, stats); // Draw the clip items into the tiled alpha mask. { @@ -4090,6 +4127,7 @@ impl Renderer { self.device.delete_vao(self.vaos.clip_vao); self.device.delete_vao(self.vaos.blur_vao); self.device.delete_vao(self.vaos.border_vao); + self.device.delete_vao(self.vaos.scale_vao); #[cfg(feature = "debug_renderer")] { @@ -4760,6 +4798,7 @@ fn get_vao<'a>(vertex_array_kind: VertexArrayKind, VertexArrayKind::VectorStencil => &gpu_glyph_renderer.vector_stencil_vao, VertexArrayKind::VectorCover => &gpu_glyph_renderer.vector_cover_vao, VertexArrayKind::Border => &vaos.border_vao, + VertexArrayKind::Scale => &vaos.scale_vao, } } @@ -4774,6 +4813,7 @@ fn get_vao<'a>(vertex_array_kind: VertexArrayKind, VertexArrayKind::Blur => &vaos.blur_vao, VertexArrayKind::VectorStencil | VertexArrayKind::VectorCover => unreachable!(), VertexArrayKind::Border => &vaos.border_vao, + VertexArrayKind::Scale => &vaos.scale_vao, } } diff --git a/webrender/src/shade.rs b/webrender/src/shade.rs index 5d5700de82..abb230ccf9 100644 --- a/webrender/src/shade.rs +++ b/webrender/src/shade.rs @@ -369,6 +369,7 @@ fn create_prim_shader( VertexArrayKind::VectorStencil => desc::VECTOR_STENCIL, VertexArrayKind::VectorCover => desc::VECTOR_COVER, VertexArrayKind::Border => desc::BORDER, + VertexArrayKind::Scale => desc::SCALE, }; let program = device.create_program(name, &prefix, &vertex_descriptor); @@ -425,7 +426,8 @@ fn create_clip_shader(name: &'static str, device: &mut Device) -> Result, pub horizontal_blurs: Vec, pub readbacks: Vec, - pub scalings: Vec, + pub scalings: Vec, pub blits: Vec, // List of frame buffer outputs for this render target. pub outputs: Vec, @@ -447,9 +441,9 @@ impl RenderTarget for ColorRenderTarget { self.readbacks.push(device_rect); } RenderTaskKind::Scaling(..) => { - self.scalings.push(ScalingInfo { - src_task_id: task.children[0], - dest_task_id: task_id, + self.scalings.push(ScalingInstance { + task_address: render_tasks.get_task_address(task_id), + src_task_address: render_tasks.get_task_address(task.children[0]), }); } RenderTaskKind::Blit(ref task_info) => { @@ -519,7 +513,7 @@ pub struct AlphaRenderTarget { // List of blur operations to apply for this render target. pub vertical_blurs: Vec, pub horizontal_blurs: Vec, - pub scalings: Vec, + pub scalings: Vec, pub zero_clears: Vec, allocator: TextureAllocator, } @@ -610,11 +604,12 @@ impl RenderTarget for AlphaRenderTarget { task.clip_data_address, ); } - RenderTaskKind::Scaling(..) => { - self.scalings.push(ScalingInfo { - src_task_id: task.children[0], - dest_task_id: task_id, - }); + RenderTaskKind::Scaling(ref info) => { + info.add_instances( + &mut self.scalings, + render_tasks.get_task_address(task_id), + render_tasks.get_task_address(task.children[0]), + ); } } } @@ -1045,6 +1040,22 @@ impl BlurTask { } } +impl ScalingTask { + fn add_instances( + &self, + instances: &mut Vec, + task_address: RenderTaskAddress, + src_task_address: RenderTaskAddress, + ) { + let instance = ScalingInstance { + task_address, + src_task_address, + }; + + instances.push(instance); + } +} + pub struct SpecialRenderPasses { pub alpha_glyph_pass: RenderPass, pub color_glyph_pass: RenderPass, diff --git a/wrench/reftests/boxshadow/inset-border-radius.png b/wrench/reftests/boxshadow/inset-border-radius.png index f1980300f504c626aa7a49f1b0348c09b4193fc5..f2614d5fbc9b5e6528e607595a5d1b5009a52991 100644 GIT binary patch delta 1550 zcmZuxeNfVO9PaE?%0gHzEeJH!*k*}QiVMU5siv!_mFJciSzt{gGgDJwm;zTUd|N`I zxbr$)Ev3vk<_jszmjcP&eAfz-GE9-wd}Tjf-L<=Y|NP#4UY_UkJWt&^^}0+CsKai` zj_;D>!@WP0T|1!u$?`gDn}=^odH;3%ao54>r*{q=zpk2`*;|OW(Oj5~GmopTA3Dg1 zr;ihNR)m`_Dz-i5>(&hg<@Bw9^Hij{={M#14@6KwOS2C_WZ2Xpx@ShI9~T8 zERxfL3X4d1;%Sh2`dgDv4BklS8(cftjN;8&nmjdxQ#F=G{mrVrzf^M*-TsL^aZQ6j zL*jHfy)PiX)JHvg#@fkJ#B$$17wRk9=_z7#vi3L?A1&Z$y;U-vAp{$F)9NPy@#CE1 zs9f9JWJu$ts-D}b$-Wf-#NLGVHr~{jUPj_fzb?r)5N)%#dkO6ki7}!rurys#M>33g z4y(vx)_rek>xOt3M0PZ$v8tcDeS$FAQ=uBEo4HJXIi^#CJs-M6rpCeTqDmnfg=iFF z!W?auvbuSa*!mu)yrSr?-e4sNpQ!b7_)mQ0_uS` zcQRbPKCr-a1^Y6AR-^&QGUNOMvU9{0p9|ZCV=!S8A|=LZln@cZwNQKGW}P2}FVrj9 z#o=9vGRt{u-AWqfZCVT&0%}m^c-U>@rOTk6m+F<5d|}+9CPzflk$6)t zt)810>}IQLSED7OZ1>PL=?tM`VID>$TVxLFJ{FzRd?X zA9;1q5D1_kMxt~g%-S>^DA!(Q8U1viE;MdT><00axT<61taIQ5;Alw4PC<~jfO7{I zpk3xnFt|427PS(f85N^}FWPOlV*6WGzrd-1oZ>LTj2S*u?})@-=EF|?$$Q@6zTD}k zkV7egc;Vl53Zmpwsa?AEc(5i-2WF5mp^PIgnpVqwA2l3?+lo?9&sRR?odl$7Dr@X{qi5fO^Fce=rbws9~es_|kC?FHY zno&(zZqzmDZJT))3jkhGLZL!)TD&NxtMR~X&wz4*TOfj9CAP~+n*?B#&@JYQcyzz{ z;!@u$5VV$$3D1NhQVV@Q-ogONCQH4)5xBWGf3~6Czt$uJ2F<@WHf51k-*M6?ov;Ur z{-=P~s&oASyFW6o>r? zfOF6w?0y!lY6!}V6)mk+m!!P8S#_B{46ImMQh0s{`Rg-45o^%e7QiR(yQ90TWsk;h z-(r*HGP{@P{Rk*po^jr)_m|LlQ;RhU?lev(Mu*Gcf48`|ik5s*B8A40XRzZ1uo;e-4pMEFez|QHjB=i8!rwc zE+7NKfB=4RA1TBIEYBs&A<{;-}aLr0SRlAH2ObZ2NYw`%(;mY>Q^u+~D zg(+{@SzQ?|G&cdJ75?Iwv(4k`L~7UB${6!TS`mIf{EpMAv;n*N`Jo%-h}!7|_bdd) zH9(Rr4LZYy?R?@l=vn>lzBd#e*)y_0Kd_`@M1WilhK; z0vm}lcL%7ykE5Dx%YUJj+GbJBut*1+UO3HiPM#1kKKh7}M9J(tIsm0@DJyjzXU{qq z-;}HSQUPxBf&6*ELnMJU7)(X}RLxfFldmO$=ck1=D;W*zX9>Ok$xju} nsElp>{A9tL{@;|Qu9=GbayV2334TOe0=(V9dnje3BWeEt!b=&z delta 1546 zcmZuxdsLEV7~d?HN0CdH8Kx+rMaz?@r7#e@C9AcewR6mwsa@18^RndymG5K--^%M~ ziI;FjwN5TIv5Bd4!8D!V+|1HcQV}XsLPA3X_t{xz`(y8)&wGC7d48AYxoa=6FL6a# z?hX$4CbMd0G_vmMeuckws&uF8Rz)+=>eaL3X1wN@rf1)@Ovec61P1eeG88Z~9@pK- zxLIq~B=}4p)Rq=)91TUt~VCyH7YU)6eK zDR0!)-BF@N$~dZrEa$fT8D$car7WhI#Ye?mg}!6r7X4tPZ?l4BR27kDpB@BEdiwI? z-^uZC{Zv`>DXQ_cNQR&-HMGnRpD0GT6^nbpHL`|czMC(g%Q~*AJw2vEVF|NX`6JEU zWmdO%>SCnN!dSLORo6QE`JzX(gtY%UgJ$|(XHZu=(OYKkOc&XP#RZk15#(fP?0^S#p;|Ey(s+7|l@h*B%rYp40>{PMr5B3W|Ykm{1~*bw~w{ zg^s$Dfbmw6XeN;bEA(UY{an5POX=46ts053@!?{4O-_sPjTBKl=?~-hvAc13Y_1;} zCjFoSOp5J%jkHWhJ@3V??KIVJF?ZafKgobk`NE6+=AWv%oB#^k+r_#wik}2pASz=O zA)+RY*Q8#RyD2bc#IhS3V#UK+_yViTQJcAV3P>ka6%Nc0em({7fI__{I6CxVEvjVk=MbIcWoTBY=L;D|vaX(nr(2 zFxFoy$W4b&0g@0tD%J~{3~%E#IsV^<{PGDUI>31k#*;Nf?1S2vjT#!f(e}&%m@y$W z4P1v|3Oox^-<$FsXB-^{l`bC*2(dY=PRg0<-a@Zu&JU3W&LXIp4y$}eQl!AGp!J`2 zz>T0kc5mhjk!=@IXJ{&~S37Vl%N-xEopBHDZRcE?EQ@B5e5i{rgu-z03cGQx6Sc^b zZk-xq*C|JG^BbhIHQvKRDFxouj7kGj9($mqARYRY%8~iI8l=?yzapsbp1*i3r;@o$ zWhuP~7f|4CC5&1RkRe?|;0PLbd}I7dz;~(%4u_S<&F6o_!p_IUH`#$&h@(^c#8A9C zR5G+-&0%+JD7Y%N(V0YfM>+Dr3jxZNONh7t3kWQ63(iYs_IX2%mb6{PxO{wq9VgZ< z?wbGq0IGm;&wZ_USazFEPNvuAtcb&7P_vd6wg-Z%j6Uo1`?>9o9%Bo#O>np+5fYUkCv=!6rsjAzkb^ z@ne~jh5y8>JYGP8d*SwSh&YRYD)gD>GiA?W}-f7wnIl54W62|9?vCW{{XphcWrqx@ycQhXKk`51lL*Q6C?OYSFT6)((s9T z$M(6E0sH(GMief$ZFoX|SZo!kqZ?!1y<^7E^fGbiDdVz#))iuc-R9NZmU*Vf;n99f z{mS+T0JGssD3ZMVa+FfkVwwF3@B|@j1MyfZDYbC{A>1+D)p`iF*{X`fzAx68CZj6# zt9TwRAs7@_Tb&z|h8tW&DS`YR`~YA^DGNQ$E~|n}A}%GngHUlbw+vnHt07Qa9-Z`@ z1M%qa0q&wN>#PYA=-m*ndxUu}9ZL*w06^6u1bZLq>XpBP` zhnoenkaMFW(4tq8XT_5vcT=DGsI70y&86oYpcDO>eMFGsqb1t5ul9nr7px;cg5K_3 LUkBF(#^n7C-1rp* diff --git a/wrench/reftests/filters/reftest.list b/wrench/reftests/filters/reftest.list index b70e18f945..04d98f11f9 100644 --- a/wrench/reftests/filters/reftest.list +++ b/wrench/reftests/filters/reftest.list @@ -1,5 +1,5 @@ == filter-grayscale.yaml filter-grayscale-ref.yaml -platform(linux,mac) == draw_calls(4) color_targets(5) alpha_targets(0) filter-blur.yaml filter-blur.png +platform(linux,mac) == draw_calls(6) color_targets(5) alpha_targets(0) filter-blur.yaml filter-blur.png == isolated.yaml isolated-ref.yaml == invisible.yaml invisible-ref.yaml color_targets(1) alpha_targets(0) == opacity.yaml opacity-ref.yaml diff --git a/wrench/reftests/snap/preserve-3d.png b/wrench/reftests/snap/preserve-3d.png index bdfcabb2b39928ec0bc6e5ca7fcf3b77e78f8c3d..2fd522da4de6ea41555a7862279450b434dee9ff 100644 GIT binary patch literal 6822 zcmeHL{a2Ic8Ge*mSRF=&D;6-B2bFf%0v1S=0Aqs66w)(Vz&b&Q1v3zc2t){pvQ|_G zX zUeA49_jTUOA4VLsf7AI*0Dyhip^!fSV8emGZ|&ZI|ET{Sc?SUJ(_taOA2G^QWB#|w zKbD=xN=~_=zlbmD_9AX`peNpm-`wpLdeQqE2hVRR`Eys^`Az<_>rufwHg60LZt}9L z|1fOJmIpDnO6;P3zkAEZ4WS!6w|gU9x{l?K2vxYhbWrPYa!s^JlE9nWf}6>cw5i#< zY~b0f{8K*z;MbQA!1$^)wBlfG0xKD;N?=t)>o~BEMXM*UdZVA9F^r*hnpc)F@ zA+VY4I$16{HCTn>*!rI4xqo;d<=L{9eKw$LAk?SZ*}Je;Aj?UXvdtzGE_|KEN)hwJ zsfzw`bh0!JpHy*fvI#nE_XBV*_Rsw|P62_%V9xgu#dm7sgshaY)=ce=Id~W^3xE^! zN{7Enm2nG?+LzsbB5}kg#U8@ zCf%LmAE}1xspMs4qqyn1X<5g8>?vffWt4T~BKAb7S5#CK|0y$(pl83jc}*1NUhY%- z`q01aFA&|6#QMjw3@>S!#zX-hPf9p>TfyzT0XMy@y}Aq4!5qU2+$dUq>MtPqyJPL;Exu zA(-_DZ36&>4xH~^BvuzTMv6vgXnP`CkgbtfByLr0B~UM=)kS8>1shwD&}`DIi647q zo`={Hm|o$9Ey{++qC(G3(wfp<6B=KVnEF|$v`;=5aE)VPy*}$emoda`cZ|BjsF`HjhvyH7zGGE{pE>C9Ue)v--8uhBUm&6elYaBt)Ho;mr+JqT`XVDS=s ztsb2A zH)mmrVR(5B5mSN!0^zOJH#F>FEsx5JRigr~OIkZ!>*xZ&Y=#5;kOp=P+5zy}U;h7x z$q%3R6d>^Rykm1--Nc?H*KsI;hLgtG9voWqLH|~#Kc+uuUijfKvZxwGjwY4+uJIz_ ztxMUk%^4=G1QEzt{*V>WM3DRaHSP7eIyD{Zb)vv_PfrMO`*vL%9GGzQBGa!XFp~Di zNTeblSM+i8ao?f3xF8h(U2xa#mi+~rILUWg65FBa5l`#O^A<Ym>7QST%GZK_`~qQq-vV?vQ9&|29I8A@)7hV zA#Y(2_CI7lS)ILo9T*R?*puq=tY@S%FCIdBGC$de*3@<0*ag6Ko`nGMJs0W9;d0;ZM3Q6Oamw^&9Dfwt?d?a*bM9%=Zr-LyCgT?RxWgS<3V zC5Fy^-Vr{f?$F6B_|R_1->oj&vk6Zo_3u@bS-N_4U3N}UUJvC0>m$mK)Sv>EX{jEv zfDRqm5f5lHpexu(Tz1Nvd*qJP3S|3gi{;9m6^mb+R@Fd^-Wjw@{(e6$zz5ILKR4%0 zko@DNt(h|nSRP_f@K(W|fLG#hkc;28N<-*9qX|b%@0R+VcJ|L!y9%Ud9+TkZ^S1#& zvN)FO8ljn`gtm~3eeZ~xbaDd39@RnJX`Z;^AyNtCo&RyC>jC&8#0~Nz%*Ps9aj-Ul fl??w@f)%HHX1XdlWKsde0fdD{gxvkziTr;7W-b`- literal 6046 zcmeAS@N?(olHy`uVBq!ia0y~yVD1ItH5_a}k#|diR{<%uByV>YhW{YAVDIwDKoQOY zkH}&M25w;xW@MN(M*=9wUgGKN%KnH`n44LSbuxDb1B1A>r;B4q#jUq@y)&k?OC5h$ zeoW%*(upfL0zKA*xrPfa6G}xJwtma0@65ovI_Uy5el=7QgWH>6eq!-X#91nfLX3-ams0^2U=rQ#aqt0lMOV zz$G;x+|fy6})28MP+&4``tT&o;Ez0M3}$vM4Sm z(Mbcigg`4b@H&Z38Wf~_f$=y99Y(T~z-8TNK}<|_g-Cb^7Li2^?KO-R#DlS1CAs9L zQ@KiFQO|YhzyXIjR;60c&dwH}I(2GbRFu@^<^KJ-x3{_G=dW*MV5nFfbTh{+o2|k; z>EolL-52lNkqKWHBl&4&S65d?W@hKr)#1l~e0=Y9A*SIA{9?=x|t(mUuSb|ZM6BC-M@bQ`tk9&{NgQJu5>Uk zJULS?weUdf-YU~=IX8{o?0)y|okh`;4n{^`!*fE){o3z$|NrrL6%e<-PWJ5Cvp{|I z62KPdMGntWpxfr;8_)FFvURJZAVb5PpMJ_BJ5HTCRq^LX;koaorly6zzvVhJfgI53 z)+ZymK5p-+pZk_9Q2{!Dhm*mwlk}Z7vP5b8F7cO&WT7=U#5xx6f{xUTl^Ns8y^I>g?>S6SXDdMmfmV4-XDX z7$&tqjePp_>BW2Z?A8>>*jANn*|zQ26wP2B4p7J~kv7kZnPX9?WcUBi=M^hf{8)cp zR8;innVH6m7cW+xrXMf2GUQYRFocf2H#uazWc_;mbMx)x=gys5`0dTj7jNJ8hOdu1 zdShd9^1C}bKfYW(->tT`HY7Y;nj6wSKd}Gw@nGWH?}$VOS;H`DnR3ObP43LTzV2wBto5R8+sy2KJZP3M%?bgg^yAax>m*}iV?VyQsO-$h z@Zs7LU^#P*C*a4s`}^gs%is0PuluF>?(S~$C&r82db@V*+I3@Vc6iOFlj?5Fzz*)A z-w6c;24TRGO;%Pm|4WUhr{|wPpU-d1xVXq;X%HI=gF?F9JTBIC`}f-e3$E|S4*r-w zd)cyOz?^5Q0IHuRt=YZXy6(rr_Qd;l_f#5h%e$N904@%0&NNO>0vf&i_WS++?W(G( zdLa3ISINtuxbMHezc*K6V6gn$U$Ec+u>5t6kB>k1{qgbses+F22_axXRVum8PXzuydKHqdQZ zPftw^jEl4TBVKMLdwY9+f8^#gU?~YII77q3#dURc5AU08U%#(hl9A!W?D=;Z%8!`e zuMuwNlkNKV?_Ygg;PN2D>}zX&e7l{$c-yvX1)%b9P@bMkX-~U%k-G5$B^!7YgU<|HWwQ9xs_5Go%!;T*5 z6z*k#WUL4GpUXc4Hoga8CmoNI_AK1DZ{Lr<-|r_sKGqAY<$5%uyY zOgSmE7*tO_to`tOe!W|Aa`GJ8>TkXC%es0d6bouImUZ_Q7m^}lPHfP+^qz#8|{r%!v{sr$@GfTqkZFE4-Im7kGe08NPZ z_EcKl7ZVph9v)wt3au}JUhI)HPWz$%uEYvhnF-6+{a6UCFN>d@>AZIBTH<}(xIGrv z*2m{V@>HbO)UK`B*N*|S^ZggH$4jhaxyAK*YJY!o&CFa0Y%H93|2}a4Wsdi42M-?H zQSi{o#N7P&RPFG#nq`X?DMdv^C7qpRYM6J&0vgc91_lDaTwnO+#>O3mkKIy?X3j9l z466BdGks&?;Wi+9(nRRU*Pq|O&;TY;B8zIcvO%bUPW|c8ZY$A)rr^pRPf3GkSOQx+ u0iO7