UAPI

與此部分相關的原始碼可以在 pvr_drm.h 中找到。

除了標準的核心限制之外,PowerVR IOCTL 引數結構還有一些限制。

  • 所有成員必須是型別對齊的。

  • 整個結構必須填充到 64 位對齊。

  • 幾乎總是需要顯式填充。這採用 _padding_[x] 成員的形式,其大小足以填充到下一個 2 的冪對齊,其中 [x] 是十六進位制的結構偏移量。陣列永遠不會用於對齊。填充欄位必須清零;總是會檢查這一點。

  • 聯合只能作為結構的最後一個成員出現。

  • 單個聯合成員將來可能會增長。聯合成員末尾與其包含的聯合末尾之間的空間被認為是“隱式填充”,必須清零。總是會檢查這一點。

除了 IOCTL 引數結構之外,PowerVR UAPI 還使用 DEV_QUERY 引數結構。這些用於獲取有關裝置和執行時的資訊。這些結構遵循上述相同的規則。

物件陣列

struct drm_pvr_obj_array

用於傳遞物件陣列的容器

定義:

struct drm_pvr_obj_array {
    __u32 stride;
    __u32 count;
    __u64 array;
};

成員

stride

物件結構的步幅。用於版本控制。

count

陣列中物件的數量。

array

指向物件陣列的使用者指標。

描述

必須擴充套件物件以傳遞新引數的情況並不罕見,DRM ioctl 基礎設施透過在使用者空間傳遞的資料小於 drm_ioctl_desc 中定義的結構時用零填充 ioctl 引數來支援這一點,從而保持了向後相容性。這種型別只是將相同的概念應用於透過從主 ioctl 引數結構引用的陣列傳遞的間接物件:步幅基本上定義了使用者空間傳遞的物件的大小,這允許核心驅動程式在其小於預期物件大小時用零填充。

使用 DRM_PVR_OBJ_ARRAY() 填充物件陣列欄位,除非您有非常好的理由不這樣做。

DRM_PVR_OBJ_ARRAY

DRM_PVR_OBJ_ARRAY (cnt, ptr)

用於填充 struct drm_pvr_obj_array 的輔助宏。

引數

cnt

指向 ptr 的元素數量。

ptr

指向 C 陣列的開始的指標。

返回

struct drm_pvr_obj_array 型別的字面量。

IOCTL

PVR_IOCTL

PVR_IOCTL (_ioctl, _mode, _data)

構建 PowerVR IOCTL 編號

引數

_ioctl

此 IOCTL 的遞增 ID。新增到 DRM_COMMAND_BASE

_mode

必須是 DRM_IORDRM_IOWDRM_IOWR 之一。

_data

此 IOCTL 傳遞的 args 結構型別。

描述

_data 引用的結構必須具有 drm_pvr_ioctl_ 字首和 _args 字尾。因此,它們從 _data 中省略。

這應該只用於構建下面描述的常量;它永遠不應該用於直接呼叫 IOCTL。

返回

要從使用者空間傳遞到 ioctl() 的 IOCTL 編號。

DEV_QUERY

enum drm_pvr_dev_query

drm_pvr_ioctl_dev_query_args.type 一起使用,以指示接收容器的型別。

常量

DRM_PVR_DEV_QUERY_GPU_INFO_GET

dev query args 包含指向 struct drm_pvr_dev_query_gpu_info 的指標。

DRM_PVR_DEV_QUERY_RUNTIME_INFO_GET

dev query args 包含指向 struct drm_pvr_dev_query_runtime_info 的指標。

DRM_PVR_DEV_QUERY_QUIRKS_GET

dev query args 包含指向 struct drm_pvr_dev_query_quirks 的指標。

DRM_PVR_DEV_QUERY_ENHANCEMENTS_GET

dev query args 包含指向 struct drm_pvr_dev_query_enhancements 的指標。

DRM_PVR_DEV_QUERY_HEAP_INFO_GET

dev query args 包含指向 struct drm_pvr_dev_query_heap_info 的指標。

DRM_PVR_DEV_QUERY_STATIC_DATA_AREAS_GET

dev query args 包含指向 struct drm_pvr_dev_query_static_data_areas 的指標。

描述

僅追加。請勿重新排序。

struct drm_pvr_ioctl_dev_query_args

DRM_IOCTL_PVR_DEV_QUERY 的引數。

定義:

struct drm_pvr_ioctl_dev_query_args {
    __u32 type;
    __u32 size;
    __u64 pointer;
};

成員

type

查詢和輸出結構的型別。請參閱 enum drm_pvr_dev_query

size

接收結構的位元組大小,請參閱 type

成功呼叫後,這將更新為寫入的位元組長度。也可以用於獲取最小位元組長度(請參閱 pointer)。這允許將來將其他欄位附加到結構。

pointer

指向結構 type 的指標。

必須足夠大才能包含 size 位元組。如果指標為 NULL,則預期大小將返回到 size 欄位中,但不會寫入其他資料。

struct drm_pvr_dev_query_gpu_info

用於獲取有關圖形處理器資訊的容器。

定義:

struct drm_pvr_dev_query_gpu_info {
    __u64 gpu_id;
    __u32 num_phantoms;
    __u32 _padding_c;
};

成員

gpu_id

GPU 識別符號。

對於當前支援的所有 GPU,這是一個 BVNC,編碼為 64 位值,如下所示

63..48

47..32

31..16

15..0

B

V

N

C

num_phantoms

存在的幻影數量。

_padding_c

已保留。此欄位必須清零。

描述

當獲取此型別時,struct drm_pvr_ioctl_dev_query_args.type 必須設定為 DRM_PVR_DEV_QUERY_GPU_INFO_GET

struct drm_pvr_dev_query_runtime_info

用於獲取有關圖形執行時資訊的容器。

定義:

struct drm_pvr_dev_query_runtime_info {
    __u64 free_list_min_pages;
    __u64 free_list_max_pages;
    __u32 common_store_alloc_region_size;
    __u32 common_store_partition_space_size;
    __u32 max_coeffs;
    __u32 cdm_max_local_mem_size_regs;
};

成員

free_list_min_pages

允許的最小空閒列表大小,以 PM 物理頁為單位。

free_list_max_pages

允許的最大空閒列表大小,以 PM 物理頁為單位。

common_store_alloc_region_size

公共儲存中用於係數和共享暫存器的分配區域的大小,以 dwords 為單位。

common_store_partition_space_size

公共儲存中用於輸出緩衝區的分割槽空間的大小,以 dwords 為單位。

max_coeffs

最大系數,以 dwords 為單位。

cdm_max_local_mem_size_regs

計算核心可用的最大本地記憶體量,以 dwords 為單位。

描述

當獲取此型別時,struct drm_pvr_ioctl_dev_query_args.type 必須設定為 DRM_PVR_DEV_QUERY_RUNTIME_INFO_GET

struct drm_pvr_dev_query_quirks

用於獲取有關裝置可能需要在使用者模式驅動程式中支援的硬體修復程式的資訊的容器。

定義:

struct drm_pvr_dev_query_quirks {
    __u64 quirks;
    __u16 count;
    __u16 musthave_count;
    __u32 _padding_c;
};

成員

quirks

硬體 quirks __u32 陣列的使用者空間地址。

列表中的前 musthave_count 項是客戶端必須支援此裝置的 quirks。如果使用者空間不支援所有這些 quirks,則無法保證功能,並且客戶端初始化必須失敗。列表中的其餘 quirks 會影響使用者空間和核心或韌體。預設情況下停用它們,並且需要使用者空間選擇加入。選擇加入機制取決於 quirk。

count

quirks 的長度(__u32 的數量)。

musthave_count

quirks 中必須有的條目數,從索引 0 開始。

_padding_c

已保留。此欄位必須清零。

描述

當獲取此型別時,struct drm_pvr_ioctl_dev_query_args.type 必須設定為 DRM_PVR_DEV_QUERY_QUIRKS_GET

struct drm_pvr_dev_query_enhancements

用於獲取有關裝置支援的、使用者模式驅動程式中需要支援的可選增強功能資訊的容器。

定義:

struct drm_pvr_dev_query_enhancements {
    __u64 enhancements;
    __u16 count;
    __u16 _padding_a;
    __u32 _padding_c;
};

成員

enhancements

硬體增強 __u32 陣列的使用者空間地址。

這些增強功能會影響使用者空間和核心或韌體。預設情況下停用它們,並且需要使用者空間選擇加入。選擇加入機制取決於增強功能。

count

enhancements 的長度(__u32 的數量)。

_padding_a

已保留。此欄位必須清零。

_padding_c

已保留。此欄位必須清零。

描述

當獲取此型別時,struct drm_pvr_ioctl_dev_query_args.type 必須設定為 DRM_PVR_DEV_ENHANCEMENTS_GET

enum drm_pvr_heap_id

DRM_PVR_DEV_QUERY_HEAP_INFO_GET 返回的堆資訊資料的陣列索引。

常量

DRM_PVR_HEAP_GENERAL

通用堆。

DRM_PVR_HEAP_PDS_CODE_DATA

PDS 程式碼和資料堆。

DRM_PVR_HEAP_USC_CODE

USC 程式碼堆。

DRM_PVR_HEAP_RGNHDR

區域標頭堆。僅當 GPU 具有 BRN63142 時才使用。

DRM_PVR_HEAP_VIS_TEST

可見性測試堆。

DRM_PVR_HEAP_TRANSFER_FRAG

傳輸片段堆。

DRM_PVR_HEAP_COUNT

DRM_PVR_DEV_QUERY_HEAP_INFO_GET 返回的堆數。

可以新增更多堆,因此這也可以用作呼叫方傳送時的複製限制。

描述

出於相容性原因,所有索引都將出現在返回的陣列中,但是某些堆可能不存在。這些在 struct drm_pvr_heap.size 設定為零時指示。

struct drm_pvr_heap

包含有關單個堆資訊的容器。

定義:

struct drm_pvr_heap {
    __u64 base;
    __u64 size;
    __u32 flags;
    __u32 page_size_log2;
};

成員

base

堆的基地址。

size

大小

堆的大小,以位元組為單位。如果堆不存在,則為 0。

flags

此堆的標誌。目前始終為 0。

page_size_log2

描述

頁面大小的 Log2。

這將始終作為陣列獲取。

struct drm_pvr_dev_query_heap_info

定義:

struct drm_pvr_dev_query_heap_info {
    struct drm_pvr_obj_array heaps;
};

成員

用於獲取有關裝置驅動程式支援的堆資訊的容器。

heaps

描述

struct drm_pvr_heap 的陣列。如果指標為 NULL,則計數和步幅將使用驅動程式版本已知的那些進行更新,以方便呼叫方進行分配。

請注意,所有驅動程式支援的堆都將返回,最多 heaps.count。某些堆不會出現在所有裝置中,這將透過 struct drm_pvr_heap.size 設定為零來指示。

當獲取此型別時,struct drm_pvr_ioctl_dev_query_args.type 必須設定為 DRM_PVR_DEV_QUERY_HEAP_INFO_GET

enum drm_pvr_static_data_area_usage

常量

DRM_PVR_DEV_QUERY_STATIC_DATA_AREAS_GET 返回的靜態資料區域資訊的陣列索引。

DRM_PVR_STATIC_DATA_AREA_EOT

圖塊結束 PDS 程式程式碼段。

圖塊結束 PDS 任務在片段作業期間完成圖塊時執行,並負責將圖塊發射到畫素後端。

DRM_PVR_STATIC_DATA_AREA_FENCE

MCU 隔離區,在快取重新整理和失效期間使用。

這必須指向有效的物理記憶體,否則內容不會被使用。

DRM_PVR_STATIC_DATA_AREA_VDM_SYNC

VDM 同步程式。

VDM 同步程式用於同步 GPU 硬體的多個區域。

DRM_PVR_STATIC_DATA_AREA_YUV_CSC

YUV 係數。

該區域包含最多 16 個槽,步幅為 64 位元組。每個槽都是一個 3x4 的 u16 定點數矩陣,具有 1 個符號位、2 個整數位和 13 個小數位。

描述

出於相容性原因,所有索引都將出現在返回的陣列中,但是某些區域可能不存在。這些在 struct drm_pvr_static_data_area.size 設定為零時指示。

struct drm_pvr_static_data_area

包含有關單個靜態資料區域資訊的容器。

定義:

struct drm_pvr_static_data_area {
    __u16 area_usage;
    __u16 location_heap_id;
    __u32 size;
    __u64 offset;
};

成員

area_usage

靜態資料區域的用途。請參閱 enum drm_pvr_static_data_area_usage

location_heap_id

此靜態資料區域所在的堆的陣列索引。此陣列使用 DRM_PVR_DEV_QUERY_HEAP_INFO_GET 獲取。

size

大小

靜態資料區域的大小。如果設定為零,則不存在。

offset

描述

頁面大小的 Log2。

靜態資料區域與堆起點的偏移量。

struct drm_pvr_dev_query_static_data_areas

定義:

struct drm_pvr_dev_query_static_data_areas {
    struct drm_pvr_obj_array static_data_areas;
};

成員

用於獲取有關裝置驅動程式支援的堆中靜態資料區域資訊的容器。

static_data_areas

描述

struct drm_pvr_static_data_area 的陣列。如果指標為 NULL,則計數和步幅將使用驅動程式版本已知的那些進行更新,以方便呼叫方進行分配。

請注意,所有驅動程式支援的靜態資料區域都將返回,最多 static_data_areas.count。有些區域不會出現在所有裝置中,這將透過 struct drm_pvr_static_data_area.size 設定為零來指示。

此外,某些堆也不會出現。請參閱 struct drm_pvr_dev_query_heap_info

CREATE_BO

struct drm_pvr_ioctl_create_bo_args

DRM_IOCTL_PVR_CREATE_BO 的引數

定義:

struct drm_pvr_ioctl_create_bo_args {
    __u64 size;
    __u32 handle;
    __u32 _padding_c;
    __u64 flags;
};

成員

size

[IN] 要建立的緩衝區物件的大小。這必須與頁面大小對齊。

handle

[OUT] 新緩衝區物件的 GEM 控制代碼,用於使用者空間。

_padding_c

已保留。此欄位必須清零。

堆的大小,以位元組為單位。如果堆不存在,則為 0。

[IN] 將影響此建立操作以及對建立物件進行的未來對映操作的行為的選項。此欄位必須是 DRM_PVR_BO_* 值的有效組合,並將所有標記為保留的位設定為零。

由於 CPU 和 GPU 在某些字型中的歧義,我們在此處使用“裝置”來指代 GPU。

裝置對映選項
DRM_PVR_BO_BYPASS_DEVICE_CACHE:

指定裝置對該記憶體的訪問將繞過快取。這用於 CPU 將定期更新的緩衝區(例如空閒列表)或僅訪問一次的緩衝區,因此不值得快取(例如部分渲染緩衝區)。預設情況下,裝置會在每次作業後重新整理其記憶體快取,因此通常不需要這樣做來實現一致性。

DRM_PVR_BO_PM_FW_PROTECT:

指定僅允許引數管理器 (PM) 和/或韌體處理器在對映到裝置時訪問此記憶體。將此標誌與 DRM_PVR_BO_ALLOW_CPU_USERSPACE_ACCESS 一起指定無效。

CPU 對映選項
DRM_PVR_BO_ALLOW_CPU_USERSPACE_ACCESS:

允許使用者空間對映和訪問此記憶體的內容。將此標誌與 DRM_PVR_BO_PM_FW_PROTECT 一起指定無效。

GET_BO_MMAP_OFFSET

struct drm_pvr_ioctl_get_bo_mmap_offset_args

DRM_IOCTL_PVR_GET_BO_MMAP_OFFSET 的引數

定義:

struct drm_pvr_ioctl_get_bo_mmap_offset_args {
    __u32 handle;
    __u32 _padding_4;
    __u64 offset;
};

成員

handle

[IN] 要對映的緩衝區物件的 GEM 控制代碼。

_padding_4

已保留。此欄位必須清零。

靜態資料區域的大小。如果設定為零,則不存在。

[OUT] 在實際 mmap 呼叫中使用的假偏移量。

描述

像其他 DRM 驅動程式一樣,“mmap”IOCTL 實際上不對映任何記憶體。相反,它分配一個假偏移量,該偏移量引用指定的緩衝區物件。此偏移量可以與 DRM 裝置本身的實際 mmap 呼叫一起使用。

CREATE_VM_CONTEXT 和 DESTROY_VM_CONTEXT

struct drm_pvr_ioctl_create_vm_context_args

DRM_IOCTL_PVR_CREATE_VM_CONTEXT 的引數

定義:

struct drm_pvr_ioctl_create_vm_context_args {
    __u32 handle;
    __u32 _padding_4;
};

成員

handle

[OUT] 新 VM 上下文的控制代碼。

_padding_4

已保留。此欄位必須清零。

struct drm_pvr_ioctl_destroy_vm_context_args

DRM_IOCTL_PVR_DESTROY_VM_CONTEXT 的引數

定義:

struct drm_pvr_ioctl_destroy_vm_context_args {
    __u32 handle;
    __u32 _padding_4;
};

成員

handle

[IN] 要銷燬的 VM 上下文的控制代碼。

_padding_4

已保留。此欄位必須清零。

VM_MAP 和 VM_UNMAP

VM UAPI 允許使用者空間在 GPU 虛擬地址空間中建立緩衝區物件對映。

客戶端負責管理 GPU 地址空間。它應該在 DRM_PVR_DEV_QUERY_HEAP_INFO_GET 返回的堆中分配對映。

DRM_IOCTL_PVR_VM_MAP 建立新對映。客戶端為對映提供目標虛擬地址。可以指定對映緩衝區物件中的大小和偏移量,因此客戶端可以部分對映緩衝區。

DRM_IOCTL_PVR_VM_UNMAP 移除對映。僅當對映的大小與驅動程式已知的大小匹配時,才會從 GPU 地址空間中移除整個對映。

struct drm_pvr_ioctl_vm_map_args

DRM_IOCTL_PVR_VM_MAP 的引數。

定義:

struct drm_pvr_ioctl_vm_map_args {
    __u32 vm_context_handle;
    __u32 flags;
    __u64 device_addr;
    __u32 handle;
    __u32 _padding_14;
    __u64 offset;
    __u64 size;
};

成員

vm_context_handle

[IN] 此對映存在的 VM 上下文的控制代碼。

堆的大小,以位元組為單位。如果堆不存在,則為 0。

flags

device_addr

[IN] 對映的請求裝置虛擬地址。對於包含請求地址的堆,這必須為非零,並且與裝置頁面大小對齊。指定未包含在 DRM_PVR_DEV_QUERY_HEAP_INFO_GET 返回的堆之一中的地址是一個錯誤。

handle

bo_handle

_padding_14

已保留。此欄位必須清零。

靜態資料區域的大小。如果設定為零,則不存在。

[IN] 從其開始對映的目標 bo 中的偏移量。

size

size

struct drm_pvr_ioctl_vm_unmap_args

DRM_IOCTL_PVR_VM_UNMAP 的引數。

定義:

struct drm_pvr_ioctl_vm_unmap_args {
    __u32 vm_context_handle;
    __u32 _padding_4;
    __u64 device_addr;
    __u64 size;
};

成員

vm_context_handle

vm_context_handle

_padding_4

已保留。此欄位必須清零。

device_addr

device_addr

size

size

CREATE_CONTEXT 和 DESTROY_CONTEXT

struct drm_pvr_ioctl_create_context_args

DRM_IOCTL_PVR_CREATE_CONTEXT 的引數

定義:

struct drm_pvr_ioctl_create_context_args {
    __u32 type;
    __u32 flags;
    __s32 priority;
    __u32 handle;
    __u64 static_context_state;
    __u32 static_context_state_len;
    __u32 vm_context_handle;
    __u64 callstack_addr;
};

成員

type

type

[IN] 要建立的上下文的型別。

堆的大小,以位元組為單位。如果堆不存在,則為 0。

flags

priority

[IN] 新上下文的優先順序。

這必須是由 enum drm_pvr_ctx_priority 定義的值之一。

handle

[OUT] 新上下文的控制代碼。

static_context_state

[IN] 指向靜態上下文狀態流的指標。

static_context_state_len

[IN] 靜態上下文狀態的長度,以位元組為單位。

vm_context_handle

vm_context_handle

callstack_addr

[IN] 初始呼叫堆疊指標的地址。僅當 typeDRM_PVR_CTX_TYPE_RENDER 時才有效,否則必須為 0。

enum drm_pvr_ctx_priority

drm_pvr_ioctl_create_context_args.priority 的引數

常量

DRM_PVR_CTX_PRIORITY_LOW

低於正常優先順序。

DRM_PVR_CTX_PRIORITY_NORMAL

正常優先順序。

DRM_PVR_CTX_PRIORITY_HIGH

高於正常優先順序。請注意,這需要 CAP_SYS_NICEDRM_MASTER

enum drm_pvr_ctx_type

struct drm_pvr_ioctl_create_context_args.type 的引數

常量

DRM_PVR_CTX_TYPE_RENDER

渲染上下文。

DRM_PVR_CTX_TYPE_COMPUTE

計算上下文。

DRM_PVR_CTX_TYPE_TRANSFER_FRAG

用於片段資料主機的傳輸上下文。

struct drm_pvr_ioctl_destroy_context_args

DRM_IOCTL_PVR_DESTROY_CONTEXT 的引數

定義:

struct drm_pvr_ioctl_destroy_context_args {
    __u32 handle;
    __u32 _padding_4;
};

成員

handle

handle

_padding_4

已保留。此欄位必須清零。

CREATE_FREE_LIST 和 DESTROY_FREE_LIST

struct drm_pvr_ioctl_create_free_list_args

DRM_IOCTL_PVR_CREATE_FREE_LIST 的引數

定義:

struct drm_pvr_ioctl_create_free_list_args {
    __u64 free_list_gpu_addr;
    __u32 initial_num_pages;
    __u32 max_num_pages;
    __u32 grow_num_pages;
    __u32 grow_threshold;
    __u32 vm_context_handle;
    __u32 handle;
};

成員

free_list_gpu_addr

[IN] 包含要由空閒列表使用的記憶體的緩衝區物件的 GPU 對映的地址。

緩衝區物件的對映區域必須至少為 max_num_pages * sizeof(__u32)

必須已建立緩衝區物件,並將 DRM_PVR_BO_DEVICE_PM_FW_PROTECT 設定為 true,並將 DRM_PVR_BO_CPU_ALLOW_USERSPACE_ACCESS 設定為 false。

initial_num_pages

[IN] 最初分配給空閒列表的頁面。

max_num_pages

[IN] 空閒列表中的最大頁面數。

grow_num_pages

[IN] 每次請求空閒列表增長的頁面數。

grow_threshold

[IN] 應該觸發新的增長請求的FL記憶體使用百分比。

vm_context_handle

[IN] 自由列表緩衝區物件對映到的VM上下文的控制代碼。

handle

[OUT] 建立的自由列表的控制代碼。

描述

自由列表引數具有以下約束

  • max_num_pages 必須大於零。

  • grow_threshold 必須介於0和100之間。

  • grow_num_pages 必須小於或等於 max_num_pages

  • initial_num_pagesmax_num_pagesgrow_num_pages 必須是4的倍數。

  • grow_num_pages 為0時,initial_num_pages 必須等於 max_num_pages

  • grow_num_pages 非零時,initial_num_pages 必須小於 max_num_pages

struct drm_pvr_ioctl_destroy_free_list_args

DRM_IOCTL_PVR_DESTROY_FREE_LIST 的引數

定義:

struct drm_pvr_ioctl_destroy_free_list_args {
    __u32 handle;
    __u32 _padding_4;
};

成員

handle

[IN] 要銷燬的自由列表的控制代碼。

_padding_4

已保留。此欄位必須清零。

CREATE_HWRT_DATASET 和 DESTROY_HWRT_DATASET

struct drm_pvr_ioctl_create_hwrt_dataset_args

DRM_IOCTL_PVR_CREATE_HWRT_DATASET 的引數

定義:

struct drm_pvr_ioctl_create_hwrt_dataset_args {
    struct drm_pvr_create_hwrt_geom_data_args geom_data_args;
    struct drm_pvr_create_hwrt_rt_data_args rt_data_args[2];
    __u32 free_list_handles[2];
    __u32 width;
    __u32 height;
    __u32 samples;
    __u32 layers;
    __u32 isp_merge_lower_x;
    __u32 isp_merge_lower_y;
    __u32 isp_merge_scale_x;
    __u32 isp_merge_scale_y;
    __u32 isp_merge_upper_x;
    __u32 isp_merge_upper_y;
    __u32 region_header_size;
    __u32 handle;
};

成員

geom_data_args

[IN] 幾何資料引數。

rt_data_args

[IN] 渲染目標引數陣列。

此陣列中的每個條目表示雙緩衝設定中的渲染目標。

free_list_handles

[IN] 自由列表控制代碼陣列。

free_list_handles[PVR_DRM_HWRT_FREE_LIST_LOCAL] 的初始大小必須至少為 drm_pvr_dev_query_runtime_info.free_list_min_pages 報告的大小。

width

[IN] 寬度(以畫素為單位)。

height

[IN] 高度(以畫素為單位)。

samples

[IN] 取樣數。

layers

[IN] 圖層數。

isp_merge_lower_x

[IN] 三角形合併的較低X係數。

isp_merge_lower_y

[IN] 三角形合併的較低Y係數。

isp_merge_scale_x

[IN] 三角形合併的X比例係數。

isp_merge_scale_y

[IN] 三角形合併的Y比例係數。

isp_merge_upper_x

[IN] 三角形合併的較高X係數。

isp_merge_upper_y

[IN] 三角形合併的較高Y係數。

region_header_size

[IN] 區域標頭陣列的大小。此公共欄位由該資料集中的兩個渲染目標使用。

此欄位的單位因裝置使用的簡單內部引數格式的版本而異。如果使用格式2,則將其解釋為區域標頭的數量。對於其他格式,它被解釋為以雙字為單位的大小。

handle

[OUT] 建立的HWRT資料集的控制代碼。

struct drm_pvr_create_hwrt_geom_data_args

用於 struct drm_pvr_ioctl_create_hwrt_dataset_args.geom_data_args 的幾何資料引數。

定義:

struct drm_pvr_create_hwrt_geom_data_args {
    __u64 tpc_dev_addr;
    __u32 tpc_size;
    __u32 tpc_stride;
    __u64 vheap_table_dev_addr;
    __u64 rtc_dev_addr;
};

成員

tpc_dev_addr

[IN] 尾指標快取GPU虛擬地址。

tpc_size

[IN] TPC的大小,以位元組為單位。

tpc_stride

[IN] TPC中圖層之間的步幅,以頁面為單位

vheap_table_dev_addr

[IN] VHEAP表GPU虛擬地址。

rtc_dev_addr

[IN] 渲染目標快取虛擬地址。

struct drm_pvr_create_hwrt_rt_data_args

用於 struct drm_pvr_ioctl_create_hwrt_dataset_args.rt_data_args 的渲染目標引數。

定義:

struct drm_pvr_create_hwrt_rt_data_args {
    __u64 pm_mlist_dev_addr;
    __u64 macrotile_array_dev_addr;
    __u64 region_header_dev_addr;
};

成員

pm_mlist_dev_addr

[IN] PM MLIST GPU虛擬地址。

macrotile_array_dev_addr

[IN] 宏圖塊陣列GPU虛擬地址。

region_header_dev_addr

[IN] 區域標頭陣列GPU虛擬地址。

struct drm_pvr_ioctl_destroy_hwrt_dataset_args

DRM_IOCTL_PVR_DESTROY_HWRT_DATASET 的引數

定義:

struct drm_pvr_ioctl_destroy_hwrt_dataset_args {
    __u32 handle;
    __u32 _padding_4;
};

成員

handle

[IN] 要銷燬的HWRT資料集的控制代碼。

_padding_4

已保留。此欄位必須清零。

SUBMIT_JOBS

DRM_PVR_SYNC_OP_HANDLE_TYPE_MASK

drm_pvr_sync_op::flags 欄位的控制代碼型別掩碼。

DRM_PVR_SYNC_OP_FLAG_HANDLE_TYPE_SYNCOBJ

表示在 drm_pvr_sync_op::handle 中傳遞的控制代碼是同步物件控制代碼。這是預設型別。

DRM_PVR_SYNC_OP_FLAG_HANDLE_TYPE_TIMELINE_SYNCOBJ

表示在 drm_pvr_sync_op::handle 中傳遞的控制代碼是時間線同步物件控制代碼。

DRM_PVR_SYNC_OP_FLAG_SIGNAL

請求訊號操作。繫結到作業的輸出圍欄將附加到同步物件,其控制代碼在 drm_pvr_sync_op::handle 中傳遞。

DRM_PVR_SYNC_OP_FLAG_WAIT

請求等待操作。作業將在啟動之前等待此特定同步物件或同步物件點發出訊號。這是預設操作。

struct drm_pvr_ioctl_submit_jobs_args

DRM_IOCTL_PVR_SUBMIT_JOB 的引數

定義:

struct drm_pvr_ioctl_submit_jobs_args {
    struct drm_pvr_obj_array jobs;
};

成員

jobs

[IN] 要提交的作業陣列。

描述

如果系統呼叫返回錯誤,請務必檢查 jobs.count 的值。這表示發生錯誤的 jobs.array 中的索引。

DRM_PVR_SUBMIT_JOB_GEOM_CMD_FIRST

表示這是否是為渲染髮出的第一個命令。

DRM_PVR_SUBMIT_JOB_GEOM_CMD_LAST

表示這是否是為渲染髮出的最後一個命令。

DRM_PVR_SUBMIT_JOB_GEOM_CMD_SINGLE_CORE

強制在多核裝置中使用單核。

DRM_PVR_SUBMIT_JOB_GEOM_CMD_FLAGS_MASK

所有幾何cmd標誌的邏輯或運算。

DRM_PVR_SUBMIT_JOB_FRAG_CMD_SINGLE_CORE

在多核設定中使用單核。

DRM_PVR_SUBMIT_JOB_FRAG_CMD_DEPTHBUFFER

表示是否存在深度緩衝區。

DRM_PVR_SUBMIT_JOB_FRAG_CMD_STENCILBUFFER

表示是否存在模板緩衝區。

DRM_PVR_SUBMIT_JOB_FRAG_CMD_PREVENT_CDM_OVERLAP

不允許計算與此渲染重疊。

DRM_PVR_SUBMIT_JOB_FRAG_CMD_GET_VIS_RESULTS

表示此渲染是否產生可見性結果。

DRM_PVR_SUBMIT_JOB_FRAG_CMD_SCRATCHBUFFER

表示部分渲染是否寫入暫存緩衝區而不是最終表面。它還強制要求在所有部分渲染完成後,最後一次渲染中存在全屏複製。

DRM_PVR_SUBMIT_JOB_FRAG_CMD_DISABLE_PIXELMERGE

停用此渲染的畫素合併。

DRM_PVR_SUBMIT_JOB_FRAG_CMD_FLAGS_MASK

所有片段cmd標誌的邏輯或運算。

DRM_PVR_SUBMIT_JOB_COMPUTE_CMD_PREVENT_ALL_OVERLAP

不允許其他作業與此計算重疊。

DRM_PVR_SUBMIT_JOB_COMPUTE_CMD_SINGLE_CORE

強制在多核裝置中使用單核。

DRM_PVR_SUBMIT_JOB_COMPUTE_CMD_FLAGS_MASK

所有計算cmd標誌的邏輯或運算。

DRM_PVR_SUBMIT_JOB_TRANSFER_CMD_SINGLE_CORE

強制作業在多核裝置中使用單核。

DRM_PVR_SUBMIT_JOB_TRANSFER_CMD_FLAGS_MASK

所有傳輸cmd標誌的邏輯或運算。

struct drm_pvr_sync_op

描述同步操作的物件

定義:

struct drm_pvr_sync_op {
    __u32 handle;
    __u32 flags;
    __u64 value;
};

成員

handle

同步物件的控制代碼。

堆的大小,以位元組為單位。如果堆不存在,則為 0。

DRM_PVR_SYNC_OP_FLAG_ 標誌的組合。

value

此drm_syncobj的時間線值。二進位制同步物件的 MBZ。

enum drm_pvr_job_type

struct drm_pvr_job.job_type 的引數

常量

DRM_PVR_JOB_TYPE_GEOMETRY

作業型別是幾何。

DRM_PVR_JOB_TYPE_FRAGMENT

作業型別是片段。

DRM_PVR_JOB_TYPE_COMPUTE

作業型別是計算。

DRM_PVR_JOB_TYPE_TRANSFER_FRAG

作業型別是片段傳輸。

struct drm_pvr_hwrt_data_ref

引用HWRT資料

定義:

struct drm_pvr_hwrt_data_ref {
    __u32 set_handle;
    __u32 data_index;
};

成員

set_handle

HWRT資料集控制代碼。

data_index

資料集內HWRT資料的索引。

struct drm_pvr_job

傳遞給 DRM_IOCTL_PVR_SUBMIT_JOBS ioctl的作業引數

定義:

struct drm_pvr_job {
    __u32 type;
    __u32 context_handle;
    __u32 flags;
    __u32 cmd_stream_len;
    __u64 cmd_stream;
    struct drm_pvr_obj_array sync_ops;
    struct drm_pvr_hwrt_data_ref hwrt;
};

成員

type

[IN] 正在提交的作業型別

這必須是由 enum drm_pvr_job_type 定義的值之一。

context_handle

[IN] 上下文控制代碼。

job_typeDRM_PVR_JOB_TYPE_RENDERDRM_PVR_JOB_TYPE_COMPUTEDRM_PVR_JOB_TYPE_TRANSFER_FRAG 時,這必須是 DRM_IOCTL_PVR_CREATE_CONTEXT 返回的有效控制代碼。上下文的型別必須與正在提交的作業的型別相容。

job_typeDRM_PVR_JOB_TYPE_NULL 時,這必須為零。

堆的大小,以位元組為單位。如果堆不存在,則為 0。

[IN] 命令的標誌。

這些是作業相關的。請參閱所有 DRM_PVR_SUBMIT_JOB_*

cmd_stream_len

[IN] 命令流的長度(以位元組為單位)。

cmd_stream

[IN] 指向命令的命令流的指標。

命令流必須是 u64 對齊的。

sync_ops

[IN] 片段同步操作。

hwrt

[IN] 渲染作業(幾何或片段)使用的HWRT資料。

對於非渲染作業,必須為零。

內部說明

為了驗證對IOCTL引數結構施加的約束,pvr_device.h 中存在宏和輔助函式的集合。

在當前的輔助函式中,應該只需要直接呼叫 PVR_IOCTL_UNION_PADDING_CHECK()。此宏應在每個程式碼路徑中使用一次,該程式碼路徑從使用者空間傳遞的結構中提取聯合成員。

bool pvr_ioctl_union_padding_check(void *instance, size_t union_offset, size_t union_size, size_t member_size)

驗證聯合成員末尾和聯合本身末尾之間的隱式填充是否為零。

引數

void *instance

指向要驗證的結構例項的指標。

size_t union_offset

偏移到目標聯合的 instance 型別中。必須是64位對齊的。

size_t union_size

instance 型別中目標聯合的大小。必須是64位對齊的。

size_t member_size

union_offsetunion_size 指定的目標聯合中目標成員的大小。假設目標成員的偏移量相對於 union_offset 為零。必須是64位對齊的。

描述

您可能需要使用 PVR_IOCTL_UNION_PADDING_CHECK() 而不是直接呼叫此函式,因為該宏抽象出大部分設定,並且還提供一些靜態驗證。有關詳細資訊,請參閱其文件。

返回

  • 如果聯合的已用成員的末尾和該聯合的末尾之間的每個位元組都為零,則為 true,或者

  • 否則為 false

PVR_STATIC_ASSERT_64BIT_ALIGNED

PVR_STATIC_ASSERT_64BIT_ALIGNED (static_expr_)

64位對齊的內聯斷言。

引數

static_expr_

要評估的目標表達式。

描述

如果 static_expr_ 未評估為將是64位對齊地址(即8的倍數)的常量整數,則編譯將失敗。

返回

static_expr_ 的值。

PVR_IOCTL_UNION_PADDING_CHECK

PVR_IOCTL_UNION_PADDING_CHECK (struct_instance_, union_, member_)

驗證聯合成員末尾和聯合本身末尾之間的隱式填充是否為零。

引數

struct_instance_

評估為指向UAPI資料結構的指標的表示式。

union_

要檢查的 struct_instance_ 的聯合成員的名稱。如果聯合成員巢狀在 struct_instance_ 的型別中,則這可能包含成員訪問運算子(“.”)。

member_

要評估的 union_ 的成員的名稱。

描述

這是 pvr_ioctl_union_padding_check() 的包裝器,它執行對齊檢查並簡化了呼叫者的事情。

返回

  • 如果 struct_instance_member_ 的末尾和 union_ 的末尾之間的每個位元組都為零,則為 true,或者

  • 否則為 false