simple-framework(MaliSDK框架分析)
simple-framework(Mali SDK框架分析)
1.全部的定义及实现放在同一个命名空间中。文件包括#include一般在命名空间的外面。
总的命名空间为namespace MaliSDK{};使用时using namespaceMaliSDK包括全部命名空间中的内容。
2.头文件里定义类型。并用#ifndef,#define, #endif来防止多次包括的问题。在相应的.cpp文件里实现。定义与实现相分离。
各文件功能:
1. VectorTypes.h:在该文件里定义了向量类型。用自己定义的结构体类型实现。主要有Vec2,Vec3,Vec4表示整型的2,3,4维向量。用来存放坐标等数据。同理,Vec2f, Vec3f, Vec4f表示浮点型的向量。没有相应的.cpp文件,仅仅在.h文件里单纯的定义类型。
2. Platform.h:定义抽象基类Platform。
然后通过公有继承产生三个针对详细平台的子类WindowsPlatform。DesktopLinuxPlatform;LinuxOnARMPlatform。
2.1 抽象基类中定义静态的可变參数成员函数log(const char* format, ...)来打印日志信息。间接组合成GL_CHECK(x)检測gl函数的返回值。
voidPlatform::log(const char*format, ...)
{ va_list ap;
va_start (ap, format); //ap指向可变參数首地址
vfprintf (stderr, format, ap);//主要发挥作用
fprintf (stderr, "\n");
va_end (ap);
}
#defineGL_CHECK(x) \
x; \ //先返回值。然后在块语句中进行错误检查和处理
{ \
GLenum glError = glGetError(); \
if(glError!= GL_NO_ERROR) { \
LOGD("glGetError()= %i (0x%.8x) at %s:%i\n", glError, glError, __FILE__, __LINE__); \
exit(1); \
} \
}
2.2 LOGD宏来打印调试信息。假设定义了DEBUG则打印调试信息,否则不打印
使用方法举例:
LOGD("vertexShaderID= %d", vertexShaderID);
//文中定义例如以下:
#ifdef DEBUG
#define LOGD fprintf(stderr, "Debug: "); Platform::log
#else
#define LOGD
共同拥有三类信息打印的宏定义:
#define LOGIPlatform::log LOGI用来打印正常的信息
#define LOGEfprintf (stderr, "Error: ");Platform::log LOGE用来打印错误的信息
LOGD宏来打印调试信息。
2.3 static Platform* getInstance(void);依据不同的平台调用相应平台的getInstance函数。返回一个指向派生类对象的基类指针;通过基类指正的虚函数和多态性进行调用子类的virtual voidcreateWindow(int width, int height);virtual void destroyWindow(void);virtual WindowStatus checkWindow(void);详细实现方法。
3. LinuxOnARMPlatform类:基于ARM的Linux平台的类。针对平台环境详细实现了三个虚函数。
通过fbdev_window结构来创建窗体。
4. DesktopLinuxPlatform类:基于Linux平台的类。
针对平台环境详细实现了三个虚函数。
5. WindowsPlatform类:基于Windows平台的类。针对平台环境详细实现了三个虚函数。
6. EGLRuntime类:主要管理和配置EGL相关的接口调用。类中全部使用静态变量。配置显示环境。
configAttributes[]:指定config属性列表,是我们指定的需求属性配置,主要有RGBA,buffer,深度缓存大小,渲染类型,反走样採样点的大小配置。
contextAttributes[]:上下文属性列表,主要是指定OpenGL es 的版本号。
windowAttributes[]:窗体属性列表。指定渲染表面是前台缓存区还是后台缓存区。
initializeEGL函数:通过一系列的EGL接口调用配置一个可显示窗体环境。
eglGetDisplay:创建和初始化与本地EGL显示的连接,打开与EGL显示server的连接。
eglInitialize:成功的打开连接后。须要初始化EGL。
eglChooseConfig:查询底层窗体系统支持的全部EGL表面配置,通过configAttributes []指定的需求。EGL返回最佳的配置列表。首先返回最佳配置的个数,然后分配空间存储返回分配置列表数组。然后选择RGB,深度最匹配的配置。
eglCreateWindowSurface:依据最匹配的配置。在屏幕上创建渲染区域。
eglCreateContext:创建渲染上下文。
eglMakeCurrent:制定EGLcontext为当前上下文。
eglSwapBuffers:交换前台和后台缓存区。
terminateEGL函数:结束时的清理工作。
7. Shader类:用于创建和编译一个着色器对象。
loadShader:通过文件形式载入着色器源代码到字符数组或者字符指针中。
processShader:创建着色器对象,提供着色器源代码。编译着色器。查看着色器的编译状态。
假设编译失败,则打印着色器源代码和着色器编译的日志信息。
8. Matrix类:和矩阵相关的类。定义经常使用举证和经常使用举证操作。比方平移,旋转,缩放,乘法,正投影变换举证。透视投影变换矩阵。转置,逆矩阵等。(矩阵列主序)
identityArray:类中一个静态的单位矩阵。
degreesToRadians:角度转弧度。
multiply或者*:矩阵乘法,列主序。
getAsArray:返回一个指向矩阵元素的指针。
matrixScale:对矩阵的每一个元素同一时候乘以一个缩放因子。
createScaling:创建缩放矩阵。
createTranslation:创建平移矩阵。
matrixPerspective:创建Perspective矩阵。
matrixOrthographic:创建Ortho矩阵。
createRotationX,createRotationY,createRotationZ:绕X轴,Y轴,Z轴旋转。
vertexTransform:顶点向量矩阵相乘。
print:打印矩阵元素。
matrixTranspose:矩阵转置。
matrixDeterminant:按第一行展开求3x3 或者4x4矩阵行列式的值。
matrixInvert:用伴随举证求矩阵的逆矩阵。
9. Timer类:提供了一个高精度的定时器类,採用硬件定时器,计数器来达到平台独立计时,分为Linux版和Windows版,主要分析Windows版本号。
reset:置位当前时间戳为计数器转化的当前时间。
getTime:当前时间和reset时的时间戳之间的时间差值。
getInterval:当前时间和上次时间间隔节点之间的时间差值。
getFPS:每隔一秒计算一次Frames Per Second。
isTimePassed:产生一定的时间间隔。默觉得1秒。
阅读:
原型:BOOLQueryPerformanceFrequency(LARGE_INTEGER *lpFrequency);
作用:返回硬件支持的高精度计数器的频率。
返回值:非零,硬件支持高精度计数器;零,硬件不支持。读取失败。
在定时前应该先调用QueryPerformanceFrequency()函数获得机器内部计时器的时钟频率。接着在须要严格计时的事件发生前和发生之后分别调用QueryPerformanceCounter(),利用两次获得的计数之差和时钟频率,就能够计算出事件经历的精确时间。
10. ETCHeader类:从ETC压缩纹理中获取ETC文件头的信息。.pkm文件格式的文件头共同拥有16个字节。当中前6个字节用来说明文件格式名字,版本号类型。7,8字节为空字节。8,9压缩纹理宽度的最高最低有效位,10,11为压缩纹理高度的最高最低有效位。12,13原始纹理宽度的最高最低有效位,14,15为原始纹理高度的最高最低有效位。
getWidth:原始纹理的宽度。 getHeight:原始纹理的长度。
getPaddedWidth:压缩纹理的宽度。
getPaddedHeight:压缩纹理的长度。
getSize:压缩纹理的尺寸,以字节为单位。(ETC1每一个像素4位。ETC2中有4或者8位)
11. Texture类:使用纹理。
getCompressedTextureFormats:获取支持的压缩纹理格式和数量。
isETCSupported:推断是否支持ETC纹理压缩,并打印支持纹理信息和数量等关键信息。
loadData:从文件里读取数据。能够读取压缩或者未压缩纹理数据。
createTexture:用随机数据创建一幅指定大小的纹理图像。(RGBA四通道
createTexture:还可用来生成单通道纹理。
(R单通道)
deleteTextureData:删除createTexture生成的纹理图像。
loadPKMData:从.pkm压缩纹理图像中提取ETC压缩纹理文件头16字节,提取纹理数据,返回指向纹理数据的指针。
loadCompressedMipmaps:自己主动载入各类级别的mipmap压缩纹理。从level0到最大级别,通过glCompressedTexImage2D依次载入绑定到不同的mipmap的压缩纹理级别上。
12. Text类:使用纹理绘制ANSI可显示字符。每一个字符的大小为8*16个像素。字体大小的缩放倍数scale 默认设置为1.0,其它比較合理的取值范围为0.75-3.0。
13. Geometry类:用于生成几何形状,主要产生圆环,球的顶点数据。立方体。矩形的顶点数据和法向量。
simple-framework(MaliSDK框架分析)的更多相关文章
- (转)simple-framework(MaliSDK框架分析)
出自:http://blog.csdn.net/u013467442/article/details/46940501 simple-framework(Mali SDK框架分析) 1.所有的定义及 ...
- Yii PHP 框架分析 (一)
Yii PHP 框架分析 (一)作者:wdy http://hi.baidu.com/delphiss/blog/item/f7da86d787adb72506088b4b.html 基于yii1.0 ...
- Django之REST framework源码分析
前言: Django REST framework,是1个基于Django搭建 REST风格API的框架: 1.什么是API呢? API就是访问即可获取数据的url地址,下面是一个最简单的 Djang ...
- linux驱动基础系列--linux spi驱动框架分析
前言 主要是想对Linux 下spi驱动框架有一个整体的把控,因此会忽略某些细节,同时里面涉及到的一些驱动基础,比如平台驱动.设备模型等也不进行详细说明原理.如果有任何错误地方,请指出,谢谢! spi ...
- 论文解读(SimGRACE)《SimGRACE: A Simple Framework for Graph Contrastive Learning without Data Augmentation》
论文信息 论文标题:SimGRACE: A Simple Framework for Graph Contrastive Learning without Data Augmentation论文作者: ...
- Entity Framework 实体框架的形成之旅--界面操作的几个典型的处理(8)
在上篇随笔<Entity Framework 实体框架的形成之旅--数据传输模型DTO和实体模型Entity的分离与联合>里面,介绍了在Entity Framework 实体框架里面引入了 ...
- Entity Framework 实体框架的形成之旅--利用Unity对象依赖注入优化实体框架(2)
在本系列的第一篇随笔<Entity Framework 实体框架的形成之旅--基于泛型的仓储模式的实体框架(1)>中介绍了Entity Framework 实体框架的一些基础知识,以及构建 ...
- Entity Framework 实体框架的形成之旅--基于泛型的仓储模式的实体框架(1)
很久没有写博客了,一些读者也经常问问一些问题,不过最近我确实也很忙,除了处理日常工作外,平常主要的时间也花在了继续研究微软的实体框架(EntityFramework)方面了.这个实体框架加入了很多特性 ...
- (七) UVC框架分析
title: UVC框架分析 date: 2019/4/23 19:50:00 toc: true --- UVC框架分析 源码的位置在drivers\media\video\uvc,查看下Makef ...
随机推荐
- windows下载安装mysql
一.下载mysql 1.下载地址 https://www.mysql.com/downloads/ 2.选择windows,如图 3.点击MySQL Install 4.现在版本是8.0.16,在弹出 ...
- 面试之Redis
面:缓存中间件--Memcached和Redis的区别是什么? 答:Memcached的优点是简单易用,代码层次类似与Hash.支持简单数据类型,但不支持数据持久化存储,也不支持主从同步,也不支持分片 ...
- libuv httpparser写的简单http server
libuv文档地址:http://docs.libuv.org/en/v1.x/代码地址:https://github.com/libuv/libuvhttp-parser https://githu ...
- P2347 砝码称重(动态规划递推,背包,洛谷)
题目链接:P2347 砝码称重 参考题解:点击进入 纪念我第一道没理解题意的题 ''但不包括一个砝码也不用的情况'',这句话我看成了每个砝码起码放一个 然后就做不出来了 思路: 1.这题数据很小,10 ...
- BZOJ 2406 LuoguP4194 矩阵 有上下界可行流
分析: 这道题乍一看……卧槽这都什么玩意…… 然后发现给了个A矩阵,要求一个可行的B矩阵,使得矩阵C=A-B的每一行的和的绝对值和每一列的和的绝对值的最大值最小…… 好拗口啊…… 什么最大值最小之类的 ...
- CodeForces - 1020C C - Elections(贪心+枚举)
题目: 党派竞争投票 有n个人,m个党派,这n个人每个人有一个想要投的党派的编号Pi,如果想要这个人改变他的想法,那么就需要花费Ci元钱. 现在你是编号为1的党派,如果你想要赢(你的票数严格大于其他党 ...
- ruby 第五次作业 part 1(分类、排序)
movies_controller.rb class MoviesController < ApplicationController def movie_params params.requi ...
- LeetCode(6) ZigZag Conversion
题目 The string "PAYPALISHIRING" is written in a zigzag pattern on a given number of rows li ...
- js高级程序设计第八章BOM(未完成,待续)
8.1window对象 BOM的核心对象是window,表示浏览器的一个实例. window对象有双重角色,既可以通过就是访问浏览器窗口的接口,又是ECMAscript规定的Global对象 8. ...
- Webdriver元素定位1
元素的定位应该是自动化测试的核心,要想操作一个元素,首先应该识别这个元素. webdriver提供了一系列的元素定位方法,常用的有以下几种: id name class name tag link t ...