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

相关文章

Knife4j+Axios+Redis前后端分离架构下的 API 管理与会话方案(最新推荐)

《Knife4j+Axios+Redis前后端分离架构下的API管理与会话方案(最新推荐)》本文主要介绍了Swagger与Knife4j的配置要点、前后端对接方法以及分布式Session实现原理,... 目录一、Swagger 与 Knife4j 的深度理解及配置要点Knife4j 配置关键要点1.Spri

mysql中的服务器架构详解

《mysql中的服务器架构详解》:本文主要介绍mysql中的服务器架构,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、背景2、mysql服务器架构解释3、总结1、背景简单理解一下mysqphpl的服务器架构。2、mysjsql服务器架构解释mysql的架

使用Python进行GRPC和Dubbo协议的高级测试

《使用Python进行GRPC和Dubbo协议的高级测试》GRPC(GoogleRemoteProcedureCall)是一种高性能、开源的远程过程调用(RPC)框架,Dubbo是一种高性能的分布式服... 目录01 GRPC测试安装gRPC编写.proto文件实现服务02 Dubbo测试1. 安装Dubb

Python的端到端测试框架SeleniumBase使用解读

《Python的端到端测试框架SeleniumBase使用解读》:本文主要介绍Python的端到端测试框架SeleniumBase使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全... 目录SeleniumBase详细介绍及用法指南什么是 SeleniumBase?SeleniumBase

Android DataBinding 与 MVVM使用详解

《AndroidDataBinding与MVVM使用详解》本文介绍AndroidDataBinding库,其通过绑定UI组件与数据源实现自动更新,支持双向绑定和逻辑运算,减少模板代码,结合MV... 目录一、DataBinding 核心概念二、配置与基础使用1. 启用 DataBinding 2. 基础布局

Android ViewBinding使用流程

《AndroidViewBinding使用流程》AndroidViewBinding是Jetpack组件,替代findViewById,提供类型安全、空安全和编译时检查,代码简洁且性能优化,相比Da... 目录一、核心概念二、ViewBinding优点三、使用流程1. 启用 ViewBinding (模块级

k8s上运行的mysql、mariadb数据库的备份记录(支持x86和arm两种架构)

《k8s上运行的mysql、mariadb数据库的备份记录(支持x86和arm两种架构)》本文记录在K8s上运行的MySQL/MariaDB备份方案,通过工具容器执行mysqldump,结合定时任务实... 目录前言一、获取需要备份的数据库的信息二、备份步骤1.准备工作(X86)1.准备工作(arm)2.手

Android学习总结之Java和kotlin区别超详细分析

《Android学习总结之Java和kotlin区别超详细分析》Java和Kotlin都是用于Android开发的编程语言,它们各自具有独特的特点和优势,:本文主要介绍Android学习总结之Ja... 目录一、空安全机制真题 1:Kotlin 如何解决 Java 的 NullPointerExceptio

使用Python和Matplotlib实现可视化字体轮廓(从路径数据到矢量图形)

《使用Python和Matplotlib实现可视化字体轮廓(从路径数据到矢量图形)》字体设计和矢量图形处理是编程中一个有趣且实用的领域,通过Python的matplotlib库,我们可以轻松将字体轮廓... 目录背景知识字体轮廓的表示实现步骤1. 安装依赖库2. 准备数据3. 解析路径指令4. 绘制图形关键

python多线程并发测试过程

《python多线程并发测试过程》:本文主要介绍python多线程并发测试过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、并发与并行?二、同步与异步的概念?三、线程与进程的区别?需求1:多线程执行不同任务需求2:多线程执行相同任务总结一、并发与并行?1、