aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSean Paul <seanpaul@chromium.org>2017-04-12 16:42:32 +0000
committerandroid-build-merger <android-build-merger@google.com>2017-04-12 16:42:32 +0000
commitbc1e7d8bed66da5b67850a087b36f580f642b43a (patch)
treea0a75db30e70edc57dd90ae88e122552927b2f98
parent12b9c99806bc53183e1348eb265e9a7c598af758 (diff)
parent2e5d9d399f6943826649c44926d4a5fffc44fc5a (diff)
downloaddrm_hwcomposer-bc1e7d8bed66da5b67850a087b36f580f642b43a.tar.gz
Merge "drm_hwcomposer: Move some utilities out of hwcomposer.cpp"
am: 2e5d9d399f Change-Id: I0be81ab25d5c975a60644e33209f9cf3d0e61997
-rw-r--r--Android.mk1
-rw-r--r--drmhwcomposer.h5
-rw-r--r--hwcomposer.cpp160
-rw-r--r--hwcutils.cpp199
4 files changed, 205 insertions, 160 deletions
diff --git a/Android.mk b/Android.mk
index 5308225..538c4da 100644
--- a/Android.mk
+++ b/Android.mk
@@ -54,6 +54,7 @@ LOCAL_SRC_FILES := \
drmproperty.cpp \
glworker.cpp \
hwcomposer.cpp \
+ hwcutils.cpp \
platform.cpp \
platformdrmgeneric.cpp \
platformnv.cpp \
diff --git a/drmhwcomposer.h b/drmhwcomposer.h
index ce5a04d..f8440fb 100644
--- a/drmhwcomposer.h
+++ b/drmhwcomposer.h
@@ -150,6 +150,11 @@ struct DrmHwcLayer {
int InitFromHwcLayer(hwc_layer_1_t *sf_layer, Importer *importer,
const gralloc_module_t *gralloc);
+ int ImportBuffer(Importer *importer, const gralloc_module_t *gralloc);
+
+ void SetTransform(int32_t sf_transform);
+ void SetSourceCrop(hwc_frect_t const &crop);
+ void SetDisplayFrame(hwc_rect_t const &frame);
buffer_handle_t get_usable_handle() const {
return handle.get() != NULL ? handle.get() : sf_handle;
diff --git a/hwcomposer.cpp b/hwcomposer.cpp
index 4bc4670..e0483e9 100644
--- a/hwcomposer.cpp
+++ b/hwcomposer.cpp
@@ -202,103 +202,6 @@ struct hwc_context_t {
DrmHotplugHandler hotplug_handler;
};
-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_);
- }
-
- 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;
- }
-
- 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;
- }
-}
-
class DrmVsyncCallback : public VsyncCallback {
public:
DrmVsyncCallback(hwc_procs_t const *procs) : procs_(procs) {
@@ -311,69 +214,6 @@ class DrmVsyncCallback : public VsyncCallback {
hwc_procs_t const *procs_;
};
-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) {
struct hwc_context_t *ctx = (struct hwc_context_t *)&dev->common;
diff --git a/hwcutils.cpp b/hwcutils.cpp
new file mode 100644
index 0000000..0091575
--- /dev/null
+++ b/hwcutils.cpp
@@ -0,0 +1,199 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#define ATRACE_TAG ATRACE_TAG_GRAPHICS
+#define LOG_TAG "hwc-drm-utils"
+
+#include "drmhwcomposer.h"
+#include "platform.h"
+
+#include <cutils/log.h>
+
+namespace android {
+
+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_);
+ }
+
+ importer_ = importer;
+
+ bo_ = tmp_bo;
+
+ return 0;
+}
+
+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);
+}
+
+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;
+ }
+
+ 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) {
+ alpha = sf_layer->planeAlpha;
+
+ SetSourceCrop(sf_layer->sourceCropf);
+ SetDisplayFrame(sf_layer->displayFrame);
+ SetTransform(sf_layer->transform);
+
+ 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;
+ }
+
+ sf_handle = sf_layer->handle;
+
+ return ImportBuffer(importer, gralloc);
+}
+
+int DrmHwcLayer::ImportBuffer(Importer *importer,
+ const gralloc_module_t *gralloc) {
+ int ret = buffer.ImportBuffer(sf_handle, importer);
+ if (ret)
+ return ret;
+
+ ret = handle.CopyBufferHandle(sf_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;
+}
+
+void DrmHwcLayer::SetSourceCrop(hwc_frect_t const &crop) {
+ source_crop = DrmHwcRect<float>(crop.left, crop.top, crop.right, crop.bottom);
+}
+
+void DrmHwcLayer::SetDisplayFrame(hwc_rect_t const &frame) {
+ display_frame =
+ DrmHwcRect<int>(frame.left, frame.top, frame.right, frame.bottom);
+}
+
+void DrmHwcLayer::SetTransform(int32_t sf_transform) {
+ 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_transform == HWC_TRANSFORM_ROT_270) {
+ transform = DrmHwcTransform::kRotate270;
+ } else if (sf_transform == HWC_TRANSFORM_ROT_180) {
+ transform = DrmHwcTransform::kRotate180;
+ } else {
+ if (sf_transform & HWC_TRANSFORM_FLIP_H)
+ transform |= DrmHwcTransform::kFlipH;
+ if (sf_transform & HWC_TRANSFORM_FLIP_V)
+ transform |= DrmHwcTransform::kFlipV;
+ if (sf_transform & HWC_TRANSFORM_ROT_90)
+ transform |= DrmHwcTransform::kRotate90;
+ }
+}
+}