From df4e35671b2475b8aa90e1047e48012f76802421 Mon Sep 17 00:00:00 2001 From: Marissa Wall Date: Thu, 1 Dec 2016 15:57:28 -0800 Subject: hwc2: set layer visible region Test: Add "TARGET_USES_HWC2 := true" to BoardConfig.mk. Recompile. Run testcases: https://android-review.googlesource.com/#/q/project: platform/frameworks/native+branch:master+topic:test-hwc2 Change-Id: I127ddcc97ebc1fc0c01fac060d7e17f33e182f3c --- hwc2/hwc2.cpp | 8 ++++---- hwc2/hwc2.h | 10 ++++++++++ hwc2/hwc2_buffer.cpp | 12 +++++++++++- hwc2/hwc2_dev.cpp | 7 +++++++ hwc2/hwc2_display.cpp | 12 ++++++++++++ hwc2/hwc2_layer.cpp | 5 +++++ 6 files changed, 49 insertions(+), 5 deletions(-) diff --git a/hwc2/hwc2.cpp b/hwc2/hwc2.cpp index 9da3561..f6ed40d 100644 --- a/hwc2/hwc2.cpp +++ b/hwc2/hwc2.cpp @@ -322,11 +322,11 @@ hwc2_error_t set_layer_transform(hwc2_device_t *device, hwc2_display_t display, return dev->set_layer_transform(display, layer, transform); } -hwc2_error_t set_layer_visible_region(hwc2_device_t* /*device*/, - hwc2_display_t /*display*/, hwc2_layer_t /*layer*/, - hwc_region_t /*visible*/) +hwc2_error_t set_layer_visible_region(hwc2_device_t *device, + hwc2_display_t display, hwc2_layer_t layer, hwc_region_t visible) { - return HWC2_ERROR_NONE; + hwc2_dev *dev = reinterpret_cast(device)->hwc2_dev; + return dev->set_layer_visible_region(display, layer, visible); } hwc2_error_t set_layer_z_order(hwc2_device_t *device, hwc2_display_t display, diff --git a/hwc2/hwc2.h b/hwc2/hwc2.h index fc4ed06..423f589 100644 --- a/hwc2/hwc2.h +++ b/hwc2/hwc2.h @@ -63,6 +63,7 @@ public: hwc2_error_t set_blend_mode(hwc2_blend_mode_t blend_mode); hwc2_error_t set_plane_alpha(float plane_alpha); hwc2_error_t set_transform(hwc_transform_t transform); + hwc2_error_t set_visible_region(const hwc_region_t &visible_region); private: /* A handle to the buffer */ @@ -100,6 +101,10 @@ private: /* The rotation or flip of the buffer */ hwc_transform_t transform; + + /* The portion of the layer that is visible including portions under + * translucent areas of other buffers */ + std::vector visible_region; }; class hwc2_config { @@ -170,6 +175,7 @@ public: hwc2_error_t set_blend_mode(hwc2_blend_mode_t blend_mode); hwc2_error_t set_plane_alpha(float plane_alpha); hwc2_error_t set_transform(hwc_transform_t transform); + hwc2_error_t set_visible_region(const hwc_region_t &visible_region); static hwc2_layer_t get_next_id(); @@ -242,6 +248,8 @@ public: hwc2_error_t set_layer_plane_alpha(hwc2_layer_t lyr_id, float plane_alpha); hwc2_error_t set_layer_transform(hwc2_layer_t lyr_id, hwc_transform_t transform); + hwc2_error_t set_layer_visible_region(hwc2_layer_t lyr_id, + const hwc_region_t &visible_region); hwc2_error_t set_layer_color(hwc2_layer_t lyr_id, const hwc_color_t &color); hwc2_error_t set_cursor_position(hwc2_layer_t lyr_id, int32_t x, int32_t y); @@ -338,6 +346,8 @@ public: hwc2_layer_t lyr_id, float plane_alpha); hwc2_error_t set_layer_transform(hwc2_display_t dpy_id, hwc2_layer_t lyr_id, hwc_transform_t transform); + hwc2_error_t set_layer_visible_region(hwc2_display_t dpy_id, + hwc2_layer_t lyr_id, const hwc_region_t &visible_region); hwc2_error_t set_layer_color(hwc2_display_t dpy_id, hwc2_layer_t lyr_id, const hwc_color_t &color); hwc2_error_t set_cursor_position(hwc2_display_t dpy_id, hwc2_layer_t lyr_id, diff --git a/hwc2/hwc2_buffer.cpp b/hwc2/hwc2_buffer.cpp index 7bd2361..2344eb4 100644 --- a/hwc2/hwc2_buffer.cpp +++ b/hwc2/hwc2_buffer.cpp @@ -28,7 +28,8 @@ hwc2_buffer::hwc2_buffer() surface_damage(), blend_mode(HWC2_BLEND_MODE_NONE), plane_alpha(1.0), - transform() { } + transform(), + visible_region() { } hwc2_buffer::~hwc2_buffer() { @@ -124,3 +125,12 @@ hwc2_error_t hwc2_buffer::set_transform(const hwc_transform_t transform) return HWC2_ERROR_NONE; } + +hwc2_error_t hwc2_buffer::set_visible_region(const hwc_region_t &visible_region) +{ + this->visible_region.clear(); + for (size_t idx = 0; idx < visible_region.numRects; idx++) + this->visible_region.push_back(visible_region.rects[idx]); + + return HWC2_ERROR_NONE; +} diff --git a/hwc2/hwc2_dev.cpp b/hwc2/hwc2_dev.cpp index 294272b..cbe9bc2 100644 --- a/hwc2/hwc2_dev.cpp +++ b/hwc2/hwc2_dev.cpp @@ -247,6 +247,13 @@ hwc2_error_t hwc2_dev::set_layer_transform(hwc2_display_t dpy_id, return displays.find(dpy_id)->second.set_layer_transform(lyr_id, transform); } +hwc2_error_t hwc2_dev::set_layer_visible_region(hwc2_display_t dpy_id, + hwc2_layer_t lyr_id, const hwc_region_t &visible_region) +{ + return displays.find(dpy_id)->second.set_layer_visible_region(lyr_id, + visible_region); +} + hwc2_error_t hwc2_dev::set_layer_color(hwc2_display_t dpy_id, hwc2_layer_t lyr_id, const hwc_color_t &color) { diff --git a/hwc2/hwc2_display.cpp b/hwc2/hwc2_display.cpp index c84d36b..983bba7 100644 --- a/hwc2/hwc2_display.cpp +++ b/hwc2/hwc2_display.cpp @@ -382,6 +382,18 @@ hwc2_error_t hwc2_display::set_layer_transform(hwc2_layer_t lyr_id, return it->second.set_transform(transform); } +hwc2_error_t hwc2_display::set_layer_visible_region(hwc2_layer_t lyr_id, + const hwc_region_t &visible_region) +{ + auto it = layers.find(lyr_id); + if (it == layers.end()) { + ALOGE("dpy %" PRIu64 ": lyr %" PRIu64 ": bad layer handle", id, lyr_id); + return HWC2_ERROR_BAD_LAYER; + } + + return it->second.set_visible_region(visible_region); +} + hwc2_error_t hwc2_display::set_layer_color(hwc2_layer_t lyr_id, const hwc_color_t& /*color*/) { diff --git a/hwc2/hwc2_layer.cpp b/hwc2/hwc2_layer.cpp index 65e9b84..125f28f 100644 --- a/hwc2/hwc2_layer.cpp +++ b/hwc2/hwc2_layer.cpp @@ -107,6 +107,11 @@ hwc2_error_t hwc2_layer::set_transform(const hwc_transform_t transform) return buffer.set_transform(transform); } +hwc2_error_t hwc2_layer::set_visible_region(const hwc_region_t &visible_region) +{ + return buffer.set_visible_region(visible_region); +} + hwc2_layer_t hwc2_layer::get_next_id() { return layer_cnt++; -- cgit v1.2.3