drm_hwcomposer: Put ValidateDisplay and GetChangedTypes to the frontend Another step towards full frontend/backend split. Change-Id: Icaa65c72c7cc0a5f7b76b87f3a2662d9f6c08c1c Signed-off-by: Roman Stratiienko <r.stratiienko@gmail.com>
diff --git a/hwc2_device/HwcDisplay.cpp b/hwc2_device/HwcDisplay.cpp index de11c1f..e569c71 100644 --- a/hwc2_device/HwcDisplay.cpp +++ b/hwc2_device/HwcDisplay.cpp
@@ -547,29 +547,6 @@ return HWC2::Error::None; } -HWC2::Error HwcDisplay::GetChangedCompositionTypes(uint32_t *num_elements, - hwc2_layer_t *layers, - int32_t *types) { - if (IsInHeadlessMode()) { - *num_elements = 0; - return HWC2::Error::None; - } - - uint32_t num_changes = 0; - for (auto &l : layers_) { - if (l.second.IsTypeChanged()) { - if (layers && num_changes < *num_elements) - layers[num_changes] = l.first; - if (types && num_changes < *num_elements) - types[num_changes] = static_cast<int32_t>(l.second.GetValidatedType()); - ++num_changes; - } - } - if (!layers && !types) - *num_elements = num_changes; - return HWC2::Error::None; -} - HWC2::Error HwcDisplay::GetColorModes(uint32_t *num_modes, int32_t *modes) { if (IsInHeadlessMode()) { *num_modes = 1; @@ -1081,25 +1058,6 @@ return HWC2::Error::None; } -HWC2::Error HwcDisplay::ValidateDisplay(uint32_t *num_types, - uint32_t *num_requests) { - if (IsInHeadlessMode()) { - *num_types = *num_requests = 0; - return HWC2::Error::None; - } - - /* In current drm_hwc design in case previous frame layer was not validated as - * a CLIENT, it is used by display controller (Front buffer). We have to store - * this state to provide the CLIENT with the release fences for such buffers. - */ - for (auto &l : layers_) { - l.second.SetPriorBufferScanOutFlag(l.second.GetValidatedType() != - HWC2::Composition::Client); - } - - return backend_->ValidateDisplay(this, num_types, num_requests); -} - std::vector<HwcLayer *> HwcDisplay::GetOrderLayersByZPos() { std::vector<HwcLayer *> ordered_layers; ordered_layers.reserve(layers_.size());
diff --git a/hwc2_device/HwcDisplay.h b/hwc2_device/HwcDisplay.h index 1d90de0..7391785 100644 --- a/hwc2_device/HwcDisplay.h +++ b/hwc2_device/HwcDisplay.h
@@ -125,8 +125,6 @@ HWC2::Error CreateLayer(hwc2_layer_t *layer); HWC2::Error DestroyLayer(hwc2_layer_t layer); HWC2::Error GetActiveConfig(hwc2_config_t *config) const; - HWC2::Error GetChangedCompositionTypes(uint32_t *num_elements, - hwc2_layer_t *layers, int32_t *types); HWC2::Error GetColorModes(uint32_t *num_modes, int32_t *modes); HWC2::Error GetDisplayAttribute(hwc2_config_t config, int32_t attribute, int32_t *value); @@ -168,7 +166,6 @@ HWC2::Error SetColorTransform(const float *matrix, int32_t hint); HWC2::Error SetPowerMode(int32_t mode); HWC2::Error SetVsyncEnabled(int32_t enabled); - HWC2::Error ValidateDisplay(uint32_t *num_types, uint32_t *num_requests); HwcLayer *get_layer(hwc2_layer_t layer) { auto it = layers_.find(layer); if (it == layers_.end())
diff --git a/hwc2_device/hwc2_device.cpp b/hwc2_device/hwc2_device.cpp index 27ff611..72d0aa9 100644 --- a/hwc2_device/hwc2_device.cpp +++ b/hwc2_device/hwc2_device.cpp
@@ -52,6 +52,7 @@ class Hwc2DeviceDisplay : public FrontendDisplayBase { public: std::vector<HwcDisplay::ReleaseFence> release_fences; + std::vector<HwcDisplay::ChangedLayer> changed_layers; }; static auto GetHwc2DeviceDisplay(HwcDisplay &display) @@ -408,6 +409,53 @@ return static_cast<int32_t>(HWC2::Error::None); } +static int32_t ValidateDisplay(hwc2_device_t *device, hwc2_display_t display, + uint32_t *out_num_types, + uint32_t *out_num_requests) { + ALOGV("ValidateDisplay"); + LOCK_COMPOSER(device); + GET_DISPLAY(display); + + auto hwc2display = GetHwc2DeviceDisplay(*idisplay); + + hwc2display->changed_layers = idisplay->ValidateStagedComposition(); + + *out_num_types = hwc2display->changed_layers.size(); + *out_num_requests = 0; + + return 0; +} + +static int32_t GetChangedCompositionTypes(hwc2_device_t *device, + hwc2_display_t display, + uint32_t *out_num_elements, + hwc2_layer_t *out_layers, + int32_t *out_types) { + ALOGV("GetChangedCompositionTypes"); + LOCK_COMPOSER(device); + GET_DISPLAY(display); + + auto hwc2display = GetHwc2DeviceDisplay(*idisplay); + + if (*out_num_elements < hwc2display->changed_layers.size()) { + ALOGW("Overflow num_elements %d/%zu", *out_num_elements, + hwc2display->changed_layers.size()); + return static_cast<int32_t>(HWC2::Error::NoResources); + } + + for (size_t i = 0; i < hwc2display->changed_layers.size(); ++i) { + // NOLINTNEXTLINE(cppcoreguidelines-pro-bounds-pointer-arithmetic): + out_layers[i] = hwc2display->changed_layers[i].first; + // NOLINTNEXTLINE(cppcoreguidelines-pro-bounds-pointer-arithmetic): + out_types[i] = static_cast<int32_t>(hwc2display->changed_layers[i].second); + } + + *out_num_elements = hwc2display->changed_layers.size(); + hwc2display->changed_layers.clear(); + + return static_cast<int32_t>(HWC2::Error::None); +} + static int32_t PresentDisplay(hwc2_device_t *device, hwc2_display_t display, int32_t *out_release_fence) { ALOGV("PresentDisplay"); @@ -727,10 +775,7 @@ DisplayHook<decltype(&HwcDisplay::GetActiveConfig), &HwcDisplay::GetActiveConfig, hwc2_config_t *>); case HWC2::FunctionDescriptor::GetChangedCompositionTypes: - return ToHook<HWC2_PFN_GET_CHANGED_COMPOSITION_TYPES>( - DisplayHook<decltype(&HwcDisplay::GetChangedCompositionTypes), - &HwcDisplay::GetChangedCompositionTypes, uint32_t *, - hwc2_layer_t *, int32_t *>); + return (hwc2_function_pointer_t)GetChangedCompositionTypes; case HWC2::FunctionDescriptor::GetClientTargetSupport: return (hwc2_function_pointer_t)GetClientTargetSupport; case HWC2::FunctionDescriptor::GetColorModes: @@ -793,9 +838,7 @@ DisplayHook<decltype(&HwcDisplay::SetVsyncEnabled), &HwcDisplay::SetVsyncEnabled, int32_t>); case HWC2::FunctionDescriptor::ValidateDisplay: - return ToHook<HWC2_PFN_VALIDATE_DISPLAY>( - DisplayHook<decltype(&HwcDisplay::ValidateDisplay), - &HwcDisplay::ValidateDisplay, uint32_t *, uint32_t *>); + return (hwc2_function_pointer_t)ValidateDisplay; #if __ANDROID_API__ > 27 case HWC2::FunctionDescriptor::GetRenderIntents: return ToHook<HWC2_PFN_GET_RENDER_INTENTS>(