summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarissa Wall <marissaw@google.com>2017-03-02 22:10:16 +0000
committerandroid-build-merger <android-build-merger@google.com>2017-03-02 22:10:16 +0000
commita543e39405b43b7746569ed3b09629888675e428 (patch)
tree26b32cd5835397644163d17e4bc54b368aadc4b1
parent7290fc0f9715545e409100fd54a5a5880d2479f5 (diff)
parent79b56bcdd808986ce7e17e57a4fb3ad6e1a42102 (diff)
downloadflounder-a543e39405b43b7746569ed3b09629888675e428.tar.gz
hwc2: get and accept display changes
am: 79b56bcdd8 Change-Id: Ifd8779bdeee4b2b85911865272bcf1e9cb593cd9
-rw-r--r--hwc2/hwc2.cpp30
-rw-r--r--hwc2/hwc2.h16
-rw-r--r--hwc2/hwc2_dev.cpp40
-rw-r--r--hwc2/hwc2_display.cpp59
4 files changed, 132 insertions, 13 deletions
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 @@ hwc2_error_t register_callback(hwc2_device_t *device,
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 @@ hwc2_error_t get_active_config(hwc2_device_t *device, hwc2_display_t display,
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 @@ hwc2_error_t get_display_name(hwc2_device_t *device, hwc2_display_t display,
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 @@ public:
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 @@ public:
/* 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 @@ hwc2_error_t hwc2_dev::validate_display(hwc2_display_t dpy_id,
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 @@ void hwc2_display::assign_composition()
} 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++)