帧缓冲设备应用开发

Posted laoyaodada

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了帧缓冲设备应用开发相关的知识,希望对你有一定的参考价值。

通过/dev/fbn,应用程序可进行的针对帧缓冲设备的操作主要有如下几种:

  • 读写/dev/fbn:相当于读写屏幕缓冲区。例如cp /dev/fb0 tmp命令可将当前屏幕的内容复制到一个文件中,而命令cp tmp > /dev/fb0则将图形文件tmp显示在屏幕上。
  • 映射操作:对于帧缓冲设备,可通过mmap()映射操作将屏幕缓冲区的物理地址映射到用户空间的一段虚拟地址中,之后用户就可以通过读写这段虚拟地址访问屏幕缓冲区,在屏幕上绘图了。
  • I/O控制:对于帧缓冲设备,对设备文件的ioctl()操作可读取/设置显示设备及屏幕的参数,如分辨率、显示颜色数、屏幕大小等。

在应用程序中,操作/dev/fbn的一般步骤如下:

  • 打开/dev/fbn设备文件。
  • 用ioctl()操作取得当前显示屏幕的参数,如屏幕分辨率、每个像素点的比特数和偏移。根据屏幕参数可计算屏幕缓冲区的大小。
  • 将屏幕缓冲区映射到用户空间。
  • 映射后就可以直接读/写屏幕缓冲区,进行绘图和图片显示了。

范例代码:

 1 #include <unistd.h>  
 2 #include <stdio.h>  
 3 #include <fcntl.h>  
 4 #include <linux/fb.h>  
 5 #include <sys/mman.h>  
 6 #include <errno.h>
 7   
 8 int main() {  
 9     int fp = 0;
10     struct fb_var_screeninfo vinfo;
11     struct fb_fix_screeninfo finfo;
12   
13     int screensize = 0;  
14     char *fbp = 0;  
15     int x = 0, y = 0;  
16     int location = 0;  
17     int bytes_per_pixel;  
18   
19     fp = open("/dev/fb0", O_RDWR);  
20     if(fp < 0) {  
21         printf("open failed\n");  
22     }  
23   
24     if(ioctl(fp, FBIOGET_FSCREENINFO, &finfo)) {  
25         perror("ioctl");  
26     }  
27   
28     if(ioctl(fp, FBIOGET_VSCREENINFO, &vinfo)) {  
29         perror("ioctl");  
30     }  
31   
32     bytes_per_pixel = vinfo.bits_per_pixel/8;  
33     screensize = vinfo.xres * vinfo.yres * bytes_per_pixel;  
34     printf("x = %d  y = %d   bytes_per_pixel = %d\n",  vinfo.xres,  vinfo.yres,  bytes_per_pixel);  
35     printf("scrrensize = %d\n",  screensize);  
36   
37     fbp = (char*) mmap(0,  screensize,  PROT_READ |PROT_WRITE,  MAP_SHARED, fp, 0);  
38     if(fbp < 0) {  
39         perror("mmap");  
40     }  
41   
42     for(x = 100; x<200; x++) {  
43         for(y=100; y<200; y++) {  
44             location = x * bytes_per_pixel + y * finfo.line_length;  
45             *(fbp + location) = 0;  
46             *(fbp +location + 1) = 255;  
47             *(fbp + location + 2) = 0;  
48             *(fbp + location + 3) = 0;  
49         }  
50     }  
51   
52     munmap(fbp, screensize);  
53     close(fp);  
54     return 0;  
55 }  

 

 

 

 

 

 

以上是关于帧缓冲设备应用开发的主要内容,如果未能解决你的问题,请参考以下文章

用于片段着色器的 OpenGL GLSL 绑定采样器

帧缓冲子系统框架

帧缓存的详细介绍

帧缓冲

OpenGL没有将最近的片段绘制到相机

◮OpenGL-帧缓冲