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端

未完待续

0 0
原创粉丝点击