hwc2: get and accept display changes
am: 79b56bcdd8

Change-Id: Ifd8779bdeee4b2b85911865272bcf1e9cb593cd9
diff --git a/hwc2/hwc2.cpp b/hwc2/hwc2.cpp
index 3c450ca..041e772 100644
--- a/hwc2/hwc2.cpp
+++ b/hwc2/hwc2.cpp
@@ -74,10 +74,11 @@
     return dev->register_callback(descriptor, callback_data, pointer);
 }
 
-hwc2_error_t accept_display_changes(hwc2_device_t* /*device*/,
-        hwc2_display_t /*display*/)
+hwc2_error_t accept_display_changes(hwc2_device_t *device,
+        hwc2_display_t display)
 {
-    return HWC2_ERROR_NONE;
+    hwc2_dev *dev = reinterpret_cast<hwc2_context *>(device)->hwc2_dev;
+    return dev->accept_display_changes(display);
 }
 
 hwc2_error_t create_layer(hwc2_device_t *device, hwc2_display_t display,
@@ -101,11 +102,13 @@
     return dev->get_active_config(display, out_config);
 }
 
-hwc2_error_t get_changed_composition_types(hwc2_device_t* /*device*/,
-        hwc2_display_t /*display*/, uint32_t* /*out_num_elements*/,
-        hwc2_layer_t* /*out_layers*/, hwc2_composition_t* /*out_types*/)
+hwc2_error_t get_changed_composition_types(hwc2_device_t *device,
+        hwc2_display_t display, uint32_t *out_num_elements,
+        hwc2_layer_t *out_layers, hwc2_composition_t *out_types)
 {
-    return HWC2_ERROR_NONE;
+    hwc2_dev *dev = reinterpret_cast<hwc2_context *>(device)->hwc2_dev;
+    return dev->get_changed_composition_types(display, out_num_elements,
+            out_layers, out_types);
 }
 
 hwc2_error_t get_client_target_support(hwc2_device_t* /*device*/,
@@ -144,13 +147,14 @@
     return dev->get_display_name(display, out_size, out_name);
 }
 
-hwc2_error_t get_display_requests(hwc2_device_t* /*device*/,
-        hwc2_display_t /*display*/,
-        hwc2_display_request_t* /*out_display_requests*/,
-        uint32_t* /*out_num_elements*/, hwc2_layer_t* /*out_layers*/,
-        hwc2_layer_request_t* /*out_layer_requests*/)
+hwc2_error_t get_display_requests(hwc2_device_t *device, hwc2_display_t display,
+        hwc2_display_request_t *out_display_requests,
+        uint32_t *out_num_elements, hwc2_layer_t *out_layers,
+        hwc2_layer_request_t *out_layer_requests)
 {
-    return HWC2_ERROR_NONE;
+    hwc2_dev *dev = reinterpret_cast<hwc2_context *>(device)->hwc2_dev;
+    return dev->get_display_requests(display, out_display_requests,
+            out_num_elements, out_layers, out_layer_requests);
 }
 
 hwc2_error_t get_display_type(hwc2_device_t *device, hwc2_display_t display,
diff --git a/hwc2/hwc2.h b/hwc2/hwc2.h
index 6c556c7..27e894b 100644
--- a/hwc2/hwc2.h
+++ b/hwc2/hwc2.h
@@ -381,6 +381,14 @@
                     uint32_t *out_num_requests);
     void         assign_composition();
 
+    hwc2_error_t get_changed_composition_types(uint32_t *out_num_elements,
+                    hwc2_layer_t *out_layers, hwc2_composition_t *out_types)
+                    const;
+    hwc2_error_t get_display_requests(
+                    hwc2_display_request_t *out_display_requests,
+                    uint32_t *out_num_elements, hwc2_layer_t *out_layers,
+                    hwc2_layer_request_t *out_layer_requests) const;
+    hwc2_error_t accept_display_changes();
 
     /* Window functions */
     void init_windows();
@@ -511,6 +519,14 @@
     /* Display present functions */
     hwc2_error_t validate_display(hwc2_display_t dpy_id,
                     uint32_t *out_num_types, uint32_t *out_num_requests);
+    hwc2_error_t get_changed_composition_types(hwc2_display_t dpy_id,
+                    uint32_t *out_num_elements, hwc2_layer_t *out_layers,
+                    hwc2_composition_t *out_types) const;
+    hwc2_error_t get_display_requests(hwc2_display_t dpy_id,
+                    hwc2_display_request_t *out_display_requests,
+                    uint32_t *out_num_elements, hwc2_layer_t *out_layers,
+                    hwc2_layer_request_t *out_layer_requests) const;
+    hwc2_error_t accept_display_changes(hwc2_display_t dpy_id);
 
     /* Config functions */
     hwc2_error_t get_display_attribute(hwc2_display_t dpy_id,
diff --git a/hwc2/hwc2_dev.cpp b/hwc2/hwc2_dev.cpp
index 2f58920..57e0d3a 100644
--- a/hwc2/hwc2_dev.cpp
+++ b/hwc2/hwc2_dev.cpp
@@ -121,6 +121,46 @@
     return it->second.validate_display(out_num_types, out_num_requests);
 }
 
+hwc2_error_t hwc2_dev::get_changed_composition_types(hwc2_display_t dpy_id,
+        uint32_t *out_num_elements, hwc2_layer_t *out_layers,
+        hwc2_composition_t *out_types) const
+{
+    auto it = displays.find(dpy_id);
+    if (it == displays.end()) {
+        ALOGE("dpy %" PRIu64 ": invalid display handle", dpy_id);
+        return HWC2_ERROR_BAD_DISPLAY;
+    }
+
+    return it->second.get_changed_composition_types(out_num_elements,
+            out_layers, out_types);
+}
+
+hwc2_error_t hwc2_dev::get_display_requests(hwc2_display_t dpy_id,
+        hwc2_display_request_t *out_display_requests,
+        uint32_t *out_num_elements, hwc2_layer_t *out_layers,
+        hwc2_layer_request_t *out_layer_requests) const
+{
+    auto it = displays.find(dpy_id);
+    if (it == displays.end()) {
+        ALOGE("dpy %" PRIu64 ": invalid display handle", dpy_id);
+        return HWC2_ERROR_BAD_DISPLAY;
+    }
+
+    return it->second.get_display_requests(out_display_requests,
+            out_num_elements, out_layers, out_layer_requests);
+}
+
+hwc2_error_t hwc2_dev::accept_display_changes(hwc2_display_t dpy_id)
+{
+    auto it = displays.find(dpy_id);
+    if (it == displays.end()) {
+        ALOGE("dpy %" PRIu64 ": invalid display handle", dpy_id);
+        return HWC2_ERROR_BAD_DISPLAY;
+    }
+
+    return it->second.accept_display_changes();
+}
+
 hwc2_error_t hwc2_dev::get_display_attribute(hwc2_display_t dpy_id,
         hwc2_config_t config, hwc2_attribute_t attribute, int32_t *out_value)
         const
diff --git a/hwc2/hwc2_display.cpp b/hwc2/hwc2_display.cpp
index fa8f0e9..1fc08e1 100644
--- a/hwc2/hwc2_display.cpp
+++ b/hwc2/hwc2_display.cpp
@@ -246,6 +246,65 @@
     } while (retry_assignment);
 }
 
+hwc2_error_t hwc2_display::get_changed_composition_types(
+        uint32_t *out_num_elements, hwc2_layer_t *out_layers,
+        hwc2_composition_t *out_types) const
+{
+    if (display_state == modified) {
+        ALOGE("dpy %" PRIu64 ": display has been modified since last call to"
+                " validate_display", id);
+        return HWC2_ERROR_NOT_VALIDATED;
+    }
+
+    if (!out_layers || !out_types) {
+        *out_num_elements = changed_comp_types.size();
+        return HWC2_ERROR_NONE;
+    }
+
+    size_t idx = 0;
+    for (auto &changed: changed_comp_types) {
+        out_layers[idx] = changed.first;
+        out_types[idx] = changed.second;
+        idx++;
+    }
+
+    *out_num_elements = changed_comp_types.size();
+    return HWC2_ERROR_NONE;
+}
+
+hwc2_error_t hwc2_display::get_display_requests(
+        hwc2_display_request_t *out_display_requests,
+        uint32_t *out_num_elements, hwc2_layer_t* /*out_layers*/,
+        hwc2_layer_request_t* /*out_layer_requests*/) const
+{
+    if (display_state == modified) {
+        ALOGE("dpy %" PRIu64 ": display has been modified since last call to"
+                " validate_display", id);
+        return HWC2_ERROR_NOT_VALIDATED;
+    }
+
+    *out_display_requests = static_cast<hwc2_display_request_t>(0);
+    *out_num_elements = 0;
+
+    return HWC2_ERROR_NONE;
+}
+
+hwc2_error_t hwc2_display::accept_display_changes()
+{
+    if (display_state == modified) {
+        ALOGE("dpy %" PRIu64 ": display has been modified since last call to"
+                " validate_display", id);
+        return HWC2_ERROR_NOT_VALIDATED;
+    }
+
+    for (auto &changed: changed_comp_types)
+        layers.find(changed.first)->second.set_comp_type(changed.second);
+
+    display_state = valid;
+
+    return HWC2_ERROR_NONE;
+}
+
 void hwc2_display::init_windows()
 {
     for (auto it = windows.begin(); it != windows.end(); it++)