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 查询参数包含指向 struct drm_pvr_dev_query_gpu_info 的指针。

DRM_PVR_DEV_QUERY_RUNTIME_INFO_GET

dev 查询参数包含指向 struct drm_pvr_dev_query_runtime_info 的指针。

DRM_PVR_DEV_QUERY_QUIRKS_GET

dev 查询参数包含指向 struct drm_pvr_dev_query_quirks 的指针。

DRM_PVR_DEV_QUERY_ENHANCEMENTS_GET

dev 查询参数包含指向 struct drm_pvr_dev_query_enhancements 的指针。

DRM_PVR_DEV_QUERY_HEAP_INFO_GET

dev 查询参数包含指向 struct drm_pvr_dev_query_heap_info 的指针。

DRM_PVR_DEV_QUERY_STATIC_DATA_AREAS_GET

dev 查询参数包含指向 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 字节。如果 pointer 为 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

最大系数,以双字为单位。

cdm_max_local_mem_size_regs

计算内核可用的最大本地内存量,以双字为单位。

描述

当获取此类型时,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

硬件怪癖 __u32 数组的用户空间地址。

列表中的前 musthave_count 项是客户端必须支持此设备的怪癖。 如果用户空间不支持所有这些怪癖,则无法保证功能,并且客户端初始化必须失败。 列表中剩余的怪癖会影响用户空间、内核或固件。 它们默认情况下处于禁用状态,需要用户空间选择加入。 选择加入机制取决于怪癖。

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,则 count 和 stride 将使用驱动程序版本已知的值更新,以方便调用者进行分配。

描述

请注意,将返回所有驱动程序支持的堆,直到 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

Tile PDS 程序代码段的结尾。

Tile PDS 任务的结尾在片段作业期间完成 tile 时运行,并负责将 tile 发送到像素后端。

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 个小数位。

这些插槽是:0 = VK_SAMPLER_YCBCR_MODEL_CONVERSION_RGB_IDENTITY_KHR 1 = VK_SAMPLER_YCBCR_MODEL_CONVERSION_YCBCR_IDENTITY_KHR(全范围)2 = VK_SAMPLER_YCBCR_MODEL_CONVERSION_YCBCR_IDENTITY_KHR(一致范围)3 = VK_SAMPLER_YCBCR_MODEL_CONVERSION_YCBCR_709_KHR(全范围)4 = VK_SAMPLER_YCBCR_MODEL_CONVERSION_YCBCR_709_KHR(一致范围)5 = VK_SAMPLER_YCBCR_MODEL_CONVERSION_YCBCR_601_KHR(全范围)6 = VK_SAMPLER_YCBCR_MODEL_CONVERSION_YCBCR_601_KHR(一致范围)7 = VK_SAMPLER_YCBCR_MODEL_CONVERSION_YCBCR_2020_KHR(全范围)8 = VK_SAMPLER_YCBCR_MODEL_CONVERSION_YCBCR_2020_KHR(一致范围)9 = VK_SAMPLER_YCBCR_MODEL_CONVERSION_YCBCR_601_KHR(一致范围,10 位)10 = VK_SAMPLER_YCBCR_MODEL_CONVERSION_YCBCR_709_KHR(一致范围,10 位)11 = VK_SAMPLER_YCBCR_MODEL_CONVERSION_YCBCR_2020_KHR(一致范围,10 位)14 = 身份(有偏差)15 = 身份

描述

出于兼容性原因,所有索引都将出现在返回的数组中,但某些区域可能不存在。 这些通过 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

静态数据区域从堆开始的偏移量。

描述

这将始终作为数组获取。

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,则 count 和 stride 将使用驱动程序版本已知的值更新,以方便调用者进行分配。

描述

请注意,将返回所有驱动程序支持的静态数据区域,直到 static_data_areas.count。 某些区域不会出现在所有设备中,这将通过 struct drm_pvr_static_data_area.size 设置为零来指示。

此外,某些堆也不会存在。 请参阅 struct drm_pvr_dev_query_heap_info

当获取此类型时,struct drm_pvr_ioctl_dev_query_args.type 必须设置为 DRM_PVR_DEV_QUERY_STATIC_DATA_AREAS_GET

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

保留。此字段必须为零。

flags

[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

保留。此字段必须为零。

offset

[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 上下文的句柄。

flags

[IN] 影响此映射的标志。当前始终为 0。

device_addr

[IN] 请求的映射的设备虚拟地址。它必须为非零,并且与包含所请求地址的堆的设备页面大小对齐。指定一个未包含在 DRM_PVR_DEV_QUERY_HEAP_INFO_GET 返回的堆中的地址是错误的。

handle

[IN] 目标缓冲区对象的句柄。它必须是由 DRM_IOCTL_PVR_CREATE_BO 返回的有效句柄。

_padding_14

保留。此字段必须为零。

offset

[IN] 从其开始映射的目标 bo 的偏移量。

size

[IN] 请求映射的大小。必须与包含所请求地址的堆的设备页面大小以及主机页面大小对齐。当添加到 device_addr 时,结果不能溢出包含 device_addr 的堆(即,device_addrsize 指定的范围必须完全包含在由 DRM_PVR_DEV_QUERY_HEAP_INFO_GET 指定的单个堆中)。

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

[IN] 此映射所在的 VM 上下文的句柄。

_padding_4

保留。此字段必须为零。

device_addr

[IN] 目标映射起始处的设备虚拟地址。它必须为非零。

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

[IN] 要创建的上下文类型。

它必须是由 enum drm_pvr_ctx_type 定义的值之一。

flags

[IN] 上下文的标志。

priority

[IN] 新上下文的优先级。

它必须是由 enum drm_pvr_ctx_priority 定义的值之一。

handle

[OUT] 新上下文的句柄。

static_context_state

[IN] 指向静态上下文状态流的指针。

static_context_state_len

[IN] 静态上下文状态的长度(以字节为单位)。

vm_context_handle

[IN] 与此上下文关联的 VM 上下文的句柄。

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

[IN] 要销毁的上下文的句柄。

_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 和未设置的 DRM_PVR_BO_CPU_ALLOW_USERSPACE_ACCESS 创建缓冲区对象。

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,则将其解释为区域头的数量。对于其他格式,则将其解释为以 dword 为单位的大小。

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

保留。此字段必须为零。

提交作业

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 中传递的句柄是 syncobj 句柄。 这是默认类型。

DRM_PVR_SYNC_OP_FLAG_HANDLE_TYPE_TIMELINE_SYNCOBJ

表示在 drm_pvr_sync_op::handle 中传递的句柄是时间线 syncobj 句柄。

DRM_PVR_SYNC_OP_FLAG_SIGNAL

请求信号操作。绑定到作业的输出栅栏将附加到在 drm_pvr_sync_op::handle 中传递其句柄的 syncobj。

DRM_PVR_SYNC_OP_FLAG_WAIT

请求等待操作。作业将在启动前等待特定的 syncobj 或 syncobj 点发出信号。 这是默认操作。

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] 要提交的作业数组。

描述

如果 syscall 返回错误,则检查 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 标志的逻辑 OR。

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 标志的逻辑 OR。

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 标志的逻辑 OR。

DRM_PVR_SUBMIT_JOB_TRANSFER_CMD_SINGLE_CORE

强制作业在多核设备中使用单核。

DRM_PVR_SUBMIT_JOB_TRANSFER_CMD_FLAGS_MASK

所有传输 cmd 标志的逻辑 OR。

struct drm_pvr_sync_op

描述同步操作的对象

定义:

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

成员

handle

同步对象的句柄。

flags

DRM_PVR_SYNC_OP_FLAG_ 标志的组合。

value

此 drm_syncobj 的时间线值。 对于二进制 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 时,此值必须为零。

flags

[输入] 命令的标志。

这些标志取决于作业类型。请参阅所有 DRM_PVR_SUBMIT_JOB_*

cmd_stream_len

[输入] 命令流的长度,以字节为单位。

cmd_stream

[输入] 指向命令的命令流的指针。

命令流必须是 u64 对齐的。

sync_ops

[输入] 片段同步操作。

hwrt

[输入] 渲染作业(几何或片段)使用的 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