PXA300/310的2D图形加速示例代码

转载时请注明出处和作者联系方式
文章出处:http://www.limodev.cn/blog
作者联系方式:李先静 <xianjimli at hotmail dot com>

第一次使用PXA300/310的2D图形加速库,真是有点麻烦。其中一个问题就是缩放功能根本不工作,只要一执行缩放功能系统就不动了,折腾了两天时间才找出原因(datasheet太长,否则花两天时间去读datasheet也不会出现这个问题了)。网上也找不相关资料,这里放个测试程序供大家参考吧(有兴趣的朋友可以拿新版本的broncho a1测试一下)。
#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include "m2d_lib.h" #define FB_W 320 #define FB_H 480 void test_fill(struct m2d_context* ctx, struct m2d_buff *src, int w, int h, GCU_PIXEL_FORMAT format, GCU_COLOR_VALUE color) { int ret = 0; struct m2d_op_region region; memset(&region, 0x00, sizeof(region)); region.width = w; region.height = h; ret = m2d_set_dstbuf2(ctx, src); ret = m2d_set_fill_color(ctx, format, color); ret = m2d_color_fill(ctx, &region); ret = m2d_set_dstbuf2(ctx, src); m2d_set_line_width(ctx, 2); ret = m2d_set_line_color(ctx, format, 0xff); ret = m2d_draw_line(ctx, w/4, 0, w/4, h-1); ret = m2d_draw_line(ctx, w/2, 0, w/2, h-1); ret = m2d_draw_line(ctx, 3*w/4, 0, 3*w/4, h-1); ret = m2d_sync(ctx); return; } void test_stretch(struct m2d_context* ctx, struct m2d_buff* fb, struct m2d_buff *src) { int ret = 0; struct m2d_op_region region; printf("%s:%d/n", __func__, __LINE__); memset(&region, 0x00, sizeof(region)); region.width = FB_W/4; region.height = FB_H/4; ret = m2d_set_srcbuf0(ctx, src); ret = m2d_set_dstbuf2(ctx, fb); ret = m2d_stretch_blt(ctx, &region, FB_W, FB_H); ret = m2d_submit(ctx); return; } void test_decimate(struct m2d_context* ctx, struct m2d_buff* fb, struct m2d_buff *src) { int ret = 0; struct m2d_op_region region; printf("%s:%d/n", __func__, __LINE__); memset(&region, 0x00, sizeof(region)); region.width = FB_W/2; region.height = FB_H/2; ret = m2d_set_srcbuf0(ctx, src); ret = m2d_set_dstbuf2(ctx, fb); ret = m2d_decimate_blt(ctx, &region, FB_W/2, FB_H/2); ret = m2d_submit(ctx); return; } void test_scale(struct m2d_context* ctx, struct m2d_buff* fb, struct m2d_buff *src) { int ret = 0; struct m2d_op_region region; printf("%s:%d/n", __func__, __LINE__); memset(&region, 0x00, sizeof(region)); region.width = FB_W-1; region.height = FB_H-1; ret = m2d_set_srcbuf0(ctx, src); ret = m2d_set_dstbuf2(ctx, fb); ret = m2d_scale_blt(ctx, &region, 0x100); ret = m2d_submit(ctx); return; } void test_bias(struct m2d_context* ctx, struct m2d_buff* fb, struct m2d_buff *src) { int ret = 0; struct m2d_op_region region; printf("%s:%d/n", __func__, __LINE__); memset(&region, 0x00, sizeof(region)); region.width = FB_W-1; region.height = FB_H-1; ret = m2d_set_srcbuf0(ctx, src); ret = m2d_set_dstbuf2(ctx, fb); ret = m2d_bias_blt(ctx, &region, 0); ret = m2d_submit(ctx); return; } void test_rotate(struct m2d_context* ctx, struct m2d_buff* fb, struct m2d_buff *src, int w, int h, GCU_ROTATION rot) { int ret = 0; struct m2d_op_region region; printf("%s:%d/n", __func__, __LINE__); memset(&region, 0x00, sizeof(region)); region.width = w; region.height = h; ret = m2d_set_srcbuf0(ctx, src); ret = m2d_set_dstbuf2(ctx, fb); ret = m2d_rotate_blt(ctx, &region, rot); ret = m2d_submit(ctx); return; } GCU_COLOR_VALUE bg[] = {0xFFFF, 0x1F, 0x7E0, 0xF40000, 0x00}; int main(int argc, char* argv[]) { struct m2d_context* ctx = m2d_create_context(); struct m2d_buff* fb = m2d_get_primary(); struct m2d_buff *src = m2d_alloc_buffer(ctx, FB_W, FB_H, GCU_PXLFMT_RGB565); struct m2d_buff *rsrc = m2d_alloc_buffer(ctx, FB_H, FB_W, GCU_PXLFMT_RGB565); test_fill(ctx, fb, FB_W, FB_H, GCU_PXLFMT_RGB565, 0xFFFF); test_fill(ctx, src, FB_W, FB_H, GCU_PXLFMT_RGB565, 0xF800); test_scale(ctx, fb, src); sleep(1); test_fill(ctx, fb, FB_W, FB_H, GCU_PXLFMT_RGB565, 0xFFFF); sleep(1); test_fill(ctx, src, FB_W, FB_H, GCU_PXLFMT_RGB565, 0x7E0); test_bias(ctx, fb, src); sleep(1); test_fill(ctx, fb, FB_W, FB_H, GCU_PXLFMT_RGB565, 0xFFFF); sleep(1); test_fill(ctx, src, FB_W, FB_H, GCU_PXLFMT_RGB565, 0xF800); test_stretch(ctx, fb, src); sleep(1); test_fill(ctx, fb, FB_W, FB_H, GCU_PXLFMT_RGB565, 0xFFFF); sleep(1); test_fill(ctx, src, FB_W, FB_H, GCU_PXLFMT_RGB565, 0x7E0); test_decimate(ctx, fb, src); sleep(1); test_fill(ctx, fb, FB_W, FB_H, GCU_PXLFMT_RGB565, 0xFFFF); sleep(1); test_fill(ctx, rsrc, FB_H, FB_W, GCU_PXLFMT_RGB565, 0xF800); test_rotate(ctx, fb, rsrc, FB_H, FB_W, GCU_ROTATE_90); sleep(1); test_fill(ctx, fb, FB_W, FB_H, GCU_PXLFMT_RGB565, 0xFFFF); sleep(1); test_fill(ctx, rsrc, FB_H, FB_W, GCU_PXLFMT_RGB565, 0xF800); test_rotate(ctx, fb, rsrc, FB_H, FB_W, GCU_ROTATE_270); sleep(1); test_fill(ctx, fb, FB_W, FB_H, GCU_PXLFMT_RGB565, 0xFFFF); sleep(1); test_fill(ctx, src, FB_W, FB_H, GCU_PXLFMT_RGB565, 0xF800); test_rotate(ctx, fb, src, FB_W, FB_H, GCU_ROTATE_0); sleep(1); test_fill(ctx, fb, FB_W, FB_H, GCU_PXLFMT_RGB565, 0xFFFF); sleep(1); test_fill(ctx, src, FB_W, FB_H, GCU_PXLFMT_RGB565, 0xF800); test_rotate(ctx, fb, src, FB_W, FB_H, GCU_ROTATE_180); sleep(1); m2d_free_buffer(ctx, src); m2d_free_buffer(ctx, rsrc); m2d_free_context(ctx); return 0; }
说明一下:
1.如果你希望命令立即执行时,记得调用一下m2d_submit(ctx)。
2.缩放的宽度是有限制的,具体参数看看datasheet。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值