DRM全解析 —— plane详解(1)

本文参考以下博文:

Linux内核4.14版本——drm框架分析(5)——plane分析

特此致谢!

1. 简介

一个plane代表一个image layer(硬件图层),最终的image由一个或者多个plane(s)组成。plane和 Framebuffer 一样是内存地址。plane主要包括以下3种类型:

  • DRM_PLANE_TYPE_PRIMARY:主要图层,通常用于仅支持RGB格式的简单图层
  • DRM_PLANE_TYPE_OVERLAY:叠加图层,通常用于YUV格式的视频图层
  • DRM_PLANE_TYPE_CURSOR:光标图层,一般用于pc系统,用于显示鼠标

plane在系统中的位置和作用如下所示:

</

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
以下是一个使用 DRM 的 `over_plane` 的示例 C 代码。它需要 Linux 系统和 DRM 库: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <fcntl.h> #include <errno.h> #include <sys/mman.h> #include <xf86drm.h> #include <xf86drmMode.h> #define BO_SIZE (4096 * 4096 * 4) int main() { int drm_fd = open("/dev/dri/card0", O_RDWR); if (drm_fd < 0) { fprintf(stderr, "Failed to open DRM device: %s\n", strerror(errno)); return 1; } // Get the primary plane id drmModeRes *resources = drmModeGetResources(drm_fd); if (!resources) { fprintf(stderr, "Failed to get DRM resources: %s\n", strerror(errno)); close(drm_fd); return 1; } int plane_id = -1; for (int i = 0; i < resources->count_planes; i++) { drmModePlane *plane = drmModeGetPlane(drm_fd, resources->planes[i]); if (plane && (plane->possible_crtcs & (1 << 0))) { plane_id = plane->plane_id; drmModeFreePlane(plane); break; } drmModeFreePlane(plane); } if (plane_id == -1) { fprintf(stderr, "Failed to find primary plane\n"); drmModeFreeResources(resources); close(drm_fd); return 1; } // Create a buffer object uint32_t handle; int ret = drmPrimeHandleToFD(drm_fd, handle, 0, &handle); if (ret < 0) { fprintf(stderr, "Failed to prime handle: %s\n", strerror(errno)); drmModeFreeResources(resources); close(drm_fd); return 1; } uint32_t pitch = BO_SIZE / 4; uint32_t bo_handles[4] = {handle, 0, 0, 0}; uint32_t bo_pitches[4] = {pitch, 0, 0, 0}; uint32_t bo_offsets[4] = {0, 0, 0, 0}; uint32_t bo_flags = 0; uint32_t buffer_id; ret = drmModeAddFB2(drm_fd, 4096, 4096, DRM_FORMAT_ARGB8888, bo_handles, bo_pitches, bo_offsets, &buffer_id, bo_flags); if (ret < 0) { fprintf(stderr, "Failed to create buffer object: %s\n", strerror(errno)); close(handle); drmModeFreeResources(resources); close(drm_fd); return 1; } // Set the plane drmModePlane *plane = drmModeGetPlane(drm_fd, plane_id); if (!plane) { fprintf(stderr, "Failed to get primary plane: %s\n", strerror(errno)); drmModeRmFB(drm_fd, buffer_id); close(handle); drmModeFreeResources(resources); close(drm_fd); return 1; } ret = drmModeSetPlane(drm_fd, plane_id, 0, 0, 0, 0, 0, 4096, 4096, 0, buffer_id, 0, 0, 0); if (ret < 0) { fprintf(stderr, "Failed to set plane: %s\n", strerror(errno)); drmModeFreePlane(plane); drmModeRmFB(drm_fd, buffer_id); close(handle); drmModeFreeResources(resources); close(drm_fd); return 1; } drmModeFreePlane(plane); // Wait for input printf("Press Enter to exit...\n"); getchar(); // Clear the plane ret = drmModeSetPlane(drm_fd, plane_id, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); if (ret < 0) { fprintf(stderr, "Failed to clear plane: %s\n", strerror(errno)); } // Cleanup drmModeRmFB(drm_fd, buffer_id); close(handle); drmModeFreeResources(resources); close(drm_fd); return 0; } ``` 此代码将使用 DRM 在屏幕上显示一个空白的 4096x4096 像素的矩形,并等待用户按下回车键后退出。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蓝天居士

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值