From 79b56bcdd808986ce7e17e57a4fb3ad6e1a42102 Mon Sep 17 00:00:00 2001 From: Marissa Wall Date: Tue, 6 Sep 2016 11:08:00 -0700 Subject: hwc2: get and accept display changes If the client calls validate display and there are display changes/requests, the client can query the changes/requests and choose to accept them. 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: I2b8a49119b5efa7394e67e810592e840f18b81ae --- hwc2/hwc2.cpp | 30 ++++++++++++++------------ hwc2/hwc2.h | 16 ++++++++++++++ hwc2/hwc2_dev.cpp | 40 ++++++++++++++++++++++++++++++++++ hwc2/hwc2_display.cpp | 59 +++++++++++++++++++++++++++++++++++++++++++++++++++ 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(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(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(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(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++) -- cgit v1.2.3