summaryrefslogtreecommitdiff
path: root/services/config/src/client_impl.cpp
diff options
context:
space:
mode:
authorGurkaran Singh <gurksing@codeaurora.org>2021-07-02 18:01:56 -0400
committeralk3pInjection <webmaster@raspii.tech>2023-09-07 17:06:48 +0800
commita62f581a47df568aea6fba3d5760235c99e637ce (patch)
tree58ea391384271dbee8863f0411212824deb8bc49 /services/config/src/client_impl.cpp
parent3b38ba006653a7a94f16cf5881e02459d8494bd4 (diff)
vendor-freeze: Move few commonsys-intf libs to commonsysumineko-8150tachibana-8150
Moved libdisplayconfig.qti, libqdMetadata, and libgralloc.qti from vendor/qcom/opensource/commonsys-intf/display to hardware/qcom/display to install in vendor Change-Id: I0627decb40a2d355157ac6909479765781cbdd6b LNXDISPLAY-1552: REQ002 CRs-Fixed: 2972776 (cherry picked from commit ba7898d5e88d0a81f972558811b9d7acaae11ba0)
Diffstat (limited to 'services/config/src/client_impl.cpp')
-rw-r--r--services/config/src/client_impl.cpp1066
1 files changed, 1066 insertions, 0 deletions
diff --git a/services/config/src/client_impl.cpp b/services/config/src/client_impl.cpp
new file mode 100644
index 00000000..ad0b1fb7
--- /dev/null
+++ b/services/config/src/client_impl.cpp
@@ -0,0 +1,1066 @@
+/*
+* Copyright (c) 2020-2021 The Linux Foundation. All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following conditions are
+* met:
+* * Redistributions of source code must retain the above copyright
+* notice, this list of conditions and the following disclaimer.
+* * Redistributions in binary form must reproduce the above
+* copyright notice, this list of conditions and the following
+* disclaimer in the documentation and/or other materials provided
+* with the distribution.
+* * Neither the name of The Linux Foundation. nor the names of its
+* contributors may be used to endorse or promote products derived
+* from this software without specific prior written permission.
+*
+* THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
+* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
+* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
+* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+* BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
+* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+* IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+#include <string>
+#include <vector>
+
+#include "client_impl.h"
+
+namespace DisplayConfig {
+
+int ClientImpl::Init(std::string client_name, ConfigCallback *callback) {
+ display_config_ = IDisplayConfig::getService();
+ // Unable to find Display Config 2.0 service. Fail Init.
+ if (!display_config_) {
+ return -1;
+ }
+ int32_t error = 0;
+ uint64_t handle = 0;
+ auto hidl_callback = [&error, &handle] (int32_t err, uint64_t client_handle) {
+ error = err;
+ handle = client_handle;
+ };
+ int pid = getpid();
+ android::sp<ClientCallback> client_cb(new ClientCallback(callback));
+ display_config_->registerClient(client_name + std::to_string(pid), client_cb,
+ hidl_callback);
+ client_handle_ = handle;
+
+ return 0;
+}
+
+void ClientImpl::DeInit() {
+ int32_t error = 0;
+ auto hidl_cb = [&error] (int32_t err, ByteStream params, HandleStream handles) {
+ error = err;
+ };
+
+ display_config_->perform(client_handle_, kDestroy, {}, {}, hidl_cb);
+ display_config_.clear();
+ display_config_ = nullptr;
+}
+
+int ClientImpl::IsDisplayConnected(DisplayType dpy, bool *connected) {
+ ByteStream input_params;
+ input_params.setToExternal(reinterpret_cast<uint8_t*>(&dpy), sizeof(DisplayType));
+ const bool *output;
+ ByteStream output_params;
+ int error = 0;
+ auto hidl_cb = [&error, &output_params] (int32_t err, ByteStream params, HandleStream handles) {
+ error = err;
+ output_params = params;
+ };
+
+ display_config_->perform(client_handle_, kIsDisplayConnected, input_params, {}, hidl_cb);
+ const uint8_t *data = output_params.data();
+ output = reinterpret_cast<const bool*>(data);
+
+ if (!error) {
+ *connected = *output;
+ }
+
+ return error;
+}
+
+int ClientImpl::SetDisplayStatus(DisplayType dpy, ExternalStatus status) {
+ struct StatusParams input = {dpy, status};
+ ByteStream input_params;
+ input_params.setToExternal(reinterpret_cast<uint8_t*>(&input), sizeof(struct StatusParams));
+ int error = 0;
+
+ auto hidl_cb = [&error] (int32_t err, ByteStream params, HandleStream handles) {
+ error = err;
+ };
+
+ display_config_->perform(client_handle_, kSetDisplayStatus, input_params, {}, hidl_cb);
+
+ return error;
+}
+
+int ClientImpl::ConfigureDynRefreshRate(DynRefreshRateOp op, uint32_t refresh_rate) {
+ struct DynRefreshRateParams input = {op, refresh_rate};
+ ByteStream input_params;
+ input_params.setToExternal(reinterpret_cast<uint8_t*>(&input),
+ sizeof(struct DynRefreshRateParams));
+ int error = 0;
+
+ auto hidl_cb = [&error] (int32_t err, ByteStream params, HandleStream handles) {
+ error = err;
+ };
+
+ display_config_->perform(client_handle_, kConfigureDynRefreshRate, input_params, {}, hidl_cb);
+
+ return error;
+}
+
+int ClientImpl::GetConfigCount(DisplayType dpy, uint32_t *count) {
+ ByteStream input_params;
+ input_params.setToExternal(reinterpret_cast<uint8_t*>(&dpy), sizeof(DisplayType));
+ const uint32_t *output;
+ ByteStream output_params;
+ int error = 0;
+ auto hidl_cb = [&error, &output_params] (int32_t err, ByteStream params, HandleStream handles) {
+ error = err;
+ output_params = params;
+ };
+
+ display_config_->perform(client_handle_, kGetConfigCount, input_params, {}, hidl_cb);
+
+ const uint8_t *data = output_params.data();
+ output = reinterpret_cast<const uint32_t*>(data);
+ *count = *output;
+
+ return error;
+}
+
+int ClientImpl::GetActiveConfig(DisplayType dpy, uint32_t *config) {
+ if (!config) {
+ return -EINVAL;
+ }
+
+ ByteStream input_params;
+ input_params.setToExternal(reinterpret_cast<uint8_t*>(&dpy), sizeof(DisplayType));
+ const uint32_t *output;
+ ByteStream output_params;
+ int error = 0;
+ auto hidl_cb = [&error, &output_params] (int32_t err, ByteStream params, HandleStream handles) {
+ error = err;
+ output_params = params;
+ };
+
+ if (display_config_) {
+ display_config_->perform(client_handle_, kGetActiveConfig, input_params, {}, hidl_cb);
+ }
+
+ if (!error) {
+ const uint8_t *data = output_params.data();
+ output = reinterpret_cast<const uint32_t*>(data);
+ *config = *output;
+ }
+
+ return error;
+}
+
+int ClientImpl::SetActiveConfig(DisplayType dpy, uint32_t config) {
+ struct ConfigParams input = {dpy, config};
+ ByteStream input_params;
+ input_params.setToExternal(reinterpret_cast<uint8_t*>(&input), sizeof(struct ConfigParams));
+ int error = 0;
+ auto hidl_cb = [&error] (int32_t err, ByteStream params, HandleStream handles) {
+ error = err;
+ };
+
+ display_config_->perform(client_handle_, kSetActiveConfig, input_params, {}, hidl_cb);
+
+ return error;
+}
+
+int ClientImpl::GetDisplayAttributes(uint32_t config_index, DisplayType dpy,
+ Attributes *attributes) {
+ struct AttributesParams input = {config_index, dpy};
+ ByteStream input_params;
+ input_params.setToExternal(reinterpret_cast<uint8_t*>(&input), sizeof(struct AttributesParams));
+ const struct Attributes *output;
+ ByteStream output_params;
+ int error = 0;
+ auto hidl_cb = [&error, &output_params] (int32_t err, ByteStream params, HandleStream handles) {
+ error = err;
+ output_params = params;
+ };
+
+ display_config_->perform(client_handle_, kGetDisplayAttributes, input_params, {}, hidl_cb);
+
+ const uint8_t *data = output_params.data();
+ output = reinterpret_cast<const Attributes*>(data);
+ if (!error) {
+ *attributes = *output;
+ }
+
+ return error;
+}
+
+int ClientImpl::SetPanelBrightness(uint32_t level) {
+ ByteStream input_params;
+ input_params.setToExternal(reinterpret_cast<uint8_t*>(&level), sizeof(uint32_t));
+ int error = 0;
+ auto hidl_cb = [&error] (int32_t err, ByteStream params, HandleStream handles) {
+ error = err;
+ };
+
+ display_config_->perform(client_handle_, kSetPanelBrightness, input_params, {}, hidl_cb);
+
+ return error;
+}
+
+int ClientImpl::GetPanelBrightness(uint32_t *level) {
+ const uint32_t *output;
+ ByteStream output_params;
+ int error = 0;
+ auto hidl_cb = [&error, &output_params] (int32_t err, ByteStream params, HandleStream handles) {
+ error = err;
+ output_params = params;
+ };
+
+ display_config_->perform(client_handle_, kGetPanelBrightness, {}, {}, hidl_cb);
+
+ const uint8_t *data = output_params.data();
+ output = reinterpret_cast<const uint32_t*>(data);
+ if (!error) {
+ *level = *output;
+ }
+
+ return error;
+}
+
+int ClientImpl::MinHdcpEncryptionLevelChanged(DisplayType dpy, uint32_t min_enc_level) {
+ struct MinHdcpEncLevelChangedParams input = {dpy, min_enc_level};
+ ByteStream input_params;
+ input_params.setToExternal(reinterpret_cast<uint8_t*>(&input),
+ sizeof(struct MinHdcpEncLevelChangedParams));
+ int error = 0;
+ auto hidl_cb = [&error] (int32_t err, ByteStream params, HandleStream handles) {
+ error = err;
+ };
+
+ display_config_->perform(client_handle_, kMinHdcpEncryptionLevelChanged,
+ input_params, {}, hidl_cb);
+
+ return error;
+}
+
+int ClientImpl::RefreshScreen() {
+ int error = 0;
+ auto hidl_cb = [&error] (int32_t err, ByteStream params, HandleStream handles) {
+ error = err;
+ };
+
+ display_config_->perform(client_handle_, kRefreshScreen, {}, {}, hidl_cb);
+
+ return error;
+}
+
+int ClientImpl::ControlPartialUpdate(DisplayType dpy, bool enable) {
+ struct PartialUpdateParams input = {dpy, enable};
+ ByteStream input_params;
+ input_params.setToExternal(reinterpret_cast<uint8_t*>(&input),
+ sizeof(struct PartialUpdateParams));
+ int error = 0;
+ auto hidl_cb = [&error] (int32_t err, ByteStream params, HandleStream handles) {
+ error = err;
+ };
+
+ display_config_->perform(client_handle_, kControlPartialUpdate, input_params, {}, hidl_cb);
+
+ return error;
+}
+
+int ClientImpl::ToggleScreenUpdate(bool on) {
+ ByteStream input_params;
+ input_params.setToExternal(reinterpret_cast<uint8_t*>(&on), sizeof(bool));
+ int error = 0;
+ auto hidl_cb = [&error] (int32_t err, ByteStream params, HandleStream handles) {
+ error = err;
+ };
+
+ display_config_->perform(client_handle_, kToggleScreenUpdate, input_params, {}, hidl_cb);
+
+ return error;
+}
+
+int ClientImpl::SetIdleTimeout(uint32_t value) {
+ ByteStream input_params;
+ input_params.setToExternal(reinterpret_cast<uint8_t*>(&value), sizeof(uint32_t));
+ int error = 0;
+ auto hidl_cb = [&error] (int32_t err, ByteStream params, HandleStream handles) {
+ error = err;
+ };
+
+ display_config_->perform(client_handle_, kSetIdleTimeout, input_params, {}, hidl_cb);
+
+ return error;
+}
+
+int ClientImpl::GetHDRCapabilities(DisplayType dpy, HDRCapsParams *caps) {
+ ByteStream input_params;
+ input_params.setToExternal(reinterpret_cast<uint8_t*>(&dpy), sizeof(DisplayType));
+ ByteStream output_params;
+ int error = 0;
+ auto hidl_cb = [&error, &output_params] (int32_t err, ByteStream params, HandleStream handles) {
+ error = err;
+ output_params = params;
+ };
+
+ display_config_->perform(client_handle_, kGetHdrCapabilities, input_params, {}, hidl_cb);
+
+ const uint8_t *data = output_params.data();
+
+ if (!error) {
+ const int32_t *hdr_caps;
+ const float *lum;
+ size_t size = output_params.size();
+ size_t hdr_caps_size = size - 3 * sizeof(float);
+ hdr_caps_size /= sizeof(int32_t);
+ hdr_caps = reinterpret_cast<const int32_t*>(data);
+ for (size_t i = 0; i < hdr_caps_size; i++) {
+ caps->supported_hdr_types.push_back(*hdr_caps);
+ hdr_caps++;
+ }
+ lum = reinterpret_cast<const float *>(hdr_caps);
+ caps->max_luminance = lum[0];
+ caps->max_avg_luminance = lum[1];
+ caps->min_luminance = lum[2];
+ }
+
+ return error;
+}
+
+int ClientImpl::SetCameraLaunchStatus(uint32_t on) {
+ ByteStream input_params;
+ input_params.setToExternal(reinterpret_cast<uint8_t*>(&on), sizeof(uint32_t));
+ int error = 0;
+ auto hidl_cb = [&error] (int32_t err, ByteStream params, HandleStream handles) {
+ error = err;
+ };
+
+ display_config_->perform(client_handle_, kSetCameraLaunchStatus, input_params, {}, hidl_cb);
+
+ return error;
+}
+
+int ClientImpl::DisplayBWTransactionPending(bool *status) {
+ const bool *output;
+ ByteStream output_params;
+ int error = 0;
+ auto hidl_cb = [&error, &output_params] (int32_t err, ByteStream params, HandleStream handles) {
+ error = err;
+ output_params = params;
+ };
+
+ display_config_->perform(client_handle_, kDisplayBwTransactionPending, {}, {}, hidl_cb);
+
+ const uint8_t *data = output_params.data();
+ output = reinterpret_cast<const bool*>(data);
+ if (!error) {
+ *status = *output;
+ }
+
+ return error;
+}
+
+int ClientImpl::SetDisplayAnimating(uint64_t display_id, bool animating) {
+ struct AnimationParams input = {display_id, animating};
+ ByteStream input_params;
+ input_params.setToExternal(reinterpret_cast<uint8_t*>(&input), sizeof(struct AnimationParams));
+ int error = 0;
+ auto hidl_cb = [&error] (int32_t err, ByteStream params, HandleStream handles) {
+ error = err;
+ };
+
+ display_config_->perform(client_handle_, kSetDisplayAnimating, input_params, {}, hidl_cb);
+
+ return error;
+}
+
+int ClientImpl::ControlIdlePowerCollapse(bool enable, bool synchronous) {
+ struct IdlePcParams input = {enable, synchronous};
+ ByteStream input_params;
+ input_params.setToExternal(reinterpret_cast<uint8_t*>(&input), sizeof(struct IdlePcParams));
+ int error = 0;
+ auto hidl_cb = [&error] (int32_t err, ByteStream params, HandleStream handles) {
+ error = err;
+ };
+
+ display_config_->perform(client_handle_, kControlIdlePowerCollapse, input_params, {}, hidl_cb);
+
+ return error;
+}
+
+int ClientImpl::GetWriteBackCapabilities(bool *is_wb_ubwc_supported) {
+ const bool *output;
+ ByteStream output_params;
+ int error = 0;
+ auto hidl_cb = [&error, &output_params] (int32_t err, ByteStream params, HandleStream handles) {
+ error = err;
+ output_params = params;
+ };
+
+ display_config_->perform(client_handle_, kGetWritebackCapabilities, {}, {}, hidl_cb);
+
+ const uint8_t *data = output_params.data();
+ output = reinterpret_cast<const bool*>(data);
+ if (!error) {
+ *is_wb_ubwc_supported = *output;
+ }
+
+ return error;
+}
+
+int ClientImpl::SetDisplayDppsAdROI(uint32_t display_id, uint32_t h_start,
+ uint32_t h_end, uint32_t v_start, uint32_t v_end,
+ uint32_t factor_in, uint32_t factor_out) {
+ struct DppsAdRoiParams input = {display_id, h_start, h_end, v_start, v_end,
+ factor_in, factor_out};
+ ByteStream input_params;
+ input_params.setToExternal(reinterpret_cast<uint8_t*>(&input), sizeof(struct DppsAdRoiParams));
+ int error = 0;
+ auto hidl_cb = [&error] (int32_t err, ByteStream params, HandleStream handles) {
+ error = err;
+ };
+
+ display_config_->perform(client_handle_, kSetDisplayDppsAdRoi, input_params, {}, hidl_cb);
+
+ return error;
+}
+
+int ClientImpl::UpdateVSyncSourceOnPowerModeOff() {
+ int error = 0;
+ auto hidl_cb = [&error] (int32_t err, ByteStream params, HandleStream handles) {
+ error = err;
+ };
+
+ display_config_->perform(client_handle_, kUpdateVsyncSourceOnPowerModeOff, {}, {}, hidl_cb);
+
+ return error;
+}
+
+int ClientImpl::UpdateVSyncSourceOnPowerModeDoze() {
+ int error = 0;
+ auto hidl_cb = [&error] (int32_t err, ByteStream params, HandleStream handles) {
+ error = err;
+ };
+
+ display_config_->perform(client_handle_, kUpdateVsyncSourceOnPowerModeDoze, {}, {}, hidl_cb);
+
+ return error;
+}
+
+int ClientImpl::SetPowerMode(uint32_t disp_id, PowerMode power_mode) {
+ struct PowerModeParams input = {disp_id, power_mode};
+ ByteStream input_params;
+ input_params.setToExternal(reinterpret_cast<uint8_t*>(&input), sizeof(struct PowerModeParams));
+ int error = 0;
+ auto hidl_cb = [&error] (int32_t err, ByteStream params, HandleStream handles) {
+ error = err;
+ };
+
+ display_config_->perform(client_handle_, kSetPowerMode, input_params, {}, hidl_cb);
+
+ return error;
+}
+
+int ClientImpl::IsPowerModeOverrideSupported(uint32_t disp_id, bool *supported) {
+ ByteStream input_params;
+ input_params.setToExternal(reinterpret_cast<uint8_t*>(&disp_id), sizeof(uint32_t));
+ const bool *output;
+ ByteStream output_params;
+ int error = 0;
+ auto hidl_cb = [&error, &output_params] (int32_t err, ByteStream params, HandleStream handles) {
+ error = err;
+ output_params = params;
+ };
+
+ display_config_->perform(client_handle_, kIsPowerModeOverrideSupported,
+ input_params, {}, hidl_cb);
+
+ const uint8_t *data = output_params.data();
+ output = reinterpret_cast<const bool*>(data);
+
+ if (!error) {
+ *supported = *output;
+ }
+
+ return error;
+}
+
+int ClientImpl::IsHDRSupported(uint32_t disp_id, bool *supported) {
+ ByteStream input_params;
+ input_params.setToExternal(reinterpret_cast<uint8_t*>(&disp_id), sizeof(uint32_t));
+ const bool *output;
+ ByteStream output_params;
+ int error = 0;
+ auto hidl_cb = [&error, &output_params] (int32_t err, ByteStream params, HandleStream handles) {
+ error = err;
+ output_params = params;
+ };
+
+ display_config_->perform(client_handle_, kIsHdrSupported, input_params, {}, hidl_cb);
+
+ const uint8_t *data = output_params.data();
+ output = reinterpret_cast<const bool*>(data);
+
+ if (!error) {
+ *supported = *output;
+ }
+
+ return error;
+}
+
+int ClientImpl::IsWCGSupported(uint32_t disp_id, bool *supported) {
+ ByteStream input_params;
+ input_params.setToExternal(reinterpret_cast<uint8_t*>(&disp_id), sizeof(int32_t));
+ const bool *output;
+ ByteStream output_params;
+ int error = 0;
+ auto hidl_cb = [&error, &output_params] (int32_t err, ByteStream params, HandleStream handles) {
+ error = err;
+ output_params = params;
+ };
+
+ display_config_->perform(client_handle_, kIsWcgSupported, input_params, {}, hidl_cb);
+
+ const uint8_t *data = output_params.data();
+ output = reinterpret_cast<const bool*>(data);
+
+ if (!error) {
+ *supported = *output;
+ }
+
+ return error;
+}
+
+int ClientImpl::SetLayerAsMask(uint32_t disp_id, uint64_t layer_id) {
+ struct LayerMaskParams input = {disp_id, layer_id};
+ ByteStream input_params;
+ input_params.setToExternal(reinterpret_cast<uint8_t*>(&input), sizeof(struct LayerMaskParams));
+ int error = 0;
+ auto hidl_cb = [&error] (int32_t err, ByteStream params, HandleStream handles) {
+ error = err;
+ };
+
+ display_config_->perform(client_handle_, kSetLayerAsMask, input_params, {}, hidl_cb);
+
+ return error;
+}
+
+int ClientImpl::GetDebugProperty(const std::string prop_name, std::string *value) {
+ ByteStream input_params;
+ std::string prop(prop_name);
+ prop += '\0';
+ uint8_t *data_input = reinterpret_cast<uint8_t*>(const_cast<char*>(prop.data()));
+ input_params.setToExternal(reinterpret_cast<uint8_t*>(data_input),
+ prop.size() * sizeof(char));
+ ByteStream output_params;
+ int error = 0;
+ auto hidl_cb = [&error, &output_params] (int32_t err, ByteStream params, HandleStream handles) {
+ error = err;
+ output_params = params;
+ };
+
+ display_config_->perform(client_handle_, kGetDebugProperty, input_params, {}, hidl_cb);
+
+ const uint8_t *data = output_params.data();
+ const char *name = reinterpret_cast<const char *>(data);
+ if (!error) {
+ std::string output(name);
+ *value = output;
+ }
+
+ return error;
+}
+
+int ClientImpl::GetActiveBuiltinDisplayAttributes(Attributes *attr) {
+ const struct Attributes *output;
+ ByteStream output_params;
+ int error = 0;
+ auto hidl_cb = [&error, &output_params] (int32_t err, ByteStream params, HandleStream handles) {
+ error = err;
+ output_params = params;
+ };
+
+ display_config_->perform(client_handle_, kGetActiveBuiltinDisplayAttributes, {}, {}, hidl_cb);
+
+ const uint8_t *data = output_params.data();
+ output = reinterpret_cast<const Attributes*>(data);
+ if (!error) {
+ *attr = *output;
+ }
+
+ return error;
+}
+
+int ClientImpl::SetPanelLuminanceAttributes(uint32_t disp_id, float min_lum, float max_lum) {
+ struct PanelLumAttrParams input = {disp_id, min_lum, max_lum};
+ ByteStream input_params;
+ input_params.setToExternal(reinterpret_cast<uint8_t*>(&input), sizeof(struct PanelLumAttrParams));
+ int error = 0;
+ auto hidl_cb = [&error] (int32_t err, ByteStream params, HandleStream handles) {
+ error = err;
+ };
+
+ display_config_->perform(client_handle_, kSetPanelLuminanceAttributes, input_params, {}, hidl_cb);
+
+ return error;
+}
+
+int ClientImpl::IsBuiltInDisplay(uint32_t disp_id, bool *is_builtin) {
+ ByteStream input_params;
+ input_params.setToExternal(reinterpret_cast<uint8_t*>(&disp_id), sizeof(uint32_t));
+ const bool *output;
+ ByteStream output_params;
+ int error = 0;
+ auto hidl_cb = [&error, &output_params] (int32_t err, ByteStream params, HandleStream handles) {
+ error = err;
+ output_params = params;
+ };
+
+ display_config_->perform(client_handle_, kIsBuiltinDisplay, input_params, {}, hidl_cb);
+
+ const uint8_t *data = output_params.data();
+ output = reinterpret_cast<const bool*>(data);
+
+ if (!error) {
+ *is_builtin = *output;
+ }
+
+ return error;
+}
+
+int ClientImpl::SetCWBOutputBuffer(uint32_t disp_id, const Rect rect, bool post_processed,
+ const native_handle_t *buffer) {
+ struct CwbBufferParams input = {disp_id, rect, post_processed};
+ ByteStream input_params;
+ input_params.setToExternal(reinterpret_cast<uint8_t*>(&input), sizeof(struct CwbBufferParams));
+
+ hidl_handle handle = buffer;
+ std::vector<hidl_handle> handle_vector;
+ handle_vector.push_back(buffer);
+ HandleStream input_handles = handle_vector;
+
+ int error = 0;
+ auto hidl_cb = [&error] (int32_t err, ByteStream params, HandleStream handles) {
+ error = err;
+ };
+
+ display_config_->perform(client_handle_, kSetCwbOutputBuffer, input_params,
+ input_handles, hidl_cb);
+
+ return error;
+}
+
+int ClientImpl::GetSupportedDSIBitClks(uint32_t disp_id, std::vector<uint64_t> *bit_clks) {
+ ByteStream input_params;
+ input_params.setToExternal(reinterpret_cast<uint8_t*>(&disp_id), sizeof(uint32_t));
+ ByteStream output_params;
+ int error = 0;
+ auto hidl_cb = [&error, &output_params] (int32_t err, ByteStream params, HandleStream handles) {
+ error = err;
+ output_params = params;
+ };
+
+ display_config_->perform(client_handle_, kGetSupportedDsiBitclks, input_params, {}, hidl_cb);
+
+ if (!error) {
+ const uint8_t *data = output_params.data();
+ const uint64_t *bit_clks_data = reinterpret_cast<const uint64_t *>(data);
+ int num_bit_clks = static_cast<int>(output_params.size() / sizeof(uint64_t));
+ for (int i = 0; i < num_bit_clks; i++) {
+ bit_clks->push_back(bit_clks_data[i]);
+ }
+ }
+
+ return error;
+}
+
+int ClientImpl::GetDSIClk(uint32_t disp_id, uint64_t *bit_clk) {
+ ByteStream input_params;
+ input_params.setToExternal(reinterpret_cast<uint8_t*>(&disp_id), sizeof(uint32_t));
+ const uint64_t *output;
+ ByteStream output_params;
+ int error = 0;
+ auto hidl_cb = [&error, &output_params] (int32_t err, ByteStream params, HandleStream handles) {
+ error = err;
+ output_params = params;
+ };
+
+ display_config_->perform(client_handle_, kGetDsiClk, input_params, {}, hidl_cb);
+
+ const uint8_t *data = output_params.data();
+ output = reinterpret_cast<const uint64_t*>(data);
+
+ if (!error) {
+ *bit_clk = *output;
+ }
+
+ return error;
+}
+
+int ClientImpl::SetDSIClk(uint32_t disp_id, uint64_t bit_clk) {
+ struct DsiClkParams input = {disp_id, bit_clk};
+ ByteStream input_params;
+ input_params.setToExternal(reinterpret_cast<uint8_t*>(&input), sizeof(struct DsiClkParams));
+ int error = 0;
+ auto hidl_cb = [&error] (int32_t err, ByteStream params, HandleStream handles) {
+ error = err;
+ };
+
+ display_config_->perform(client_handle_, kSetDsiClk, input_params, {}, hidl_cb);
+
+ return error;
+}
+
+int ClientImpl::SetQsyncMode(uint32_t disp_id, QsyncMode mode) {
+ struct QsyncModeParams input = {disp_id, mode};
+ ByteStream input_params;
+ input_params.setToExternal(reinterpret_cast<uint8_t*>(&input), sizeof(struct QsyncModeParams));
+ int error = 0;
+ auto hidl_cb = [&error] (int32_t err, ByteStream params, HandleStream handles) {
+ error = err;
+ };
+
+ display_config_->perform(client_handle_, kSetQsyncMode, input_params, {}, hidl_cb);
+
+ return error;
+}
+
+int ClientImpl::IsSmartPanelConfig(uint32_t disp_id, uint32_t config_id, bool *is_smart) {
+ struct SmartPanelCfgParams input = {disp_id, config_id};
+ ByteStream input_params;
+ input_params.setToExternal(reinterpret_cast<uint8_t*>(&input),
+ sizeof(struct SmartPanelCfgParams));
+ const bool *output;
+ ByteStream output_params;
+ int error = 0;
+ auto hidl_cb = [&error, &output_params] (int32_t err, ByteStream params, HandleStream handles) {
+ error = err;
+ output_params = params;
+ };
+
+ display_config_->perform(client_handle_, kIsSmartPanelConfig, input_params, {}, hidl_cb);
+
+ const uint8_t *data = output_params.data();
+ output = reinterpret_cast<const bool*>(data);
+
+ if (!error) {
+ *is_smart = *output;
+ }
+
+ return error;
+}
+
+int ClientImpl::IsAsyncVDSCreationSupported(bool *supported) {
+ const bool *output;
+ ByteStream output_params;
+ int error = 0;
+ auto hidl_cb = [&error, &output_params] (int32_t err, ByteStream params, HandleStream handles) {
+ error = err;
+ output_params = params;
+ };
+
+ display_config_->perform(client_handle_, kIsAsyncVdsSupported, {}, {}, hidl_cb);
+
+ const uint8_t *data = output_params.data();
+ output = reinterpret_cast<const bool*>(data);
+
+ if (!error) {
+ *supported = *output;
+ }
+
+ return error;
+}
+
+int ClientImpl::CreateVirtualDisplay(uint32_t width, uint32_t height, int32_t format) {
+ struct VdsParams input = {width, height, format};
+ ByteStream input_params;
+ input_params.setToExternal(reinterpret_cast<uint8_t*>(&input), sizeof(struct VdsParams));
+ int error = 0;
+ auto hidl_cb = [&error] (int32_t err, ByteStream params, HandleStream handles) {
+ error = err;
+ };
+
+ display_config_->perform(client_handle_, kCreateVirtualDisplay, input_params, {}, hidl_cb);
+
+ return error;
+}
+
+int ClientImpl::IsRotatorSupportedFormat(int hal_format, bool ubwc, bool *supported) {
+ struct RotatorFormatParams input = {hal_format, ubwc};
+ ByteStream input_params;
+ input_params.setToExternal(reinterpret_cast<uint8_t*>(&input),
+ sizeof(struct RotatorFormatParams));
+ const bool *output;
+ ByteStream output_params;
+ int error = 0;
+ auto hidl_cb = [&error, &output_params] (int32_t err, ByteStream params, HandleStream handles) {
+ error = err;
+ output_params = params;
+ };
+
+ display_config_->perform(client_handle_, kIsRotatorSupportedFormat, input_params, {}, hidl_cb);
+
+ const uint8_t *data = output_params.data();
+ output = reinterpret_cast<const bool*>(data);
+
+ if (!error) {
+ *supported = *output;
+ }
+
+ return error;
+}
+
+int ClientImpl::ControlQsyncCallback(bool enable) {
+ ByteStream input_params;
+ input_params.setToExternal(reinterpret_cast<uint8_t*>(&enable), sizeof(bool));
+ int32_t error = 0;
+ auto hidl_cb = [&error] (int32_t err, ByteStream params, HandleStream handles) {
+ error = err;
+ };
+
+ display_config_->perform(client_handle_, kControlQsyncCallback, input_params, {}, hidl_cb);
+
+ return error;
+}
+
+int ClientImpl::ControlIdleStatusCallback(bool enable) {
+ ByteStream input_params;
+ input_params.setToExternal(reinterpret_cast<uint8_t*>(&enable), sizeof(bool));
+ int32_t error = 0;
+ auto hidl_cb = [&error] (int32_t err, ByteStream params, HandleStream handles) {
+ error = err;
+ };
+
+ display_config_->perform(client_handle_, kControlIdleStatusCallback, input_params, {}, hidl_cb);
+
+ return error;
+}
+
+int ClientImpl::SendTUIEvent(DisplayType dpy, TUIEventType event_type) {
+ struct TUIEventParams input = {dpy, event_type};
+ ByteStream input_params;
+ input_params.setToExternal(reinterpret_cast<uint8_t*>(&input), sizeof(struct TUIEventParams));
+ int32_t error = 0;
+ auto hidl_cb = [&error] (int32_t err, ByteStream params, HandleStream handles) {
+ error = err;
+ };
+
+ display_config_->perform(client_handle_, kSendTUIEvent, input_params, {}, hidl_cb);
+
+ return error;
+}
+
+int ClientImpl::GetDisplayHwId(uint32_t disp_id, uint32_t *display_hw_id) {
+ ByteStream input_params;
+ input_params.setToExternal(reinterpret_cast<uint8_t*>(&disp_id), sizeof(uint32_t));
+ ByteStream output_params;
+
+ int error = 0;
+ auto hidl_cb = [&error, &output_params] (int32_t err, ByteStream params, HandleStream handles) {
+ error = err;
+ output_params = params;
+ };
+
+ display_config_->perform(client_handle_, kGetDisplayHwId, input_params, {}, hidl_cb);
+
+ const uint8_t *data = output_params.data();
+ const uint32_t *output = reinterpret_cast<const uint32_t*>(data);
+
+ if (!error) {
+ *display_hw_id = *output;
+ }
+
+ return error;
+}
+
+int ClientImpl::GetSupportedDisplayRefreshRates(DisplayType dpy,
+ std::vector<uint32_t> *supported_refresh_rates) {
+ ByteStream input_params;
+ input_params.setToExternal(reinterpret_cast<uint8_t *>(&dpy), sizeof(DisplayType));
+ ByteStream output_params;
+ int error = 0;
+ auto hidl_cb = [&error, &output_params](int32_t err, ByteStream params, HandleStream handles) {
+ error = err;
+ output_params = params;
+ };
+
+ display_config_->perform(client_handle_, kGetSupportedDisplayRefreshRates, input_params, {},
+ hidl_cb);
+
+ if (!error) {
+ const uint8_t *data = output_params.data();
+ const uint32_t *refresh_rates_data = reinterpret_cast<const uint32_t *>(data);
+ int num_refresh_rates = static_cast<int>(output_params.size() / sizeof(uint32_t));
+ for (int i = 0; i < num_refresh_rates; i++) {
+ supported_refresh_rates->push_back(refresh_rates_data[i]);
+ }
+ }
+
+ return error;
+}
+
+int ClientImpl::IsRCSupported(uint32_t disp_id, bool *supported) {
+ ByteStream input_params;
+ input_params.setToExternal(reinterpret_cast<uint8_t*>(&disp_id), sizeof(uint32_t));
+ const bool *output;
+ ByteStream output_params;
+ int error = 0;
+ auto hidl_cb = [&error, &output_params] (int32_t err, ByteStream params, HandleStream handles) {
+ error = err;
+ output_params = params;
+ };
+
+ display_config_->perform(client_handle_, kIsRCSupported, input_params, {}, hidl_cb);
+
+ if (!error) {
+ const uint8_t *data = output_params.data();
+ output = reinterpret_cast<const bool*>(data);
+ *supported = *output;
+ }
+
+ return error;
+}
+
+int ClientImpl::DummyDisplayConfigAPI() {
+ int error = 0;
+ auto hidl_cb = [&error] (int32_t err, ByteStream params, HandleStream handles) {
+ error = err;
+ };
+ display_config_->perform(client_handle_, kDummyOpcode, {}, {}, hidl_cb);
+ if (error) {
+ return -EINVAL;
+ }
+ return error;
+}
+
+int ClientImpl::IsSupportedConfigSwitch(uint32_t disp_id, uint32_t config, bool *supported) {
+ struct SupportedModesParams input = {disp_id, config};
+ ByteStream input_params;
+ ByteStream output_params;
+ const bool *output;
+ input_params.setToExternal(reinterpret_cast<uint8_t*>(&input),
+ sizeof(struct SupportedModesParams));
+ int error = 0;
+ auto hidl_cb = [&error, &output_params] (int32_t err, ByteStream params, HandleStream handles) {
+ error = err;
+ output_params = params;
+ };
+ if (display_config_) {
+ display_config_->perform(client_handle_, kIsSupportedConfigSwitch, input_params, {}, hidl_cb);
+ }
+
+ if (!error) {
+ const uint8_t *data = output_params.data();
+ output = reinterpret_cast<const bool *>(data);
+ *supported = *output;
+ }
+
+ return error;
+}
+
+int ClientImpl::GetDisplayType(uint64_t physical_disp_id, DisplayType *disp_type) {
+ if (!disp_type) {
+ return -EINVAL;
+ }
+ ByteStream input_params;
+ input_params.setToExternal(reinterpret_cast<uint8_t*>(&physical_disp_id), sizeof(uint64_t));
+ ByteStream output_params;
+ int error = 0;
+ auto hidl_cb = [&error, &output_params] (int32_t err, ByteStream params, HandleStream handles) {
+ error = err;
+ output_params = params;
+ };
+ if (display_config_) {
+ display_config_->perform(client_handle_, kGetDisplayType, input_params, {}, hidl_cb);
+ }
+
+ if (!error) {
+ const uint8_t *data = output_params.data();
+ const DisplayType *output = reinterpret_cast<const DisplayType*>(data);
+ *disp_type = *output;
+ }
+ return error;
+}
+
+int ClientImpl::AllowIdleFallback() {
+ int error = 0;
+ auto hidl_cb = [&error] (int32_t err, ByteStream params, HandleStream handles) {
+ error = err;
+ };
+ if (display_config_) {
+ display_config_->perform(client_handle_, kAllowIdleFallback, {}, {}, hidl_cb);
+ }
+ return error;
+}
+
+void ClientCallback::ParseNotifyCWBBufferDone(const ByteStream &input_params,
+ const HandleStream &input_handles) {
+ const int *error;
+
+ if (callback_ == nullptr || input_params.size() == 0 || input_handles.size() == 0) {
+ return;
+ }
+
+ const uint8_t *data = input_params.data();
+ error = reinterpret_cast<const int*>(data);
+ hidl_handle buffer = input_handles[0];
+ callback_->NotifyCWBBufferDone(*error, buffer.getNativeHandle());
+}
+
+void ClientCallback::ParseNotifyQsyncChange(const ByteStream &input_params) {
+ const struct QsyncCallbackParams *qsync_data;
+
+ if (callback_ == nullptr || input_params.size() == 0) {
+ return;
+ }
+
+ const uint8_t *data = input_params.data();
+ qsync_data = reinterpret_cast<const QsyncCallbackParams*>(data);
+ callback_->NotifyQsyncChange(qsync_data->qsync_enabled, qsync_data->refresh_rate,
+ qsync_data->qsync_refresh_rate);
+}
+
+void ClientCallback::ParseNotifyIdleStatus(const ByteStream &input_params) {
+ const bool *is_idle;
+ if (callback_ == nullptr || input_params.size() == 0) {
+ return;
+ }
+
+ const uint8_t *data = input_params.data();
+ is_idle = reinterpret_cast<const bool*>(data);
+ callback_->NotifyIdleStatus(*is_idle);
+}
+
+Return<void> ClientCallback::perform(uint32_t op_code, const ByteStream &input_params,
+ const HandleStream &input_handles) {
+ switch (op_code) {
+ case kSetCwbOutputBuffer:
+ ParseNotifyCWBBufferDone(input_params, input_handles);
+ break;
+ case kControlQsyncCallback:
+ ParseNotifyQsyncChange(input_params);
+ break;
+ case kControlIdleStatusCallback:
+ ParseNotifyIdleStatus(input_params);
+ break;
+ default:
+ break;
+ }
+
+ return Void();
+}
+
+} // namespace DisplayConfig