path: root/drmdisplaycomposition.cpp
diff options
authorZach Reizner <>2015-07-16 10:14:26 -0700
committerZach Reizner <>2015-07-20 19:45:40 -0700
commit2317bb19d8663efc31e6fcd8cf7fd2a73577253d (patch)
tree40ee67dc139346c62533ea00a2a5542b05e86c7c /drmdisplaycomposition.cpp
parentece04894ab2d2fc3d5001a9e50a242b2d3f765da (diff)
drm_hwcomposer: have DrmDisplayCompositor do its own OpenGL composition
To accomplish this a few things changed: - DrmComposition::GetRemainingLayers always returns the number of planes needed - DrmComposition::AddLayer succeeds even if no DrmPlane was found for it - DrmDisplayComposition::AddLayer has overload that imports the given buffer - GLWorkerCompositor has a function to finish its composite before returning Put together this change makes DrmComposition always accepts all layers given to it even if it means some of those layers are assigned a NULL DrmPlane. The DrmDisplayCompositor will scan its given layers for any that are missing planes. In such a case, a DrmPlane is stolen from the last layer to receive a plane. Then all layers in the DrmDisplayComposition that have no planes (including the one stolen from) are composited synchronously using a GLWorkerCompositor and a new layer is generated from the results. That layer is added to the DrmDisplayComposition using the new import AddLayer function and the stolen DrmPlane. DrmDisplayCompostior then continues as usual. Change-Id: Ia6477c210c8f1307a4e537bec46889110d79ca18
Diffstat (limited to 'drmdisplaycomposition.cpp')
1 files changed, 22 insertions, 0 deletions
diff --git a/drmdisplaycomposition.cpp b/drmdisplaycomposition.cpp
index cce1d56..21a9c2a 100644
--- a/drmdisplaycomposition.cpp
+++ b/drmdisplaycomposition.cpp
@@ -112,6 +112,28 @@ int DrmDisplayComposition::AddLayer(hwc_layer_1_t *layer, hwc_drm_bo_t *bo,
return 0;
+int DrmDisplayComposition::AddLayer(hwc_layer_1_t *layer, DrmCrtc *crtc,
+ DrmPlane *plane) {
+ if (layer->transform != 0)
+ return -EINVAL;
+ if (!validate_composition_type(DRM_COMPOSITION_TYPE_FRAME))
+ return -EINVAL;
+ hwc_drm_bo_t bo;
+ int ret = importer_->ImportBuffer(layer->handle, &bo);
+ if (ret) {
+ ALOGE("Failed to import handle of layer %d", ret);
+ return ret;
+ }
+ ret = AddLayer(layer, &bo, crtc, plane);
+ if (ret)
+ importer_->ReleaseBuffer(&bo);
+ return ret;
int DrmDisplayComposition::AddDpmsMode(uint32_t dpms_mode) {
if (!validate_composition_type(DRM_COMPOSITION_TYPE_DPMS))
return -EINVAL;