diff options
26 files changed, 156 insertions, 155 deletions
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 @@ bool BufferManager::initialize() 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 @@ bool BufferManager::initialize() } // 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 @@ void BufferManager::unlockDataBuffer(DataBuffer *buffer) DataBuffer* BufferManager::get(buffer_handle_t handle) { - return createDataBuffer(mGrallocModule, handle); + return createDataBuffer(handle); } void BufferManager::put(DataBuffer *buffer) @@ -168,7 +168,7 @@ BufferMapper* BufferManager::map(DataBuffer& buffer) // 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 @@ buffer_handle_t BufferManager::allocFrameBuffer(int width, int height, int *stri 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 @@ public: 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 @@ IMG_gralloc_module_t; #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 @@ bool TngDisplayContext::initialize() 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 @@ bool TngGrallocBufferMapper::map() 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 @@ bool TngGrallocBufferMapper::map() } } - 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 @@ bool TngGrallocBufferMapper::unmap() 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 @@ buffer_handle_t TngGrallocBufferMapper::getFbHandle(int subIndex) } // 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 @@ buffer_handle_t TngGrallocBufferMapper::getFbHandle(int subIndex) 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 @@ namespace intel { 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 @@ private: 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 @@ void PlatfBufferManager::deinitialize() 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 @@ public: 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 @@ void PlatfBufferManager::deinitialize() 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 @@ public: 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 @@ bool BufferManager::initialize() 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 @@ bool BufferManager::initialize() } // 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 @@ void BufferManager::unlockDataBuffer(DataBuffer * /* buffer */) DataBuffer* BufferManager::get(uint32_t handle) { - return createDataBuffer(mGrallocModule, handle); + return createDataBuffer(handle); } void BufferManager::put(DataBuffer *buffer) @@ -168,7 +168,7 @@ BufferMapper* BufferManager::map(DataBuffer& buffer) // 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 @@ uint32_t BufferManager::allocFrameBuffer(int width, int height, int *stride) 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 @@ bool DisplayPlane::setDataBuffer(uint32_t handle) 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 @@ public: 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 @@ IMG_gralloc_module_t; #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 @@ bool AnnOverlayPlane::bufferOffsetSetup(BufferMapper& mapper) 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 @@ bool AnnOverlayPlane::bufferOffsetSetup(BufferMapper& mapper) 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 @@ bool AnnOverlayPlane::bufferOffsetSetup(BufferMapper& mapper) 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 @@ bool AnnOverlayPlane::coordinateSetup(BufferMapper& mapper) 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 @@ bool AnnOverlayPlane::scalingSetup(BufferMapper& mapper) 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 @@ bool AnnOverlayPlane::scalingSetup(BufferMapper& mapper) 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 @@ bool PlaneCapabilities::isFormatSupported(int planeType, HwcLayer *hwcLayer) 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 @@ bool PlaneCapabilities::isSizeSupported(int planeType, HwcLayer *hwcLayer) } } 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 @@ bool PlaneCapabilities::isScalingSupported(int planeType, HwcLayer *hwcLayer) 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 @@ void GrallocBufferBase::initStride() // 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 @@ namespace intel { #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 @@ namespace intel { // 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 @@ namespace intel { #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 @@ BufferMapper* OverlayPlaneBase::getTTMMapper(BufferMapper& grallocMapper, struct // 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 @@ bool OverlayPlaneBase::bufferOffsetSetup(BufferMapper& mapper) 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 @@ bool OverlayPlaneBase::coordinateSetup(BufferMapper& mapper) 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 @@ bool TngDisplayContext::initialize() 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 @@ bool DisplayQuery::isVideoFormat(uint32_t format) 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 @@ int DisplayQuery::getOverlayLumaStrideAlignment(uint32_t format) // 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 @@ void TngGrallocBuffer::initBuffer(uint32_t handle) } 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 @@ bool TngGrallocBufferMapper::map() 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 @@ bool TngGrallocBufferMapper::map() } } - 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 @@ bool TngGrallocBufferMapper::unmap() 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 @@ uint32_t TngGrallocBufferMapper::getFbHandle(int subIndex) } // 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 @@ uint32_t TngGrallocBufferMapper::getFbHandle(int subIndex) 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 @@ namespace intel { 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 @@ private: 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 @@ void PlatfBufferManager::deinitialize() 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 @@ public: 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); }; |