aboutsummaryrefslogtreecommitdiff
path: root/compositor/DrmDisplayCompositor.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'compositor/DrmDisplayCompositor.cpp')
-rw-r--r--compositor/DrmDisplayCompositor.cpp506
1 files changed, 87 insertions, 419 deletions
diff --git a/compositor/DrmDisplayCompositor.cpp b/compositor/DrmDisplayCompositor.cpp
index ba0d56b..665446e 100644
--- a/compositor/DrmDisplayCompositor.cpp
+++ b/compositor/DrmDisplayCompositor.cpp
@@ -20,15 +20,14 @@
#include "DrmDisplayCompositor.h"
#include <drm/drm_mode.h>
-#include <log/log.h>
#include <pthread.h>
#include <sched.h>
-#include <stdlib.h>
#include <sync/sync.h>
-#include <time.h>
#include <utils/Trace.h>
#include <array>
+#include <cstdlib>
+#include <ctime>
#include <sstream>
#include <vector>
@@ -36,8 +35,7 @@
#include "drm/DrmDevice.h"
#include "drm/DrmPlane.h"
#include "utils/autolock.h"
-
-static const uint32_t kWaitWritebackFence = 100; // ms
+#include "utils/log.h"
namespace android {
@@ -52,11 +50,11 @@ std::ostream &operator<<(std::ostream &str, FlatteningState state) {
class CompositorVsyncCallback : public VsyncCallback {
public:
- CompositorVsyncCallback(DrmDisplayCompositor *compositor)
+ explicit CompositorVsyncCallback(DrmDisplayCompositor *compositor)
: compositor_(compositor) {
}
- void Callback(int display, int64_t timestamp) {
+ void Callback(int display, int64_t timestamp) override {
compositor_->Vsync(display, timestamp);
}
@@ -65,7 +63,7 @@ class CompositorVsyncCallback : public VsyncCallback {
};
DrmDisplayCompositor::DrmDisplayCompositor()
- : resource_manager_(NULL),
+ : resource_manager_(nullptr),
display_(-1),
initialized_(false),
active_(false),
@@ -73,10 +71,9 @@ DrmDisplayCompositor::DrmDisplayCompositor()
dump_frames_composited_(0),
dump_last_timestamp_ns_(0),
flatten_countdown_(FLATTEN_COUNTDOWN_INIT),
- writeback_fence_(-1),
flattening_state_(FlatteningState::kNone),
frames_flattened_(0) {
- struct timespec ts;
+ struct timespec ts {};
if (clock_gettime(CLOCK_MONOTONIC, &ts))
return;
dump_last_timestamp_ns_ = ts.tv_sec * 1000 * 1000 * 1000 + ts.tv_nsec;
@@ -113,7 +110,7 @@ int DrmDisplayCompositor::Init(ResourceManager *resource_manager, int display) {
ALOGE("Could not find drmdevice for display");
return -EINVAL;
}
- int ret = pthread_mutex_init(&lock_, NULL);
+ int ret = pthread_mutex_init(&lock_, nullptr);
if (ret) {
ALOGE("Failed to initialize drm compositor lock %d\n", ret);
return ret;
@@ -128,11 +125,6 @@ int DrmDisplayCompositor::Init(ResourceManager *resource_manager, int display) {
return 0;
}
-std::unique_ptr<DrmDisplayComposition> DrmDisplayCompositor::CreateComposition()
- const {
- return std::unique_ptr<DrmDisplayComposition>(new DrmDisplayComposition());
-}
-
std::unique_ptr<DrmDisplayComposition>
DrmDisplayCompositor::CreateInitializedComposition() const {
DrmDevice *drm = resource_manager_->GetDrmDevice(display_);
@@ -141,18 +133,8 @@ DrmDisplayCompositor::CreateInitializedComposition() const {
ALOGE("Failed to find crtc for display = %d", display_);
return std::unique_ptr<DrmDisplayComposition>();
}
- std::unique_ptr<DrmDisplayComposition> comp = CreateComposition();
- std::shared_ptr<Importer> importer = resource_manager_->GetImporter(display_);
- if (!importer) {
- ALOGE("Failed to find resources for display = %d", display_);
- return std::unique_ptr<DrmDisplayComposition>();
- }
- int ret = comp->Init(drm, crtc, importer.get(), planner_.get(), 0);
- if (ret) {
- ALOGE("Failed to init composition for display = %d", display_);
- return std::unique_ptr<DrmDisplayComposition>();
- }
- return comp;
+
+ return std::make_unique<DrmDisplayComposition>(crtc, planner_.get());
}
FlatteningState DrmDisplayCompositor::GetFlatteningState() const {
@@ -172,7 +154,7 @@ std::tuple<uint32_t, uint32_t, int>
DrmDisplayCompositor::GetActiveModeResolution() {
DrmDevice *drm = resource_manager_->GetDrmDevice(display_);
DrmConnector *connector = drm->GetConnectorForDisplay(display_);
- if (connector == NULL) {
+ if (connector == nullptr) {
ALOGE("Failed to determine display mode: no connector for display %d",
display_);
return std::make_tuple(0, 0, -ENODEV);
@@ -189,7 +171,7 @@ int DrmDisplayCompositor::DisablePlanes(DrmDisplayComposition *display_comp) {
return -ENOMEM;
}
- int ret;
+ int ret = 0;
std::vector<DrmCompositionPlane> &comp_planes = display_comp
->composition_planes();
for (DrmCompositionPlane &comp_plane : comp_planes) {
@@ -216,49 +198,8 @@ int DrmDisplayCompositor::DisablePlanes(DrmDisplayComposition *display_comp) {
return 0;
}
-int DrmDisplayCompositor::SetupWritebackCommit(drmModeAtomicReqPtr pset,
- uint32_t crtc_id,
- DrmConnector *writeback_conn,
- DrmHwcBuffer *writeback_buffer) {
- int ret = 0;
- if (writeback_conn->writeback_fb_id().id() == 0 ||
- writeback_conn->writeback_out_fence().id() == 0) {
- ALOGE("Writeback properties don't exit");
- return -EINVAL;
- }
- if ((*writeback_buffer)->fb_id == 0) {
- ALOGE("Invalid writeback buffer");
- return -EINVAL;
- }
- ret = drmModeAtomicAddProperty(pset, writeback_conn->id(),
- writeback_conn->writeback_fb_id().id(),
- (*writeback_buffer)->fb_id);
- if (ret < 0) {
- ALOGE("Failed to add writeback_fb_id");
- return ret;
- }
- ret = drmModeAtomicAddProperty(pset, writeback_conn->id(),
- writeback_conn->writeback_out_fence().id(),
- (uint64_t)&writeback_fence_);
- if (ret < 0) {
- ALOGE("Failed to add writeback_out_fence");
- return ret;
- }
-
- ret = drmModeAtomicAddProperty(pset, writeback_conn->id(),
- writeback_conn->crtc_id_property().id(),
- crtc_id);
- if (ret < 0) {
- ALOGE("Failed to attach writeback");
- return ret;
- }
- return 0;
-}
-
int DrmDisplayCompositor::CommitFrame(DrmDisplayComposition *display_comp,
- bool test_only,
- DrmConnector *writeback_conn,
- DrmHwcBuffer *writeback_buffer) {
+ bool test_only) {
ATRACE_CALL();
int ret = 0;
@@ -286,18 +227,6 @@ int DrmDisplayCompositor::CommitFrame(DrmDisplayComposition *display_comp,
return -ENOMEM;
}
- if (writeback_buffer != NULL) {
- if (writeback_conn == NULL) {
- ALOGE("Invalid arguments requested writeback without writeback conn");
- return -EINVAL;
- }
- ret = SetupWritebackCommit(pset, crtc->id(), writeback_conn,
- writeback_buffer);
- if (ret < 0) {
- ALOGE("Failed to Setup Writeback Commit ret = %d", ret);
- return ret;
- }
- }
if (crtc->out_fence_ptr_property().id() != 0) {
ret = drmModeAtomicAddProperty(pset, crtc->id(),
crtc->out_fence_ptr_property().id(),
@@ -332,7 +261,6 @@ int DrmDisplayCompositor::CommitFrame(DrmDisplayComposition *display_comp,
for (DrmCompositionPlane &comp_plane : comp_planes) {
DrmPlane *plane = comp_plane.plane();
- DrmCrtc *crtc = comp_plane.crtc();
std::vector<size_t> &source_layers = comp_plane.source_layers();
int fb_id = -1;
@@ -341,7 +269,9 @@ int DrmDisplayCompositor::CommitFrame(DrmDisplayComposition *display_comp,
hwc_frect_t source_crop;
uint64_t rotation = 0;
uint64_t alpha = 0xFFFF;
- uint64_t blend;
+ uint64_t blend = UINT64_MAX;
+ uint64_t color_encoding = UINT64_MAX;
+ uint64_t color_range = UINT64_MAX;
if (comp_plane.type() != DrmCompositionPlane::Type::kDisable) {
if (source_layers.size() > 1) {
@@ -427,6 +357,45 @@ int DrmDisplayCompositor::CommitFrame(DrmDisplayComposition *display_comp,
break;
}
}
+
+ if (plane->color_encoding_propery().id()) {
+ switch (layer.dataspace & HAL_DATASPACE_STANDARD_MASK) {
+ case HAL_DATASPACE_STANDARD_BT709:
+ std::tie(color_encoding,
+ ret) = plane->color_encoding_propery()
+ .GetEnumValueWithName("ITU-R BT.709 YCbCr");
+ break;
+ case HAL_DATASPACE_STANDARD_BT601_625:
+ case HAL_DATASPACE_STANDARD_BT601_625_UNADJUSTED:
+ case HAL_DATASPACE_STANDARD_BT601_525:
+ case HAL_DATASPACE_STANDARD_BT601_525_UNADJUSTED:
+ std::tie(color_encoding,
+ ret) = plane->color_encoding_propery()
+ .GetEnumValueWithName("ITU-R BT.601 YCbCr");
+ break;
+ case HAL_DATASPACE_STANDARD_BT2020:
+ case HAL_DATASPACE_STANDARD_BT2020_CONSTANT_LUMINANCE:
+ std::tie(color_encoding,
+ ret) = plane->color_encoding_propery()
+ .GetEnumValueWithName("ITU-R BT.2020 YCbCr");
+ break;
+ }
+ }
+
+ if (plane->color_range_property().id()) {
+ switch (layer.dataspace & HAL_DATASPACE_RANGE_MASK) {
+ case HAL_DATASPACE_RANGE_FULL:
+ std::tie(color_range,
+ ret) = plane->color_range_property()
+ .GetEnumValueWithName("YCbCr full range");
+ break;
+ case HAL_DATASPACE_RANGE_LIMITED:
+ std::tie(color_range,
+ ret) = plane->color_range_property()
+ .GetEnumValueWithName("YCbCr limited range");
+ break;
+ }
+ }
}
// Disable the plane if there's no framebuffer
@@ -500,7 +469,7 @@ int DrmDisplayCompositor::CommitFrame(DrmDisplayComposition *display_comp,
}
}
- if (plane->blend_property().id()) {
+ if (plane->blend_property().id() && blend != UINT64_MAX) {
ret = drmModeAtomicAddProperty(pset, plane->id(),
plane->blend_property().id(), blend) < 0;
if (ret) {
@@ -509,6 +478,28 @@ int DrmDisplayCompositor::CommitFrame(DrmDisplayComposition *display_comp,
break;
}
}
+
+ if (plane->color_encoding_propery().id() && color_encoding != UINT64_MAX) {
+ ret = drmModeAtomicAddProperty(pset, plane->id(),
+ plane->color_encoding_propery().id(),
+ color_encoding) < 0;
+ if (ret) {
+ ALOGE("Failed to add COLOR_ENCODING property %d to plane %d",
+ plane->color_encoding_propery().id(), plane->id());
+ break;
+ }
+ }
+
+ if (plane->color_range_property().id() && color_range != UINT64_MAX) {
+ ret = drmModeAtomicAddProperty(pset, plane->id(),
+ plane->color_range_property().id(),
+ color_range) < 0;
+ if (ret) {
+ ALOGE("Failed to add COLOR_RANGE property %d to plane %d",
+ plane->color_range_property().id(), plane->id());
+ break;
+ }
+ }
}
if (!ret) {
@@ -575,8 +566,7 @@ int DrmDisplayCompositor::ApplyDpms(DrmDisplayComposition *display_comp) {
std::tuple<int, uint32_t> DrmDisplayCompositor::CreateModeBlob(
const DrmMode &mode) {
- struct drm_mode_modeinfo drm_mode;
- memset(&drm_mode, 0, sizeof(drm_mode));
+ struct drm_mode_modeinfo drm_mode {};
mode.ToDrmModeModeInfo(&drm_mode);
uint32_t id = 0;
@@ -598,23 +588,17 @@ void DrmDisplayCompositor::ClearDisplay() {
if (DisablePlanes(active_composition_.get()))
return;
- active_composition_.reset(NULL);
- vsync_worker_.VSyncControl(false);
+ active_composition_.reset(nullptr);
}
void DrmDisplayCompositor::ApplyFrame(
- std::unique_ptr<DrmDisplayComposition> composition, int status,
- bool writeback) {
+ std::unique_ptr<DrmDisplayComposition> composition, int status) {
AutoLock lock(&lock_, __func__);
if (lock.Lock())
return;
int ret = status;
if (!ret) {
- if (writeback && !CountdownExpired()) {
- ALOGE("Abort playing back scene");
- return;
- }
ret = CommitFrame(composition.get(), false);
}
@@ -635,7 +619,7 @@ void DrmDisplayCompositor::ApplyFrame(
} else {
SetFlattening(FlatteningState::kClientDone);
}
- vsync_worker_.VSyncControl(!writeback);
+ vsync_worker_.VSyncControl(true);
}
int DrmDisplayCompositor::ApplyComposition(
@@ -685,118 +669,10 @@ int DrmDisplayCompositor::TestComposition(DrmDisplayComposition *composition) {
return CommitFrame(composition, true);
}
-// Flatten a scene on the display by using a writeback connector
-// and returns the composition result as a DrmHwcLayer.
-int DrmDisplayCompositor::FlattenOnDisplay(
- std::unique_ptr<DrmDisplayComposition> &src, DrmConnector *writeback_conn,
- DrmMode &src_mode, DrmHwcLayer *writeback_layer) {
- int ret = 0;
- DrmDevice *drm = resource_manager_->GetDrmDevice(display_);
- ret = writeback_conn->UpdateModes();
- if (ret) {
- ALOGE("Failed to update modes %d", ret);
- return ret;
- }
- for (const DrmMode &mode : writeback_conn->modes()) {
- if (mode.h_display() == src_mode.h_display() &&
- mode.v_display() == src_mode.v_display()) {
- mode_.mode = mode;
- if (mode_.blob_id)
- drm->DestroyPropertyBlob(mode_.blob_id);
- std::tie(ret, mode_.blob_id) = CreateModeBlob(mode_.mode);
- if (ret) {
- ALOGE("Failed to create mode blob for display %d", display_);
- return ret;
- }
- mode_.needs_modeset = true;
- break;
- }
- }
- if (mode_.blob_id <= 0) {
- ALOGE("Failed to find similar mode");
- return -EINVAL;
- }
-
- DrmCrtc *crtc = drm->GetCrtcForDisplay(display_);
- if (!crtc) {
- ALOGE("Failed to find crtc for display %d", display_);
- return -EINVAL;
- }
- // TODO what happens if planes could go to both CRTCs, I don't think it's
- // handled anywhere
- std::vector<DrmPlane *> primary_planes;
- std::vector<DrmPlane *> overlay_planes;
- for (auto &plane : drm->planes()) {
- if (!plane->GetCrtcSupported(*crtc))
- continue;
- if (plane->type() == DRM_PLANE_TYPE_PRIMARY)
- primary_planes.push_back(plane.get());
- else if (plane->type() == DRM_PLANE_TYPE_OVERLAY)
- overlay_planes.push_back(plane.get());
- }
-
- ret = src->Plan(&primary_planes, &overlay_planes);
- if (ret) {
- ALOGE("Failed to plan the composition ret = %d", ret);
- return ret;
- }
-
- // Disable the planes we're not using
- for (auto i = primary_planes.begin(); i != primary_planes.end();) {
- src->AddPlaneDisable(*i);
- i = primary_planes.erase(i);
- }
- for (auto i = overlay_planes.begin(); i != overlay_planes.end();) {
- src->AddPlaneDisable(*i);
- i = overlay_planes.erase(i);
- }
-
- AutoLock lock(&lock_, __func__);
- ret = lock.Lock();
- if (ret)
- return ret;
- DrmFramebuffer *writeback_fb = &framebuffers_[framebuffer_index_];
- framebuffer_index_ = (framebuffer_index_ + 1) % DRM_DISPLAY_BUFFERS;
- if (!writeback_fb->Allocate(mode_.mode.h_display(), mode_.mode.v_display())) {
- ALOGE("Failed to allocate writeback buffer");
- return -ENOMEM;
- }
- DrmHwcBuffer *writeback_buffer = &writeback_layer->buffer;
- writeback_layer->sf_handle = writeback_fb->buffer()->handle;
- ret = writeback_layer->ImportBuffer(
- resource_manager_->GetImporter(display_).get());
- if (ret) {
- ALOGE("Failed to import writeback buffer");
- return ret;
- }
-
- ret = CommitFrame(src.get(), true, writeback_conn, writeback_buffer);
- if (ret) {
- ALOGE("Atomic check failed");
- return ret;
- }
- ret = CommitFrame(src.get(), false, writeback_conn, writeback_buffer);
- if (ret) {
- ALOGE("Atomic commit failed");
- return ret;
- }
-
- ret = sync_wait(writeback_fence_, kWaitWritebackFence);
- writeback_layer->acquire_fence.Set(writeback_fence_);
- writeback_fence_ = -1;
- if (ret) {
- ALOGE("Failed to wait on writeback fence");
- return ret;
- }
- return 0;
-}
-
void DrmDisplayCompositor::SetFlattening(FlatteningState new_state) {
if (flattening_state_ != new_state) {
switch (flattening_state_) {
case FlatteningState::kClientDone:
- case FlatteningState::kConcurrent:
- case FlatteningState::kSerial:
++frames_flattened_;
break;
case FlatteningState::kClientRequested:
@@ -833,222 +709,14 @@ int DrmDisplayCompositor::FlattenOnClient() {
SetFlattening(FlatteningState::kClientRequested);
refresh_callback_hook_(refresh_callback_data_, display_);
return 0;
- } else {
- ALOGV("No writeback connector available");
- return -EINVAL;
- }
-}
-
-// Flatten a scene by enabling the writeback connector attached
-// to the same CRTC as the one driving the display.
-int DrmDisplayCompositor::FlattenSerial(DrmConnector *writeback_conn) {
- ALOGV("FlattenSerial by enabling writeback connector to the same crtc");
- // Flattened composition with only one layer that is obtained
- // using the writeback connector
- std::unique_ptr<DrmDisplayComposition>
- writeback_comp = CreateInitializedComposition();
- if (!writeback_comp)
- return -EINVAL;
-
- AutoLock lock(&lock_, __func__);
- int ret = lock.Lock();
- if (ret)
- return ret;
- if (!IsFlatteningNeeded()) {
- ALOGV("Flattening is not needed");
- SetFlattening(FlatteningState::kNotNeeded);
- return -EALREADY;
- }
-
- DrmFramebuffer *writeback_fb = &framebuffers_[framebuffer_index_];
- framebuffer_index_ = (framebuffer_index_ + 1) % DRM_DISPLAY_BUFFERS;
- lock.Unlock();
-
- if (!writeback_fb->Allocate(mode_.mode.h_display(), mode_.mode.v_display())) {
- ALOGE("Failed to allocate writeback buffer");
- return -ENOMEM;
- }
- writeback_comp->layers().emplace_back();
-
- DrmHwcLayer &writeback_layer = writeback_comp->layers().back();
- writeback_layer.sf_handle = writeback_fb->buffer()->handle;
- writeback_layer.source_crop = {0, 0, (float)mode_.mode.h_display(),
- (float)mode_.mode.v_display()};
- writeback_layer.display_frame = {0, 0, (int)mode_.mode.h_display(),
- (int)mode_.mode.v_display()};
- ret = writeback_layer.ImportBuffer(
- resource_manager_->GetImporter(display_).get());
- if (ret || writeback_comp->layers().size() != 1) {
- ALOGE("Failed to import writeback buffer");
- return ret;
- }
-
- drmModeAtomicReqPtr pset = drmModeAtomicAlloc();
- if (!pset) {
- ALOGE("Failed to allocate property set");
- return -ENOMEM;
- }
- DrmDevice *drm = resource_manager_->GetDrmDevice(display_);
- DrmCrtc *crtc = drm->GetCrtcForDisplay(display_);
- if (!crtc) {
- ALOGE("Failed to find crtc for display %d", display_);
- return -EINVAL;
- }
- ret = SetupWritebackCommit(pset, crtc->id(), writeback_conn,
- &writeback_layer.buffer);
- if (ret < 0) {
- ALOGE("Failed to Setup Writeback Commit");
- return ret;
- }
- ret = drmModeAtomicCommit(drm->fd(), pset, 0, drm);
- if (ret) {
- ALOGE("Failed to enable writeback %d", ret);
- return ret;
- }
- ret = sync_wait(writeback_fence_, kWaitWritebackFence);
- writeback_layer.acquire_fence.Set(writeback_fence_);
- writeback_fence_ = -1;
- if (ret) {
- ALOGE("Failed to wait on writeback fence");
- return ret;
- }
-
- DrmCompositionPlane squashed_comp(DrmCompositionPlane::Type::kLayer, NULL,
- crtc);
- for (auto &drmplane : drm->planes()) {
- if (!drmplane->GetCrtcSupported(*crtc))
- continue;
- if (!squashed_comp.plane() && drmplane->type() == DRM_PLANE_TYPE_PRIMARY)
- squashed_comp.set_plane(drmplane.get());
- else
- writeback_comp->AddPlaneDisable(drmplane.get());
- }
- squashed_comp.source_layers().push_back(0);
- ret = writeback_comp->AddPlaneComposition(std::move(squashed_comp));
- if (ret) {
- ALOGE("Failed to add flatten scene");
- return ret;
- }
-
- ApplyFrame(std::move(writeback_comp), 0, true);
- return 0;
-}
-
-// Flatten a scene by using a crtc which works concurrent with
-// the one driving the display.
-int DrmDisplayCompositor::FlattenConcurrent(DrmConnector *writeback_conn) {
- ALOGV("FlattenConcurrent by using an unused crtc/display");
- int ret = 0;
- DrmDisplayCompositor drmdisplaycompositor;
- ret = drmdisplaycompositor.Init(resource_manager_, writeback_conn->display());
- if (ret) {
- ALOGE("Failed to init drmdisplaycompositor = %d", ret);
- return ret;
- }
- // Copy of the active_composition, needed because of two things:
- // 1) Not to hold the lock for the whole time we are accessing
- // active_composition
- // 2) It will be committed on a crtc that might not be on the same
- // dri node, so buffers need to be imported on the right node.
- std::unique_ptr<DrmDisplayComposition>
- copy_comp = drmdisplaycompositor.CreateInitializedComposition();
-
- // Writeback composition that will be committed to the display.
- std::unique_ptr<DrmDisplayComposition>
- writeback_comp = CreateInitializedComposition();
-
- if (!copy_comp || !writeback_comp)
- return -EINVAL;
- AutoLock lock(&lock_, __func__);
- ret = lock.Lock();
- if (ret)
- return ret;
- if (!IsFlatteningNeeded()) {
- ALOGV("Flattening is not needed");
- SetFlattening(FlatteningState::kNotNeeded);
- return -EALREADY;
- }
- DrmCrtc *crtc = active_composition_->crtc();
-
- std::vector<DrmHwcLayer> copy_layers;
- for (DrmHwcLayer &src_layer : active_composition_->layers()) {
- DrmHwcLayer copy;
- ret = copy.InitFromDrmHwcLayer(&src_layer,
- resource_manager_
- ->GetImporter(writeback_conn->display())
- .get());
- if (ret) {
- ALOGE("Failed to import buffer ret = %d", ret);
- return -EINVAL;
- }
- copy_layers.emplace_back(std::move(copy));
- }
- ret = copy_comp->SetLayers(copy_layers.data(), copy_layers.size(), true);
- if (ret) {
- ALOGE("Failed to set copy_comp layers");
- return ret;
- }
-
- lock.Unlock();
- DrmHwcLayer writeback_layer;
- ret = drmdisplaycompositor.FlattenOnDisplay(copy_comp, writeback_conn,
- mode_.mode, &writeback_layer);
- if (ret) {
- ALOGE("Failed to flatten on display ret = %d", ret);
- return ret;
}
- DrmCompositionPlane squashed_comp(DrmCompositionPlane::Type::kLayer, NULL,
- crtc);
- for (auto &drmplane : resource_manager_->GetDrmDevice(display_)->planes()) {
- if (!drmplane->GetCrtcSupported(*crtc))
- continue;
- if (drmplane->type() == DRM_PLANE_TYPE_PRIMARY)
- squashed_comp.set_plane(drmplane.get());
- else
- writeback_comp->AddPlaneDisable(drmplane.get());
- }
- writeback_comp->layers().emplace_back();
- DrmHwcLayer &next_layer = writeback_comp->layers().back();
- next_layer.sf_handle = writeback_layer.get_usable_handle();
- next_layer.blending = DrmHwcBlending::kPreMult;
- next_layer.source_crop = {0, 0, (float)mode_.mode.h_display(),
- (float)mode_.mode.v_display()};
- next_layer.display_frame = {0, 0, (int)mode_.mode.h_display(),
- (int)mode_.mode.v_display()};
- ret = next_layer.ImportBuffer(resource_manager_->GetImporter(display_).get());
- if (ret) {
- ALOGE("Failed to import framebuffer for display %d", ret);
- return ret;
- }
- squashed_comp.source_layers().push_back(0);
- ret = writeback_comp->AddPlaneComposition(std::move(squashed_comp));
- if (ret) {
- ALOGE("Failed to add plane composition %d", ret);
- return ret;
- }
- ApplyFrame(std::move(writeback_comp), 0, true);
- return ret;
+ ALOGV("No writeback connector available");
+ return -EINVAL;
}
int DrmDisplayCompositor::FlattenActiveComposition() {
- DrmConnector *writeback_conn = resource_manager_->AvailableWritebackConnector(
- display_);
- if (!active_composition_ || !writeback_conn) {
- // Try to fallback to GPU composition on client, since it is more
- // power-efficient than composition on device side
- return FlattenOnClient();
- }
-
- if (writeback_conn->display() != display_) {
- SetFlattening(FlatteningState::kConcurrent);
- return FlattenConcurrent(writeback_conn);
- } else {
- SetFlattening(FlatteningState::kSerial);
- return FlattenSerial(writeback_conn);
- }
-
- return 0;
+ return FlattenOnClient();
}
bool DrmDisplayCompositor::CountdownExpired() const {
@@ -1077,7 +745,7 @@ void DrmDisplayCompositor::Dump(std::ostringstream *out) const {
uint64_t num_frames = dump_frames_composited_;
dump_frames_composited_ = 0;
- struct timespec ts;
+ struct timespec ts {};
ret = clock_gettime(CLOCK_MONOTONIC, &ts);
if (ret) {
pthread_mutex_unlock(&lock_);
@@ -1086,7 +754,7 @@ void DrmDisplayCompositor::Dump(std::ostringstream *out) const {
uint64_t cur_ts = ts.tv_sec * 1000 * 1000 * 1000 + ts.tv_nsec;
uint64_t num_ms = (cur_ts - dump_last_timestamp_ns_) / (1000 * 1000);
- float fps = num_ms ? (num_frames * 1000.0f) / (num_ms) : 0.0f;
+ float fps = num_ms ? (num_frames * 1000.0F) / (num_ms) : 0.0F;
*out << "--DrmDisplayCompositor[" << display_
<< "]: num_frames=" << num_frames << " num_ms=" << num_ms