Servo: 完全实现 WebGL 1.0

创建于 2016-03-26  ·  40评论  ·  资料来源: servo/servo

这是一个元错误。

其余的一些方法在https://github.com/servo/servo/issues/5014上被阻止(那些接收ArrayBufferViewBufferDataSource并具有覆盖的方法),但其他一些方法可以实施没有问题。

我将尝试为每个剩余的缺陷提交单独的问题,因为其中一些可能是E-Easy

WebGL 错误的一般信息

点击展开

规格

WebGL 1.0 规范在这里

GLES 2.0 规范

WebGL 基于 GLES 2.0 规范,因此 WebGL 规范经常利用它的细节。 您可以在此处找到 PDF 版本。

当前代码

DOM

WebGL 代码的 DOM 端可以在以下文件中找到:

  • components/script/dom/webglrenderingcontext.rs
  • components/script/dom/webglactiveinfo.rs
  • components/script/dom/webglbuffer.rs
  • components/script/dom/webglcontextevent.rs
  • components/script/dom/webglframebuffer.rs
  • components/script/dom/webglobject.rs
  • components/script/dom/webglprogram.rs
  • components/script/dom/webglrenderbuffer.rs
  • components/script/dom/webglrenderingcontext.rs
  • components/script/dom/webglshader.rs
  • components/script/dom/webglshaderprecisionformat.rs
  • components/script/dom/webgltexture.rs
  • components/script/dom/webgluniformlocation.rs

WebGL 线程

WebGL 线程是从 DOM 接收 WebGL 消息并执行它或将其分派到 WebRender 后端的线程。

您可能不需要在这里触摸任何东西,但如果您想看一看,该文件是:

  • components/canvas/webgl_paint_thread.rs

WebGL 命令定义、执行和其他类型

其余的 WebGL 定义和命令实现位于webrender_traitswebgl.rs文件中,以便由 Servo 和 WebRender 共享。

您需要查看WebGLCommand定义apply函数

要积极使用它,最好的方法是使用Cargo override

请注意,出于遗留原因, WebGLCommandcanvas_traits重新导出CanvasWebGLMessage (以避免在 webrender 尚未合并时额外的变基痛苦)。

缺少安全检查

  • [ ] 正确实现“启用顶点属性和范围检查”(#20599)
  • [ ] 检查我们是否正确实施了所有 GLSL 约束(#20601)
  • [ ] 正确实现“立方体贴图帧缓冲区附件的完整性”(#20654)
  • [ ] 针对反馈循环实施 WebGL 检查 (#21288)
  • [ ] 正确实施模板检查 (#20555)
  • [ ] 在某些情况下将纹理初始化为透明黑色 (#21716)
  • [ ] 验证源传递给gl.shaderSource() (#21754)

待实施

  • [ ] 支持antialiasing的 WebGL 上下文选项 (#21285)
  • [ ] 支持丢弃和重新创建 WebGL 上下文 (#15266)
  • [] 在 WebGL 中实现压缩纹理 (#20594)
  • [] 实现将 WebGL 画布绘制到 2D 画布中 (#21556)
  • [ ] 实现ImageBitmap (#20650)
  • [ ] 必要时创建小于请求的绘图缓冲区 (#21718)
  • [] WebGL 画布在全屏显示时缩放 (#21290)
  • [ ] 正确防御WebGLRenderingContext.bufferSubData中的溢出 (#20558)

其他待定事项和改进

  • [ ] 窃取 Firefox 有关 WebGL 上下文稳健性的知识 (#21144)
  • [ ] 正确支持 WebIDL 扩展属性[AllowShared] (#20515)
  • [ ] 在WebGLRenderingContext缓存drawingBufferWidth / drawingBufferHeight WebGLRenderingContext (#20530)
  • [ ] WebGLRenderingContext.getContextAttributes缓存结果 (#20532)
  • [ ] 不要在WebGLRenderingContext.bufferData分配空缓冲区(#20557)
  • [] 删除 WebGL 纹理参数的间接引用 (#20596)
  • [ ] 清理 WebGL 扩展基础设施 (#20642)
  • [ ] 也许引入一个特定于 WebGL 的新任务源 (#20643)
  • [ ] WebGL 的 Khronos 测试不应在测试名称中使用索引 (#20668)
  • [ ] [Throws]不适用于 per-overload (#20516)
  • [] 在 html5test.com 上加载着色器时崩溃 (#21191)
  • [ ] WebGL 水演示不显示任何内容 (#21173)
  • [] Firefox 报告比 Servo 更大的“最大变化向量”、“最大颜色缓冲区”和“最大组合纹理单元”限制(#21172)
  • [ ] 调查真正的基于 webgl 的应用程序 (#21151)
  • [] 构建一个 WebGL 分析器 (#21150)

完成的东西

  • [x] 检查 WebGL 位置和属性名称中的无效字符 (#21287)
  • [x] 审计WebGLRenderingContext.getProgramInfoLog的行为 (#20561)
  • [x] handle_object_deletion可能是错误的 (#21352)
  • [x] 初始化和调整 WebGL 画布大小时清除帧缓冲区 (#21475)
  • [x] 支持联合作为区分 WebIDL 参数 (#20513)
  • [x] 实现挂起的 texImage2D 重载 (#10443)
  • [x] 实现 copyTexImage2D (#11147)
  • [x] 实现 copyTexSubImage2D (#11147)
  • [x] 实现 detachShader (#10215)
  • [x] 工具完成 (#10212, #10215)
  • [x] 实现冲洗 (#10213, #10215)
  • [x] 实现 framebufferRenderbuffer (#13639)
  • [x] 实现 framebufferTexture2D (#13639)
  • [x] 实现 generateMipmap (#10215)
  • [x] 实现 getActiveAttrib (#10379)
  • [x] 实现 getActiveUniform (#10397)
  • [x] 实现 getAttachedShaders (#20411)
  • [x] 实现 getFramebufferAttachmentParameter (#20317)
  • [x] 实现 getProgramInfoLog (#13199)
  • [x] 实现 getRenderbufferParameter (#20514)
  • [x] 实现 getTexParameter (#20144)
  • [x] 实现 getShaderPrecisionFormat (#16544)
  • [x] 实现 getUniform (#21202)
  • [x] 实现 getVertexAttrib
  • [x] 实现 getVertexAttribOffset (#16893)
  • [x] 实现 isBuffer (#11357)
  • [x] 实现 isEnabled (#13040)
  • [x] 实现 isFramebuffer (#11357)
  • [x] 实现 isRenderBuffer (#11357)
  • [x] 实现 isShader (#11072)
  • [x] 实现 isTexture (#11072)
  • [x] 实现 readPixels (#10668)
  • [x] 实现 renderbufferStorage (#13872)
  • [x] 实现 sampleCoverage
  • [x] 实现 stencilFunc (#10659)
  • [x] 实现 stencilFuncSeparate (#10659)
  • [x] 实现 stencilMask (#10659)
  • [x] 实现 stencilMaskSeparate (#10659)
  • [x] 实现 stencilOp (#10659)
  • [x] 实现 stencilOpSeparate (#10659)
  • [x] 实现 texSubImage2D (#11168)
  • [x] 实现uniform1i (#10417)
  • [x] 实现uniform1iv (#10417)
  • [x] 实现uniform2f (#10356)
  • [x] 实现uniform2fv (#10417)
  • [x] 实现uniform2i (#10417)
  • [x] 实现uniform2iv (#10417)
  • [x] 实现uniform3f (#10417)
  • [x] 实现uniform3fv (#10417)
  • [x] 实现uniform3i (#10417)
  • [x] 实现uniform3iv (#10417)
  • [x] 实现uniform4i (#10368)
  • [x] 实现uniform4iv (#10368)
  • [x] 实现 uniformMatrix2fv (#10671)
  • [x] 实现 uniformMatrix3fv (#10671)
  • [x] 实现 uniformMatrix4fv (#10671)
  • [x] 实现验证程序 (#13199)
  • [x] 正确检查WebGLRenderingContext.activeTexture (#20531) 的限制
  • [x] 实现gl.getParameter(gl.ALIASED_LINE_WIDTH_RANGE) (#20535)
  • [x] 实现gl.getParameter(gl.BLEND_COLOR) (#20536)
  • [x] 实现gl.getParameter(gl.COLOR_CLEAR_VALUE) (#20537)
  • [x] 实现gl.getParameter(gl.COLOR_WRITEMASK) (#20538)
  • [x] 实现gl.getParameter(gl.COMPRESSED_TEXTURE_FORMATS) (#20544)
  • [x] 实现gl.getParameter(gl.DEPTH_RANGE) (#20545)
  • [x] 实现gl.getParameter(gl.GENERATE_MIPMAP_HINT) (#20546)
  • [x] 支持IMPLEMENTATION_COLOR_READ_FORMATIMPLEMENTATION_COLOR_READ_TYPE (#20547)
  • [x] 支持MAX_FRAGMENT_UNIFORM_VECTORSMAX_VERTEX_UNIFORM_VECTORS (#20548)
  • [x] 实现gl.getParameter(gl.MAX_VARYING_VECTORS) (#20549)
  • [x] 支持SCISSOR_TESTSCISSOR_BOX (#20551)
  • [x] 实现gl.getParameter(gl.UNPACK_COLORSPACE_CONVERSION_WEBGL) (#20552)
  • [x] 实现gl.getParameter(gl.UNPACK_FLIP_Y_WEBGL) (#20553)
  • [x] 实现gl.getParameter(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL) (#20554)
  • [x] 正确实施WebGLRenderingContext.bindBuffer检查 (#20556)
  • [x] 正确执行gl.renderbufferStorage的检查 (#20563)
  • [x] 审计WebGLRenderingContext.getFramebufferAttachmentParameter (#20593) 中的支票
  • [x] 正确检查WebGLRenderingContext.clear (#20623)
  • [x] 检查我们是否正确绑定了GLclampf (#20652)
  • [x] 在gl.getParameter和朋友中返回正确的类型 (#20655)
  • [x] 正确检查 WebGL 对象是否传递到正确的 WebGL 上下文 (#21133)
  • [x] 在 WebGL 中实现属性别名检查 (#21136)
  • [x] 修复renderbufferStorage未初始化的数据泄露 (#13710)
  • [x] WebGLShader析构函数在关闭 webgl 页面时频繁断言 (#21177)
  • [x] 当同一页面中有多个WebGLRenderingContext时,重新检查我们的验证。
  • [x] 为 #20598 (#20607) 中的更改创建测试
  • [x] 使我们的验证成为强类型 (#10693)
  • [x] 删除某些 WebGL 参数的间接引用 (#20550)
  • [x] 停止将WebGLCommand重新导出为CanvasWebGLMessage (https://github.com/servo/servo/issues/10211)
  • [x] 更新我们的角度依赖
  • [x] 使用 WebGL 一致性测试套件进行测试 (#10373)
  • [x] 更新我们对规范的解释以匹配其他浏览器引擎 (#8753)
  • [x] 缓存启用了哪些服务器端 GL 功能(#20534)
  • [x] 删除 WebGL 程序参数的间接引用 (#20560)
  • [x] 删除 WebGL 着色器参数的间接引用 (#20562)
  • [x] 审核 WebGL 中的帧缓冲区状态是否正确更新 (#20570)
  • [x] 缓存gl.getActiveAttribgl.getActiveUniform (#20600)
  • [x] gl.getVertexAttribgl.getVertexAttribOffset所需的缓存信息 (#20608)
  • [x] 仅在未绑定帧缓冲区时将画布标记为脏 (#21691)
  • [x] 检查渲染缓冲区存储是否超过最大渲染缓冲区大小 (#21485)
  • [x] gl-pointcoord.html不绘制任何东西 (#21719)
  • [x] oes-texture-half-float.html在桌面模式下运行时出现 GL 错误(#21663)
  • [x] 在 Image2D 方法中实现组件检查 (#20595)
  • [x] 支持preserveDrawingBuffer的 WebGL 上下文选项 (#21132)
A-contenwebgl B-meta

最有用的评论

我打算尝试 glGetTexParameter。

所有40条评论

抄送@dmarcos

我将致力于实现 generateMipmap

@ConnorGBrewster我打开了 https://github.com/servo/servo/issues/10226,让我们在那里讨论 :)

我想在getActiveUniform

@saurvs我为您打开了 https://github.com/servo/servo/issues/10397,请随时提出您在那里可能遇到的任何问题:)

如果可以的话,我想研究所有剩余的统一方法

@autrilla他们是你的! 我已经打开 https://github.com/servo/servo/issues/10417 来跟踪它们,请随时在那里留下任何问题:)

我正在查看 stencil* 函数。

我正在尝试copyTex*texSubImage2D

尝试

Implement isShader
Implement isTexture

我想帮助texSubImage2D

@daoshengmu :听起来不错!

@danlrobertson ,你还在texSubImage2D吗?

@danlrobertson抱歉,我没有注意到您正在处理texSubImage2D 。 我只是想帮助一些 WebGL 的实现。 如果你还在努力,我可以选择copyTexImage2DcopyTexSubImage2D @emilio

@daoshengmu没问题! 完全没问题! 花了这么长时间才拿到 PR 是我的坏事,但遗憾的是生活发生了:微笑:...

你可以接受texSubImage2D吗? 我已经在wr_traits 中实现了必要的组件。 我应该很快就能获得copyTex*的 PR,但实际上我还没有开始使用texSubImage2D 。 如果你想要texSubImage2D ,去吧! 我对它没有特别的依恋。 只是想了解一下 webgl 代码...

@danlrobertson当然。 我会拿texSubImage2D 。 谢谢! 😄

如果可以的话,我会继续工作
Implement isFramebuffer

Implement isRenderBuffer

@DDEFISHER 加油! 介意为那些人打开一个问题,以便我可以分配给你吗?

我也将在isBuffer因为它类似于其他 2

如果您打算解决此问题,请在此处发表评论。 谢谢!

个别 API 的单独问题是 E-easy 材料; 不是这个。

任何人都可以指出我可以使用的 E-easy(ish) 实现吗? 谢谢 :)

@ofekd isEnabled可能是一个不错的选择,因为enabledisable已经实现了!

@jdm我会接受的

@ofekd isEnabled 作为新贡献者可能会很棘手,因为您需要跨模块更改内容。 webgl-specific.html一些测试用例,如混合函数或模板函数,应该是非常好的起点。 invalid-passed-params.html可能也有很好的简单任务。

@anholt只要它不是很复杂,我不介意再做一些工作。 我还没有开始研究这个,但对于初学者来说,我似乎需要改变:

webrender_traits/src/webgl.rs
servo/components/script/dom/webglrenderingcontext.rs
servo/components/script/dom/webidls/WebGLRenderingContext.webidl

除非它以某种方式阻碍其他努力,否则我将继续致力于isEnabled

我将致力于实施 validateProgram 和 getProgramInfoLog

我将在 uniformMatrix2fv、uniformMatrix3fv、uniformMatrix4fv 和 framebufferRenderbuffer、framebufferTexture2D、renderbufferStorage 工作。

我将运行要求更高的 webgl 演示并测量伺服上的性能,我需要这些功能;)

@MortimerGoro我一直致力于 FBO 支持(请参阅最近的一些合并和 https://github.com/anholt/servo/tree/webgl-fbo)。 我还为uniformmatrix 整理了https://github.com/anholt/servo/tree/webgl-uniform-matrix-v ,但测试需要调试。

@anholt太棒了! 你需要关于uniformmatrix测试的任何帮助吗?

@MortimerGoro只是想弄清楚不可靠的结果是怎么回事。

我已经打开 #13639 来跟踪 FBO 支持。 想要将它添加到 framebufferRenderbuffer/framebufferTexture2D 吗?

@shravan-achar 可能有兴趣在这里处理其余的工作。

看起来 WebGL 的错误toDataURL()是导致大量剩余测试用例问题的原因(例如asin_001_to_006.html

现在只有 5 个缺少的 API。

我、@taki-jaro、@ mrowqa@xanewok将作为学生项目解决这个问题
抄送@KiChjang

我打算尝试 glGetTexParameter。

处理getFramebufferAttachmentParameter()

我想做getRenderbufferParameter

由于某种原因,这个问题似乎不再保留编辑记录。

编辑:它现在看起来正在工作。

我添加了一堆问题。

此页面是否有帮助?
0 / 5 - 0 等级