From 4f79822628186ff248867795d50bf1efe1e49f3d Mon Sep 17 00:00:00 2001 From: Patrick Walton Date: Thu, 18 Oct 2012 21:09:30 -0700 Subject: [PATCH] gfx: Take advantage of Apple extensions to DMA layers on the Mac. We have 60 FPS window resizing now. --- src/rust-layers | 2 +- src/rust-opengles | 2 +- src/servo/gfx/compositor.rs | 6 +++++- src/servo/gfx/png_compositor.rs | 3 ++- src/servo/gfx/render_layers.rs | 14 ++++++++++++-- src/servo/gfx/render_task.rs | 3 ++- src/servo/platform/osmain.rs | 19 +++++++++++-------- 7 files changed, 34 insertions(+), 15 deletions(-) diff --git a/src/rust-layers b/src/rust-layers index 8b179c74709..90a617d9139 160000 --- a/src/rust-layers +++ b/src/rust-layers @@ -1 +1 @@ -Subproject commit 8b179c7470984e5544ee3b8c47f654f7c897f88e +Subproject commit 90a617d9139b505b0fb03838a62a41887d658904 diff --git a/src/rust-opengles b/src/rust-opengles index 18beb006b71..bb99acf0c73 160000 --- a/src/rust-opengles +++ b/src/rust-opengles @@ -1 +1 @@ -Subproject commit 18beb006b719100421c24c634386df15f7fbf6bd +Subproject commit bb99acf0c7351b5e086fbd9e225d64fec3ea7e39 diff --git a/src/servo/gfx/compositor.rs b/src/servo/gfx/compositor.rs index 9d1be507303..c7ee21888a6 100644 --- a/src/servo/gfx/compositor.rs +++ b/src/servo/gfx/compositor.rs @@ -9,7 +9,11 @@ struct LayerBuffer { cairo_surface: ImageSurface, draw_target: DrawTarget, - size: Size2D + + size: Size2D, + + // NB: stride is in pixels, like OpenGL GL_UNPACK_ROW_LENGTH. + stride: uint } /** diff --git a/src/servo/gfx/png_compositor.rs b/src/servo/gfx/png_compositor.rs index c7a3d194889..19e85106a47 100644 --- a/src/servo/gfx/png_compositor.rs +++ b/src/servo/gfx/png_compositor.rs @@ -54,7 +54,8 @@ pub fn PngCompositor(output: Chan<~[u8]>) -> PngCompositor { let layer_buffer = LayerBuffer { cairo_surface: cairo_surface.clone(), draw_target: move draw_target, - size: Size2D(800u, 600u) + size: Size2D(800u, 600u), + stride: 800 }; let layer_buffer = Cell(move layer_buffer); diff --git a/src/servo/gfx/render_layers.rs b/src/servo/gfx/render_layers.rs index 6db1bd512db..9a80b30eb0b 100644 --- a/src/servo/gfx/render_layers.rs +++ b/src/servo/gfx/render_layers.rs @@ -22,14 +22,24 @@ pub fn render_layers(layer: &RenderLayer, let mut buffer = move buffer; if buffer.size != layer.size { // Create a new buffer. + + // Round the width up the nearest 32 pixels for DMA on the Mac. + let mut stride = layer.size.width; + if stride % 32 != 0 { + stride = (stride & !(32 - 1)) + 32; + } + assert stride % 32 == 0; + assert stride >= layer.size.width; + let cairo_surface = ImageSurface(CAIRO_FORMAT_RGB24, - layer.size.width as c_int, + stride as c_int, layer.size.height as c_int); let draw_target = DrawTarget(&cairo_surface); buffer = LayerBuffer { cairo_surface: move cairo_surface, draw_target: move draw_target, - size: copy layer.size + size: copy layer.size, + stride: stride }; } diff --git a/src/servo/gfx/render_task.rs b/src/servo/gfx/render_task.rs index f1f4e543fd0..3914f6ab449 100644 --- a/src/servo/gfx/render_task.rs +++ b/src/servo/gfx/render_task.rs @@ -84,7 +84,8 @@ impl Renderer { let layer_buffer = layer_buffer_cell.take(); let layer_buffer_channel = layer_buffer_channel_cell.take(); - let layer_buffer = for render_layers(&render_layer, move layer_buffer) |render_layer, layer_buffer| { + let layer_buffer = for render_layers(&render_layer, move layer_buffer) + |render_layer, layer_buffer| { let ctx = RenderContext { canvas: layer_buffer, font_cache: self.font_cache diff --git a/src/servo/platform/osmain.rs b/src/servo/platform/osmain.rs index c24258a6416..cff84b001ad 100644 --- a/src/servo/platform/osmain.rs +++ b/src/servo/platform/osmain.rs @@ -56,13 +56,13 @@ fn OSMain(dom_event_chan: pipes::SharedChan) -> OSMain { /// Cairo surface wrapping to work with layers struct CairoSurfaceImageData { - cairo_surface: ImageSurface + cairo_surface: ImageSurface, + size: Size2D } impl CairoSurfaceImageData : layers::layers::ImageData { - fn size() -> Size2D { - Size2D(self.cairo_surface.width() as uint, self.cairo_surface.height() as uint) - } + fn size() -> Size2D { self.size } + fn stride() -> uint { self.cairo_surface.width() as uint } fn format() -> layers::layers::Format { layers::layers::ARGB32Format } fn with_data(f: layers::layers::WithDataFn) { f(self.cairo_surface.data()) } } @@ -92,7 +92,7 @@ fn mainloop(mode: Mode, po: comm::Port, dom_event_chan: pipes::SharedChan, dom_event_chan: pipes::SharedChan) { let layer_buffer = LayerBuffer { cairo_surface: surfaces.front.layer_buffer.cairo_surface.clone(), draw_target: azure_hl::clone_mutable_draw_target(draw_target_ref), - size: copy surfaces.front.layer_buffer.size + size: copy surfaces.front.layer_buffer.size, + stride: surfaces.front.layer_buffer.stride }; #debug("osmain: lending surface %?", layer_buffer); receiver.send(move layer_buffer); @@ -256,7 +258,8 @@ fn Surface() -> Surface { let layer_buffer = LayerBuffer { cairo_surface: move cairo_surface, draw_target: move draw_target, - size: Size2D(800u, 600u) + size: Size2D(800u, 600u), + stride: 800 }; Surface { layer_buffer: move layer_buffer, have: true } }