接前一篇文章:libdrm全解析十八 —— 源码全解析(15)
本文参考以下博文:
DRM 驱动程序开发(VKMS)
特此致谢!
本文继续对include/drm/drm.h中实际功能宏定义进行讲解。
27. DRM_IOCTL_SET_SAREA_CTX
第27个宏是DRM_IOCTL_SET_SAREA_CTX,相应代码如下:
#define DRM_IOCTL_SET_SAREA_CTX DRM_IOW( 0x1c, struct drm_ctx_priv_map)
结合之前文章中的_IOW(type,nr,size)的最终定义,得到如下代码:
#define DRM_IOCTL_SET_SAREA_CTX ( ((1) << 30) | (('d') << 8) | ((0x1c) << 0) | ((sizeof(struct drm_ctx_priv_map)) << 16) )
struct drm_ctx_priv_map在同文件(include/drm/drm.h)中定义,代码如下:
struct drm_ctx_priv_map {unsigned int ctx_id; /**< Context requesting private mapping */void *handle; /**< Handle of map */
};
drm_ctx_priv_map结构中各成员的意义代码注释描述得很清楚了,在此无需赘述。
DRM_IOCTL_SET_SAREA_CTX对应的Userspace API为:drmAddContextPrivateMapping()。该函数也是在xf86drm.c中,代码如下:
drm_public int drmAddContextPrivateMapping(int fd, drm_context_t ctx_id,drm_handle_t handle)
{drm_ctx_priv_map_t map;memclear(map);map.ctx_id = ctx_id;map.handle = (void *)(uintptr_t)handle;if (drmIoctl(fd, DRM_IOCTL_SET_SAREA_CTX, &map))return -errno;return 0;
}
函数的作用是添加上下文私有映射。此函数在后文具体讲解函数的时候进行详细解析。在此先认识一下、有个印象就好。
28. DRM_IOCTL_GET_SAREA_CTX
第28个宏是DRM_IOCTL_GET_SAREA_CTX,相应代码如下:
#define DRM_IOCTL_GET_SAREA_CTX DRM_IOWR(0x1d, struct drm_ctx_priv_map)
结合之前文章中的_IOWR(type,nr,size)的最终定义,得到如下代码:
#define DRM_IOCTL_GET_SAREA_CTX ( ((3) << 30) | (('d') << 8) | ((0x1d) << 0) | ((sizeof(struct drm_ctx_priv_map)) << 16) )
struct drm_ctx_priv_map的定义上边已给出,在此不重复。
DRM_IOCTL_GET_SAREA_CTX对应的Userspace API为:drmGetContextPrivateMapping()。该函数也是在xf86drm.c中,代码如下:
drm_public int drmGetContextPrivateMapping(int fd, drm_context_t ctx_id,drm_handle_t *handle)
{drm_ctx_priv_map_t map;memclear(map);map.ctx_id = ctx_id;if (drmIoctl(fd, DRM_IOCTL_GET_SAREA_CTX, &map))return -errno;if (handle)*handle = (drm_handle_t)(uintptr_t)map.handle;return 0;
}
函数的作用是获得上下文私有映射。此函数在后文具体讲解函数的时候进行详细解析。在此先认识一下、有个印象就好。
其余宏定义将在后续文章中继续解析。