Android P图形架构之FrameBuffer测试Demo

2024-02-22 00:48

本文主要是介绍Android P图形架构之FrameBuffer测试Demo,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Android FrameBuffer测试记录。

SurfaceFlinger是一个服务,主要是负责合成各窗口的Surface,然后通过OpenGLES显示到FrameBuffer上。

参考资料:
https://android.googlesource.com/platform/system/extras/+/donut-release/tests/framebuffer/fb_test.c

源码:
framebuffer_test.c

#include <unistd.h>  
#include <stdio.h>  
#include <fcntl.h>  
#include <linux/fb.h>  
#include <sys/mman.h>  
#include <stdlib.h>
#include "yellow_face.zif"
int main()  
{  int fbfd = 0;  struct fb_var_screeninfo vinfo;  struct fb_fix_screeninfo finfo;  //struct fb_cmap cmapinfo;  long int screensize = 0;  char *fbp = 0;  int x = 0, y = 0;  //long int location = 0;  //int b,g,r;  // Open the file for reading and writing  fbfd = open("/dev/graphics/fb0", O_RDWR,0); // 打开Frame Buffer设备  if (fbfd < 0) {  printf("Error: cannot open framebuffer device.%x\n",fbfd);  exit(1);  }  printf("The framebuffer device was opened successfully.\n"); // Get fixed screen information  if (ioctl(fbfd, FBIOGET_FSCREENINFO, &finfo)) { // 获取设备固有信息  printf("Error reading fixed information.\n");  exit(2);  }  printf("\ntype:0x%x\n", finfo.type ); // FrameBuffer 类型,如0为象素  printf("visual:%d\n", finfo.visual ); // 视觉类型:如真彩2,伪彩3   printf("line_length:%d\n", finfo.line_length ); // 每行长度  printf("\nsmem_start:0x%lx,smem_len:%u\n", finfo.smem_start, finfo.smem_len ); // 映象RAM的参数  printf("mmio_start:0x%lx ,mmio_len:%u\n", finfo.mmio_start, finfo.mmio_len );  // Get variable screen information  if (ioctl(fbfd, FBIOGET_VSCREENINFO, &vinfo)) { // 获取设备可变信息  printf("Error reading variable information.\n");  exit(3);  }  printf("%dx%d, %dbpp,xres_virtual=%d,yres_virtual=%dvinfo.xoffset=%d,vinfo.yoffset=%d\n", vinfo.xres, vinfo.yres, vinfo.bits_per_pixel,vinfo.xres_virtual,vinfo.yres_virtual,vinfo.xoffset,vinfo.yoffset);  screensize = finfo.line_length * vinfo.yres_virtual;// Map the device to memory 通过mmap系统调用将framebuffer内存映射到用户空间,并返回映射后的起始地址  fbp = (char *)mmap(0, screensize, PROT_READ | PROT_WRITE, MAP_SHARED,fbfd, 0);  if ((int)fbp == -1) {  printf("Error: failed to map framebuffer device to memory.\n");  exit(4);  }  printf("The framebuffer device was mapped to memory successfully.\n");  /*****************exampel********************/		unsigned char *pTemp = (unsigned char *)fbp;int i, j;//起始坐标(x,y),终点坐标(right,bottom)x = 0;y = 0;int right = 480;//vinfo.xres;int bottom = 1708;//vinfo.yres;//计算偏移量.例如在(x,y)位置写入颜色 pixel值.//offset = (x + y * screen_width) * 4; // (4个字节) for(i=y; i< bottom; i++){for(j=x; j<right; j++){unsigned short data = yellow_face_data[(((i-y)  % 128) * 128) + ((j-x) %128)];// *((uint32_t *)(fbp + offset)) = pixel;pTemp[i*finfo.line_length + (j*4) + 2] = (unsigned char)((data & 0xF800) >> 11 << 3);pTemp[i*finfo.line_length + (j*4) + 1] = (unsigned char)((data & 0x7E0) >> 5 << 2);pTemp[i*finfo.line_length + (j*4) + 0] = (unsigned char)((data & 0x1F) << 3);}} /*****************FBIOPAN_DISPLAY********************/	//note:vinfo.xoffset =0 vinfo.yoffset =0 否则FBIOPAN_DISPLAY不成功if (ioctl(fbfd, FBIOPAN_DISPLAY, &vinfo)) {    printf("Error FBIOPAN_DISPLAY information.\n");  exit(5);  }  sleep(10);//finfo.smem_len == screensize == finfo.line_length * vinfo.yres_virtual munmap(fbp,finfo.smem_len);close(fbfd);  return 0;  
}

mk编译文件源码:
Android.mk

LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE_TAGS := eng
LOCAL_SRC_FILES:=framebuffer_test.c
LOCAL_MODULE:=framebuffer_test
LOCAL_CPPFLAGS += -DANDROID
LOCAL_SHARED_LIBRARIES:=libc
LOCAL_C_INCLUDES += $(LOCAL_PATH) $(LOCAL_PATH)/$(KERNEL_DIR)/include
include $(BUILD_EXECUTABLE)

1、mm编译system\bin目录下生成framebuffer_test文件
2、拷贝到机器system/bin目录下
3、执行:stop surfaceflinger,关闭surfaceflinger
4、执行:./framebuffer_test,运行framebuffer_test程序
5、显示图像,执行成功。

这篇关于Android P图形架构之FrameBuffer测试Demo的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/733618

相关文章

如何解决idea的Module:‘:app‘platform‘android-32‘not found.问题

《如何解决idea的Module:‘:app‘platform‘android-32‘notfound.问题》:本文主要介绍如何解决idea的Module:‘:app‘platform‘andr... 目录idea的Module:‘:app‘pwww.chinasem.cnlatform‘android-32

Android实现打开本地pdf文件的两种方式

《Android实现打开本地pdf文件的两种方式》在现代应用中,PDF格式因其跨平台、稳定性好、展示内容一致等特点,在Android平台上,如何高效地打开本地PDF文件,不仅关系到用户体验,也直接影响... 目录一、项目概述二、相关知识2.1 PDF文件基本概述2.2 android 文件访问与存储权限2.

Android Studio 配置国内镜像源的实现步骤

《AndroidStudio配置国内镜像源的实现步骤》本文主要介绍了AndroidStudio配置国内镜像源的实现步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,... 目录一、修改 hosts,解决 SDK 下载失败的问题二、修改 gradle 地址,解决 gradle

在Android平台上实现消息推送功能

《在Android平台上实现消息推送功能》随着移动互联网应用的飞速发展,消息推送已成为移动应用中不可或缺的功能,在Android平台上,实现消息推送涉及到服务端的消息发送、客户端的消息接收、通知渠道(... 目录一、项目概述二、相关知识介绍2.1 消息推送的基本原理2.2 Firebase Cloud Me

Android中Dialog的使用详解

《Android中Dialog的使用详解》Dialog(对话框)是Android中常用的UI组件,用于临时显示重要信息或获取用户输入,本文给大家介绍Android中Dialog的使用,感兴趣的朋友一起... 目录android中Dialog的使用详解1. 基本Dialog类型1.1 AlertDialog(

Springboot处理跨域的实现方式(附Demo)

《Springboot处理跨域的实现方式(附Demo)》:本文主要介绍Springboot处理跨域的实现方式(附Demo),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不... 目录Springboot处理跨域的方式1. 基本知识2. @CrossOrigin3. 全局跨域设置4.

Java异常架构Exception(异常)详解

《Java异常架构Exception(异常)详解》:本文主要介绍Java异常架构Exception(异常),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1. Exception 类的概述Exception的分类2. 受检异常(Checked Exception)

Android Kotlin 高阶函数详解及其在协程中的应用小结

《AndroidKotlin高阶函数详解及其在协程中的应用小结》高阶函数是Kotlin中的一个重要特性,它能够将函数作为一等公民(First-ClassCitizen),使得代码更加简洁、灵活和可... 目录1. 引言2. 什么是高阶函数?3. 高阶函数的基础用法3.1 传递函数作为参数3.2 Lambda

Android自定义Scrollbar的两种实现方式

《Android自定义Scrollbar的两种实现方式》本文介绍两种实现自定义滚动条的方法,分别通过ItemDecoration方案和独立View方案实现滚动条定制化,文章通过代码示例讲解的非常详细,... 目录方案一:ItemDecoration实现(推荐用于RecyclerView)实现原理完整代码实现

Android App安装列表获取方法(实践方案)

《AndroidApp安装列表获取方法(实践方案)》文章介绍了Android11及以上版本获取应用列表的方案调整,包括权限配置、白名单配置和action配置三种方式,并提供了相应的Java和Kotl... 目录前言实现方案         方案概述一、 androidManifest 三种配置方式