~hikiko/mir/mir.unity8-desktop-session

« back to all changes in this revision

Viewing changes to src/server/frontend/surface.cpp

  • Committer: Stephen M. Webb
  • Date: 2014-02-25 20:15:07 UTC
  • mfrom: (61.1.1 trusty-proposed)
  • Revision ID: stephen.webb@canonical.com-20140225201507-cicfzmdznvr059b2
mergedĀ fromĀ Ubuntu

Show diffs side-by-side

added added

removed removed

Lines of Context:
25
25
 
26
26
#include "client_buffer_tracker.h"
27
27
 
 
28
#include <condition_variable>
 
29
#include <mutex>
 
30
#include <thread>
 
31
 
28
32
namespace mg = mir::graphics;
29
33
namespace mf = mir::frontend;
30
34
 
39
43
    private:
40
44
        void swap_buffers(graphics::Buffer*& buffer)
41
45
        {
42
 
            surface->swap_buffers(buffer);
 
46
            surface->swap_buffers_blocking(buffer);
43
47
        }
44
48
        virtual mir::geometry::Size size() const { return surface->size(); }
45
49
        virtual MirPixelFormat pixel_format() const { return surface->pixel_format(); }
49
53
 
50
54
    return std::make_shared<ForwardingInternalSurface>(surface);
51
55
}
 
56
 
 
57
void mf::Surface::swap_buffers_blocking(graphics::Buffer*& buffer)
 
58
{
 
59
    std::mutex mutex;
 
60
    std::condition_variable cv;
 
61
    bool done = false;
 
62
 
 
63
    swap_buffers(buffer,
 
64
        [&](mg::Buffer* new_buffer)
 
65
        {
 
66
            std::unique_lock<decltype(mutex)> lock(mutex);
 
67
            buffer = new_buffer;
 
68
            done = true;
 
69
            cv.notify_one();
 
70
        });
 
71
 
 
72
    std::unique_lock<decltype(mutex)> lock(mutex);
 
73
 
 
74
    cv.wait(lock, [&]{ return done; });
 
75
}