Store the tile rect in only one place in the scene assembly thread

This commit is contained in:
Patrick Walton 2019-04-12 11:55:05 -07:00
parent 21563d9d7f
commit 06439f858f
2 changed files with 11 additions and 21 deletions

View File

@ -14,10 +14,10 @@ use crate::gpu_data::{AlphaTileBatchPrimitive, BuiltObject, FillBatchPrimitive};
use crate::gpu_data::{RenderCommand, SolidTileBatchPrimitive}; use crate::gpu_data::{RenderCommand, SolidTileBatchPrimitive};
use crate::scene::Scene; use crate::scene::Scene;
use crate::sorted_vector::SortedVector; use crate::sorted_vector::SortedVector;
use crate::tiles::{self, Tiler}; use crate::tiles::Tiler;
use crate::z_buffer::ZBuffer; use crate::z_buffer::ZBuffer;
use pathfinder_geometry::basic::point::{Point2DF32, Point2DI32, Point3DF32}; use pathfinder_geometry::basic::point::{Point2DF32, Point2DI32, Point3DF32};
use pathfinder_geometry::basic::rect::{RectF32, RectI32}; use pathfinder_geometry::basic::rect::RectF32;
use pathfinder_geometry::basic::transform2d::Transform2DF32; use pathfinder_geometry::basic::transform2d::Transform2DF32;
use pathfinder_geometry::basic::transform3d::Perspective; use pathfinder_geometry::basic::transform3d::Perspective;
use pathfinder_geometry::clip::PolygonClipper3D; use pathfinder_geometry::clip::PolygonClipper3D;
@ -52,16 +52,11 @@ struct SceneAssemblyThreadInfo {
next_object_index: u32, next_object_index: u32,
pub(crate) z_buffer: Arc<ZBuffer>, pub(crate) z_buffer: Arc<ZBuffer>,
tile_rect: RectI32,
current_pass: Pass, current_pass: Pass,
} }
enum MainToSceneAssemblyMsg { enum MainToSceneAssemblyMsg {
NewScene { NewScene { listener: Box<dyn RenderCommandListener>, z_buffer: Arc<ZBuffer> },
listener: Box<dyn RenderCommandListener>,
effective_view_box: RectF32,
z_buffer: Arc<ZBuffer>,
},
AddObject(IndexedBuiltObject), AddObject(IndexedBuiltObject),
SceneFinished, SceneFinished,
Exit, Exit,
@ -122,14 +117,13 @@ impl SceneAssemblyThread {
while let Ok(msg) = self.receiver.recv() { while let Ok(msg) = self.receiver.recv() {
match msg { match msg {
MainToSceneAssemblyMsg::Exit => break, MainToSceneAssemblyMsg::Exit => break,
MainToSceneAssemblyMsg::NewScene { listener, effective_view_box, z_buffer } => { MainToSceneAssemblyMsg::NewScene { listener, z_buffer } => {
self.info = Some(SceneAssemblyThreadInfo { self.info = Some(SceneAssemblyThreadInfo {
listener, listener,
built_object_queue: SortedVector::new(), built_object_queue: SortedVector::new(),
next_object_index: 0, next_object_index: 0,
z_buffer, z_buffer,
tile_rect: tiles::round_rect_out_to_tile_bounds(effective_view_box),
current_pass: Pass::new(), current_pass: Pass::new(),
}) })
} }
@ -217,8 +211,7 @@ impl SceneAssemblyThread {
let mut info = self.info.as_mut().unwrap(); let mut info = self.info.as_mut().unwrap();
info.current_pass.solid_tiles = info.current_pass.solid_tiles =
info.z_buffer.build_solid_tiles(info.tile_rect, info.z_buffer.build_solid_tiles(info.current_pass.object_range.clone());
info.current_pass.object_range.clone());
let have_solid_tiles = !info.current_pass.solid_tiles.is_empty(); let have_solid_tiles = !info.current_pass.solid_tiles.is_empty();
let have_alpha_tiles = !info.current_pass.alpha_tiles.is_empty(); let have_alpha_tiles = !info.current_pass.alpha_tiles.is_empty();
@ -271,7 +264,7 @@ impl<'a> SceneBuilder<'a> {
pub fn build_sequentially(&mut self, listener: Box<dyn RenderCommandListener>) { pub fn build_sequentially(&mut self, listener: Box<dyn RenderCommandListener>) {
let effective_view_box = self.scene.effective_view_box(self.built_options); let effective_view_box = self.scene.effective_view_box(self.built_options);
let z_buffer = Arc::new(ZBuffer::new(effective_view_box)); let z_buffer = Arc::new(ZBuffer::new(effective_view_box));
self.send_new_scene_message_to_assembly_thread(listener, effective_view_box, &z_buffer); self.send_new_scene_message_to_assembly_thread(listener, &z_buffer);
for object_index in 0..self.scene.objects.len() { for object_index in 0..self.scene.objects.len() {
build_object(object_index, build_object(object_index,
@ -288,7 +281,7 @@ impl<'a> SceneBuilder<'a> {
pub fn build_in_parallel(&mut self, listener: Box<dyn RenderCommandListener>) { pub fn build_in_parallel(&mut self, listener: Box<dyn RenderCommandListener>) {
let effective_view_box = self.scene.effective_view_box(self.built_options); let effective_view_box = self.scene.effective_view_box(self.built_options);
let z_buffer = Arc::new(ZBuffer::new(effective_view_box)); let z_buffer = Arc::new(ZBuffer::new(effective_view_box));
self.send_new_scene_message_to_assembly_thread(listener, effective_view_box, &z_buffer); self.send_new_scene_message_to_assembly_thread(listener, &z_buffer);
(0..self.scene.objects.len()).into_par_iter().for_each(|object_index| { (0..self.scene.objects.len()).into_par_iter().for_each(|object_index| {
build_object(object_index, build_object(object_index,
@ -304,11 +297,9 @@ impl<'a> SceneBuilder<'a> {
fn send_new_scene_message_to_assembly_thread(&mut self, fn send_new_scene_message_to_assembly_thread(&mut self,
listener: Box<dyn RenderCommandListener>, listener: Box<dyn RenderCommandListener>,
effective_view_box: RectF32,
z_buffer: &Arc<ZBuffer>) { z_buffer: &Arc<ZBuffer>) {
self.context.sender.send(MainToSceneAssemblyMsg::NewScene { self.context.sender.send(MainToSceneAssemblyMsg::NewScene {
listener, listener,
effective_view_box,
z_buffer: z_buffer.clone(), z_buffer: z_buffer.clone(),
}).unwrap(); }).unwrap();
} }

View File

@ -14,7 +14,7 @@ use crate::gpu_data::SolidTileBatchPrimitive;
use crate::tile_map::DenseTileMap; use crate::tile_map::DenseTileMap;
use crate::tiles; use crate::tiles;
use pathfinder_geometry::basic::point::Point2DI32; use pathfinder_geometry::basic::point::Point2DI32;
use pathfinder_geometry::basic::rect::{RectF32, RectI32}; use pathfinder_geometry::basic::rect::RectF32;
use std::ops::Range; use std::ops::Range;
use std::sync::atomic::{AtomicUsize, Ordering as AtomicOrdering}; use std::sync::atomic::{AtomicUsize, Ordering as AtomicOrdering};
@ -52,8 +52,7 @@ impl ZBuffer {
} }
} }
pub fn build_solid_tiles(&self, tile_rect: RectI32, object_range: Range<u32>) pub fn build_solid_tiles(&self, object_range: Range<u32>) -> Vec<SolidTileBatchPrimitive> {
-> Vec<SolidTileBatchPrimitive> {
let mut solid_tiles = vec![]; let mut solid_tiles = vec![];
for tile_index in 0..self.buffer.data.len() { for tile_index in 0..self.buffer.data.len() {
let depth = self.buffer.data[tile_index].load(AtomicOrdering::Relaxed); let depth = self.buffer.data[tile_index].load(AtomicOrdering::Relaxed);
@ -67,8 +66,8 @@ impl ZBuffer {
continue; continue;
} }
solid_tiles.push(SolidTileBatchPrimitive { solid_tiles.push(SolidTileBatchPrimitive {
tile_x: (tile_coords.x() + tile_rect.min_x()) as i16, tile_x: (tile_coords.x() + self.buffer.rect.min_x()) as i16,
tile_y: (tile_coords.y() + tile_rect.min_y()) as i16, tile_y: (tile_coords.y() + self.buffer.rect.min_y()) as i16,
object_index: object_index as u16, object_index: object_index as u16,
}); });
} }