diff options
author | Sean Paul <seanpaul@google.com> | 2015-10-16 13:52:42 +0000 |
---|---|---|
committer | Android (Google) Code Review <android-gerrit@google.com> | 2015-10-16 13:52:42 +0000 |
commit | f81ba3781d27876ce1b658ee71b474adf956e485 (patch) | |
tree | ce9de6ea5ad5548330959a52f7370f4e7e50fa5a /drmdisplaycompositor.cpp | |
parent | 2fddd37d1f8eeb410aa2499ff582220b55dd80d6 (diff) | |
parent | d8aefb635a854c36b0cf2eb36ecdf9070ddc7151 (diff) |
Merge "drm_hwcomposer: Use layer alpha to blend planes" into mnc-dr-dev
Diffstat (limited to 'drmdisplaycompositor.cpp')
-rw-r--r-- | drmdisplaycompositor.cpp | 20 |
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: |