~mir-team/mir/in-process-egl+input-conglomeration

« back to all changes in this revision

Viewing changes to src/server/graphics/android/server_render_window.cpp

Merged trunk and fixed issues

Show diffs side-by-side

added added

removed removed

Lines of Context:
21
21
#include "server_render_window.h"
22
22
#include "display_support_provider.h"
23
23
#include "fb_swapper.h"
24
 
#include "android_buffer.h"
 
24
#include "buffer.h"
25
25
#include "android_format_conversion-inl.h"
 
26
#include "interpreter_resource_cache.h"
26
27
 
27
28
#include <boost/throw_exception.hpp>
28
29
#include <stdexcept>
29
30
 
30
 
 
31
31
#include <thread>
32
32
#include <chrono>
33
33
namespace mc=mir::compositor;
35
35
namespace geom=mir::geometry;
36
36
 
37
37
mga::ServerRenderWindow::ServerRenderWindow(std::shared_ptr<mga::FBSwapper> const& swapper,
38
 
                                            std::shared_ptr<mga::DisplaySupportProvider> const& display_poster)
 
38
                                            std::shared_ptr<mga::DisplaySupportProvider> const& display_poster,
 
39
                                            std::shared_ptr<InterpreterResourceCache> const& cache)
39
40
    : swapper(swapper),
40
41
      poster(display_poster),
 
42
      resource_cache(cache),
41
43
      format(mga::to_android_format(poster->display_format()))
42
44
{
43
45
}
46
48
{
47
49
    auto buffer = swapper->compositor_acquire();
48
50
    auto handle = buffer->native_buffer_handle().get();
49
 
    buffers_in_driver[handle] = buffer;
50
 
 
 
51
    resource_cache->store_buffer(buffer, handle);
51
52
    return handle;
52
53
}
53
54
 
54
55
//sync object could be passed to hwc. we don't need to that yet though
55
56
void mga::ServerRenderWindow::driver_returns_buffer(ANativeWindowBuffer* returned_handle, std::shared_ptr<SyncObject> const&)
56
57
{
57
 
    auto buffer_it = buffers_in_driver.find(returned_handle); 
58
 
    if (buffer_it == buffers_in_driver.end())
59
 
    {
60
 
        BOOST_THROW_EXCEPTION(std::runtime_error("driver is returning buffers it never was given!"));
61
 
    }
62
 
 
63
 
    auto buffer = buffer_it->second;
64
 
    buffers_in_driver.erase(buffer_it);
 
58
    auto buffer = resource_cache->retrieve_buffer(returned_handle); 
65
59
    poster->set_next_frontbuffer(buffer);
66
60
    swapper->compositor_release(buffer);
67
61
}