37
37
mc::DefaultDisplayBufferCompositor::DefaultDisplayBufferCompositor(
38
38
mg::DisplayBuffer& display_buffer,
39
std::shared_ptr<mc::Scene> const& scene,
40
39
std::shared_ptr<mc::Renderer> const& renderer,
41
std::shared_ptr<mc::CompositorReport> const& report)
42
: display_buffer(display_buffer),
47
scene->register_compositor(this);
50
mc::DefaultDisplayBufferCompositor::~DefaultDisplayBufferCompositor()
52
scene->unregister_compositor(this);
55
void mc::DefaultDisplayBufferCompositor::composite()
40
std::shared_ptr<mc::CompositorReport> const& report) :
41
display_buffer{display_buffer},
47
void mc::DefaultDisplayBufferCompositor::composite(mc::SceneElementSequence&& scene_elements)
57
49
report->began_frame(this);
59
51
auto const& view_area = display_buffer.view_area();
60
auto scene_elements = scene->scene_elements_for(this);
61
52
auto const& occlusions = mc::filter_occlusions_from(scene_elements, view_area);
63
54
for (auto const& element : occlusions)
65
56
if (element->renderable()->visible())
66
element->occluded_in(this);
69
60
mg::RenderableList renderable_list;
70
61
for (auto const& element : scene_elements)
72
element->rendered_in(this);
73
64
renderable_list.push_back(element->renderable());
68
* Note: Buffer lifetimes are ensured by the two objects holding
69
* references to them; scene_elements and renderable_list.
70
* So no buffer is going to be released back to the client till
71
* both of those containers get destroyed (end of the function).
72
* Actually, there's a third reference held by the texture cache
73
* in GLRenderer, but that gets released earlier in render().
76
76
if (display_buffer.post_renderables_if_optimizable(renderable_list))
78
78
renderer->suspend();
85
85
renderer->set_rotation(display_buffer.orientation());
87
renderer->begin(); // TODO deprecatable now?
88
87
renderer->render(renderable_list);
89
88
display_buffer.post_update();
92
90
report->finished_frame(false, this);