summaryrefslogtreecommitdiff
path: root/drmdisplaycompositor.cpp
diff options
context:
space:
mode:
authorSean Paul <seanpaul@google.com>2015-10-16 13:52:42 +0000
committerAndroid (Google) Code Review <android-gerrit@google.com>2015-10-16 13:52:42 +0000
commitf81ba3781d27876ce1b658ee71b474adf956e485 (patch)
treece9de6ea5ad5548330959a52f7370f4e7e50fa5a /drmdisplaycompositor.cpp
parent2fddd37d1f8eeb410aa2499ff582220b55dd80d6 (diff)
parentd8aefb635a854c36b0cf2eb36ecdf9070ddc7151 (diff)
Merge "drm_hwcomposer: Use layer alpha to blend planes" into mnc-dr-dev
Diffstat (limited to 'drmdisplaycompositor.cpp')
-rw-r--r--drmdisplaycompositor.cpp20
1 files changed, 20 insertions, 0 deletions
diff --git a/drmdisplaycompositor.cpp b/drmdisplaycompositor.cpp
index 9d4cdff..f238f43 100644
--- a/drmdisplaycompositor.cpp
+++ b/drmdisplaycompositor.cpp
@@ -457,6 +457,7 @@ int DrmDisplayCompositor::ApplyFrame(DrmDisplayComposition *display_comp) {
DrmHwcRect<int> display_frame;
DrmHwcRect<float> source_crop;
uint64_t rotation = 0;
+ uint64_t alpha = 0xFF;
switch (comp_plane.source_layer) {
case DrmCompositionPlane::kSourceNone:
break;
@@ -504,6 +505,8 @@ int DrmDisplayCompositor::ApplyFrame(DrmDisplayComposition *display_comp) {
fb_id = layer.buffer->fb_id;
display_frame = layer.display_frame;
source_crop = layer.source_crop;
+ if (layer.blending == DrmHwcBlending::kPreMult)
+ alpha = layer.alpha;
switch (layer.transform) {
case DrmHwcTransform::kFlipH:
rotation = 1 << DRM_REFLECT_X;
@@ -551,6 +554,13 @@ int DrmDisplayCompositor::ApplyFrame(DrmDisplayComposition *display_comp) {
break;
}
+ // TODO: Once we have atomic test, this should fall back to GL
+ if (alpha != 0xFF && plane->alpha_property().id() == 0) {
+ ALOGE("Alpha is not supported on plane %d", plane->id());
+ ret = -EINVAL;
+ break;
+ }
+
ret =
drmModePropertySetAdd(pset, plane->id(), plane->crtc_property().id(),
crtc->id()) ||
@@ -588,6 +598,16 @@ int DrmDisplayCompositor::ApplyFrame(DrmDisplayComposition *display_comp) {
break;
}
}
+
+ if (plane->alpha_property().id()) {
+ ret = drmModePropertySetAdd(pset, plane->id(),
+ plane->alpha_property().id(), alpha);
+ if (ret) {
+ ALOGE("Failed to add alpha property %d to plane %d",
+ plane->alpha_property().id(), plane->id());
+ break;
+ }
+ }
}
out: