libhwc2.1: Add histogram blocking roi support in HistogramController

Bug: 299410182
Test: adb shell aidl_hist_client
Change-Id: I5ef88e0c3a4bed8bfdcb9e31b884f8b94949e98a
Signed-off-by: Leo Chen <yinchiuan@google.com>
diff --git a/libhwc2.1/libdevice/HistogramController.cpp b/libhwc2.1/libdevice/HistogramController.cpp
index ac616fb..6cf6f78 100644
--- a/libhwc2.1/libdevice/HistogramController.cpp
+++ b/libhwc2.1/libdevice/HistogramController.cpp
@@ -16,6 +16,11 @@
 
 #include "HistogramController.h"
 
+void HistogramController::initPlatformHistogramCapability() {
+    mHistogramCapability.supportSamplePosList.push_back(HistogramSamplePos::PRE_POSTPROC);
+    mHistogramCapability.supportBlockingRoi = true;
+}
+
 // TODO: b/295990513 - Remove the if defined after kernel prebuilts are merged.
 #if defined(EXYNOS_HISTOGRAM_CHANNEL_REQUEST)
 int HistogramController::createHistogramDrmConfigLocked(const ChannelInfo& channel,
@@ -34,6 +39,17 @@
     channelConfig->roi.start_y = channel.workingConfig.roi.top;
     channelConfig->roi.hsize = channel.workingConfig.roi.right - channel.workingConfig.roi.left;
     channelConfig->roi.vsize = channel.workingConfig.roi.bottom - channel.workingConfig.roi.top;
+    if (channel.workingConfig.blockingRoi.has_value() &&
+        channel.workingConfig.blockingRoi.value() != DISABLED_ROI) {
+        const HistogramRoiRect& blockedRoi = channel.workingConfig.blockingRoi.value();
+        channelConfig->flags |= HISTOGRAM_FLAGS_BLOCKED_ROI;
+        channelConfig->blocked_roi.start_x = blockedRoi.left;
+        channelConfig->blocked_roi.start_y = blockedRoi.top;
+        channelConfig->blocked_roi.hsize = blockedRoi.right - blockedRoi.left;
+        channelConfig->blocked_roi.vsize = blockedRoi.bottom - blockedRoi.top;
+    } else {
+        channelConfig->flags &= ~HISTOGRAM_FLAGS_BLOCKED_ROI;
+    }
     channelConfig->weights.weight_r = channel.workingConfig.weights.weightR;
     channelConfig->weights.weight_g = channel.workingConfig.weights.weightG;
     channelConfig->weights.weight_b = channel.workingConfig.weights.weightB;
@@ -41,6 +57,7 @@
             ? POST_DQE
             : PRE_DQE;
     channelConfig->threshold = channel.threshold;
+
     length = sizeof(struct histogram_channel_config);
 
     return NO_ERROR;
diff --git a/libhwc2.1/libdevice/HistogramController.h b/libhwc2.1/libdevice/HistogramController.h
index b5e8dac..a895bdd 100644
--- a/libhwc2.1/libdevice/HistogramController.h
+++ b/libhwc2.1/libdevice/HistogramController.h
@@ -21,6 +21,7 @@
 class HistogramController : public HistogramDevice {
 public:
     HistogramController(ExynosDisplay* display) : HistogramDevice(display, 4, {3}) {}
+    virtual void initPlatformHistogramCapability() override;
 // TODO: b/295990513 - Remove the if defined after kernel prebuilts are merged.
 #if defined(EXYNOS_HISTOGRAM_CHANNEL_REQUEST)
     virtual int createHistogramDrmConfigLocked(const ChannelInfo& channel,