DO NOT MERGE: revert HWC2 changes
The changes are causing some issues with multi-window use cases.
Fixes: 64491794
Test: test gmail compose in multi-window + show taps enabled
Change-Id: I0b0a3f351ed48f81db89a71c78bf17bab8cb2acf
Signed-off-by: Adrian Salido <salidoa@google.com>
diff --git a/hwcomposer.cpp b/hwcomposer.cpp
index 875056d..8d8e1d0 100644
--- a/hwcomposer.cpp
+++ b/hwcomposer.cpp
@@ -201,17 +201,165 @@
DrmHotplugHandler hotplug_handler;
};
-class DrmVsyncCallback : public VsyncCallback {
- public:
- DrmVsyncCallback(hwc_procs_t const *procs) : procs_(procs) {
+static native_handle_t *dup_buffer_handle(buffer_handle_t handle) {
+ native_handle_t *new_handle =
+ native_handle_create(handle->numFds, handle->numInts);
+ if (new_handle == NULL)
+ return NULL;
+
+ const int *old_data = handle->data;
+ int *new_data = new_handle->data;
+ for (int i = 0; i < handle->numFds; i++) {
+ *new_data = dup(*old_data);
+ old_data++;
+ new_data++;
+ }
+ memcpy(new_data, old_data, sizeof(int) * handle->numInts);
+
+ return new_handle;
+}
+
+static void free_buffer_handle(native_handle_t *handle) {
+ int ret = native_handle_close(handle);
+ if (ret)
+ ALOGE("Failed to close native handle %d", ret);
+ ret = native_handle_delete(handle);
+ if (ret)
+ ALOGE("Failed to delete native handle %d", ret);
+}
+
+const hwc_drm_bo *DrmHwcBuffer::operator->() const {
+ if (importer_ == NULL) {
+ ALOGE("Access of non-existent BO");
+ exit(1);
+ return NULL;
+ }
+ return &bo_;
+}
+
+void DrmHwcBuffer::Clear() {
+ if (importer_ != NULL) {
+ importer_->ReleaseBuffer(&bo_);
+ importer_ = NULL;
+ }
+}
+
+int DrmHwcBuffer::ImportBuffer(buffer_handle_t handle, Importer *importer) {
+ hwc_drm_bo tmp_bo;
+
+ int ret = importer->ImportBuffer(handle, &tmp_bo);
+ if (ret)
+ return ret;
+
+ if (importer_ != NULL) {
+ importer_->ReleaseBuffer(&bo_);
}
- void Callback(int display, int64_t timestamp) {
- procs_->vsync(procs_, display, timestamp);
+ importer_ = importer;
+
+ bo_ = tmp_bo;
+
+ return 0;
+}
+
+int DrmHwcNativeHandle::CopyBufferHandle(buffer_handle_t handle,
+ const gralloc_module_t *gralloc) {
+ native_handle_t *handle_copy = dup_buffer_handle(handle);
+ if (handle_copy == NULL) {
+ ALOGE("Failed to duplicate handle");
+ return -ENOMEM;
}
- private:
- hwc_procs_t const *procs_;
-};
+
+ int ret = gralloc->registerBuffer(gralloc, handle_copy);
+ if (ret) {
+ ALOGE("Failed to register buffer handle %d", ret);
+ free_buffer_handle(handle_copy);
+ return ret;
+ }
+
+ Clear();
+
+ gralloc_ = gralloc;
+ handle_ = handle_copy;
+
+ return 0;
+}
+
+DrmHwcNativeHandle::~DrmHwcNativeHandle() {
+ Clear();
+}
+
+void DrmHwcNativeHandle::Clear() {
+ if (gralloc_ != NULL && handle_ != NULL) {
+ gralloc_->unregisterBuffer(gralloc_, handle_);
+ free_buffer_handle(handle_);
+ gralloc_ = NULL;
+ handle_ = NULL;
+ }
+}
+
+int DrmHwcLayer::InitFromHwcLayer(hwc_layer_1_t *sf_layer, Importer *importer,
+ const gralloc_module_t *gralloc) {
+ sf_handle = sf_layer->handle;
+ alpha = sf_layer->planeAlpha;
+
+ source_crop = DrmHwcRect<float>(
+ sf_layer->sourceCropf.left, sf_layer->sourceCropf.top,
+ sf_layer->sourceCropf.right, sf_layer->sourceCropf.bottom);
+ display_frame = DrmHwcRect<int>(
+ sf_layer->displayFrame.left, sf_layer->displayFrame.top,
+ sf_layer->displayFrame.right, sf_layer->displayFrame.bottom);
+
+ transform = 0;
+ // 270* and 180* cannot be combined with flips. More specifically, they
+ // already contain both horizontal and vertical flips, so those fields are
+ // redundant in this case. 90* rotation can be combined with either horizontal
+ // flip or vertical flip, so treat it differently
+ if (sf_layer->transform == HWC_TRANSFORM_ROT_270) {
+ transform = DrmHwcTransform::kRotate270;
+ } else if (sf_layer->transform == HWC_TRANSFORM_ROT_180) {
+ transform = DrmHwcTransform::kRotate180;
+ } else {
+ if (sf_layer->transform & HWC_TRANSFORM_FLIP_H)
+ transform |= DrmHwcTransform::kFlipH;
+ if (sf_layer->transform & HWC_TRANSFORM_FLIP_V)
+ transform |= DrmHwcTransform::kFlipV;
+ if (sf_layer->transform & HWC_TRANSFORM_ROT_90)
+ transform |= DrmHwcTransform::kRotate90;
+ }
+
+ switch (sf_layer->blending) {
+ case HWC_BLENDING_NONE:
+ blending = DrmHwcBlending::kNone;
+ break;
+ case HWC_BLENDING_PREMULT:
+ blending = DrmHwcBlending::kPreMult;
+ break;
+ case HWC_BLENDING_COVERAGE:
+ blending = DrmHwcBlending::kCoverage;
+ break;
+ default:
+ ALOGE("Invalid blending in hwc_layer_1_t %d", sf_layer->blending);
+ return -EINVAL;
+ }
+
+ int ret = buffer.ImportBuffer(sf_layer->handle, importer);
+ if (ret)
+ return ret;
+
+ ret = handle.CopyBufferHandle(sf_layer->handle, gralloc);
+ if (ret)
+ return ret;
+
+ ret = gralloc->perform(gralloc, GRALLOC_MODULE_PERFORM_GET_USAGE,
+ handle.get(), &gralloc_buffer_usage);
+ if (ret) {
+ ALOGE("Failed to get usage for buffer %p (%d)", handle.get(), ret);
+ return ret;
+ }
+
+ return 0;
+}
static void hwc_dump(struct hwc_composer_device_1 *dev, char *buff,
int buff_len) {
@@ -535,10 +683,8 @@
ctx->procs = procs;
- for (std::pair<const int, hwc_drm_display> &display_entry : ctx->displays) {
- auto callback = std::make_shared<DrmVsyncCallback>(procs);
- display_entry.second.vsync_worker.RegisterCallback(std::move(callback));
- }
+ for (std::pair<const int, hwc_drm_display> &display_entry : ctx->displays)
+ display_entry.second.vsync_worker.SetProcs(procs);
ctx->hotplug_handler.Init(&ctx->drm, procs);
ctx->drm.event_listener()->RegisterHotplugHandler(&ctx->hotplug_handler);