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