HWC2: Add support for color modes
Adds support for setting color modes through HWC2On1Adapter and the
HWC2 C++ shim
Bug: 22767098
Change-Id: I0b7300093ab427be7105a2535fc9db4953b8af1c
diff --git a/services/surfaceflinger/DisplayHardware/HWC2On1Adapter.h b/services/surfaceflinger/DisplayHardware/HWC2On1Adapter.h
index 2e6206e..caeb188 100644
--- a/services/surfaceflinger/DisplayHardware/HWC2On1Adapter.h
+++ b/services/surfaceflinger/DisplayHardware/HWC2On1Adapter.h
@@ -191,6 +191,7 @@
HWC2::Attribute attribute, int32_t* outValue);
HWC2::Error getChangedCompositionTypes(uint32_t* outNumElements,
hwc2_layer_t* outLayers, int32_t* outTypes);
+ HWC2::Error getColorModes(uint32_t* outNumModes, int32_t* outModes);
HWC2::Error getConfigs(uint32_t* outNumConfigs,
hwc2_config_t* outConfigIds);
HWC2::Error getDozeSupport(int32_t* outSupport);
@@ -208,6 +209,7 @@
HWC2::Error setActiveConfig(hwc2_config_t configId);
HWC2::Error setClientTarget(buffer_handle_t target,
int32_t acquireFence, int32_t dataspace);
+ HWC2::Error setColorMode(int32_t mode);
HWC2::Error setColorTransform(android_color_transform_t hint);
HWC2::Error setOutputBuffer(buffer_handle_t buffer,
int32_t releaseFence);
@@ -239,29 +241,43 @@
private:
class Config {
public:
- Config(Display& display, hwc2_config_t id, uint32_t hwcId)
+ Config(Display& display)
: mDisplay(display),
- mId(id),
- mHwcId(hwcId),
mAttributes() {}
bool isOnDisplay(const Display& display) const {
return display.getId() == mDisplay.getId();
}
- hwc2_config_t getId() const { return mId; }
- uint32_t getHwcId() const { return mHwcId; }
-
void setAttribute(HWC2::Attribute attribute, int32_t value);
int32_t getAttribute(HWC2::Attribute attribute) const;
- std::string toString() const;
+ void setHwc1Id(uint32_t id);
+ bool hasHwc1Id(uint32_t id) const;
+ int32_t getColorModeForHwc1Id(uint32_t id) const;
+ HWC2::Error getHwc1IdForColorMode(int32_t mode,
+ uint32_t* outId) const;
+
+ void setId(hwc2_config_t id) { mId = id; }
+ hwc2_config_t getId() const { return mId; }
+
+ // Attempts to merge two configs that differ only in color
+ // mode. Returns whether the merge was successful
+ bool merge(const Config& other);
+
+ std::set<int32_t> getColorTransforms() const;
+
+ // splitLine divides the output into two lines suitable for
+ // dumpsys SurfaceFlinger
+ std::string toString(bool splitLine = false) const;
private:
Display& mDisplay;
- const hwc2_config_t mId;
- const uint32_t mHwcId;
+ hwc2_config_t mId;
std::unordered_map<HWC2::Attribute, int32_t> mAttributes;
+
+ // Maps from color transform to HWC1 config ID
+ std::unordered_map<int32_t, uint32_t> mHwc1Ids;
};
class Changes {
@@ -315,6 +331,9 @@
std::shared_ptr<const Config>
getConfig(hwc2_config_t configId) const;
+ void populateColorModes();
+ void initializeActiveConfig();
+
void reallocateHwc1Contents();
void assignHwc1LayerIds();
@@ -352,8 +371,11 @@
std::unique_ptr<Changes> mChanges;
int32_t mHwc1Id;
+
std::vector<std::shared_ptr<Config>> mConfigs;
std::shared_ptr<const Config> mActiveConfig;
+ std::set<int32_t> mColorModes;
+ int32_t mActiveColorMode;
std::string mName;
HWC2::DisplayType mType;
HWC2::PowerMode mPowerMode;