glmark2代码分析2(代码结构)

代码结构

代码目录:
├── src
│ ├── android.cpp Anroid平台的入口
│ ├── benchmark-collection.* benchmake的处理,程序运行的benchmark有不同的方式,可以来自文件(运行参数有这个选项)或配置选择。
│ ├── scene-default-options.cpp 对接benchmark中的scene,setup options
│ ├── benchmark.* benchmark类,用来处理scene的
│ ├── canvas-* 继承自Canvas类,按照Android和非Android分,做OpenGL绘制前的初始化。
│ ├── canvas.h Canvas类
│ ├── default-benchmarks.h 运行的bench,每个bench来自scene,有不同的配置。
│ ├── gl-headers.* OpenGL版本和扩展的判断 support 函数
│ ├── gl-state-* 不同窗口系统egl/glx/wgl的OpenGL初始化和配置封装
│ ├── gl-visual-config.* 计算和选择窗口的配置 GL visual
│ ├── main.cpp 入口函数
│ ├── main-loop.* 主循环
│ ├── mesh.* 将顶点和相关的属性封装成mesh类,处理范围包括:vbo和draw
│ ├── model.* 处理model目录下的模型文件,加载解析3ds和obj文件,转换顶点、计算法向量和纹理坐标等。
│ ├── native-state-* NativeState基类,根据不同的桌面窗口系统:dispmanx/drm/mir/wayland/win32/x11
│ ├── options.* 运行时参数的解析和管理
│ ├── scene.* 各个运行测试模块的管理
│ ├── scene-* 具体各个测试用例场景构建
│ ├── scene-clear.cpp scene的一个模板,空的什么也没有做
│ ├── scene-collection.h 初始化管理所有的scene,将他们串起来
│ ├── shared-library.* SharedLibrary类,给窗口系统用,来加载和使用GL的库。在Android平台下使用,x11不用。
│ ├── text-renderer.* main-loop中绘制fps和title的纹理
│ ├── image-reader.* png/jpeg图片进行统一管理,抽象成ImageReader类
│ ├── texture.* 纹理贴图的封装,纹理数据读取来自ImageReader类
│ ├── wscript_build 二级编译脚本
│ ├── include 系统的头文件:dirent.h、getopt.h、sys/time.h
│ ├── libjpeg-turbo 依赖库
│ ├── libmatrix 实现的一个矩阵操作库
│ ├── libpng 依赖库
│ ├── glad glad2库
│ └── zlib 依赖库
├── data
│ ├── models 存放模型文件3ds.obj.jobj
│ ├── shaders 存放shader文件
│ ├── textures 存放纹理照片
│ └── wscript_build 二级编译脚本
├── doc
│ ├── glmark2.1.in 用来生成说明文件man
│ └── wscript_build 二级编译脚本
├── INSTALL 安装说明
├── README 说明
├── waf 编译工具
├── waflib 编译工具
└── wscript 编译脚本

测试模块

测试的用例用为一个scene,每个scene可以配置不同option为一个测试项目,运行glmark默认包含的scene有:
buffer
build
bump
conditionals
desktop
effect2d
function
ideas
jellyfish
loop
pulsar
refract
shading
shadow
terrain
texture
是按照 default-benchmarks.h 中定义的顺序执行,比运行glmark --scene-list 列出所有的测试项少一个clear。
所有的scene在scene-collection.h文件中通过 add_scenes 添加到 scenes_ 集合中,这里比上面的 --scene-list中多添加一个DefaultOptions,添加的每个scene都有一个对应的cpp文件scene-*.cpp,scene-grid.cpp为中间文件。

主要数据结构和关系

用例存储主要是 class MainLoop 中的 scene_ 和 benchmarks_ ,benchmarks_ 是 MainLoop::step() 中从 benchmarks_ 中取出scene给 scene_

while (bench_iter_ != benchmarks_.end()) {
    scene_ = &(*bench_iter_)->scene();
    next_benchmark();
}
if (bench_iter_ != benchmarks_.end()) {
    before_scene_setup();
    scene_ = &(*bench_iter_)->setup_scene();
    after_scene_setup();
}

scene() 直接返回 Benchmark 中的 scene_
setup_scene() 给scene分佩 option ,option来自构造函数Benchmark::Benchmark(const string &s),每个Benchmark是单独的一个测试项来自 benchmark-collection 的 benchmarks_,benchmarks_ 的每一项来自三个方面:
1、通过运行命令中的参数“-b, --benchmark BENCH”获取option生成
2、通过运行命中的的参数“-f, --benchmark-file F”读文件生成
3、来自DefaultBenchmarks中的populate函数中定义的默认
其主要还是获取固定格式的options列表
load和setup就走到具体的scene中了。

Scene &
Benchmark::setup_scene()
{
    scene_.reset_options();
    load_options();

    scene_.load();
    scene_.setup();

    return scene_;
}

主要类关系说明

class MainLoop:

MainLoopValidation MainLoop # Canvas &canvas_ # Scene *scene_ # vector &benchmarks_ +reset() +step() +draw() +before_scene_setup() +after_scene_setup() MainLoopDecoration Canvas int width_ int height_ mat4 projection_ bool offscreen_ GLVisualConfig visual_config_ +init() +reset() +visible() +clear() +update() +write_to_file(string &filename) +should_quit() +resize() +offscreen() +visual_config(GLVisualConfig &config) CanvasGeneric CanvasAndroid Benchmark - Scene &scene_ - vector options_ +Scene &scene() +Scene &setup_scene() void teardown_scene +register_scene(Scene &scene) Scene string name_ # map options_ double startTime_ double lastUpdateTime_ unsigned currentFrame_ bool running_ +load() +unload() +setup() +teardown() +update() +draw() +set_option() SceneBuild SceneTexture SceneGrid SceneBump SceneEffect2D ScenePulsar SceneDesktop SceneBuffer SceneConditionals SceneFunction SceneLoop SceneClear SceneShading SceneIdeas SceneTerrain SceneJellyfish SceneShadow SceneRefract

你可能感兴趣的:(代码分析,glmark)