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