Chrome内核解析 -- 绘制引擎提高篇:Command Buffer代码解析
来源:互联网 发布:伴奏提取软件 编辑:程序博客网 时间:2024/06/06 03:46
转载请注明出处:http://blog.csdn.net/yunchao_he/article/details/49763321
本文对command buffer模块进行详细分析。如需要修改command buffer模块的代码,或者想深入了解Chromium里集中处理GL操作的原理,可阅读本文。 如想了解command buffer的背景知识,可查看《Chrome内核解析 -- 绘制引擎基础篇:Command Buffer》一文。
前面的基础篇《Chrome内核解析之绘制引擎基础篇:Command Buffer》已经谈到,command buffer包括client端代码和service端代码,另外还有common目录和tests目录。在进入client端和service端代码之前,先看看command buffer模块的根目录下的两个重要文件:build_gles2_cmd_buffer.py和cmd_buffer_functions.txt
自动生成验证代码和测试代码:build_gles2_cmd_buffer.py和cmd_buffer_functions.txt
command buffer的client端和service端有很多autogen文件,比如client端的gles2_cmd_helper_autogen.h和gles2_implemenation_impl_autogen.h,再比如service端的gles2_cmd_decoder_unittest_*_autogen.h等,它们都是由build_gles2_cmd_buffer.py生成的。
build_gles2_cmd_buffer.py代码较多,其中比较重要的有:
1) Named type info object
它定义了GL API里的各种参数对象,比如BufferTarget, FramebufferTarget, TextureTarget, TextureFormat, SrcBlendFactor, Attachment等等。这些参数对象数量繁多,但都比较简单,主要是定义该对象的类型(GLint, GLenum, GLboolean)以及合法值。
而在cmd_buffer_functions.txt文件里,则包含了command buffer实现的所有GL API。这些API的参数就使用了这些参数对象。而自动生成的client端和service端的validation代码及测试代码,都是遵循这些参数对象而生成的。
比如cmd_buffer_function.txt定义了glTexImage2D函数:
glTexImage2D (GLenumTextureTarget target, GLint level, GLintTextureInternalformat internalFormat, ...);其中,TextureTarget和TextureInternalformat就是两个参数对象,named type info object里都有相关定义。自动生成的代码会对它的合法性进行验证。而level则没有指定参数对象,意味着它需要手工添加validation代码。
如果需要在command buffer里添加新的API,则需要在cmd_buffer_function.txt文件声明这个API, 其参数则必须使用相应的参数对象。如果没有合适的参数对象,就添加新的参数对象到build_gles2_cmd_buffer.py里。
2) function info object
同样的,每个GL API,在build_gles2_cmd_buffer.py里也定义了相应对象,包括该API的类型,对应的decoder函数,gl_test函数,是否需要单元测试,返回值类型,从client端到service端需要传递的参数,等等。也是为了自动生成验证代码和测试代码。
3) Python code
python代码就是以cmd_buffer_functions.txt里的API为输入,结合上面定义的参数对象(named type info object)和函数对象(function info type),生成需要的验证代码和测试代码。
如果需要对command buffer里自动生成的代码进行修改,可以使用pygdb进行调试,也可以从main函数找到相应的Write函数继续阅读。但这里有一个小窍门,就是找到需要改的autogen函数,比如gles2_cmd_decoder_autogen.h里有这段代码:
if (condition) {LOCAL_SET_GL_ERROR(GL_INVALIDE_VALUE, "", "level GL_INVALID_VALUE");return error::kNoError;}
可以直接在gles2_cmd_decoder_autogen.h里找出LOCAL_SET_GL_ERROR(GL_INVALID_VALUE,则很快知道了生成这段代码对于的具体python函数。
Client端
未完待续
Service端
未完待续
- Chrome内核解析 -- 绘制引擎提高篇:Command Buffer代码解析
- Chrome内核解析 -- 绘制引擎基础篇:Command Buffer
- Chrome内核解析 -- 背景篇:绘制(Painting)
- Chrome内核解析 -- 绘制引擎基础篇:绘图上下文(RenderingContext, GraphicsContext)
- Chromium内核解析:绘制引擎篇:angle project简介
- Chrome内核解析 -- 背景篇:布局
- Chrome内核解析 -- 背景篇:小结
- Chrome内核解析 -- 背景篇:Chrome, Chromium, WebKit, WebKit2, Blink
- Chrome内核解析 -- 背景篇:Chrome, Chromium, WebKit, WebKit2, Blink
- Chrome内核解析 -- 背景篇:Chromium/Blink的工作流程
- Chrome内核解析 -- 背景篇:Chromium/Blink的工作流程
- webkit 绘制部分代码解析
- Chrome内核解析:GraphicsContext之间的同步
- Chrome内核解析 -- 背景篇:HTML, CSS解析与JavaScript执行
- windows内核缓存代码解析
- buffer cache 深度解析+
- log buffer 深度解析+
- +++++buffer cache 深度解析
- Android快速SDK(5)联网请求库QuickHttp
- 数据结构-双链表
- AsyncTask详解
- CDH离线安装手册
- eclipse+tomcat+jvm,刚刚参加工作的一些简单问题
- Chrome内核解析 -- 绘制引擎提高篇:Command Buffer代码解析
- 使用yum方式在CentOS上安装Java环境,系统以CentOS6.4为例
- oracle用户创建及权限设置
- ArrayList转换为数组
- ScrollView中listview显示不全的问题
- OnKeyDown方法
- 人工智能-八皇后爬山法(最陡上升,首项选择),随即重新启动法
- java基础面试题01
- Jboss 4.2.3配置与优化