Continuación del artículo anterior: Análisis completo de libdrm 18 — Análisis completo del código fuente (15)
Este artículo hace referencia a las siguientes publicaciones de blog:
Desarrollo de controladores DRM (VKMS)
¡Muchas gracias!
Este artículo continúa explicando la definición de macro de función real en include/drm/drm.h.
27. DRM_IOCTL_SET_SAREA_CTX
La macro 27 es DRM_IOCTL_SET_SAREA_CTX, el código correspondiente es el siguiente:
#define DRM_IOCTL_SET_SAREA_CTX DRM_IOW( 0x1c, struct drm_ctx_priv_map)
Combinado con la definición final de _IOW(tipo,nr,tamaño) en el artículo anterior, se obtiene el siguiente código:
#define DRM_IOCTL_SET_SAREA_CTX ( ((1) << 30) | (('d') << 8) | ((0x1c) << 0) | ((sizeof(struct drm_ctx_priv_map)) << 16) )
La estructura drm_ctx_priv_map está definida en el mismo archivo (include/drm/drm.h), el código es el siguiente:
struct drm_ctx_priv_map {
unsigned int ctx_id; /**< Context requesting private mapping */
void *handle; /**< Handle of map */
};
Los comentarios del código de significado de cada miembro en la estructura drm_ctx_priv_map se describen claramente, por lo que no es necesario repetirlos aquí.
La API del espacio de usuario correspondiente a DRM_IOCTL_SET_SAREA_CTX es: drmAddContextPrivateMapping(). Esta función también está en xf86drm.c, el código es el siguiente:
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;
}
La función de la función es agregar asignaciones privadas de contexto. Esta función se analizará en detalle más adelante cuando la función se explique en detalle. Conozcámonos primero y tengamos una impresión.
28. DRM_IOCTL_GET_SAREA_CTX
La macro 28 es DRM_IOCTL_GET_SAREA_CTX, el código correspondiente es el siguiente:
#define DRM_IOCTL_GET_SAREA_CTX DRM_IOWR(0x1d, struct drm_ctx_priv_map)
Combinado con la definición final de _IOWR (tipo, nr, tamaño) en el artículo anterior, se obtiene el siguiente código:
#define DRM_IOCTL_GET_SAREA_CTX ( ((3) << 30) | (('d') << 8) | ((0x1d) << 0) | ((sizeof(struct drm_ctx_priv_map)) << 16) )
La definición de struct drm_ctx_priv_map se proporcionó anteriormente y no se repetirá aquí.
La API del espacio de usuario correspondiente a DRM_IOCTL_GET_SAREA_CTX es: drmGetContextPrivateMapping(). Esta función también está en xf86drm.c, el código es el siguiente:
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;
}
La función de la función es obtener el mapeo privado del contexto. Esta función se analizará en detalle más adelante cuando la función se explique en detalle. Conozcámonos primero y tengamos una impresión.
Las macrodefiniciones restantes seguirán analizándose en artículos posteriores.