打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
Chrome内核解析 -- 绘制引擎提高篇:Command Buffer代码解析


本文对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

自动生成验证代码和测试代码:chromium_org\gpu\command_buffer\build_gles2_cmd_buffer.py和chromium_org\gpu\command_buffer\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函数。

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
Chromium的GPU硬件加速
Memcached 源码分析--命令流程分析
Cocos2d-x3.2与OpenGL渲染总结
Android OpenGL ES 2.0 完全入门(一):基本概念和 hello world
使用OpenGLES 在 android 上显示摄像头滤镜效果
手把手带你实现抖音短视频特效
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服