轉載時請註明出處和作者連絡方式
文章出處:http://www.limodev.cn/blog
作者連絡方式:李先靜 <xianjimli at hotmail dot com>
第一次使用PXA300/310的2D圖形加速庫,真是有點麻煩。其中一個問題就是縮放功能根本不工作,只要一執行縮放功能系統就不動了,折騰了兩天時間才找出原因(datasheet太長,否則花兩天時間去讀datasheet也不會出現這個問題了)。網上也找不相關資料,這裡放個測試程式供大家參考吧(有興趣的朋友可以拿新版本的broncho a1測試一下)。
#include <stdio.h><br />#include <stdlib.h><br />#include <unistd.h><br />#include "m2d_lib.h"</p><p>#define FB_W 320<br />#define FB_H 480</p><p>void test_fill(struct m2d_context* ctx, struct m2d_buff *src, int w, int h, GCU_PIXEL_FORMAT format, GCU_COLOR_VALUE color)<br />{<br /> int ret = 0;<br /> struct m2d_op_region region;<br /> memset(®ion, 0x00, sizeof(region));<br /> region.width = w;<br /> region.height = h;</p><p> ret = m2d_set_dstbuf2(ctx, src);<br /> ret = m2d_set_fill_color(ctx, format, color);<br /> ret = m2d_color_fill(ctx, ®ion);</p><p> ret = m2d_set_dstbuf2(ctx, src);<br /> m2d_set_line_width(ctx, 2);<br /> ret = m2d_set_line_color(ctx, format, 0xff);<br /> ret = m2d_draw_line(ctx, w/4, 0, w/4, h-1);<br /> ret = m2d_draw_line(ctx, w/2, 0, w/2, h-1);<br /> ret = m2d_draw_line(ctx, 3*w/4, 0, 3*w/4, h-1);</p><p> ret = m2d_sync(ctx);</p><p> return;<br />}</p><p>void test_stretch(struct m2d_context* ctx, struct m2d_buff* fb, struct m2d_buff *src)<br />{<br /> int ret = 0;<br /> struct m2d_op_region region;<br /> printf("%s:%d/n", __func__, __LINE__);<br /> memset(®ion, 0x00, sizeof(region));<br /> region.width = FB_W/4;<br /> region.height = FB_H/4;<br /> ret = m2d_set_srcbuf0(ctx, src);<br /> ret = m2d_set_dstbuf2(ctx, fb);<br /> ret = m2d_stretch_blt(ctx, ®ion, FB_W, FB_H);<br /> ret = m2d_submit(ctx);</p><p> return;<br />}</p><p>void test_decimate(struct m2d_context* ctx, struct m2d_buff* fb, struct m2d_buff *src)<br />{<br /> int ret = 0;<br /> struct m2d_op_region region;<br /> printf("%s:%d/n", __func__, __LINE__);<br /> memset(®ion, 0x00, sizeof(region));<br /> region.width = FB_W/2;<br /> region.height = FB_H/2;<br /> ret = m2d_set_srcbuf0(ctx, src);<br /> ret = m2d_set_dstbuf2(ctx, fb);<br /> ret = m2d_decimate_blt(ctx, ®ion, FB_W/2, FB_H/2);<br /> ret = m2d_submit(ctx);</p><p> return;<br />}</p><p>void test_scale(struct m2d_context* ctx, struct m2d_buff* fb, struct m2d_buff *src)<br />{<br /> int ret = 0;<br /> struct m2d_op_region region;<br /> printf("%s:%d/n", __func__, __LINE__);<br /> memset(®ion, 0x00, sizeof(region));<br /> region.width = FB_W-1;<br /> region.height = FB_H-1;<br /> ret = m2d_set_srcbuf0(ctx, src);<br /> ret = m2d_set_dstbuf2(ctx, fb);<br /> ret = m2d_scale_blt(ctx, ®ion, 0x100);<br /> ret = m2d_submit(ctx);</p><p> return;<br />}</p><p>void test_bias(struct m2d_context* ctx, struct m2d_buff* fb, struct m2d_buff *src)<br />{<br /> int ret = 0;<br /> struct m2d_op_region region;<br /> printf("%s:%d/n", __func__, __LINE__);<br /> memset(®ion, 0x00, sizeof(region));<br /> region.width = FB_W-1;<br /> region.height = FB_H-1;<br /> ret = m2d_set_srcbuf0(ctx, src);<br /> ret = m2d_set_dstbuf2(ctx, fb);<br /> ret = m2d_bias_blt(ctx, ®ion, 0);<br /> ret = m2d_submit(ctx);</p><p> return;<br />}</p><p>void test_rotate(struct m2d_context* ctx, struct m2d_buff* fb, struct m2d_buff *src, int w, int h, GCU_ROTATION rot)<br />{<br /> int ret = 0;<br /> struct m2d_op_region region;<br /> printf("%s:%d/n", __func__, __LINE__);<br /> memset(®ion, 0x00, sizeof(region));<br /> region.width = w;<br /> region.height = h;<br /> ret = m2d_set_srcbuf0(ctx, src);<br /> ret = m2d_set_dstbuf2(ctx, fb);<br /> ret = m2d_rotate_blt(ctx, ®ion, rot);<br /> ret = m2d_submit(ctx);</p><p> return;<br />}</p><p>GCU_COLOR_VALUE bg[] = {0xFFFF, 0x1F, 0x7E0, 0xF40000, 0x00};<br />int main(int argc, char* argv[])<br />{<br /> struct m2d_context* ctx = m2d_create_context();<br /> struct m2d_buff* fb = m2d_get_primary();<br /> struct m2d_buff *src = m2d_alloc_buffer(ctx, FB_W, FB_H, GCU_PXLFMT_RGB565);<br /> struct m2d_buff *rsrc = m2d_alloc_buffer(ctx, FB_H, FB_W, GCU_PXLFMT_RGB565);</p><p> test_fill(ctx, fb, FB_W, FB_H, GCU_PXLFMT_RGB565, 0xFFFF);<br /> test_fill(ctx, src, FB_W, FB_H, GCU_PXLFMT_RGB565, 0xF800);<br /> test_scale(ctx, fb, src);</p><p> sleep(1);<br /> test_fill(ctx, fb, FB_W, FB_H, GCU_PXLFMT_RGB565, 0xFFFF);<br /> sleep(1);<br /> test_fill(ctx, src, FB_W, FB_H, GCU_PXLFMT_RGB565, 0x7E0);<br /> test_bias(ctx, fb, src);</p><p> sleep(1);<br /> test_fill(ctx, fb, FB_W, FB_H, GCU_PXLFMT_RGB565, 0xFFFF);<br /> sleep(1);<br /> test_fill(ctx, src, FB_W, FB_H, GCU_PXLFMT_RGB565, 0xF800);<br /> test_stretch(ctx, fb, src);</p><p> sleep(1);<br /> test_fill(ctx, fb, FB_W, FB_H, GCU_PXLFMT_RGB565, 0xFFFF);<br /> sleep(1);<br /> test_fill(ctx, src, FB_W, FB_H, GCU_PXLFMT_RGB565, 0x7E0);<br /> test_decimate(ctx, fb, src);</p><p> sleep(1);<br /> test_fill(ctx, fb, FB_W, FB_H, GCU_PXLFMT_RGB565, 0xFFFF);<br /> sleep(1);<br /> test_fill(ctx, rsrc, FB_H, FB_W, GCU_PXLFMT_RGB565, 0xF800);<br /> test_rotate(ctx, fb, rsrc, FB_H, FB_W, GCU_ROTATE_90);<br /> sleep(1);</p><p> test_fill(ctx, fb, FB_W, FB_H, GCU_PXLFMT_RGB565, 0xFFFF);<br /> sleep(1);<br /> test_fill(ctx, rsrc, FB_H, FB_W, GCU_PXLFMT_RGB565, 0xF800);<br /> test_rotate(ctx, fb, rsrc, FB_H, FB_W, GCU_ROTATE_270);<br /> sleep(1);</p><p> test_fill(ctx, fb, FB_W, FB_H, GCU_PXLFMT_RGB565, 0xFFFF);<br /> sleep(1);<br /> test_fill(ctx, src, FB_W, FB_H, GCU_PXLFMT_RGB565, 0xF800);<br /> test_rotate(ctx, fb, src, FB_W, FB_H, GCU_ROTATE_0);<br /> sleep(1);</p><p> test_fill(ctx, fb, FB_W, FB_H, GCU_PXLFMT_RGB565, 0xFFFF);<br /> sleep(1);<br /> test_fill(ctx, src, FB_W, FB_H, GCU_PXLFMT_RGB565, 0xF800);<br /> test_rotate(ctx, fb, src, FB_W, FB_H, GCU_ROTATE_180);<br /> sleep(1);</p><p> m2d_free_buffer(ctx, src);<br /> m2d_free_buffer(ctx, rsrc);<br /> m2d_free_context(ctx);</p><p> return 0;<br />}<br />
說明一下:
1.如果你希望命令立即執行時,記得調用一下m2d_submit(ctx)。
2.縮放的寬度是有限制的,具體參數看看datasheet。