Android gralloc 模塊實例


  本文實例為借鑒 http://www.ixueyi.com/jingyan/1865079.html 該文檔后所寫。主要是android的gralloc操作顯存的模塊實例,如有不正確的地方歡迎指出謝謝。

  Android幀緩沖區硬件抽象層模塊Gralloc的實現原理。

   1. 分配一個匹配屏幕大小的圖形緩沖區

     2. 將分配好的圖形緩沖區注冊(映射)到當前進程的地址空間來

     3. 將要繪制的畫面的內容寫入到已經注冊好的圖形緩沖區中去,並且渲染(拷貝)到系統幀緩沖區中去

    為了實現以上三個操作,我們還需要:

    1. 加載Gralloc模塊

    2. 打開Gralloc模塊中的gralloc設備和fb設備

    其中,gralloc設備負責分配圖形緩沖區,Gralloc模塊負責注冊圖形緩沖區,而fb設備負責渲染圖形緩沖區。

  直接看源碼:

  

 1 framebuffer_device_t* fbDev;
 2 alloc_device_t* grDev;
 3 
 4 hw_module_t const* module;
 5 buffer_handle_t handle;
 6 gralloc_module_t const *mAllocMod;
 7 void* vaddr;
 8 int stride;
 9 int err;
10 if (hw_get_module(GRALLOC_HARDWARE_MODULE_ID, &module) == 0) {//加載gralloc模塊
11        
12         err = framebuffer_open(module, &fbDev); //打開fb設備
13         if(err) LOGE("couldn't open framebuffer HAL (%s)", strerror(-err));
14         err = gralloc_open(module, &grDev); //打開gralloc設備
15         if(err) LOGE("couldn't open gralloc HAL (%s)", strerror(-err));
16         
17         err = grDev->alloc(grDev, display.w, display.h, HAL_PIXEL_FORMAT_RGBA_8888, GRALLOC_USAGE_HW_FB/*決定申請的是系統圖形內存還是普通內存*/, &handle, &stride); //分配圖形緩沖區
18         // err = grDev->alloc(grDev, 1024, 600, HAL_PIXEL_FORMAT_RGBA_8888, 0/*決定申請的是系統圖形內存還是普通內存*/, &handle, &stride); //分配圖形緩沖區
19         
20         mAllocMod = (gralloc_module_t const *)module;
21         err = mAllocMod->registerBuffer(mAllocMod, handle); //映射內存到進程中
22         
23         
24         err = mAllocMod->lock(mAllocMod, handle, HAL_PIXEL_FORMAT_RGBA_8888, 0, 0, display.w, display.h, &vaddr);
25         LOGE("++++++++++++++++> vaddr = %p\n", vaddr);
26 
27          err = mAllocMod->lock(mAllocMod, handle, HAL_PIXEL_FORMAT_RGBA_8888, 0, 0, 1024, 600, &vaddr);
28         LOGE("++++++++++++++++> vaddr = %p\n", vaddr);

29 //這就繪圖即可,將繪制的圖的內存直接拷貝到vaddr里面即可 30 bitmap.lockPixels(); 31   canvas->drawPath(path, paint); 33   memcpy(vaddr, bitmap.getPixels(), bitmap.getSize()); 34   bitmap.unlockPixels();
35 err = mAllocMod->unlock(mAllocMod, handle); 36 37 err = fbDev->post(fbDev, handle); //圖形緩沖區的渲染 38 39 err = mAllocMod->unregisterBuffer(mAllocMod, handle); //解除映射內存 40 41 grDev->free(grDev, handle);//釋放圖形緩沖區 42 43 gralloc_close(grDev);//關閉gralloc設備 44 framebuffer_close(fbDev);//關閉fb設備 45 }

這樣就可以直接繪圖顯示在屏幕上了,比直接操作/dev/graphics/fb0 設備文件要穩定很多。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM