overlay: writeback: Add API to set output format, get writeback FB fd
Add support for setting writeback output format.
Modify the getter to query the driver for output format
if not already done.
Add API to retrieve writeback fb node's fd.
Change-Id: I4a3681b6501c41a094e4cd840591b707b4d7ed66
diff --git a/liboverlay/overlayWriteback.cpp b/liboverlay/overlayWriteback.cpp
index 1d58ece..f1f0eb5 100644
--- a/liboverlay/overlayWriteback.cpp
+++ b/liboverlay/overlayWriteback.cpp
@@ -84,7 +84,6 @@
ALOGE("%s failed to init %s", __func__, Res::fbPath);
return;
}
- queryOutputFormat();
startSession();
}
@@ -190,15 +189,33 @@
return writeSync(mWbMem.getDstFd(), mWbMem.getOffset());
}
-void Writeback::queryOutputFormat() {
- struct msmfb_metadata metadata;
- memset(&metadata, 0 , sizeof(metadata));
- metadata.op = metadata_op_wb_format;
- if (ioctl(mFd.getFD(), MSMFB_METADATA_GET, &metadata) < 0) {
- ALOGE("Error retrieving MDP Writeback format");
- return;
+bool Writeback::setOutputFormat(int mdpFormat) {
+ if(mdpFormat != mOpFmt) {
+ struct msmfb_metadata metadata;
+ memset(&metadata, 0 , sizeof(metadata));
+ metadata.op = metadata_op_wb_format;
+ metadata.data.mixer_cfg.writeback_format = mdpFormat;
+ if (ioctl(mFd.getFD(), MSMFB_METADATA_SET, &metadata) < 0) {
+ ALOGE("Error setting MDP Writeback format");
+ return false;
+ }
+ mOpFmt = mdpFormat;
}
- mOpFmt = metadata.data.mixer_cfg.writeback_format;
+ return true;
+}
+
+int Writeback::getOutputFormat() {
+ if(mOpFmt < 0) {
+ struct msmfb_metadata metadata;
+ memset(&metadata, 0 , sizeof(metadata));
+ metadata.op = metadata_op_wb_format;
+ if (ioctl(mFd.getFD(), MSMFB_METADATA_GET, &metadata) < 0) {
+ ALOGE("Error retrieving MDP Writeback format");
+ return -1;
+ }
+ mOpFmt = metadata.data.mixer_cfg.writeback_format;
+ }
+ return mOpFmt;
}
//static
diff --git a/liboverlay/overlayWriteback.h b/liboverlay/overlayWriteback.h
index 6280391..8c0c52a 100644
--- a/liboverlay/overlayWriteback.h
+++ b/liboverlay/overlayWriteback.h
@@ -81,7 +81,12 @@
bool queueBuffer(int opFd, uint32_t opOffset);
uint32_t getOffset() const { return mWbMem.getOffset(); }
int getDstFd() const { return mWbMem.getDstFd(); }
- int getOutputFormat() const { return mOpFmt; }
+ /* Subject to GC if writeback isnt used for a drawing round.
+ * Get always if caching the value.
+ */
+ int getFbFd() const { return mFd.getFD(); }
+ int getOutputFormat();
+ bool setOutputFormat(int mdpFormat);
static Writeback* getInstance();
static void configBegin() { sUsed = false; }
@@ -94,7 +99,6 @@
bool stopSession();
//Actually block_until_write_done for the usage here.
bool dequeueBuffer();
- void queryOutputFormat();
OvFD mFd;
WritebackMem mWbMem;
struct msmfb_data mFbData;