From 76b13442743388323cba64111849c9867a44bd97 Mon Sep 17 00:00:00 2001 From: Patrick Walton Date: Fri, 9 Nov 2012 15:57:41 -0800 Subject: [PATCH] gfx: Supply our own buffers to accommodate the Mac DMA requirements --- src/rust-azure | 2 +- src/servo/gfx/render_layers.rs | 32 +++++++++++++++++++++++++++++++- 2 files changed, 32 insertions(+), 2 deletions(-) diff --git a/src/rust-azure b/src/rust-azure index 8402852b2e9..385867116d0 160000 --- a/src/rust-azure +++ b/src/rust-azure @@ -1 +1 @@ -Subproject commit 8402852b2e9efcd041607db03a6a663e58c05370 +Subproject commit 385867116d04f5d4aa34976bf9794bcb1913f162 diff --git a/src/servo/gfx/render_layers.rs b/src/servo/gfx/render_layers.rs index 6826308ff13..9adfef22508 100644 --- a/src/servo/gfx/render_layers.rs +++ b/src/servo/gfx/render_layers.rs @@ -63,9 +63,39 @@ pub fn render_layers(layer: &RenderLayer, } else { // Create a new buffer. debug!("creating tile, (%u, %u)", x, y); + let size = Size2D(stride as i32, height as i32); + + let mut data: ~[u8] = ~[0]; + let offset; + unsafe { + // FIXME: Evil black magic to ensure that we don't perform a slow memzero + // of this buffer. This should be made safe. + + let align = 256; + + let len = ((size.width * size.height * 4) as uint) + align; + vec::reserve(&mut data, len); + vec::raw::set_len(&mut data, len); + + // Round up to the nearest 32-byte-aligned address for DMA on the Mac. + let addr: uint = cast::transmute(ptr::to_unsafe_ptr(&data[0])); + if addr % align == 0 { + offset = 0; + } else { + offset = align - addr % align; + } + + debug!("tile offset is %u, expected addr is %x", offset, addr + offset); + } + buffer = LayerBuffer { - draw_target: DrawTarget::new(opts.render_backend, size, B8G8R8A8), + draw_target: DrawTarget::new_with_data(opts.render_backend, + move data, + offset, + size, + size.width * 4, + B8G8R8A8), rect: tile_rect, stride: stride };