| /* Copyright (c) 2012 - 2013, 2015, 2018 The Linux Foundation. All rights reserved. |
| * |
| * redistribution and use in source and binary forms, with or without |
| * modification, are permitted provided that the following conditions are |
| * met: |
| * * redistributions of source code must retain the above copyright |
| * notice, this list of conditions and the following disclaimer. |
| * * redistributions in binary form must reproduce the above |
| * copyright notice, this list of conditions and the following |
| * disclaimer in the documentation and/or other materials provided |
| * with the distribution. |
| * * neither the name of The Linux Foundation nor the names of its |
| * contributors may be used to endorse or promote products derived |
| * from this software without specific prior written permission. |
| * |
| * this software is provided "as is" and any express or implied |
| * warranties, including, but not limited to, the implied warranties of |
| * merchantability, fitness for a particular purpose and non-infringement |
| * are disclaimed. in no event shall the copyright owner or contributors |
| * be liable for any direct, indirect, incidental, special, exemplary, or |
| * consequential damages (including, but not limited to, procurement of |
| * substitute goods or services; loss of use, data, or profits; or |
| * business interruption) however caused and on any theory of liability, |
| * whether in contract, strict liability, or tort (including negligence |
| * or otherwise) arising in any way out of the use of this software, even |
| * if advised of the possibility of such damage. |
| * |
| */ |
| |
| #ifndef C2D_ColorConverter_H_ |
| #define C2D_ColorConverter_H_ |
| |
| #include <stdlib.h> |
| #include <fcntl.h> |
| #include <pthread.h> |
| #include <linux/msm_kgsl.h> |
| #include <sys/ioctl.h> |
| #include <utils/Log.h> |
| #include <dlfcn.h> |
| #include <string.h> |
| #include <errno.h> |
| #include <media/msm_media_info.h> |
| #include <gralloc_priv.h> |
| #include <unordered_map> |
| |
| #include <c2d2.h> |
| #include <sys/types.h> |
| |
| #undef LOG_TAG |
| #define LOG_TAG "C2DColorConvert" |
| #define ALIGN( num, to ) (((num) + (to-1)) & (~(to-1))) |
| #define ALIGN8K 8192 |
| #define ALIGN4K 4096 |
| #define ALIGN2K 2048 |
| #define ALIGN512 512 |
| #define ALIGN256 256 |
| #define ALIGN128 128 |
| #define ALIGN64 64 |
| #define ALIGN32 32 |
| #define ALIGN16 16 |
| |
| #define ADRENO_PIXELFORMAT_R8G8B8A8 28 |
| #define ADRENO_PIXELFORMAT_B5G6R5 85 |
| |
| typedef C2D_STATUS (*LINK_c2dCreateSurface)( uint32 *surface_id, |
| uint32 surface_bits, |
| C2D_SURFACE_TYPE surface_type, |
| void *surface_definition ); |
| |
| typedef C2D_STATUS (*LINK_c2dUpdateSurface)( uint32 surface_id, |
| uint32 surface_bits, |
| C2D_SURFACE_TYPE surface_type, |
| void *surface_definition ); |
| |
| typedef C2D_STATUS (*LINK_c2dReadSurface)( uint32 surface_id, |
| C2D_SURFACE_TYPE surface_type, |
| void *surface_definition, |
| int32 x, int32 y ); |
| |
| typedef C2D_STATUS (*LINK_c2dDraw)( uint32 target_id, |
| uint32 target_config, C2D_RECT *target_scissor, |
| uint32 target_mask_id, uint32 target_color_key, |
| C2D_OBJECT *objects_list, uint32 num_objects ); |
| |
| typedef C2D_STATUS (*LINK_c2dFlush)( uint32 target_id, c2d_ts_handle *timestamp); |
| |
| typedef C2D_STATUS (*LINK_c2dFinish)( uint32 target_id); |
| |
| typedef C2D_STATUS (*LINK_c2dWaitTimestamp)( c2d_ts_handle timestamp ); |
| |
| typedef C2D_STATUS (*LINK_c2dDestroySurface)( uint32 surface_id ); |
| |
| typedef C2D_STATUS (*LINK_c2dMapAddr)( int mem_fd, void * hostptr, uint32 len, uint32 offset, uint32 flags, void ** gpuaddr); |
| |
| typedef C2D_STATUS (*LINK_c2dUnMapAddr)(void * gpuaddr); |
| |
| typedef void (*LINK_adreno_compute_fmt_aligned_width_and_height)(int width, int height, int plane_id, |
| int format, int num_samples, |
| int tile_mode, int raster_mode, |
| int padding_threshold, int *aligned_w, |
| int *aligned_h); |
| /*TODO: THIS NEEDS TO ENABLED FOR JB PLUS*/ |
| enum ColorConvertFormat { |
| RGB565 = 1, |
| YCbCr420Tile, |
| YCbCr420SP, |
| YCbCr420P, |
| YCrCb420P, |
| RGBA8888, |
| RGBA8888_UBWC, |
| NV12_2K, |
| NV12_512, |
| NV12_128m, |
| NV12_UBWC, |
| TP10_UBWC, |
| YCbCr420_VENUS_P010, |
| CbYCrY, |
| NO_COLOR_FORMAT |
| }; |
| |
| typedef struct { |
| int32_t numerator; |
| int32_t denominator; |
| } C2DBytesPerPixel; |
| |
| typedef struct { |
| int32_t width; |
| int32_t height; |
| int32_t stride; |
| int32_t sliceHeight; |
| int32_t lumaAlign; |
| int32_t sizeAlign; |
| int32_t size; |
| C2DBytesPerPixel bpp; |
| } C2DBuffReq; |
| |
| typedef enum { |
| C2D_INPUT = 0, |
| C2D_OUTPUT, |
| } C2D_PORT; |
| |
| typedef std::unordered_map <int, int> ColorMapping; |
| |
| class C2DColorConverter{ |
| |
| void *mC2DLibHandle; |
| LINK_c2dCreateSurface mC2DCreateSurface; |
| LINK_c2dUpdateSurface mC2DUpdateSurface; |
| LINK_c2dReadSurface mC2DReadSurface; |
| LINK_c2dDraw mC2DDraw; |
| LINK_c2dFlush mC2DFlush; |
| LINK_c2dFinish mC2DFinish; |
| LINK_c2dWaitTimestamp mC2DWaitTimestamp; |
| LINK_c2dDestroySurface mC2DDestroySurface; |
| LINK_c2dMapAddr mC2DMapAddr; |
| LINK_c2dUnMapAddr mC2DUnMapAddr; |
| |
| void *mAdrenoUtilsHandle; |
| LINK_adreno_compute_fmt_aligned_width_and_height mAdrenoComputeFmtAlignedWidthAndHeight; |
| |
| uint32_t mSrcSurface, mDstSurface; |
| void * mSrcSurfaceDef; |
| void * mDstSurfaceDef; |
| |
| C2D_OBJECT mBlit; |
| size_t mSrcWidth; |
| size_t mSrcHeight; |
| size_t mSrcStride; |
| size_t mDstWidth; |
| size_t mDstHeight; |
| size_t mSrcSize; |
| size_t mDstSize; |
| size_t mSrcYSize; |
| size_t mDstYSize; |
| ColorConvertFormat mSrcFormat; |
| ColorConvertFormat mDstFormat; |
| int32_t mFlags; |
| |
| bool enabled; |
| bool mConversionNeeded; |
| |
| pthread_mutex_t mLock; |
| |
| public: |
| C2DColorConverter(); |
| ~C2DColorConverter(); |
| |
| bool getConversionNeeded() { return mConversionNeeded; } |
| void setConversionNeeded(bool needed) { mConversionNeeded = needed; } |
| bool isPropChanged(size_t srcWidth, size_t srcHeight, size_t dstWidth, |
| size_t dstHeight, ColorConvertFormat srcFormat, |
| ColorConvertFormat dstFormat, int32_t flags, |
| size_t srcStride); |
| bool setResolution(size_t srcWidth, size_t srcHeight, size_t dstWidth, |
| size_t dstHeight, ColorConvertFormat srcFormat, |
| ColorConvertFormat dstFormat, int32_t flags, |
| size_t srcStride); |
| int32_t getBuffSize(int32_t port); |
| bool getBuffFilledLen(int32_t port, unsigned int &filled_length); |
| bool getBuffReq(int32_t port, C2DBuffReq *req); |
| int32_t dumpOutput(char * filename, char mode); |
| bool convertC2D(int srcFd, void *srcBase, void * srcData, |
| int dstFd, void *dstBase, void * dstData); |
| bool isYUVSurface(ColorConvertFormat format); |
| int32_t getDummySurfaceDef(ColorConvertFormat format, size_t width, |
| size_t height, bool isSource); |
| C2D_STATUS updateYUVSurfaceDef(uint8_t *addr, void *base, void * data, bool isSource); |
| C2D_STATUS updateRGBSurfaceDef(uint8_t *addr, void * data, bool isSource); |
| uint32_t getC2DFormat(ColorConvertFormat format, bool isSource); |
| size_t calcStride(ColorConvertFormat format, size_t width); |
| size_t calcYSize(ColorConvertFormat format, size_t width, size_t height); |
| size_t calcSize(ColorConvertFormat format, size_t width, size_t height); |
| void *getMappedGPUAddr(int bufFD, void *bufPtr, size_t bufLen); |
| bool unmapGPUAddr(unsigned long gAddr); |
| size_t calcLumaAlign(ColorConvertFormat format); |
| size_t calcSizeAlign(ColorConvertFormat format); |
| C2DBytesPerPixel calcBytesPerPixel(ColorConvertFormat format); |
| }; |
| |
| #endif // C2D_ColorConverter_H_ |