GPU-DRM框架
2024-07-10 17:20:02 2 举报
GPU-DRM(Graphics Processing Unit - Direct Rendering Manager)是一个为GPU硬件抽象和资源管理提供支持的框架。它允许应用程序直接与GPU通信,提供了一种高效、低开销的渲染方式。GPU-DRM框架的核心内容包括设备初始化、资源分配、渲染命令提交以及渲染结果获取。该框架支持多种文件类型,如位图、矢量图形等,并能够处理多种渲染效果,如光影、纹理、动画等。此外,GPU-DRM还具备良好的跨平台兼容性,能够运行在多种操作系统和硬件平台上。
作者其他创作
大纲/内容
nv_drm_gem_create_mmap_offset
nvidia-drm/nvidia-drm.c
nv_dev->hasVideoMemory
funcsTable->freeMemory = FreeMemory;
nv_drm_load
drm_atomic_set_crtc_for_connector
AllocateVideoMemory
向 fd 授予显示器的模式集权限。目前仅支持一种(dispIndex、head、display)。
modeset_permission_crtc
nvGenerateUnixRmHandle
释放 allocateMemory() 分配的内存
填充kms的api 功能表,即填充struct NvKmsKapiFunctionsTable结构
/* * 向后兼容的驱动回调,用于在驱动注册后完成初始化步骤。 * 请参阅 drm_dev_init() 和 drm_dev_register(),* 以获取设置 &struct drm_device 的正确且无竞态条件的方法。* 例如:encode 解码器由此调用 */
pCaps->colorKeySelect
nv_drm_revoke_modeset_permission
drm_atomic_commit
! hasFramebufferConsole
funcsTable->allocateDevice = AllocateDevice;
将Direct Rendering Manager (DRM) 设备注册到 DRM 子系统
用于管理对 CRTC 等显示资源的访问权限。IOCTL(输入输出控制)是设备驱动程序与用户空间进行通信的一种方式,通过特殊的设备文件来执行各种操作。
GetMemoryPages
导入一些指定大小的未格式化内存。此函数接受表示在其他地方分配的内存的特定于驱动程序的参数结构,并将其导入到指定大小的 NVKMS KAPI 内存对象。
N= EINVAL
申请一个srct_statex结构
funcsTable->systemInfo.bAllowWriteCombining = nvkms_allow_write_combining();
撤销先前授予的模式集权限。目前仅支持一种(dispIndex、head、display)。
funcsTable->getStaticDisplayInfo = GetStaticDisplayInfo;
查询设备实例
drivers/gpu/drm/drm_property.c
drm_atomic_state_allocstate->acquire_ctx = pctx;
初始化分配的私有 GEM 对象drivers/gpu/drm/drm_gem.c,并设置操作功能,nv_gem_nvkms_memory_ops
初始化 RM 句柄分配器
XXX 添加 LUT 支持XXX 添加对每个设备 SLI/多个显示引擎的支持
drm_modeset_register_all
复制现有的 NVKMS KAPI 内存对象,到底层内存。
枚举 NVIDIA GPU 并为每个 GPU 分配/注册 DRM 设备
nvKmsKapiGenerateRmHandle
funcsTable->grantSubOwnership = GrantSubOwnership;
funcsTable->getDisplays = GetDisplays;
nvKmsKapiCalloc
nvKms->enumerateGpus
分配 DRM 设备,并将nv_drm_devicem赋值给drm
负责在 NVIDIA 显卡中分配视频内存。视频内存主要用于存储图形数据,例如帧缓冲区、纹理、顶点缓冲区等。该函数通常由驱动程序或应用程序调用,以请求显卡为特定任务分配所需的内存资源。nvidia-modeset/kapi/src/nvkms-kapi.c
funcsTable->registerSemaphoreSurfaceCallback = nvKmsKapiRegisterSemaphoreSurfaceCallback;
__nv_drm_gem_map_nvkms_memory_offset
Direct Rendering Manager (DRM) 子系统中的一个函数,用于设置通用的帧缓冲设备(Framebuffer)。并使能bufferconsolelinux/drivers/gpu/drm/drm_fb_helper.c
nvRmApiMapMemory
drm_atomic_get_crtc_statecrtc_state->active = false
版本检查
drm_dev_unregister
drivers/gpu/drm/drm_atomic_uapi.c
drm_atomic_state_free
nvidia-drm/nvidia-drm-linux.c
nvKmsKapiFreeRmHandle
将指定的内存对象导出到用户空间对象句柄。此函数接受特定于驱动程序的参数结构,该结构表示要分配给现有 NVKMS KAPI 内存对象的新句柄。
N
GetDeviceResourcesInfo
// 设置驱动支持DRIVER_MODESET | DRIVER_ATOMIC模式nv_drm_driver.driver_features |= DRIVER_MODESET | DRIVER_ATOMIC;nv_drm_driver.master_set = nv_drm_master_set;nv_drm_driver.master_drop = nv_drm_master_drop;nv_drm_driver.dumb_create = nv_drm_dumb_create;nv_drm_driver.dumb_map_offset = nv_drm_dumb_map_offset;#if defined(NV_DRM_DRIVER_HAS_DUMB_DESTROY) nv_drm_driver.dumb_destroy = nv_drm_dumb_destroy;#endif /* NV_DRM_DRIVER_HAS_DUMB_DESTROY */
load
drm_atomic_get_connector_state
原子地提交配置drivers/gpu/drm/drm_atomic.c
nvRmApiControl
nv_drm_gem_object_nvkms_memory_lookup
为plane设置 crtc
memory->hRmHandle = hRmHandle; memory->size = size; memory->surfaceParams.layout = layout;
funcsTable->grantPermissions = GrantPermissions;
to_pci_dev
drm_vma_node_offset_addr
nvKms->getDisplays
从分配中删除引用 - 句柄现在持有它
查询设备可用资源信息
nv_drm_dev_free
验证给定显示器上可用的给定模式时间。
在内存句柄中导入dma-buf。
设置 NvKmsKapiDeviceFermi-Volta 使用第 0 代,Turing+ 使用第 2 代。桌面 GPU 和移动 GPU Xavier 及更高版本使用相同的扇区布局
Y
nvidia-modeset/nvidia-modeset-linux.c
RmAllocateDevice
释放导入的信号量surface。
* 这个标志在 nv_drm_master_set 中设置,并在完成原子提交后重置。* 它用于恢复或重新提交因 NvKms 模式设置所有者变更而丢失的状态,* 例如 CRTC 颜色管理属性。
drm_atomic_set_crtc_for_plane
为plane设置帧缓冲区
free 由 createSurface创建的surface
键控的颜色选择或配置
分配 NVKMS 设备
创建GPU显卡三层:PARIMARY,COURSOR,OVERLAY,这部分暂时不分析,因为这是具体细节
drm_mode_create_dvi_i_properties
nv_drm_atomic_helper_disable_all
添加crcts
DeclareEventInterest
drm_atomic_add_affected_planes
创建和初始化 DRM 属性。这些属性用于配置和控制 DRM 设备的特性,例如显示模式、亮度、对比度等
检测/强制显示器的连接状态/EDID。
static NvKmsKapiSuspendResumeCallbackFunc *pSuspendResumeFunc = function
为此对象创建一个句柄。这将向对象添加一个句柄引用,其中包括常规的引用计数。调用者可能希望在此之后取消引用该对象由于这将把 @obj 发布到用户空间,因此在这一点上必须完全设置好,驱动程序必须在其缓冲对象创建回调函数中最后调用此函数。drivers/gpu/drm/drm_gem.c
funcsTable->importMemory = ImportMemory;
释放由 allocateDevice() 分配的设备及其所有资源。
funcsTable->applyModeSetConfig = ApplyModeSetConfig;
funcsTable->exportMemory = ExportMemory;
funcsTable->createSurface = CreateSurface;
初始化 drm_device::mode_config
span style=\"font-size: inherit;\
获取设备的所有权,需要所有权才能进行模式设置,此函数在前面的nvkms-kapi.c关联
!NULL
funcsTable->allocateSystemMemory = AllocateSystemMemory;
删除对象
nvKmsKapiGetFunctionsTable
从 NvKmsKapiMemory 对象创建格式化surface。
AllocMemoryObjectAndHandle
检查该内存对象是否可以被扫描出来进行显示。
nv_drm_update_drm_driver_features
分配一个 NVK 设备,可以使用它来查询/分配 GPU 上的资源并执行模式设置。
为连接器设置 crtc
nv_drm_enumerate_encoders_and_connectors
drm_helper_hpd_irq_event
ioremap_wc
nv_crtc->modeset_permission_filep = NULL
此函数遍历当前配置,并将所有当前由 @crtc 使用的plans添加到原子配置 @state 中。当原子提交需要检查 @crtc 上所有当前启用的plans时,例如在更改模式时,这很有用。重新启用 CRTC 时,这也很有用,可以避免强制启用所有plans的特殊代码。由于获取plans状态时总会同时获取该plans当前 CRTC 的读/写互斥锁(如果有),因此为 CRTC 添加所有plans状态不会减少原子更新的并行性。drivers/gpu/drm/drm_atomic.c
在 NVIDIA 的 DRM 驱动中查找 NVKMS 内存对象相关的功能nvidia-drm/nvidia-drm-gem-nvkms-memory.c
nvidia_modeset_enumerate_gpus
从 CPU 更新信号量surface的值。从 CPU 更新指定索引处的信号量值,然后唤醒与该索引相关的任何等待信号量值达到 <= 新值的挂起 CPU 等待者。
检查连接器及crtc是否设置,如果没有设置,认为本次设置无效,将其清空,否则设置权限
layout == NvKmsSurfaceMemoryLayoutBlockLinear
GEM 内存映射通过将一个虚拟的 mmap 偏移量返回给用户空间,用户空间可以在随后的 mmap(2) 调用中使用这个偏移量。然后 DRM 核心代码根据偏移量查找对象,并设置各种内存映射结构。
初始化背光 vblank 支持drivers/gpu/drm/drm_vblank.c
如果需要支持fd设备,需要打开nv_drm_fbdev_module_param,并检查是否设置DRIVER_MODESET
nv_drm_probe_devices
将 NVIDIA DRM 设备添加到设备列表中,涉及初始化和注册 NVIDIA DRM 设备,并将其添加到 DRM 子系统的设备列表中
* 触发热插拔处理,以更新所有 HPD 支持的连接器的连接状态。drivers/gpu/drm/drm_probe_helper.c
文本
设置用于挂起和恢复显示系统的回调函数。
nv_drm_for_each_crtc
nv_drm_gem_object_init
nvInitUnixRmHandleAllocator
nvidia/nv-modeset-interface.c
授予的模式集权限。目前仅支持一种(dispIndex、head、display)。
nvkms_enumerate_gpus
Write Combining (WC) 是一种内存访问优化技术,允许CPU在写入内存时将多个写操作组合在一起,以提高内存访问效率。WC通常用于视频内存(Video Memory)中,以提高图形处理的性能
funcsTable->releaseOwnership = ReleaseOwnership;
funcsTable->getDisplayMode = GetDisplayMode;
导入 SGT 作为内存句柄。
主要功能是将显存(显存是显卡专门用于存储图形数据的内存)映射到用户空间的地址空间中。映射后,用户空间应用程序可以通过指针直接访问显存中的数据,这对于图形渲染和 GPU 计算非常重要
nvKms->grabOwnership(nv_dev->pDevice)
使用主plane和光标平面创建 crtc
禁用输出轮询,因为我们尚不支持它drivers/gpu/drm/drm_probe_helper.c
nv_linux_drm_init
申请一个conector结构drivers/gpu/drm/drm_atomic.c
free事件回调
funcsTable->getSystemMemoryHandleFromDmaBuf = GetSystemMemoryHandleFromDmaBuf;
nv_drm_register_drm_device(&gpu_info[i])
分配一个连接器对象
为内存对象生成 RM 句柄
IOCTOL将在后面给出流程图
此函数在前面的nvkms-kapi.c关联
N,不支持fd设备
这将在驱动程序的后备存储管理器(GEM、TTM或其他完全不同的东西)中创建一个新的哑缓冲区,并返回生成的缓冲区句柄。然后可以将该句柄包装成一个帧缓冲模式设置对象。请注意,用户空间不允许使用此类对象进行渲染加速——驱动程序必须为此类用例创建自己的私有 ioctl。宽度、高度和深度在 &drm_mode_create_dumb 参数中指定。回调需要为创建的缓冲区填写句柄、间距和大小。通过 ioctl 由用户调用。
funcsTable->enumerateGpus = EnumerateGpus;
nv_drm_modeset_module_param
设置 CRTC 模式
setSuspendResumeCallback
drm_atomic_set_fb_for_plane
nv_drm_fbdev_module_param
分配一个nv_gpu_info_t结构,并调用EnumerateGpus函数,枚举由 NVIDIA 驱动程序检测到的 GPU 列表。gpu_info 是一个包含 NVIDIA_MAX_GPUS 元素的数组。返回系统中的 GPU 数量
AllocateSystemMemory
drm_gem_create_mmap_offset
分配事件回调。
枚举给定显示器上可用的模式时间。
nvkms_sema_alloc
nv_drm_init
分配一些指定大小的未格式化的系统内存。此函数分配系统内存。它应该适合在 CPU 上映射为间距线性或块线性表面。
drm_atomic_get_plane_stateplane_state->rotation = DRM_MODE_ROTATE_0;
添加连接器和编码器
nvKms->allocateDevice
drm_vblank_init
EnumerateGpus
分配一个drm_atomic_state
映射物理内存地址,CPU内存地址
nv_drm_gem_handle_create_drop_reference
/* * 此命令返回与 @ref NV0080_CTRL_CMD_FB_GET_CAPS 相同的一组设备帧缓冲区能力。 * 区别在于 NV0080_CTRL_FB_GET_CAPS_V2_PARAMS 结构,其中包含一个静态大小的数组, * 而不是 NV0080_CTRL_FB_GET_CAPS_PARAMS 中的能力表指针和能力表大小。 */
用户空间的内存映射中返回经过处理的偏移量
内存页分配
如果打开宏NV_DRM_ROTATION_AVAILABLEfont color=\"#314aa4\
nv_drm_for_each_connector_in_state
nv_drm_for_each_plane_in_state
入参版本参数
检索设备和容量上存在的各种静态资源,如连接器、头等。
处理图形内存的分配nvidia-drm/nvidia-drm-os-interface.c
分配一些指定大小的未格式化视频内存。此函数在指定的 GPU 上分配视频内存。它应该适合在 CPU 上映射为间距线性或块线性表面。
funcsTable->getSystemMemoryHandleFromSgt = GetSystemMemoryHandleFromSgt;
common/unix/common/utils/unix_rm_handle.c
nv_drm_revoke_sub_ownership
drm_atomic_set_mode_prop_for_crtc
funcsTable->setSemaphoreSurfaceValue = nvKmsKapiSetSemaphoreSurfaceValue;
nv_connector->modeset_permission_crtc
nvRmApiAlloc
drivers/gpu/drm/drm_atomic.c
__nv_drm_nvkms_gem_obj_init
nv_drm_enumerate_crtcs_and_planes
在 NVIDIA 的 DRM 驱动中,将 NVKMS 内存对象的指定偏移量映射到用户空间。这样,用户空间的应用程序可以直接访问和操作这部分显存
funcsTable->validateDisplayMode = ValidateDisplayMode;
funcsTable->isMemoryValidForDisplay = IsMemoryValidForDisplay;
funcsTable->revokeSubOwnership = RevokeSubOwnership;
funcsTable->allocateChannelEvent = nvKmsKapiAllocateChannelEvent;
drm_minor_register 的主要作用是为 DRM 设备创建次要设备节点,使用户空间可以通过这些节点与 DRM 驱动程序进行交互。创建DRM_MINOR_RENDER节点drivers/gpu/drm/drm_drv.c
nvKmsKapiAllocateVideoMemory
drm_atomic_get_crtc_state
用于创建兼容性控制链接
funcsTable->getConnectorInfo = GetConnectorInfo;
遍历所有的外部连接器,检查解码器,crct
drm_kms_helper_poll_disable
gpu_info[count].gpu_id = nv->gpu_id; gpu_info[count].pci_info.domain = nv->pci_info.domain; gpu_info[count].pci_info.bus = nv->pci_info.bus; gpu_info[count].pci_info.slot = nv->pci_info.slot; gpu_info[count].pci_info.function = nv->pci_info.function; gpu_info[count].os_device_ptr = nvl->dev; count++;
drm_dev_register
获取指定头部最后内容的 32 位 CRC 值。
启用事件处理
funcsTable->versionString
初始化输出轮询支持drivers/gpu/drm/drm_probe_helper.c
为 NvKmsKapiDevice 分配 NVKMS 对象
AllocateDevice
funcsTable->getCRC32 = GetCRC32;
撤销先前授予的子所有者权限。
初始化 Direct Rendering Manager (DRM) 的模式配置结构drivers/gpu/drm/drm_mode_config.c
nvKms->declareEventInterest
crtc
create_compat_control_link
nv_connector->nv_detected_encoder
遍历nv_drm_for_each_crtc,并获取drm_crtc_state 将其crtc_state->active状态设置为false
funcsTable->grabOwnership = GrabOwnership;
nv_connector->modeset_permission_crtc->modeset_permission_filep = NULL; nv_connector->modeset_permission_crtc = NULL;
drm_kms_helper_poll_init
__nv_drm_master_set
bus_is_pci
GET_CLIENT_DATA_BITS
NV_DRM_OUT_FENCE_PTR 是一个用于每个平面的原子属性,客户端可以使用它来请求一个特定平面翻转时的 out-fence 文件描述符(fd)。NV_DRM_OUT_FENCE_PTR 与标准的 OUT_FENCE_PTR 属性的行为不同——通过 NV_DRM_OUT_FENCE_PTR 返回的文件描述符只有在相应翻转中的缓冲区被翻转离开后才会被触发。为了使用这个属性,客户端需要调用设置属性函数,并使用用户模式指针作为值。一旦驱动程序从翻转回复中获得后同步点文件描述符,它会将后同步点文件描述符复制到用户模式指针所指向的位置。drivers/gpu/drm/drm_property.c
to_pci_dev 将通用设备结构体指针 dev 转换为具体的 PCI 设备结构体指针 pci_dev,以便访问 PCI 特定的字段和函数
分配设备参数结构
funcsTable->mapMemory = MapMemory;
funcsTable->getDeviceResourcesInfo = GetDeviceResourcesInfo;
客户端使用此控制命令在分配之前获取 NV_SEMAPHORE_SURFACE 布局/容量。信号量surface可视为独立信号量条目的数组。
获取设备的所有权,执行模式设置需要所有权。
没的设置bufferconsole,直接free当前设备所有权
XXX 使其成为每个连接器,查询有效的 dpyId 列表作为连接器的动态数据。
drm_gem_private_object_init
使用 allocateMemory() 分配内存对象创建 MMIO 映射。
funcsTable->destroySurface = DestroySurface;
drm_mode_config_init
nvKmsKapiSetSuspendResumeCallback
nv_drm_master_set;
KmsAllocateDevice
funcsTable->setSuspendResumeCallback = nvKmsKapiSetSuspendResumeCallback;
hasFramebufferConsole&&grabOwnership
revokePermissions
nvkms_open_gpu
分配 RM 客户端
__nv_drm_gem_nvkms_map
nvKmsKapiAllocateSystemMemory
Open NVKMS
hasVideoMemory 检查系统或特定的 GPU 是否有可用的视频内存。该函数可能用于决定是否可以执行需要显存的图形操作或应用程序。
向 fd 授予模式集子所有者权限。客户端可使用此权限将 drm“master”权限转换为 nvkms 子所有者权限。
nv_drm_gem_object_unreference_unlocked
funcsTable->freeDevice = FreeDevice;
memory->surfaceParams.blockLinear.genericMemory = NV_TRUE
创建 DVI-I 特定的连接器属性drivers/gpu/drm/drm_connector.c
nvKmsKapiGetFunctionsTableInternal
funcsTable->dupMemory = DupMemory;
drm_modeset_acquire_ctx 是 Direct Rendering Manager (DRM) 子系统中的一个结构体,用于在进行模式设置操作时管理锁的获取和释放。模式设置操作涉及到多个显示资源的配置,如 CRTC(Cathode Ray Tube Controller)、Plane 和 Encoder 等,这些资源通常需要锁来确保一致性和避免竞争条件
更新全局 nv_drm_driver 以支持预期的功能。它默认仅支持 PRIME,但如果内核支持原子模式设置且 modeset 内核模块参数为 true,则升级为原子模式设置。
根据返回的GPU的个数,注册GPU设备
nv_dev->next = dev_list; dev_list = nv_dev;
根据 GPU ID 分配 NvKmsKapiDevice
nv_drm_for_each_connector
nv_connector->modeset_permission_filep = NULL;
nvidia-drm/nvidia-drm-drv.c
当modeset_permission_crtc设置时, * 在所需的 CRTC 状态上设置模式(源自 blob 属性)。此函数将获取 CRTC 状态的 blob 属性的引用,并释放对状态现有模式属性的引用(如果已设置)。
nvCountDpyIdsInDpyIdList
设置master所拥有的能力
#define NV_VERSION_STRING \"550.90.07\
nv_drm_connector_revoke_permissions
检索有关指定连接器的信息。
nv_dev->drmMasterChangedSinceLastAtomicCommit = NV_TRUE
Modeset 注册
nv_drm_calloc
funcsTable->unregisterSemaphoreSurfaceCallback= nvKmsKapiUnregisterSemaphoreSurfaceCallback;
检查是否设置bufferconsole且属于当前进程
总是提前映射哑缓冲区的内存。客户端只期望使用哑缓冲区进行软件渲染,因此如果没有 CPU 映射,它们将没有多大用处
分配nvkms_sema_handle_t
GPU在内核中分为master和commponnetGPU-Master为图显器(控制器),componnet为设备节点,matser负责bind各componnet组件。
分配 RM 设备对象
通过 NvKmsKapiAllocateDeviceParams::eventCallback 注册 interestMask 中指定的事件通知。如果分配 NvKmsKapiDevice 时 eventCallback 为 NULL,则此调用不执行任何操作。支持的事件为 DPY_CHANGED 和 DYNAMIC_DPY_CONNECTED。
nvidia-modeset/kapi/src/nvkms-kapi.c
释放设备所有权。
funcsTable->declareEventInterest = DeclareEventInterest;
用于初始化 NVKMS GEM 对象
检索有关指定显示器的信息。
如果配置NV_DRM_FENCE_AVAILABLE且没有配置NV_DRM_GEM_OBJECT_HAS_RESV时调用nv_dma_resv_init初始化一个 DMA 预留对象
此函数遍历当前配置,并将所有当前使用 @crtc 的连接器添加到原子配置 @state 中。请注意,该函数必须获取连接互斥锁。如果更新仅针对一个 CRTC 上的plans,这可能会导致不必要的串行化。因此,驱动程序和帮助程序应仅在真正需要时调用此函数(例如,当由于某些更改需要进行完整的模式设置时)。drivers/gpu/drm/drm_atomic.c
funcsTable->revokePermissions = RevokePermissions;
分配一个NvKmsKapiDevice
与上面的功能相反,free MMIO 映射
LOG_ERR
* drm_atomic_helper_disable_all() 函数从* linux/drivers/gpu/drm/drm_atomic_helper.c 中复制,并进行了修改,* 将 drm_for_each_crtc 替换为 nv_drm_for_each_crtc 来遍历所有 CRTC,* 将 for_each_connector_in_state 替换为 nv_drm_for_each_*_in_state 来遍历* 所有模式设置对象的状态,并在 drm_atomic_state_put() 不可用时使用 * drm_atomic_state_free()。
drm_atomic_add_affected_connectors
drm_gem_handle_create
funcsTable->allocateVideoMemory = AllocateVideoMemory;
funcsTable->freeSemaphoreSurface = nvKmsKapiFreeSemaphoreSurface;
nv_drm_atomic_disable_connector
src/nvidia-modeset/kapi/src/nvkms-kapi.c
创建DRM_MINOR_PRIMARY节点
nvKms->getDeviceResourcesInfo
此命令返回设备的子设备数量。
借用一张图片展示GPU全过程,可以很好理解GPU工作方式:
初始化用于执行控制命令并与驱动程序进行交互nvidia-modeset/src/nvkms-rmapi-dgpu.c
nvkms_ioctl_from_kapi,NVKMS_IOCTL_REVOKE_PERMISSIONS
RevokeSubOwnership
nv_drm_create_properties
GetDisplays
font color=\"#7bd144\
分配通知程序内存nvKmsKapiAllocateNotifiers
枚举 nvidia 驱动程序探测到的 GPU 列表。gpu_info 是 NVIDIA_MAX_GPUS 元素的数组。 GPU 数量系统中返回。
可能用于通知内核或驱动程序,用户空间进程对特定类型的事件感兴趣,希望接收这些事件的通知
funcsTable->unmapMemory = UnmapMemory;
nv_drm_init_mode_config
查询显示设备
nvkms_open_from_kapi
drm_fbdev_generic_setupnv_dev->hasFramebufferConsole=true
__nv_drm_crtc_create
将分配到其他地方的信号量suface导入到 NVKMS 并返回新对象的句柄。
nvidia-modeset/nvidia-modeset-linux.c设置用于挂起和恢复显示系统的回调函数。
releaseOwnership
funcsTable->importSemaphoreSurface = nvKmsKapiImportSemaphoreSurface;
funcsTable->freeChannelEvent = nvKmsKapiFreeChannelEvent;
为 NvKmsKapiDevice 分配 RM 对象
分配一个struct nv_drm_device结构指针,来引用gpu_info信息,即分配 NVIDIA-DRM 设备
funcsTable->getDynamicDisplayInfo = GetDynamicDisplayInfo;
nv_drm_master_drop
检索设备上的显示器数量以及这些显示器的句柄数组。
0 条评论
回复 删除
下一页