Análisis completo de libdrm diecinueve: análisis completo del código fuente (16)

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.

Supongo que te gusta

Origin blog.csdn.net/phmatthaus/article/details/132491133
Recomendado
Clasificación