drm_hwcomposer: Clean up SetLayerBlendMode for hwc3
Don't use the existing HWC2 api. Remove related hwc2/hwc3 conversion
helper.
Change-Id: Ie3e53d1854df2e895360bd0c445d398649ab310a
Signed-off-by: Drew Davenport <ddavenport@google.com>
diff --git a/hwc2_device/HwcDisplay.h b/hwc2_device/HwcDisplay.h
index 87d2da7..6bc3b6b 100644
--- a/hwc2_device/HwcDisplay.h
+++ b/hwc2_device/HwcDisplay.h
@@ -58,7 +58,7 @@
return configs_;
}
- // HWC Hooks
+ // HWC2 Hooks - these should not be used outside of the hwc2 device.
HWC2::Error AcceptDisplayChanges();
HWC2::Error CreateLayer(hwc2_layer_t *layer);
HWC2::Error DestroyLayer(hwc2_layer_t layer);
diff --git a/hwc2_device/HwcLayer.cpp b/hwc2_device/HwcLayer.cpp
index da4ce7c..e2b20f4 100644
--- a/hwc2_device/HwcLayer.cpp
+++ b/hwc2_device/HwcLayer.cpp
@@ -24,6 +24,12 @@
namespace android {
+void HwcLayer::SetLayerProperties(const LayerProperties& layer_properties) {
+ if (layer_properties.blend_mode) {
+ blend_mode_ = layer_properties.blend_mode.value();
+ }
+}
+
// NOLINTNEXTLINE(readability-convert-member-functions-to-static)
HWC2::Error HwcLayer::SetCursorPosition(int32_t /*x*/, int32_t /*y*/) {
return HWC2::Error::None;
diff --git a/hwc2_device/HwcLayer.h b/hwc2_device/HwcLayer.h
index b69ce5b..21e6b58 100644
--- a/hwc2_device/HwcLayer.h
+++ b/hwc2_device/HwcLayer.h
@@ -16,6 +16,7 @@
#pragma once
+#include <aidl/android/hardware/graphics/common/Transform.h>
#include <hardware/hwcomposer2.h>
#include "bufferinfo/BufferInfoGetter.h"
@@ -27,6 +28,11 @@
class HwcLayer {
public:
+ // A set of properties to be validated.
+ struct LayerProperties {
+ std::optional<BufferBlendMode> blend_mode;
+ };
+
explicit HwcLayer(HwcDisplay *parent_display) : parent_(parent_display){};
HWC2::Composition GetSfType() const {
@@ -61,7 +67,9 @@
return layer_data_;
}
- // Layer hooks
+ void SetLayerProperties(const LayerProperties &layer_properties);
+
+ // HWC2 Layer hooks
HWC2::Error SetCursorPosition(int32_t /*x*/, int32_t /*y*/);
HWC2::Error SetLayerBlendMode(int32_t mode);
HWC2::Error SetLayerBuffer(buffer_handle_t buffer, int32_t acquire_fence);
diff --git a/hwc3/ComposerClient.cpp b/hwc3/ComposerClient.cpp
index 950e269..902d612 100644
--- a/hwc3/ComposerClient.cpp
+++ b/hwc3/ComposerClient.cpp
@@ -19,28 +19,29 @@
#include "ComposerClient.h"
-#include <aidlcommonsupport/NativeHandle.h>
-#include <android-base/logging.h>
-#include <android/binder_ibinder_platform.h>
-#include <hardware/hwcomposer2.h>
-
#include <cinttypes>
#include <cmath>
#include <memory>
#include <unordered_map>
#include <vector>
-#include "aidl/android/hardware/graphics/common/Transform.h"
-#include "aidl/android/hardware/graphics/composer3/ClientTarget.h"
-#include "aidl/android/hardware/graphics/composer3/Composition.h"
-#include "aidl/android/hardware/graphics/composer3/DisplayRequest.h"
-#include "aidl/android/hardware/graphics/composer3/IComposerClient.h"
-#include "aidl/android/hardware/graphics/composer3/PowerMode.h"
-#include "aidl/android/hardware/graphics/composer3/PresentOrValidate.h"
-#include "aidl/android/hardware/graphics/composer3/RenderIntent.h"
-#include "android/binder_auto_utils.h"
-#include "cutils/native_handle.h"
-#include "hardware/hwcomposer_defs.h"
+#include <aidl/android/hardware/graphics/common/Transform.h>
+#include <aidl/android/hardware/graphics/composer3/ClientTarget.h>
+#include <aidl/android/hardware/graphics/composer3/Composition.h>
+#include <aidl/android/hardware/graphics/composer3/DisplayRequest.h>
+#include <aidl/android/hardware/graphics/composer3/IComposerClient.h>
+#include <aidl/android/hardware/graphics/composer3/PowerMode.h>
+#include <aidl/android/hardware/graphics/composer3/PresentOrValidate.h>
+#include <aidl/android/hardware/graphics/composer3/RenderIntent.h>
+#include <aidlcommonsupport/NativeHandle.h>
+#include <android-base/logging.h>
+#include <android/binder_auto_utils.h>
+#include <android/binder_ibinder_platform.h>
+#include <cutils/native_handle.h>
+#include <hardware/hwcomposer2.h>
+#include <hardware/hwcomposer_defs.h>
+
+#include "bufferinfo/BufferInfo.h"
#include "hwc2_device/HwcDisplay.h"
#include "hwc2_device/HwcDisplayConfigs.h"
#include "hwc2_device/HwcLayer.h"
@@ -49,6 +50,7 @@
using ::android::HwcDisplay;
using ::android::HwcDisplayConfigs;
+using ::android::HwcLayer;
#include "utils/log.h"
@@ -64,6 +66,25 @@
};
// clang-format on
+std::optional<BufferBlendMode> AidlToBlendMode(
+ const std::optional<ParcelableBlendMode>& aidl_blend_mode) {
+ if (!aidl_blend_mode) {
+ return std::nullopt;
+ }
+
+ switch (aidl_blend_mode->blendMode) {
+ case common::BlendMode::NONE:
+ return BufferBlendMode::kNone;
+ case common::BlendMode::PREMULTIPLIED:
+ return BufferBlendMode::kPreMult;
+ case common::BlendMode::COVERAGE:
+ return BufferBlendMode::kCoverage;
+ case common::BlendMode::INVALID:
+ ALOGE("Invalid BlendMode");
+ return std::nullopt;
+ }
+}
+
} // namespace
ComposerClient::ComposerClient() {
@@ -310,9 +331,10 @@
if (command.buffer) {
ExecuteSetLayerBuffer(display_id, layer_wrapper, *command.buffer);
}
- if (command.blendMode) {
- ExecuteSetLayerBlendMode(display_id, layer_wrapper, *command.blendMode);
- }
+ HwcLayer::LayerProperties properties;
+ properties.blend_mode = AidlToBlendMode(command.blendMode);
+ layer->SetLayerProperties(properties);
+
if (command.composition) {
ExecuteSetLayerComposition(display_id, layer_wrapper, *command.composition);
}
@@ -1026,16 +1048,6 @@
}
}
-void ComposerClient::ExecuteSetLayerBlendMode(
- int64_t /*display_id*/, HwcLayerWrapper& layer,
- const ParcelableBlendMode& blend_mode) {
- auto err = Hwc2toHwc3Error(layer.layer->SetLayerBlendMode(
- Hwc3BlendModeToHwc2(blend_mode.blendMode)));
- if (err != hwc3::Error::kNone) {
- cmd_result_writer_->AddError(err);
- }
-}
-
void ComposerClient::ExecuteSetLayerComposition(
int64_t /*display_id*/, HwcLayerWrapper& layer,
const ParcelableComposition& composition) {
diff --git a/hwc3/ComposerClient.h b/hwc3/ComposerClient.h
index f6362ad..0b50d58 100644
--- a/hwc3/ComposerClient.h
+++ b/hwc3/ComposerClient.h
@@ -160,8 +160,6 @@
void DispatchLayerCommand(int64_t display_id, const LayerCommand& command);
void ExecuteSetLayerBuffer(int64_t display_id, HwcLayerWrapper& layer_id,
const Buffer& buffer);
- void ExecuteSetLayerBlendMode(int64_t display_id, HwcLayerWrapper& layer,
- const ParcelableBlendMode& blend_mode);
void ExecuteSetLayerComposition(int64_t display_id, HwcLayerWrapper& layer,
const ParcelableComposition& composition);
void ExecuteSetLayerDataspace(int64_t display_id, HwcLayerWrapper& layer,
diff --git a/hwc3/Utils.h b/hwc3/Utils.h
index 0be4368..d0d7765 100644
--- a/hwc3/Utils.h
+++ b/hwc3/Utils.h
@@ -171,13 +171,6 @@
return static_cast<int32_t>(power_mode);
}
-// Values match, so static_cast is okay.
-// https://cs.android.com/android/platform/superproject/main/+/main:hardware/interfaces/graphics/common/aidl/android/hardware/graphics/common/BlendMode.aidl;drc=bab1ba54ede32520a5042d616a3af46ad4f55d5f;l=25
-// https://cs.android.com/android/platform/superproject/main/+/main:hardware/libhardware/include_all/hardware/hwcomposer2.h;l=72;drc=1a0e4a1698c7b080d6763cef9e16592bce75967e
-inline int32_t Hwc3BlendModeToHwc2(common::BlendMode blend_mode) {
- return static_cast<int32_t>(blend_mode);
-}
-
// Values appear to match.
// https://cs.android.com/android/platform/superproject/main/+/main:hardware/interfaces/graphics/common/aidl/android/hardware/graphics/common/Dataspace.aidl
// https://cs.android.com/android/platform/superproject/main/+/main:system/core/libsystem/include/system/graphics-base-v1.0.h;l=43