hwc2: set layer surface damage
am: be36a18d02

Change-Id: I3484229fe6b72896507a4a7c3c8fb927f0135dcb
diff --git a/hwc2/hwc2.cpp b/hwc2/hwc2.cpp
index 387cd7c..7c51a5a 100644
--- a/hwc2/hwc2.cpp
+++ b/hwc2/hwc2.cpp
@@ -258,11 +258,11 @@
     return HWC2_ERROR_NONE;
 }
 
-hwc2_error_t set_layer_surface_damage(hwc2_device_t* /*device*/,
-        hwc2_display_t /*display*/, hwc2_layer_t /*layer*/,
-        hwc_region_t /*damage*/)
+hwc2_error_t set_layer_surface_damage(hwc2_device_t *device,
+        hwc2_display_t display, hwc2_layer_t layer, hwc_region_t damage)
 {
-    return HWC2_ERROR_NONE;
+    hwc2_dev *dev = reinterpret_cast<hwc2_context *>(device)->hwc2_dev;
+    return dev->set_layer_surface_damage(display, layer, damage);
 }
 
 hwc2_error_t set_layer_blend_mode(hwc2_device_t *device, hwc2_display_t display,
diff --git a/hwc2/hwc2.h b/hwc2/hwc2.h
index 5f3d575..91f7414 100644
--- a/hwc2/hwc2.h
+++ b/hwc2/hwc2.h
@@ -36,6 +36,7 @@
     hwc2_error_t set_display_frame(const hwc_rect_t &display_frame);
     hwc2_error_t set_source_crop(const hwc_frect_t &source_crop);
     hwc2_error_t set_z_order(uint32_t z_order);
+    hwc2_error_t set_surface_damage(const hwc_region_t &surface_damage);
     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);
@@ -55,6 +56,10 @@
      * a buffer with a lesser Z value */
     uint32_t z_order;
 
+    /* The region of the source buffer which has been modified since the
+     * last frame */
+    std::vector<hwc_rect_t> surface_damage;
+
     /* The blend mode of the buffer */
     hwc2_blend_mode_t blend_mode;
 
@@ -129,6 +134,7 @@
     hwc2_error_t set_display_frame(const hwc_rect_t &display_frame);
     hwc2_error_t set_source_crop(const hwc_frect_t &source_crop);
     hwc2_error_t set_z_order(uint32_t z_order);
+    hwc2_error_t set_surface_damage(const hwc_region_t &surface_damage);
     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);
@@ -195,6 +201,8 @@
     hwc2_error_t set_layer_source_crop(hwc2_layer_t lyr_id,
                     const hwc_frect_t &source_crop);
     hwc2_error_t set_layer_z_order(hwc2_layer_t lyr_id, uint32_t z_order);
+    hwc2_error_t set_layer_surface_damage(hwc2_layer_t lyr_id,
+                    const hwc_region_t &surface_damage);
     hwc2_error_t set_layer_blend_mode(hwc2_layer_t lyr_id,
                     hwc2_blend_mode_t blend_mode);
     hwc2_error_t set_layer_plane_alpha(hwc2_layer_t lyr_id, float plane_alpha);
@@ -286,6 +294,8 @@
                     hwc2_layer_t lyr_id, const hwc_frect_t &source_crop);
     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_surface_damage(hwc2_display_t dpy_id,
+                    hwc2_layer_t lyr_id, const hwc_region_t &surface_damage);
     hwc2_error_t set_layer_blend_mode(hwc2_display_t dpy_id,
                     hwc2_layer_t lyr_id, hwc2_blend_mode_t blend_mode);
     hwc2_error_t set_layer_plane_alpha(hwc2_display_t dpy_id,
diff --git a/hwc2/hwc2_buffer.cpp b/hwc2/hwc2_buffer.cpp
index 3c79d7a..632307d 100644
--- a/hwc2/hwc2_buffer.cpp
+++ b/hwc2/hwc2_buffer.cpp
@@ -23,6 +23,7 @@
       display_frame(),
       source_crop(),
       z_order(0),
+      surface_damage(),
       blend_mode(HWC2_BLEND_MODE_NONE),
       plane_alpha(1.0),
       transform() { }
@@ -55,6 +56,15 @@
     return HWC2_ERROR_NONE;
 }
 
+hwc2_error_t hwc2_buffer::set_surface_damage(const hwc_region_t &surface_damage)
+{
+    this->surface_damage.clear();
+    for (size_t idx = 0; idx < surface_damage.numRects; idx++)
+        this->surface_damage.push_back(surface_damage.rects[idx]);
+
+    return HWC2_ERROR_NONE;
+}
+
 hwc2_error_t hwc2_buffer::set_blend_mode(hwc2_blend_mode_t blend_mode)
 {
     if (blend_mode == HWC2_BLEND_MODE_INVALID) {
diff --git a/hwc2/hwc2_dev.cpp b/hwc2/hwc2_dev.cpp
index e1ced5d..8bb2a8b 100644
--- a/hwc2/hwc2_dev.cpp
+++ b/hwc2/hwc2_dev.cpp
@@ -213,6 +213,13 @@
     return displays.find(dpy_id)->second.set_layer_z_order(lyr_id, z_order);
 }
 
+hwc2_error_t hwc2_dev::set_layer_surface_damage(hwc2_display_t dpy_id,
+        hwc2_layer_t lyr_id, const hwc_region_t &surface_damage)
+{
+    return displays.find(dpy_id)->second.set_layer_surface_damage(lyr_id,
+            surface_damage);
+}
+
 hwc2_error_t hwc2_dev::set_layer_blend_mode(hwc2_display_t dpy_id,
         hwc2_layer_t lyr_id, hwc2_blend_mode_t blend_mode)
 {
diff --git a/hwc2/hwc2_display.cpp b/hwc2/hwc2_display.cpp
index 5f42458..e8f1ed2 100644
--- a/hwc2/hwc2_display.cpp
+++ b/hwc2/hwc2_display.cpp
@@ -323,6 +323,18 @@
     return it->second.set_z_order(z_order);
 }
 
+hwc2_error_t hwc2_display::set_layer_surface_damage(hwc2_layer_t lyr_id,
+        const hwc_region_t &surface_damage)
+{
+    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_surface_damage(surface_damage);
+}
+
 hwc2_error_t hwc2_display::set_layer_blend_mode(hwc2_layer_t lyr_id,
         hwc2_blend_mode_t blend_mode)
 {
diff --git a/hwc2/hwc2_layer.cpp b/hwc2/hwc2_layer.cpp
index c8f31be..a536709 100644
--- a/hwc2/hwc2_layer.cpp
+++ b/hwc2/hwc2_layer.cpp
@@ -71,6 +71,11 @@
     return buffer.set_z_order(z_order);
 }
 
+hwc2_error_t hwc2_layer::set_surface_damage(const hwc_region_t &surface_damage)
+{
+    return buffer.set_surface_damage(surface_damage);
+}
+
 hwc2_error_t hwc2_layer::set_blend_mode(hwc2_blend_mode_t blend_mode)
 {
     return buffer.set_blend_mode(blend_mode);