42
42
return (renderable.alpha() < 1.0f - tolerance);
45
bool renderable_list_is_hwc_incompatible(mg::RenderableList const& list)
46
bool mga::HwcDevice::compatible_renderlist(RenderableList const& list)
50
51
for (auto const& renderable : list)
54
55
if (plane_alpha_is_translucent(*renderable) ||
55
56
(renderable->transformation() != identity))
64
mga::HwcDevice::HwcDevice(
65
std::shared_ptr<HwcWrapper> const& hwc_wrapper,
66
std::shared_ptr<LayerAdapter> const& layer_adapter) :
67
hwc_list{layer_adapter, {}},
64
mga::HwcDevice::HwcDevice(std::shared_ptr<HwcWrapper> const& hwc_wrapper) :
68
65
hwc_wrapper(hwc_wrapper)
82
79
return it != onscreen_overlay_buffers.end();
85
void mga::HwcDevice::post_gl(SwappingGLContext const& context)
87
hwc_list.update_list({});
89
//TODO: SwappingRenderer is temporary until we move the list up to DisplayBuffer
90
struct SwappingRenderer : RenderableListCompositor
92
void render(RenderableList const&, SwappingGLContext const& context) const
94
context.swap_buffers();
98
commit(context, null_renderer);
101
bool mga::HwcDevice::post_overlays(
102
SwappingGLContext const& context,
103
RenderableList const& renderables,
104
RenderableListCompositor const& list_compositor)
106
if (renderable_list_is_hwc_incompatible(renderables))
109
hwc_list.update_list(renderables);
111
bool needs_commit{false};
112
for (auto& layer : hwc_list)
113
needs_commit |= layer.needs_commit;
117
commit(context, list_compositor);
121
82
void mga::HwcDevice::commit(
84
mga::LayerList& hwc_list,
122
85
SwappingGLContext const& context,
123
86
RenderableListCompositor const& list_compositor)
129
92
if (hwc_list.needs_swapbuffers())
131
list_compositor.render(hwc_list.rejected_renderables(), context);
94
auto rejected_renderables = hwc_list.rejected_renderables();
95
if (rejected_renderables.empty())
96
context.swap_buffers();
98
list_compositor.render(std::move(rejected_renderables), context);
132
99
hwc_list.setup_fb(context.last_rendered_buffer());
133
100
hwc_list.swap_occurred();