From 4eb562975f85d7a9ec67d1a0c3f134f83b8c52f7 Mon Sep 17 00:00:00 2001 From: Carter Anderson Date: Mon, 11 May 2020 20:12:48 -0700 Subject: [PATCH] pathfinder: data binding --- .vscode/launch.json | 4 +- crates/bevy_pathfinder/src/device.rs | 405 +++++++++++------- crates/bevy_render/src/pass/pass.rs | 4 + crates/bevy_render/src/pass/render_pass.rs | 1 + crates/bevy_render/src/pipeline/pipeline.rs | 14 +- .../src/pipeline/pipeline_compiler.rs | 1 - .../src/render_graph/nodes/uniform_node.rs | 2 +- .../src/texture/sampler_descriptor.rs | 16 + crates/bevy_wgpu/src/wgpu_render_pass.rs | 5 + .../resources/shaders/gl3/fill.vs.glsl | 8 +- .../resources/shaders/gl4/fill.vs.glsl | 8 +- .../resources/shaders/metal/fill.vs.metal | 8 +- .../resources/shaders/vulkan/fill.vs.spv | Bin 4468 -> 4468 bytes .../shaders/build/metal/blit.fs.spv | Bin 928 -> 1040 bytes .../shaders/build/metal/blit.vs.spv | Bin 1324 -> 1244 bytes .../shaders/build/metal/clear.fs.spv | Bin 644 -> 792 bytes .../shaders/build/metal/clear.vs.spv | Bin 1484 -> 1656 bytes .../shaders/build/metal/debug_solid.fs.spv | Bin 644 -> 792 bytes .../shaders/build/metal/debug_solid.vs.spv | Bin 1284 -> 1324 bytes .../shaders/build/metal/debug_texture.fs.spv | Bin 1064 -> 1324 bytes .../shaders/build/metal/debug_texture.vs.spv | Bin 1564 -> 1720 bytes .../shaders/build/metal/demo_ground.fs.spv | Bin 908 -> 1248 bytes .../shaders/build/metal/demo_ground.vs.spv | Bin 1364 -> 1572 bytes .../shaders/build/metal/fill.cs.spv | Bin 0 -> 7048 bytes .../shaders/build/metal/fill.fs.spv | Bin 2928 -> 3084 bytes .../shaders/build/metal/fill.vs.spv | Bin 4384 -> 4552 bytes .../shaders/build/metal/reproject.fs.spv | Bin 1212 -> 1512 bytes .../shaders/build/metal/reproject.vs.spv | Bin 1360 -> 1436 bytes .../shaders/build/metal/stencil.fs.spv | Bin 352 -> 352 bytes .../shaders/build/metal/stencil.vs.spv | Bin 908 -> 828 bytes .../shaders/build/metal/tile.fs.spv | Bin 33632 -> 34884 bytes .../shaders/build/metal/tile.vs.spv | Bin 4196 -> 4728 bytes .../shaders/build/metal/tile_clip.fs.spv | Bin 856 -> 968 bytes .../shaders/build/metal/tile_clip.vs.spv | Bin 1732 -> 1668 bytes .../shaders/build/metal/tile_copy.fs.spv | Bin 816 -> 1080 bytes .../shaders/build/metal/tile_copy.vs.spv | Bin 1276 -> 1464 bytes crates/pathfinder/shaders/fill.vs.glsl | 4 +- 37 files changed, 303 insertions(+), 177 deletions(-) create mode 100644 crates/pathfinder/shaders/build/metal/fill.cs.spv diff --git a/.vscode/launch.json b/.vscode/launch.json index 501e86d3e7..deffbe20bf 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -33,11 +33,11 @@ "cargo": { "args": [ "build", - "--example=scene", + "--example=pathfinder", "--package=bevy" ], "filter": { - "name": "scene", + "name": "pathfinder", "kind": "example" } }, diff --git a/crates/bevy_pathfinder/src/device.rs b/crates/bevy_pathfinder/src/device.rs index 9758c33f1e..56535a82d2 100644 --- a/crates/bevy_pathfinder/src/device.rs +++ b/crates/bevy_pathfinder/src/device.rs @@ -2,18 +2,21 @@ use bevy_asset::{AssetStorage, Handle}; use bevy_render::{ pass::{ LoadOp, PassDescriptor, RenderPassColorAttachmentDescriptor, - RenderPassDepthStencilAttachmentDescriptor, StoreOp, TextureAttachment, + RenderPassDepthStencilAttachmentDescriptor, StoreOp, TextureAttachment, RenderPass, }, pipeline::{ state_descriptors::{ BlendDescriptor, BlendFactor, BlendOperation, ColorStateDescriptor, ColorWrite, CompareFunction, DepthStencilStateDescriptor, StencilOperation, - StencilStateFaceDescriptor, + StencilStateFaceDescriptor, RasterizationStateDescriptor, PrimitiveTopology, }, InputStepMode, PipelineDescriptor, VertexAttributeDescriptor, VertexBufferDescriptor, VertexFormat, }, - render_resource::{BufferInfo, BufferUsage, RenderResource, RenderResourceAssignments}, + render_resource::{ + BufferInfo, BufferUsage, RenderResource, RenderResourceAssignment, + RenderResourceAssignments, + }, renderer::RenderContext, shader::{Shader, ShaderSource, ShaderStage, ShaderStages}, texture::{ @@ -31,7 +34,9 @@ use pathfinder_gpu::{ VertexAttrClass, VertexAttrDescriptor, VertexAttrType, }; use pathfinder_resources::ResourceLoader; -use std::{borrow::Cow, cell::RefCell, collections::HashMap, mem, rc::Rc, time::Duration, ops::Range}; +use std::{ + borrow::Cow, cell::RefCell, collections::HashMap, mem, rc::Rc, time::Duration, +}; use zerocopy::AsBytes; pub struct BevyPathfinderDevice<'a> { @@ -40,6 +45,7 @@ pub struct BevyPathfinderDevice<'a> { samplers: RefCell>, main_color_texture: RenderResource, main_depth_stencil_texture: RenderResource, + default_sampler: RenderResource, } impl<'a> BevyPathfinderDevice<'a> { @@ -49,21 +55,182 @@ impl<'a> BevyPathfinderDevice<'a> { main_color_texture: RenderResource, main_depth_stencil_texture: RenderResource, ) -> Self { + let default_sampler = render_context.resources().create_sampler(&SamplerDescriptor::default()); BevyPathfinderDevice { render_context: RefCell::new(render_context), shaders: RefCell::new(shaders), samplers: RefCell::new(HashMap::new()), main_color_texture, main_depth_stencil_texture, + default_sampler, } } - pub fn prepare_to_draw(&self, render_state: &RenderState) { - let pass_descriptor = self.create_pass_descriptor(render_state); - self.setup_pipline_descriptor(render_state, &pass_descriptor, &render_state.vertex_array.requested_descriptors.borrow()); - // TODO: setup uniforms - let mut render_context = self.render_context.borrow_mut(); - let mut render_resource_assignments = RenderResourceAssignments::default(); + pub fn setup_uniforms( + &self, + render_state: &RenderState, + render_resource_assignments: &mut RenderResourceAssignments, + ) { + let mut uniform_buffer_data = Vec::new(); + let mut uniform_buffer_ranges = Vec::new(); + for (bevy_uniform, uniform_data) in render_state.uniforms.iter() { + let start_index = uniform_buffer_data.len(); + match *uniform_data { + UniformData::Float(value) => uniform_buffer_data + .write_f32::(value) + .unwrap(), + UniformData::IVec2(vector) => { + uniform_buffer_data + .write_i32::(vector.x()) + .unwrap(); + uniform_buffer_data + .write_i32::(vector.y()) + .unwrap(); + } + UniformData::IVec3(values) => { + uniform_buffer_data + .write_i32::(values[0]) + .unwrap(); + uniform_buffer_data + .write_i32::(values[1]) + .unwrap(); + uniform_buffer_data + .write_i32::(values[2]) + .unwrap(); + } + UniformData::Int(value) => uniform_buffer_data + .write_i32::(value) + .unwrap(), + UniformData::Mat2(matrix) => { + uniform_buffer_data + .write_f32::(matrix.x()) + .unwrap(); + uniform_buffer_data + .write_f32::(matrix.y()) + .unwrap(); + uniform_buffer_data + .write_f32::(matrix.z()) + .unwrap(); + uniform_buffer_data + .write_f32::(matrix.w()) + .unwrap(); + } + UniformData::Mat4(matrix) => { + for column in &matrix { + uniform_buffer_data + .write_f32::(column.x()) + .unwrap(); + uniform_buffer_data + .write_f32::(column.y()) + .unwrap(); + uniform_buffer_data + .write_f32::(column.z()) + .unwrap(); + uniform_buffer_data + .write_f32::(column.w()) + .unwrap(); + } + } + UniformData::Vec2(vector) => { + uniform_buffer_data + .write_f32::(vector.x()) + .unwrap(); + uniform_buffer_data + .write_f32::(vector.y()) + .unwrap(); + } + UniformData::Vec3(array) => { + uniform_buffer_data + .write_f32::(array[0]) + .unwrap(); + uniform_buffer_data + .write_f32::(array[1]) + .unwrap(); + uniform_buffer_data + .write_f32::(array[2]) + .unwrap(); + } + UniformData::Vec4(vector) => { + uniform_buffer_data + .write_f32::(vector.x()) + .unwrap(); + uniform_buffer_data + .write_f32::(vector.y()) + .unwrap(); + uniform_buffer_data + .write_f32::(vector.z()) + .unwrap(); + uniform_buffer_data + .write_f32::(vector.w()) + .unwrap(); + } + UniformData::TextureUnit(index) => { + let texture = &render_state.textures[index as usize]; + render_resource_assignments.set( + &bevy_uniform.name, + RenderResourceAssignment::Texture(texture.handle), + ); + let sampler_resource = if let Some(sampler_resource) = *texture.sampler_resource.borrow() { + // NOTE: this assumes theres is only one sampler + // TODO: see if we need more than one sampler + sampler_resource + } else { + self.default_sampler + }; + + render_resource_assignments.set( + "uSampler", + RenderResourceAssignment::Sampler(sampler_resource), + ); + + uniform_buffer_ranges.push(None); + + continue; + } + UniformData::ImageUnit(_) => panic!("image unit not currently supported"), + } + let end_index = uniform_buffer_data.len(); + while uniform_buffer_data.len() % 256 != 0 { + uniform_buffer_data.push(0); + } + uniform_buffer_ranges.push(Some(start_index..end_index)); + } + + let buffer_resource = self + .render_context + .borrow() + .resources() + .create_buffer_with_data( + BufferInfo { + buffer_usage: BufferUsage::COPY_DST | BufferUsage::UNIFORM, + ..Default::default() + }, + &uniform_buffer_data, + ); + + for ((bevy_uniform, _data), range) in render_state + .uniforms + .iter() + .zip(uniform_buffer_ranges.iter()) + { + if let Some(range) = range { + render_resource_assignments.set( + &bevy_uniform.name, + RenderResourceAssignment::Buffer { + dynamic_index: None, + range: range.start as u64..range.end as u64, + resource: buffer_resource, + }, + ) + } + } + } + + pub fn setup_vertex_buffers( + &self, + render_state: &RenderState, + render_resource_assignments: &mut RenderResourceAssignments, + ) { for (i, vertex_buffer) in render_state .vertex_array .vertex_buffers @@ -78,14 +245,45 @@ impl<'a> BevyPathfinderDevice<'a> { indices_resource = Some(index_buffer.handle.borrow().unwrap()); } } - render_resource_assignments.set_vertex_buffer(get_vertex_buffer_name(i), resource, indices_resource); + render_resource_assignments.set_vertex_buffer( + get_vertex_buffer_name(i), + resource, + indices_resource, + ); } + } - // if let Some(ref index_buffer) = *render_state.vertex_array.index_buffer.borrow() { - // let resource = index_buffer.handle.borrow().unwrap(); - // pass.set_index_buffer(resource, 0); - // } - render_context.begin_pass( + pub fn setup_bind_groups( + &self, + pipeline_descriptor: &PipelineDescriptor, + render_resource_assignments: &mut RenderResourceAssignments, + ) { + let bind_groups = &pipeline_descriptor.get_layout().unwrap().bind_groups; + let render_context = self.render_context.borrow(); + let render_resources = render_context.resources(); + for bind_group in bind_groups.iter() { + render_resource_assignments.update_render_resource_set_id(bind_group); + render_resources.setup_bind_groups(pipeline_descriptor, &render_resource_assignments); + } + } + + pub fn draw(&self, render_state: &RenderState, draw_func: F) where F: Fn(&mut dyn RenderPass) { + let pass_descriptor = self.create_pass_descriptor(render_state); + self.setup_pipline_descriptor( + render_state, + &pass_descriptor, + &render_state.vertex_array.requested_descriptors.borrow(), + ); + let mut render_resource_assignments = RenderResourceAssignments::default(); + self.setup_uniforms(render_state, &mut render_resource_assignments); + self.setup_bind_groups( + &render_state.program.pipeline_descriptor.borrow(), + &mut render_resource_assignments, + ); + self.setup_vertex_buffers(render_state, &mut render_resource_assignments); + println!("pass {:#?}", pass_descriptor); + println!("pipeline {:#?}", render_state.program.pipeline_descriptor); + self.render_context.borrow_mut().begin_pass( &pass_descriptor, &render_resource_assignments, &mut |pass| { @@ -105,6 +303,9 @@ impl<'a> BevyPathfinderDevice<'a> { let pipeline_descriptor = render_state.program.pipeline_descriptor.borrow(); pass.set_render_resources(&pipeline_descriptor, &render_resource_assignments); + println!("{:#?}", &render_resource_assignments); + pass.set_pipeline(render_state.program.pipeline_handle); + draw_func(pass); }, ) } @@ -125,7 +326,7 @@ impl<'a> BevyPathfinderDevice<'a> { // } // }, // ); - Some(TextureFormat::Bgra8UnormSrgb) + Some(TextureFormat::Rgba16Float) } pub fn setup_pipline_descriptor( @@ -143,15 +344,23 @@ impl<'a> BevyPathfinderDevice<'a> { { return; } + let mut pipeline_descriptor = render_state.program.pipeline_descriptor.borrow_mut(); + pipeline_descriptor.primitive_topology = match render_state.primitive { + pathfinder_gpu::Primitive::Triangles => PrimitiveTopology::TriangleList, + pathfinder_gpu::Primitive::Lines => PrimitiveTopology::LineList, + }; + pipeline_descriptor.rasterization_state = Some(RasterizationStateDescriptor::default()); { let mut layout = pipeline_descriptor.get_layout_mut().unwrap(); let mut i = 0; let mut descriptors = Vec::with_capacity(requested_vertex_descriptors.len()); loop { if let Some(descriptor) = requested_vertex_descriptors.get(&i) { - descriptors.push(descriptor.clone()); - i += 1; + let mut descriptor = descriptor.clone(); + descriptor.attributes.sort_by_key(|a| a.shader_location); + descriptors.push(descriptor); + i += 1; } else { break; } @@ -247,6 +456,7 @@ impl<'a> BevyPathfinderDevice<'a> { descriptor.stencil_front = stencil_descriptor.clone(); descriptor.stencil_back = stencil_descriptor; } + pipeline_descriptor.depth_stencil_state = Some(descriptor); } self.render_context @@ -269,9 +479,10 @@ impl<'a> BevyPathfinderDevice<'a> { depth_texture = Some(self.main_depth_stencil_texture); self.main_color_texture } - RenderTarget::Framebuffer(framebuffer) => framebuffer.handle, + RenderTarget::Framebuffer(framebuffer) => {println!("{:?} {:?}", framebuffer.texture_descriptor, framebuffer.handle); framebuffer.handle }, }; + println!("color main {:?} {:?}", self.main_color_texture, color_texture); let mut color_attachment = RenderPassColorAttachmentDescriptor { attachment: TextureAttachment::RenderResource(color_texture), clear_color: Color::WHITE, @@ -317,114 +528,6 @@ impl<'a> BevyPathfinderDevice<'a> { sample_count: 1, } } - fn create_uniform_buffer(&self, uniforms: &[(&BevyUniform, UniformData)]) -> UniformBuffer { - let (mut uniform_buffer_data, mut uniform_buffer_ranges) = (vec![], vec![]); - for &(_, uniform_data) in uniforms.iter() { - let start_index = uniform_buffer_data.len(); - match uniform_data { - UniformData::Float(value) => uniform_buffer_data - .write_f32::(value) - .unwrap(), - UniformData::IVec2(vector) => { - uniform_buffer_data - .write_i32::(vector.x()) - .unwrap(); - uniform_buffer_data - .write_i32::(vector.y()) - .unwrap(); - } - UniformData::IVec3(values) => { - uniform_buffer_data - .write_i32::(values[0]) - .unwrap(); - uniform_buffer_data - .write_i32::(values[1]) - .unwrap(); - uniform_buffer_data - .write_i32::(values[2]) - .unwrap(); - } - UniformData::Int(value) => uniform_buffer_data - .write_i32::(value) - .unwrap(), - UniformData::Mat2(matrix) => { - uniform_buffer_data - .write_f32::(matrix.x()) - .unwrap(); - uniform_buffer_data - .write_f32::(matrix.y()) - .unwrap(); - uniform_buffer_data - .write_f32::(matrix.z()) - .unwrap(); - uniform_buffer_data - .write_f32::(matrix.w()) - .unwrap(); - } - UniformData::Mat4(matrix) => { - for column in &matrix { - uniform_buffer_data - .write_f32::(column.x()) - .unwrap(); - uniform_buffer_data - .write_f32::(column.y()) - .unwrap(); - uniform_buffer_data - .write_f32::(column.z()) - .unwrap(); - uniform_buffer_data - .write_f32::(column.w()) - .unwrap(); - } - } - UniformData::Vec2(vector) => { - uniform_buffer_data - .write_f32::(vector.x()) - .unwrap(); - uniform_buffer_data - .write_f32::(vector.y()) - .unwrap(); - } - UniformData::Vec3(array) => { - uniform_buffer_data - .write_f32::(array[0]) - .unwrap(); - uniform_buffer_data - .write_f32::(array[1]) - .unwrap(); - uniform_buffer_data - .write_f32::(array[2]) - .unwrap(); - } - UniformData::Vec4(vector) => { - uniform_buffer_data - .write_f32::(vector.x()) - .unwrap(); - uniform_buffer_data - .write_f32::(vector.y()) - .unwrap(); - uniform_buffer_data - .write_f32::(vector.z()) - .unwrap(); - uniform_buffer_data - .write_f32::(vector.w()) - .unwrap(); - } - UniformData::TextureUnit(_) | UniformData::ImageUnit(_) => {} - } - // TODO: this padding might not be necessary - let end_index = uniform_buffer_data.len(); - while uniform_buffer_data.len() % 256 != 0 { - uniform_buffer_data.push(0); - } - uniform_buffer_ranges.push(start_index..end_index); - } - - UniformBuffer { - data: uniform_buffer_data, - ranges: uniform_buffer_ranges, - } - } } pub struct BevyTimerQuery {} @@ -496,7 +599,7 @@ impl<'a> Device for BevyPathfinderDevice<'a> { pathfinder_gpu::TextureFormat::RGBA16F => TextureFormat::Rgba16Float, pathfinder_gpu::TextureFormat::RGBA32F => TextureFormat::Rgba32Float, }, - usage: TextureUsage::WRITE_ALL, // TODO: this might be overly safe + usage: TextureUsage::WRITE_ALL | TextureUsage::SAMPLED, // TODO: this might be overly safe }; BevyTexture { handle: self @@ -576,6 +679,7 @@ impl<'a> Device for BevyPathfinderDevice<'a> { fragment: Some(fragment), }); descriptor.reflect_layout(&self.shaders.borrow(), false, None, None); + println!("orig {:?}", descriptor); BevyProgram { pipeline_descriptor: RefCell::new(descriptor), pipeline_handle: Handle::new(), @@ -595,6 +699,7 @@ impl<'a> Device for BevyPathfinderDevice<'a> { .find(|a| a.name == attribute_name) .cloned(); if attribute.is_some() { + println!("pre {:?}", attribute); return attribute.map(|a| BevyVertexAttr { attr: RefCell::new(a), }); @@ -605,7 +710,7 @@ impl<'a> Device for BevyPathfinderDevice<'a> { } fn get_uniform(&self, _program: &BevyProgram, name: &str) -> Self::Uniform { BevyUniform { - name: name.to_string(), + name: format!("u{}", name), } } fn bind_buffer( @@ -629,7 +734,7 @@ impl<'a> Device for BevyPathfinderDevice<'a> { bevy_attr: &BevyVertexAttr, descriptor: &VertexAttrDescriptor, ) { - println!("configure"); + // println!("configure: {:?} {:?}") let format = match (descriptor.class, descriptor.attr_type, descriptor.size) { (VertexAttrClass::Int, VertexAttrType::I8, 2) => VertexFormat::Char2, // (VertexAttrClass::Int, VertexAttrType::I8, 3) => VertexFormat::Char3, @@ -906,22 +1011,25 @@ impl<'a> Device for BevyPathfinderDevice<'a> { fn end_commands(&self) { // NOTE: the Bevy Render Graph handles command buffer submission } - fn draw_arrays(&self, _index_count: u32, render_state: &RenderState) { - self.prepare_to_draw(render_state); - println!("draw_arrays"); + fn draw_arrays(&self, index_count: u32, render_state: &RenderState) { + self.draw(render_state, |pass| { + pass.draw(0..index_count, 0..1); + }); } - fn draw_elements(&self, _index_count: u32, render_state: &RenderState) { - self.prepare_to_draw(render_state); - println!("draw_elements"); + fn draw_elements(&self, index_count: u32, render_state: &RenderState) { + self.draw(render_state, |pass| { + pass.draw_indexed( 0..index_count, 0, 0..1); + }); } fn draw_elements_instanced( &self, - _index_count: u32, - _instance_count: u32, + index_count: u32, + instance_count: u32, render_state: &RenderState, ) { - self.prepare_to_draw(render_state); - println!("draw_elements_instanced"); + self.draw(render_state, |pass| { + pass.draw_indexed( 0..index_count, 0, 0..instance_count); + }); } fn create_timer_query(&self) -> Self::TimerQuery { // TODO: maybe not needed @@ -1073,15 +1181,10 @@ impl ToBevyCompareFunction for pathfinder_gpu::StencilFunc { } } -struct UniformBuffer { - data: Vec, - ranges: Vec>, -} - -pub const PATHFINDER_VERTEX_BUFFER_0: &'static str = "P0"; -pub const PATHFINDER_VERTEX_BUFFER_1: &'static str = "P1"; -pub const PATHFINDER_VERTEX_BUFFER_2: &'static str = "P2"; -pub const PATHFINDER_VERTEX_BUFFER_3: &'static str = "P3"; +pub const PATHFINDER_VERTEX_BUFFER_0: &'static str = "P0"; +pub const PATHFINDER_VERTEX_BUFFER_1: &'static str = "P1"; +pub const PATHFINDER_VERTEX_BUFFER_2: &'static str = "P2"; +pub const PATHFINDER_VERTEX_BUFFER_3: &'static str = "P3"; pub fn get_vertex_buffer_name(index: usize) -> &'static str { match index { @@ -1091,4 +1194,4 @@ pub fn get_vertex_buffer_name(index: usize) -> &'static str { 3 => PATHFINDER_VERTEX_BUFFER_3, _ => panic!("encountered unknown vertex buffer index"), } -} \ No newline at end of file +} diff --git a/crates/bevy_render/src/pass/pass.rs b/crates/bevy_render/src/pass/pass.rs index 33100239ff..7d5282c20f 100644 --- a/crates/bevy_render/src/pass/pass.rs +++ b/crates/bevy_render/src/pass/pass.rs @@ -1,12 +1,14 @@ use super::{LoadOp, StoreOp}; use crate::{render_resource::RenderResource, Color}; +#[derive(Debug, Clone)] pub enum TextureAttachment { RenderResource(RenderResource), Name(String), Input(String), } +#[derive(Debug, Clone)] pub struct RenderPassColorAttachmentDescriptor { /// The actual color attachment. pub attachment: TextureAttachment, @@ -24,6 +26,7 @@ pub struct RenderPassColorAttachmentDescriptor { pub clear_color: Color, } +#[derive(Debug, Clone)] pub struct RenderPassDepthStencilAttachmentDescriptor { pub attachment: TextureAttachment, pub depth_load_op: LoadOp, @@ -35,6 +38,7 @@ pub struct RenderPassDepthStencilAttachmentDescriptor { } // A set of pipeline bindings and draw calls with color and depth outputs +#[derive(Debug, Clone)] pub struct PassDescriptor { pub color_attachments: Vec, pub depth_stencil_attachment: Option, diff --git a/crates/bevy_render/src/pass/render_pass.rs b/crates/bevy_render/src/pass/render_pass.rs index adee8cdbcf..8fec4c99a4 100644 --- a/crates/bevy_render/src/pass/render_pass.rs +++ b/crates/bevy_render/src/pass/render_pass.rs @@ -13,6 +13,7 @@ pub trait RenderPass { fn set_pipeline(&mut self, pipeline_handle: Handle); fn set_viewport(&mut self, x: f32, y: f32, w: f32, h: f32, min_depth: f32, max_depth: f32); fn set_stencil_reference(&mut self, reference: u32); + fn draw(&mut self, vertices: Range, instances: Range); fn draw_indexed(&mut self, indices: Range, base_vertex: i32, instances: Range); // TODO: try to somehow take into account the "set" pipeline instead of passing it in here fn set_render_resources( diff --git a/crates/bevy_render/src/pipeline/pipeline.rs b/crates/bevy_render/src/pipeline/pipeline.rs index 98cffbc929..e3e94cf53b 100644 --- a/crates/bevy_render/src/pipeline/pipeline.rs +++ b/crates/bevy_render/src/pipeline/pipeline.rs @@ -7,10 +7,7 @@ use super::{ BindType, PipelineLayout, VertexBufferDescriptors, }; use crate::{ - render_resource::{ - BufferInfo, RenderResourceAssignment, RenderResourceAssignments, ResourceInfo, - }, - renderer::RenderResourceContext, + render_resource::{RenderResourceAssignment, RenderResourceAssignments}, shader::{Shader, ShaderStages}, texture::TextureFormat, }; @@ -170,16 +167,17 @@ impl PipelineDescriptor { layout.sync_vertex_buffer_descriptors(vertex_buffer_descriptors); } - if let Some(render_resource_assignments) = render_resource_assignments - { + if let Some(render_resource_assignments) = render_resource_assignments { // set binding uniforms to dynamic if render resource assignments use dynamic // TODO: this breaks down if different assignments have different "dynamic" status or if the dynamic status changes. // the fix would be to add "dynamic bindings" to the existing shader_def sets. this would ensure new pipelines are generated // for all permutations of dynamic/non-dynamic for bind_group in layout.bind_groups.iter_mut() { for binding in bind_group.bindings.iter_mut() { - if let Some(RenderResourceAssignment::Buffer { dynamic_index: Some(_), .. }) = - render_resource_assignments.get(&binding.name) + if let Some(RenderResourceAssignment::Buffer { + dynamic_index: Some(_), + .. + }) = render_resource_assignments.get(&binding.name) { if let BindType::Uniform { ref mut dynamic, .. diff --git a/crates/bevy_render/src/pipeline/pipeline_compiler.rs b/crates/bevy_render/src/pipeline/pipeline_compiler.rs index 13966575de..b9036c83a3 100644 --- a/crates/bevy_render/src/pipeline/pipeline_compiler.rs +++ b/crates/bevy_render/src/pipeline/pipeline_compiler.rs @@ -1,7 +1,6 @@ use super::{state_descriptors::PrimitiveTopology, PipelineDescriptor, VertexBufferDescriptors}; use crate::{ render_resource::{RenderResourceAssignments, RenderResourceAssignmentsId}, - renderer::{RenderResourceContext, RenderResources}, shader::{Shader, ShaderSource}, Renderable, }; diff --git a/crates/bevy_render/src/render_graph/nodes/uniform_node.rs b/crates/bevy_render/src/render_graph/nodes/uniform_node.rs index 6dc30ec625..aedecba205 100644 --- a/crates/bevy_render/src/render_graph/nodes/uniform_node.rs +++ b/crates/bevy_render/src/render_graph/nodes/uniform_node.rs @@ -3,7 +3,7 @@ use crate::{ render_graph::{CommandQueue, Node, ResourceSlots, SystemNode}, render_resource::{ BufferInfo, BufferUsage, RenderResource, RenderResourceAssignment, - RenderResourceAssignments, RenderResourceAssignmentsId, ResourceInfo, + RenderResourceAssignments, RenderResourceAssignmentsId, }, renderer::{RenderContext, RenderResourceContext, RenderResources}, shader::{AsUniforms, FieldBindType}, diff --git a/crates/bevy_render/src/texture/sampler_descriptor.rs b/crates/bevy_render/src/texture/sampler_descriptor.rs index 9108744963..9e56c0060d 100644 --- a/crates/bevy_render/src/texture/sampler_descriptor.rs +++ b/crates/bevy_render/src/texture/sampler_descriptor.rs @@ -14,6 +14,22 @@ pub struct SamplerDescriptor { pub compare_function: CompareFunction, } +impl Default for SamplerDescriptor { + fn default() -> Self { + SamplerDescriptor { + address_mode_u: AddressMode::ClampToEdge, + address_mode_v: AddressMode::ClampToEdge, + address_mode_w: AddressMode::ClampToEdge, + mag_filter: FilterMode::Nearest, + min_filter: FilterMode::Linear, + mipmap_filter: FilterMode::Nearest, + lod_min_clamp: -100.0, + lod_max_clamp: 100.0, + compare_function: CompareFunction::Always, + } + } +} + impl From<&Texture> for SamplerDescriptor { fn from(_texture: &Texture) -> Self { SamplerDescriptor { diff --git a/crates/bevy_wgpu/src/wgpu_render_pass.rs b/crates/bevy_wgpu/src/wgpu_render_pass.rs index 661e6958ea..a0fffc2ab7 100644 --- a/crates/bevy_wgpu/src/wgpu_render_pass.rs +++ b/crates/bevy_wgpu/src/wgpu_render_pass.rs @@ -46,6 +46,11 @@ impl<'a> RenderPass for WgpuRenderPass<'a> { .draw_indexed(indices, base_vertex, instances); } + fn draw(&mut self, vertices: Range, instances: Range) { + self.render_pass + .draw(vertices, instances); + } + fn set_render_resources( &mut self, pipeline_descriptor: &PipelineDescriptor, diff --git a/crates/pathfinder/resources/shaders/gl3/fill.vs.glsl b/crates/pathfinder/resources/shaders/gl3/fill.vs.glsl index 6db1875b7b..a112aeca2f 100644 --- a/crates/pathfinder/resources/shaders/gl3/fill.vs.glsl +++ b/crates/pathfinder/resources/shaders/gl3/fill.vs.glsl @@ -5,10 +5,10 @@ uniform vec4 uTileSize[1]; uniform vec4 uFramebufferSize[1]; layout(location = 5) in uint aTileIndex; -layout(location = 1) in uint aFromPx; -layout(location = 3) in vec2 aFromSubpx; -layout(location = 2) in uint aToPx; -layout(location = 4) in vec2 aToSubpx; +layout(location = 3) in uint aFromPx; +layout(location = 1) in vec2 aFromSubpx; +layout(location = 4) in uint aToPx; +layout(location = 2) in vec2 aToSubpx; layout(location = 0) in uvec2 aTessCoord; out vec2 vFrom; out vec2 vTo; diff --git a/crates/pathfinder/resources/shaders/gl4/fill.vs.glsl b/crates/pathfinder/resources/shaders/gl4/fill.vs.glsl index c1acc414c5..73baecd0c5 100644 --- a/crates/pathfinder/resources/shaders/gl4/fill.vs.glsl +++ b/crates/pathfinder/resources/shaders/gl4/fill.vs.glsl @@ -5,10 +5,10 @@ uniform vec4 uTileSize[1]; uniform vec4 uFramebufferSize[1]; layout(location = 5) in uint aTileIndex; -layout(location = 1) in uint aFromPx; -layout(location = 3) in vec2 aFromSubpx; -layout(location = 2) in uint aToPx; -layout(location = 4) in vec2 aToSubpx; +layout(location = 3) in uint aFromPx; +layout(location = 1) in vec2 aFromSubpx; +layout(location = 4) in uint aToPx; +layout(location = 2) in vec2 aToSubpx; layout(location = 0) in uvec2 aTessCoord; layout(location = 0) out vec2 vFrom; layout(location = 1) out vec2 vTo; diff --git a/crates/pathfinder/resources/shaders/metal/fill.vs.metal b/crates/pathfinder/resources/shaders/metal/fill.vs.metal index b06c58adb5..46404c296f 100644 --- a/crates/pathfinder/resources/shaders/metal/fill.vs.metal +++ b/crates/pathfinder/resources/shaders/metal/fill.vs.metal @@ -26,10 +26,10 @@ struct main0_out struct main0_in { uint2 aTessCoord [[attribute(0)]]; - uint aFromPx [[attribute(1)]]; - uint aToPx [[attribute(2)]]; - float2 aFromSubpx [[attribute(3)]]; - float2 aToSubpx [[attribute(4)]]; + float2 aFromSubpx [[attribute(1)]]; + float2 aToSubpx [[attribute(2)]]; + uint aFromPx [[attribute(3)]]; + uint aToPx [[attribute(4)]]; uint aTileIndex [[attribute(5)]]; }; diff --git a/crates/pathfinder/resources/shaders/vulkan/fill.vs.spv b/crates/pathfinder/resources/shaders/vulkan/fill.vs.spv index 697f1166815c8568c6a279e86ef5ca3183540968..5ab3299b1e8c13dcb567cd91fca3cfc8900bc012 100644 GIT binary patch delta 62 tcmeyO^hIgI1!hBL1_lOq1{MY%AT0;Pj8J|6l+Oa?M?m>Zn;BV(c>yk12T}k4 delta 62 tcmeyO^hIgI1!hA=1_lOq1{MY%AT0;P%us#+l+Og^M?m>3n;BV(c>yjM2T}k4 diff --git a/crates/pathfinder/shaders/build/metal/blit.fs.spv b/crates/pathfinder/shaders/build/metal/blit.fs.spv index 441012ccf6c28b4fba82793d4e4ac0ff42ac46ec..dca202be50a67299bf520ca5fa7a76ba0a91c827 100644 GIT binary patch literal 1040 zcmZ9K*-8UJ5JlU>n7FTryH4B}5Fb9@}eaLMhF@nNQNu4*!2 zNcI)>9cU34#qa!bXO8$^BC3gTChsDew_oeZxM#Z4gxOFiTm!2P#0?}T+nZFVJ`*3II1-^mYc?W^BUUSMhhk+h-JoaqLS zwZ?!x^#i)vLruT=DWG=74V-T})zn>Wz-RJFONCwV2j;gfdjJ3c literal 928 zcmZ9KTT22_6opTk-Rz=SmR-j#Pl5DM5kx@<2@zBj^c)%yR0DRQU(xUFCFuLcnXry* z_N=wn-m}*n^SSlm5C*~szs=A)<&c93p%{je+&a5DYrMR68aun&Dkeid5vrLA!(otY zJl#G#TPPE=L-Fb`T%<~@i;vRbUsQH2^kbRfm!h2PJ2-edip&zk3 zPZREYLzlV=p+^3QiT2B>w?0S6oip9t=TlDJqi=UQW}dq)5$g5e481NB@}Fp&;e9(t zKI>cM`F~#oCx1zwbLvF)U&*+&lyi@aTTeOny1<1#HVFIGTaO6+dNX|k_Wn^XKX9IJj TfdXtmEHn8lQ~%~I%oU6PWYZI` delta 244 zcmcb^xrU3EnMs+Qfq{{M0|*T!@|x;%F@OLI5a%Xl=7HF}Kr9Kw@<6Ny#QH$Y41`QT z+G}Fwc2ia$2P6pstUw4-l%5kGmReMjTH)ye6k!8v0*ZO&6_+IDC8v72Om=0A*K`N! zlm)5=8RZVN6r__Ih*_b0kX0Z)+vbCetc={OV8zlPfyq~y`gIk6T6BRtMj!^c+ZxIT S83Pi7@j=EgZcb#bW&{AkA{%7@ diff --git a/crates/pathfinder/shaders/build/metal/clear.fs.spv b/crates/pathfinder/shaders/build/metal/clear.fs.spv index 648f5c4de2a23141b837f6c25582ead4159aa2d0..a03bd936c09ec1c21bd84c676c4b58ea490e2440 100644 GIT binary patch literal 792 zcmYk4-AY1H5QVp%G|N)U)P7C#GLSARf~b%nyAUdR0x5`~60Giff*z`;>L%#>Jm-j8 zX3w5AYu3yhjIy2i5Hg{_Z#TqeC1gQDD2DvR_Xqcb?)%4M_weXIMkz!SqMS0EIlT5d ze10>rfK}j#A1*E9UiloL%foI}2~d(&JTw~5VHx%KVI4oHFh4c8u2o|g=Mh)Brfsx*t?9kx7zAe@Ybp?-`pA&!q#eANUK_qdC?cWBtB zhRN}ySe>_++!Sjhn6!-KRZ!w9;;(5a!~WHlVbo8rW|POu>GO0p*VN!XvV25`nr)z&TmPT$rfNi+ZSLDi zn`TWjE{7II()0bLb#%uOjH}?k3c`JD5tKTCxZh(l-^A7ns zQQs7^Zr%a;{H_Jez9asL_j{YB<{PGrKZW&%Rp9;`E_Zi5O`>qS-dUFqWhi~yVcWnUqFEsXV0%ypd@f!cD+z*?N!7oOl B8;k$| diff --git a/crates/pathfinder/shaders/build/metal/clear.vs.spv b/crates/pathfinder/shaders/build/metal/clear.vs.spv index 19d4b0f8cc6366650698392a2e3cb48e5fb6acd7..4a75e1d19b7f991bb88aec1c36ac8e899390ec00 100644 GIT binary patch literal 1656 zcmZ9MTTfF_5JorDRulvg0WXLJyrXynM2)v-tPdnMlK5&W9?VI~C8bS_FPiw`lRwH| z<%@}HowGMK>}E1E-+VKB_RL8ug9}GP7zjiB9)8$PG+NTJ!j!`quM} z=G(U?^_4K=V*Na8iuumO(-!la@GWUZ6LcVd4or^r6jlvgN2bZ}i_PM#pooQFeSK#y zW-rdzKCR_G%oCHV@0?SudbH)+i*LGwaGodsO5uKgX7AUr>xEzP^=}~FJwtpEZ4I$m zENAXJ#EdESbqnq6joX*L-=diJTK6{Mk?)^^J(hLKK35HLjIW{1^{!RE9pC3}JmP;q zs%YY{n^XR2?8Et!VB#r%3R_IEKl}17 z_j?X;hr9URbv|MvbgMsuc%L(}4{OQs{yKUNaj&U=bLJ!d6OR4@Vjb~c5xX35cixQH zRcv>z{D{~!Y`Mms(z){!^L}@87ZG!3zR5k^L&Ov3KDHdcjl@~T7XKD=Rlh3WZcaZnW{2P24c=p6%wp6*$ zb05bSoigT%G5S~R!%1CNNBx#6(LZa%JBu88IDF)|3mj8y>YKB0GJFILm%oJ7Sq^M(6coa+p{qJS-1~5x*>tzAht9ZWjEjfSEmON_av(lT~D#za|eC z^G}8tJm>&>7P2W$0q~vXWEmWy3~6iPk-d4 z9+O4P%;=L?__4sjv&b8@LloS_9yz5 z*_nC2cix#@QYZ{i zRHKvSm;d;^KTecrIEQ>|xBu?ayi4v*O{SICO(qXX+$JuA#n>|S?q%*SG4BfAuOfbw z<<2D5;qCn1$*tnm7n5u5JYp^Kd3=l&u$?Tg5qs=i$J<+N^%{6<)tB$x5*EV8sd}qK zu_?!U^EE85UnjQSx&ywQv3q&se1nwmXT0sTfH|)-9mBNmA|`&tmvFvjhKYOJMco@T z?9;;Jcyg>wEG9R{mNU%SYdYC$1+!kh_wIUzs(Wl;`E2g!eD>SS?mp?ShX0B>;wNmG L|35!;Kg50k75^b$ literal 644 zcmZ9I+e$)V5QRrgvn&spT3v+YWguNt1W^$|LI@Q-fe=Jc30C(#LC@Pw(D(iB4bf~C zGqYyR;oqg=U@@W)Rlcp5TPun%5w)l!KN{bUhi~r>!-KRZ!w9;;(5a!~WHlVbo8rW|POu>GO0p*VN!XvV25`nr)z&TmPT$rfNi+ZSLDi zn`TWjE{7II()0bLb#%uOjH}?k3c`JD5tKTCxZh(l-^A7ns zQQs7^Zr%a;{H_Jez9asL_j{YB<{PGrKZW&%Rp9;`E_Zi5O`>qS-dUFqWhi~yVcWnUqFEsXV0%ypd@f!cD+z*?N!7oOl B8;k$| diff --git a/crates/pathfinder/shaders/build/metal/debug_solid.vs.spv b/crates/pathfinder/shaders/build/metal/debug_solid.vs.spv index 3e7c882363f1d297ba36fa4ad2f3683f42c324ce..850396e9921f2e3521eeab893685f59b04c71e58 100644 GIT binary patch literal 1324 zcmZ9LO>0w85Qa~a-dL@+*4oyO8k5HFYILC@h+inCi!K5Mw-WV6E~H6GZa~~9xN+r= z@>jVLe4d+o+Tw)C%)Il?oH=unYNd4|gt@T5=YE*UN~nN@uo!BE?d)lI7W`s1vic*F6Fg`kw`x zz8&}W(+|^rKOOI7UsE8ao8|QT|D_YoK4$_+U^cOz2k*P-_+2{A(=Xz+64y5uPqnXn z?^od2Fh72#Iqya8^&mTVlTGs8@MBucW6tfEn+^ttIp=XFN{3B&&w3Gsu)~DjQ90sN z3(RxmdzUQO@u>oz%^=@%#3KJRzVnGcC2#D0#Oj>oZtP|66|8k)a*f@M*fz0! zS5Za&d8|3>%{%7>6nPorOGWtog|l73m*XCs-8X8WihSd%sIzSnH?Z=>>Ud3T?9srV z>3s2a?$5k)Z(&=gSnPWZUvcj1SZB6(oO2srF@Fzht!F*v{k@|zE8>4Z60B$W9{$(t z_l(#*FQM*uL@d5sVy~!jXKSc?b(hx2Sx3cx!ZF@JtrP!MVi!x?9d}FYGQK-jf0WoJ zzFc$9nb`TnJm0(DK*ijN=eviSsCeYu!k6RjBj+~0__wm=4!&5IiQUy*)IQ?w)0yn& TKHI2o;+>tzSpHvL`w99FGM7}s literal 1284 zcmZ9LT~AX%5QdkQ9#9lS1pGj3!EdyBp~l4c6^RAIMH3QlP1S=r3ACgwiSb4gZ@lvN zdSl}A>^TdG+e~-fcix?yooVZ}^{Egh!Ze=;pN)E8p0Nttj{%5ZpU0Xm$LSxvsQIZrNg&p<-Erk7;9A6d5AM?0hPKIXFRLFglDXY zEpwh9N5saO;AwU_Z4rDr@?|~h%`KPoXYf5K(xQ z@KVG-UV7gpd^P^2tmiU&6LYB-U%|X@1-!zpUT(GObIM`Nnw*RMu#eUx_V+Aj&h%#B z@f|Gz%kyjOsc)&~+c8?k@8X-wd)41#pTNxPePZV(m#}jaKcQxO>w8`1`2*v8)jA*l zPu~9=>^x>Mdp-cm&sCgp@p;Ui|00Wc0aGLYyW$or-dS`jZW-TMXg@3NBEDKvY6!ncYJ=AK`cuU6(b15RKV(xsjqyfAdqIbTtQ`BXDwch^N%rS zz&!R}kDTOp@x6n-v()4I#@&o@=Sn?Z*JkK}D+8F$mFmf@*VDJ2d$OK0rg{rxnb)O; z{X8#m>R_`{TjkE(yVy!N#aEph*t#S?qsQqOkozq9?m=0l%UP_vnGy-5FHhh5D{IU# zkF~}!u?4I%IHS4evGx=!Tt3 zc=?3i31i+g6o2!f_kM|ap}gbzt@f6`R2~Z z&5$NJbCOKbo6XdE%(|>sXWbGRwTuw6f^|FFXkIoqU*B#vw|BN+3|ZC@;S5`kFXG|eZ5(|UZlZ^`C$24p)|w;ykv_N`opQTJU~J&xNq z4$Ik;Y^NSS#_fbd-}t26y7O2=wW&2HMMAugg#U3h71Jlprw1|fl24q@r)S`gYf9#< zx{1yClk&TTMNV_tm^lS2Tc3`(d+Mhp#1-ZD>jGY+{sm70+xIauA|=H`vef1s@P}oo z1rDE>8NuL>$-?J9De8AZHj*M6J}xGqt5@D2K`IfK;irLYil>HF1gHb8-Un`3@ zj7#BwUkIb$q!b)E7RC$}DRVL#wcyQ2!M}XotbB685A{0U0v7m@d@y2q^Bqz1Oek~L zJO++*NtrjiYe_yFBw)+(!QcjL#be~2Ya8@hm68vidv^Nmcd#a(`$)>W`9HvZRdrAL E2Xi(sMF0Q* diff --git a/crates/pathfinder/shaders/build/metal/debug_texture.vs.spv b/crates/pathfinder/shaders/build/metal/debug_texture.vs.spv index 6ed3a62d64369d10805fbc1914a493d554f9cada..9a5ab3739d6ed46fbb3943476bcb9715627e0aa6 100644 GIT binary patch literal 1720 zcmZ9MTTc^V5QaY}Ehq{i0v-@s@QflV;3+BwBVKUP1mmr#vY1T@C8agS8%@0N${*#g z^2WsH+1-y;XEV&qJI9?_S{hs!4q+gS@H`GVO@u*^5Jp2Klbc)HTT6$Xou!r4Wh2Hy zDGM}aJRHmPA^z?)(tQn)lkj*fNOmpWY;&H(IUs4!W56jeoF8 zI0e=P>vY@6cKRj3WWpR*@ASFK^gJyHS??V3pmmsb(pEO3nDaI2J+K^x!$q*}t9D~A zdEedLP1?Oaxes^P{m*T$OFE!3^V~vyY`&`}?YBvrp~Rh2T+$c2R_H12E;Bsc@AUW7 z=kD-rG}D8Z>0zg_{~@7Tp64a>b(_s2pYynPX_IZc-?_}nZFj3}&(}=sUZsUxkW+G<{(54up1bO=r)@pS{J5vl96G}6C#H;X))aFO5mOiQ zJM&%Q4kwww_!^io>eFZyWEGwvgMWt1)>p+IK^iOmq_Ewm*cA40WEFNM^X)4Z^G_5$ zar3p^zwvWaarf4?*96i$F=Msez1SkQbthrT_%ld-G5>6#$64*=ZDKEP5M#ZUxnlOx z_71U^J6V9Cb$e@H$;@xheb4LYV(!>I+(1@g$$0IXu)Sxo7m>z`&7padSVN!eJKaXQ zTm8fQm9j9*6jPS%cduAxi%A0n-1uQk3c-_MyP@!ue2q`lmqzZ2GbitWwD zVDHt!79TIL7i78rDcBo%7jul6hQ)snqdfzgC;p7Cem`Qd#|3on6no5~i^U#QbZ^t& zqlPUWd(5MoC;qeOdl_BaJJt*AD!O-+zZcjwbYt~7pF0q=9-xtM>Z^vRnqc9zCl{~X#A>x-SONB;%1zUVjK*_v-X zR1uFO#>l_m2EPxvSZ@m3 zoyB?=vE^dD%h>KP*1LjjjQsENj;q-6?zUBO*Rb8K^0VaX*v9I!7vEM#UgLMp3y7Ta z_kL%77m<%K_pps|=P_mxTmE~Qb01r-#RMAYhlq9L-JLyI&)q#n<`KUEdlDP}mkm8d F{sGxQW`h6# diff --git a/crates/pathfinder/shaders/build/metal/demo_ground.fs.spv b/crates/pathfinder/shaders/build/metal/demo_ground.fs.spv index 504f0956b73830cb66fb93fbfa1e025a86a38bdd..eecbff831e89b3b12aad2cadbf19e7d57002124f 100644 GIT binary patch literal 1248 zcmY+C%T5$g5Qb}Lr$Iq3a`Or^Al|@<3pFN2jUjPdurSdVAQ>{51g4V_2uqhfgU{m1 zH}Gk^Bqn}ePakZ1Qd9N+Rezm2)tyajPDV6hieD$j&q7SVL`+9s`tIKQz0SwuUgzHnWXlSO-+D)sk>(HAGf zUZoDY<{|IXucg#J7}L?^7T$HOhMh0rw{%Z4Y@XL-CFd^GJIBU(Zj9yJu=+GZT`!mP z&QjNl)tg`BU*D#i{ft+La(oM0<$T|b*jx)dg_qOBm+*}WKd-QNmQ%lgSMU3@{tDi+ zL=Zf2y z+%k9r-@+Q0bBNPU)!znNn|izB)cbywle4$jJzM{jJLtW?kN5lu)5KfrKK-_xTkIWf zR`>;2eg<==Gi*nE8FNl|Z!Xo%5?lAZ(#;XeeXjO6Ppnq{C6jorT+%NQ%YCKZ-Co1w z-2WGPy7%jt{15c$JN`{h{uXu@^M1y!>EqtEFn8@fJ|v!{CdB>gtA e`>gAC!175iuIufS&U#4f8P@u(iT|*{XV_oMNlkwM delta 316 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 literal 2928 zcmZ9NYjaao6owC^g<2{Wxrumb!3zpjs6c@V7%Popv?xVT(GZ)H5=om*+6M79I*c=Z z@_+ab{N~^Ci;mBebJon6b24l8`@ZY4*S@utoyT`4$&O@<-_J?*?Mrr|B*~s+*Kn-W zZ`Nlvw^}o2&z&}6Z&Dcs8uJu+BaGTwv$L*a3mae$u}Na}jbRmjI~lK&IFgJfwR)qr zv{b8KYpiT+G&Z*$b<;+-vz|6uoqoEq)fuG5jTPcL>nq*uRxx0dh~nI%)ZND%E4{Ui z?X7g7H%R-<)%3)mJv*;$&YqdaotU?mvEA>jWxT>#=)ITuCc({q+N|GN9>(s6chj~@ z8}eg}{m$xr1#6vReAroU^;oog4&H0GH&X&eS$7ql#a5CJz>hHX8;q?S-xc3cA05W_ z7HNH<*X{MQn(pafF>Bad_jj<|8^(VJ-mc~igYCgNHk$pW3zYv*;5E4Yyny-1tzYEU zmwV3ooulZNyAOWhpU!BqpOf~ir|Hw%B0dD##W;l>rXCk>$n{OZy(4Pck>m+}ncw+~ zU+|;U8^>Xs`FrvpHS13>I-mDr8uTQin)7JJAH;iraSHQ0ne&4g9o9Vrj$RM2lB00z zzsM-IfAgGc7UTOn_*)sj8g(zh?LYjUJzq8WgCYH;>UuW8?wvi)=iD<>)4$DVEql{1 z_YBp7dxpVXuV?0Wo*QA`?v0-{|3MjLG}ry{{zPrL_eXvizvK6q^Iaj^Sb6w<1Ut7r z^W+!FaxFh$zEN}Z*^_auP2azCd;zmZum7`EFgu(~PkW-)?ao z$4dNEfqT|-C0;FY-*412-Zxz2zGHcn{`DWm?AJTx{&-KG!PFz>2-tNLW1fYp|3w|| z*>jkA>aowygRLFh_i3FQjo)$fy1go2Cyghr4>e0^|;BwD1XzCI3Cb-=5 zX*6}`cYn@c=BbBv7VO*BLOTcceQOikN^{R+J23mQj(Nt}ulG!U^l|~LRy^~IaP^3p z&tonzx?kR%w=s3+lwZc2)1J-OZ%5bZ zB5E#x-Tz|E_u%Rga}8XccM(lJ=B2u$zjA~K$I@r3!J^2u>9x-*W z{S{+Af~&_qehjvD?BfzR_R)IA8)FZ?dHqrU6L7iyr)cUCa}!+da~VxN)_)6Zo_gec z1}^XIZ8Y_WxdXO#asNMut4HlGz~-sP-hK&oPJOP+zg=ok_bYJuPJWH19x;tPrntBF z(9~n@CfK}tnDg9aRCDjg8Nb0MbMF0H!QA6t^E;5{T8lBxs|~i_;HzNk{+8$52OFb4 z!L7D#2lGrvF#Yj%zXdyo{?NMM2f4XlyTNOivHEVKO)#!w_OCB`>4EL#k341rY@GUk K{6CWWKka{3JIDh7 diff --git a/crates/pathfinder/shaders/build/metal/fill.vs.spv b/crates/pathfinder/shaders/build/metal/fill.vs.spv index 698b022ef9063cf753052c21c0f7c784c8179c30..ab6a2f0fe7b1661ad4a41e26a0d08dc308379f58 100644 GIT binary patch literal 4552 zcmZ9OXLD6m6owDP1P}xZV8>&2udqc&7 zes}odPqNJD_&n$A#hl5`yxHr0SJ~_Az0XN{rZ1V1Wz({m{QQ;`;R3s^hh--LbJ+E7s^sKHS;Z6u0ZI z*1>SUE@7Um5|sF*Q+NeF)@tg`<2{e+285vg`T-Vx&gBBG22cuiI!G^4X{N)^Qb`#vNHwNZBBMHR}%Y%-)q#5BUnd7;aDc zy%&o>FR-3>!cnfL7WF*)ay_~A9M&6Pww}GqHzpqId7k=x&-D9F%A>w#DR=1ijLO_I zl3UMyW8Y`P9ii!0E62Hpn!QDwwp!6oPhQWsW9Z0vG110oFCeOqxgR+C;e51ms4paP zX08{$S;?n%EU||(YZrBU^L5p%VeBIEJv%jPAH!^{+M2{Y&*)_Vc0ZT~mf@E#1P-}9 z9h8lW?yJ41%gk4e<5eTuZw-#3pYkRVqVH) zc2*+hWw?8*Za=RvdpF~Grzz zCtUXjW^3wq9r^yG=|7Ncb1&pxcwVmIFz+uEzc=Qd&+OkT?}*&lzbV0eFZ`Pl-1y2A zzG(^{nZkEZ;eOk#cNyyy_prEwYw6Cl*MI>$zAu*n@0{e1^h*w#^xUT?$p9gJRY$2LygUOjuY0iMNg$z8yAGS14qy*ugqi18i0Cuzp~NsX<{ zj(^yndzh=>e&9XTwzl_h6jVUe_8!!Ldc=%j+fzAa8(e)3x6YhFkk;1Zh^i! z&=+x0_dc`{U|pYEZtUOmX#e(V&k^6iu7GkM<8bwenZTafYZFa9dY#0!pQXTj{n6_K z*!tWXOO((K3LZ?lN;+k*uTB* zWR7pmF6{YWAt?9qBwSzAeG0o=S8hzXuJt4S=~BG=YoE^m^=CK(`Ljt|$sEu19JbFK z{;2mnT6ulBvGLBnnEclEd-DoVdl@{Hv{$kB0)6hyZf3Qp@dkFK#NWg=W>?C83)>iV z^IvCHi~M)6J=5UtVwdyZgBzo6{@cuI5&r@9suKSY+h>mTKf*Rf-F-QW`D3secz#jm z6KwV8Q{SIroBIiPDQTZ$tA7UKTlfX`iiFs+FX6`OvuFQ~sl~Z`g{@Y;J72@qpGfEa z4Ype3e2X19)|49){r{N!H_+=$?4N*|Beb8f)x0Z1eB<^p{{oEFw+Hwvu6cm@SFj(r zPp&C9{$DCw4E&$Ldovd}W`m1}o54IM*|V6B0KP->nB#wkBe9K>FJe9=ai7Qjj{@e! zJ9j+xd|)qrTO#fRY<-@ac_#vM)yJvT$9xh{_ZeJQZoa;LV6VX!V;i%ZdiqZV{Xjip zmSC52PJ^5CY|1$u+Zc84$;r%T0Bh;951&`fn)=TKYW{!Vo-R#V+}X3?@%-i(vka)m X`@0<5JoV7d#a2HD{Kpx{J-hz_Zk30S literal 4384 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 Xy_$XUz28$@jlB832f07o>=phOWBWeq diff --git a/crates/pathfinder/shaders/build/metal/reproject.vs.spv b/crates/pathfinder/shaders/build/metal/reproject.vs.spv index d008e3fae73d9f6939245d98a7905a08ca6b7707..6653c5aff2619ca30abcfc0d2a17e98c5b378aa3 100644 GIT binary patch delta 567 zcmY+B&q~8U7{qrQld45jdXicj|5mNllc0!#dPq;A;KftvK}AR-R)WXAf+bhq!h?5T zKwrTJ5&TWq6x=ZE&U~};eM`Ql-zu+X%}Jv*0s6g%MCTbW4;sMZE3to$o<6F9DVusO z8gn0a&(k>08g}7u1uea}eYqa=lIOd}K_4!!bgkrn$@qk>sgR|%JM6%V)C!_TiEv0$ z>kdkhR5ORzMPle>m}dL26@LCt^h1%Z7;f6avAtc zNQU|;PdP`9D_5H8>+URn3$COspr!gQy9a97kM}h^Woq5n07?nLF)rP10_oy<(I%Jz zSKLwRw$s?gTFYsc{gPXH%MOrNHBC|lBQmJ%n>Iv^WYRDiZx86thv0-^#pU}o)*OI8 Dh;=Mq delta 528 zcmX|;%}T>S6on^E6S2XCxD>VVUt{e~1W`~5A%dbHZcC6T1skEQsH?8rTe9^nT)6Tb zd?CT_jEOfK?woV)oVhc355603C+&t&)ImS(aQ7=P_oZ)JXr@ vW~s^hf?b+v3#eB$%{>Puc&N4wbdGwC(YQ-!b|Cs|O>o53#MSu2$ot?I0gEdf diff --git a/crates/pathfinder/shaders/build/metal/stencil.fs.spv b/crates/pathfinder/shaders/build/metal/stencil.fs.spv index 08d0ed46292a44ddf18b575a51c07e45066cbfd3..63f7fd7d32bae27ed47f46a12a905452143c32db 100644 GIT binary patch delta 23 ccmaFB^nhtX0xvrQ0|PSBTga7~l delta 23 bcmaFB^nhtX0xt&x0|PSMc}+n)AYcLF+{Da05Stf>g@BkD2$_KNp^3TG!fXue z4BTKr28Q&Uc<0iboQd}}Cz~+Z2zoHE!lgh;SSIH(%1>Uyn8eQp76;kD2E<&GC7GsA Ie!#Q_0ETiCEdT%j delta 221 zcmdnP*2B)r%%sfDz`)4B0fcfBc}=xB89;yqh;tJ&^FVA~AQl2*86cJgVrC#@0@7X+ zQ>!QbQP5;%UZ*uZLmVxD=$C5d^-sh%#AB^m7}=P=61x&zGz znZ^yotUwIngG>hT*(SF#rgF1_*+7>8`9B$_>nZ?MNCSC{K+Ffk)=)mk6p$E<4>E;u Iaxc?*0Mv3D`v3p{ diff --git a/crates/pathfinder/shaders/build/metal/tile.fs.spv b/crates/pathfinder/shaders/build/metal/tile.fs.spv index aa557a45fd852bbe534b604fec33c4a48f62affa..ec9928be028ba5c20138bc9543a75fe33ae2810d 100644 GIT binary patch literal 34884 zcmZvl2Y^-8wT2HeGa#VY6)RX#Y+yw!6cwW=C@6LuV1SV+I0dnTvG?A4Z_yZyNz_Nz_E6CeNDa`@Vb6n%T4EJonrG|F5;zUb~%h?ww)Mdx>@W6h*J1FaNi& zwy0do7E7QMMgO9%Qjec7dBUdc9WyuGa;wdCSi0z4@zZA@UNzK~=K97K4ZVmnkTRIE zKII5X2W1)B=|_j4-tZw#`z8U^-cU5TV^zM&P*L@@ksNi#eX1uwAVM!YibzR+SJ-Mv}45ZQS)bw7=>Ka zGQOp#XK0zyu%M%}jb5ty(uqEX~y* zvAXSM&1!GxsOGu`d~st~Gts-puynEEV)`0sUk-!*tfJ3SBFDO7ZTs!)7}GRwPW^<2 zS@d4*f1N}h*U-Wks`|Q#zE9)qIW{oPden={cl|`~&bOx60DW#lTT4Te?Q4sn@Ya@w zNsS9s)cP00sk`TITx-kx)~5Ll+r+5m&)T9gEPQK zx?-=Y*4!|?bJnbewu-xBnW$b_>z-qulpWY1G3z`h z(_@b}W_opx*A|DPSMu4l5{z;7E4-i1Xl=S@UFN!H_mUI*-+l$^zU69iM^$>xzct4 zcxFROYcsVu9iO(XEZxqnGiSRQs(E3?ueLarI)6qUht~5M*|#_mtt*$^CQq2sy3hEr zm1xym7Ga;$-bBQ{#mT8JZc|!mkoca2y>0e%e3vXvPkkrPXlrO_`A&|f;*;li8d}dB zmn_asW9?SoHgkdxyY6s~_sqq_I%_ep&QD`aZk^S!m{{j7Cf0e2iFIijE2hGQsJ^O@ zRc&$6Vq#tVomjn#OVFzCDoYkurEz09vbdKoChirBiF;*N+TIXw~ucEA9eU-x>F;Z=ajKfprhkxw{p= zW;`k{L}0bsN-fRf_MTeTGvJPHJ#JH#7cyV}$gKeSC3uPq*ccUE65y#>%$P4N-+ksR>gUjpX&G%oF5WqgTVJ?*_S zzGTMxWqg^8FPrfdGrm&BSI_tw8DA&k>t=kTj1SBBRvF(q<9la(O2+rk_`w-JEaNjX zJ{R8o?paeb!_)V?dGPM{yuL*{yz=ZS-$)xkPDXZ=9L&vod~m#?Q_8`8_!I7`PkLzOL?Jt0}I{_;o!v z=NIm?*0y){u+{bSBzkfpWwbkdpK7WOG&Y#%UIJ^3p+UM>&Xft_16u&3teTFZu&CkGPyVc+wyc8IFgt(&D6?=er z_D!sO^qkDysC<8zq~1AiUTa$iZEA}t@Y(g9?d{`Q8)orhq&79Q$-Fp}c^rtA_Io(I zI{vz%Bm8;w?BJc=X2v-Yy(@<@&V6Xj6a|87c%~0#$U?# zs~P`&#$V6)8ySBy<8SrgwZ+Q4Szn%o2R5{|#$2z4=Df9(YqkzNowM~azJA7sW_+WJ z59`5u7n{LjAC3giE%(z@@ceS!4g)XPvwMFx!e>-$y^ChB4?oXF8<;N@nte}oPhJG~ z{aM>};B*|<_u##Yo8i@VHN`DGY&FGg8GkC{&t&|$jQ=v@&-dVciWlKC>)Ylwv^31z zxyScGHN{&!d~1rgGyYD-{|28`-+jOMIJ19}@lP|pZB5U4+AiZeW_)zUCuDrDjPIB6 zsTn^gxy&W<@;lgcd-jfz4B3}vgc}x%g}hj zw#;mp$=h#rA70)gUQKaT#;@(c>xyULzB}@sSn2P3<$itvy`!P}#g_NGH{df`=Qr@R zLivtXTYOfw^<8iCGN-Rgt@~ZHuJ|unr?0T(%V^cNPw~G@_k~nj9iO4Jc{L{O!tUAo zwzT_x?f1O%OTWq>2;!Ms0zEyGH5u=l@qQU!3f}!(sI7dLJb!F`d-c87KI)2P!)Nnx zt(9+M$yt5XF1`GqT+wTaHM{hx-(dLs%A&>!Y+h+U1idqKKloS1R9mdAKEC@4yIQ`* zUMKf0C(3!$=GBNg)3jZaua3y2PqBgVQG0x;KuqIn^J-j--S`_O z@i(f(>G>r@9r4wxF?!l;zj4xjle|4&R@h$sJMFRAezTikBsk`@rgY+?>g|V?<^+HtL&>o&^mnxlxNX# zdsYtZ(YB^IEaNjWKC1_>t^91IwYqaEFL2&7{8`KVDcv6i?dM3e&ho=y9X@ie#!_?6 zk193&j|Qi6eoVs0WB0S<+7wv}G%ESVc~0|Hi~c;%woke3 zz0A)u-XA=W;`rnIrt#FGz2`TLCpR8drG1>;w7pui_xz^q<+j&u|8aKH_G;1I^P9Gp z+rD?%KF)61UM<>te$)1H+dH4mhvz|iuY^Z@?f%R#U0?UKJo=CQoA$33{kxab{^iE6 zqb!e?enW_6Jn>2(ZG$O;_{}Z2T^YV4wQY>2y&ttUb?vUdcIRLS zYcPOX%{cnnW?5?6sILfLuA*1-(7t?WS06&O6{z*KokhETt5U}p^ji&X-|Erd5PBT~ zH(%RovkrS`<~|JF_Rg2_H>Nhey74!m)@~bZ*6LeON59dx`bc!!>T9u2^Vx~o@i-r9 zX)eaB#_d=5zLfguAEn!`Z!vi>e%mT8eg9^W|5_X^CQA8MVa7HVbr?HX$5#~joA!+r~T z^cVK-_O->`*xeWUTULeLPwm?OnA%G|s^mToyjEl6Kc#le?%!Wf52knxEBRAk=SOZ1 z?^3+N{(hBK`uY%TEax=*KdaamJ{J7j3Lo9Y>v~m$F1}QSFMKro2UYn_!3S6UM+e`a z!bf-U5mo;RcRUBcmGqa_L!7IP$<#St0pgg_60ujtcGpuIY_l=z>wRHOxcQi)KA!8j zXc1q22b}+iUxyF=OkNs0^fl0p6(#!I&dDx{G2u6=Y_IOv!f!|TF7yA>H7{c;?M8RC z+YRpAM2U90SNxXg^4kNh7A5@VRs4#s_!q-3=y%Fak=H|TeWHZ^2%2jYCE~q=UK9&= z48ND*YEi=Pw^hHc{9c8tMbXcBKCQ-h)pPtbSj~BN&p!iqAF7A{%V7RvU1}@(D-hRC zJ$$|d+r8(+bLM-H*P5ul@3;qy{|(r_)by464ix>!hKM(Alu)TJlPR+rhoSu8nrN z?>}nJf$ur)O??-D%}Y&Rx$ioW>#-%)e`_|4I=iQG+20o^xK!GDpZC4reQqqd@BQ)} z;O5f_H?7nxg+x6l1uq&rsCE=UK30NPV7z ztDj69+x(JZJN3Ow?Rl{MdxiEZu$p;<_Cl$d*CfX3IDSpBz5d#b?|iE}=EtaG%)bGf zUyS)Bu$sjyAM?v-`IuipQ;#wK7MzdyRW$V&^Y6g6Q;)Iy9&GJtu#qJV1$a@)r0n6m@+(CvQ`XB{zq6DE2vty`cSXrS>lMqEh=i*mm0De7y%Y zzP6aZ55VePj#nPzb^bQgz%_&tXKw8hJN9)Fecci}59^iKd04;1p4SaZY}=s}=Vv2o z?}Hywe?;k1a((`t@h=l@?5`58{}R2r+iUNgaP9uwJmPEj=jOq+`*ZW)+WonCaP9uw zJh*m$ZXR5_KQ|Aq-JhEW*S=1|wXd6S?f%?6{Iw5Dxc1F5?$6Ove}9fHkF)kK@CKCk zDY1V(2CF~FUTLQOgresD@p<7IsOhi$Q;M4R&HtnJ`U;!+e<=T>xQ^oJ<8!d<8|V28 z@Mjct`*0oA^mh+`O>v)S`>Nz48A%=ZzZB1%ZQNJd^>c4%`;xxR%N)!lY>p?j=@a>V z1Gar|Zy;&Dz2M(sS2v#fN-grO0Y|>>F?r-$3pQWdn6LKerw=&or!U;kQR?>N{#1*8 z`h%k%_o_Vl8348)+t`ox=x1qg+Rs3^pMBKr$9=9A{VWHLe%$l&=x2Gb{n*BSw8yh# z1+a7Jn9WCD<9m`S{byw7Nh@vRC@$F~~X&tvNP zdk)p2&o#l(r)N?geXa$zPutk1_ULB_IPGU`_+W~9B`<2V=x04}^yAr?Z=MQ+=GBRB6y^2lvlu({dB+_W3R`7S;+sB?91$IrHZ|6e0aeO{$OW$|v(1ugIHlf5bZqpL`UCm~RzB$<3Mo`T4Yy6aXN`fYS$qytRj!CR7Qq<$`OJ45 zzPW|^oQ`g`8p-}DA3z;za}ZeFSdL8|{)d3= zJM}*lOv^nGR68<6f_Jr$yY{HFqQo`N0CnsF{DH%T_;rgGMaQ)9p zxZ^xK;o8qlxb4r+_$3L~|LTOB|FsF%eqF+icVoh}-mT>^R=AqQ%gXz^ZC!Wm(e?9gbnxIXIo_!(g#cruG4}r;+YiB+!(m=Y^Q(3yb!FPaXjmCZ9Z==0^44j z=UyJ|E(RM{oA&^Dw7V3nfB0So)@LHC<=kHmRxc6QKu^;`l zM_<=~9fx^&Z;*?n?X(-idylq=aTD0SV!zxBR+gKtg6O=&xNZg8#w)bjN=-Sm+e^*0jrYd9CLIJSRQk9FW5P7XoOJM%1e0H*} z{`$n8cp0pZS7@)4nsR8rEw%Kly^3ag{k0FG_^zj(zU%E>iO%N@>Uh`Ny~Muj?UCpc z61-=E_bTzS)Dsgt3GABeL+!hs?@q7Lf4u9--^lo%GXB?$zmxIz67IXs2O0l3<6mUF z7n2tG*uHc{2b^3Eo;yLmMxSGYw%Dv^hXp44# z1gGuZgsWNTf)>?w&Y!ku_h+#49{v3Vu4eJFvOnipTeN!%oVI%#u4YO5b3L@#&gbI0 zVE0S#zrh`gpKrDQ9juSK{knc?;r~9^F=%rw<#8|l2iQChpy=!Tid{0D5D;Qv?h_`dfuxIXHU$LC;U zX)_P^rdss-CD{21{uS7~B9E`Z`l!eF{|nB?|35VK$n6`jxkhf^g7r~fRKC}_$i~-Z zZk`jh$Ylv|np^LZM{YH6ebghjT5z6Q9h!Rh^jVBgUo`c|cS*4A)MGCDf$dY9`Ff7k zV$1`;jv@F`C6Aa(!}U=QpMhZ4B=|CL<3^ih!TP929?OA^rOiCNf2fJQclbLx5pPAX z_5ti<_wq_$r@4lr?Ge_(XWc4bZT=3A&%0Hry?owj8$?m_-YSmxtAo?{Yru`~_l?@l zDbM6uV1FM-d$b)4cD~{}s3CAQi+jYgyf)aj+Tz)>4p`kQv~^3(z9ZgxX!>f4KGz33 z-{G?XT+QO=4f`Alwyiej)cdbm?4J$6YU%mk2(BJJ!%Cm@KC&^Idi)G%6R_>no%7A8 zy_|Dxn^M%AbFpJEzs5_lmr=`R)*LtRu%Q!1*|~L{pD_u@zV?K5K3Z z_A*Cp+fYVP%uyV%M}qU%+o7qOo6jt{xf#>;#)+@2s&FAJ$VBaz1ehwZDPd^8bf$O6lb3PXAb134EgB#cPD$mu?@3OBB{_)(-Z z-+xXld5n1i+#F;7?+I74c)1R-ZhN6Qwm91p;rgpPzm7#M_TAoKW7j8Zy$_mt{9e#x zu$t{1yF7B+7wnwHXWjkaY8EeZ6WZ2!(jI;94^~U>D+j>U^>-fS_T~H^1a=MO?&E{u z={`OLu8(@m$Dv^NK&b6Df`))49 zv(-fHKDYji7A@4R6ff=bO1riFE{A>u*cidv!0w0p$kk_RJ6Ioe@0apsim~lW9CO|Y z&gXnSn!34mP|IV?M}pHiTL4$Hb*+MxSr9o!08!18=jugbKv@@ z$N0_#dq#tw2RE+oe~$lrus-T>jxPWkOI!4PAvo>(B6!;O#c+MpqpwTAY2TN^?b|u9 z@5{jYs7K$IgN>z4KkpA$fXzvpv0axd!On5qL#_hrr>>9ft_B}Si8$AQ)%10KwW&qS zYr)2h_vP!rgW1sP;d4EBDkawO2C$mG#?+>!zxS>i!BZ%4@45-BX35Xi&1k9bEpRo9 zS9-Q?MbmD)=<7CcwSD#8bvs;5-^HCR?cR^PH+c`SHkRk$PO#@-A!{JN3#@hr#c^s= zOYe8yi)`=Q{{Za#%3ZI!!Ol&5H+T92wtqe2Z)E(Po&)bqZI08a&BuO?Zyf#IyZSjs#~k_m3LIl} zUFBi>H8{rT8p|V}-+&`m*IOR8m%)*%YcC(k{G015U_V3H*K}&*+Fn0%)NYQhN96H4 zaOCLTk%#RyaOCJdl1CnY07s7QDS6ob2#y@xU-Gd13G5kjuH9?$nCm}-$73^(>C~QS z`!&9C^miQkIS%(*D0zhi+jy5v<`~bJc{?4R_Y^4>}RC5 z1h<3jzmwYgfS-ZhCtja~|0m<$mV6BN-w*NoJKXs1QyhcupYNfmd$#^T?d5x@`UjMc zDE2Ehj{W`dvuw$$f?x)Aq)R_WuGqp0xePXzI~kp0+oRIosDKVEc%1 zeF}D5@jZa!`Zt=o;@H<0XzJ$W{L0PCn6@`gwEqh1 zxYG7tqp3%GdD`AMF|PlD?IXtZKd|G9&zX+v8#Hyt)yo?mm*Y}LDrzX^C62t706VUT zmV@h~?tGYsn)6{F#xri%>_4^X6R}qS+uk`5$DDY-IG*Bl48=L| z9&v1fj|1D+3DnMs_Y?mXQrsit{vD*0uaj`&t(Woj6K?yV3D zrL<753Rm;ra5^96rxyOJgB?fsuL)Q4-*)P6{%YaB7TEZ~2g7ae=OFtZ0=KQY>!r3f z*ml}%XI|@qjcp&!iCpY_MBmPZZR6*$8-Trs>#v{oh_@lwu^GcTlZ&0N7`t<2jEJ`} z*m(Nur`>&^p6-Ja@$p(niG8pL?Am{yI?lspw2QTNt^7Mw@;KL=Aw`D=2+CC z&+WnHo<2i%KvRzxJAu{wcfE1%84XsCvZ&k>W6(xXw1@9F@YtlBUHa~froVP`b6(YA z5AFgsxA=ZbGfPo-V#W1joR_Q#&6E}Eg8S9 z67L=6HPt(YXIBddKBAhkM^^`dA_sJ)T8|zaI`m;cJp;V zXp6mhIM^`+p9|I}?nO;tebjC5{!t767O?)oTfxSQpW_?>HV^-8fxg=3QH9W6`vGg?3!2=^OWlsuxBTpx0i$UQI9xRfQ^&xg)8Ce zi`ehRxe9Ds^=NlB*mmjt>l(Ovoa1Z3wpDiw*HNoQem8*4Puum>azCHj=Z#=LW7tMp zjNvBm#T4zf^I4!4F>eJ&%v-?nu-y)JPuuP`YI*c`2iX2>qfMWisnw(XonZS5eivAu z;6DI2Q{rsi4YrMb+I+^UrO(*Y>C-Fy%y23^p0}rg-OFcC+mH8=dx@b>@E^hTbG@|R z2iHeEeC`LQZGH^5jq_@o2jKds$NRxgz{b*M?(#JEvuWp*=6)tTaz6`f?&nbZuHdu& zDPqLCg8Z3;`}yU$glqq0#-A^FjO#(T{XEP#{G9MGTt%!i}LGbM_0c`WlpI_cYl4-BXTVE_Uqty9Zr^XTk0VeYEN0d^jet zb75X$=RyDYZ1O9xpH1}FPrGZTp03&X_;{sjb}l^D>^!h*b^&#)*^9)8HFJ&LO1NwE zcE;by_}>z4`;QZD`%g0dX~|>$egikhSmRgVYA;j5=Xa$~tl#h9uTs?GJiZ1Vo0M3y z*U|LX9`XJFw$F(723$Y&i1$aZ_x~ty{@z5_Uwg#+6F80cXSjaq;q#Z$$KUgEKl~N$ z^Tyx9(&oB5_l{reyc*rc(i$4DjcFkjM--D~A=jVO6xksB1 zN*?p~54ihXJ?875VB2Ynb{~T6Kln#r<3^l+!Szu$SNDneh}|Q`6uUq4jj{e4>{#{J zPrH8ZJ8jY5f57QD{txch<1^A{a5dj8VvRqC4}wRDT)#lqUwg#=5^SF_2Va5pQ;)sz zHP}3~c|PUo`Mi{Tye_1~nY<{$7ngW>>Psk|)yt^OVL9q=h^PKJPx@} zz`q4Ar2)P)RWEAeXpiUn>R|g#-!IlcQxBgtOP}=JVJ$TE@EHs?=kz^c2%37#@!DWx z+g6+NqGnF!8nJ57jFsk8i>4kvbzt*ObLxYp9zK0bpERc>(bOZSeqdwUR+~AgnUnJt zu?B$id0GlhJ$#l1n|GSiKs5F6Sq5yJG^b_J)FY?mz{a+%Hgi%lC)Y4ytpLvFX+<>k z@L8$!Npo5mO+9>80p~dlLQ{{NRs|c|w%W`|&79nS-*N{__xDwd(JS5Gm&0SPUr}QB z_mvdmTumL%qHT#8&mx~4{+;lY@0jt?8Tapmr~dw(@Ra*^!c*?w2~W9yCp_hcWV}A( zGcxYq2~XQE$hdzeJhdO2aOdQ>gggF)C6DvJKHPcp{BHsF`nniWsLOqxY(VX2uc6c& zuVO=L{wp@(|J70tqxKzqV`_8Rgt{;FrqoMPZ$|CUfj6h_Pd%L4`^pGv?<>~cSF8t? zwd-iVaj)DG?79cv3hvs+y>n~0KI-l%xiQQ++KdDn!+X8^LLRnJVB=|XkI3UaYkRQo zS+>z;d^O`c7ZGD8aKvz5$-_1V9DTdT|h%p@; z@x52b!!{Ef@x5=zBYp$ecX!)pGrpSfJ%Y=rBh9`BilgWVfcg?3}B z8QZfRv6{eX>}I&J7nPqOTj2VrN1Il#ZQ@+dgFnI=sE5xHVB>^O8(cs2Si5$x@wJ(s z-26sRN1XZKnA=XUd}Nv1k>Hc*Lp}VD0>^wW0L#PwXt4h3?y+O2jUhgkTDx(4=Q7&`EyyuFVFZ@3Ac}H zOCED~D%^hWV4a$&Plv0WM)4VTCbgH}Gip17qGq0A<2e4az>e3s5o^~^yU(n1!HzZf zd2r{!pE+tjAFhwO>*Ki9^mqIhg0G{N-%ouJyvOfh!u3&)J}vqkb)L0H+pEEjKiXacSF?DfZCw-Xwsrqr2X+mN>-xxJ z|6ULFoz4Dir(HkSU0b{>-k=S?rzpm)e20go9zHjL9bf8mGhE$sZkt=cgGg50`+?f6 z;2SC0V!XG3)A8O8SF?DgMOO z`-foXDEhw_tfucG#--1Xz~-eb`nwOD=X5`sdd$&}!OoF-%*O-ZbnpBGu4eJd=i{g7 z`WP$n`5D-pw8i({4}#UbLVKvxj2YU)rRM&O-!=U?n(g)1ZqA-h^|*JrzIRc)ZlQSZ zT9x|N5_|8ut;F7sZZEO-o;ynHedSJyXZ{D&-n*Wmk7p_Az3YX9+s7LvcMd%VkHL)- z_oBz)YNt`W7d=Vs<-JJT6BIT36&uI#`~qzLj#aE(zt|hkfz3UB4)ja7n#Id`_1Wxw z>3KA{^Pr#qe&uQEUs1Gq79FSD_>TA2VCPKkz3N4HdawEoTpx9PjQ0}7IH$5V<-aYp zSE&7+d~M zbK&~_5o~_(dDZoL6Rv(HKJq_-)n2B=dHOThSlZ0T_4x}}J$(KOc0JP1-fy9)J1*P2 z4Yr-S`MG!0jA`HRfZaRKl)1bMSDVX$xD(B1+uz{ov7g=pd%2&q{hjg;iu*+z`MwXf zzxel`AAsExRE4(4N8O(#8P^!biWvU{8^hm`a6BJ^)dmwN?kgX`J)_#9uYZA~FYV#` zap|i)`d3T)H;?H56R>9@_^0sdn5w^P@^85PtVhvTyXQwe?iJo!?xlF$P4Qmg-nb{h zKLk7WA5nWB(Eb@Q;y&QH|2pGK)OOpw$J8X;`;7m4P|@Ca{Sxjw(NYQ5zHG)(QttnLP|8Oo+;}@?d~C*dNx1p>zaJFwZ14YmP|EjAxc(C}J~iRC zKQ!Uye^|z6B;0tjO733p?0n98xQ0)bXXgvJn&%|W(^p{iFDdRf*HlgHdb)38Z}ld= znl{%~?pgP5(AQDE#b#{%y+8FSb^R-A57*{1dP#6EiZ=IwJo4@jHV2HQt2qxo+XjKXyccO(g`(zJ5=WfXz-cb4!_~a!MlNf>)gu@8znU?e?=8WD zDUQ{>FOT)v8tmWVPuFJ~xVrwH4Y{$Lw~^rWDe)}b4yc2BwU4PH0Jp6YB`#1bk|M75j z{XN6-ScmU{omXw1XZc9Jbu+Ks!E>pd+aZ*-DbAa7;JD1y{*7r{W2{MSyO`GrVE3Um z?+@~@?FH6foA(NNa=ggTi<=#8rx3JVLy?&pfSgPpD|E4q) z<+Wn5G)hq{Q#6+KxCv7xY~D4udGoEe8Lq=}MP2Eq&+>THQ(I;?wYF>cC*(s)Bk}rE z#!>d7tUx>c`cmrn-_q235v0E8UyPeDZQR6(<0kArZN{8A)4Jv!-_|m%t+l;nT61e> z%Z$0L^IP=moA|Z1&uE+1oH{h%k>=5W{|fZc)iirfTg#Y^wvNuBT_d*KasJE^J0cei zjBh#W8Cs^c95;7fC%x44qTF z*0$ZunO!Y&Yq_oiU(y)XP4u2IELUu@guX`Fm&2extLU?m$g#0l-+t%K9o;tP$fgM` zGwHq7{|1RZrlp-R)bt^VKDl+)kv1^ShSW>SccVn_$+x~3ihguUXM0PV?Hh`X;T`QQ zlUk2cQCp@MLESTdV>;UBceKrK*)B#kf96)@u<)%fw!pW^L9msemf6Erz z_liBPY4+@8^+RxJ-A=8+Zau z?$#$aHMcgkjq9XhA9jz>k@l2ogteG^({@Q?oRH`}W9(Dxlj%LwKj8 z64tpj(_@bxmFcxT-cTHkUgon$8H{oEFXoln>^U7>t#ezZw6yU+8ajV^?Lpzg0yBQ~ zMQ7>P?l4Q&!ix+PYfceTx&|GdilcV_WC9Hn&tyIQ{F2+S8E2GtNIUW0vU2R0{Tb!Nx;x@H|28r)k*gI!U$G2Z`e(F1AMrTV)`~T#4E%}hni`rs%P`1%>&Amf{7e2a{a&-mUMpP2C}89y-Nhh}^_yysk7 zUo^whGu7q2U>f&0F- z?ZRHR`r`VG-`I=S6*t2@AK3QpUN-KRjNhN}M>D>t7jGzj1@|-S9-ZaukUkoU=PT_1 zUd|m1*nVF`^N8vhK%d{k=gptk**dHC`Pp~upU|2)B#K`WbGR12BA#5suYsG&7$3AFjzlXwW<8Lfl!k=U2 zT+Z({Gfo$JcMesYg=p!%yfx#uXZ+5L-<|P$Gk$-@AI$he8Gj_>k7oSwj6a$2r!)R+ z#($pi=X!BgxQ_MZy?01UXGhF+Uo_{fy;`#s;OU$V%=k(fUnS$KWqkEsyslUa9{X@Z z@X^(N8VjBu>kmF|pPv1F0DMMit1Aux`=WEdP6P7=!fel|?#Tsk&(PW~0;l7+xEHT0 zE`!(F)fbodveg$?X8hia-=FaZGXA5CKiG@+DIS40H+3G}(%#ZMw%2z*^~H0&eCvzn zGyX!xUxd$W>Umzgl-Xa-_$wJ7!fl_<(?%KJG~=6Pd}PLV%=nm$kIne_jPI54eKS5O zWgzSets|BSlkEqoXDB5>~GI%KR<{*x25(ame0E<;WIksx9}B0bw+C_Ua8u8t{YzE z^!G~ZId?V|uc6KJxLO@NYrcJoH!|JBXU*1Feos5UYEveL!TaoAv`P2Rn;CyQZopUA1$oeKZyyhtKda9p$&F<=7fE*4hrQKIm3+Ro|`G+WXz|{BogU zR)?2y`=HMY-4E{Nm^eYJmtU#XzHnwMT(Uq07IsMi-Opr`XcFykv{e6@_Pk?}P%zIMjf&G>p5-yq`~ z_Tml2=J4*%=o9CZW7`^So)5xmKQcw-*tY4_w!YXd<0CV^Q!mbW1Kv?v6~44LCg%;b z`BQs7{5XgEqRp#549O?B=t8?dka37y5gd zzk5O+^W%Py_pj{oh_@2G*w0|R^%t)Sa%_VrYcLCrL%tLxy@IcazhlvF5dAxEUTUks z?br6k*6v*EtFCPcc0A69TAGV7YjOJ*dx29w{iF2w^)03@!LP^OP#l)o2eT?onHD+Z z@r~nrugna#Q#(%{(8V!NbHL7%y5l~E+HtGL*xd`q!qa(DJE`*R@vAQuB%1NANVtCH zGngIuU25mY9Mk;6elvRX7xtd^4aHs9-50g-)%N0J@Ie%>O&P0v5yi2}jrTIeE9{GF zwA?eVgPjZKC;ZgHdSyy)hQODUZ8SojaD@m+(jQSxF`@IfUX)y+4p z`Ip@MC&88UmmdUi+{4J!`RfO9OlgVO1F+rx)JEG4W39Z$SAv_5IqKs*dKg;7mtPI% zKjJr*`=F7@OJj%LAKh3{qR)+-?4lSQenYGF>W(e^Hihp#|AX#%*`jPWs=M7baOWmU zwA-%qTcO);d$?MZ@H@QpE4t&K4!^Ab*}Fzwx4`v@68dduu2GbT_b58+x=Z*y23Ly` zem|}Gb?5guTrG-z&htDUvRvMi_kh)$cb{GN!rh1J;r}q0|5%fTQhx;E+Np=nVzAxs zh^P0A=Ls)kzFuMXfp)p)2QTga05j}z&9%!tKd5Q{pu+As?Q+i(+N1wZ;ND~UH}G!L z7X8URZ>U9no+rG5dtL}`ex474+n?uyXs_M#ftURasBq*b_dMWbe7W!cl>5H-iu{Me zeOCq_0bd>-`T73$vcEmR&UN%B_x-P?eNV8tIv=)|dmd2Jz7N>Tb=NNUJm9r0YwTWN zh~;I>|DtHt*Jqw*N%u%_&yw<;vD@d~aQkbA+s6d3+Ad^hTe-g4_5<6uHsi=g62%-Q zgYTubjkYfs!S)n$bnGioyq2YGM|=0(auxP{T=iUA&TRF zm|}am?H%(^DE2Xt(F~)0w9?eQY;W7qjK?#@PbvB@q8P*Vd7PpiK2Lxh!y-!fJPB4m zi#WDE_5_6%6fJVJZ6(#&fTV|5%qqu5@5?Z$V$)g7~Ak1_uOY<@B3 zUxL*vUip}Rg_e)`*J$c7=I6lqn4d>ek1@Xhww-#6& zUVrVzcg*UJ+4YYx{}F6{+QqR4U5h~!ueB)dLDzZh3VRQ%Q(^Ccbt%RkOl@rMfj?99 zk$VsPg`%I__%Bh6H;HxD{z|32OueAeUIp7uTiiQ;1snTSO3cmQ!0KL(MIK{uZZ^@t zwH_tzr}ZoBxHd@iAr*Fv8&=pcZd76K#i13p?ZyO_h*8^wfi%{;M)C} zU~ujJOfb0i^%JgrgM@1znsI+d8141eEK7`VKmV$qUUEO}%pK8%hJvjPtugasJ2Jj%7+Qxpg zM?ZbQX+M48p6%7`$9=9A{VW5He%$l&=w|@fer#hu+T%U3EZDhp%;ux7@qI>U6MN6N z7SY!V@aW6?M;?8x2p)v5ZR|_CF?`Nwi}9@lPRF-0+|L{8`gKju=P`r=Ck=rnB_{F`v z8Qjln>gMJ%NG)<34vyS>9?2uOEy06`WgBzTZVaDm+Pq)Q%N)!lY;iA#%{ubi3T*q> zlUsvbQ|H^c&~6;xPukLRY9rbRir40pc*ku~;mxRrC;FCPbK8pA{s&NRLrndHZwuG& zis~G;9b6xEeTHG%9&FrbGZJo_I796KSF`vYrYf(9xg&xx^z)tXICcWtmp0$!@_3hP z-@X>2{9em(`aao)5_sDR_bcn#I7fobu`l(m#;>^XM!{{PT|OFayfdnNc7uCQs>fMn z4A^$s;#@KoY;0|DF4-Nd?&VnIF&5`jMo{Pc6*sKvhVUL8;I z8bxv6cxD=1VfV^z2_92nea2RJAocDE-Xp=|!0xj>soiJ#PN)CaXYSGFjL%B=>)4M< zxc*%UH{S6HcORdSaP22%{M3Z&e_F!zUyyLed3wUNpP6vmpPlgw60ZMc2{->M60ZHq zgd6Xgglk`zaNA#>aP2oH-1avoT>IS#xBWc{*M5J(wLhBiMHP?d@(j4^?Ot>(7o z`PpDK-<$UDzEX=A?O?}~#^`{n-(SU;16DJ}$HeFadwE{ab`0e>ihEvcF1{z`g1wLA zp6%zsM^nf1em-0u^%(!LV0BA+nY;IZcFzXpV1M=-V>t=z{kfPD^Kmko`nlD+=oIik zihAUA26!}W?BjH>T$|5{v%u3S+PnwkV)wtXM)Krvea-><8QJ^nG>Z3=V>h1d^pBY5 zg7q_w_pvu?xZ1qG<RqD5m=vzJawG=i@|CZFROURegmT2 zE3`{0O*x*cmqP4Ef9=uNv8OON{GVVB2_w_U%ej4(&UY=Gw-2^1EoZ*I&D_ z&2b^Mw#e}YaBc2u-~D|Lu4eJFGOlfXu4#|9H-Tf0e8$ORj=m3ej_l8N+Ku6}Q(MHi z1zek>+S>mBu4b{{bbf9{bAI9;x(#gZi}8y&ydAC{b8`pSm|mgXS!v2KUw1+D)n-4& zG2gqXwMD-7g46lB53Xk6zwVrEdk=#4X!}EO%-8*3dCb=XVCT#JY^U8AzALoF_#_&1(F!(5n&(EJwd-?oSe}tmu^Gs|T z&oPgIn<>VBlv*CPpMvdE+ahYYv+_?R+o(AK3j8{LgU5;%8Uwe*x>GZojUdTKK;Vb`08FOL;s?Uj>`zB#QpNkNyf) z51++geHK?a=<_!@B|bm@9c(*w`*Dw`MGmin?K}7z6_4)-{sGrVJ@WV`*f_!eRq^<4 z=ihLB)FY2K!N$^N9_~%G==W`~^Ar3Xuz5uu?}GJFkMaKpoR9xKH1){seXzMkZXba4 zQD0D<>plbXF;0;5@g_(A2}{^CkFvfu1nXngnlv8#mfC!u3&)JoDr?<*B`V-)UQpqUN(z z9Pw8Kr|}2EjlV8M+r`yAxiYx?b1Kx)b``Mm72hwd3RknZN4%F;1KUZsaGYG6t z`WzVySC60FtOvH8x^un(wU=|QZGDQGb1t?o^BV#-c06x41glvbzgOg~&9g(qv5p*v zg7a}~jHVv@ViT}he2&}<>}8JHhEax7%uyV%HwWjjw?I=jH{V%ub2FyxjT7y+1lvBH zzY%ctXfIFO8z-$o!&Cj@7gFR!!d~O5x9TRQ0h1s*ROv3%nWn98Ni|mzf6 z{aX_5S*)w#G3H(2<`{c>6kN^XB!d>6kOOxRGs7D|Bf%85lqpABGc27+K+g9CvT`x8J8HRl-*cdVY`-9aiF~0CU z04?=B5UytN(%<)(&#Z&cv>Pwl9}KRwuYKk|1g@s9XHDNx!0!3fZqDv0|BRgX&EeGU zVe5}*F^&4`6ff;fmEGEYS3;i-Hb(FnVAuLSa`j!<4Aw{8=bZcqim~lW9CJPsoX`0z zG<9=zzsqCHM}li(u6@pLg{xWe`8_K0JsPfN@k-~n4Nbf8qOaNDT3@yKZHKGryQKNm z9^>i&+jcSi7|;DW2d*Cc7_j48z`SYi1gq&6V^`DPJup|j;;zFyupJRuJ8n~KI)OziC|-Ei}T1yVDr&tu0Ds#aK>- z+r~4QV>=D3k9ypr3&6(F7I9Apr*Y4Kr*Y4O8`s>8dlpz9^@w{m*f`qs^S(YuOwkr| zb1vAqiF^M%uzu?L*zSC=&wz+?0a#66=S7=Z#Jmt}%s8K31YU!Us2)BSgZHAu{C@+i zrmr!zsp;=C=Mu2%9M7Cf!D^QLp12Gx^}QUfX7Nhzi7U{w8!!605?pIvyC<%KtLeL> zdqTUNH}PHE zx4>#?ai81v+vv8}$Mb$Gvww+%}Fy zo7_J?YX3KYSD-eIHgix*b7;fn)kKLLrdQY;W+b>d@o7o$%mmM>u;+{;6Wp5Mqbls# z<7kRwoJ}2LypWWsI# zbjF{}_|Fq=yyq$&d-f*y(dd5O_yO4KGyZh1y4?Hc`_$eGH&gRpaSQ+FJgUduxD7lV zn|s4Km51#PuxqHz`IU$5F0gB=&AFC`?H;getj&3sYjeNd2X@W1xd!sE{SfRP(B^u` z{TYw#9sp0KHb?iH`Pi@VjibMNS3k$-m?NJbgQr(Uzt= z_82&Fb?xONnSXO#1om8SU*>9D+v{hJ+Rf4Rh&-MEPp@)x@5saU6gYBpAIT$+XTXu8 zdrBU*pMfJs_m@0uzW{rWIoIwrdCc`M!Q-)+hxvO?+pqDBqrc1^)2q1d zS$RBbUI6<%Q#Yllj9nmN>+74~yWSAyq)?SDSC&jml1{GNF6T#)}Y z<8M}cG|%7HvHuos{KXW<;JNX4XzJcuf28*E{HXp1%AYCrD>jb({0VGsiz&wOJ@9{M z>dvuw$$f_y)Aq)R_J098p2bP~m(bLsy*zDioapOiuzke1UI9C<_}uNdUPV)PTz{kX za$M?*DX&w^OB{Lq9qhOwj^la_P2IelU%7c1)Aq)R_HTe4SK9s`XzI~kp0+nmjO(9Z z`-pM<3+%Y!v!CPoH=4TRdYjtIajCyW`47ds#F5uKV8<149M`*O>gMG>k(-w>ZEu`t z{~p+JrS0EGQ;+uYw7qd+Tpxh#BYv*+A=ou^yxP1s)Z*SSzY{24$5OmE+;_(%_;|2+ zo=6?{!>7dXeu#em3)e6HjKU{yHNW$4{yqnLIe*$dlh@VaiX+Y!VEYdKCEU1ie*X%t zkGk_=9%{~qeVC_l!)E`fO`nLp6n?gMPQ)=MJ}*wCc%4LXPJBk3oZwTy_H`PybK>)) zo*40rko&t(Qtt0U32r=p7fQRJ>snjc5KFQ&g5d}E5`0z86)DY0XClg`e}C` zsHgkj41By6P+}jP4tDL&q>lT+-$RqG)rJ+1`+9A-?b7GfI%w+Qvu@>+-ur{l)Wc`+ z5`5M}Q;+Ze*9ZIkqxt}{@*dv+?AdJy#hCiUXS5+;bJ53nb1Z7n=f+@jUrce%jkgJ! zdc+t8R`c(7#>Y7e8A$0&E_eQ}oq-IK^1*J?$~BuY>cs zYeG|x_|w70_nqe%Zw6Q&bXltRgQM^yY#_=AU1-7sFPU=Xwn#Fv5?!?a? zThX+8g?3b>=^M|7qtQIC=&#)|HdCv6hA}tuFrOInY_NHxd!ZdoJ;vMtPRBe4u8+E7 z?xOZ`%-T9B$5ZS}9AlmfPRBeCu4Zw(UNOG;XxdZl*h)*sd>oqJ59+VoG5d^Acg*Hy z9_AByoB&SqI1#R9@iKnoaT1z#uh34ev^0-X&^ATTUwh=Cp5|dbk;kcEbB%S9r|aZ; zh3{!#*HT}fk@8r>Gr(%;GwMvZy6t`6o(1;aiTCZ)gr%dfXz?a#nf^?pWEjpU_WEnMq7;GQt;^% z?Y8q>pcXN&07uNr!Sb+O1s+SW-Idhx=Az|egIdyg%Uoug3T+&dOKY0w#4TSuyMlYPPl&R z5$CSV=We($)ML)>0ju|?M7#UI_V1o@{Bp5l*WW$p8vGFKe$YpoKF)_@5<3^>C3YV4 zkIyDQ2K(7WfBm$(X6oshU51ZWx@MQaW6drFyJnYD$C^Dtj94?*=(&WuM$c#bg^a(L zaNEC>aNEC}@mDGy^Y;_DImQ|V!yhT!C&7MZnUwg!R z25g@Z?^(Eh>Jjf}V4wd{;{N+Ny8hZD-Y>vuykElgQxBhCRX+Z?D)+;$;l6MDb5Gh_ zcjw;mi=B7lh@Er&V?X=`?0(Q+KkfRtmfE7v--2E9nA_jM)zbUt_i%HMHh-vi%-pxfRe$}o>*v1H z7XAGdoQ`8L+_A@Jq`$${JX^#X{~aEmy{seG*UsDU zev5iJ>bI$lqdng5{pxuSVoT2#{n6CJXPL?;Jv$6QQxBhI!RDNv6P80$k2zi*Y;4fzG>&U0!+Q;(ebfQ@ZiZRVtAPVT?2c!H(-``e7sE8XAM!eg&rS7G<} zw4t2bXh7dd6MZP;W%DBHPIJNt`f>ZAA3QoDdD>&t2GCnrr{;uHEf3J-DyMj}@ zzbiQ9(=*ff4h=j5n_JAQvxu>NuXuLO7Ay#EJ*y*?`j7wU4~Co5C?*=rSQ zmZ(^jn*WN`_`e3~)u}y$uR(3>uTl4Zsn@3V=fUex`&?O<+UJV3&lT(C ztJ-z6-*{FI2D|RT*MqzE@$6h5u8+EVN^T5ujy4;Djp4K2eIXCqP_Xf|xku!2&e|C4 zImlgQIWvm^|Wd0rqTc8*Ro{Grn^iF}4J!b1(vKe}13h z`+qCA>otU;uXbap8_RWySlfWpSlhzWSlhvkHI$;Sc4Mg<%e9VJJAh+s-Y@d7?F5cF z@!pZgxOWEoGZ5QoGrpSf-9r&$SFrKpT{;Tx`9VE=MuY7qe0HmR)Lm2WQ`?EXN3};D zyMxU`A8iq153v1cH#fPtxv!(&J;5<{?{#_D_6En;z3=7G=LE28ZX0dJS2Mo%OT?H6 zj`%(+OpenQ* zTg}+s+Y#$va2op%xUm;hpCJ#0>!TiR4g=dJ?(4(hx3LE5;d2DoIN>u5uAh3W-Pgg! z*Jgfl^IMlX;>-ZY+)f9}M^?EtgU_Z9_3)nwj`?l@%fo*bSbuf**pbx65VulmH;!kn zqrpCNwfTIO$Jw+E?3vE?w$rYk&uwkdUpx2={L~$v-0=;fj(m>+o3D0pyjOkp-bC^G zF2#50KweMSfPo$rC9~tx1g!}$EBjaag{G5c_ z$N3eHxtj~W5&c%yshxU0Tx}l3ci3^%UVhK0?O2MMd5VqW_>TuKq;_t^+V#`!yXqvc zV-0>X+!a@aIBqrlefOOPb`GQc0=Pc$=O<4G>!WUa=SfX}^E(Ty7C&=3 z8?0vW^8WLkY+L70d$c_lybxQoJrAyC@k-k|-`Z{K-n;;OBeijzdwJ~53&Ebp?9X=E z^>a-cyg~lIwd1#p`B@ z&!sh~Z>g})r5{w-XU(k@_PKIfg?(n+PVs)eliKIfz4UP(C4DYEm~i`evf|F6_rYy& z99Nr{G(u;~DulTtD@A?mYoECvE2II;gqlUAw2i<`KEW6e+I1fFeUDlXTiqO7IXhIuzL9X9PC`DpP7GwrtY}hf4>CVPTl<67iz||?_Yu4 z7td6={2H!y7@PezG~Y?j!PR50ya4ucuV{Oo@>_~~K^*!125f)v_at8gyWUiVw#Y}_ zp8*-y7{-bizXKb?KilAVeh*gjJF0kQ`~mL$r!D&WBRKlf9=?C7e6>gaYH9!G5&i!k z*!>>-&+yuqYJW!LFL3)ALeW>d_l9~r2YhbaOYypk;&Z^gad(360Xz2lsJ+Lvze0?- z$GxZjp7DPr+~>!e3HKTDcEXMKZo)mwyq|FGA7`8?@9tm!`h?rx3K{p`J&Am^ubgrJ z-IK5z&wuwM<^H=TDfiz!32uJ=yC=bI@4tJJ@(mKM|AragJmI$Y-!_T%=Ig(0l5+oT zliz`mdC>otmTZLeSCr;o7) z;P(;u!^-B~kw-uO1-pl1Ei`8BY=pIw{xj67^>f&E?W+Pr_{ zVOt06?`_xSy(HJ>-W>#X%-X!KNob+|0qgjA>hA_-wFU z^u0dVJ)+I~R35e=VEwgu&&ngOjlk{!ZQj3f&+Fzj6ubtt@ocAEKl{<s)U9_@Ajr~7V4xSGW)_MOi(ZIScNU~@1RpKtQ` zyA!*BZ=$Vv`1}0r)Astsyz3M5vnx2}$N0|uC^YrRb9ChsXZhXWY8Ef^^nDqhEykeh sW1NUF7HmHgtH0y1J6ug)WVdzMH^;l~JoSn8QT4v{c6D{%zCHBMSw1hz`m*`_{gD;VS=k(zEL)IOa=&To z$kvtZ&iKk3*Q`=;M%JGT)hx`;%;UNIJ6Wwy2~Nk(!Y;*b!Dg`|*fHz_>|^W`>}#x_ zzd887C^nGI#lD5 zZ(@M`T>;;z?eEOAYTIg^>UgzN9T}@OoRV?#v+M9P6#I{$Xo;#tUTtp;CH8i`NuGgh zUUn0HGEH*#RHyZP-l4g<`8%l&Hyh1XG4DpSV?yTMR_(Ov`&T7(k>66vZ_l@~UCLLo z2g#3C+qJx8cb-bNyEHD<&3oGe-@8sIas%0@xsmGRbfZRha+R!(kN(p9xwZ-4oi}Mc zYqNPHEGF+|RbIpMH~YVLQpwL`{;oDu$M%i4n$vlmf&84#Ziqz{y?JhDJtxDRRwL;= z$N3rSa+T~$xQWJ-J8G?6wH7Z6$SMln*jyaJ3hzq2-%`%kr#f-oBIox(Zn#mO-dJyU zs#9Y%sukn>63xvt8r_^{!EejQJ^dCxv$Iv5YVU2fCW~I=d^#s-l>OO>g3dN^PW;Z6 zV)iEXdlLI>MjhYC@`6IspL6!B-fv}DH&@^xaMbfVv7UPCdH#LM_2iI*7Gb`FZ%TiiG9p_pNT{7-6oFuo|kgovmzeAT(9rl zXF=h*ob$=)LuXAn=L*hPu2^q>UQgX-n0UW2SK#I3eXJ22KLGjt>HCw5{!b7u!+cz? zcqm6%b`C0aLyWNx!R z3!d5GV!i8#JuA`QJ;XfS{x$*Rw9srL&aywdn)^X=Wz9|{+2EbA&WAv9YTUa=@fFOu zUF&0b_e1_7e&HX-o45D!6WB3Nq=Z`6E8dg1MeNd3#OkVv6RQ)CCT=l%K2B_nSl>j- zId+EFvutmU6?+HBT?pQfH|INXU5D}ZZQk*3q*&hZ;v7cUC3L<$NGQ64B#E>ec}KA;(dtE z?7`>u;K3feq6ho`qH?{BJ$OqGez1f+x4V0=|2K(x=9>wxqkq5EGqBThzPJw;CT=~e zb#3C%o=xn1)?}x^A&rbLU}>4}3ncnpe|Za{;j$`Mcnj;4j7&VcvT&ZfW8V zr*W5n9V_p=?ysEsW%$dmOR?$H$K{EOdRKtUeOw7vBOiTSMcmuR)o}9B$2G)`mA8*U zyqq;w<8Q#cA7d@<^^J*-{acf`qiJnx!QR30*7R)1*}M1Ut=KKtTj<5NC+;@1F`&$)Y~wzb>!{Mb1E16dN;9Lyx+~la+|Qw z+)M15Vh`^lRwr*w&$?Xbw-T3YZU@VG$A@MIak=ILV0H4=+=7=2{RnZn<}R?@LnY0_ z#O0cgfYr%c({E1Bnvdh3#P%fo6n+dF#dfiGjUhWXZHET;kw*`#PyZ97ZPXf82e)4`tfmoUm~`q zHG+GY*zxM+{QZ0dQ)@2PbdcD4=6L!RUL{s{5R3j_BX<9`^FHU{U&rJ$AA62(<4_(K z8sG6OST5!}N<4^pm-w6c7IqAK6H{|4{%uS?zSnmW7klt7*g8JJy+A}gPl-RlqL0sr<NFwdN+UYcb!KXX`i2dDPg;as2Pt*OD Ezr#zdz5oCK literal 4196 zcmZXWX?Ijb5QZ;FW{9Bds~`@b0tOKj5JlFoOC%UJaUnx8#E~QuXC^V=mS`f#Cb;Xb z@n`wPb9|nAyTc`RPEqx~Rb5@(U44hvmW^|hWKPn~-(N{K7AGw*Nishvruz8lp3~bJ z&HimWcWpOfLDHHA8nZB2lG<(jJ5;U?3!Xt1BPC=9QbER$abyyiLZ*>>$REg`NGpFW z=u;#uByIdX&R2kW3f!y?R?gI`1FjfE;UEX$p>!CF1b^)|76 zLh^N$oAv7W_7I)DC)Le=#|Q|7y8WNmI_OQ%rht^FrRVwu|tyYlp&DOg_xb z32VU@l3w_kH9~CK59y+hPt_du$k_kRw3zlyde(=_eb@WzwUIPWA?>BH!*K)FQAm4h z%scFC)(1nJy_Vkp3|CC8{i-RO(z9kP0$hTVHICBKKlEt(o!F;bv$NW@J8l zmpPq-)sZ9BMzcKJSD~8Lw8wF!wLL_So~xIK8`o;}p^UTtnU@uD@(6Lo^gY0x9M1B< zCdqN`-+o_*ScllY7CXfDZ{9E7pp&7$gw}7ZVtY~SYmPV{@7vYyTh#CU=jV&_@#6J} z!+7u6_*k#^D|YDj(8Y26$$(>hekbyN?@?SpPVldH;+UVQ8P4_O)G^MSa@ks~>D;)E z_mZzmoZpvs8p&jPeFSZvPuJ;_eBw)CndzXvrJ&$cJdFP8uh+GHQ zy=_L4Wa7Y9PQ`V$AaaT|yo`3Z7juX^BpCX)qs`|&^^5JdxQ6`e$OPh=;$4Wn7;D&% z&6ug-06AIy>J6@IDZ0dtot=yJc-2o-v!$<&@Y|}oY=daM)LV@2fP;l z57^F?TNmDSJac{4a2M@*cMx-m?*-19?T`D2!!vn+Hb)!c{2$Q{dFP9L=Z;vT@7x+A z_MMA&Q|PIHyQg?Zhp`VL^5(Q(-GazL=+sozHU>Y|SxGAGR^_`8>T~ede+5Yltw#-U$DSI*Hm5lvH-znc!-%o^tj#m7A-?HHp+85kjgyb{ ze}?VZoMDD@>WG};u;$pW4Qz85=|xyJf_4jgKR`z3H$%~_BC3TLc7`+GCu-JC`LmfA^TjORCj{vGkR Q_&#D?V&nehB=#Wx0Zeyu{{R30 diff --git a/crates/pathfinder/shaders/build/metal/tile_clip.fs.spv b/crates/pathfinder/shaders/build/metal/tile_clip.fs.spv index a13251c9eb7a43b3f2d3c99eeb79e2da782e19cb..f1169cdb2c6a9c1d8a554138d6309b789e6582c1 100644 GIT binary patch literal 968 zcmZ9K%}WAN6vbcKn5AiEX=)#1whN?1MGzGv zsW*Nmuq>;{>asOyiK&ThX;n7nONoxyWR4?-JpU%}9y|WT4?;~|+*>~w$VuU-9@v}C zCL<|Aj$ZS-(R;`DgJHzcdw%T=o`!)x)4i*1)ZdkHz|`Ki=npp&m|n>^m^gcrPv2xc zdV-0UwJEzc?bgQLE4pXIxw5MAc@r@2;Oc)?o|lC`k1#XC)inKzJbLOUPmHONivnn= z0cKB5T~id~(G@Mjw+wY)_Tx0vab2Do%()>?U-lt)Q=Xpi^Z@e~aKvlTogCs|-iG+0 zF#Mj36Jyt+kE>ICWBTwW9CrT}p9-m;2B1`Xx}W XB@5pytW6#CmwFX`7sP+0IFtPXk#8-7 literal 856 zcmZ9K+e-pL7{w=T&2saSrI}r{9tG*4B8UnS62gbTpl8vDu-e#4daVDtm!R{TouQ>! z4m0O`XTHnsW;1&W#>|<#o*k2{ipfYZreJb*?+=E9?(5s6dvLgqqiC|$h^M4`^V-4F z=;4{bqEHdmgtENE@r%`8iF&a-NarB~dUzy3ZEwJF^`OkN4^e^5{ar#gDsR3u^s-|F$ww=h>b4}-* zw3bj;J-t-RnXx6F%x|oI;y69>CL8K@$@$5jUY( zFKZ_kI(|4aq7h$pXYLS(Gc)myIQoXb^1Nx;=lPMo3w4;4#Z2E)0_~?#>9Hu#ADkXm z1nS?)#k;Bsc+l}suO`sLwH$crPDA(ja`)GzkpoYt+xQy-{nHn5pJ!8NW=X@xwxlyx b8lk=(`TY0q=uB?%;6KyE{(t*X#be({m4th>6(BLD%`2HQ8Tr}3 V95tW-8xU(wmSvg0`3}nqMga9D71sa& delta 204 zcmZqSJ;KY&%%sfDz`)4B0faUac}*GlCOYd1S}`y%SOYOL5HbO2uZ@-3jHawWo(_-) z0<1s?Qk9+)AC_8Fl3L;E0u*5b>jH{-<`tJD<|U_kx=cRFIA7Bps8b858f2C`0}EIu zH`o*iA7mGZ&$hXhDU*?#6|7hdBry3e^L$xrpcW+{4`d-D5X1N&ZH${|vb<&l07thQ Awg3PC diff --git a/crates/pathfinder/shaders/build/metal/tile_copy.fs.spv b/crates/pathfinder/shaders/build/metal/tile_copy.fs.spv index 15c34e072217d59fe3bd2b2bbbfa641b19f20327..f0ca4c00c46854322c516b5eced3c1a2ad4c7923 100644 GIT binary patch literal 1080 zcmZ9KT}xDP5Qj&%v#VLAnVMR9*41tV=^`VDf(Y6!gf159GPXP`!fq=^7otzl=kil| z6ZAai1rE+K%*=0o|9Lyxn(uWY=3;^0izsC^=0PHsqFvbj>EQJE>iX>X)yYd4%h4)` zavnt|?qSu*@Zy(=2j~{M0#BROQNjk0`j@h9_5n@;AG(VcWc|J5=@?WCA*T2>xU^KzzVICZ}svC^lHn7hii=RT^`aTmYNd#7EKhIBe@>>|2ONke-VygN3So791@2+#G_}eP>24cI^c30oZ zUBOycOs=u}i>(ts#-^xmkE(bLU-A7DtlYZZQ+)TRdmDQ%u`T{F+gN9{UQ_DWnmbiO zt}_{XQ)QcO-d^5bft24uo^e`XJ9ON~x5jI}xifkn#aV7a60GmMr~hSlct`B)4^eOS z1yp>w!o(Hl{XhlxUq`)}ck#Xa4OILu9OF&Y8shJnzhiSMN{-E@7<$^ c$`P-79N=5$8ysgoMCFOw!@G<9W7;?9e}9%dLI3~& literal 816 zcmYk3PfG$(6veM&qn4$arI`_0dudS-L~VkE5L(QlWmt|PXal1{^a=XNZGz74%?!*P zE^p4c=l*-I=v|b}3Rcl~YKb+>6Ju7jk~@c^U^G~*Cxff&OB6LLIw6|6m2FEWz8ud# z3GB)b<@?gXSL8)~p3Y|_`C{{WU(B{*>+tI_isFfW#gtr~+2ZXf9?x=oS#`}eVwd6j zW;zYyVE!E@Ilk)~B^iq-PI?`q58@9rLv?1ps=S_J>Yd3k;^1?K63j07IQ78nj~<-Y zgZpxo&%uaB`*$X3| zIGCL<;!T~rV3rSNN4Sn&;z%d`sF$}4ccpA8fR1|YR0KyqFn566=q1^U*)e+jit%-# zWmn#wS?`6JX;02RFJj?qDF=@+2U=ncIlKL+BKSa#9{xeys11jn`8slD%koe3kLFeR S^zO>hz?09t!2PM~t^6Mg0V{q0 diff --git a/crates/pathfinder/shaders/build/metal/tile_copy.vs.spv b/crates/pathfinder/shaders/build/metal/tile_copy.vs.spv index d8f76c7c86ed92ad1a0125bb6373e5d298e0c2bc..d48eab7232b802f6f398e05684257b0ecf0a4226 100644 GIT binary patch literal 1464 zcmYk6O;1x%5Qa}bMNtqD@B{Ids;Fpnp~l3hF`ASGixP-i(`Yp}DJ^Ml6XVK_Kfu4_ zuX1DJ^W59hcACkYdFP!uGjlFf%FS~jl)@6fC!vtFPzDKMIn;C8K0H2bjk7PUXV0I? zSP7M!C}%a0j#SapZaVOM3Ee>}{L0ur5Nj|NIW>^;#LkA}G)sqhUXAvl6ZpFz0&M=KQVysnZ*M?2WSCcSGiiE5_nYb!HKFt{hJX z+4MRxikR~dd*4sbKBVKUJNVq2#oUUqNxwgf*^j$WoFlsta)N`_1(AFKE8F=QAPe$ ztTFSw`x@3>-KD)<$0n#^zWxo=ySMRgV&#kNaB}ythB4K9ZeiVzar@FQ{x0QL!)<)? zyw{l$teCkCY_W?XSATbgRr9wrF5e#QXAf1Pe?RwrzO~+C&i3McFZd?R^>+2d658QrXWmEU8rwtN&2MTLdxUzA9D8wBE!4NN N7kky0_m8SC(f?_+TIB!$ literal 1276 zcmYk5T~AX%5QdkQ78K<}U~1r?=+c%jC`s4P&JZ%u zKGb8OH4EWVTu<|T+A9WvtN2ZP7jNTrJ~iTdHZ;OCpNrZCj0$JNaWN@|aesrpYV?ka ze%`%ESi1y&E`L;f&skf$PW;;c)Xhg9^U);#281nn*XEK+Gt9(#&mQ?=FsY>2QRX}= zxwrk|Y`+*!dV`akKJ_@0dY)sGcz!(U4aQ%FqtlXeUiOuTIM}DE8Rv&P7?e7&A#}I_ z=Tk!yJD1pVCA`I2dxw%UYI9}y$5}6DOm&`L&R6R2?Or)`?eTwK*Qt+rXK-%=7q=_i zBrc<(P76)7U9Yk-m*H#F^J9wGTn3&c%IPcM%aJe7YrVbXQvDUyX{HzC#om>idW%F& zJ@aDkPE+qX(ewBlv)>9a!?kvWS6QpK0bV0oFSl9UbJ8$p&l^PN^&agh_V+EPrsuzf zYwO?*q8gsT{kMsly!*xJ4cu@47Oo|{7158^?%!c;FEzyviBq_J)f4YlT*AJaHP4vI zyY(!ZI=^9jUu%6I|9{@+OR(=Tk9+4su>3;BnHOKfz4M=_h?j9|VrHixQ!>u*f!o8zkXqdZ?+sB$Wa67~YxbNiKcrLMZ Je^7mn{{{ADQSSf% diff --git a/crates/pathfinder/shaders/fill.vs.glsl b/crates/pathfinder/shaders/fill.vs.glsl index 7e41f4c74a..1db1005e79 100644 --- a/crates/pathfinder/shaders/fill.vs.glsl +++ b/crates/pathfinder/shaders/fill.vs.glsl @@ -24,10 +24,10 @@ layout(std140, set=0, binding=1) uniform uTileSize { }; in uvec2 aTessCoord; -in uint aFromPx; -in uint aToPx; in vec2 aFromSubpx; in vec2 aToSubpx; +in uint aFromPx; +in uint aToPx; in uint aTileIndex; out vec2 vFrom;