您好,登錄后才能下訂單哦!
1.簡介
在DRM(Direct Rendering Manager)中,學習了drmModePageFlip和drmModeSetCrtc的用法。但是這兩個接口都只能全屏顯示Framebuffer的內容,如何才能在屏幕上只顯示framebuffer的一部分內容呢?本篇將介紹DRM另一個重要的刷圖接口:drmModeSetPlane。
首先來了解一下,什么是Plane?簡單描述Plane的概念,即硬件圖層。而詳細了解下Plane的概念,即DRM中的Plane和我們常見的YUV/YCbCr圖形格式中的Plane完全是兩個不同的概念。YUV圖形格式中的Plane指的是圖像數據在內存中的排列形式,一般Y通道占一段連續的內存塊,UV通道占另一段連續的內存塊,稱之為YUV-2Plane (也叫YUV 2平面),屬于軟件層面。而DRM中的Plane指的是Display Controller中用于多層合成的單個硬件圖層模塊,屬于硬件層面。二者概念上不要混淆。
1.1Plane的歷史
隨著軟件技術的不斷更新,對硬件的性能要求越來越高,在滿足功能正常使用的前提下,對功耗的要求也越來越苛刻。本來GPU可以處理所有圖形任務,但是由于它運行時的功耗實在太高,設計者們決定將一部分簡單的任務交給Display Controller去處理(比如合成),而讓GPU專注于繪圖(即渲染)這一主要任務,減輕GPU的負擔,從而達到降低功耗提升性能的目的。于是,Plane(硬件圖層單元)就誕生了。
1.2Plane的功能
Plane是連接FB與CRTC的紐帶,是內存的搬運工。
Plane的參數含義:
當 SRC_X/Y 和 CRTC_X/Y 不相等時,就實現了平移的效果;
當 SRC_W/H 和 CRTC_W/H 不相等時,就實現了縮放的效果;
當 SRC_W/H 和 FB_W/H 不相等時,就實現了裁剪的效果;
簡單代碼圖 2.1所示
圖 2.1 Plane的代碼實現
1.3Plane的類型
在DRM框架中,Plane又分為如下3種類型:Cursor(光標圖層,一般用于PC系統,用于顯示鼠標)、Overlay(疊加圖層,通常用于YUV格式的視頻圖層)、Primary(主要圖層,通常用于僅支持RGB格式的簡單圖層)。需要注意的是,并不是所有的Display Controller都支持Plane,從前面Single-Buffer 案例中的drmModeSetCrtc函數也能看出,即使沒有plane_id,屏幕也能正常顯示。比如s3c2440這種ARM9 SoC,它的LCDC就沒有Plane的概念。但是DRM框架規定,任何一個CRTC,必須要有1個Primary Plane。 即使像S3C2440這種不帶真實Plane硬件的Display Controller,也需要認為它的Primary Plane就是LCDC本身,因為它實現了從Framebuffer到CRTC的數據搬運工作,而這正是一個Plane最基本的功能。
1.4Plane的測試用例
在Google Android工程中external/libdrm/tests/planetest/planetest.c文件,為了演示方便,僅僅實現了一個最簡單的drmModeSetPlane()調用。需要注意的是,該函數調用之前,必須先通過drmModeSetCrtc()初始化整個顯示鏈路,否則Plane設置將無效。程序運行后,屏幕顯示全屏白色;當輸入回車后,屏幕將FrameBuffer中的(100,150)的矩形,顯示到屏幕的(50,50)位置;再次輸入回車后,程序退出。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。