PXA300/310的2D圖形加速範例程式碼

來源:互聯網
上載者:User

轉載時請註明出處和作者連絡方式
文章出處: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(&region, 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, &region);</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(&region, 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, &region, 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(&region, 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, &region, 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(&region, 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, &region, 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(&region, 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, &region, 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(&region, 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, &region, 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。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.