Changes reflecting the latest version of rust-layers

The Tile trait has been removed and TileGrid now keeps Tile structs with
Textures embedded instead of simply buffers. rust-layers now creates
its own textures instead of relying on Servo to do it.
This commit is contained in:
Martin Robinson 2014-07-15 14:46:17 -07:00
parent 718ddde1f8
commit 4d6613c72e
4 changed files with 31 additions and 106 deletions

View file

@ -7,14 +7,12 @@ use events;
use pipeline::CompositionPipeline; use pipeline::CompositionPipeline;
use azure::azure_hl::Color; use azure::azure_hl::Color;
use geom::matrix::identity;
use geom::point::TypedPoint2D; use geom::point::TypedPoint2D;
use geom::rect::Rect; use geom::rect::Rect;
use geom::size::{Size2D, TypedSize2D}; use geom::size::{Size2D, TypedSize2D};
use gfx::render_task::{ReRenderRequest, ReRenderMsg, RenderChan, UnusedBufferMsg}; use gfx::render_task::{ReRenderRequest, ReRenderMsg, RenderChan, UnusedBufferMsg};
use layers::layers::{Layer, Flip, LayerBuffer, LayerBufferSet, NoFlip, TextureLayer, Tile}; use layers::layers::{Layer, LayerBufferSet};
use layers::platform::surface::{NativeCompositingGraphicsContext, NativeSurfaceMethods}; use layers::platform::surface::{NativeCompositingGraphicsContext, NativeSurfaceMethods};
use layers::texturegl::{Texture, TextureTarget};
use servo_msg::compositor_msg::{Epoch, FixedPosition, LayerId}; use servo_msg::compositor_msg::{Epoch, FixedPosition, LayerId};
use servo_msg::compositor_msg::ScrollPolicy; use servo_msg::compositor_msg::ScrollPolicy;
use servo_msg::constellation_msg::PipelineId; use servo_msg::constellation_msg::PipelineId;
@ -22,14 +20,6 @@ use servo_util::geometry::PagePx;
use std::collections::hashmap::HashMap; use std::collections::hashmap::HashMap;
use std::rc::Rc; use std::rc::Rc;
#[cfg(target_os="macos")]
#[cfg(target_os="android")]
use layers::layers::VerticalFlip;
#[cfg(not(target_os="macos"))]
use layers::texturegl::TextureTarget2D;
#[cfg(target_os="macos")]
use layers::texturegl::TextureTargetRectangle;
pub struct CompositorData { pub struct CompositorData {
/// This layer's pipeline. BufferRequests and mouse events will be sent through this. /// This layer's pipeline. BufferRequests and mouse events will be sent through this.
pub pipeline: CompositionPipeline, pub pipeline: CompositionPipeline,
@ -149,7 +139,7 @@ impl CompositorData {
} }
if redisplay { if redisplay {
CompositorData::build_layer_tree(layer.clone(), graphics_context); layer.create_textures(graphics_context);
} }
let get_child_buffer_request = |kid: &Rc<Layer<CompositorData>>| -> bool { let get_child_buffer_request = |kid: &Rc<Layer<CompositorData>>| -> bool {
@ -223,34 +213,6 @@ impl CompositorData {
size); size);
} }
// Returns whether the layer should be vertically flipped.
#[cfg(target_os="macos")]
fn texture_flip_and_target(cpu_painting: bool, size: Size2D<uint>) -> (Flip, TextureTarget) {
let flip = if cpu_painting {
NoFlip
} else {
VerticalFlip
};
(flip, TextureTargetRectangle(size))
}
#[cfg(target_os="android")]
fn texture_flip_and_target(cpu_painting: bool, size: Size2D<uint>) -> (Flip, TextureTarget) {
let flip = if cpu_painting {
NoFlip
} else {
VerticalFlip
};
(flip, TextureTarget2D)
}
#[cfg(target_os="linux")]
fn texture_flip_and_target(_: bool, _: Size2D<uint>) -> (Flip, TextureTarget) {
(NoFlip, TextureTarget2D)
}
fn find_child_with_pipeline_and_layer_id(layer: Rc<Layer<CompositorData>>, fn find_child_with_pipeline_and_layer_id(layer: Rc<Layer<CompositorData>>,
pipeline_id: PipelineId, pipeline_id: PipelineId,
layer_id: LayerId) layer_id: LayerId)
@ -285,46 +247,6 @@ impl CompositorData {
return None; return None;
} }
// Collect buffers from the layer. This method IS NOT recursive, so child layers
// are not rebuilt directly from this method.
pub fn build_layer_tree(layer: Rc<Layer<CompositorData>>,
graphics_context: &NativeCompositingGraphicsContext) {
// Clear all old textures.
layer.tiles.borrow_mut().clear();
// Add new tiles.
layer.do_for_all_tiles(|buffer: &Box<LayerBuffer>| {
debug!("osmain: compositing buffer rect {}", buffer.rect);
let size = Size2D(buffer.screen_pos.size.width as int,
buffer.screen_pos.size.height as int);
debug!("osmain: adding new texture layer");
// Determine, in a platform-specific way, whether we should flip the texture
// and which target to use.
let (flip, target) =
CompositorData::texture_flip_and_target(layer.extra_data.borrow().cpu_painting,
buffer.screen_pos.size);
// Make a new texture and bind the layer buffer's surface to it.
let texture = Texture::new(target);
debug!("COMPOSITOR binding to native surface {:d}",
buffer.native_surface.get_id() as int);
buffer.native_surface.bind_to_texture(graphics_context, &texture, size);
// Set the layer's transform.
let rect = buffer.rect;
let transform = identity().translate(rect.origin.x, rect.origin.y, 0.0);
let transform = transform.scale(rect.size.width, rect.size.height, 1.0);
// Make a texture layer and add it.
let texture_layer = Rc::new(TextureLayer::new(texture, buffer.screen_pos.size,
flip, transform));
layer.tiles.borrow_mut().push(texture_layer);
});
}
// Add LayerBuffers to the specified layer. Returns the layer buffer set back if the layer that // Add LayerBuffers to the specified layer. Returns the layer buffer set back if the layer that
// matches the given pipeline ID was not found; otherwise returns None and consumes the layer // matches the given pipeline ID was not found; otherwise returns None and consumes the layer
// buffer set. // buffer set.
@ -348,12 +270,12 @@ impl CompositorData {
{ {
for buffer in new_buffers.buffers.move_iter().rev() { for buffer in new_buffers.buffers.move_iter().rev() {
layer.add_tile_pixel(buffer); layer.add_buffer(buffer);
} }
let unused_tiles = layer.collect_unused_tiles(); let unused_buffers = layer.collect_unused_buffers();
if !unused_tiles.is_empty() { // send back unused buffers if !unused_buffers.is_empty() { // send back unused buffers
let msg = UnusedBufferMsg(unused_tiles); let msg = UnusedBufferMsg(unused_buffers);
let _ = layer.extra_data.borrow().pipeline.render_chan.send_opt(msg); let _ = layer.extra_data.borrow().pipeline.render_chan.send_opt(msg);
} }
@ -370,24 +292,24 @@ impl CompositorData {
} }
} }
CompositorData::build_layer_tree(layer.clone(), graphics_context); layer.create_textures(graphics_context);
return true; return true;
} }
/// Destroys all layer tiles, sending the buffers back to the renderer to be destroyed or /// Destroys all layer tiles, sending the buffers back to the renderer to be destroyed or
/// reused. /// reused.
fn clear(layer: Rc<Layer<CompositorData>>) { fn clear(layer: Rc<Layer<CompositorData>>) {
let mut tiles = layer.collect_tiles(); let mut buffers = layer.collect_buffers();
if !tiles.is_empty() { if !buffers.is_empty() {
// We have no way of knowing without a race whether the render task is even up and // We have no way of knowing without a race whether the render task is even up and
// running, but mark the tiles as not leaking. If the render task died, then the // running, but mark the buffers as not leaking. If the render task died, then the
// tiles are going to be cleaned up. // buffers are going to be cleaned up.
for tile in tiles.mut_iter() { for buffer in buffers.mut_iter() {
tile.mark_wont_leak() buffer.mark_wont_leak()
} }
let _ = layer.extra_data.borrow().pipeline.render_chan.send_opt(UnusedBufferMsg(tiles)); let _ = layer.extra_data.borrow().pipeline.render_chan.send_opt(UnusedBufferMsg(buffers));
} }
} }
@ -406,7 +328,7 @@ impl CompositorData {
/// ///
/// This is used during shutdown, when we know the render task is going away. /// This is used during shutdown, when we know the render task is going away.
pub fn forget_all_tiles(layer: Rc<Layer<CompositorData>>) { pub fn forget_all_tiles(layer: Rc<Layer<CompositorData>>) {
let tiles = layer.collect_tiles(); let tiles = layer.collect_buffers();
for tile in tiles.move_iter() { for tile in tiles.move_iter() {
let mut tile = tile; let mut tile = tile;
tile.mark_wont_leak() tile.mark_wont_leak()

View file

@ -5,7 +5,7 @@
use std::collections::hashmap::HashMap; use std::collections::hashmap::HashMap;
use geom::size::Size2D; use geom::size::Size2D;
use layers::platform::surface::NativePaintingGraphicsContext; use layers::platform::surface::NativePaintingGraphicsContext;
use layers::layers::Tile; use layers::layers::LayerBuffer;
use std::hash::Hash; use std::hash::Hash;
use std::hash::sip::SipState; use std::hash::sip::SipState;
use std::mem; use std::mem;
@ -13,9 +13,9 @@ use std::mem;
/// This is a struct used to store buffers when they are not in use. /// This is a struct used to store buffers when they are not in use.
/// The render task can quickly query for a particular size of buffer when it /// The render task can quickly query for a particular size of buffer when it
/// needs it. /// needs it.
pub struct BufferMap<T> { pub struct BufferMap {
/// A HashMap that stores the Buffers. /// A HashMap that stores the Buffers.
map: HashMap<BufferKey, BufferValue<T>>, map: HashMap<BufferKey, BufferValue>,
/// The current amount of memory stored by the BufferMap's buffers. /// The current amount of memory stored by the BufferMap's buffers.
mem: uint, mem: uint,
/// The maximum allowed memory. Unused buffers will be deleted /// The maximum allowed memory. Unused buffers will be deleted
@ -52,16 +52,16 @@ impl BufferKey {
} }
/// A helper struct to keep track of buffers in the HashMap /// A helper struct to keep track of buffers in the HashMap
struct BufferValue<T> { struct BufferValue {
/// An array of buffers, all the same size /// An array of buffers, all the same size
buffers: Vec<T>, buffers: Vec<Box<LayerBuffer>>,
/// The counter when this size was last requested /// The counter when this size was last requested
last_action: uint, last_action: uint,
} }
impl<T: Tile> BufferMap<T> { impl BufferMap {
// Creates a new BufferMap with a given buffer limit. // Creates a new BufferMap with a given buffer limit.
pub fn new(max_mem: uint) -> BufferMap<T> { pub fn new(max_mem: uint) -> BufferMap {
BufferMap { BufferMap {
map: HashMap::new(), map: HashMap::new(),
mem: 0u, mem: 0u,
@ -71,7 +71,7 @@ impl<T: Tile> BufferMap<T> {
} }
/// Insert a new buffer into the map. /// Insert a new buffer into the map.
pub fn insert(&mut self, graphics_context: &NativePaintingGraphicsContext, new_buffer: T) { pub fn insert(&mut self, graphics_context: &NativePaintingGraphicsContext, new_buffer: Box<LayerBuffer>) {
let new_key = BufferKey::get(new_buffer.get_size_2d()); let new_key = BufferKey::get(new_buffer.get_size_2d());
// If all our buffers are the same size and we're already at our // If all our buffers are the same size and we're already at our
@ -118,7 +118,7 @@ impl<T: Tile> BufferMap<T> {
} }
// Try to find a buffer for the given size. // Try to find a buffer for the given size.
pub fn find(&mut self, size: Size2D<uint>) -> Option<T> { pub fn find(&mut self, size: Size2D<uint>) -> Option<Box<LayerBuffer>> {
let mut flag = false; // True if key needs to be popped after retrieval. let mut flag = false; // True if key needs to be popped after retrieval.
let key = BufferKey::get(size); let key = BufferKey::get(size);
let ret = match self.map.find_mut(&key) { let ret = match self.map.find_mut(&key) {

View file

@ -120,7 +120,7 @@ pub struct RenderTask<C> {
epoch: Epoch, epoch: Epoch,
/// A data structure to store unused LayerBuffers /// A data structure to store unused LayerBuffers
buffer_map: BufferMap<Box<LayerBuffer>>, buffer_map: BufferMap,
} }
// If we implement this as a function, we get borrowck errors from borrowing // If we implement this as a function, we get borrowck errors from borrowing
@ -380,6 +380,7 @@ impl<C:RenderListener + Send> RenderTask<C> {
buffer.screen_pos = tile.screen_rect; buffer.screen_pos = tile.screen_rect;
buffer.resolution = scale; buffer.resolution = scale;
buffer.native_surface.mark_wont_leak(); buffer.native_surface.mark_wont_leak();
buffer.painted_with_cpu = true;
buffer buffer
} }
None => { None => {
@ -397,7 +398,8 @@ impl<C:RenderListener + Send> RenderTask<C> {
rect: tile.page_rect, rect: tile.page_rect,
screen_pos: tile.screen_rect, screen_pos: tile.screen_rect,
resolution: scale, resolution: scale,
stride: (width * 4) as uint stride: (width * 4) as uint,
painted_with_cpu: true,
} }
} }
}; };
@ -427,7 +429,8 @@ impl<C:RenderListener + Send> RenderTask<C> {
rect: tile.page_rect, rect: tile.page_rect,
screen_pos: tile.screen_rect, screen_pos: tile.screen_rect,
resolution: scale, resolution: scale,
stride: (width * 4) as uint stride: (width * 4) as uint,
painted_with_cpu: false,
} }
} }
}; };

@ -1 +1 @@
Subproject commit fc8332bdd278531e3c498813b366b147c96a8b37 Subproject commit eebf3aca21a022773053993c0be332c7641f5240