gfx: Send a RenderLayer instead of a display list from layout to GFX.

This is a step on the way to window resizing.
This commit is contained in:
Patrick Walton 2012-10-11 18:03:52 -07:00
parent 5752ae6783
commit 0e9c278196
4 changed files with 16 additions and 12 deletions

View file

@ -5,9 +5,9 @@ use js::jsapi::{JSContext, jsval, JSObject, JSBool, jsid, JSClass, JSFreeOp, JSP
use js::jsapi::bindgen::{JS_ValueToString, JS_GetStringCharsZAndLength, JS_ReportError, use js::jsapi::bindgen::{JS_ValueToString, JS_GetStringCharsZAndLength, JS_ReportError,
JS_GetReservedSlot, JS_SetReservedSlot, JS_NewStringCopyN, JS_GetReservedSlot, JS_SetReservedSlot, JS_NewStringCopyN,
JS_DefineFunctions, JS_DefineProperty, JS_GetContextPrivate}; JS_DefineFunctions, JS_DefineProperty, JS_GetContextPrivate};
use js::jsval::{INT_TO_JSVAL, JSVAL_TO_PRIVATE};
use js::jsapi::bindgen::*; use js::jsapi::bindgen::*;
use js::glue::bindgen::*; use js::glue::bindgen::*;
use js::jsval::{INT_TO_JSVAL, JSVAL_TO_PRIVATE};
use dom::node::{Node, NodeScope, Text, Doctype, Comment, Element}; use dom::node::{Node, NodeScope, Text, Doctype, Comment, Element};
use utils::{rust_box, squirrel_away_unique, get_compartment, domstring_to_jsval, str}; use utils::{rust_box, squirrel_away_unique, get_compartment, domstring_to_jsval, str};

View file

@ -29,6 +29,7 @@ use std::cell::Cell;
use core::io::BytesWriter; use core::io::BytesWriter;
use gfx::render_task::LayerBuffer; use gfx::render_task::LayerBuffer;
use geom::size::Size2D; use geom::size::Size2D;
use gfx::render_layers::RenderLayer;
pub type PngCompositor = Chan<Msg>; pub type PngCompositor = Chan<Msg>;
@ -92,6 +93,7 @@ fn sanity_check() {
let renderer = RenderTask(compositor); let renderer = RenderTask(compositor);
let dlist : DisplayList = DVec(); let dlist : DisplayList = DVec();
let render_layer = RenderLayer { display_list: move dlist, size: Size2D(800u, 600u) };
renderer.send(RenderMsg(dlist)); renderer.send(RenderMsg(dlist));
let (exit_chan, exit_response_from_engine) = pipes::stream(); let (exit_chan, exit_response_from_engine) = pipes::stream();
renderer.send(render_task::ExitMsg(exit_chan)); renderer.send(render_task::ExitMsg(exit_chan));

View file

@ -30,7 +30,7 @@ use text::font_cache::FontCache;
pub type Renderer = comm::Chan<Msg>; pub type Renderer = comm::Chan<Msg>;
pub enum Msg { pub enum Msg {
RenderMsg(dl::DisplayList), RenderMsg(RenderLayer),
ExitMsg(pipes::Chan<()>) ExitMsg(pipes::Chan<()>)
} }
@ -60,7 +60,7 @@ pub fn RenderTask<C: Compositor Send>(compositor: C) -> RenderTask {
loop { loop {
match po.recv() { match po.recv() {
RenderMsg(move display_list) => { RenderMsg(move render_layer) => {
#debug("renderer: got render request"); #debug("renderer: got render request");
let layer_buffer_cell = Cell(layer_buffer_port.recv()); let layer_buffer_cell = Cell(layer_buffer_port.recv());
@ -68,18 +68,13 @@ pub fn RenderTask<C: Compositor Send>(compositor: C) -> RenderTask {
let layer_buffer_channel = Cell(move layer_buffer_channel); let layer_buffer_channel = Cell(move layer_buffer_channel);
layer_buffer_port = new_layer_buffer_port; layer_buffer_port = new_layer_buffer_port;
let display_list = Cell(move display_list); let render_layer = Cell(move render_layer);
#debug("renderer: rendering"); #debug("renderer: rendering");
do util::time::time(~"rendering") { do util::time::time(~"rendering") {
let layer_buffer = layer_buffer_cell.take(); let layer_buffer = layer_buffer_cell.take();
let display_list = move display_list.take(); let render_layer = move render_layer.take();
let render_layer = RenderLayer {
display_list: move display_list,
size: Size2D(800u, 600u)
};
let layer_buffer = let layer_buffer =
for render_layers::render_layers(&render_layer, move layer_buffer) for render_layers::render_layers(&render_layer, move layer_buffer)

View file

@ -16,6 +16,7 @@ use geom::point::Point2D;
use geom::rect::Rect; use geom::rect::Rect;
use geom::size::Size2D; use geom::size::Size2D;
use gfx::render_task; use gfx::render_task;
use gfx::render_layers::RenderLayer;
use layout::box::RenderBox; use layout::box::RenderBox;
use layout::box_builder::LayoutTreeBuilder; use layout::box_builder::LayoutTreeBuilder;
use layout::context::LayoutContext; use layout::context::LayoutContext;
@ -166,10 +167,16 @@ impl Layout {
let builder = dl::DisplayListBuilder { let builder = dl::DisplayListBuilder {
ctx: &layout_ctx, ctx: &layout_ctx,
}; };
let render_layer = RenderLayer {
display_list: move dlist,
size: Size2D(800u, 600u)
};
// TODO: set options on the builder before building // TODO: set options on the builder before building
// TODO: be smarter about what needs painting // TODO: be smarter about what needs painting
layout_root.build_display_list(&builder, &copy layout_root.d().position, &dlist); layout_root.build_display_list(&builder, &copy layout_root.d().position,
self.render_task.send(render_task::RenderMsg(dlist)); &render_layer.display_list);
self.render_task.send(render_task::RenderMsg(move render_layer));
} // time(layout) } // time(layout)
} // BuildMsg } // BuildMsg
} // match } // match