diff options
author | Marissa Wall <marissaw@google.com> | 2016-09-07 12:24:06 -0700 |
---|---|---|
committer | Marissa Wall <marissaw@google.com> | 2017-03-02 13:06:21 -0800 |
commit | 9031c5046d364cd4e7e50557289fc4645e1e3f00 (patch) | |
tree | 277b0015d2bae5ae6833cb24c9e5c2412d553bfb | |
parent | f93cdd37b81b240144b49171ee6cd27d56e01b24 (diff) | |
download | flounder-9031c5046d364cd4e7e50557289fc4645e1e3f00.tar.gz |
hwc2: dump
Returns debug information that is displayed during `dumpsys SurfaceFlinger`.
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: Ib360640ee7b1d95a4be8b7043af98fa3761c89d4
-rw-r--r-- | hwc2/hwc2.cpp | 6 | ||||
-rw-r--r-- | hwc2/hwc2.h | 47 | ||||
-rw-r--r-- | hwc2/hwc2_buffer.cpp | 24 | ||||
-rw-r--r-- | hwc2/hwc2_config.cpp | 19 | ||||
-rw-r--r-- | hwc2/hwc2_dev.cpp | 122 | ||||
-rw-r--r-- | hwc2/hwc2_display.cpp | 41 | ||||
-rw-r--r-- | hwc2/hwc2_layer.cpp | 12 |
7 files changed, 237 insertions, 34 deletions
diff --git a/hwc2/hwc2.cpp b/hwc2/hwc2.cpp index 838cf78..53b191c 100644 --- a/hwc2/hwc2.cpp +++ b/hwc2/hwc2.cpp @@ -56,10 +56,10 @@ hwc2_error_t destroy_virtual_display(hwc2_device_t *device, return dev->destroy_virtual_display(display); } -void dump(hwc2_device_t* /*device*/, uint32_t* /*out_size*/, - char* /*out_buffer*/) +void dump(hwc2_device_t *device, uint32_t *out_size, char *out_buffer) { - return; + hwc2_dev *dev = reinterpret_cast<hwc2_context *>(device)->hwc2_dev; + dev->dump_hwc2(out_size, out_buffer); } uint32_t get_max_virtual_display_count(hwc2_device_t *device) diff --git a/hwc2/hwc2.h b/hwc2/hwc2.h index af5902a..2fe383d 100644 --- a/hwc2/hwc2.h +++ b/hwc2/hwc2.h @@ -17,13 +17,19 @@ #ifndef _HWC2_H #define _HWC2_H -#include <android-base/unique_fd.h> +#define HWC2_INCLUDE_STRINGIFICATION +#define HWC2_USE_CPP11 #include <hardware/hwcomposer2.h> +#undef HWC2_INCLUDE_STRINGIFICATION +#undef HWC2_USE_CPP11 + +#include <android-base/unique_fd.h> #include <unordered_map> #include <queue> #include <array> #include <vector> +#include <string> #include <mutex> #include <string> @@ -133,6 +139,8 @@ public: hwc2_buffer(); ~hwc2_buffer(); + std::string dump() const; + hwc2_error_t decompress(); hwc2_error_t get_adf_post_props(struct tegra_adf_flip_windowattr *win_attr, struct adf_buffer_config *adf_buf, size_t win_idx, @@ -231,6 +239,8 @@ class hwc2_config { public: hwc2_config(); + std::string dump() const; + int set_attribute(hwc2_attribute_t attribute, int32_t value); int32_t get_attribute(hwc2_attribute_t attribute) const; @@ -280,6 +290,8 @@ class hwc2_layer { public: hwc2_layer(hwc2_layer_t id); + std::string dump() const; + hwc2_error_t decompress_buffer(); hwc2_error_t get_adf_post_props(struct tegra_adf_flip_windowattr *win_attr, @@ -396,6 +408,8 @@ public: hwc2_display_type_t type, hwc2_power_mode_t power_mode); ~hwc2_display(); + std::string dump() const; + /* Display functions */ hwc2_display_t get_id() const { return id; } hwc2_display_type_t get_type() const { return type; } @@ -584,14 +598,17 @@ public: hwc2_dev(); ~hwc2_dev(); + std::string dump() const; + void dump_hwc2(uint32_t *out_size, char *out_buffer); + /* Display functions */ hwc2_error_t get_display_name(hwc2_display_t dpy_id, uint32_t *out_size, - char *out_name) const; + char *out_name); hwc2_error_t get_display_type(hwc2_display_t dpy_id, - hwc2_display_type_t *out_type) const; + hwc2_display_type_t *out_type); /* Virtual display functions */ - uint32_t get_max_virtual_display_count() const; + uint32_t get_max_virtual_display_count(); hwc2_error_t create_virtual_display(uint32_t width, uint32_t height, android_pixel_format_t *format, hwc2_display_t *out_display); @@ -601,45 +618,44 @@ public: /* Power modes */ hwc2_error_t set_power_mode(hwc2_display_t dpy_id, hwc2_power_mode_t mode); - hwc2_error_t get_doze_support(hwc2_display_t dpy_id, int32_t *out_support) - const; + hwc2_error_t get_doze_support(hwc2_display_t dpy_id, int32_t *out_support); /* 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_composition_t *out_types); 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_layer_request_t *out_layer_requests); hwc2_error_t accept_display_changes(hwc2_display_t dpy_id); hwc2_error_t present_display(hwc2_display_t dpy_id, int32_t *out_present_fence); hwc2_error_t get_release_fences(hwc2_display_t dpy_id, uint32_t *out_num_elements, hwc2_layer_t *out_layers, - int32_t *out_fences) const; + int32_t *out_fences); /* Config functions */ hwc2_error_t get_display_attribute(hwc2_display_t dpy_id, hwc2_config_t config, hwc2_attribute_t attribute, - int32_t *out_value) const; + int32_t *out_value); hwc2_error_t get_display_configs(hwc2_display_t dpy_id, - uint32_t *out_num_configs, hwc2_config_t *out_configs) const; + uint32_t *out_num_configs, hwc2_config_t *out_configs); hwc2_error_t get_active_config(hwc2_display_t dpy_id, - hwc2_config_t *out_config) const; + hwc2_config_t *out_config); hwc2_error_t set_active_config(hwc2_display_t dpy_id, hwc2_config_t config); /* Color/hdr functions */ hwc2_error_t get_color_modes(hwc2_display_t dpy_id, uint32_t *out_num_modes, - android_color_mode_t *out_modes) const; + android_color_mode_t *out_modes); hwc2_error_t set_color_mode(hwc2_display_t dpy_id, android_color_mode_t mode); hwc2_error_t get_hdr_capabilities(hwc2_display_t dpy_id, uint32_t *out_num_types, android_hdr_t *out_types, float *out_max_luminance, float *out_max_average_luminance, - float *out_min_luminance) const; + float *out_min_luminance); hwc2_error_t set_color_transform(hwc2_display_t dpy_id, const float *color_matrix, android_color_transform_t color_hint); @@ -707,6 +723,9 @@ private: /* The physical and virtual displays associated with this device */ std::unordered_map<hwc2_display_t, hwc2_display> displays; + /* String containing the dump output between calls */ + std::string dump_str; + /* The associated adf hardware composer helper */ struct adf_hwc_helper *adf_helper; diff --git a/hwc2/hwc2_buffer.cpp b/hwc2/hwc2_buffer.cpp index 1af83ee..8ed16af 100644 --- a/hwc2/hwc2_buffer.cpp +++ b/hwc2/hwc2_buffer.cpp @@ -19,6 +19,7 @@ #include <tegrafb.h> #include <tegra_adf.h> #include <android-base/macros.h> +#include <sstream> #include "hwc2.h" @@ -72,6 +73,29 @@ hwc2_buffer::~hwc2_buffer() close_acquire_fence(); } +std::string hwc2_buffer::dump() const +{ + std::stringstream dmp; + + dmp << " Buffer: " << std::hex << handle << "/" << std::dec + << acquire_fence << " Z: " << z_order << "\n"; + dmp << " Display Frame: [" << display_frame.left << ", " + << display_frame.top << ", " << display_frame.right << ", " + << display_frame.bottom << "]\n"; + dmp << " Source Crop: [" << source_crop.left << ", " + << source_crop.top << ", " << source_crop.right << ", " + << source_crop.bottom << "]\n"; + dmp << " Transform: " << getTransformName(transform) + << " Blend Mode: " << getBlendModeName(blend_mode); + + if (plane_alpha != 1.0f) + dmp << " Alpha: " << plane_alpha; + + dmp << "\n"; + + return dmp.str(); +} + hwc2_error_t hwc2_buffer::decompress() { int ret = hwc2_gralloc::get_instance().decompress(handle, acquire_fence, diff --git a/hwc2/hwc2_config.cpp b/hwc2/hwc2_config.cpp index 3801a62..cf84477 100644 --- a/hwc2/hwc2_config.cpp +++ b/hwc2/hwc2_config.cpp @@ -16,6 +16,9 @@ #include <cutils/log.h> +#include <iomanip> +#include <sstream> + #include "hwc2.h" hwc2_config::hwc2_config() @@ -25,6 +28,22 @@ hwc2_config::hwc2_config() dpi_x(-1), dpi_y(-1) { } +std::string hwc2_config::dump() const +{ + std::stringstream dmp; + + dmp << std::fixed << std::setprecision(1); + + dmp << " Resolution: " << width << " x " << height; + + if (vsync_period != 0) + dmp << " @ " << 1e9 / vsync_period << " Hz"; + + dmp << "\n DPI: " << dpi_x / 1000.0f << " x " << dpi_y / 1000.0f << "\n"; + + return dmp.str(); +} + int hwc2_config::set_attribute(hwc2_attribute_t attribute, int32_t value) { switch (attribute) { diff --git a/hwc2/hwc2_dev.cpp b/hwc2/hwc2_dev.cpp index 60af4cf..adffecf 100644 --- a/hwc2/hwc2_dev.cpp +++ b/hwc2/hwc2_dev.cpp @@ -17,6 +17,8 @@ #include <fcntl.h> #include <cutils/log.h> #include <inttypes.h> + +#include <sstream> #include <cstdlib> #include <vector> @@ -52,6 +54,7 @@ hwc2_dev::hwc2_dev() : state_mutex(), callback_handler(), displays(), + dump_str(), adf_helper(nullptr) { } hwc2_dev::~hwc2_dev() @@ -61,9 +64,38 @@ hwc2_dev::~hwc2_dev() hwc2_display::reset_ids(); } +std::string hwc2_dev::dump() const +{ + std::stringstream dmp; + + dmp << "NVIDIA HWC2:\n"; + for (auto &dpy: displays) + dmp << dpy.second.dump() << "\n"; + + return dmp.str(); +} + +void hwc2_dev::dump_hwc2(uint32_t *out_size, char *out_buffer) +{ + std::lock_guard<std::mutex> guard(state_mutex); + + if (!out_buffer) { + dump_str.clear(); + dump_str.append(dump()); + *out_size = dump_str.length(); + return; + } + + *out_size = (*out_size > dump_str.length())? dump_str.length(): *out_size; + dump_str.copy(out_buffer, *out_size); + dump_str.clear(); +} + hwc2_error_t hwc2_dev::get_display_name(hwc2_display_t dpy_id, uint32_t *out_size, - char *out_name) const + char *out_name) { + std::lock_guard<std::mutex> guard(state_mutex); + auto it = displays.find(dpy_id); if (it == displays.end()) { ALOGE("dpy %" PRIu64 ": invalid display handle", dpy_id); @@ -74,8 +106,10 @@ hwc2_error_t hwc2_dev::get_display_name(hwc2_display_t dpy_id, uint32_t *out_siz } hwc2_error_t hwc2_dev::get_display_type(hwc2_display_t dpy_id, - hwc2_display_type_t *out_type) const + hwc2_display_type_t *out_type) { + std::lock_guard<std::mutex> guard(state_mutex); + auto it = displays.find(dpy_id); if (it == displays.end()) { ALOGE("dpy %" PRIu64 ": invalid display handle", dpy_id); @@ -86,7 +120,7 @@ hwc2_error_t hwc2_dev::get_display_type(hwc2_display_t dpy_id, return HWC2_ERROR_NONE; } -uint32_t hwc2_dev::get_max_virtual_display_count() const +uint32_t hwc2_dev::get_max_virtual_display_count() { return 0; } @@ -130,8 +164,10 @@ hwc2_error_t hwc2_dev::set_power_mode(hwc2_display_t dpy_id, } hwc2_error_t hwc2_dev::get_doze_support(hwc2_display_t dpy_id, - int32_t *out_support) const + int32_t *out_support) { + std::lock_guard<std::mutex> guard(state_mutex); + auto it = displays.find(dpy_id); if (it == displays.end()) { ALOGE("dpy %" PRIu64 ": invalid display handle", dpy_id); @@ -144,6 +180,8 @@ hwc2_error_t hwc2_dev::get_doze_support(hwc2_display_t dpy_id, hwc2_error_t hwc2_dev::validate_display(hwc2_display_t dpy_id, uint32_t *out_num_types, uint32_t *out_num_requests) { + std::lock_guard<std::mutex> guard(state_mutex); + auto it = displays.find(dpy_id); if (it == displays.end()) { ALOGE("dpy %" PRIu64 ": invalid display handle", dpy_id); @@ -155,8 +193,10 @@ hwc2_error_t hwc2_dev::validate_display(hwc2_display_t dpy_id, 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 + hwc2_composition_t *out_types) { + std::lock_guard<std::mutex> guard(state_mutex); + auto it = displays.find(dpy_id); if (it == displays.end()) { ALOGE("dpy %" PRIu64 ": invalid display handle", dpy_id); @@ -170,8 +210,10 @@ hwc2_error_t hwc2_dev::get_changed_composition_types(hwc2_display_t dpy_id, 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 + hwc2_layer_request_t *out_layer_requests) { + std::lock_guard<std::mutex> guard(state_mutex); + auto it = displays.find(dpy_id); if (it == displays.end()) { ALOGE("dpy %" PRIu64 ": invalid display handle", dpy_id); @@ -184,6 +226,8 @@ hwc2_error_t hwc2_dev::get_display_requests(hwc2_display_t dpy_id, hwc2_error_t hwc2_dev::accept_display_changes(hwc2_display_t dpy_id) { + std::lock_guard<std::mutex> guard(state_mutex); + auto it = displays.find(dpy_id); if (it == displays.end()) { ALOGE("dpy %" PRIu64 ": invalid display handle", dpy_id); @@ -209,8 +253,10 @@ hwc2_error_t hwc2_dev::present_display(hwc2_display_t dpy_id, hwc2_error_t hwc2_dev::get_release_fences(hwc2_display_t dpy_id, uint32_t *out_num_elements, hwc2_layer_t *out_layers, - int32_t *out_fences) const + int32_t *out_fences) { + std::lock_guard<std::mutex> guard(state_mutex); + auto it = displays.find(dpy_id); if (it == displays.end()) { ALOGE("dpy %" PRIu64 ": invalid display handle", dpy_id); @@ -223,8 +269,9 @@ hwc2_error_t hwc2_dev::get_release_fences(hwc2_display_t dpy_id, 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 { + std::lock_guard<std::mutex> guard(state_mutex); + auto it = displays.find(dpy_id); if (it == displays.end()) { ALOGE("dpy %" PRIu64 ": invalid display handle", dpy_id); @@ -235,8 +282,10 @@ hwc2_error_t hwc2_dev::get_display_attribute(hwc2_display_t dpy_id, } hwc2_error_t hwc2_dev::get_display_configs(hwc2_display_t dpy_id, - uint32_t *out_num_configs, hwc2_config_t *out_configs) const + uint32_t *out_num_configs, hwc2_config_t *out_configs) { + std::lock_guard<std::mutex> guard(state_mutex); + auto it = displays.find(dpy_id); if (it == displays.end()) { ALOGE("dpy %" PRIu64 ": invalid display handle", dpy_id); @@ -247,8 +296,10 @@ hwc2_error_t hwc2_dev::get_display_configs(hwc2_display_t dpy_id, } hwc2_error_t hwc2_dev::get_active_config(hwc2_display_t dpy_id, - hwc2_config_t *out_config) const + hwc2_config_t *out_config) { + std::lock_guard<std::mutex> guard(state_mutex); + auto it = displays.find(dpy_id); if (it == displays.end()) { ALOGE("dpy %" PRIu64 ": invalid display handle", dpy_id); @@ -261,6 +312,8 @@ hwc2_error_t hwc2_dev::get_active_config(hwc2_display_t dpy_id, hwc2_error_t hwc2_dev::set_active_config(hwc2_display_t dpy_id, hwc2_config_t config) { + std::lock_guard<std::mutex> guard(state_mutex); + auto it = displays.find(dpy_id); if (it == displays.end()) { ALOGE("dpy %" PRIu64 ": invalid display handle", dpy_id); @@ -271,8 +324,10 @@ hwc2_error_t hwc2_dev::set_active_config(hwc2_display_t dpy_id, } hwc2_error_t hwc2_dev::get_color_modes(hwc2_display_t dpy_id, - uint32_t *out_num_modes, android_color_mode_t *out_modes) const + uint32_t *out_num_modes, android_color_mode_t *out_modes) { + std::lock_guard<std::mutex> guard(state_mutex); + auto it = displays.find(dpy_id); if (it == displays.end()) { ALOGE("dpy %" PRIu64 ": invalid display handle", dpy_id); @@ -285,6 +340,8 @@ hwc2_error_t hwc2_dev::get_color_modes(hwc2_display_t dpy_id, hwc2_error_t hwc2_dev::set_color_mode(hwc2_display_t dpy_id, android_color_mode_t mode) { + std::lock_guard<std::mutex> guard(state_mutex); + auto it = displays.find(dpy_id); if (it == displays.end()) { ALOGE("dpy %" PRIu64 ": invalid display handle", dpy_id); @@ -297,8 +354,10 @@ hwc2_error_t hwc2_dev::set_color_mode(hwc2_display_t dpy_id, hwc2_error_t hwc2_dev::get_hdr_capabilities(hwc2_display_t dpy_id, uint32_t *out_num_types, android_hdr_t *out_types, float *out_max_luminance, float *out_max_average_luminance, - float *out_min_luminance) const + float *out_min_luminance) { + std::lock_guard<std::mutex> guard(state_mutex); + auto it = displays.find(dpy_id); if (it == displays.end()) { ALOGE("dpy %" PRIu64 ": invalid display handle", dpy_id); @@ -313,6 +372,8 @@ hwc2_error_t hwc2_dev::get_hdr_capabilities(hwc2_display_t dpy_id, hwc2_error_t hwc2_dev::set_color_transform(hwc2_display_t dpy_id, const float *color_matrix, android_color_transform_t color_hint) { + std::lock_guard<std::mutex> guard(state_mutex); + auto it = displays.find(dpy_id); if (it == displays.end()) { ALOGE("dpy %" PRIu64 ": invalid display handle", dpy_id); @@ -326,6 +387,8 @@ hwc2_error_t hwc2_dev::get_client_target_support(hwc2_display_t dpy_id, uint32_t width, uint32_t height, android_pixel_format_t format, android_dataspace_t dataspace) { + std::lock_guard<std::mutex> guard(state_mutex); + auto it = displays.find(dpy_id); if (it == displays.end()) { ALOGE("dpy %" PRIu64 ": invalid display handle", dpy_id); @@ -340,6 +403,8 @@ hwc2_error_t hwc2_dev::set_client_target(hwc2_display_t dpy_id, buffer_handle_t target, int32_t acquire_fence, android_dataspace_t dataspace, const hwc_region_t &surface_damage) { + std::lock_guard<std::mutex> guard(state_mutex); + auto it = displays.find(dpy_id); if (it == displays.end()) { ALOGE("dpy %" PRIu64 ": invalid display handle", dpy_id); @@ -352,6 +417,8 @@ hwc2_error_t hwc2_dev::set_client_target(hwc2_display_t dpy_id, hwc2_error_t hwc2_dev::create_layer(hwc2_display_t dpy_id, hwc2_layer_t *out_layer) { + std::lock_guard<std::mutex> guard(state_mutex); + auto it = displays.find(dpy_id); if (it == displays.end()) { ALOGE("dpy %" PRIu64 ": invalid display handle", dpy_id); @@ -363,6 +430,8 @@ hwc2_error_t hwc2_dev::create_layer(hwc2_display_t dpy_id, hwc2_layer_t *out_lay hwc2_error_t hwc2_dev::destroy_layer(hwc2_display_t dpy_id, hwc2_layer_t lyr_id) { + std::lock_guard<std::mutex> guard(state_mutex); + auto it = displays.find(dpy_id); if (it == displays.end()) { ALOGE("dpy %" PRIu64 ": invalid display handle", dpy_id); @@ -375,6 +444,7 @@ hwc2_error_t hwc2_dev::destroy_layer(hwc2_display_t dpy_id, hwc2_layer_t lyr_id) hwc2_error_t hwc2_dev::set_layer_composition_type(hwc2_display_t dpy_id, hwc2_layer_t lyr_id, hwc2_composition_t comp_type) { + std::lock_guard<std::mutex> guard(state_mutex); return displays.find(dpy_id)->second.set_layer_composition_type(lyr_id, comp_type); } @@ -382,6 +452,7 @@ hwc2_error_t hwc2_dev::set_layer_composition_type(hwc2_display_t dpy_id, hwc2_error_t hwc2_dev::set_layer_buffer(hwc2_display_t dpy_id, hwc2_layer_t lyr_id, buffer_handle_t handle, int32_t acquire_fence) { + std::lock_guard<std::mutex> guard(state_mutex); return displays.find(dpy_id)->second.set_layer_buffer(lyr_id, handle, acquire_fence); } @@ -389,12 +460,14 @@ hwc2_error_t hwc2_dev::set_layer_buffer(hwc2_display_t dpy_id, hwc2_error_t hwc2_dev::set_layer_dataspace(hwc2_display_t dpy_id, hwc2_layer_t lyr_id, android_dataspace_t dataspace) { + std::lock_guard<std::mutex> guard(state_mutex); 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) { + std::lock_guard<std::mutex> guard(state_mutex); return displays.find(dpy_id)->second.set_layer_display_frame(lyr_id, display_frame); } @@ -402,6 +475,7 @@ hwc2_error_t hwc2_dev::set_layer_display_frame(hwc2_display_t dpy_id, hwc2_error_t hwc2_dev::set_layer_source_crop(hwc2_display_t dpy_id, hwc2_layer_t lyr_id, const hwc_frect_t &source_crop) { + std::lock_guard<std::mutex> guard(state_mutex); return displays.find(dpy_id)->second.set_layer_source_crop(lyr_id, source_crop); } @@ -409,12 +483,14 @@ hwc2_error_t hwc2_dev::set_layer_source_crop(hwc2_display_t dpy_id, hwc2_error_t hwc2_dev::set_layer_z_order(hwc2_display_t dpy_id, hwc2_layer_t lyr_id, uint32_t z_order) { + std::lock_guard<std::mutex> guard(state_mutex); 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) { + std::lock_guard<std::mutex> guard(state_mutex); return displays.find(dpy_id)->second.set_layer_surface_damage(lyr_id, surface_damage); } @@ -422,6 +498,7 @@ hwc2_error_t hwc2_dev::set_layer_surface_damage(hwc2_display_t dpy_id, 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) { + std::lock_guard<std::mutex> guard(state_mutex); return displays.find(dpy_id)->second.set_layer_blend_mode(lyr_id, blend_mode); } @@ -429,6 +506,7 @@ hwc2_error_t hwc2_dev::set_layer_blend_mode(hwc2_display_t dpy_id, hwc2_error_t hwc2_dev::set_layer_plane_alpha(hwc2_display_t dpy_id, hwc2_layer_t lyr_id, float plane_alpha) { + std::lock_guard<std::mutex> guard(state_mutex); return displays.find(dpy_id)->second.set_layer_plane_alpha(lyr_id, plane_alpha); } @@ -436,12 +514,14 @@ hwc2_error_t hwc2_dev::set_layer_plane_alpha(hwc2_display_t dpy_id, hwc2_error_t hwc2_dev::set_layer_transform(hwc2_display_t dpy_id, hwc2_layer_t lyr_id, const hwc_transform_t transform) { + std::lock_guard<std::mutex> guard(state_mutex); return displays.find(dpy_id)->second.set_layer_transform(lyr_id, transform); } hwc2_error_t hwc2_dev::set_layer_visible_region(hwc2_display_t dpy_id, hwc2_layer_t lyr_id, const hwc_region_t &visible_region) { + std::lock_guard<std::mutex> guard(state_mutex); return displays.find(dpy_id)->second.set_layer_visible_region(lyr_id, visible_region); } @@ -486,11 +566,15 @@ void hwc2_dev::hotplug(hwc2_display_t dpy_id, hwc2_connection_t connection) void hwc2_dev::vsync(hwc2_display_t dpy_id, uint64_t timestamp) { - auto it = displays.find(dpy_id); - if (it == displays.end()) { - ALOGW("dpy %" PRIu64 ": invalid display handle preventing vsync" - " callback", dpy_id); - return; + { + std::lock_guard<std::mutex> guard(state_mutex); + + auto it = displays.find(dpy_id); + if (it == displays.end()) { + ALOGW("dpy %" PRIu64 ": invalid display handle preventing vsync" + " callback", dpy_id); + return; + } } callback_handler.call_vsync(dpy_id, timestamp); @@ -499,6 +583,8 @@ void hwc2_dev::vsync(hwc2_display_t dpy_id, uint64_t timestamp) hwc2_error_t hwc2_dev::set_vsync_enabled(hwc2_display_t dpy_id, hwc2_vsync_t enabled) { + std::lock_guard<std::mutex> guard(state_mutex); + auto it = displays.find(dpy_id); if (it == displays.end()) { ALOGE("dpy %" PRIu64 ": invalid display handle", dpy_id); @@ -552,6 +638,8 @@ int hwc2_dev::open_adf_device() adf_id_t *dev_ids = nullptr; int ret; + std::lock_guard<std::mutex> guard(state_mutex); + ssize_t n_devs = adf_devices(&dev_ids); if (n_devs < 0) { ALOGE("failed to enumerate adf devices: %s", strerror(n_devs)); diff --git a/hwc2/hwc2_display.cpp b/hwc2/hwc2_display.cpp index 0bed1e9..707dca9 100644 --- a/hwc2/hwc2_display.cpp +++ b/hwc2/hwc2_display.cpp @@ -18,6 +18,7 @@ #include <tegra_adf.h> #include <inttypes.h> +#include <sstream> #include <cstdlib> #include <map> #include <vector> @@ -60,6 +61,46 @@ hwc2_display::~hwc2_display() adf_device_close(&adf_dev); } +std::string hwc2_display::dump() const +{ + std::stringstream dmp; + + dmp << "Display [" << id << "] " << getDisplayTypeName(type) << ":\n"; + + dmp << " Power Mode: " << getPowerModeName(power_mode) << "\n"; + + dmp << " Active Config:"; + + auto it = configs.begin(); + if (configs.size() > 0 || it != configs.end()) + dmp << "\n" << configs.at(active_config).dump(); + else + dmp << " None\n"; + + if (power_mode == HWC2_POWER_MODE_OFF) + return dmp.str(); + + size_t idx = 0; + for (auto &win: windows) { + dmp << " Window [" << idx << "]:"; + + if (win.contains_layer()) { + dmp << " Layer\n"; + dmp << layers.at(win.get_layer()).dump(); + + } else if (win.contains_client_target()) { + dmp << " Client Target\n"; + dmp << client_target.dump(); + + } else + dmp << " Unused\n"; + + idx++; + } + + return dmp.str(); +} + hwc2_error_t hwc2_display::set_connection(hwc2_connection_t connection) { if (connection == HWC2_CONNECTION_INVALID) { diff --git a/hwc2/hwc2_layer.cpp b/hwc2/hwc2_layer.cpp index 2c24d95..e97aab5 100644 --- a/hwc2/hwc2_layer.cpp +++ b/hwc2/hwc2_layer.cpp @@ -17,6 +17,8 @@ #include <inttypes.h> #include <cutils/log.h> +#include <sstream> + #include "hwc2.h" uint64_t hwc2_layer::layer_cnt = 0; @@ -27,6 +29,16 @@ hwc2_layer::hwc2_layer(hwc2_layer_t id) comp_type(HWC2_COMPOSITION_INVALID), modified(true) { } +std::string hwc2_layer::dump() const +{ + std::stringstream dmp; + + dmp << " Composition Type: " << getCompositionName(comp_type) << "\n"; + dmp << buffer.dump(); + + return dmp.str(); +} + hwc2_error_t hwc2_layer::decompress_buffer() { return buffer.decompress(); |