~ubuntu-branches/ubuntu/vivid/mir/vivid

« back to all changes in this revision

Viewing changes to src/server/compositor/default_display_buffer_compositor.cpp

  • Committer: Package Import Robot
  • Author(s): Ubuntu daily release
  • Date: 2014-11-20 16:41:15 UTC
  • mto: This revision was merged to the branch mainline in revision 86.
  • Revision ID: package-import@ubuntu.com-20141120164115-a3j4vq6cq2u78m47
Tags: upstream-0.9.0+15.04.20141120.1
ImportĀ upstreamĀ versionĀ 0.9.0+15.04.20141120.1

Show diffs side-by-side

added added

removed removed

Lines of Context:
36
36
 
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),
43
 
      scene{scene},
44
 
      renderer{renderer},
45
 
      report{report}
46
 
{
47
 
    scene->register_compositor(this);
48
 
}
49
 
 
50
 
mc::DefaultDisplayBufferCompositor::~DefaultDisplayBufferCompositor()
51
 
{
52
 
    scene->unregister_compositor(this);
53
 
}
54
 
 
55
 
void mc::DefaultDisplayBufferCompositor::composite()
 
40
    std::shared_ptr<mc::CompositorReport> const& report) :
 
41
    display_buffer{display_buffer},
 
42
    renderer{renderer},
 
43
    report{report}
 
44
{
 
45
}
 
46
 
 
47
void mc::DefaultDisplayBufferCompositor::composite(mc::SceneElementSequence&& scene_elements)
56
48
{
57
49
    report->began_frame(this);
58
50
 
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);
62
53
 
63
54
    for (auto const& element : occlusions)
64
55
    {
65
56
        if (element->renderable()->visible())
66
 
            element->occluded_in(this);
 
57
            element->occluded();
67
58
    }
68
59
 
69
60
    mg::RenderableList renderable_list;
70
61
    for (auto const& element : scene_elements)
71
62
    {
72
 
        element->rendered_in(this);
 
63
        element->rendered();
73
64
        renderable_list.push_back(element->renderable());
74
65
    }
75
66
 
 
67
    /*
 
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().
 
74
     */
 
75
 
76
76
    if (display_buffer.post_renderables_if_optimizable(renderable_list))
77
77
    {
78
78
        renderer->suspend();
84
84
 
85
85
        renderer->set_rotation(display_buffer.orientation());
86
86
 
87
 
        renderer->begin();  // TODO deprecatable now?
88
87
        renderer->render(renderable_list);
89
88
        display_buffer.post_update();
90
 
        renderer->end();
91
89
 
92
90
        report->finished_frame(false, this);
93
91
    }