~vanvugt/mir/frontend-server

« back to all changes in this revision

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

  • Committer: Daniel van Vugt
  • Date: 2014-03-06 03:18:55 UTC
  • mfrom: (1416.1.37 development-branch)
  • Revision ID: daniel.van.vugt@canonical.com-20140306031855-pjar7q2m3ghjwly5
MergeĀ latestĀ development-branch.

Show diffs side-by-side

added added

removed removed

Lines of Context:
80
80
}
81
81
 
82
82
 
83
 
void mc::DefaultDisplayBufferCompositor::composite()
 
83
bool mc::DefaultDisplayBufferCompositor::composite()
84
84
{
85
85
    report->began_frame(this);
86
86
 
104
104
        return !env || env[0] != '0';
105
105
    }()};
106
106
    bool bypassed = false;
 
107
    bool uncomposited_buffers{false};
107
108
 
108
109
    if (bypass_env && display_buffer.can_bypass())
109
110
    {
 
111
        // It would be *really* nice not to lock the scene for a composite pass.
 
112
        // (C.f. lp:1234018)
 
113
        // A compositor shouldn't know anything about navigating the scene,
 
114
        // it should be passed a collection of objects to render. (And any
 
115
        // locks managed by the scene - which can just lock what is needed.)
110
116
        std::unique_lock<Scene> lock(*scene);
111
117
 
112
118
        mc::BypassFilter filter(display_buffer);
122
128
 
123
129
            if (bypass_buf->can_bypass())
124
130
            {
 
131
                uncomposited_buffers = match.topmost_fullscreen()->buffers_ready_for_compositor() > 1;
 
132
 
125
133
                lock.unlock();
126
134
                display_buffer.post_update(bypass_buf);
127
135
                bypassed = true;
149
157
 
150
158
        renderer->set_rotation(display_buffer.orientation());
151
159
        renderer->begin();
152
 
        mc::RenderingOperator applicator(*renderer, save_resource, local_frameno);
 
160
        mc::RenderingOperator applicator(*renderer, save_resource, local_frameno, uncomposited_buffers);
153
161
        FilterForVisibleSceneInRegion selector(view_area, occlusion_match);
154
162
        scene->for_each_if(selector, applicator);
155
163
        renderer->end();
156
164
 
157
165
        display_buffer.post_update();
 
166
 
 
167
        // This is a frig to avoid lp:1286190
 
168
        if (size_of_last_pass)
 
169
        {
 
170
            uncomposited_buffers |= saved_resources.empty();
 
171
        }
 
172
 
 
173
        size_of_last_pass = saved_resources.size();
 
174
        // End of frig
158
175
    }
159
176
 
160
177
    report->finished_frame(bypassed, this);
 
178
    return uncomposited_buffers;
161
179
}
162
180