22
22
#include "mir/graphics/android/native_buffer.h"
23
23
#include "hwc_layerlist.h"
25
#include <boost/throw_exception.hpp>
27
29
namespace mg=mir::graphics;
28
30
namespace mga=mir::graphics::android;
29
31
namespace geom=mir::geometry;
31
mga::HWCLayer& mga::HWCLayer::operator=(HWCLayer const& layer)
33
mga::HWCLayer& mga::HWCLayer::operator=(HWCLayer && other)
33
memcpy(static_cast<void*>(this),
34
static_cast<void const*>(&layer),
36
this->visibleRegionScreen = {1, &this->visible_rect};
35
hwc_layer = other.hwc_layer;
36
hwc_list = std::move(other.hwc_list);
37
visible_rect = std::move(other.visible_rect);
40
mga::HWCLayer::HWCLayer(HWCLayer const& layer)
42
memcpy(static_cast<void*>(this),
43
static_cast<void const*>(&layer),
45
this->visibleRegionScreen = {1, &this->visible_rect};
41
mga::HWCLayer::HWCLayer(HWCLayer && other)
42
: hwc_layer(std::move(other.hwc_layer)),
43
hwc_list(std::move(other.hwc_list)),
44
visible_rect(std::move(other.visible_rect))
48
mga::HWCLayer::HWCLayer(std::shared_ptr<hwc_display_contents_1_t> list, size_t layer_index)
49
: hwc_layer(&list->hwLayers[layer_index]),
52
memset(hwc_layer, 0, sizeof(hwc_layer_1_t));
53
memset(&visible_rect, 0, sizeof(hwc_rect_t));
56
hwc_layer->transform = 0;
57
hwc_layer->acquireFenceFd = -1;
58
hwc_layer->releaseFenceFd = -1;
59
hwc_layer->blending = HWC_BLENDING_NONE;
61
hwc_layer->visibleRegionScreen.numRects=1;
62
hwc_layer->visibleRegionScreen.rects= &visible_rect;
48
65
mga::HWCLayer::HWCLayer(
50
buffer_handle_t buffer_handle,
51
geom::Rectangle position,
52
geom::Size buffer_size,
53
bool skip, bool alpha)
55
(skip) ? flags = HWC_SKIP_LAYER : flags = 0;
56
(alpha) ? blending = HWC_BLENDING_COVERAGE : blending = HWC_BLENDING_NONE;
57
compositionType = type;
60
//TODO: acquireFenceFd should be buffer.fence()
67
geometry::Rectangle position,
69
std::shared_ptr<hwc_display_contents_1_t> list,
71
: HWCLayer(list, layer_index)
74
set_render_parameters(position, alpha_enabled);
77
bool mga::HWCLayer::needs_gl_render() const
79
return ((hwc_layer->compositionType == HWC_FRAMEBUFFER) || (hwc_layer->flags == HWC_SKIP_LAYER));
82
mga::NativeFence mga::HWCLayer::release_fence() const
84
return hwc_layer->releaseFenceFd;
87
void mga::HWCLayer::set_layer_type(LayerType type)
67
buffer_size.width.as_int(),
68
buffer_size.height.as_int()
92
case mga::LayerType::skip:
93
hwc_layer->compositionType = HWC_FRAMEBUFFER;
94
hwc_layer->flags = HWC_SKIP_LAYER;
97
case mga::LayerType::gl_rendered:
98
hwc_layer->compositionType = HWC_FRAMEBUFFER;
101
case mga::LayerType::framebuffer_target:
102
hwc_layer->compositionType = HWC_FRAMEBUFFER_TARGET;
105
case mga::LayerType::overlay: //driver is the only one who can set to overlay
107
BOOST_THROW_EXCEPTION(std::logic_error("invalid layer type"));
111
void mga::HWCLayer::set_render_parameters(geometry::Rectangle position, bool alpha_enabled)
114
hwc_layer->blending = HWC_BLENDING_COVERAGE;
116
hwc_layer->blending = HWC_BLENDING_NONE;
72
118
/* note, if the sourceCrop and DisplayFrame sizes differ, the output will be linearly scaled */
119
hwc_layer->displayFrame =
75
121
position.top_left.x.as_int(),
76
122
position.top_left.y.as_int(),
78
124
position.size.height.as_int()
81
visible_rect = displayFrame;
82
visibleRegionScreen.numRects=1;
83
visibleRegionScreen.rects= &visible_rect;
85
handle = buffer_handle;
86
memset(&reserved, 0, sizeof(reserved));
89
bool mga::HWCLayer::needs_gl_render() const
91
return ((compositionType == HWC_FRAMEBUFFER) || (flags == HWC_SKIP_LAYER));
94
mga::FramebufferLayer::FramebufferLayer()
95
: HWCLayer(HWC_FRAMEBUFFER_TARGET,
97
geom::Rectangle{{0,0}, {0,0}},
104
mga::FramebufferLayer::FramebufferLayer(mg::NativeBuffer const& buffer)
105
: HWCLayer(HWC_FRAMEBUFFER_TARGET,
107
geom::Rectangle{{0,0}, {buffer.anwb()->width, buffer.anwb()->height}},
108
geom::Size{buffer.anwb()->width, buffer.anwb()->height},
114
mga::ForceGLLayer::ForceGLLayer()
115
: HWCLayer(HWC_FRAMEBUFFER,
117
geom::Rectangle{{0,0}, {0,0}},
124
mga::ForceGLLayer::ForceGLLayer(mg::NativeBuffer const& buffer)
125
: HWCLayer(HWC_FRAMEBUFFER,
127
geom::Rectangle{{0,0}, {buffer.anwb()->width, buffer.anwb()->height}},
128
geom::Size{buffer.anwb()->width, buffer.anwb()->height},
134
mga::CompositionLayer::CompositionLayer(mg::Renderable const& renderable)
135
: HWCLayer(HWC_FRAMEBUFFER,
136
renderable.buffer()->native_buffer_handle()->handle(),
137
renderable.screen_position(),
138
renderable.buffer()->size(),
140
renderable.alpha_enabled())
127
visible_rect = hwc_layer->displayFrame;
130
void mga::HWCLayer::set_buffer(Buffer const& buffer)
132
auto size = buffer.size();
133
auto native_buffer = buffer.native_buffer_handle();
134
hwc_layer->handle = native_buffer->handle();
135
if (!needs_gl_render())
136
hwc_layer->acquireFenceFd = native_buffer->copy_fence();
137
hwc_layer->releaseFenceFd = -1;
138
hwc_layer->sourceCrop =