DRM應用程式高階 (atomic crtc)

2021-10-21 01:38:11 字數 4592 閱讀 6960

為什麼叫「atomic commit」?

初學者第一次接觸到drm時,總會好奇當初開發者為什麼要起 atomic 這個名字。wiki上關於該名詞有較詳細的解釋,如果大家感興趣可以通過本篇結尾的參考資料獲取鏈結檢視。我這裡用白話簡單概括就是:本次commit操作,要麼成功,要麼保持原來的狀態不變。即如果中途操作失敗了,那些已經生效的配置需要恢復成之前的狀態,就像沒發生過commit操作似的,這就是atomic的含義。

而用commit 一詞,是因為本次操作可能會修改到多個引數,等修改好這些引數後,再一次性發起操作請求,有點類似與填表後「提交」材料的意思。

如何操作property?

需要記住一點,在libdrm中,所有的操作都是以object id來進行訪問的,因此要操作property,首先需要獲取該property的object id。

偽**:

int

main

(void

)

首先通過drmmodegetproperty()來獲取property的相關資訊,然後通過drmmodeatomicaddproperty()來修改property的值,最後通過drmmodeatomiccommit()來發起真正的修改請求。

為什麼要設定 drm_client_cap_atomic ?基於之前的《最簡單的drm應用程式(plane-test)》的參考**,我們使用atomic介面來替代原來的drmmodesetcrtc()介面,從而通過差異對比來學些atomic介面的操作。

modeset-atomic-crtc.c

#define _gnu_source

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

struct buffer_object

;struct buffer_object buf;

static

intmodeset_create_fb

(int fd,

struct buffer_object *bo)

;struct drm_mode_map_dumb map =

; create.width = bo->width;

create.height = bo->height;

create.bpp =32;

drmioctl

(fd, drm_ioctl_mode_create_dumb,

&create)

; bo->pitch = create.pitch;

bo->size = create.size;

bo->handle = create.handle;

drmmodeaddfb

(fd, bo->width, bo->height,24,

32, bo->pitch,

bo->handle,

&bo->fb_id)

; map.handle = create.handle;

drmioctl

(fd, drm_ioctl_mode_map_dumb,

&map)

; bo->vaddr =

mmap(0

, create.size, prot_read | prot_write,

map_shared, fd, map.offset)

;memset

(bo->vaddr,

0xff

, bo->size)

;return0;

}static

void

modeset_destroy_fb

(int fd,

struct buffer_object *bo)

;drmmodermfb

(fd, bo->fb_id)

;munmap

(bo->vaddr, bo->size)

; destroy.handle = bo->handle;

drmioctl

(fd, drm_ioctl_mode_destroy_dumb,

&destroy);}

static uint32_t get_property_id

(int fd, drmmodeobjectproperties *props,

const

char

*name)

return id;

}int

main

(int argc,

char

**ar**)

通過上面的**我們可以看出,原來的drmmodesetcrtc(crtc_id, fb_id, conn_id, &mode)被下面這部分**取代了:

req =

drmmodeatomicalloc()

;drmmodeatomicaddproperty

(req, crtc_id, property_active,1)

;drmmodeatomicaddproperty

(req, crtc_id, property_mode_id, blob_id)

;drmmodeatomicaddproperty

(req, conn_id, property_crtc_id, crtc_id)

;drmmodeatomiccommit

(fd, req, drm_mode_atomic_allow_modeset,

null);

drmmodeatomicfree

(req)

;

雖然**量增加了,但是應用程式的靈活性和可擴充套件性也增強了。

由於以上**沒有新增對 fb_id 的操作,因此它的作用只是初始化crtc/encoder/connector硬體,以及建立硬體鏈路的連線關係,並不會顯示framebuffer的內容,即保持黑屏狀態。framebuffer的顯示將由後面的 drmmodesetplane() 操作來完成。

以上**執行的效果如下(模擬效果):

注意:程式執行之前,請確保沒有其它應用或服務占用/dev/dri/card0節點,否則將出現permission denied錯誤。

描述:

程式執行後,螢幕顯示黑色,終端列印「drmmodeatomiccommit」資訊,表明當前已經初始化好crtc/encoder/connector硬體;

輸入回車後,螢幕顯示framebuffer的crop區域,同時終端列印「drmmodesetplane」資訊;

再次輸入回車,顯示黑屏,程式退出。

在《最簡單的drm應用程式(plane-test)》文章中曾強調過,drmmodesetplane() 呼叫之前,必須先呼叫drmmodesetcrtc() 初始化底層硬體,否則plane設定將無效。而通過上面的程式執行結果可以證明,drmmodeatomiccommit() 操作同樣可以初始化底層硬體。

wiki: atomic commit

lwn: atomic mode setting design overview, part 1, part2

android libdrm: modeset.c

drm (direct rendering manager) 學習簡介

為什麼叫「atomic commit」?

初學者第一次接觸到drm時,總會好奇當初開發者為什麼要起 atomic 這個名字。wiki上關於該名詞有較詳細的解釋,如果大家感興趣可以通過本篇結尾的參考資料獲取鏈結檢視。我這裡用白話簡單概括就是:本次commit操作,要麼成功,要麼保持原來的狀態不變。即如果中途操作失敗了,那些已經生效的配置需要恢復成之前的狀態,就像沒發生過commit操作似的,這就是atomic的含義。

而用commit 一詞,是因為本次操作可能會修改到多個引數,等修改好這些引數後,再一次性發起操作請求,有點類似與填表後「提交」材料的意思。

如何操作property?

需要記住一點,在libdrm中,所有的操作都是以object id來進行訪問的,因此要操作property,首先需要獲取該property的object id。

偽**:

DRM應用程式高階 (atomic crtc)

為什麼叫 atomic commit 初學者第一次接觸到drm時,總會好奇當初開發者為什麼要起 atomic 這個名字。wiki上關於該名詞有較詳細的解釋,如果大家感興趣可以通過本篇結尾的參考資料獲取鏈結檢視。我這裡用白話簡單概括就是 本次commit操作,要麼成功,要麼保持原來的狀態不變。即如果中...

DRM應用程式高階 (atomic plane)

plane update的atomic操作如下 drmmodeatomicaddproperty req,plane id,property crtc id,crtc id drmmodeatomicaddproperty req,plane id,property fb id,fb id drmm...

ios應用程式和應用程式委託

其實說白了,就是乙個類將自己不願意實現的方法以協議的方式定義,同時在這個類中包含有乙個型別為id 泛型類 的例項變數,如果另乙個類實現了這個協議,那麼另外的這個類就可以作為第乙個類的委託物件,前乙個類將自己不願意實現的類委託給後乙個類。因為第乙個類擁有第二個類的引用,所有第乙個類的例項可以直接呼叫第...