Merge \\"gfx: change VSYNC from 60fps to 30fps\\" into cw-e-dev am: 2b28f717ce
am: 0de801ec62

Change-Id: Ie972172a09b6c413e11b599c0a38264d6e773630
diff --git a/merrifield/common/buffers/BufferManager.cpp b/merrifield/common/buffers/BufferManager.cpp
index fc460b3..6a939ae 100644
--- a/merrifield/common/buffers/BufferManager.cpp
+++ b/merrifield/common/buffers/BufferManager.cpp
@@ -60,7 +60,7 @@
     if (hw_get_module(GRALLOC_HARDWARE_MODULE_ID, &module)) {
         DEINIT_AND_RETURN_FALSE("failed to get gralloc module");
     }
-    mGrallocModule = (gralloc_module_t*)module;
+    mGrallocModule = (gralloc_module_t const*)module;
 
     gralloc_open(module, &mAllocDev);
     if (!mAllocDev) {
@@ -68,7 +68,7 @@
     }
 
     // create a dummy data buffer
-    mDataBuffer = createDataBuffer(mGrallocModule, 0);
+    mDataBuffer = createDataBuffer(0);
     if (!mDataBuffer) {
         DEINIT_AND_RETURN_FALSE("failed to create data buffer");
     }
@@ -142,7 +142,7 @@
 
 DataBuffer* BufferManager::get(buffer_handle_t handle)
 {
-    return createDataBuffer(mGrallocModule, handle);
+    return createDataBuffer(handle);
 }
 
 void BufferManager::put(DataBuffer *buffer)
@@ -168,7 +168,7 @@
     // create a new buffer mapper and add it to pool
     do {
         VTRACE("new buffer, will add it");
-        mapper = createBufferMapper(mGrallocModule, buffer);
+        mapper = createBufferMapper(buffer);
         if (!mapper) {
             ETRACE("failed to allocate mapper");
             break;
@@ -258,7 +258,7 @@
             break;
         }
 
-        mapper = createBufferMapper(mGrallocModule, *buffer);
+        mapper = createBufferMapper(*buffer);
         if (!mapper) {
             ETRACE("failed to create buffer mapper");
             break;
diff --git a/merrifield/include/BufferManager.h b/merrifield/include/BufferManager.h
index ccc8eaa..6bc98bf 100644
--- a/merrifield/include/BufferManager.h
+++ b/merrifield/include/BufferManager.h
@@ -62,12 +62,10 @@
     virtual bool blit(buffer_handle_t srcHandle, buffer_handle_t destHandle,
                       const crop_t& destRect, bool filter, bool async) = 0;
 protected:
-    virtual DataBuffer* createDataBuffer(gralloc_module_t *module,
-                                             buffer_handle_t handle) = 0;
-    virtual BufferMapper* createBufferMapper(gralloc_module_t *module,
-                                                 DataBuffer& buffer) = 0;
+    virtual DataBuffer* createDataBuffer(buffer_handle_t handle) = 0;
+    virtual BufferMapper* createBufferMapper(DataBuffer& buffer) = 0;
 
-    gralloc_module_t *mGrallocModule;
+    gralloc_module_t const* mGrallocModule;
 private:
     enum {
         // make the buffer pool large enough
diff --git a/merrifield/include/pvr/hal/hal_public.h b/merrifield/include/pvr/hal/hal_public.h
index 5575719..e1053bd 100644
--- a/merrifield/include/pvr/hal/hal_public.h
+++ b/merrifield/include/pvr/hal/hal_public.h
@@ -30,20 +30,6 @@
 
 #undef HAL_PIXEL_FORMAT_NV12
 
-typedef struct _IMG_gralloc_module_
-{
-	IMG_gralloc_module_public_t base;
-	void *(*GetDisplayDevice)(struct _IMG_gralloc_module_ *psGrallocModule);
-	int (*GetDisplayStatus)(struct _IMG_gralloc_module_ *psGrallocModule,
-							buffer_handle_t handle, uint32_t *pui32Status);
-	int (*GetBufferCPUAddresses)(gralloc_module_t const* module,
-								 buffer_handle_t buffer,
-								 void **ppvCpuVirtAddr, size_t *puSize);
-	int (*PutBufferCPUAddresses)(gralloc_module_t const* module,
-								 buffer_handle_t buffer);
-}
-IMG_gralloc_module_t;
-
 #define HAL_PIXEL_FORMAT_UYVY         0x107
 #define HAL_PIXEL_FORMAT_INTEL_ZSL    0x109
 #define HAL_PIXEL_FORMAT_NV12         0x3231564E
@@ -53,6 +39,10 @@
 #define HAL_PIXEL_FORMAT_NV12_VED     0x7FA00E00
 #define HAL_PIXEL_FORMAT_NV12_VEDT    0x7FA00F00
 
+#define GRALLOC_MODULE_GET_BUFFER_CPU_ADDRESSES_IMG 108
+#define GRALLOC_MODULE_PUT_BUFFER_CPU_ADDRESSES_IMG 109
+
+#define GRALLOC_MODULE_GET_DISPLAY_DEVICE_IMG 1000
 #define GRALLOC_MODULE_GET_DISPLAY_STATUS_IMG 1001
 
 #endif /* __HAL_PUBLIC_H */
diff --git a/merrifield/ips/tangier/TngDisplayContext.cpp b/merrifield/ips/tangier/TngDisplayContext.cpp
index fc759dc..f78f20e 100644
--- a/merrifield/ips/tangier/TngDisplayContext.cpp
+++ b/merrifield/ips/tangier/TngDisplayContext.cpp
@@ -43,17 +43,17 @@
     CTRACE();
 
     // open frame buffer device
-    hw_module_t const* module;
-    int err = hw_get_module(GRALLOC_HARDWARE_MODULE_ID, &module);
+    gralloc_module_t const* module;
+    int err = hw_get_module(GRALLOC_HARDWARE_MODULE_ID, (hw_module_t const**)&module);
     if (err) {
         ETRACE("failed to load gralloc module, error = %d", err);
         return false;
     }
 
     // init IMG display device
-    mIMGDisplayDevice = (IMG_display_device_public_t *)(((IMG_gralloc_module_t *)module)->GetDisplayDevice((IMG_gralloc_module_t *)module));
-    if (!mIMGDisplayDevice) {
-        ETRACE("failed to get display device");
+    err = module->perform(module, GRALLOC_MODULE_GET_DISPLAY_DEVICE_IMG, (void **)&mIMGDisplayDevice);
+    if (err) {
+        ETRACE("failed to get display device, error = %d", err);
         return false;
     }
 
diff --git a/merrifield/ips/tangier/TngGrallocBufferMapper.cpp b/merrifield/ips/tangier/TngGrallocBufferMapper.cpp
index ed43f25..bee4f5e 100644
--- a/merrifield/ips/tangier/TngGrallocBufferMapper.cpp
+++ b/merrifield/ips/tangier/TngGrallocBufferMapper.cpp
@@ -22,10 +22,10 @@
 namespace android {
 namespace intel {
 
-TngGrallocBufferMapper::TngGrallocBufferMapper(IMG_gralloc_module_public_t& module,
+TngGrallocBufferMapper::TngGrallocBufferMapper(gralloc_module_t const& module,
                                                     DataBuffer& buffer)
     : GrallocBufferMapperBase(buffer),
-      mIMGGrallocModule(reinterpret_cast<IMG_gralloc_module_t&>(module)),
+      mGrallocModule(module),
       mBufferObject(0)
 {
     CTRACE();
@@ -122,8 +122,8 @@
 
     CTRACE();
     // get virtual address
-    err = mIMGGrallocModule.GetBufferCPUAddresses(
-                                  (gralloc_module_t const*)&mIMGGrallocModule,
+    err = mGrallocModule.perform(&mGrallocModule,
+                                  GRALLOC_MODULE_GET_BUFFER_CPU_ADDRESSES_IMG,
                                   (buffer_handle_t)mClonedHandle,
                                   vaddr,
                                   size);
@@ -162,8 +162,8 @@
         }
     }
 
-    err = mIMGGrallocModule.PutBufferCPUAddresses(
-                                  (gralloc_module_t const*)&mIMGGrallocModule,
+    err = mGrallocModule.perform(&mGrallocModule,
+                                  GRALLOC_MODULE_PUT_BUFFER_CPU_ADDRESSES_IMG,
                                   (buffer_handle_t)mClonedHandle);
     return false;
 }
@@ -184,8 +184,8 @@
         mSize[i] = 0;
     }
 
-    err = mIMGGrallocModule.PutBufferCPUAddresses(
-                                  (gralloc_module_t const*)&mIMGGrallocModule,
+    err = mGrallocModule.perform(&mGrallocModule,
+                                  GRALLOC_MODULE_PUT_BUFFER_CPU_ADDRESSES_IMG,
                                   (buffer_handle_t)mClonedHandle);
     if (err) {
         ETRACE("failed to unmap. err = %d", err);
@@ -239,8 +239,8 @@
     }
 
     // get virtual address
-    err = mIMGGrallocModule.GetBufferCPUAddresses(
-                                  (gralloc_module_t const*)&mIMGGrallocModule,
+    err = mGrallocModule.perform(&mGrallocModule,
+                                  GRALLOC_MODULE_GET_BUFFER_CPU_ADDRESSES_IMG,
                                   (buffer_handle_t)mClonedHandle,
                                   vaddr,
                                   size);
@@ -254,8 +254,8 @@
 
 void TngGrallocBufferMapper::putFbHandle()
 {
-    int err = mIMGGrallocModule.PutBufferCPUAddresses(
-                                  (gralloc_module_t const*)&mIMGGrallocModule,
+    int err = mGrallocModule.perform(&mGrallocModule,
+                                  GRALLOC_MODULE_PUT_BUFFER_CPU_ADDRESSES_IMG,
                                   (buffer_handle_t)mClonedHandle);
     if (err) {
         ETRACE("failed to unmap. err = %d", err);
diff --git a/merrifield/ips/tangier/TngGrallocBufferMapper.h b/merrifield/ips/tangier/TngGrallocBufferMapper.h
index 8360e02..17f34c2 100644
--- a/merrifield/ips/tangier/TngGrallocBufferMapper.h
+++ b/merrifield/ips/tangier/TngGrallocBufferMapper.h
@@ -26,7 +26,7 @@
 
 class TngGrallocBufferMapper : public GrallocBufferMapperBase {
 public:
-    TngGrallocBufferMapper(IMG_gralloc_module_public_t& module,
+    TngGrallocBufferMapper(gralloc_module_t const& module,
                                DataBuffer& buffer);
     virtual ~TngGrallocBufferMapper();
 public:
@@ -41,7 +41,7 @@
     bool mapKhandle();
 
 private:
-    IMG_gralloc_module_t& mIMGGrallocModule;
+    gralloc_module_t const& mGrallocModule;
     void* mBufferObject;
 	native_handle_t* mClonedHandle;
 };
diff --git a/merrifield/platforms/merrifield/PlatfBufferManager.cpp b/merrifield/platforms/merrifield/PlatfBufferManager.cpp
index 13df1a5..881f79d 100644
--- a/merrifield/platforms/merrifield/PlatfBufferManager.cpp
+++ b/merrifield/platforms/merrifield/PlatfBufferManager.cpp
@@ -43,30 +43,25 @@
     BufferManager::deinitialize();
 }
 
-DataBuffer* PlatfBufferManager::createDataBuffer(gralloc_module_t *module,
-                                                 buffer_handle_t handle)
+DataBuffer* PlatfBufferManager::createDataBuffer(buffer_handle_t handle)
 {
     return new TngGrallocBuffer(handle);
 }
 
-BufferMapper* PlatfBufferManager::createBufferMapper(gralloc_module_t *module,
-                                                        DataBuffer& buffer)
+BufferMapper* PlatfBufferManager::createBufferMapper(DataBuffer& buffer)
 {
-    if (!module)
-        return 0;
-
-    return new TngGrallocBufferMapper(*(IMG_gralloc_module_public_t*)module,
-                                        buffer);
+    return new TngGrallocBufferMapper(*mGrallocModule, buffer);
 }
 
 bool PlatfBufferManager::blit(buffer_handle_t srcHandle, buffer_handle_t destHandle,
                               const crop_t& destRect, bool filter, bool async)
 
 {
-    IMG_gralloc_module_public_t *imgGrallocModule = (IMG_gralloc_module_public_t *) mGrallocModule;
     int fenceFd;
 
-    if (imgGrallocModule->Blit(imgGrallocModule, srcHandle,
+    if (mGrallocModule->perform(mGrallocModule,
+                                GRALLOC_MODULE_BLIT_HANDLE_TO_HANDLE_IMG,
+                                srcHandle,
                                 destHandle,
                                 destRect.w, destRect.h, destRect.x,
                                 destRect.y, 0, -1, &fenceFd)) {
diff --git a/merrifield/platforms/merrifield/PlatfBufferManager.h b/merrifield/platforms/merrifield/PlatfBufferManager.h
index 822f484..b45cef5 100644
--- a/merrifield/platforms/merrifield/PlatfBufferManager.h
+++ b/merrifield/platforms/merrifield/PlatfBufferManager.h
@@ -31,9 +31,8 @@
     void deinitialize();
 
 protected:
-    DataBuffer* createDataBuffer(gralloc_module_t *module, buffer_handle_t handle);
-    BufferMapper* createBufferMapper(gralloc_module_t *module,
-                                        DataBuffer& buffer);
+    DataBuffer* createDataBuffer(buffer_handle_t handle);
+    BufferMapper* createBufferMapper(DataBuffer& buffer);
     bool blit(buffer_handle_t srcHandle, buffer_handle_t destHandle,
               const crop_t& destRect, bool filter, bool async);
 };
diff --git a/merrifield/platforms/merrifield_plus/PlatfBufferManager.cpp b/merrifield/platforms/merrifield_plus/PlatfBufferManager.cpp
index 13df1a5..881f79d 100644
--- a/merrifield/platforms/merrifield_plus/PlatfBufferManager.cpp
+++ b/merrifield/platforms/merrifield_plus/PlatfBufferManager.cpp
@@ -43,30 +43,25 @@
     BufferManager::deinitialize();
 }
 
-DataBuffer* PlatfBufferManager::createDataBuffer(gralloc_module_t *module,
-                                                 buffer_handle_t handle)
+DataBuffer* PlatfBufferManager::createDataBuffer(buffer_handle_t handle)
 {
     return new TngGrallocBuffer(handle);
 }
 
-BufferMapper* PlatfBufferManager::createBufferMapper(gralloc_module_t *module,
-                                                        DataBuffer& buffer)
+BufferMapper* PlatfBufferManager::createBufferMapper(DataBuffer& buffer)
 {
-    if (!module)
-        return 0;
-
-    return new TngGrallocBufferMapper(*(IMG_gralloc_module_public_t*)module,
-                                        buffer);
+    return new TngGrallocBufferMapper(*mGrallocModule, buffer);
 }
 
 bool PlatfBufferManager::blit(buffer_handle_t srcHandle, buffer_handle_t destHandle,
                               const crop_t& destRect, bool filter, bool async)
 
 {
-    IMG_gralloc_module_public_t *imgGrallocModule = (IMG_gralloc_module_public_t *) mGrallocModule;
     int fenceFd;
 
-    if (imgGrallocModule->Blit(imgGrallocModule, srcHandle,
+    if (mGrallocModule->perform(mGrallocModule,
+                                GRALLOC_MODULE_BLIT_HANDLE_TO_HANDLE_IMG,
+                                srcHandle,
                                 destHandle,
                                 destRect.w, destRect.h, destRect.x,
                                 destRect.y, 0, -1, &fenceFd)) {
diff --git a/merrifield/platforms/merrifield_plus/PlatfBufferManager.h b/merrifield/platforms/merrifield_plus/PlatfBufferManager.h
index 822f484..b45cef5 100644
--- a/merrifield/platforms/merrifield_plus/PlatfBufferManager.h
+++ b/merrifield/platforms/merrifield_plus/PlatfBufferManager.h
@@ -31,9 +31,8 @@
     void deinitialize();
 
 protected:
-    DataBuffer* createDataBuffer(gralloc_module_t *module, buffer_handle_t handle);
-    BufferMapper* createBufferMapper(gralloc_module_t *module,
-                                        DataBuffer& buffer);
+    DataBuffer* createDataBuffer(buffer_handle_t handle);
+    BufferMapper* createBufferMapper(DataBuffer& buffer);
     bool blit(buffer_handle_t srcHandle, buffer_handle_t destHandle,
               const crop_t& destRect, bool filter, bool async);
 };
diff --git a/moorefield_hdmi/common/buffers/BufferManager.cpp b/moorefield_hdmi/common/buffers/BufferManager.cpp
index ca0de39..a426c5a 100644
--- a/moorefield_hdmi/common/buffers/BufferManager.cpp
+++ b/moorefield_hdmi/common/buffers/BufferManager.cpp
@@ -60,7 +60,7 @@
     if (hw_get_module(GRALLOC_HARDWARE_MODULE_ID, &module)) {
         DEINIT_AND_RETURN_FALSE("failed to get gralloc module");
     }
-    mGrallocModule = (gralloc_module_t*)module;
+    mGrallocModule = (gralloc_module_t const*)module;
 
     gralloc_open(module, &mAllocDev);
     if (!mAllocDev) {
@@ -68,7 +68,7 @@
     }
 
     // create a dummy data buffer
-    mDataBuffer = createDataBuffer(mGrallocModule, 0);
+    mDataBuffer = createDataBuffer(0);
     if (!mDataBuffer) {
         DEINIT_AND_RETURN_FALSE("failed to create data buffer");
     }
@@ -142,7 +142,7 @@
 
 DataBuffer* BufferManager::get(uint32_t handle)
 {
-    return createDataBuffer(mGrallocModule, handle);
+    return createDataBuffer(handle);
 }
 
 void BufferManager::put(DataBuffer *buffer)
@@ -168,7 +168,7 @@
     // create a new buffer mapper and add it to pool
     do {
         VLOGTRACE("new buffer, will add it");
-        mapper = createBufferMapper(mGrallocModule, buffer);
+        mapper = createBufferMapper(buffer);
         if (!mapper) {
             ELOGTRACE("failed to allocate mapper");
             break;
@@ -258,7 +258,7 @@
             break;
         }
 
-        mapper = createBufferMapper(mGrallocModule, *buffer);
+        mapper = createBufferMapper(*buffer);
         if (!mapper) {
             ELOGTRACE("failed to create buffer mapper");
             break;
diff --git a/moorefield_hdmi/common/planes/DisplayPlane.cpp b/moorefield_hdmi/common/planes/DisplayPlane.cpp
index 1251c29..a748b13 100755
--- a/moorefield_hdmi/common/planes/DisplayPlane.cpp
+++ b/moorefield_hdmi/common/planes/DisplayPlane.cpp
@@ -217,7 +217,10 @@
     if (index < 0) {
         VLOGTRACE("unmapped buffer, mapping...");
         mapper = mapBuffer(buffer);
-        if (!mapper) {
+        // Skip the unsupported format in case that a new gralloc buffer was
+        // created and added into the mapped list, triggered by SoftwareRender
+        // with color conversion from known formats to YV12.
+        if (!mapper || mapper->getFormat() == HAL_PIXEL_FORMAT_YV12) {
             ELOGTRACE("failed to map buffer %#x", handle);
             bm->unlockDataBuffer(buffer);
             return false;
diff --git a/moorefield_hdmi/include/BufferManager.h b/moorefield_hdmi/include/BufferManager.h
index 20dc634..0897310 100755
--- a/moorefield_hdmi/include/BufferManager.h
+++ b/moorefield_hdmi/include/BufferManager.h
@@ -62,12 +62,10 @@
     virtual bool blitGrallocBuffer(uint32_t srcHandle, uint32_t dstHandle,
                                   crop_t& srcCrop, uint32_t async) = 0;
 protected:
-    virtual DataBuffer* createDataBuffer(gralloc_module_t *module,
-                                             uint32_t handle) = 0;
-    virtual BufferMapper* createBufferMapper(gralloc_module_t *module,
-                                                 DataBuffer& buffer) = 0;
+    virtual DataBuffer* createDataBuffer(uint32_t handle) = 0;
+    virtual BufferMapper* createBufferMapper(DataBuffer& buffer) = 0;
 
-    gralloc_module_t *mGrallocModule;
+    gralloc_module_t const* mGrallocModule;
 private:
     enum {
         // make the buffer pool large enough
diff --git a/moorefield_hdmi/include/pvr/hal/hal_public.h b/moorefield_hdmi/include/pvr/hal/hal_public.h
index 5575719..04939a0 100644
--- a/moorefield_hdmi/include/pvr/hal/hal_public.h
+++ b/moorefield_hdmi/include/pvr/hal/hal_public.h
@@ -30,21 +30,8 @@
 
 #undef HAL_PIXEL_FORMAT_NV12
 
-typedef struct _IMG_gralloc_module_
-{
-	IMG_gralloc_module_public_t base;
-	void *(*GetDisplayDevice)(struct _IMG_gralloc_module_ *psGrallocModule);
-	int (*GetDisplayStatus)(struct _IMG_gralloc_module_ *psGrallocModule,
-							buffer_handle_t handle, uint32_t *pui32Status);
-	int (*GetBufferCPUAddresses)(gralloc_module_t const* module,
-								 buffer_handle_t buffer,
-								 void **ppvCpuVirtAddr, size_t *puSize);
-	int (*PutBufferCPUAddresses)(gralloc_module_t const* module,
-								 buffer_handle_t buffer);
-}
-IMG_gralloc_module_t;
-
 #define HAL_PIXEL_FORMAT_UYVY         0x107
+#define HAL_PIXEL_FORMAT_INTEL_YV12   0x108
 #define HAL_PIXEL_FORMAT_INTEL_ZSL    0x109
 #define HAL_PIXEL_FORMAT_NV12         0x3231564E
 #define HAL_PIXEL_FORMAT_NV21         0x3132564E
@@ -53,6 +40,10 @@
 #define HAL_PIXEL_FORMAT_NV12_VED     0x7FA00E00
 #define HAL_PIXEL_FORMAT_NV12_VEDT    0x7FA00F00
 
+#define GRALLOC_MODULE_GET_BUFFER_CPU_ADDRESSES_IMG 108
+#define GRALLOC_MODULE_PUT_BUFFER_CPU_ADDRESSES_IMG 109
+
+#define GRALLOC_MODULE_GET_DISPLAY_DEVICE_IMG 1000
 #define GRALLOC_MODULE_GET_DISPLAY_STATUS_IMG 1001
 
 #endif /* __HAL_PUBLIC_H */
diff --git a/moorefield_hdmi/ips/anniedale/AnnOverlayPlane.cpp b/moorefield_hdmi/ips/anniedale/AnnOverlayPlane.cpp
index eca4d1e..a3e92a7 100755
--- a/moorefield_hdmi/ips/anniedale/AnnOverlayPlane.cpp
+++ b/moorefield_hdmi/ips/anniedale/AnnOverlayPlane.cpp
@@ -175,19 +175,6 @@
 
     uint32_t format = mapper.getFormat();
     uint32_t gttOffsetInBytes = (mapper.getGttOffsetInPage(0) << 12);
-
-    if (format == HAL_PIXEL_FORMAT_BGRX_8888 ||
-        format == HAL_PIXEL_FORMAT_BGRA_8888) {
-        backBuffer->OCMD = 1 << 10;
-        // by pass YUV->RGB conversion, 8-bit output
-        backBuffer->OCONFIG |= (0x1 << 4) | (0x1 << 3);
-        backBuffer->OSTART_0Y = gttOffsetInBytes;
-        backBuffer->OSTART_1Y = gttOffsetInBytes;
-        backBuffer->OBUF_0Y = 0;
-        backBuffer->OBUF_1Y = 0;
-        return true;
-    }
-
     uint32_t yStride = mapper.getStride().yuv.yStride;
     uint32_t uvStride = mapper.getStride().yuv.uvStride;
     uint32_t h = mapper.getHeight();
@@ -198,6 +185,18 @@
     uint32_t uTileOffsetX, uTileOffsetY;
     uint32_t vTileOffsetX, vTileOffsetY;
 
+    if (format == HAL_PIXEL_FORMAT_BGRX_8888 ||
+        format == HAL_PIXEL_FORMAT_BGRA_8888) {
+        // set source format XRGB
+        backBuffer->OCMD = OVERLAY_FORMAT_PLANAR_XRGB;
+        // by pass YUV->RGB conversion, 8-bit output
+        backBuffer->OCONFIG |= OVERLAY_CONFIG_BYPASS_DISABLE;
+        backBuffer->OSTART_0Y = gttOffsetInBytes;
+        backBuffer->OBUF_0Y = srcX * XRGB_BPP + srcY *
+            mapper.getStride().rgb.stride;
+        return true;
+    }
+
     // clear original format setting
     backBuffer->OCMD &= ~(0xf << 10);
     backBuffer->OCMD &= ~OVERLAY_MEMORY_LAYOUT_TILED;
@@ -226,6 +225,18 @@
         vTileOffsetY = uTileOffsetY;
         backBuffer->OCMD |= OVERLAY_FORMAT_PLANAR_YUV420;
         break;
+    case HAL_PIXEL_FORMAT_INTEL_YV12:    // INTEL_YV12
+        // The height of HAL_PIXEL_FORMAT_INTEL_YV12 gralloc buffer has been aligned with 32 pixels.
+        vSurface = ySurface + yStride * align_to(h, 32);
+        uSurface = vSurface + uvStride * (align_to(h, 32) / 2);
+        yTileOffsetX = srcX;
+        yTileOffsetY = srcY;
+        uTileOffsetX = srcX / 2;
+        uTileOffsetY = srcY / 2;
+        vTileOffsetX = uTileOffsetX;
+        vTileOffsetY = uTileOffsetY;
+        backBuffer->OCMD |= OVERLAY_FORMAT_PLANAR_YUV420;
+        break;
     case HAL_PIXEL_FORMAT_I420:    // I420
         uSurface = ySurface + yStride * h;
         vSurface = uSurface + uvStride * (h / 2);
@@ -339,8 +350,9 @@
 
     backBuffer->SWIDTH = mapper.getCrop().w;
     backBuffer->SHEIGHT = mapper.getCrop().h;
-    backBuffer->SWIDTHSW = calculateSWidthSW(0, mapper.getCrop().w) << 2;
-    backBuffer->OSTRIDE = mapper.getStride().rgb.stride & (~0x3f);
+    backBuffer->OSTRIDE = mapper.getStride().rgb.stride;
+    backBuffer->SWIDTHSW = calculateSWidthSW(backBuffer->OBUF_0Y,
+            backBuffer->OSTRIDE) << 2;
     return true;
 };
 
@@ -404,13 +416,6 @@
     uint32_t dstHeight = h;
     uint32_t format = mapper.getFormat();
 
-    if (format == HAL_PIXEL_FORMAT_BGRX_8888 ||
-        format == HAL_PIXEL_FORMAT_BGRA_8888) {
-        backBuffer->YRGBSCALE = 1 << 15 | 0 << 3 | 0 << 20;
-        backBuffer->UVSCALEV = (1 << 16);
-        return true;
-    }
-
     if (mBobDeinterlace && !mTransform)
         deinterlace_factor = 2;
 
@@ -436,6 +441,10 @@
         srcWidth = tmp;
     }
 
+    if (format == HAL_PIXEL_FORMAT_BGRX_8888 ||
+            format == HAL_PIXEL_FORMAT_BGRA_8888)
+        uvratio = 1;
+
      // Y down-scale factor as a multiple of 4096
     if (srcWidth == dstWidth && srcHeight == dstHeight) {
         xscaleFract = (1 << 12);
diff --git a/moorefield_hdmi/ips/anniedale/PlaneCapabilities.cpp b/moorefield_hdmi/ips/anniedale/PlaneCapabilities.cpp
index 98901e7..54b4aee 100755
--- a/moorefield_hdmi/ips/anniedale/PlaneCapabilities.cpp
+++ b/moorefield_hdmi/ips/anniedale/PlaneCapabilities.cpp
@@ -25,6 +25,9 @@
 #define SPRITE_PLANE_MAX_STRIDE_TILED      16384
 #define SPRITE_PLANE_MAX_STRIDE_LINEAR     16384
 
+#define SPRITE_PLANE_MAX_WIDTH             4096
+#define SPRITE_PLANE_MAX_HEIGHT            4096
+
 #define OVERLAY_PLANE_MAX_STRIDE_PACKED    4096
 #define OVERLAY_PLANE_MAX_STRIDE_LINEAR    8192
 
@@ -58,7 +61,7 @@
                 WLOGTRACE("180 degree rotation is not supported yet");
             }
             return trans ? false : true;
-        case HAL_PIXEL_FORMAT_YV12:
+        case HAL_PIXEL_FORMAT_INTEL_YV12:
             return trans ? false: true;
         case HAL_PIXEL_FORMAT_NV12:
         case OMX_INTEL_COLOR_FormatYUV420PackedSemiPlanar:
@@ -101,7 +104,7 @@
         }
     } else if (planeType == DisplayPlane::PLANE_OVERLAY) {
         switch (format) {
-        case HAL_PIXEL_FORMAT_YV12:
+        case HAL_PIXEL_FORMAT_INTEL_YV12:
         case HAL_PIXEL_FORMAT_I420:
         case HAL_PIXEL_FORMAT_NV12:
         case OMX_INTEL_COLOR_FormatYUV420PackedSemiPlanar:
@@ -173,6 +176,14 @@
     dstH = dest.bottom - dest.top;
 
     if (planeType == DisplayPlane::PLANE_SPRITE || planeType == DisplayPlane::PLANE_PRIMARY) {
+        if ((dstW - 1) <= 0 || (dstH - 1) <= 0 ||
+            (dstW - 1) >= SPRITE_PLANE_MAX_WIDTH ||
+            (dstH - 1) >= SPRITE_PLANE_MAX_HEIGHT) {
+            // Should check size in isSizeSupported().
+            DLOGTRACE("invalid destination size: %d x %d, fall back to GLES", dstW, dstH);
+            return false;
+        }
+
         // no scaling is supported
         return ((srcW == dstW) && (srcH == dstH)) ? true : false;
 
diff --git a/moorefield_hdmi/ips/common/GrallocBufferBase.cpp b/moorefield_hdmi/ips/common/GrallocBufferBase.cpp
index ed2452a..346d62f 100644
--- a/moorefield_hdmi/ips/common/GrallocBufferBase.cpp
+++ b/moorefield_hdmi/ips/common/GrallocBufferBase.cpp
@@ -47,6 +47,7 @@
     // setup stride
     switch (mFormat) {
     case HAL_PIXEL_FORMAT_YV12:
+    case HAL_PIXEL_FORMAT_INTEL_YV12:
     case HAL_PIXEL_FORMAT_I420:
         uint32_t yStride_align;
         yStride_align = DisplayQuery::getOverlayLumaStrideAlignment(mFormat);
diff --git a/moorefield_hdmi/ips/common/OverlayHardware.h b/moorefield_hdmi/ips/common/OverlayHardware.h
index a06f304..df5c946 100644
--- a/moorefield_hdmi/ips/common/OverlayHardware.h
+++ b/moorefield_hdmi/ips/common/OverlayHardware.h
@@ -35,6 +35,7 @@
 #define N_VERT_UV_TAPS                  3
 #define N_PHASES                        17
 #define MAX_TAPS                        5
+#define XRGB_BPP                        4
 
 // Filter cutoff frequency limits.
 #define MIN_CUTOFF_FREQ                 1.0
@@ -56,6 +57,7 @@
 
 // overlay register values
 #define OVERLAY_FORMAT_MASK             (0xf << 10)
+#define OVERLAY_FORMAT_PLANAR_XRGB      (0x1 << 10)
 #define OVERLAY_FORMAT_PACKED_YUV422    (0x8 << 10)
 #define OVERLAY_FORMAT_PLANAR_NV12_1    (0x7 << 10)
 #define OVERLAY_FORMAT_PLANAR_NV12_2    (0xb << 10)
@@ -77,6 +79,8 @@
 #define OVERLAY_MIRRORING_VERTIACAL     (0x2 << 17)
 #define OVERLAY_MIRRORING_BOTH          (0x3 << 17)
 
+#define OVERLAY_CONFIG_BYPASS_DISABLE   (0x1 << 4)
+
 #define BUF_TYPE                (0x1<<5)
 #define BUF_TYPE_FRAME          (0x0<<5)
 #define BUF_TYPE_FIELD          (0x1<<5)
diff --git a/moorefield_hdmi/ips/common/OverlayPlaneBase.cpp b/moorefield_hdmi/ips/common/OverlayPlaneBase.cpp
index 5ba55c8..a0dbdba 100755
--- a/moorefield_hdmi/ips/common/OverlayPlaneBase.cpp
+++ b/moorefield_hdmi/ips/common/OverlayPlaneBase.cpp
@@ -378,6 +378,7 @@
         // calculate stride
         switch (format) {
         case HAL_PIXEL_FORMAT_YV12:
+        case HAL_PIXEL_FORMAT_INTEL_YV12:
         case HAL_PIXEL_FORMAT_I420:
             uint32_t yStride_align;
             yStride_align = DisplayQuery::getOverlayLumaStrideAlignment(grallocMapper.getFormat());
@@ -696,6 +697,12 @@
         backBuffer->OBUF_0U = backBuffer->OBUF_0V + (uvStride * (h / 2));
         backBuffer->OCMD |= OVERLAY_FORMAT_PLANAR_YUV420;
         break;
+    case HAL_PIXEL_FORMAT_INTEL_YV12:    // INTEL_YV12
+        backBuffer->OBUF_0Y = 0;
+        backBuffer->OBUF_0V = yStride * align_to(h, 32);
+        backBuffer->OBUF_0U = backBuffer->OBUF_0V + (uvStride * (align_to(h, 32) / 2));
+        backBuffer->OCMD |= OVERLAY_FORMAT_PLANAR_YUV420;
+        break;
     case HAL_PIXEL_FORMAT_I420:    // I420
         backBuffer->OBUF_0Y = 0;
         backBuffer->OBUF_0U = yStride * h;
@@ -800,6 +807,7 @@
 
     switch (format) {
     case HAL_PIXEL_FORMAT_YV12:              // YV12
+    case HAL_PIXEL_FORMAT_INTEL_YV12:        // INTEL_YV12
     case HAL_PIXEL_FORMAT_I420:              // I420
     case HAL_PIXEL_FORMAT_NV12:              // NV12
     case OMX_INTEL_COLOR_FormatYUV420PackedSemiPlanar:          // NV12
diff --git a/moorefield_hdmi/ips/tangier/TngDisplayContext.cpp b/moorefield_hdmi/ips/tangier/TngDisplayContext.cpp
index 285f408..e755988 100755
--- a/moorefield_hdmi/ips/tangier/TngDisplayContext.cpp
+++ b/moorefield_hdmi/ips/tangier/TngDisplayContext.cpp
@@ -42,17 +42,17 @@
     CTRACE();
 
     // open frame buffer device
-    hw_module_t const* module;
-    int err = hw_get_module(GRALLOC_HARDWARE_MODULE_ID, &module);
+    gralloc_module_t const* module;
+    int err = hw_get_module(GRALLOC_HARDWARE_MODULE_ID, (hw_module_t const**)&module);
     if (err) {
         ELOGTRACE("failed to load gralloc module, error = %d", err);
         return false;
     }
 
     // init IMG display device
-    mIMGDisplayDevice = (IMG_display_device_public_t *)(((IMG_gralloc_module_t *)module)->GetDisplayDevice((IMG_gralloc_module_t *)module));
-    if (!mIMGDisplayDevice) {
-        ELOGTRACE("failed to get display device");
+    err = module->perform(module, GRALLOC_MODULE_GET_DISPLAY_DEVICE_IMG, (void **)&mIMGDisplayDevice);
+    if (err) {
+        ELOGTRACE("failed to get display device, error = %d", err);
         return false;
     }
 
diff --git a/moorefield_hdmi/ips/tangier/TngDisplayQuery.cpp b/moorefield_hdmi/ips/tangier/TngDisplayQuery.cpp
index 13350aa..1a8adb2 100755
--- a/moorefield_hdmi/ips/tangier/TngDisplayQuery.cpp
+++ b/moorefield_hdmi/ips/tangier/TngDisplayQuery.cpp
@@ -32,7 +32,7 @@
     case OMX_INTEL_COLOR_FormatYUV420PackedSemiPlanar_Tiled:
     // Expand format to support the case: Software decoder + HW rendering
     // Only VP9 use this foramt now
-    case HAL_PIXEL_FORMAT_YV12:
+    case HAL_PIXEL_FORMAT_INTEL_YV12:
         return true;
     default:
         return false;
@@ -44,6 +44,7 @@
     // both luma and chroma stride need to be 64-byte aligned for overlay
     switch (format) {
     case HAL_PIXEL_FORMAT_YV12:
+    case HAL_PIXEL_FORMAT_INTEL_YV12:
     case HAL_PIXEL_FORMAT_I420:
         // for these two formats, chroma stride is calculated as half of luma stride
         // so luma stride needs to be 128-byte aligned.
diff --git a/moorefield_hdmi/ips/tangier/TngGrallocBuffer.cpp b/moorefield_hdmi/ips/tangier/TngGrallocBuffer.cpp
index 47d36d4..5984ea5 100644
--- a/moorefield_hdmi/ips/tangier/TngGrallocBuffer.cpp
+++ b/moorefield_hdmi/ips/tangier/TngGrallocBuffer.cpp
@@ -15,6 +15,7 @@
 */
 #include <common/utils/HwcTrace.h>
 #include <ips/tangier/TngGrallocBuffer.h>
+#include <khronos/openmax/OMX_IntelVideoExt.h>
 
 namespace android {
 namespace intel {
@@ -47,7 +48,11 @@
     }
 
     mFormat = grallocHandle->iFormat;
-    mWidth = grallocHandle->iWidth;
+    if (mFormat == OMX_INTEL_COLOR_FormatYUV420PackedSemiPlanar ||
+        mFormat == OMX_INTEL_COLOR_FormatYUV420PackedSemiPlanar_Tiled) {
+        mWidth = grallocHandle->aiStride[0];
+    } else
+        mWidth = grallocHandle->iWidth;
     mHeight = grallocHandle->iHeight;
     mUsage = grallocHandle->usage;
     mKey = grallocHandle->ui64Stamp;
diff --git a/moorefield_hdmi/ips/tangier/TngGrallocBufferMapper.cpp b/moorefield_hdmi/ips/tangier/TngGrallocBufferMapper.cpp
index 1495379..91e6192 100644
--- a/moorefield_hdmi/ips/tangier/TngGrallocBufferMapper.cpp
+++ b/moorefield_hdmi/ips/tangier/TngGrallocBufferMapper.cpp
@@ -22,10 +22,10 @@
 namespace android {
 namespace intel {
 
-TngGrallocBufferMapper::TngGrallocBufferMapper(IMG_gralloc_module_public_t& module,
+TngGrallocBufferMapper::TngGrallocBufferMapper(gralloc_module_t const& module,
                                                     DataBuffer& buffer)
     : GrallocBufferMapperBase(buffer),
-      mIMGGrallocModule(reinterpret_cast<IMG_gralloc_module_t&>(module)),
+      mGrallocModule(module),
       mBufferObject(0)
 {
     CTRACE();
@@ -122,8 +122,8 @@
 
     CTRACE();
     // get virtual address
-    err = mIMGGrallocModule.GetBufferCPUAddresses(
-                                  (gralloc_module_t const*)&mIMGGrallocModule,
+    err = mGrallocModule.perform(&mGrallocModule,
+                                  GRALLOC_MODULE_GET_BUFFER_CPU_ADDRESSES_IMG,
                                   (buffer_handle_t)mClonedHandle,
                                   vaddr,
                                   size);
@@ -162,8 +162,8 @@
         }
     }
 
-    err = mIMGGrallocModule.PutBufferCPUAddresses(
-                                  (gralloc_module_t const*)&mIMGGrallocModule,
+    err = mGrallocModule.perform(&mGrallocModule,
+                                  GRALLOC_MODULE_PUT_BUFFER_CPU_ADDRESSES_IMG,
                                   (buffer_handle_t)mClonedHandle);
     return false;
 }
@@ -184,8 +184,8 @@
         mSize[i] = 0;
     }
 
-    err = mIMGGrallocModule.PutBufferCPUAddresses(
-                                  (gralloc_module_t const*)&mIMGGrallocModule,
+    err = mGrallocModule.perform(&mGrallocModule,
+                                  GRALLOC_MODULE_PUT_BUFFER_CPU_ADDRESSES_IMG,
                                   (buffer_handle_t)mClonedHandle);
     if (err) {
         ELOGTRACE("failed to unmap. err = %d", err);
@@ -239,8 +239,8 @@
     }
 
     // get virtual address
-    err = mIMGGrallocModule.GetBufferCPUAddresses(
-                                  (gralloc_module_t const*)&mIMGGrallocModule,
+    err = mGrallocModule.perform(&mGrallocModule,
+                                  GRALLOC_MODULE_GET_BUFFER_CPU_ADDRESSES_IMG,
                                   (buffer_handle_t)mClonedHandle,
                                   vaddr,
                                   size);
@@ -254,8 +254,8 @@
 
 void TngGrallocBufferMapper::putFbHandle()
 {
-    int err = mIMGGrallocModule.PutBufferCPUAddresses(
-                                  (gralloc_module_t const*)&mIMGGrallocModule,
+    int err = mGrallocModule.perform(&mGrallocModule,
+                                  GRALLOC_MODULE_PUT_BUFFER_CPU_ADDRESSES_IMG,
                                   (buffer_handle_t)mClonedHandle);
     if (err) {
         ELOGTRACE("failed to unmap. err = %d", err);
diff --git a/moorefield_hdmi/ips/tangier/TngGrallocBufferMapper.h b/moorefield_hdmi/ips/tangier/TngGrallocBufferMapper.h
index e3c15a8..aaf6d4a 100644
--- a/moorefield_hdmi/ips/tangier/TngGrallocBufferMapper.h
+++ b/moorefield_hdmi/ips/tangier/TngGrallocBufferMapper.h
@@ -25,7 +25,7 @@
 
 class TngGrallocBufferMapper : public GrallocBufferMapperBase {
 public:
-    TngGrallocBufferMapper(IMG_gralloc_module_public_t& module,
+    TngGrallocBufferMapper(gralloc_module_t const& module,
                                DataBuffer& buffer);
     virtual ~TngGrallocBufferMapper();
 public:
@@ -40,7 +40,7 @@
     bool mapKhandle();
 
 private:
-    IMG_gralloc_module_t& mIMGGrallocModule;
+    gralloc_module_t const& mGrallocModule;
     void* mBufferObject;
     native_handle_t* mClonedHandle;
 };
diff --git a/moorefield_hdmi/platforms/merrifield_plus/PlatfBufferManager.cpp b/moorefield_hdmi/platforms/merrifield_plus/PlatfBufferManager.cpp
index 69a30db..0a506d0 100755
--- a/moorefield_hdmi/platforms/merrifield_plus/PlatfBufferManager.cpp
+++ b/moorefield_hdmi/platforms/merrifield_plus/PlatfBufferManager.cpp
@@ -43,30 +43,25 @@
     BufferManager::deinitialize();
 }
 
-DataBuffer* PlatfBufferManager::createDataBuffer(gralloc_module_t * /* module */,
-        uint32_t handle)
+DataBuffer* PlatfBufferManager::createDataBuffer(uint32_t handle)
 {
     return new TngGrallocBuffer(handle);
 }
 
-BufferMapper* PlatfBufferManager::createBufferMapper(gralloc_module_t *module,
-                                                        DataBuffer& buffer)
+BufferMapper* PlatfBufferManager::createBufferMapper(DataBuffer& buffer)
 {
-    if (!module)
-        return 0;
-
-    return new TngGrallocBufferMapper(*(IMG_gralloc_module_public_t*)module,
-                                        buffer);
+    return new TngGrallocBufferMapper(*mGrallocModule, buffer);
 }
 
 bool PlatfBufferManager::blitGrallocBuffer(uint32_t srcHandle, uint32_t dstHandle,
                                   crop_t& srcCrop, uint32_t async)
 
 {
-    IMG_gralloc_module_public_t *imgGrallocModule = (IMG_gralloc_module_public_t *) mGrallocModule;
     int fenceFd;
 
-    if (imgGrallocModule->Blit(imgGrallocModule, (buffer_handle_t)srcHandle,
+    if (mGrallocModule->perform(mGrallocModule,
+                                GRALLOC_MODULE_BLIT_HANDLE_TO_HANDLE_IMG,
+                                (buffer_handle_t)srcHandle,
                                 (buffer_handle_t)dstHandle,
                                 srcCrop.w, srcCrop.h, srcCrop.x,
                                 srcCrop.y, 0, -1, &fenceFd)) {
diff --git a/moorefield_hdmi/platforms/merrifield_plus/PlatfBufferManager.h b/moorefield_hdmi/platforms/merrifield_plus/PlatfBufferManager.h
index 11ff950..d2c21ae 100755
--- a/moorefield_hdmi/platforms/merrifield_plus/PlatfBufferManager.h
+++ b/moorefield_hdmi/platforms/merrifield_plus/PlatfBufferManager.h
@@ -31,9 +31,8 @@
     void deinitialize();
 
 protected:
-    DataBuffer* createDataBuffer(gralloc_module_t *module, uint32_t handle);
-    BufferMapper* createBufferMapper(gralloc_module_t *module,
-                                        DataBuffer& buffer);
+    DataBuffer* createDataBuffer(uint32_t handle);
+    BufferMapper* createBufferMapper(DataBuffer& buffer);
     bool blitGrallocBuffer(uint32_t srcHandle, uint32_t dstHandle,
                                   crop_t& srcCrop, uint32_t async);
 };