diff options
Diffstat (limited to 'sdm/libs/hwc2/hwc_session.cpp')
-rw-r--r-- | sdm/libs/hwc2/hwc_session.cpp | 367 |
1 files changed, 92 insertions, 275 deletions
diff --git a/sdm/libs/hwc2/hwc_session.cpp b/sdm/libs/hwc2/hwc_session.cpp index 7b68eb81..a6739b2a 100644 --- a/sdm/libs/hwc2/hwc_session.cpp +++ b/sdm/libs/hwc2/hwc_session.cpp @@ -94,6 +94,8 @@ int HWCSession::Init() { return -EINVAL; } + StartServices(); + buffer_allocator_ = new HWCBufferAllocator(); DisplayError error = CoreInterface::CreateCore(HWCDebugHandler::Get(), buffer_allocator_, @@ -770,8 +772,6 @@ int HWCSession::DisconnectDisplay(int disp) { // Qclient methods android::status_t HWCSession::notifyCallback(uint32_t command, const android::Parcel *input_parcel, android::Parcel *output_parcel) { - SEQUENCE_WAIT_SCOPE_LOCK(locker_); - android::status_t status = 0; switch (command) { @@ -780,14 +780,11 @@ android::status_t HWCSession::notifyCallback(uint32_t command, const android::Pa break; case qService::IQService::SCREEN_REFRESH: - callbacks_.Refresh(HWC_DISPLAY_PRIMARY); + refreshScreen(); break; case qService::IQService::SET_IDLE_TIMEOUT: - if (hwc_display_[HWC_DISPLAY_PRIMARY]) { - uint32_t timeout = UINT32(input_parcel->readInt32()); - hwc_display_[HWC_DISPLAY_PRIMARY]->SetIdleTimeoutMs(timeout); - } + setIdleTimeout(UINT32(input_parcel->readInt32())); break; case qService::IQService::SET_FRAME_DUMP_CONFIG: @@ -802,8 +799,13 @@ android::status_t HWCSession::notifyCallback(uint32_t command, const android::Pa status = SetDisplayMode(input_parcel); break; - case qService::IQService::SET_SECONDARY_DISPLAY_STATUS: - status = SetSecondaryDisplayStatus(input_parcel, output_parcel); + case qService::IQService::SET_SECONDARY_DISPLAY_STATUS: { + int disp_id = INT(input_parcel->readInt32()); + HWCDisplay::DisplayStatus disp_status = + static_cast<HWCDisplay::DisplayStatus>(input_parcel->readInt32()); + status = SetSecondaryDisplayStatus(disp_id, disp_status); + output_parcel->writeInt32(status); + } break; case qService::IQService::CONFIGURE_DYN_REFRESH_RATE: @@ -813,56 +815,89 @@ android::status_t HWCSession::notifyCallback(uint32_t command, const android::Pa case qService::IQService::SET_VIEW_FRAME: break; - case qService::IQService::TOGGLE_SCREEN_UPDATES: - status = ToggleScreenUpdates(input_parcel, output_parcel); + case qService::IQService::TOGGLE_SCREEN_UPDATES: { + int32_t input = input_parcel->readInt32(); + status = toggleScreenUpdate(input == 1); + output_parcel->writeInt32(status); + } break; case qService::IQService::QDCM_SVC_CMDS: status = QdcmCMDHandler(input_parcel, output_parcel); break; - case qService::IQService::MIN_HDCP_ENCRYPTION_LEVEL_CHANGED: - status = OnMinHdcpEncryptionLevelChange(input_parcel, output_parcel); + case qService::IQService::MIN_HDCP_ENCRYPTION_LEVEL_CHANGED: { + int disp_id = input_parcel->readInt32(); + uint32_t min_enc_level = UINT32(input_parcel->readInt32()); + status = MinHdcpEncryptionLevelChanged(disp_id, min_enc_level); + output_parcel->writeInt32(status); + } break; - case qService::IQService::CONTROL_PARTIAL_UPDATE: - status = ControlPartialUpdate(input_parcel, output_parcel); + case qService::IQService::CONTROL_PARTIAL_UPDATE: { + int disp_id = input_parcel->readInt32(); + uint32_t enable = UINT32(input_parcel->readInt32()); + status = ControlPartialUpdate(disp_id, enable == 1); + output_parcel->writeInt32(status); + } break; - case qService::IQService::SET_ACTIVE_CONFIG: - status = HandleSetActiveDisplayConfig(input_parcel, output_parcel); + case qService::IQService::SET_ACTIVE_CONFIG: { + uint32_t config = UINT32(input_parcel->readInt32()); + int disp_id = input_parcel->readInt32(); + status = SetActiveConfigIndex(disp_id, config); + } break; - case qService::IQService::GET_ACTIVE_CONFIG: - status = HandleGetActiveDisplayConfig(input_parcel, output_parcel); + case qService::IQService::GET_ACTIVE_CONFIG: { + int disp_id = input_parcel->readInt32(); + uint32_t config = 0; + status = GetActiveConfigIndex(disp_id, &config); + output_parcel->writeInt32(INT(config)); + } break; - case qService::IQService::GET_CONFIG_COUNT: - status = HandleGetDisplayConfigCount(input_parcel, output_parcel); + case qService::IQService::GET_CONFIG_COUNT: { + int disp_id = input_parcel->readInt32(); + uint32_t count = 0; + status = GetConfigCount(disp_id, &count); + output_parcel->writeInt32(INT(count)); + } break; case qService::IQService::GET_DISPLAY_ATTRIBUTES_FOR_CONFIG: status = HandleGetDisplayAttributesForConfig(input_parcel, output_parcel); break; - case qService::IQService::GET_PANEL_BRIGHTNESS: - status = GetPanelBrightness(input_parcel, output_parcel); + case qService::IQService::GET_PANEL_BRIGHTNESS: { + int level = 0; + status = GetPanelBrightness(&level); + output_parcel->writeInt32(level); + } break; - case qService::IQService::SET_PANEL_BRIGHTNESS: - status = SetPanelBrightness(input_parcel, output_parcel); + case qService::IQService::SET_PANEL_BRIGHTNESS: { + uint32_t level = UINT32(input_parcel->readInt32()); + status = setPanelBrightness(level); + output_parcel->writeInt32(status); + } break; case qService::IQService::GET_DISPLAY_VISIBLE_REGION: status = GetVisibleDisplayRect(input_parcel, output_parcel); break; - case qService::IQService::SET_CAMERA_STATUS: - status = SetDynamicBWForCamera(input_parcel, output_parcel); + case qService::IQService::SET_CAMERA_STATUS: { + uint32_t camera_status = UINT32(input_parcel->readInt32()); + status = setCameraLaunchStatus(camera_status); + } break; - case qService::IQService::GET_BW_TRANSACTION_STATUS: - status = GetBWTransactionStatus(input_parcel, output_parcel); + case qService::IQService::GET_BW_TRANSACTION_STATUS: { + bool state = true; + status = DisplayBWTransactionPending(&state); + output_parcel->writeInt32(state); + } break; case qService::IQService::SET_LAYER_MIXER_RESOLUTION: @@ -885,167 +920,11 @@ android::status_t HWCSession::notifyCallback(uint32_t command, const android::Pa return status; } -android::status_t HWCSession::ToggleScreenUpdates(const android::Parcel *input_parcel, - android::Parcel *output_parcel) { - int input = input_parcel->readInt32(); - int error = android::BAD_VALUE; - - if (hwc_display_[HWC_DISPLAY_PRIMARY] && (input <= 1) && (input >= 0)) { - error = hwc_display_[HWC_DISPLAY_PRIMARY]->ToggleScreenUpdates(input == 1); - if (error != 0) { - DLOGE("Failed to toggle screen updates = %d. Error = %d", input, error); - } - } - output_parcel->writeInt32(error); - - return error; -} - -android::status_t HWCSession::SetPanelBrightness(const android::Parcel *input_parcel, - android::Parcel *output_parcel) { - int level = input_parcel->readInt32(); - int error = android::BAD_VALUE; - - if (hwc_display_[HWC_DISPLAY_PRIMARY]) { - error = hwc_display_[HWC_DISPLAY_PRIMARY]->SetPanelBrightness(level); - if (error != 0) { - DLOGE("Failed to set the panel brightness = %d. Error = %d", level, error); - } - } - output_parcel->writeInt32(error); - - return error; -} - -android::status_t HWCSession::GetPanelBrightness(const android::Parcel *input_parcel, - android::Parcel *output_parcel) { - int error = android::BAD_VALUE; - int ret = error; - - if (hwc_display_[HWC_DISPLAY_PRIMARY]) { - error = hwc_display_[HWC_DISPLAY_PRIMARY]->GetPanelBrightness(&ret); - if (error != 0) { - ret = error; - DLOGE("Failed to get the panel brightness. Error = %d", error); - } - } - output_parcel->writeInt32(ret); - - return error; -} - -android::status_t HWCSession::ControlPartialUpdate(const android::Parcel *input_parcel, - android::Parcel *out) { - DisplayError error = kErrorNone; - int ret = 0; - uint32_t disp_id = UINT32(input_parcel->readInt32()); - uint32_t enable = UINT32(input_parcel->readInt32()); - - if (disp_id != HWC_DISPLAY_PRIMARY) { - DLOGW("CONTROL_PARTIAL_UPDATE is not applicable for display = %d", disp_id); - ret = -EINVAL; - out->writeInt32(ret); - return ret; - } - - if (!hwc_display_[HWC_DISPLAY_PRIMARY]) { - DLOGE("primary display object is not instantiated"); - ret = -EINVAL; - out->writeInt32(ret); - return ret; - } - - uint32_t pending = 0; - error = hwc_display_[HWC_DISPLAY_PRIMARY]->ControlPartialUpdate(enable, &pending); - - if (error == kErrorNone) { - if (!pending) { - out->writeInt32(ret); - return ret; - } - } else if (error == kErrorNotSupported) { - out->writeInt32(ret); - return ret; - } else { - ret = -EINVAL; - out->writeInt32(ret); - return ret; - } - - // Todo(user): Unlock it before sending events to client. It may cause deadlocks in future. - callbacks_.Refresh(HWC_DISPLAY_PRIMARY); - - // Wait until partial update control is complete - ret = locker_.WaitFinite(kPartialUpdateControlTimeoutMs); - - out->writeInt32(ret); - - return ret; -} - -android::status_t HWCSession::HandleSetActiveDisplayConfig(const android::Parcel *input_parcel, - android::Parcel *output_parcel) { - int config = input_parcel->readInt32(); - int dpy = input_parcel->readInt32(); - int error = android::BAD_VALUE; - - if (dpy > HWC_DISPLAY_VIRTUAL) { - return android::BAD_VALUE; - } - - if (hwc_display_[dpy]) { - error = hwc_display_[dpy]->SetActiveDisplayConfig(config); - if (error == 0) { - callbacks_.Refresh(0); - } - } - - return error; -} - -android::status_t HWCSession::HandleGetActiveDisplayConfig(const android::Parcel *input_parcel, - android::Parcel *output_parcel) { - int dpy = input_parcel->readInt32(); - int error = android::BAD_VALUE; - - if (dpy > HWC_DISPLAY_VIRTUAL) { - return android::BAD_VALUE; - } - - if (hwc_display_[dpy]) { - uint32_t config = 0; - error = hwc_display_[dpy]->GetActiveDisplayConfig(&config); - if (error == 0) { - output_parcel->writeInt32(INT(config)); - } - } - - return error; -} - -android::status_t HWCSession::HandleGetDisplayConfigCount(const android::Parcel *input_parcel, - android::Parcel *output_parcel) { - int dpy = input_parcel->readInt32(); - int error = android::BAD_VALUE; - - if (dpy > HWC_DISPLAY_VIRTUAL) { - return android::BAD_VALUE; - } - - uint32_t count = 0; - if (hwc_display_[dpy]) { - error = hwc_display_[dpy]->GetDisplayConfigCount(&count); - if (error == 0) { - output_parcel->writeInt32(INT(count)); - } - } - - return error; -} - android::status_t HWCSession::HandleGetDisplayAttributesForConfig(const android::Parcel *input_parcel, android::Parcel *output_parcel) { + SEQUENCE_WAIT_SCOPE_LOCK(locker_); + int config = input_parcel->readInt32(); int dpy = input_parcel->readInt32(); int error = android::BAD_VALUE; @@ -1070,44 +949,24 @@ android::status_t HWCSession::HandleGetDisplayAttributesForConfig(const android: return error; } -android::status_t HWCSession::SetSecondaryDisplayStatus(const android::Parcel *input_parcel, - android::Parcel *output_parcel) { - int ret = -EINVAL; - - uint32_t display_id = UINT32(input_parcel->readInt32()); - uint32_t display_status = UINT32(input_parcel->readInt32()); - - DLOGI("Display = %d, Status = %d", display_id, display_status); - - if (display_id >= HWC_NUM_DISPLAY_TYPES) { - DLOGE("Invalid display_id"); - } else if (display_id == HWC_DISPLAY_PRIMARY) { - DLOGE("Not supported for this display"); - } else if (!hwc_display_[display_id]) { - DLOGW("Display is not connected"); - } else { - ret = hwc_display_[display_id]->SetDisplayStatus(display_status); - } - - output_parcel->writeInt32(ret); - - return ret; -} - android::status_t HWCSession::ConfigureRefreshRate(const android::Parcel *input_parcel) { + SEQUENCE_WAIT_SCOPE_LOCK(locker_); + uint32_t operation = UINT32(input_parcel->readInt32()); + HWCDisplay *hwc_display = hwc_display_[HWC_DISPLAY_PRIMARY]; + switch (operation) { case qdutils::DISABLE_METADATA_DYN_REFRESH_RATE: - return hwc_display_[HWC_DISPLAY_PRIMARY]->Perform( - HWCDisplayPrimary::SET_METADATA_DYN_REFRESH_RATE, false); + return hwc_display->Perform(HWCDisplayPrimary::SET_METADATA_DYN_REFRESH_RATE, false); + case qdutils::ENABLE_METADATA_DYN_REFRESH_RATE: - return hwc_display_[HWC_DISPLAY_PRIMARY]->Perform( - HWCDisplayPrimary::SET_METADATA_DYN_REFRESH_RATE, true); + return hwc_display->Perform(HWCDisplayPrimary::SET_METADATA_DYN_REFRESH_RATE, true); + case qdutils::SET_BINDER_DYN_REFRESH_RATE: { uint32_t refresh_rate = UINT32(input_parcel->readInt32()); - return hwc_display_[HWC_DISPLAY_PRIMARY]->Perform( - HWCDisplayPrimary::SET_BINDER_DYN_REFRESH_RATE, refresh_rate); + return hwc_display->Perform(HWCDisplayPrimary::SET_BINDER_DYN_REFRESH_RATE, refresh_rate); } + default: DLOGW("Invalid operation %d", operation); return -EINVAL; @@ -1117,11 +976,15 @@ android::status_t HWCSession::ConfigureRefreshRate(const android::Parcel *input_ } android::status_t HWCSession::SetDisplayMode(const android::Parcel *input_parcel) { + SEQUENCE_WAIT_SCOPE_LOCK(locker_); + uint32_t mode = UINT32(input_parcel->readInt32()); return hwc_display_[HWC_DISPLAY_PRIMARY]->Perform(HWCDisplayPrimary::SET_DISPLAY_MODE, mode); } android::status_t HWCSession::SetMaxMixerStages(const android::Parcel *input_parcel) { + SEQUENCE_WAIT_SCOPE_LOCK(locker_); + DisplayError error = kErrorNone; std::bitset<32> bit_mask_display_type = UINT32(input_parcel->readInt32()); uint32_t max_mixer_stages = UINT32(input_parcel->readInt32()); @@ -1156,42 +1019,9 @@ android::status_t HWCSession::SetMaxMixerStages(const android::Parcel *input_par return 0; } -android::status_t HWCSession::SetDynamicBWForCamera(const android::Parcel *input_parcel, - android::Parcel *output_parcel) { - DisplayError error = kErrorNone; - uint32_t camera_status = UINT32(input_parcel->readInt32()); - HWBwModes mode = camera_status > 0 ? kBwCamera : kBwDefault; - - // trigger invalidate to apply new bw caps. - callbacks_.Refresh(HWC_DISPLAY_PRIMARY); - - error = core_intf_->SetMaxBandwidthMode(mode); - if (error != kErrorNone) { - return -EINVAL; - } - - new_bw_mode_ = true; - need_invalidate_ = true; - - return 0; -} - -android::status_t HWCSession::GetBWTransactionStatus(const android::Parcel *input_parcel, - android::Parcel *output_parcel) { - bool state = true; - - if (hwc_display_[HWC_DISPLAY_PRIMARY]) { - if (sync_wait(bw_mode_release_fd_, 0) < 0) { - DLOGI("bw_transaction_release_fd is not yet signalled: err= %s", strerror(errno)); - state = false; - } - output_parcel->writeInt32(state); - } - - return 0; -} - void HWCSession::SetFrameDumpConfig(const android::Parcel *input_parcel) { + SEQUENCE_WAIT_SCOPE_LOCK(locker_); + uint32_t frame_dump_count = UINT32(input_parcel->readInt32()); std::bitset<32> bit_mask_display_type = UINT32(input_parcel->readInt32()); uint32_t bit_mask_layer_type = UINT32(input_parcel->readInt32()); @@ -1216,6 +1046,8 @@ void HWCSession::SetFrameDumpConfig(const android::Parcel *input_parcel) { } android::status_t HWCSession::SetMixerResolution(const android::Parcel *input_parcel) { + SEQUENCE_WAIT_SCOPE_LOCK(locker_); + DisplayError error = kErrorNone; uint32_t dpy = UINT32(input_parcel->readInt32()); @@ -1241,6 +1073,8 @@ android::status_t HWCSession::SetMixerResolution(const android::Parcel *input_pa } android::status_t HWCSession::SetColorModeOverride(const android::Parcel *input_parcel) { + SEQUENCE_WAIT_SCOPE_LOCK(locker_); + auto display = static_cast<hwc2_display_t >(input_parcel->readInt32()); auto mode = static_cast<android_color_mode_t>(input_parcel->readInt32()); auto device = static_cast<hwc2_device_t *>(this); @@ -1261,6 +1095,8 @@ android::status_t HWCSession::SetColorModeById(const android::Parcel *input_parc } void HWCSession::DynamicDebug(const android::Parcel *input_parcel) { + SEQUENCE_WAIT_SCOPE_LOCK(locker_); + int type = input_parcel->readInt32(); bool enable = (input_parcel->readInt32() > 0); DLOGI("type = %d enable = %d", type, enable); @@ -1301,6 +1137,8 @@ void HWCSession::DynamicDebug(const android::Parcel *input_parcel) { android::status_t HWCSession::QdcmCMDHandler(const android::Parcel *input_parcel, android::Parcel *output_parcel) { + SEQUENCE_WAIT_SCOPE_LOCK(locker_); + int ret = 0; int32_t *brightness_value = NULL; uint32_t display_id(0); @@ -1392,29 +1230,6 @@ android::status_t HWCSession::QdcmCMDHandler(const android::Parcel *input_parcel return (ret ? -EINVAL : 0); } -android::status_t HWCSession::OnMinHdcpEncryptionLevelChange(const android::Parcel *input_parcel, - android::Parcel *output_parcel) { - int ret = -EINVAL; - uint32_t display_id = UINT32(input_parcel->readInt32()); - uint32_t min_enc_level = UINT32(input_parcel->readInt32()); - - DLOGI("Display %d", display_id); - - if (display_id >= HWC_NUM_DISPLAY_TYPES) { - DLOGE("Invalid display_id"); - } else if (display_id != HWC_DISPLAY_EXTERNAL) { - DLOGE("Not supported for display"); - } else if (!hwc_display_[display_id]) { - DLOGW("Display is not connected"); - } else { - ret = hwc_display_[display_id]->OnMinHdcpEncryptionLevelChange(min_enc_level); - } - - output_parcel->writeInt32(ret); - - return ret; -} - void *HWCSession::HWCUeventThread(void *context) { if (context) { return reinterpret_cast<HWCSession *>(context)->HWCUeventThreadHandler(); @@ -1627,6 +1442,8 @@ int HWCSession::GetVsyncPeriod(int disp) { android::status_t HWCSession::GetVisibleDisplayRect(const android::Parcel *input_parcel, android::Parcel *output_parcel) { + SEQUENCE_WAIT_SCOPE_LOCK(locker_); + int dpy = input_parcel->readInt32(); if (dpy < HWC_DISPLAY_PRIMARY || dpy > HWC_DISPLAY_VIRTUAL) { |