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>(