hwc2: set layer display frame

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: Ife7f92a20fe703d69b0a3871687239abadf54efc
diff --git a/hwc2/hwc2.cpp b/hwc2/hwc2.cpp
index 60aeda4..0fb705c 100644
--- a/hwc2/hwc2.cpp
+++ b/hwc2/hwc2.cpp
@@ -294,11 +294,11 @@
     return dev->set_layer_dataspace(display, layer, dataspace);
 }
 
-hwc2_error_t set_layer_display_frame(hwc2_device_t* /*device*/,
-        hwc2_display_t /*display*/, hwc2_layer_t /*layer*/,
-        hwc_rect_t /*frame*/)
+hwc2_error_t set_layer_display_frame(hwc2_device_t *device,
+        hwc2_display_t display, hwc2_layer_t layer, hwc_rect_t frame)
 {
-    return HWC2_ERROR_NONE;
+    hwc2_dev *dev = reinterpret_cast<hwc2_context *>(device)->hwc2_dev;
+    return dev->set_layer_display_frame(display, layer, frame);
 }
 
 hwc2_error_t set_layer_plane_alpha(hwc2_device_t *device,
diff --git a/hwc2/hwc2.h b/hwc2/hwc2.h
index f27e803..fd8ce44 100644
--- a/hwc2/hwc2.h
+++ b/hwc2/hwc2.h
@@ -33,6 +33,7 @@
 
     /* Set properties */
     hwc2_error_t set_dataspace(android_dataspace_t dataspace);
+    hwc2_error_t set_display_frame(const hwc_rect_t &display_frame);
     hwc2_error_t set_z_order(uint32_t z_order);
     hwc2_error_t set_blend_mode(hwc2_blend_mode_t blend_mode);
     hwc2_error_t set_plane_alpha(float plane_alpha);
@@ -43,6 +44,8 @@
      * the encoding standard and color transformation */
     android_dataspace_t dataspace;
 
+    /* The portion of the display covered by the buffer */
+    hwc_rect_t display_frame;
     /* The height of a given buffer. A buffer with a greater Z value occludes
      * a buffer with a lesser Z value */
     uint32_t z_order;
@@ -118,6 +121,7 @@
     /* Set properties */
     hwc2_error_t set_comp_type(hwc2_composition_t comp_type);
     hwc2_error_t set_dataspace(android_dataspace_t dataspace);
+    hwc2_error_t set_display_frame(const hwc_rect_t &display_frame);
     hwc2_error_t set_z_order(uint32_t z_order);
     hwc2_error_t set_blend_mode(hwc2_blend_mode_t blend_mode);
     hwc2_error_t set_plane_alpha(float plane_alpha);
@@ -180,6 +184,8 @@
                     hwc2_composition_t comp_type);
     hwc2_error_t set_layer_dataspace(hwc2_layer_t lyr_id,
                     android_dataspace_t dataspace);
+    hwc2_error_t set_layer_display_frame(hwc2_layer_t lyr_id,
+                    const hwc_rect_t &display_frame);
     hwc2_error_t set_layer_z_order(hwc2_layer_t lyr_id, uint32_t z_order);
     hwc2_error_t set_layer_blend_mode(hwc2_layer_t lyr_id,
                     hwc2_blend_mode_t blend_mode);
@@ -265,6 +271,8 @@
                     hwc2_layer_t lyr_id, hwc2_composition_t comp_type);
     hwc2_error_t set_layer_dataspace(hwc2_display_t dpy_id, hwc2_layer_t lyr_id,
                     android_dataspace_t dataspace);
+    hwc2_error_t set_layer_display_frame(hwc2_display_t dpy_id,
+                    hwc2_layer_t lyr_id, const hwc_rect_t &display_frame);
     hwc2_error_t set_layer_z_order(hwc2_display_t dpy_id, hwc2_layer_t lyr_id,
                     uint32_t z_order);
     hwc2_error_t set_layer_blend_mode(hwc2_display_t dpy_id,
diff --git a/hwc2/hwc2_buffer.cpp b/hwc2/hwc2_buffer.cpp
index 60686cf..323b990 100644
--- a/hwc2/hwc2_buffer.cpp
+++ b/hwc2/hwc2_buffer.cpp
@@ -20,6 +20,7 @@
 
 hwc2_buffer::hwc2_buffer()
     : dataspace(),
+      display_frame(),
       z_order(0),
       blend_mode(HWC2_BLEND_MODE_NONE),
       plane_alpha(1.0),
@@ -32,6 +33,13 @@
     return HWC2_ERROR_NONE;
 }
 
+hwc2_error_t hwc2_buffer::set_display_frame(const hwc_rect_t &display_frame)
+{
+    this->display_frame = display_frame;
+
+    return HWC2_ERROR_NONE;
+}
+
 hwc2_error_t hwc2_buffer::set_z_order(uint32_t z_order)
 {
     this->z_order = z_order;
diff --git a/hwc2/hwc2_dev.cpp b/hwc2/hwc2_dev.cpp
index 9ef794e..e5bfa6d 100644
--- a/hwc2/hwc2_dev.cpp
+++ b/hwc2/hwc2_dev.cpp
@@ -193,6 +193,13 @@
     return displays.find(dpy_id)->second.set_layer_dataspace(lyr_id, dataspace);
 }
 
+hwc2_error_t hwc2_dev::set_layer_display_frame(hwc2_display_t dpy_id,
+        hwc2_layer_t lyr_id, const hwc_rect_t &display_frame)
+{
+    return displays.find(dpy_id)->second.set_layer_display_frame(lyr_id,
+            display_frame);
+}
+
 hwc2_error_t hwc2_dev::set_layer_z_order(hwc2_display_t dpy_id,
         hwc2_layer_t lyr_id, uint32_t z_order)
 {
diff --git a/hwc2/hwc2_display.cpp b/hwc2/hwc2_display.cpp
index a0f4fff..172fb5e 100644
--- a/hwc2/hwc2_display.cpp
+++ b/hwc2/hwc2_display.cpp
@@ -288,6 +288,18 @@
     return it->second.set_dataspace(dataspace);
 }
 
+hwc2_error_t hwc2_display::set_layer_display_frame(hwc2_layer_t lyr_id,
+        const hwc_rect_t &display_frame)
+{
+    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_display_frame(display_frame);
+}
+
 hwc2_error_t hwc2_display::set_layer_z_order(hwc2_layer_t lyr_id, uint32_t z_order)
 {
     auto it = layers.find(lyr_id);
diff --git a/hwc2/hwc2_layer.cpp b/hwc2/hwc2_layer.cpp
index cf873c3..699a2c0 100644
--- a/hwc2/hwc2_layer.cpp
+++ b/hwc2/hwc2_layer.cpp
@@ -56,6 +56,11 @@
     return buffer.set_dataspace(dataspace);
 }
 
+hwc2_error_t hwc2_layer::set_display_frame(const hwc_rect_t &display_frame)
+{
+    return buffer.set_display_frame(display_frame);
+}
+
 hwc2_error_t hwc2_layer::set_z_order(uint32_t z_order)
 {
     return buffer.set_z_order(z_order);