Copybit HAL模塊分析報告
Rockie Cheng
[email protected]
1、copybit模塊的繼承關係圖
2、copybit模塊支持的圖像格式
注意,並不是所有硬件都支持這麼多格式
COPYBIT_FORMAT_RGBA_8888 = HAL_PIXEL_FORMAT_RGBA_8888,
COPYBIT_FORMAT_RGBX_8888 = HAL_PIXEL_FORMAT_RGBX_8888,
COPYBIT_FORMAT_RGB_888 = HAL_PIXEL_FORMAT_RGB_888,
COPYBIT_FORMAT_RGB_565 = HAL_PIXEL_FORMAT_RGB_565,
COPYBIT_FORMAT_BGRA_8888 = HAL_PIXEL_FORMAT_BGRA_8888,
COPYBIT_FORMAT_RGBA_5551 = HAL_PIXEL_FORMAT_RGBA_5551,
COPYBIT_FORMAT_RGBA_4444 = HAL_PIXEL_FORMAT_RGBA_4444,
COPYBIT_FORMAT_YCbCr_422_SP = HAL_PIXEL_FORMAT_YCbCr_422_SP,
COPYBIT_FORMAT_YCbCr_420_SP = HAL_PIXEL_FORMAT_YCbCr_420_SP,
3、copybit支持的功能
* 圖像旋轉
> 90°、180°、270°、水平翻轉、垂直翻轉
* Alpha Blending
> 數值範圍0-255
* 抖動
* 透明
* 模糊
* 剪裁
* Stretch(縮放)
* Bit Blit(塊拷貝,支持xy座標)
4、圖像結構體
struct copybit_image_t {
/* width 寬度*/
uint32_t w;
/* height 高度 */
uint32_t h;
/* format COPYBIT_FORMAT_xxx格式 */
int32_t format;
/* base of buffer with image 基址*/
void *base;
/* handle to the image 圖像句柄,Native_handle.h (system/core/include/cutils)中定義*/
native_handle_t* handle;
};
5、copybit模塊支持的函數接口
(1)設置參數
int (*set_parameter)(struct copybit_device_t *dev, int name, int value);
(2)獲取信息
int (*get)(struct copybit_device_t *dev, int name);
(3)Blit操作
int (*blit)(struct copybit_device_t *dev,
struct copybit_image_t const *dst,
struct copybit_image_t const *src,
struct copybit_region_t const *region);
(4)Stretch操作
int (*stretch)(struct copybit_device_t *dev,
struct copybit_image_t const *dst,
struct copybit_image_t const *src,
struct copybit_rect_t const *dst_rect,
struct copybit_rect_t const *src_rect,
struct copybit_region_t const *region);
高通Copybit 模塊 HAL分析
1、Copybit Module寫法
struct copybit_module_t HAL_MODULE_INFO_SYM = {
common: {
tag: HARDWARE_MODULE_TAG,
version_major: 1,
version_minor: 0,
id: COPYBIT_HARDWARE_MODULE_ID,
name: "QCT MSM7K COPYBIT Module",
author: "Google, Inc.",
methods: ©bit_module_methods
}
};
2、私有函數
(1)min(int a, int b)
(2)max(int a, int b)
(3)void MULDIV(uint32_t *a, uint32_t *b, int mul, int div)
(4)void intersect(struct copybit_rect_t *out,
const struct copybit_rect_t *lhs,
const struct copybit_rect_t *rhs)
作用:Clip函數
(5)get_format(int format)
作用:獲取圖形格式
(6)void set_image(struct mdp_img *img, const struct copybit_image_t *rhs)
作用:將Copybitimage結構體轉換爲mdp image結構
(7)void set_rects(struct copybit_context_t *dev,
struct mdp_blit_req *e,
const struct copybit_rect_t *dst,
const struct copybit_rect_t *src,
const struct copybit_rect_t *scissor)
作用:設置矩形框
(8)void set_infos(struct copybit_context_t *dev, struct mdp_blit_req *req)
作用:設置mdp請求
(9)int msm_copybit(struct copybit_context_t *dev, void const *list)
作用:執行copybit操作
3、共有函數
(1)int set_parameter_copybit(
struct copybit_device_t *dev,
int name,
int value)
作用:設置參數
參數類型:
旋轉 0 90 180 270
Alpha 0-255
抖動 使能/禁止
模糊 使能/禁止
透明 0-7
(2) int get(struct copybit_device_t *dev, int name)
作用:獲取固定參數
參數:
最小縮放小數位4-msm7k 8-msm8k
最大縮放小數位4-msm7k 8-msm8k
Copybit縮放小數位32
Copybit旋轉步進角度(90°)
(3)int stretch_copybit(
struct copybit_device_t *dev,
struct copybit_image_t const *dst,
struct copybit_image_t const *src,
struct copybit_rect_t const *dst_rect,
struct copybit_rect_t const *src_rect,
struct copybit_region_t const *region)
作用,做stretch 和blit操作
通過一個while循環,積攢12個region,一次調用硬件驅動ioctl函數,將數據傳入驅動,進行stretch操作。
(4)int blit_copybit(
struct copybit_device_t *dev,
struct copybit_image_t const *dst,
struct copybit_image_t const *src,
struct copybit_region_t const *region)
作用:該操作沒有stretch操作
4、高通驅動中的不足之處:
查看內核2D驅動可知,MSM7k的做法是將buffer數據通過copy from
user函數複製到內核態,再由硬件驅動進行搬運。這樣在一定程度上會導致硬件加速效率降低。不過MSM7K使用了一個折中的做法,搬運的數據積攢到一定
程度(12個),在一次調用硬件驅動,統一傳輸,可以起到一定的緩衝作用。