From ddd6c86e992a45d6490b8ec6eb2bf7b3ecce9a03 Mon Sep 17 00:00:00 2001 From: Imanol Fernandez Date: Thu, 26 Oct 2017 18:04:13 +0200 Subject: Kick off WebGL 2.0 implementation --- components/script/dom/webgl2renderingcontext.rs | 914 ++++++++++++++++++++++++ 1 file changed, 914 insertions(+) create mode 100644 components/script/dom/webgl2renderingcontext.rs (limited to 'components/script/dom/webgl2renderingcontext.rs') diff --git a/components/script/dom/webgl2renderingcontext.rs b/components/script/dom/webgl2renderingcontext.rs new file mode 100644 index 00000000000..6f2cd362845 --- /dev/null +++ b/components/script/dom/webgl2renderingcontext.rs @@ -0,0 +1,914 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +/// https://www.khronos.org/registry/webgl/specs/latest/2.0/webgl.idl +use canvas_traits::webgl::WebGLVersion; +use dom::bindings::codegen::Bindings::WebGL2RenderingContextBinding; +use dom::bindings::codegen::Bindings::WebGL2RenderingContextBinding::WebGL2RenderingContextMethods; +use dom::bindings::codegen::Bindings::WebGLRenderingContextBinding::WebGLContextAttributes; +use dom::bindings::codegen::Bindings::WebGLRenderingContextBinding::WebGLRenderingContextMethods; +use dom::bindings::codegen::UnionTypes::ImageDataOrHTMLImageElementOrHTMLCanvasElementOrHTMLVideoElement; +use dom::bindings::error::Fallible; +use dom::bindings::nonnull::NonNullJSObjectPtr; +use dom::bindings::reflector::{reflect_dom_object, Reflector}; +use dom::bindings::root::{Dom, DomRoot, LayoutDom}; +use dom::bindings::str::DOMString; +use dom::htmlcanvaselement::HTMLCanvasElement; +use dom::htmliframeelement::HTMLIFrameElement; +use dom::webglactiveinfo::WebGLActiveInfo; +use dom::webglbuffer::WebGLBuffer; +use dom::webglframebuffer::WebGLFramebuffer; +use dom::webglprogram::WebGLProgram; +use dom::webglrenderbuffer::WebGLRenderbuffer; +use dom::webglrenderingcontext::{LayoutCanvasWebGLRenderingContextHelpers, WebGLRenderingContext}; +use dom::webglshader::WebGLShader; +use dom::webglshaderprecisionformat::WebGLShaderPrecisionFormat; +use dom::webgltexture::WebGLTexture; +use dom::webgluniformlocation::WebGLUniformLocation; +use dom::window::Window; +use dom_struct::dom_struct; +use euclid::Size2D; +use js::jsapi::{JSContext, JSObject}; +use js::jsval::JSVal; +use offscreen_gl_context::GLContextAttributes; +use script_layout_interface::HTMLCanvasDataSource; + +#[dom_struct] +pub struct WebGL2RenderingContext { + reflector_: Reflector, + base: Dom, +} + +impl WebGL2RenderingContext { + fn new_inherited( + window: &Window, + canvas: &HTMLCanvasElement, + size: Size2D, + attrs: GLContextAttributes + ) -> Option { + let base = WebGLRenderingContext::new(window, canvas, WebGLVersion::WebGL2, size, attrs)?; + Some(WebGL2RenderingContext { + reflector_: Reflector::new(), + base: Dom::from_ref(&*base), + }) + } + + #[allow(unrooted_must_root)] + pub fn new( + window: &Window, + canvas: &HTMLCanvasElement, + size: Size2D, + attrs: GLContextAttributes + ) -> Option> { + WebGL2RenderingContext::new_inherited(window, canvas, size, attrs).map(|ctx| { + reflect_dom_object(Box::new(ctx), window, WebGL2RenderingContextBinding::Wrap) + }) + } +} + +impl WebGL2RenderingContext { + pub fn recreate(&self, size: Size2D) { + self.base.recreate(size) + } + + pub fn base_context(&self) -> DomRoot { + DomRoot::from_ref(&*self.base) + } +} + +impl WebGL2RenderingContextMethods for WebGL2RenderingContext { + /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.1 + fn Canvas(&self) -> DomRoot { + self.base.Canvas() + } + + /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.11 + fn Flush(&self) { + self.base.Flush() + } + + /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.11 + fn Finish(&self) { + self.base.Finish() + } + + /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.1 + fn DrawingBufferWidth(&self) -> i32 { + self.base.DrawingBufferWidth() + } + + /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.1 + fn DrawingBufferHeight(&self) -> i32 { + self.base.DrawingBufferHeight() + } + + #[allow(unsafe_code)] + /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.5 + unsafe fn GetBufferParameter(&self, _cx: *mut JSContext, target: u32, parameter: u32) -> JSVal { + self.base.GetBufferParameter(_cx, target, parameter) + } + + #[allow(unsafe_code)] + /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.3 + unsafe fn GetParameter(&self, cx: *mut JSContext, parameter: u32) -> JSVal { + self.base.GetParameter(cx, parameter) + } + + /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.3 + fn GetError(&self) -> u32 { + self.base.GetError() + } + + /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.2 + fn GetContextAttributes(&self) -> Option { + self.base.GetContextAttributes() + } + + /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.14 + fn GetSupportedExtensions(&self) -> Option> { + self.base.GetSupportedExtensions() + } + + #[allow(unsafe_code)] + /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.14 + unsafe fn GetExtension(&self, cx: *mut JSContext, name: DOMString) -> Option { + self.base.GetExtension(cx, name) + } + + /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.3 + fn ActiveTexture(&self, texture: u32) { + self.base.ActiveTexture(texture) + } + + /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.3 + fn BlendColor(&self, r: f32, g: f32, b: f32, a: f32) { + self.base.BlendColor(r, g, b, a) + } + + /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.3 + fn BlendEquation(&self, mode: u32) { + self.base.BlendEquation(mode) + } + + /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.3 + fn BlendEquationSeparate(&self, mode_rgb: u32, mode_alpha: u32) { + self.base.BlendEquationSeparate(mode_rgb, mode_alpha) + } + + /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.3 + fn BlendFunc(&self, src_factor: u32, dest_factor: u32) { + self.base.BlendFunc(src_factor, dest_factor) + } + + /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.3 + fn BlendFuncSeparate(&self, src_rgb: u32, dest_rgb: u32, src_alpha: u32, dest_alpha: u32) { + self.base.BlendFuncSeparate(src_rgb, dest_rgb, src_alpha, dest_alpha) + } + + /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.9 + fn AttachShader(&self, program: Option<&WebGLProgram>, shader: Option<&WebGLShader>) { + self.base.AttachShader(program, shader) + } + + /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.9 + fn DetachShader(&self, program: Option<&WebGLProgram>, shader: Option<&WebGLShader>) { + self.base.DetachShader(program, shader) + } + + /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.9 + fn BindAttribLocation(&self, program: Option<&WebGLProgram>, + index: u32, name: DOMString) { + self.base.BindAttribLocation(program, index, name) + } + + /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.5 + fn BindBuffer(&self, target: u32, buffer: Option<&WebGLBuffer>) { + self.base.BindBuffer(target, buffer) + } + + /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.6 + fn BindFramebuffer(&self, target: u32, framebuffer: Option<&WebGLFramebuffer>) { + self.base.BindFramebuffer(target, framebuffer) + } + + /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.7 + fn BindRenderbuffer(&self, target: u32, renderbuffer: Option<&WebGLRenderbuffer>) { + self.base.BindRenderbuffer(target, renderbuffer) + } + + /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.8 + fn BindTexture(&self, target: u32, texture: Option<&WebGLTexture>) { + self.base.BindTexture(target, texture) + } + + /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.8 + fn GenerateMipmap(&self, target: u32) { + self.base.GenerateMipmap(target) + } + + #[allow(unsafe_code)] + /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.5 + unsafe fn BufferData(&self, cx: *mut JSContext, target: u32, data: *mut JSObject, usage: u32) -> Fallible<()> { + self.base.BufferData(cx, target, data, usage) + } + + /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.5 + fn BufferData_(&self, target: u32, size: i64, usage: u32) -> Fallible<()> { + self.base.BufferData_(target, size, usage) + } + + #[allow(unsafe_code)] + /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.5 + unsafe fn BufferSubData(&self, cx: *mut JSContext, target: u32, offset: i64, data: *mut JSObject) -> Fallible<()> { + self.base.BufferSubData(cx, target, offset, data) + } + + #[allow(unsafe_code)] + /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.8 + unsafe fn CompressedTexImage2D(&self, cx: *mut JSContext, target: u32, level: i32, internal_format: u32, + width: i32, height: i32, border: i32, pixels: *mut JSObject) -> Fallible<()> { + self.base.CompressedTexImage2D(cx, target, level, internal_format, width, height, border, pixels) + } + + #[allow(unsafe_code)] + /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.8 + unsafe fn CompressedTexSubImage2D(&self, cx: *mut JSContext, target: u32, level: i32, + xoffset: i32, yoffset: i32, width: i32, height: i32, + format: u32, pixels: *mut JSObject) -> Fallible<()> { + self.base.CompressedTexSubImage2D(cx, target, level, xoffset, yoffset, width, height, format, pixels) + } + + /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.8 + fn CopyTexImage2D(&self, target: u32, level: i32, internal_format: u32, + x: i32, y: i32, width: i32, height: i32, border: i32) { + self.base.CopyTexImage2D(target, level, internal_format, x, y, width, height, border) + } + + /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.8 + fn CopyTexSubImage2D(&self, target: u32, level: i32, xoffset: i32, yoffset: i32, + x: i32, y: i32, width: i32, height: i32) { + self.base.CopyTexSubImage2D(target, level, xoffset, yoffset, x, y, width, height) + } + + /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.11 + fn Clear(&self, mask: u32) { + self.base.Clear(mask) + } + + /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.3 + fn ClearColor(&self, red: f32, green: f32, blue: f32, alpha: f32) { + self.base.ClearColor(red, green, blue, alpha) + } + + /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.3 + fn ClearDepth(&self, depth: f32) { + self.base.ClearDepth(depth) + } + + /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.3 + fn ClearStencil(&self, stencil: i32) { + self.base.ClearStencil(stencil) + } + + /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.3 + fn ColorMask(&self, r: bool, g: bool, b: bool, a: bool) { + self.base.ColorMask(r, g, b, a) + } + + /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.3 + fn CullFace(&self, mode: u32) { + self.base.CullFace(mode) + } + + /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.3 + fn FrontFace(&self, mode: u32) { + self.base.FrontFace(mode) + } + /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.3 + fn DepthFunc(&self, func: u32) { + self.base.DepthFunc(func) + } + + /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.3 + fn DepthMask(&self, flag: bool) { + self.base.DepthMask(flag) + } + + /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.3 + fn DepthRange(&self, near: f32, far: f32) { + self.base.DepthRange(near, far) + } + + /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.3 + fn Enable(&self, cap: u32) { + self.base.Enable(cap) + } + + /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.3 + fn Disable(&self, cap: u32) { + self.base.Disable(cap) + } + + /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.9 + fn CompileShader(&self, shader: Option<&WebGLShader>) { + self.base.CompileShader(shader) + } + + /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.5 + fn CreateBuffer(&self) -> Option> { + self.base.CreateBuffer() + } + + /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.6 + fn CreateFramebuffer(&self) -> Option> { + self.base.CreateFramebuffer() + } + + /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.7 + fn CreateRenderbuffer(&self) -> Option> { + self.base.CreateRenderbuffer() + } + + /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.8 + fn CreateTexture(&self) -> Option> { + self.base.CreateTexture() + } + + /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.9 + fn CreateProgram(&self) -> Option> { + self.base.CreateProgram() + } + + /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.9 + fn CreateShader(&self, shader_type: u32) -> Option> { + self.base.CreateShader(shader_type) + } + + /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.5 + fn DeleteBuffer(&self, buffer: Option<&WebGLBuffer>) { + self.base.DeleteBuffer(buffer) + } + + /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.6 + fn DeleteFramebuffer(&self, framebuffer: Option<&WebGLFramebuffer>) { + self.base.DeleteFramebuffer(framebuffer) + } + + /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.7 + fn DeleteRenderbuffer(&self, renderbuffer: Option<&WebGLRenderbuffer>) { + self.base.DeleteRenderbuffer(renderbuffer) + } + + /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.8 + fn DeleteTexture(&self, texture: Option<&WebGLTexture>) { + self.base.DeleteTexture(texture) + } + + /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.9 + fn DeleteProgram(&self, program: Option<&WebGLProgram>) { + self.base.DeleteProgram(program) + } + + /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.9 + fn DeleteShader(&self, shader: Option<&WebGLShader>) { + self.base.DeleteShader(shader) + } + + /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.11 + fn DrawArrays(&self, mode: u32, first: i32, count: i32) { + self.base.DrawArrays(mode, first, count) + } + + /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.11 + fn DrawElements(&self, mode: u32, count: i32, type_: u32, offset: i64) { + self.base.DrawElements(mode, count, type_, offset) + } + + /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.10 + fn EnableVertexAttribArray(&self, attrib_id: u32) { + self.base.EnableVertexAttribArray(attrib_id) + } + + /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.10 + fn DisableVertexAttribArray(&self, attrib_id: u32) { + self.base.DisableVertexAttribArray(attrib_id) + } + + /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.10 + fn GetActiveUniform(&self, program: Option<&WebGLProgram>, index: u32) -> Option> { + self.base.GetActiveUniform(program, index) + } + + /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.10 + fn GetActiveAttrib(&self, program: Option<&WebGLProgram>, index: u32) -> Option> { + self.base.GetActiveAttrib(program, index) + } + + /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.10 + fn GetAttribLocation(&self, program: Option<&WebGLProgram>, name: DOMString) -> i32 { + self.base.GetAttribLocation(program, name) + } + + /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.9 + fn GetProgramInfoLog(&self, program: Option<&WebGLProgram>) -> Option { + self.base.GetProgramInfoLog(program) + } + + #[allow(unsafe_code)] + /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.9 + unsafe fn GetProgramParameter(&self, cx: *mut JSContext, program: Option<&WebGLProgram>, param_id: u32) -> JSVal { + self.base.GetProgramParameter(cx, program, param_id) + } + + /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.9 + fn GetShaderInfoLog(&self, shader: Option<&WebGLShader>) -> Option { + self.base.GetShaderInfoLog(shader) + } + + #[allow(unsafe_code)] + /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.9 + unsafe fn GetShaderParameter(&self, cx: *mut JSContext, shader: Option<&WebGLShader>, param_id: u32) -> JSVal { + self.base.GetShaderParameter(cx, shader, param_id) + } + + /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.9 + fn GetShaderPrecisionFormat(&self, + shader_type: u32, + precision_type: u32) + -> Option> { + self.base.GetShaderPrecisionFormat(shader_type, precision_type) + } + + /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.10 + fn GetUniformLocation(&self, + program: Option<&WebGLProgram>, + name: DOMString) -> Option> { + self.base.GetUniformLocation(program, name) + } + + #[allow(unsafe_code)] + /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.9 + unsafe fn GetVertexAttrib(&self, cx: *mut JSContext, index: u32, pname: u32) -> JSVal { + self.base.GetVertexAttrib(cx, index, pname) + } + + /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.10 + fn GetVertexAttribOffset(&self, index: u32, pname: u32) -> i64 { + self.base.GetVertexAttribOffset(index, pname) + } + + /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.3 + fn Hint(&self, target: u32, mode: u32) { + self.base.Hint(target, mode) + } + + /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.5 + fn IsBuffer(&self, buffer: Option<&WebGLBuffer>) -> bool { + self.base.IsBuffer(buffer) + } + + // TODO: We could write this without IPC, recording the calls to `enable` and `disable`. + /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.3 + fn IsEnabled(&self, cap: u32) -> bool { + self.base.IsEnabled(cap) + } + + /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.6 + fn IsFramebuffer(&self, frame_buffer: Option<&WebGLFramebuffer>) -> bool { + self.base.IsFramebuffer(frame_buffer) + } + + /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.9 + fn IsProgram(&self, program: Option<&WebGLProgram>) -> bool { + self.base.IsProgram(program) + } + + /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.7 + fn IsRenderbuffer(&self, render_buffer: Option<&WebGLRenderbuffer>) -> bool { + self.base.IsRenderbuffer(render_buffer) + } + + /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.9 + fn IsShader(&self, shader: Option<&WebGLShader>) -> bool { + self.base.IsShader(shader) + } + + /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.8 + fn IsTexture(&self, texture: Option<&WebGLTexture>) -> bool { + self.base.IsTexture(texture) + } + + /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.3 + fn LineWidth(&self, width: f32) { + self.base.LineWidth(width) + } + + /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.3 + fn PixelStorei(&self, param_name: u32, param_value: i32) { + self.base.PixelStorei(param_name, param_value) + } + + /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.3 + fn PolygonOffset(&self, factor: f32, units: f32) { + self.base.PolygonOffset(factor, units) + } + + #[allow(unsafe_code)] + /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.12 + unsafe fn ReadPixels(&self, cx: *mut JSContext, x: i32, y: i32, width: i32, height: i32, + format: u32, pixel_type: u32, pixels: *mut JSObject) -> Fallible<()> { + self.base.ReadPixels(cx, x, y, width, height, format, pixel_type, pixels) + } + + /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.3 + fn SampleCoverage(&self, value: f32, invert: bool) { + self.base.SampleCoverage(value, invert) + } + + /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.4 + fn Scissor(&self, x: i32, y: i32, width: i32, height: i32) { + self.base.Scissor(x, y, width, height) + } + + /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.3 + fn StencilFunc(&self, func: u32, ref_: i32, mask: u32) { + self.base.StencilFunc(func, ref_, mask) + } + + /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.3 + fn StencilFuncSeparate(&self, face: u32, func: u32, ref_: i32, mask: u32) { + self.base.StencilFuncSeparate(face, func, ref_, mask) + } + + /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.3 + fn StencilMask(&self, mask: u32) { + self.base.StencilMask(mask) + } + + /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.3 + fn StencilMaskSeparate(&self, face: u32, mask: u32) { + self.base.StencilMaskSeparate(face, mask) + } + + /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.3 + fn StencilOp(&self, fail: u32, zfail: u32, zpass: u32) { + self.base.StencilOp(fail, zfail, zpass) + } + + /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.3 + fn StencilOpSeparate(&self, face: u32, fail: u32, zfail: u32, zpass: u32) { + self.base.StencilOpSeparate(face, fail, zfail, zpass) + } + + /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.9 + fn LinkProgram(&self, program: Option<&WebGLProgram>) { + self.base.LinkProgram(program) + } + + /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.9 + fn ShaderSource(&self, shader: Option<&WebGLShader>, source: DOMString) { + self.base.ShaderSource(shader, source) + } + + /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.9 + fn GetShaderSource(&self, shader: Option<&WebGLShader>) -> Option { + self.base.GetShaderSource(shader) + } + + /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.10 + fn Uniform1f(&self, + uniform: Option<&WebGLUniformLocation>, + val: f32) { + self.base.Uniform1f(uniform, val) + } + + /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.10 + fn Uniform1i(&self, + uniform: Option<&WebGLUniformLocation>, + val: i32) { + self.base.Uniform1i(uniform, val) + } + + /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.10 + #[allow(unsafe_code)] + unsafe fn Uniform1iv(&self, + cx: *mut JSContext, + uniform: Option<&WebGLUniformLocation>, + data: *mut JSObject) -> Fallible<()> { + self.base.Uniform1iv(cx, uniform, data) + } + + /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.10 + #[allow(unsafe_code)] + unsafe fn Uniform1fv(&self, + cx: *mut JSContext, + uniform: Option<&WebGLUniformLocation>, + data: *mut JSObject) -> Fallible<()> { + self.base.Uniform1fv(cx, uniform, data) + } + + /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.10 + fn Uniform2f(&self, + uniform: Option<&WebGLUniformLocation>, + x: f32, y: f32) { + self.base.Uniform2f(uniform, x, y) + } + + /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.10 + #[allow(unsafe_code)] + unsafe fn Uniform2fv(&self, + cx: *mut JSContext, + uniform: Option<&WebGLUniformLocation>, + data: *mut JSObject) -> Fallible<()> { + self.base.Uniform2fv(cx, uniform, data) + } + + /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.10 + fn Uniform2i(&self, + uniform: Option<&WebGLUniformLocation>, + x: i32, y: i32) { + self.base.Uniform2i(uniform, x, y) + } + + /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.10 + #[allow(unsafe_code)] + unsafe fn Uniform2iv(&self, + cx: *mut JSContext, + uniform: Option<&WebGLUniformLocation>, + data: *mut JSObject) -> Fallible<()> { + self.base.Uniform2iv(cx, uniform, data) + } + + /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.10 + fn Uniform3f(&self, + uniform: Option<&WebGLUniformLocation>, + x: f32, y: f32, z: f32) { + self.base.Uniform3f(uniform, x, y, z) + } + + /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.10 + #[allow(unsafe_code)] + unsafe fn Uniform3fv(&self, + cx: *mut JSContext, + uniform: Option<&WebGLUniformLocation>, + data: *mut JSObject) -> Fallible<()> { + self.base.Uniform3fv(cx, uniform, data) + } + + /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.10 + fn Uniform3i(&self, + uniform: Option<&WebGLUniformLocation>, + x: i32, y: i32, z: i32) { + self.base.Uniform3i(uniform, x, y, z) + } + + /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.10 + #[allow(unsafe_code)] + unsafe fn Uniform3iv(&self, + cx: *mut JSContext, + uniform: Option<&WebGLUniformLocation>, + data: *mut JSObject) -> Fallible<()> { + self.base.Uniform3iv(cx, uniform, data) + } + + /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.10 + fn Uniform4i(&self, + uniform: Option<&WebGLUniformLocation>, + x: i32, y: i32, z: i32, w: i32) { + self.base.Uniform4i(uniform, x, y, z, w) + } + + + /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.10 + #[allow(unsafe_code)] + unsafe fn Uniform4iv(&self, + cx: *mut JSContext, + uniform: Option<&WebGLUniformLocation>, + data: *mut JSObject) -> Fallible<()> { + self.base.Uniform4iv(cx, uniform, data) + } + + /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.10 + fn Uniform4f(&self, + uniform: Option<&WebGLUniformLocation>, + x: f32, y: f32, z: f32, w: f32) { + self.base.Uniform4f(uniform, x, y, z, w) + } + + /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.10 + #[allow(unsafe_code)] + unsafe fn Uniform4fv(&self, + cx: *mut JSContext, + uniform: Option<&WebGLUniformLocation>, + data: *mut JSObject) -> Fallible<()> { + self.base.Uniform4fv(cx, uniform, data) + } + + /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.10 + #[allow(unsafe_code)] + unsafe fn UniformMatrix2fv(&self, + cx: *mut JSContext, + uniform: Option<&WebGLUniformLocation>, + transpose: bool, + data: *mut JSObject) -> Fallible<()> { + self.base.UniformMatrix2fv(cx, uniform, transpose, data) + } + + /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.10 + #[allow(unsafe_code)] + unsafe fn UniformMatrix3fv(&self, + cx: *mut JSContext, + uniform: Option<&WebGLUniformLocation>, + transpose: bool, + data: *mut JSObject) -> Fallible<()> { + self.base.UniformMatrix3fv(cx, uniform, transpose, data) + } + + /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.10 + #[allow(unsafe_code)] + unsafe fn UniformMatrix4fv(&self, + cx: *mut JSContext, + uniform: Option<&WebGLUniformLocation>, + transpose: bool, + data: *mut JSObject) -> Fallible<()> { + self.base.UniformMatrix4fv(cx, uniform, transpose, data) + } + + /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.9 + fn UseProgram(&self, program: Option<&WebGLProgram>) { + self.base.UseProgram(program) + } + + /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.9 + fn ValidateProgram(&self, program: Option<&WebGLProgram>) { + self.base.ValidateProgram(program) + } + + /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.10 + fn VertexAttrib1f(&self, indx: u32, x: f32) { + self.base.VertexAttrib1f(indx, x) + } + + /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.10 + #[allow(unsafe_code)] + unsafe fn VertexAttrib1fv(&self, cx: *mut JSContext, indx: u32, data: *mut JSObject) -> Fallible<()> { + self.base.VertexAttrib1fv(cx, indx, data) + } + + /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.10 + fn VertexAttrib2f(&self, indx: u32, x: f32, y: f32) { + self.base.VertexAttrib2f(indx, x, y) + } + + /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.10 + #[allow(unsafe_code)] + unsafe fn VertexAttrib2fv(&self, cx: *mut JSContext, indx: u32, data: *mut JSObject) -> Fallible<()> { + self.base.VertexAttrib2fv(cx, indx, data) + } + + /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.10 + fn VertexAttrib3f(&self, indx: u32, x: f32, y: f32, z: f32) { + self.base.VertexAttrib3f(indx, x, y, z) + } + + /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.10 + #[allow(unsafe_code)] + unsafe fn VertexAttrib3fv(&self, cx: *mut JSContext, indx: u32, data: *mut JSObject) -> Fallible<()> { + self.base.VertexAttrib3fv(cx, indx, data) + } + + /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.10 + fn VertexAttrib4f(&self, indx: u32, x: f32, y: f32, z: f32, w: f32) { + self.base.VertexAttrib4f(indx, x, y, z, w) + } + + /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.10 + #[allow(unsafe_code)] + unsafe fn VertexAttrib4fv(&self, cx: *mut JSContext, indx: u32, data: *mut JSObject) -> Fallible<()> { + self.base.VertexAttrib4fv(cx, indx, data) + } + + /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.10 + fn VertexAttribPointer(&self, attrib_id: u32, size: i32, data_type: u32, + normalized: bool, stride: i32, offset: i64) { + self.base.VertexAttribPointer(attrib_id, size, data_type, normalized, stride, offset) + } + + /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.4 + fn Viewport(&self, x: i32, y: i32, width: i32, height: i32) { + self.base.Viewport(x, y, width, height) + } + + /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.8 + #[allow(unsafe_code)] + unsafe fn TexImage2D(&self, + cx: *mut JSContext, + target: u32, + level: i32, + internal_format: u32, + width: i32, + height: i32, + border: i32, + format: u32, + data_type: u32, + data_ptr: *mut JSObject) -> Fallible<()> { + self.base.TexImage2D(cx, target, level, internal_format, width, height, border, format, data_type, data_ptr) + } + + /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.8 + fn TexImage2D_(&self, + target: u32, + level: i32, + internal_format: u32, + format: u32, + data_type: u32, + source: Option) -> Fallible<()> { + self.base.TexImage2D_(target, level, internal_format, format, data_type, source) + } + + /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.8 + fn TexImageDOM(&self, + target: u32, + level: i32, + internal_format: u32, + width: i32, + height: i32, + format: u32, + data_type: u32, + source: &HTMLIFrameElement) -> Fallible<()> { + self.base.TexImageDOM(target, level, internal_format, width, height, format, data_type, source) + } + + /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.8 + #[allow(unsafe_code)] + unsafe fn TexSubImage2D(&self, + cx: *mut JSContext, + target: u32, + level: i32, + xoffset: i32, + yoffset: i32, + width: i32, + height: i32, + format: u32, + data_type: u32, + data_ptr: *mut JSObject) -> Fallible<()> { + self.base.TexSubImage2D(cx, target, level, xoffset, yoffset, width, height, format, data_type, data_ptr) + } + + /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.8 + fn TexSubImage2D_(&self, + target: u32, + level: i32, + xoffset: i32, + yoffset: i32, + format: u32, + data_type: u32, + source: Option) + -> Fallible<()> { + self.base.TexSubImage2D_(target, level, xoffset, yoffset, format, data_type, source) + } + + /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.8 + fn TexParameterf(&self, target: u32, name: u32, value: f32) { + self.base.TexParameterf(target, name, value) + } + + /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.8 + fn TexParameteri(&self, target: u32, name: u32, value: i32) { + self.base.TexParameteri(target, name, value) + } + + /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.6 + fn CheckFramebufferStatus(&self, target: u32) -> u32 { + self.base.CheckFramebufferStatus(target) + } + + /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.7 + fn RenderbufferStorage(&self, target: u32, internal_format: u32, + width: i32, height: i32) { + self.base.RenderbufferStorage(target, internal_format, width, height) + } + + /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.6 + fn FramebufferRenderbuffer(&self, target: u32, attachment: u32, + renderbuffertarget: u32, + rb: Option<&WebGLRenderbuffer>) { + self.base.FramebufferRenderbuffer(target, attachment, renderbuffertarget, rb) + } + + /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.6 + fn FramebufferTexture2D(&self, target: u32, attachment: u32, + textarget: u32, texture: Option<&WebGLTexture>, + level: i32) { + self.base.FramebufferTexture2D(target, attachment, textarget, texture, level) + } +} + + +impl LayoutCanvasWebGLRenderingContextHelpers for LayoutDom { + #[allow(unsafe_code)] + unsafe fn canvas_data_source(&self) -> HTMLCanvasDataSource { + HTMLCanvasDataSource::WebGL((*self.unsafe_get()).base.layout_handle()) + } +} -- cgit v1.2.3 From ec1f61d9cc6328f1a7036a20d9e2dbd6cbd9bf42 Mon Sep 17 00:00:00 2001 From: Imanol Fernandez Date: Thu, 2 Nov 2017 15:06:46 +0100 Subject: Add configuration for webgl2 tests and update test expectations --- components/script/dom/webgl2renderingcontext.rs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'components/script/dom/webgl2renderingcontext.rs') diff --git a/components/script/dom/webgl2renderingcontext.rs b/components/script/dom/webgl2renderingcontext.rs index 6f2cd362845..168f1146370 100644 --- a/components/script/dom/webgl2renderingcontext.rs +++ b/components/script/dom/webgl2renderingcontext.rs @@ -909,6 +909,7 @@ impl WebGL2RenderingContextMethods for WebGL2RenderingContext { impl LayoutCanvasWebGLRenderingContextHelpers for LayoutDom { #[allow(unsafe_code)] unsafe fn canvas_data_source(&self) -> HTMLCanvasDataSource { - HTMLCanvasDataSource::WebGL((*self.unsafe_get()).base.layout_handle()) + let this = &*self.unsafe_get(); + HTMLCanvasDataSource::WebGL((*this.base.to_layout().unsafe_get()).layout_handle()) } } -- cgit v1.2.3 From 52eda6082fd32d3e28f3600858afd8f5bbc918fe Mon Sep 17 00:00:00 2001 From: Simon Sapin Date: Mon, 22 Jan 2018 12:42:05 +0100 Subject: Replace NonNullJSObjectPtr with std::ptr::NonNull --- components/script/dom/webgl2renderingcontext.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'components/script/dom/webgl2renderingcontext.rs') diff --git a/components/script/dom/webgl2renderingcontext.rs b/components/script/dom/webgl2renderingcontext.rs index 168f1146370..9bf016f9631 100644 --- a/components/script/dom/webgl2renderingcontext.rs +++ b/components/script/dom/webgl2renderingcontext.rs @@ -10,7 +10,6 @@ use dom::bindings::codegen::Bindings::WebGLRenderingContextBinding::WebGLContext use dom::bindings::codegen::Bindings::WebGLRenderingContextBinding::WebGLRenderingContextMethods; use dom::bindings::codegen::UnionTypes::ImageDataOrHTMLImageElementOrHTMLCanvasElementOrHTMLVideoElement; use dom::bindings::error::Fallible; -use dom::bindings::nonnull::NonNullJSObjectPtr; use dom::bindings::reflector::{reflect_dom_object, Reflector}; use dom::bindings::root::{Dom, DomRoot, LayoutDom}; use dom::bindings::str::DOMString; @@ -33,6 +32,7 @@ use js::jsapi::{JSContext, JSObject}; use js::jsval::JSVal; use offscreen_gl_context::GLContextAttributes; use script_layout_interface::HTMLCanvasDataSource; +use std::ptr::NonNull; #[dom_struct] pub struct WebGL2RenderingContext { @@ -132,7 +132,7 @@ impl WebGL2RenderingContextMethods for WebGL2RenderingContext { #[allow(unsafe_code)] /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.14 - unsafe fn GetExtension(&self, cx: *mut JSContext, name: DOMString) -> Option { + unsafe fn GetExtension(&self, cx: *mut JSContext, name: DOMString) -> Option> { self.base.GetExtension(cx, name) } -- cgit v1.2.3 From 288ef50fb79aaab771b93e4e06d077656500ebb9 Mon Sep 17 00:00:00 2001 From: Martina Kollarova Date: Wed, 28 Feb 2018 16:03:48 +0200 Subject: Add WebGL function glGetTexParameter Set the expected result of the test `tex-input-validation.html` to CRASH, since that is caused by unrelated problems. The test was previously not executing completely, because it stopped when it didn't find the implementation of getTexParameter. --- components/script/dom/webgl2renderingcontext.rs | 6 ++++++ 1 file changed, 6 insertions(+) (limited to 'components/script/dom/webgl2renderingcontext.rs') diff --git a/components/script/dom/webgl2renderingcontext.rs b/components/script/dom/webgl2renderingcontext.rs index 9bf016f9631..2a25c450b08 100644 --- a/components/script/dom/webgl2renderingcontext.rs +++ b/components/script/dom/webgl2renderingcontext.rs @@ -115,6 +115,12 @@ impl WebGL2RenderingContextMethods for WebGL2RenderingContext { self.base.GetParameter(cx, parameter) } + #[allow(unsafe_code)] + /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.8 + unsafe fn GetTexParameter(&self, cx: *mut JSContext, target: u32, pname: u32) -> JSVal { + self.base.GetTexParameter(cx, target, pname) + } + /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.3 fn GetError(&self) -> u32 { self.base.GetError() -- cgit v1.2.3 From ee5bdbbd8b99b58eda19c117b1a06e4a90a61bb1 Mon Sep 17 00:00:00 2001 From: Igor Gutorov Date: Wed, 14 Mar 2018 20:41:36 +0200 Subject: Implement WebGL getFramebufferAttachmentParameter API --- components/script/dom/webgl2renderingcontext.rs | 12 ++++++++++++ 1 file changed, 12 insertions(+) (limited to 'components/script/dom/webgl2renderingcontext.rs') diff --git a/components/script/dom/webgl2renderingcontext.rs b/components/script/dom/webgl2renderingcontext.rs index 2a25c450b08..2d1186c0dcc 100644 --- a/components/script/dom/webgl2renderingcontext.rs +++ b/components/script/dom/webgl2renderingcontext.rs @@ -142,6 +142,18 @@ impl WebGL2RenderingContextMethods for WebGL2RenderingContext { self.base.GetExtension(cx, name) } + #[allow(unsafe_code)] + /// https://www.khronos.org/registry/webgl/specs/latest/2.0/#3.7.4 + unsafe fn GetFramebufferAttachmentParameter( + &self, + cx: *mut JSContext, + target: u32, + attachment: u32, + pname: u32 + ) -> JSVal { + self.base.GetFramebufferAttachmentParameter(cx, target, attachment, pname) + } + /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.3 fn ActiveTexture(&self, texture: u32) { self.base.ActiveTexture(texture) -- cgit v1.2.3 From f532e79dc18564efe14b9c362107fa1685ee6a0e Mon Sep 17 00:00:00 2001 From: Anthony Ramine Date: Wed, 21 Mar 2018 12:23:42 +0100 Subject: Make some WebGL parameters non-optional (fixes #8753) Those parameters aren't optional in the current spec. The test element-array-buffer-delete-recreate.html now fails because we don't actually implement gl.getParameter(gl.CURRENT_PROGRAM). --- components/script/dom/webgl2renderingcontext.rs | 67 +++++++++++++------------ 1 file changed, 36 insertions(+), 31 deletions(-) (limited to 'components/script/dom/webgl2renderingcontext.rs') diff --git a/components/script/dom/webgl2renderingcontext.rs b/components/script/dom/webgl2renderingcontext.rs index 2d1186c0dcc..21d917d4992 100644 --- a/components/script/dom/webgl2renderingcontext.rs +++ b/components/script/dom/webgl2renderingcontext.rs @@ -9,7 +9,7 @@ use dom::bindings::codegen::Bindings::WebGL2RenderingContextBinding::WebGL2Rende use dom::bindings::codegen::Bindings::WebGLRenderingContextBinding::WebGLContextAttributes; use dom::bindings::codegen::Bindings::WebGLRenderingContextBinding::WebGLRenderingContextMethods; use dom::bindings::codegen::UnionTypes::ImageDataOrHTMLImageElementOrHTMLCanvasElementOrHTMLVideoElement; -use dom::bindings::error::Fallible; +use dom::bindings::error::{ErrorResult, Fallible}; use dom::bindings::reflector::{reflect_dom_object, Reflector}; use dom::bindings::root::{Dom, DomRoot, LayoutDom}; use dom::bindings::str::DOMString; @@ -329,7 +329,7 @@ impl WebGL2RenderingContextMethods for WebGL2RenderingContext { } /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.9 - fn CompileShader(&self, shader: Option<&WebGLShader>) { + fn CompileShader(&self, shader: &WebGLShader) { self.base.CompileShader(shader) } @@ -414,39 +414,39 @@ impl WebGL2RenderingContextMethods for WebGL2RenderingContext { } /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.10 - fn GetActiveUniform(&self, program: Option<&WebGLProgram>, index: u32) -> Option> { + fn GetActiveUniform(&self, program: &WebGLProgram, index: u32) -> Option> { self.base.GetActiveUniform(program, index) } /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.10 - fn GetActiveAttrib(&self, program: Option<&WebGLProgram>, index: u32) -> Option> { + fn GetActiveAttrib(&self, program: &WebGLProgram, index: u32) -> Option> { self.base.GetActiveAttrib(program, index) } /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.10 - fn GetAttribLocation(&self, program: Option<&WebGLProgram>, name: DOMString) -> i32 { + fn GetAttribLocation(&self, program: &WebGLProgram, name: DOMString) -> i32 { self.base.GetAttribLocation(program, name) } /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.9 - fn GetProgramInfoLog(&self, program: Option<&WebGLProgram>) -> Option { + fn GetProgramInfoLog(&self, program: &WebGLProgram) -> Option { self.base.GetProgramInfoLog(program) } #[allow(unsafe_code)] /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.9 - unsafe fn GetProgramParameter(&self, cx: *mut JSContext, program: Option<&WebGLProgram>, param_id: u32) -> JSVal { + unsafe fn GetProgramParameter(&self, cx: *mut JSContext, program: &WebGLProgram, param_id: u32) -> JSVal { self.base.GetProgramParameter(cx, program, param_id) } /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.9 - fn GetShaderInfoLog(&self, shader: Option<&WebGLShader>) -> Option { + fn GetShaderInfoLog(&self, shader: &WebGLShader) -> Option { self.base.GetShaderInfoLog(shader) } #[allow(unsafe_code)] /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.9 - unsafe fn GetShaderParameter(&self, cx: *mut JSContext, shader: Option<&WebGLShader>, param_id: u32) -> JSVal { + unsafe fn GetShaderParameter(&self, cx: *mut JSContext, shader: &WebGLShader, param_id: u32) -> JSVal { self.base.GetShaderParameter(cx, shader, param_id) } @@ -459,9 +459,11 @@ impl WebGL2RenderingContextMethods for WebGL2RenderingContext { } /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.10 - fn GetUniformLocation(&self, - program: Option<&WebGLProgram>, - name: DOMString) -> Option> { + fn GetUniformLocation( + &self, + program: &WebGLProgram, + name: DOMString, + ) -> Option> { self.base.GetUniformLocation(program, name) } @@ -585,12 +587,12 @@ impl WebGL2RenderingContextMethods for WebGL2RenderingContext { } /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.9 - fn ShaderSource(&self, shader: Option<&WebGLShader>, source: DOMString) { + fn ShaderSource(&self, shader: &WebGLShader, source: DOMString) { self.base.ShaderSource(shader, source) } /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.9 - fn GetShaderSource(&self, shader: Option<&WebGLShader>) -> Option { + fn GetShaderSource(&self, shader: &WebGLShader) -> Option { self.base.GetShaderSource(shader) } @@ -759,7 +761,7 @@ impl WebGL2RenderingContextMethods for WebGL2RenderingContext { } /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.9 - fn ValidateProgram(&self, program: Option<&WebGLProgram>) { + fn ValidateProgram(&self, program: &WebGLProgram) { self.base.ValidateProgram(program) } @@ -835,13 +837,15 @@ impl WebGL2RenderingContextMethods for WebGL2RenderingContext { } /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.8 - fn TexImage2D_(&self, - target: u32, - level: i32, - internal_format: u32, - format: u32, - data_type: u32, - source: Option) -> Fallible<()> { + fn TexImage2D_( + &self, + target: u32, + level: i32, + internal_format: u32, + format: u32, + data_type: u32, + source: ImageDataOrHTMLImageElementOrHTMLCanvasElementOrHTMLVideoElement, + ) -> ErrorResult { self.base.TexImage2D_(target, level, internal_format, format, data_type, source) } @@ -875,15 +879,16 @@ impl WebGL2RenderingContextMethods for WebGL2RenderingContext { } /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.8 - fn TexSubImage2D_(&self, - target: u32, - level: i32, - xoffset: i32, - yoffset: i32, - format: u32, - data_type: u32, - source: Option) - -> Fallible<()> { + fn TexSubImage2D_( + &self, + target: u32, + level: i32, + xoffset: i32, + yoffset: i32, + format: u32, + data_type: u32, + source: ImageDataOrHTMLImageElementOrHTMLCanvasElementOrHTMLVideoElement, + ) -> ErrorResult { self.base.TexSubImage2D_(target, level, xoffset, yoffset, format, data_type, source) } -- cgit v1.2.3 From 8061d8c3d291c27754f321997d30282563d1a228 Mon Sep 17 00:00:00 2001 From: Anthony Ramine Date: Fri, 23 Mar 2018 01:23:39 +0100 Subject: Fix some more WebGL methods --- components/script/dom/webgl2renderingcontext.rs | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) (limited to 'components/script/dom/webgl2renderingcontext.rs') diff --git a/components/script/dom/webgl2renderingcontext.rs b/components/script/dom/webgl2renderingcontext.rs index 21d917d4992..71ec9388d87 100644 --- a/components/script/dom/webgl2renderingcontext.rs +++ b/components/script/dom/webgl2renderingcontext.rs @@ -185,18 +185,17 @@ impl WebGL2RenderingContextMethods for WebGL2RenderingContext { } /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.9 - fn AttachShader(&self, program: Option<&WebGLProgram>, shader: Option<&WebGLShader>) { + fn AttachShader(&self, program: &WebGLProgram, shader: &WebGLShader) { self.base.AttachShader(program, shader) } /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.9 - fn DetachShader(&self, program: Option<&WebGLProgram>, shader: Option<&WebGLShader>) { + fn DetachShader(&self, program: &WebGLProgram, shader: &WebGLShader) { self.base.DetachShader(program, shader) } /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.9 - fn BindAttribLocation(&self, program: Option<&WebGLProgram>, - index: u32, name: DOMString) { + fn BindAttribLocation(&self, program: &WebGLProgram, index: u32, name: DOMString) { self.base.BindAttribLocation(program, index, name) } -- cgit v1.2.3 From 36f39ce27afc83abc21295ee61d2a0485a2071ab Mon Sep 17 00:00:00 2001 From: Igor Matuszewski Date: Thu, 22 Mar 2018 15:13:27 +0100 Subject: Change WebGL function signatures accepting typed arrays --- components/script/dom/webgl2renderingcontext.rs | 80 ++++++++++++------------- 1 file changed, 38 insertions(+), 42 deletions(-) (limited to 'components/script/dom/webgl2renderingcontext.rs') diff --git a/components/script/dom/webgl2renderingcontext.rs b/components/script/dom/webgl2renderingcontext.rs index 71ec9388d87..698be5fb25b 100644 --- a/components/script/dom/webgl2renderingcontext.rs +++ b/components/script/dom/webgl2renderingcontext.rs @@ -9,6 +9,7 @@ use dom::bindings::codegen::Bindings::WebGL2RenderingContextBinding::WebGL2Rende use dom::bindings::codegen::Bindings::WebGLRenderingContextBinding::WebGLContextAttributes; use dom::bindings::codegen::Bindings::WebGLRenderingContextBinding::WebGLRenderingContextMethods; use dom::bindings::codegen::UnionTypes::ImageDataOrHTMLImageElementOrHTMLCanvasElementOrHTMLVideoElement; +use dom::bindings::codegen::UnionTypes::ArrayBufferOrArrayBufferView; use dom::bindings::error::{ErrorResult, Fallible}; use dom::bindings::reflector::{reflect_dom_object, Reflector}; use dom::bindings::root::{Dom, DomRoot, LayoutDom}; @@ -30,6 +31,8 @@ use dom_struct::dom_struct; use euclid::Size2D; use js::jsapi::{JSContext, JSObject}; use js::jsval::JSVal; +use js::rust::CustomAutoRooterGuard; +use js::typedarray::ArrayBufferView; use offscreen_gl_context::GLContextAttributes; use script_layout_interface::HTMLCanvasDataSource; use std::ptr::NonNull; @@ -235,25 +238,23 @@ impl WebGL2RenderingContextMethods for WebGL2RenderingContext { self.base.BufferData_(target, size, usage) } - #[allow(unsafe_code)] /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.5 - unsafe fn BufferSubData(&self, cx: *mut JSContext, target: u32, offset: i64, data: *mut JSObject) -> Fallible<()> { - self.base.BufferSubData(cx, target, offset, data) + fn BufferSubData(&self, target: u32, offset: i64, data: Option) { + self.base.BufferSubData(target, offset, data) } - #[allow(unsafe_code)] /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.8 - unsafe fn CompressedTexImage2D(&self, cx: *mut JSContext, target: u32, level: i32, internal_format: u32, - width: i32, height: i32, border: i32, pixels: *mut JSObject) -> Fallible<()> { - self.base.CompressedTexImage2D(cx, target, level, internal_format, width, height, border, pixels) + fn CompressedTexImage2D(&self, target: u32, level: i32, internal_format: u32, + width: i32, height: i32, border: i32, + pixels: CustomAutoRooterGuard) { + self.base.CompressedTexImage2D(target, level, internal_format, width, height, border, pixels) } - #[allow(unsafe_code)] /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.8 - unsafe fn CompressedTexSubImage2D(&self, cx: *mut JSContext, target: u32, level: i32, - xoffset: i32, yoffset: i32, width: i32, height: i32, - format: u32, pixels: *mut JSObject) -> Fallible<()> { - self.base.CompressedTexSubImage2D(cx, target, level, xoffset, yoffset, width, height, format, pixels) + fn CompressedTexSubImage2D(&self, target: u32, level: i32, xoffset: i32, + yoffset: i32, width: i32, height: i32, format: u32, + pixels: CustomAutoRooterGuard) { + self.base.CompressedTexSubImage2D(target, level, xoffset, yoffset, width, height, format, pixels) } /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.8 @@ -533,11 +534,10 @@ impl WebGL2RenderingContextMethods for WebGL2RenderingContext { self.base.PolygonOffset(factor, units) } - #[allow(unsafe_code)] /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.12 - unsafe fn ReadPixels(&self, cx: *mut JSContext, x: i32, y: i32, width: i32, height: i32, - format: u32, pixel_type: u32, pixels: *mut JSObject) -> Fallible<()> { - self.base.ReadPixels(cx, x, y, width, height, format, pixel_type, pixels) + fn ReadPixels(&self, x: i32, y: i32, width: i32, height: i32, format: u32, pixel_type: u32, + pixels: CustomAutoRooterGuard>) { + self.base.ReadPixels(x, y, width, height, format, pixel_type, pixels) } /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.3 @@ -820,19 +820,17 @@ impl WebGL2RenderingContextMethods for WebGL2RenderingContext { } /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.8 - #[allow(unsafe_code)] - unsafe fn TexImage2D(&self, - cx: *mut JSContext, - target: u32, - level: i32, - internal_format: u32, - width: i32, - height: i32, - border: i32, - format: u32, - data_type: u32, - data_ptr: *mut JSObject) -> Fallible<()> { - self.base.TexImage2D(cx, target, level, internal_format, width, height, border, format, data_type, data_ptr) + fn TexImage2D(&self, + target: u32, + level: i32, + internal_format: u32, + width: i32, + height: i32, + border: i32, + format: u32, + data_type: u32, + pixels: CustomAutoRooterGuard>) -> Fallible<()> { + self.base.TexImage2D(target, level, internal_format, width, height, border, format, data_type, pixels) } /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.8 @@ -862,19 +860,17 @@ impl WebGL2RenderingContextMethods for WebGL2RenderingContext { } /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.8 - #[allow(unsafe_code)] - unsafe fn TexSubImage2D(&self, - cx: *mut JSContext, - target: u32, - level: i32, - xoffset: i32, - yoffset: i32, - width: i32, - height: i32, - format: u32, - data_type: u32, - data_ptr: *mut JSObject) -> Fallible<()> { - self.base.TexSubImage2D(cx, target, level, xoffset, yoffset, width, height, format, data_type, data_ptr) + fn TexSubImage2D(&self, + target: u32, + level: i32, + xoffset: i32, + yoffset: i32, + width: i32, + height: i32, + format: u32, + data_type: u32, + pixels: CustomAutoRooterGuard>) -> Fallible<()> { + self.base.TexSubImage2D(target, level, xoffset, yoffset, width, height, format, data_type, pixels) } /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.8 -- cgit v1.2.3 From 20f21cb5f85c48e7106177db6aa41fa54365d6cc Mon Sep 17 00:00:00 2001 From: Igor Matuszewski Date: Thu, 22 Mar 2018 20:38:26 +0100 Subject: Adapt uniform[fv] and similar to accept typed array args --- components/script/dom/webgl2renderingcontext.rs | 242 ++++++++++++++---------- 1 file changed, 147 insertions(+), 95 deletions(-) (limited to 'components/script/dom/webgl2renderingcontext.rs') diff --git a/components/script/dom/webgl2renderingcontext.rs b/components/script/dom/webgl2renderingcontext.rs index 698be5fb25b..e0ae2e22585 100644 --- a/components/script/dom/webgl2renderingcontext.rs +++ b/components/script/dom/webgl2renderingcontext.rs @@ -32,7 +32,7 @@ use euclid::Size2D; use js::jsapi::{JSContext, JSObject}; use js::jsval::JSVal; use js::rust::CustomAutoRooterGuard; -use js::typedarray::ArrayBufferView; +use js::typedarray::{ArrayBufferView, Float32Array, Int32Array}; use offscreen_gl_context::GLContextAttributes; use script_layout_interface::HTMLCanvasDataSource; use std::ptr::NonNull; @@ -597,161 +597,197 @@ impl WebGL2RenderingContextMethods for WebGL2RenderingContext { /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.10 fn Uniform1f(&self, - uniform: Option<&WebGLUniformLocation>, + location: Option<&WebGLUniformLocation>, val: f32) { - self.base.Uniform1f(uniform, val) + self.base.Uniform1f(location, val) } /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.10 fn Uniform1i(&self, - uniform: Option<&WebGLUniformLocation>, + location: Option<&WebGLUniformLocation>, val: i32) { - self.base.Uniform1i(uniform, val) + self.base.Uniform1i(location, val) } /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.10 - #[allow(unsafe_code)] - unsafe fn Uniform1iv(&self, - cx: *mut JSContext, - uniform: Option<&WebGLUniformLocation>, - data: *mut JSObject) -> Fallible<()> { - self.base.Uniform1iv(cx, uniform, data) + fn Uniform1iv(&self, + location: Option<&WebGLUniformLocation>, + v: CustomAutoRooterGuard) { + self.base.Uniform1iv(location, v) + } + + fn Uniform1iv_(&self, location: Option<&WebGLUniformLocation>, v: Vec) { + self.base.Uniform1iv_(location, v); } /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.10 - #[allow(unsafe_code)] - unsafe fn Uniform1fv(&self, - cx: *mut JSContext, - uniform: Option<&WebGLUniformLocation>, - data: *mut JSObject) -> Fallible<()> { - self.base.Uniform1fv(cx, uniform, data) + fn Uniform1fv(&self, + location: Option<&WebGLUniformLocation>, + v: CustomAutoRooterGuard) { + self.base.Uniform1fv(location, v); + } + + // https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.10 + fn Uniform1fv_(&self, location: Option<&WebGLUniformLocation>, v: Vec) { + self.base.Uniform1fv_(location, v); } /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.10 fn Uniform2f(&self, - uniform: Option<&WebGLUniformLocation>, + location: Option<&WebGLUniformLocation>, x: f32, y: f32) { - self.base.Uniform2f(uniform, x, y) + self.base.Uniform2f(location, x, y) } /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.10 - #[allow(unsafe_code)] - unsafe fn Uniform2fv(&self, - cx: *mut JSContext, - uniform: Option<&WebGLUniformLocation>, - data: *mut JSObject) -> Fallible<()> { - self.base.Uniform2fv(cx, uniform, data) + fn Uniform2fv(&self, + location: Option<&WebGLUniformLocation>, + v: CustomAutoRooterGuard) { + self.base.Uniform2fv(location, v) + } + + // https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.10 + fn Uniform2fv_(&self, location: Option<&WebGLUniformLocation>, v: Vec) { + self.base.Uniform2fv_(location, v); } /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.10 fn Uniform2i(&self, - uniform: Option<&WebGLUniformLocation>, + location: Option<&WebGLUniformLocation>, x: i32, y: i32) { - self.base.Uniform2i(uniform, x, y) + self.base.Uniform2i(location, x, y) } /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.10 - #[allow(unsafe_code)] - unsafe fn Uniform2iv(&self, - cx: *mut JSContext, - uniform: Option<&WebGLUniformLocation>, - data: *mut JSObject) -> Fallible<()> { - self.base.Uniform2iv(cx, uniform, data) + fn Uniform2iv(&self, + location: Option<&WebGLUniformLocation>, + v: CustomAutoRooterGuard) { + self.base.Uniform2iv(location, v) + } + + /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.10 + fn Uniform2iv_(&self, location: Option<&WebGLUniformLocation>, v: Vec) { + self.base.Uniform2iv_(location, v); } /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.10 fn Uniform3f(&self, - uniform: Option<&WebGLUniformLocation>, + location: Option<&WebGLUniformLocation>, x: f32, y: f32, z: f32) { - self.base.Uniform3f(uniform, x, y, z) + self.base.Uniform3f(location, x, y, z) } /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.10 - #[allow(unsafe_code)] - unsafe fn Uniform3fv(&self, - cx: *mut JSContext, - uniform: Option<&WebGLUniformLocation>, - data: *mut JSObject) -> Fallible<()> { - self.base.Uniform3fv(cx, uniform, data) + fn Uniform3fv(&self, + location: Option<&WebGLUniformLocation>, + v: CustomAutoRooterGuard) { + self.base.Uniform3fv(location, v) + } + + // https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.10 + fn Uniform3fv_(&self, location: Option<&WebGLUniformLocation>, v: Vec) { + self.base.Uniform3fv_(location, v); } /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.10 fn Uniform3i(&self, - uniform: Option<&WebGLUniformLocation>, + location: Option<&WebGLUniformLocation>, x: i32, y: i32, z: i32) { - self.base.Uniform3i(uniform, x, y, z) + self.base.Uniform3i(location, x, y, z) } /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.10 - #[allow(unsafe_code)] - unsafe fn Uniform3iv(&self, - cx: *mut JSContext, - uniform: Option<&WebGLUniformLocation>, - data: *mut JSObject) -> Fallible<()> { - self.base.Uniform3iv(cx, uniform, data) + fn Uniform3iv(&self, + location: Option<&WebGLUniformLocation>, + v: CustomAutoRooterGuard) { + self.base.Uniform3iv(location, v) + } + + /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.10 + fn Uniform3iv_(&self, + location: Option<&WebGLUniformLocation>, + v: Vec) { + self.base.Uniform3iv_(location, v) } /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.10 fn Uniform4i(&self, - uniform: Option<&WebGLUniformLocation>, + location: Option<&WebGLUniformLocation>, x: i32, y: i32, z: i32, w: i32) { - self.base.Uniform4i(uniform, x, y, z, w) + self.base.Uniform4i(location, x, y, z, w) } /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.10 - #[allow(unsafe_code)] - unsafe fn Uniform4iv(&self, - cx: *mut JSContext, - uniform: Option<&WebGLUniformLocation>, - data: *mut JSObject) -> Fallible<()> { - self.base.Uniform4iv(cx, uniform, data) + fn Uniform4iv(&self, + location: Option<&WebGLUniformLocation>, + v: CustomAutoRooterGuard) { + self.base.Uniform4iv(location, v) + } + + /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.10 + fn Uniform4iv_(&self, + location: Option<&WebGLUniformLocation>, + v: Vec) { + self.base.Uniform4iv_(location, v) } /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.10 fn Uniform4f(&self, - uniform: Option<&WebGLUniformLocation>, + location: Option<&WebGLUniformLocation>, x: f32, y: f32, z: f32, w: f32) { - self.base.Uniform4f(uniform, x, y, z, w) + self.base.Uniform4f(location, x, y, z, w) } /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.10 - #[allow(unsafe_code)] - unsafe fn Uniform4fv(&self, - cx: *mut JSContext, - uniform: Option<&WebGLUniformLocation>, - data: *mut JSObject) -> Fallible<()> { - self.base.Uniform4fv(cx, uniform, data) + fn Uniform4fv(&self, + location: Option<&WebGLUniformLocation>, + v: CustomAutoRooterGuard) { + self.base.Uniform4fv(location, v) + } + + // https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.10 + fn Uniform4fv_(&self, location: Option<&WebGLUniformLocation>, v: Vec) { + self.base.Uniform4fv_(location, v); } /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.10 - #[allow(unsafe_code)] - unsafe fn UniformMatrix2fv(&self, - cx: *mut JSContext, - uniform: Option<&WebGLUniformLocation>, + fn UniformMatrix2fv(&self, + location: Option<&WebGLUniformLocation>, transpose: bool, - data: *mut JSObject) -> Fallible<()> { - self.base.UniformMatrix2fv(cx, uniform, transpose, data) + v: CustomAutoRooterGuard) { + self.base.UniformMatrix2fv(location, transpose, v) } /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.10 - #[allow(unsafe_code)] - unsafe fn UniformMatrix3fv(&self, - cx: *mut JSContext, - uniform: Option<&WebGLUniformLocation>, + fn UniformMatrix2fv_(&self, location: Option<&WebGLUniformLocation>, transpose: bool, value: Vec) { + self.base.UniformMatrix2fv_(location, transpose, value); + } + + /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.10 + fn UniformMatrix3fv(&self, + location: Option<&WebGLUniformLocation>, transpose: bool, - data: *mut JSObject) -> Fallible<()> { - self.base.UniformMatrix3fv(cx, uniform, transpose, data) + v: CustomAutoRooterGuard) { + self.base.UniformMatrix3fv(location, transpose, v) } /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.10 - #[allow(unsafe_code)] - unsafe fn UniformMatrix4fv(&self, - cx: *mut JSContext, - uniform: Option<&WebGLUniformLocation>, + fn UniformMatrix3fv_(&self, location: Option<&WebGLUniformLocation>, transpose: bool, value: Vec) { + self.base.UniformMatrix3fv_(location, transpose, value); + } + + /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.10 + fn UniformMatrix4fv(&self, + location: Option<&WebGLUniformLocation>, transpose: bool, - data: *mut JSObject) -> Fallible<()> { - self.base.UniformMatrix4fv(cx, uniform, transpose, data) + v: CustomAutoRooterGuard) { + self.base.UniformMatrix4fv(location, transpose, v) + } + + /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.10 + fn UniformMatrix4fv_(&self, location: Option<&WebGLUniformLocation>, transpose: bool, value: Vec) { + self.base.UniformMatrix4fv_(location, transpose, value); } /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.9 @@ -770,9 +806,13 @@ impl WebGL2RenderingContextMethods for WebGL2RenderingContext { } /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.10 - #[allow(unsafe_code)] - unsafe fn VertexAttrib1fv(&self, cx: *mut JSContext, indx: u32, data: *mut JSObject) -> Fallible<()> { - self.base.VertexAttrib1fv(cx, indx, data) + fn VertexAttrib1fv(&self, indx: u32, v: CustomAutoRooterGuard) { + self.base.VertexAttrib1fv(indx, v) + } + + /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.10 + fn VertexAttrib1fv_(&self, indx: u32, v: Vec) { + self.base.VertexAttrib1fv_(indx, v) } /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.10 @@ -781,9 +821,13 @@ impl WebGL2RenderingContextMethods for WebGL2RenderingContext { } /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.10 - #[allow(unsafe_code)] - unsafe fn VertexAttrib2fv(&self, cx: *mut JSContext, indx: u32, data: *mut JSObject) -> Fallible<()> { - self.base.VertexAttrib2fv(cx, indx, data) + fn VertexAttrib2fv(&self, indx: u32, v: CustomAutoRooterGuard) { + self.base.VertexAttrib2fv(indx, v) + } + + /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.10 + fn VertexAttrib2fv_(&self, indx: u32, v: Vec) { + self.base.VertexAttrib2fv_(indx, v) } /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.10 @@ -792,9 +836,13 @@ impl WebGL2RenderingContextMethods for WebGL2RenderingContext { } /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.10 - #[allow(unsafe_code)] - unsafe fn VertexAttrib3fv(&self, cx: *mut JSContext, indx: u32, data: *mut JSObject) -> Fallible<()> { - self.base.VertexAttrib3fv(cx, indx, data) + fn VertexAttrib3fv(&self, indx: u32, v: CustomAutoRooterGuard) { + self.base.VertexAttrib3fv(indx, v) + } + + /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.10 + fn VertexAttrib3fv_(&self, indx: u32, v: Vec) { + self.base.VertexAttrib3fv_(indx, v) } /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.10 @@ -803,9 +851,13 @@ impl WebGL2RenderingContextMethods for WebGL2RenderingContext { } /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.10 - #[allow(unsafe_code)] - unsafe fn VertexAttrib4fv(&self, cx: *mut JSContext, indx: u32, data: *mut JSObject) -> Fallible<()> { - self.base.VertexAttrib4fv(cx, indx, data) + fn VertexAttrib4fv(&self, indx: u32, v: CustomAutoRooterGuard) { + self.base.VertexAttrib4fv(indx, v) + } + + /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.10 + fn VertexAttrib4fv_(&self, indx: u32, v: Vec) { + self.base.VertexAttrib4fv_(indx, v) } /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.10 -- cgit v1.2.3 From daceeb400294ce157b2901f0d2effd63b9aabf27 Mon Sep 17 00:00:00 2001 From: Igor Matuszewski Date: Fri, 23 Mar 2018 02:01:51 +0100 Subject: Appease test-tidy --- components/script/dom/webgl2renderingcontext.rs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'components/script/dom/webgl2renderingcontext.rs') diff --git a/components/script/dom/webgl2renderingcontext.rs b/components/script/dom/webgl2renderingcontext.rs index e0ae2e22585..dd0701ace99 100644 --- a/components/script/dom/webgl2renderingcontext.rs +++ b/components/script/dom/webgl2renderingcontext.rs @@ -8,8 +8,8 @@ use dom::bindings::codegen::Bindings::WebGL2RenderingContextBinding; use dom::bindings::codegen::Bindings::WebGL2RenderingContextBinding::WebGL2RenderingContextMethods; use dom::bindings::codegen::Bindings::WebGLRenderingContextBinding::WebGLContextAttributes; use dom::bindings::codegen::Bindings::WebGLRenderingContextBinding::WebGLRenderingContextMethods; -use dom::bindings::codegen::UnionTypes::ImageDataOrHTMLImageElementOrHTMLCanvasElementOrHTMLVideoElement; use dom::bindings::codegen::UnionTypes::ArrayBufferOrArrayBufferView; +use dom::bindings::codegen::UnionTypes::ImageDataOrHTMLImageElementOrHTMLCanvasElementOrHTMLVideoElement; use dom::bindings::error::{ErrorResult, Fallible}; use dom::bindings::reflector::{reflect_dom_object, Reflector}; use dom::bindings::root::{Dom, DomRoot, LayoutDom}; @@ -616,6 +616,7 @@ impl WebGL2RenderingContextMethods for WebGL2RenderingContext { self.base.Uniform1iv(location, v) } + /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.10 fn Uniform1iv_(&self, location: Option<&WebGLUniformLocation>, v: Vec) { self.base.Uniform1iv_(location, v); } -- cgit v1.2.3 From a62bed82e40220d0272b31fff542c30ea70e9ff7 Mon Sep 17 00:00:00 2001 From: Anthony Ramine Date: Sat, 24 Mar 2018 13:06:00 +0100 Subject: Implement WebGLRenderingContextBase.getAttachedShaders --- components/script/dom/webgl2renderingcontext.rs | 8 ++++++++ 1 file changed, 8 insertions(+) (limited to 'components/script/dom/webgl2renderingcontext.rs') diff --git a/components/script/dom/webgl2renderingcontext.rs b/components/script/dom/webgl2renderingcontext.rs index dd0701ace99..9e05797c188 100644 --- a/components/script/dom/webgl2renderingcontext.rs +++ b/components/script/dom/webgl2renderingcontext.rs @@ -974,6 +974,14 @@ impl WebGL2RenderingContextMethods for WebGL2RenderingContext { level: i32) { self.base.FramebufferTexture2D(target, attachment, textarget, texture, level) } + + /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.9 + fn GetAttachedShaders( + &self, + program: &WebGLProgram, + ) -> Option>> { + self.base.GetAttachedShaders(program) + } } -- cgit v1.2.3 From 088ebcb095cef24d85a4f5d1d7c525b198333fbf Mon Sep 17 00:00:00 2001 From: Anthony Ramine Date: Tue, 3 Apr 2018 11:09:14 +0200 Subject: Remove obsolete BufferDataSource --- components/script/dom/webgl2renderingcontext.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'components/script/dom/webgl2renderingcontext.rs') diff --git a/components/script/dom/webgl2renderingcontext.rs b/components/script/dom/webgl2renderingcontext.rs index 9e05797c188..bce11fba2a5 100644 --- a/components/script/dom/webgl2renderingcontext.rs +++ b/components/script/dom/webgl2renderingcontext.rs @@ -8,7 +8,7 @@ use dom::bindings::codegen::Bindings::WebGL2RenderingContextBinding; use dom::bindings::codegen::Bindings::WebGL2RenderingContextBinding::WebGL2RenderingContextMethods; use dom::bindings::codegen::Bindings::WebGLRenderingContextBinding::WebGLContextAttributes; use dom::bindings::codegen::Bindings::WebGLRenderingContextBinding::WebGLRenderingContextMethods; -use dom::bindings::codegen::UnionTypes::ArrayBufferOrArrayBufferView; +use dom::bindings::codegen::UnionTypes::ArrayBufferViewOrArrayBuffer; use dom::bindings::codegen::UnionTypes::ImageDataOrHTMLImageElementOrHTMLCanvasElementOrHTMLVideoElement; use dom::bindings::error::{ErrorResult, Fallible}; use dom::bindings::reflector::{reflect_dom_object, Reflector}; @@ -239,7 +239,7 @@ impl WebGL2RenderingContextMethods for WebGL2RenderingContext { } /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.5 - fn BufferSubData(&self, target: u32, offset: i64, data: Option) { + fn BufferSubData(&self, target: u32, offset: i64, data: Option) { self.base.BufferSubData(target, offset, data) } -- cgit v1.2.3 From 866a523914029089f3a4ce17ec70b88f1307ecd4 Mon Sep 17 00:00:00 2001 From: Anthony Ramine Date: Tue, 3 Apr 2018 12:22:32 +0200 Subject: Properly use Float32List and Int32List for WebGL uniform methods --- components/script/dom/webgl2renderingcontext.rs | 192 +++++++++--------------- 1 file changed, 68 insertions(+), 124 deletions(-) (limited to 'components/script/dom/webgl2renderingcontext.rs') diff --git a/components/script/dom/webgl2renderingcontext.rs b/components/script/dom/webgl2renderingcontext.rs index bce11fba2a5..1f6bc4f853a 100644 --- a/components/script/dom/webgl2renderingcontext.rs +++ b/components/script/dom/webgl2renderingcontext.rs @@ -9,7 +9,9 @@ use dom::bindings::codegen::Bindings::WebGL2RenderingContextBinding::WebGL2Rende use dom::bindings::codegen::Bindings::WebGLRenderingContextBinding::WebGLContextAttributes; use dom::bindings::codegen::Bindings::WebGLRenderingContextBinding::WebGLRenderingContextMethods; use dom::bindings::codegen::UnionTypes::ArrayBufferViewOrArrayBuffer; +use dom::bindings::codegen::UnionTypes::Float32ArrayOrUnrestrictedFloatSequence; use dom::bindings::codegen::UnionTypes::ImageDataOrHTMLImageElementOrHTMLCanvasElementOrHTMLVideoElement; +use dom::bindings::codegen::UnionTypes::Int32ArrayOrLongSequence; use dom::bindings::error::{ErrorResult, Fallible}; use dom::bindings::reflector::{reflect_dom_object, Reflector}; use dom::bindings::root::{Dom, DomRoot, LayoutDom}; @@ -32,7 +34,7 @@ use euclid::Size2D; use js::jsapi::{JSContext, JSObject}; use js::jsval::JSVal; use js::rust::CustomAutoRooterGuard; -use js::typedarray::{ArrayBufferView, Float32Array, Int32Array}; +use js::typedarray::ArrayBufferView; use offscreen_gl_context::GLContextAttributes; use script_layout_interface::HTMLCanvasDataSource; use std::ptr::NonNull; @@ -610,29 +612,23 @@ impl WebGL2RenderingContextMethods for WebGL2RenderingContext { } /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.10 - fn Uniform1iv(&self, - location: Option<&WebGLUniformLocation>, - v: CustomAutoRooterGuard) { + fn Uniform1iv( + &self, + location: Option<&WebGLUniformLocation>, + v: Int32ArrayOrLongSequence, + ) { self.base.Uniform1iv(location, v) } /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.10 - fn Uniform1iv_(&self, location: Option<&WebGLUniformLocation>, v: Vec) { - self.base.Uniform1iv_(location, v); - } - - /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.10 - fn Uniform1fv(&self, - location: Option<&WebGLUniformLocation>, - v: CustomAutoRooterGuard) { + fn Uniform1fv( + &self, + location: Option<&WebGLUniformLocation>, + v: Float32ArrayOrUnrestrictedFloatSequence, + ) { self.base.Uniform1fv(location, v); } - // https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.10 - fn Uniform1fv_(&self, location: Option<&WebGLUniformLocation>, v: Vec) { - self.base.Uniform1fv_(location, v); - } - /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.10 fn Uniform2f(&self, location: Option<&WebGLUniformLocation>, @@ -641,15 +637,12 @@ impl WebGL2RenderingContextMethods for WebGL2RenderingContext { } /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.10 - fn Uniform2fv(&self, - location: Option<&WebGLUniformLocation>, - v: CustomAutoRooterGuard) { - self.base.Uniform2fv(location, v) - } - - // https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.10 - fn Uniform2fv_(&self, location: Option<&WebGLUniformLocation>, v: Vec) { - self.base.Uniform2fv_(location, v); + fn Uniform2fv( + &self, + location: Option<&WebGLUniformLocation>, + v: Float32ArrayOrUnrestrictedFloatSequence, + ) { + self.base.Uniform2fv(location, v); } /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.10 @@ -660,17 +653,14 @@ impl WebGL2RenderingContextMethods for WebGL2RenderingContext { } /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.10 - fn Uniform2iv(&self, - location: Option<&WebGLUniformLocation>, - v: CustomAutoRooterGuard) { + fn Uniform2iv( + &self, + location: Option<&WebGLUniformLocation>, + v: Int32ArrayOrLongSequence, + ) { self.base.Uniform2iv(location, v) } - /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.10 - fn Uniform2iv_(&self, location: Option<&WebGLUniformLocation>, v: Vec) { - self.base.Uniform2iv_(location, v); - } - /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.10 fn Uniform3f(&self, location: Option<&WebGLUniformLocation>, @@ -679,15 +669,12 @@ impl WebGL2RenderingContextMethods for WebGL2RenderingContext { } /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.10 - fn Uniform3fv(&self, - location: Option<&WebGLUniformLocation>, - v: CustomAutoRooterGuard) { - self.base.Uniform3fv(location, v) - } - - // https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.10 - fn Uniform3fv_(&self, location: Option<&WebGLUniformLocation>, v: Vec) { - self.base.Uniform3fv_(location, v); + fn Uniform3fv( + &self, + location: Option<&WebGLUniformLocation>, + v: Float32ArrayOrUnrestrictedFloatSequence, + ) { + self.base.Uniform3fv(location, v); } /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.10 @@ -698,19 +685,14 @@ impl WebGL2RenderingContextMethods for WebGL2RenderingContext { } /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.10 - fn Uniform3iv(&self, - location: Option<&WebGLUniformLocation>, - v: CustomAutoRooterGuard) { + fn Uniform3iv( + &self, + location: Option<&WebGLUniformLocation>, + v: Int32ArrayOrLongSequence, + ) { self.base.Uniform3iv(location, v) } - /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.10 - fn Uniform3iv_(&self, - location: Option<&WebGLUniformLocation>, - v: Vec) { - self.base.Uniform3iv_(location, v) - } - /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.10 fn Uniform4i(&self, location: Option<&WebGLUniformLocation>, @@ -718,21 +700,15 @@ impl WebGL2RenderingContextMethods for WebGL2RenderingContext { self.base.Uniform4i(location, x, y, z, w) } - /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.10 - fn Uniform4iv(&self, - location: Option<&WebGLUniformLocation>, - v: CustomAutoRooterGuard) { + fn Uniform4iv( + &self, + location: Option<&WebGLUniformLocation>, + v: Int32ArrayOrLongSequence, + ) { self.base.Uniform4iv(location, v) } - /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.10 - fn Uniform4iv_(&self, - location: Option<&WebGLUniformLocation>, - v: Vec) { - self.base.Uniform4iv_(location, v) - } - /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.10 fn Uniform4f(&self, location: Option<&WebGLUniformLocation>, @@ -741,56 +717,44 @@ impl WebGL2RenderingContextMethods for WebGL2RenderingContext { } /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.10 - fn Uniform4fv(&self, - location: Option<&WebGLUniformLocation>, - v: CustomAutoRooterGuard) { - self.base.Uniform4fv(location, v) - } - - // https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.10 - fn Uniform4fv_(&self, location: Option<&WebGLUniformLocation>, v: Vec) { - self.base.Uniform4fv_(location, v); + fn Uniform4fv( + &self, + location: Option<&WebGLUniformLocation>, + v: Float32ArrayOrUnrestrictedFloatSequence, + ) { + self.base.Uniform4fv(location, v); } /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.10 - fn UniformMatrix2fv(&self, - location: Option<&WebGLUniformLocation>, - transpose: bool, - v: CustomAutoRooterGuard) { + fn UniformMatrix2fv( + &self, + location: Option<&WebGLUniformLocation>, + transpose: bool, + v: Float32ArrayOrUnrestrictedFloatSequence, + ) { self.base.UniformMatrix2fv(location, transpose, v) } /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.10 - fn UniformMatrix2fv_(&self, location: Option<&WebGLUniformLocation>, transpose: bool, value: Vec) { - self.base.UniformMatrix2fv_(location, transpose, value); - } - - /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.10 - fn UniformMatrix3fv(&self, - location: Option<&WebGLUniformLocation>, - transpose: bool, - v: CustomAutoRooterGuard) { + fn UniformMatrix3fv( + &self, + location: Option<&WebGLUniformLocation>, + transpose: bool, + v: Float32ArrayOrUnrestrictedFloatSequence, + ) { self.base.UniformMatrix3fv(location, transpose, v) } /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.10 - fn UniformMatrix3fv_(&self, location: Option<&WebGLUniformLocation>, transpose: bool, value: Vec) { - self.base.UniformMatrix3fv_(location, transpose, value); - } - - /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.10 - fn UniformMatrix4fv(&self, - location: Option<&WebGLUniformLocation>, - transpose: bool, - v: CustomAutoRooterGuard) { + fn UniformMatrix4fv( + &self, + location: Option<&WebGLUniformLocation>, + transpose: bool, + v: Float32ArrayOrUnrestrictedFloatSequence, + ) { self.base.UniformMatrix4fv(location, transpose, v) } - /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.10 - fn UniformMatrix4fv_(&self, location: Option<&WebGLUniformLocation>, transpose: bool, value: Vec) { - self.base.UniformMatrix4fv_(location, transpose, value); - } - /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.9 fn UseProgram(&self, program: Option<&WebGLProgram>) { self.base.UseProgram(program) @@ -807,60 +771,40 @@ impl WebGL2RenderingContextMethods for WebGL2RenderingContext { } /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.10 - fn VertexAttrib1fv(&self, indx: u32, v: CustomAutoRooterGuard) { + fn VertexAttrib1fv(&self, indx: u32, v: Float32ArrayOrUnrestrictedFloatSequence) { self.base.VertexAttrib1fv(indx, v) } - /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.10 - fn VertexAttrib1fv_(&self, indx: u32, v: Vec) { - self.base.VertexAttrib1fv_(indx, v) - } - /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.10 fn VertexAttrib2f(&self, indx: u32, x: f32, y: f32) { self.base.VertexAttrib2f(indx, x, y) } /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.10 - fn VertexAttrib2fv(&self, indx: u32, v: CustomAutoRooterGuard) { + fn VertexAttrib2fv(&self, indx: u32, v: Float32ArrayOrUnrestrictedFloatSequence) { self.base.VertexAttrib2fv(indx, v) } - /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.10 - fn VertexAttrib2fv_(&self, indx: u32, v: Vec) { - self.base.VertexAttrib2fv_(indx, v) - } - /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.10 fn VertexAttrib3f(&self, indx: u32, x: f32, y: f32, z: f32) { self.base.VertexAttrib3f(indx, x, y, z) } /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.10 - fn VertexAttrib3fv(&self, indx: u32, v: CustomAutoRooterGuard) { + fn VertexAttrib3fv(&self, indx: u32, v: Float32ArrayOrUnrestrictedFloatSequence) { self.base.VertexAttrib3fv(indx, v) } - /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.10 - fn VertexAttrib3fv_(&self, indx: u32, v: Vec) { - self.base.VertexAttrib3fv_(indx, v) - } - /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.10 fn VertexAttrib4f(&self, indx: u32, x: f32, y: f32, z: f32, w: f32) { self.base.VertexAttrib4f(indx, x, y, z, w) } /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.10 - fn VertexAttrib4fv(&self, indx: u32, v: CustomAutoRooterGuard) { + fn VertexAttrib4fv(&self, indx: u32, v: Float32ArrayOrUnrestrictedFloatSequence) { self.base.VertexAttrib4fv(indx, v) } - /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.10 - fn VertexAttrib4fv_(&self, indx: u32, v: Vec) { - self.base.VertexAttrib4fv_(indx, v) - } - /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.10 fn VertexAttribPointer(&self, attrib_id: u32, size: i32, data_type: u32, normalized: bool, stride: i32, offset: i64) { -- cgit v1.2.3 From bb2b6a7a416b7678875ba39bfe9416234a6c1b90 Mon Sep 17 00:00:00 2001 From: Anthony Ramine Date: Wed, 4 Apr 2018 13:03:28 +0200 Subject: Fix the signature of WebGLRenderingContext::BufferSubData --- components/script/dom/webgl2renderingcontext.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'components/script/dom/webgl2renderingcontext.rs') diff --git a/components/script/dom/webgl2renderingcontext.rs b/components/script/dom/webgl2renderingcontext.rs index 1f6bc4f853a..81a1688c68b 100644 --- a/components/script/dom/webgl2renderingcontext.rs +++ b/components/script/dom/webgl2renderingcontext.rs @@ -241,7 +241,7 @@ impl WebGL2RenderingContextMethods for WebGL2RenderingContext { } /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.5 - fn BufferSubData(&self, target: u32, offset: i64, data: Option) { + fn BufferSubData(&self, target: u32, offset: i64, data: ArrayBufferViewOrArrayBuffer) { self.base.BufferSubData(target, offset, data) } -- cgit v1.2.3 From 58760d91d1830ce0bd75c22ebad42c4f9e332845 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fausto=20N=C3=BA=C3=B1ez=20Alberro?= Date: Thu, 12 Apr 2018 14:24:51 +0200 Subject: Implement WebGL GetRenderbufferParameter This needed a bump of gleam to version 0.4.33 --- components/script/dom/webgl2renderingcontext.rs | 11 +++++++++++ 1 file changed, 11 insertions(+) (limited to 'components/script/dom/webgl2renderingcontext.rs') diff --git a/components/script/dom/webgl2renderingcontext.rs b/components/script/dom/webgl2renderingcontext.rs index 81a1688c68b..cb5e17dfe26 100644 --- a/components/script/dom/webgl2renderingcontext.rs +++ b/components/script/dom/webgl2renderingcontext.rs @@ -159,6 +159,17 @@ impl WebGL2RenderingContextMethods for WebGL2RenderingContext { self.base.GetFramebufferAttachmentParameter(cx, target, attachment, pname) } + #[allow(unsafe_code)] + /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.7 + unsafe fn GetRenderbufferParameter( + &self, + cx: *mut JSContext, + target: u32, + pname: u32 + ) -> JSVal { + self.base.GetRenderbufferParameter(cx, target, pname) + } + /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.3 fn ActiveTexture(&self, texture: u32) { self.base.ActiveTexture(texture) -- cgit v1.2.3 From 0e2e834d185f7e3a7d3dfbb9e4c983f500ba3d64 Mon Sep 17 00:00:00 2001 From: Anthony Ramine Date: Mon, 25 Jun 2018 10:02:39 +0200 Subject: Fix gl.linkProgram() signature --- components/script/dom/webgl2renderingcontext.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'components/script/dom/webgl2renderingcontext.rs') diff --git a/components/script/dom/webgl2renderingcontext.rs b/components/script/dom/webgl2renderingcontext.rs index cb5e17dfe26..c06a07a9e3e 100644 --- a/components/script/dom/webgl2renderingcontext.rs +++ b/components/script/dom/webgl2renderingcontext.rs @@ -594,7 +594,7 @@ impl WebGL2RenderingContextMethods for WebGL2RenderingContext { } /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.9 - fn LinkProgram(&self, program: Option<&WebGLProgram>) { + fn LinkProgram(&self, program: &WebGLProgram) { self.base.LinkProgram(program) } -- cgit v1.2.3 From 4e6eea221a19b3e5a4b70f5954b3347bb6db02d1 Mon Sep 17 00:00:00 2001 From: Anthony Ramine Date: Tue, 20 Mar 2018 10:11:46 +0100 Subject: Implement instanced WebGL drawing calls (part of #20791) --- components/script/dom/webgl2renderingcontext.rs | 28 +++++++++++++++++++++++++ 1 file changed, 28 insertions(+) (limited to 'components/script/dom/webgl2renderingcontext.rs') diff --git a/components/script/dom/webgl2renderingcontext.rs b/components/script/dom/webgl2renderingcontext.rs index c06a07a9e3e..deb82e9ced2 100644 --- a/components/script/dom/webgl2renderingcontext.rs +++ b/components/script/dom/webgl2renderingcontext.rs @@ -937,6 +937,34 @@ impl WebGL2RenderingContextMethods for WebGL2RenderingContext { ) -> Option>> { self.base.GetAttachedShaders(program) } + + /// https://www.khronos.org/registry/webgl/specs/latest/2.0/#3.7.9 + fn DrawArraysInstanced( + &self, + mode: u32, + first: i32, + count: i32, + primcount: i32, + ) { + self.base.draw_arrays_instanced(mode, first, count, primcount); + } + + /// https://www.khronos.org/registry/webgl/specs/latest/2.0/#3.7.9 + fn DrawElementsInstanced( + &self, + mode: u32, + count: i32, + type_: u32, + offset: i64, + primcount: i32, + ) { + self.base.draw_elements_instanced(mode, count, type_, offset, primcount); + } + + /// https://www.khronos.org/registry/webgl/specs/latest/2.0/#3.7.9 + fn VertexAttribDivisor(&self, index: u32, divisor: u32) { + self.base.vertex_attrib_divisor(index, divisor); + } } -- cgit v1.2.3 From 3e8c2d659aa7c1a28971a6c15d16a57259e674a3 Mon Sep 17 00:00:00 2001 From: Anthony Ramine Date: Wed, 18 Jul 2018 18:22:15 +0200 Subject: Implement gl.getUniform() --- components/script/dom/webgl2renderingcontext.rs | 11 +++++++++++ 1 file changed, 11 insertions(+) (limited to 'components/script/dom/webgl2renderingcontext.rs') diff --git a/components/script/dom/webgl2renderingcontext.rs b/components/script/dom/webgl2renderingcontext.rs index deb82e9ced2..811fc100e6b 100644 --- a/components/script/dom/webgl2renderingcontext.rs +++ b/components/script/dom/webgl2renderingcontext.rs @@ -766,6 +766,17 @@ impl WebGL2RenderingContextMethods for WebGL2RenderingContext { self.base.UniformMatrix4fv(location, transpose, v) } + // https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.10 + #[allow(unsafe_code)] + unsafe fn GetUniform( + &self, + cx: *mut JSContext, + program: &WebGLProgram, + location: &WebGLUniformLocation, + ) -> JSVal { + self.base.GetUniform(cx, program, location) + } + /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.9 fn UseProgram(&self, program: Option<&WebGLProgram>) { self.base.UseProgram(program) -- cgit v1.2.3 From 900a19058e5f282fdb914ac16801d11f4a2c0159 Mon Sep 17 00:00:00 2001 From: Anthony Ramine Date: Mon, 27 Aug 2018 12:08:17 +0200 Subject: Support unions of objects in overloads Part of #20513, implementing the parts useful for WebGL. --- components/script/dom/webgl2renderingcontext.rs | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) (limited to 'components/script/dom/webgl2renderingcontext.rs') diff --git a/components/script/dom/webgl2renderingcontext.rs b/components/script/dom/webgl2renderingcontext.rs index 811fc100e6b..69ef20e4fc2 100644 --- a/components/script/dom/webgl2renderingcontext.rs +++ b/components/script/dom/webgl2renderingcontext.rs @@ -240,14 +240,18 @@ impl WebGL2RenderingContextMethods for WebGL2RenderingContext { self.base.GenerateMipmap(target) } - #[allow(unsafe_code)] /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.5 - unsafe fn BufferData(&self, cx: *mut JSContext, target: u32, data: *mut JSObject, usage: u32) -> Fallible<()> { - self.base.BufferData(cx, target, data, usage) + fn BufferData( + &self, + target: u32, + data: Option, + usage: u32, + ) { + self.base.BufferData(target, data, usage) } /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.5 - fn BufferData_(&self, target: u32, size: i64, usage: u32) -> Fallible<()> { + fn BufferData_(&self, target: u32, size: i64, usage: u32) { self.base.BufferData_(target, size, usage) } -- cgit v1.2.3 From 0579fbe4fad276e11218d90bd935b5705f29f8f6 Mon Sep 17 00:00:00 2001 From: Anthony Ramine Date: Thu, 6 Sep 2018 10:41:58 +0200 Subject: Use WebGLResult for returns of instanced draw methods --- components/script/dom/webgl2renderingcontext.rs | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) (limited to 'components/script/dom/webgl2renderingcontext.rs') diff --git a/components/script/dom/webgl2renderingcontext.rs b/components/script/dom/webgl2renderingcontext.rs index 69ef20e4fc2..da50ed556df 100644 --- a/components/script/dom/webgl2renderingcontext.rs +++ b/components/script/dom/webgl2renderingcontext.rs @@ -961,7 +961,10 @@ impl WebGL2RenderingContextMethods for WebGL2RenderingContext { count: i32, primcount: i32, ) { - self.base.draw_arrays_instanced(mode, first, count, primcount); + handle_potential_webgl_error!( + self.base, + self.base.draw_arrays_instanced(mode, first, count, primcount) + ) } /// https://www.khronos.org/registry/webgl/specs/latest/2.0/#3.7.9 @@ -973,7 +976,10 @@ impl WebGL2RenderingContextMethods for WebGL2RenderingContext { offset: i64, primcount: i32, ) { - self.base.draw_elements_instanced(mode, count, type_, offset, primcount); + handle_potential_webgl_error!( + self.base, + self.base.draw_elements_instanced(mode, count, type_, offset, primcount) + ) } /// https://www.khronos.org/registry/webgl/specs/latest/2.0/#3.7.9 -- cgit v1.2.3 From c37a345dc9f4dda6ea29c42f96f6c7201c42cbac Mon Sep 17 00:00:00 2001 From: chansuke Date: Tue, 18 Sep 2018 23:24:15 +0900 Subject: Format script component --- components/script/dom/webgl2renderingcontext.rs | 373 +++++++++++++++--------- 1 file changed, 228 insertions(+), 145 deletions(-) (limited to 'components/script/dom/webgl2renderingcontext.rs') diff --git a/components/script/dom/webgl2renderingcontext.rs b/components/script/dom/webgl2renderingcontext.rs index da50ed556df..a674cd719a6 100644 --- a/components/script/dom/webgl2renderingcontext.rs +++ b/components/script/dom/webgl2renderingcontext.rs @@ -50,7 +50,7 @@ impl WebGL2RenderingContext { window: &Window, canvas: &HTMLCanvasElement, size: Size2D, - attrs: GLContextAttributes + attrs: GLContextAttributes, ) -> Option { let base = WebGLRenderingContext::new(window, canvas, WebGLVersion::WebGL2, size, attrs)?; Some(WebGL2RenderingContext { @@ -64,7 +64,7 @@ impl WebGL2RenderingContext { window: &Window, canvas: &HTMLCanvasElement, size: Size2D, - attrs: GLContextAttributes + attrs: GLContextAttributes, ) -> Option> { WebGL2RenderingContext::new_inherited(window, canvas, size, attrs).map(|ctx| { reflect_dom_object(Box::new(ctx), window, WebGL2RenderingContextBinding::Wrap) @@ -143,7 +143,11 @@ impl WebGL2RenderingContextMethods for WebGL2RenderingContext { #[allow(unsafe_code)] /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.14 - unsafe fn GetExtension(&self, cx: *mut JSContext, name: DOMString) -> Option> { + unsafe fn GetExtension( + &self, + cx: *mut JSContext, + name: DOMString, + ) -> Option> { self.base.GetExtension(cx, name) } @@ -154,9 +158,10 @@ impl WebGL2RenderingContextMethods for WebGL2RenderingContext { cx: *mut JSContext, target: u32, attachment: u32, - pname: u32 + pname: u32, ) -> JSVal { - self.base.GetFramebufferAttachmentParameter(cx, target, attachment, pname) + self.base + .GetFramebufferAttachmentParameter(cx, target, attachment, pname) } #[allow(unsafe_code)] @@ -165,7 +170,7 @@ impl WebGL2RenderingContextMethods for WebGL2RenderingContext { &self, cx: *mut JSContext, target: u32, - pname: u32 + pname: u32, ) -> JSVal { self.base.GetRenderbufferParameter(cx, target, pname) } @@ -197,7 +202,8 @@ impl WebGL2RenderingContextMethods for WebGL2RenderingContext { /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.3 fn BlendFuncSeparate(&self, src_rgb: u32, dest_rgb: u32, src_alpha: u32, dest_alpha: u32) { - self.base.BlendFuncSeparate(src_rgb, dest_rgb, src_alpha, dest_alpha) + self.base + .BlendFuncSeparate(src_rgb, dest_rgb, src_alpha, dest_alpha) } /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.9 @@ -241,12 +247,7 @@ impl WebGL2RenderingContextMethods for WebGL2RenderingContext { } /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.5 - fn BufferData( - &self, - target: u32, - data: Option, - usage: u32, - ) { + fn BufferData(&self, target: u32, data: Option, usage: u32) { self.base.BufferData(target, data, usage) } @@ -261,29 +262,74 @@ impl WebGL2RenderingContextMethods for WebGL2RenderingContext { } /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.8 - fn CompressedTexImage2D(&self, target: u32, level: i32, internal_format: u32, - width: i32, height: i32, border: i32, - pixels: CustomAutoRooterGuard) { - self.base.CompressedTexImage2D(target, level, internal_format, width, height, border, pixels) + fn CompressedTexImage2D( + &self, + target: u32, + level: i32, + internal_format: u32, + width: i32, + height: i32, + border: i32, + pixels: CustomAutoRooterGuard, + ) { + self.base.CompressedTexImage2D( + target, + level, + internal_format, + width, + height, + border, + pixels, + ) } /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.8 - fn CompressedTexSubImage2D(&self, target: u32, level: i32, xoffset: i32, - yoffset: i32, width: i32, height: i32, format: u32, - pixels: CustomAutoRooterGuard) { - self.base.CompressedTexSubImage2D(target, level, xoffset, yoffset, width, height, format, pixels) + fn CompressedTexSubImage2D( + &self, + target: u32, + level: i32, + xoffset: i32, + yoffset: i32, + width: i32, + height: i32, + format: u32, + pixels: CustomAutoRooterGuard, + ) { + self.base.CompressedTexSubImage2D( + target, level, xoffset, yoffset, width, height, format, pixels, + ) } /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.8 - fn CopyTexImage2D(&self, target: u32, level: i32, internal_format: u32, - x: i32, y: i32, width: i32, height: i32, border: i32) { - self.base.CopyTexImage2D(target, level, internal_format, x, y, width, height, border) + fn CopyTexImage2D( + &self, + target: u32, + level: i32, + internal_format: u32, + x: i32, + y: i32, + width: i32, + height: i32, + border: i32, + ) { + self.base + .CopyTexImage2D(target, level, internal_format, x, y, width, height, border) } /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.8 - fn CopyTexSubImage2D(&self, target: u32, level: i32, xoffset: i32, yoffset: i32, - x: i32, y: i32, width: i32, height: i32) { - self.base.CopyTexSubImage2D(target, level, xoffset, yoffset, x, y, width, height) + fn CopyTexSubImage2D( + &self, + target: u32, + level: i32, + xoffset: i32, + yoffset: i32, + x: i32, + y: i32, + width: i32, + height: i32, + ) { + self.base + .CopyTexSubImage2D(target, level, xoffset, yoffset, x, y, width, height) } /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.11 @@ -431,12 +477,20 @@ impl WebGL2RenderingContextMethods for WebGL2RenderingContext { } /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.10 - fn GetActiveUniform(&self, program: &WebGLProgram, index: u32) -> Option> { + fn GetActiveUniform( + &self, + program: &WebGLProgram, + index: u32, + ) -> Option> { self.base.GetActiveUniform(program, index) } /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.10 - fn GetActiveAttrib(&self, program: &WebGLProgram, index: u32) -> Option> { + fn GetActiveAttrib( + &self, + program: &WebGLProgram, + index: u32, + ) -> Option> { self.base.GetActiveAttrib(program, index) } @@ -452,7 +506,12 @@ impl WebGL2RenderingContextMethods for WebGL2RenderingContext { #[allow(unsafe_code)] /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.9 - unsafe fn GetProgramParameter(&self, cx: *mut JSContext, program: &WebGLProgram, param_id: u32) -> JSVal { + unsafe fn GetProgramParameter( + &self, + cx: *mut JSContext, + program: &WebGLProgram, + param_id: u32, + ) -> JSVal { self.base.GetProgramParameter(cx, program, param_id) } @@ -463,16 +522,23 @@ impl WebGL2RenderingContextMethods for WebGL2RenderingContext { #[allow(unsafe_code)] /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.9 - unsafe fn GetShaderParameter(&self, cx: *mut JSContext, shader: &WebGLShader, param_id: u32) -> JSVal { + unsafe fn GetShaderParameter( + &self, + cx: *mut JSContext, + shader: &WebGLShader, + param_id: u32, + ) -> JSVal { self.base.GetShaderParameter(cx, shader, param_id) } /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.9 - fn GetShaderPrecisionFormat(&self, - shader_type: u32, - precision_type: u32) - -> Option> { - self.base.GetShaderPrecisionFormat(shader_type, precision_type) + fn GetShaderPrecisionFormat( + &self, + shader_type: u32, + precision_type: u32, + ) -> Option> { + self.base + .GetShaderPrecisionFormat(shader_type, precision_type) } /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.10 @@ -552,9 +618,18 @@ impl WebGL2RenderingContextMethods for WebGL2RenderingContext { } /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.12 - fn ReadPixels(&self, x: i32, y: i32, width: i32, height: i32, format: u32, pixel_type: u32, - pixels: CustomAutoRooterGuard>) { - self.base.ReadPixels(x, y, width, height, format, pixel_type, pixels) + fn ReadPixels( + &self, + x: i32, + y: i32, + width: i32, + height: i32, + format: u32, + pixel_type: u32, + pixels: CustomAutoRooterGuard>, + ) { + self.base + .ReadPixels(x, y, width, height, format, pixel_type, pixels) } /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.3 @@ -613,25 +688,17 @@ impl WebGL2RenderingContextMethods for WebGL2RenderingContext { } /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.10 - fn Uniform1f(&self, - location: Option<&WebGLUniformLocation>, - val: f32) { + fn Uniform1f(&self, location: Option<&WebGLUniformLocation>, val: f32) { self.base.Uniform1f(location, val) } /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.10 - fn Uniform1i(&self, - location: Option<&WebGLUniformLocation>, - val: i32) { + fn Uniform1i(&self, location: Option<&WebGLUniformLocation>, val: i32) { self.base.Uniform1i(location, val) } /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.10 - fn Uniform1iv( - &self, - location: Option<&WebGLUniformLocation>, - v: Int32ArrayOrLongSequence, - ) { + fn Uniform1iv(&self, location: Option<&WebGLUniformLocation>, v: Int32ArrayOrLongSequence) { self.base.Uniform1iv(location, v) } @@ -645,9 +712,7 @@ impl WebGL2RenderingContextMethods for WebGL2RenderingContext { } /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.10 - fn Uniform2f(&self, - location: Option<&WebGLUniformLocation>, - x: f32, y: f32) { + fn Uniform2f(&self, location: Option<&WebGLUniformLocation>, x: f32, y: f32) { self.base.Uniform2f(location, x, y) } @@ -661,25 +726,17 @@ impl WebGL2RenderingContextMethods for WebGL2RenderingContext { } /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.10 - fn Uniform2i(&self, - location: Option<&WebGLUniformLocation>, - x: i32, y: i32) { + fn Uniform2i(&self, location: Option<&WebGLUniformLocation>, x: i32, y: i32) { self.base.Uniform2i(location, x, y) } /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.10 - fn Uniform2iv( - &self, - location: Option<&WebGLUniformLocation>, - v: Int32ArrayOrLongSequence, - ) { + fn Uniform2iv(&self, location: Option<&WebGLUniformLocation>, v: Int32ArrayOrLongSequence) { self.base.Uniform2iv(location, v) } /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.10 - fn Uniform3f(&self, - location: Option<&WebGLUniformLocation>, - x: f32, y: f32, z: f32) { + fn Uniform3f(&self, location: Option<&WebGLUniformLocation>, x: f32, y: f32, z: f32) { self.base.Uniform3f(location, x, y, z) } @@ -693,41 +750,27 @@ impl WebGL2RenderingContextMethods for WebGL2RenderingContext { } /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.10 - fn Uniform3i(&self, - location: Option<&WebGLUniformLocation>, - x: i32, y: i32, z: i32) { + fn Uniform3i(&self, location: Option<&WebGLUniformLocation>, x: i32, y: i32, z: i32) { self.base.Uniform3i(location, x, y, z) } /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.10 - fn Uniform3iv( - &self, - location: Option<&WebGLUniformLocation>, - v: Int32ArrayOrLongSequence, - ) { + fn Uniform3iv(&self, location: Option<&WebGLUniformLocation>, v: Int32ArrayOrLongSequence) { self.base.Uniform3iv(location, v) } /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.10 - fn Uniform4i(&self, - location: Option<&WebGLUniformLocation>, - x: i32, y: i32, z: i32, w: i32) { + fn Uniform4i(&self, location: Option<&WebGLUniformLocation>, x: i32, y: i32, z: i32, w: i32) { self.base.Uniform4i(location, x, y, z, w) } /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.10 - fn Uniform4iv( - &self, - location: Option<&WebGLUniformLocation>, - v: Int32ArrayOrLongSequence, - ) { + fn Uniform4iv(&self, location: Option<&WebGLUniformLocation>, v: Int32ArrayOrLongSequence) { self.base.Uniform4iv(location, v) } /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.10 - fn Uniform4f(&self, - location: Option<&WebGLUniformLocation>, - x: f32, y: f32, z: f32, w: f32) { + fn Uniform4f(&self, location: Option<&WebGLUniformLocation>, x: f32, y: f32, z: f32, w: f32) { self.base.Uniform4f(location, x, y, z, w) } @@ -832,9 +875,17 @@ impl WebGL2RenderingContextMethods for WebGL2RenderingContext { } /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.10 - fn VertexAttribPointer(&self, attrib_id: u32, size: i32, data_type: u32, - normalized: bool, stride: i32, offset: i64) { - self.base.VertexAttribPointer(attrib_id, size, data_type, normalized, stride, offset) + fn VertexAttribPointer( + &self, + attrib_id: u32, + size: i32, + data_type: u32, + normalized: bool, + stride: i32, + offset: i64, + ) { + self.base + .VertexAttribPointer(attrib_id, size, data_type, normalized, stride, offset) } /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.4 @@ -843,17 +894,29 @@ impl WebGL2RenderingContextMethods for WebGL2RenderingContext { } /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.8 - fn TexImage2D(&self, - target: u32, - level: i32, - internal_format: u32, - width: i32, - height: i32, - border: i32, - format: u32, - data_type: u32, - pixels: CustomAutoRooterGuard>) -> Fallible<()> { - self.base.TexImage2D(target, level, internal_format, width, height, border, format, data_type, pixels) + fn TexImage2D( + &self, + target: u32, + level: i32, + internal_format: u32, + width: i32, + height: i32, + border: i32, + format: u32, + data_type: u32, + pixels: CustomAutoRooterGuard>, + ) -> Fallible<()> { + self.base.TexImage2D( + target, + level, + internal_format, + width, + height, + border, + format, + data_type, + pixels, + ) } /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.8 @@ -866,34 +929,50 @@ impl WebGL2RenderingContextMethods for WebGL2RenderingContext { data_type: u32, source: ImageDataOrHTMLImageElementOrHTMLCanvasElementOrHTMLVideoElement, ) -> ErrorResult { - self.base.TexImage2D_(target, level, internal_format, format, data_type, source) + self.base + .TexImage2D_(target, level, internal_format, format, data_type, source) } /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.8 - fn TexImageDOM(&self, - target: u32, - level: i32, - internal_format: u32, - width: i32, - height: i32, - format: u32, - data_type: u32, - source: &HTMLIFrameElement) -> Fallible<()> { - self.base.TexImageDOM(target, level, internal_format, width, height, format, data_type, source) + fn TexImageDOM( + &self, + target: u32, + level: i32, + internal_format: u32, + width: i32, + height: i32, + format: u32, + data_type: u32, + source: &HTMLIFrameElement, + ) -> Fallible<()> { + self.base.TexImageDOM( + target, + level, + internal_format, + width, + height, + format, + data_type, + source, + ) } /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.8 - fn TexSubImage2D(&self, - target: u32, - level: i32, - xoffset: i32, - yoffset: i32, - width: i32, - height: i32, - format: u32, - data_type: u32, - pixels: CustomAutoRooterGuard>) -> Fallible<()> { - self.base.TexSubImage2D(target, level, xoffset, yoffset, width, height, format, data_type, pixels) + fn TexSubImage2D( + &self, + target: u32, + level: i32, + xoffset: i32, + yoffset: i32, + width: i32, + height: i32, + format: u32, + data_type: u32, + pixels: CustomAutoRooterGuard>, + ) -> Fallible<()> { + self.base.TexSubImage2D( + target, level, xoffset, yoffset, width, height, format, data_type, pixels, + ) } /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.8 @@ -907,7 +986,8 @@ impl WebGL2RenderingContextMethods for WebGL2RenderingContext { data_type: u32, source: ImageDataOrHTMLImageElementOrHTMLCanvasElementOrHTMLVideoElement, ) -> ErrorResult { - self.base.TexSubImage2D_(target, level, xoffset, yoffset, format, data_type, source) + self.base + .TexSubImage2D_(target, level, xoffset, yoffset, format, data_type, source) } /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.8 @@ -926,44 +1006,47 @@ impl WebGL2RenderingContextMethods for WebGL2RenderingContext { } /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.7 - fn RenderbufferStorage(&self, target: u32, internal_format: u32, - width: i32, height: i32) { - self.base.RenderbufferStorage(target, internal_format, width, height) + fn RenderbufferStorage(&self, target: u32, internal_format: u32, width: i32, height: i32) { + self.base + .RenderbufferStorage(target, internal_format, width, height) } /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.6 - fn FramebufferRenderbuffer(&self, target: u32, attachment: u32, - renderbuffertarget: u32, - rb: Option<&WebGLRenderbuffer>) { - self.base.FramebufferRenderbuffer(target, attachment, renderbuffertarget, rb) + fn FramebufferRenderbuffer( + &self, + target: u32, + attachment: u32, + renderbuffertarget: u32, + rb: Option<&WebGLRenderbuffer>, + ) { + self.base + .FramebufferRenderbuffer(target, attachment, renderbuffertarget, rb) } /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.6 - fn FramebufferTexture2D(&self, target: u32, attachment: u32, - textarget: u32, texture: Option<&WebGLTexture>, - level: i32) { - self.base.FramebufferTexture2D(target, attachment, textarget, texture, level) + fn FramebufferTexture2D( + &self, + target: u32, + attachment: u32, + textarget: u32, + texture: Option<&WebGLTexture>, + level: i32, + ) { + self.base + .FramebufferTexture2D(target, attachment, textarget, texture, level) } /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.9 - fn GetAttachedShaders( - &self, - program: &WebGLProgram, - ) -> Option>> { + fn GetAttachedShaders(&self, program: &WebGLProgram) -> Option>> { self.base.GetAttachedShaders(program) } /// https://www.khronos.org/registry/webgl/specs/latest/2.0/#3.7.9 - fn DrawArraysInstanced( - &self, - mode: u32, - first: i32, - count: i32, - primcount: i32, - ) { + fn DrawArraysInstanced(&self, mode: u32, first: i32, count: i32, primcount: i32) { handle_potential_webgl_error!( self.base, - self.base.draw_arrays_instanced(mode, first, count, primcount) + self.base + .draw_arrays_instanced(mode, first, count, primcount) ) } @@ -978,7 +1061,8 @@ impl WebGL2RenderingContextMethods for WebGL2RenderingContext { ) { handle_potential_webgl_error!( self.base, - self.base.draw_elements_instanced(mode, count, type_, offset, primcount) + self.base + .draw_elements_instanced(mode, count, type_, offset, primcount) ) } @@ -988,7 +1072,6 @@ impl WebGL2RenderingContextMethods for WebGL2RenderingContext { } } - impl LayoutCanvasWebGLRenderingContextHelpers for LayoutDom { #[allow(unsafe_code)] unsafe fn canvas_data_source(&self) -> HTMLCanvasDataSource { -- cgit v1.2.3 From a3392610c3414a86a2294073bdc59c78c237bfda Mon Sep 17 00:00:00 2001 From: Anthony Ramine Date: Tue, 2 Oct 2018 13:25:45 +0200 Subject: Make HTMLCanvasElement::get_size return a Size2D The changes keep trickling down. --- components/script/dom/webgl2renderingcontext.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'components/script/dom/webgl2renderingcontext.rs') diff --git a/components/script/dom/webgl2renderingcontext.rs b/components/script/dom/webgl2renderingcontext.rs index a674cd719a6..ec839bf3fbf 100644 --- a/components/script/dom/webgl2renderingcontext.rs +++ b/components/script/dom/webgl2renderingcontext.rs @@ -49,7 +49,7 @@ impl WebGL2RenderingContext { fn new_inherited( window: &Window, canvas: &HTMLCanvasElement, - size: Size2D, + size: Size2D, attrs: GLContextAttributes, ) -> Option { let base = WebGLRenderingContext::new(window, canvas, WebGLVersion::WebGL2, size, attrs)?; @@ -63,7 +63,7 @@ impl WebGL2RenderingContext { pub fn new( window: &Window, canvas: &HTMLCanvasElement, - size: Size2D, + size: Size2D, attrs: GLContextAttributes, ) -> Option> { WebGL2RenderingContext::new_inherited(window, canvas, size, attrs).map(|ctx| { @@ -73,7 +73,7 @@ impl WebGL2RenderingContext { } impl WebGL2RenderingContext { - pub fn recreate(&self, size: Size2D) { + pub fn recreate(&self, size: Size2D) { self.base.recreate(size) } -- cgit v1.2.3 From 45f7199eee82c66637ec68287eafa40a651001c4 Mon Sep 17 00:00:00 2001 From: Simon Sapin Date: Thu, 1 Nov 2018 23:45:06 +0100 Subject: `cargo fix --edition` --- components/script/dom/webgl2renderingcontext.rs | 50 ++++++++++++------------- 1 file changed, 25 insertions(+), 25 deletions(-) (limited to 'components/script/dom/webgl2renderingcontext.rs') diff --git a/components/script/dom/webgl2renderingcontext.rs b/components/script/dom/webgl2renderingcontext.rs index ec839bf3fbf..c63c105a01e 100644 --- a/components/script/dom/webgl2renderingcontext.rs +++ b/components/script/dom/webgl2renderingcontext.rs @@ -4,31 +4,31 @@ /// https://www.khronos.org/registry/webgl/specs/latest/2.0/webgl.idl use canvas_traits::webgl::WebGLVersion; -use dom::bindings::codegen::Bindings::WebGL2RenderingContextBinding; -use dom::bindings::codegen::Bindings::WebGL2RenderingContextBinding::WebGL2RenderingContextMethods; -use dom::bindings::codegen::Bindings::WebGLRenderingContextBinding::WebGLContextAttributes; -use dom::bindings::codegen::Bindings::WebGLRenderingContextBinding::WebGLRenderingContextMethods; -use dom::bindings::codegen::UnionTypes::ArrayBufferViewOrArrayBuffer; -use dom::bindings::codegen::UnionTypes::Float32ArrayOrUnrestrictedFloatSequence; -use dom::bindings::codegen::UnionTypes::ImageDataOrHTMLImageElementOrHTMLCanvasElementOrHTMLVideoElement; -use dom::bindings::codegen::UnionTypes::Int32ArrayOrLongSequence; -use dom::bindings::error::{ErrorResult, Fallible}; -use dom::bindings::reflector::{reflect_dom_object, Reflector}; -use dom::bindings::root::{Dom, DomRoot, LayoutDom}; -use dom::bindings::str::DOMString; -use dom::htmlcanvaselement::HTMLCanvasElement; -use dom::htmliframeelement::HTMLIFrameElement; -use dom::webglactiveinfo::WebGLActiveInfo; -use dom::webglbuffer::WebGLBuffer; -use dom::webglframebuffer::WebGLFramebuffer; -use dom::webglprogram::WebGLProgram; -use dom::webglrenderbuffer::WebGLRenderbuffer; -use dom::webglrenderingcontext::{LayoutCanvasWebGLRenderingContextHelpers, WebGLRenderingContext}; -use dom::webglshader::WebGLShader; -use dom::webglshaderprecisionformat::WebGLShaderPrecisionFormat; -use dom::webgltexture::WebGLTexture; -use dom::webgluniformlocation::WebGLUniformLocation; -use dom::window::Window; +use crate::dom::bindings::codegen::Bindings::WebGL2RenderingContextBinding; +use crate::dom::bindings::codegen::Bindings::WebGL2RenderingContextBinding::WebGL2RenderingContextMethods; +use crate::dom::bindings::codegen::Bindings::WebGLRenderingContextBinding::WebGLContextAttributes; +use crate::dom::bindings::codegen::Bindings::WebGLRenderingContextBinding::WebGLRenderingContextMethods; +use crate::dom::bindings::codegen::UnionTypes::ArrayBufferViewOrArrayBuffer; +use crate::dom::bindings::codegen::UnionTypes::Float32ArrayOrUnrestrictedFloatSequence; +use crate::dom::bindings::codegen::UnionTypes::ImageDataOrHTMLImageElementOrHTMLCanvasElementOrHTMLVideoElement; +use crate::dom::bindings::codegen::UnionTypes::Int32ArrayOrLongSequence; +use crate::dom::bindings::error::{ErrorResult, Fallible}; +use crate::dom::bindings::reflector::{reflect_dom_object, Reflector}; +use crate::dom::bindings::root::{Dom, DomRoot, LayoutDom}; +use crate::dom::bindings::str::DOMString; +use crate::dom::htmlcanvaselement::HTMLCanvasElement; +use crate::dom::htmliframeelement::HTMLIFrameElement; +use crate::dom::webglactiveinfo::WebGLActiveInfo; +use crate::dom::webglbuffer::WebGLBuffer; +use crate::dom::webglframebuffer::WebGLFramebuffer; +use crate::dom::webglprogram::WebGLProgram; +use crate::dom::webglrenderbuffer::WebGLRenderbuffer; +use crate::dom::webglrenderingcontext::{LayoutCanvasWebGLRenderingContextHelpers, WebGLRenderingContext}; +use crate::dom::webglshader::WebGLShader; +use crate::dom::webglshaderprecisionformat::WebGLShaderPrecisionFormat; +use crate::dom::webgltexture::WebGLTexture; +use crate::dom::webgluniformlocation::WebGLUniformLocation; +use crate::dom::window::Window; use dom_struct::dom_struct; use euclid::Size2D; use js::jsapi::{JSContext, JSObject}; -- cgit v1.2.3 From 9e92eb205a2a12fe0be883e42cb7f82deebc9031 Mon Sep 17 00:00:00 2001 From: Pyfisch Date: Tue, 6 Nov 2018 20:38:02 +0100 Subject: Reorder imports --- components/script/dom/webgl2renderingcontext.rs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) (limited to 'components/script/dom/webgl2renderingcontext.rs') diff --git a/components/script/dom/webgl2renderingcontext.rs b/components/script/dom/webgl2renderingcontext.rs index c63c105a01e..275612bc69e 100644 --- a/components/script/dom/webgl2renderingcontext.rs +++ b/components/script/dom/webgl2renderingcontext.rs @@ -23,7 +23,9 @@ use crate::dom::webglbuffer::WebGLBuffer; use crate::dom::webglframebuffer::WebGLFramebuffer; use crate::dom::webglprogram::WebGLProgram; use crate::dom::webglrenderbuffer::WebGLRenderbuffer; -use crate::dom::webglrenderingcontext::{LayoutCanvasWebGLRenderingContextHelpers, WebGLRenderingContext}; +use crate::dom::webglrenderingcontext::{ + LayoutCanvasWebGLRenderingContextHelpers, WebGLRenderingContext, +}; use crate::dom::webglshader::WebGLShader; use crate::dom::webglshaderprecisionformat::WebGLShaderPrecisionFormat; use crate::dom::webgltexture::WebGLTexture; -- cgit v1.2.3 From a1a14459c141afc6ac6771b8a6c9ca374537edf2 Mon Sep 17 00:00:00 2001 From: Jan Andre Ikenmeyer Date: Mon, 19 Nov 2018 14:47:12 +0100 Subject: Update MPL license to https (part 3) --- components/script/dom/webgl2renderingcontext.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'components/script/dom/webgl2renderingcontext.rs') diff --git a/components/script/dom/webgl2renderingcontext.rs b/components/script/dom/webgl2renderingcontext.rs index 275612bc69e..658df0adc85 100644 --- a/components/script/dom/webgl2renderingcontext.rs +++ b/components/script/dom/webgl2renderingcontext.rs @@ -1,6 +1,6 @@ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ /// https://www.khronos.org/registry/webgl/specs/latest/2.0/webgl.idl use canvas_traits::webgl::WebGLVersion; -- cgit v1.2.3 From be69f9c3e6a6f5efb5ba1edd50955cb12c111bf8 Mon Sep 17 00:00:00 2001 From: Simon Sapin Date: Fri, 14 Dec 2018 08:31:30 +0100 Subject: Rustfmt has changed its default style :/ --- components/script/dom/webgl2renderingcontext.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'components/script/dom/webgl2renderingcontext.rs') diff --git a/components/script/dom/webgl2renderingcontext.rs b/components/script/dom/webgl2renderingcontext.rs index 658df0adc85..2196ae4f693 100644 --- a/components/script/dom/webgl2renderingcontext.rs +++ b/components/script/dom/webgl2renderingcontext.rs @@ -2,8 +2,6 @@ * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ -/// https://www.khronos.org/registry/webgl/specs/latest/2.0/webgl.idl -use canvas_traits::webgl::WebGLVersion; use crate::dom::bindings::codegen::Bindings::WebGL2RenderingContextBinding; use crate::dom::bindings::codegen::Bindings::WebGL2RenderingContextBinding::WebGL2RenderingContextMethods; use crate::dom::bindings::codegen::Bindings::WebGLRenderingContextBinding::WebGLContextAttributes; @@ -31,6 +29,8 @@ use crate::dom::webglshaderprecisionformat::WebGLShaderPrecisionFormat; use crate::dom::webgltexture::WebGLTexture; use crate::dom::webgluniformlocation::WebGLUniformLocation; use crate::dom::window::Window; +/// https://www.khronos.org/registry/webgl/specs/latest/2.0/webgl.idl +use canvas_traits::webgl::WebGLVersion; use dom_struct::dom_struct; use euclid::Size2D; use js::jsapi::{JSContext, JSObject}; -- cgit v1.2.3 From 3121f42d52feeb17f911e29d8ef5dd31f9f2769c Mon Sep 17 00:00:00 2001 From: Josh Matthews Date: Wed, 14 Nov 2018 18:06:35 -0500 Subject: Remove offscreen_gl_context dependency from canvas_traits and script. --- components/script/dom/webgl2renderingcontext.rs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) (limited to 'components/script/dom/webgl2renderingcontext.rs') diff --git a/components/script/dom/webgl2renderingcontext.rs b/components/script/dom/webgl2renderingcontext.rs index 2196ae4f693..98056104848 100644 --- a/components/script/dom/webgl2renderingcontext.rs +++ b/components/script/dom/webgl2renderingcontext.rs @@ -30,14 +30,13 @@ use crate::dom::webgltexture::WebGLTexture; use crate::dom::webgluniformlocation::WebGLUniformLocation; use crate::dom::window::Window; /// https://www.khronos.org/registry/webgl/specs/latest/2.0/webgl.idl -use canvas_traits::webgl::WebGLVersion; +use canvas_traits::webgl::{GLContextAttributes, WebGLVersion}; use dom_struct::dom_struct; use euclid::Size2D; use js::jsapi::{JSContext, JSObject}; use js::jsval::JSVal; use js::rust::CustomAutoRooterGuard; use js::typedarray::ArrayBufferView; -use offscreen_gl_context::GLContextAttributes; use script_layout_interface::HTMLCanvasDataSource; use std::ptr::NonNull; -- cgit v1.2.3 From 3d57c22e9cda982923dd184152d3f187910d7b46 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20Cobos=20=C3=81lvarez?= Date: Mon, 22 Jul 2019 12:49:39 +0200 Subject: Update euclid. There are a few canvas2d-related dependencies that haven't updated, but they only use euclid internally so that's not blocking landing the rest of the changes. Given the size of this patch, I think it's useful to get this landed as-is. --- components/script/dom/webgl2renderingcontext.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'components/script/dom/webgl2renderingcontext.rs') diff --git a/components/script/dom/webgl2renderingcontext.rs b/components/script/dom/webgl2renderingcontext.rs index 98056104848..3b068caafca 100644 --- a/components/script/dom/webgl2renderingcontext.rs +++ b/components/script/dom/webgl2renderingcontext.rs @@ -32,7 +32,7 @@ use crate::dom::window::Window; /// https://www.khronos.org/registry/webgl/specs/latest/2.0/webgl.idl use canvas_traits::webgl::{GLContextAttributes, WebGLVersion}; use dom_struct::dom_struct; -use euclid::Size2D; +use euclid::default::Size2D; use js::jsapi::{JSContext, JSObject}; use js::jsval::JSVal; use js::rust::CustomAutoRooterGuard; -- cgit v1.2.3 From 2c5d0a6ebc39ad263e2bbe623e357a11b4cec5aa Mon Sep 17 00:00:00 2001 From: marmeladema Date: Mon, 22 Jul 2019 01:09:24 +0100 Subject: Convert CGTraitInterface to use safe JSContext instead of raw JSContext --- components/script/dom/webgl2renderingcontext.rs | 57 +++++++------------------ 1 file changed, 15 insertions(+), 42 deletions(-) (limited to 'components/script/dom/webgl2renderingcontext.rs') diff --git a/components/script/dom/webgl2renderingcontext.rs b/components/script/dom/webgl2renderingcontext.rs index 3b068caafca..26b81f8ad3a 100644 --- a/components/script/dom/webgl2renderingcontext.rs +++ b/components/script/dom/webgl2renderingcontext.rs @@ -29,11 +29,12 @@ use crate::dom::webglshaderprecisionformat::WebGLShaderPrecisionFormat; use crate::dom::webgltexture::WebGLTexture; use crate::dom::webgluniformlocation::WebGLUniformLocation; use crate::dom::window::Window; +use crate::script_runtime::JSContext; /// https://www.khronos.org/registry/webgl/specs/latest/2.0/webgl.idl use canvas_traits::webgl::{GLContextAttributes, WebGLVersion}; use dom_struct::dom_struct; use euclid::default::Size2D; -use js::jsapi::{JSContext, JSObject}; +use js::jsapi::JSObject; use js::jsval::JSVal; use js::rust::CustomAutoRooterGuard; use js::typedarray::ArrayBufferView; @@ -109,21 +110,19 @@ impl WebGL2RenderingContextMethods for WebGL2RenderingContext { self.base.DrawingBufferHeight() } - #[allow(unsafe_code)] /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.5 - unsafe fn GetBufferParameter(&self, _cx: *mut JSContext, target: u32, parameter: u32) -> JSVal { - self.base.GetBufferParameter(_cx, target, parameter) + fn GetBufferParameter(&self, cx: JSContext, target: u32, parameter: u32) -> JSVal { + self.base.GetBufferParameter(cx, target, parameter) } #[allow(unsafe_code)] /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.3 - unsafe fn GetParameter(&self, cx: *mut JSContext, parameter: u32) -> JSVal { + fn GetParameter(&self, cx: JSContext, parameter: u32) -> JSVal { self.base.GetParameter(cx, parameter) } - #[allow(unsafe_code)] /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.8 - unsafe fn GetTexParameter(&self, cx: *mut JSContext, target: u32, pname: u32) -> JSVal { + fn GetTexParameter(&self, cx: JSContext, target: u32, pname: u32) -> JSVal { self.base.GetTexParameter(cx, target, pname) } @@ -142,21 +141,15 @@ impl WebGL2RenderingContextMethods for WebGL2RenderingContext { self.base.GetSupportedExtensions() } - #[allow(unsafe_code)] /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.14 - unsafe fn GetExtension( - &self, - cx: *mut JSContext, - name: DOMString, - ) -> Option> { + fn GetExtension(&self, cx: JSContext, name: DOMString) -> Option> { self.base.GetExtension(cx, name) } - #[allow(unsafe_code)] /// https://www.khronos.org/registry/webgl/specs/latest/2.0/#3.7.4 - unsafe fn GetFramebufferAttachmentParameter( + fn GetFramebufferAttachmentParameter( &self, - cx: *mut JSContext, + cx: JSContext, target: u32, attachment: u32, pname: u32, @@ -165,14 +158,8 @@ impl WebGL2RenderingContextMethods for WebGL2RenderingContext { .GetFramebufferAttachmentParameter(cx, target, attachment, pname) } - #[allow(unsafe_code)] /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.7 - unsafe fn GetRenderbufferParameter( - &self, - cx: *mut JSContext, - target: u32, - pname: u32, - ) -> JSVal { + fn GetRenderbufferParameter(&self, cx: JSContext, target: u32, pname: u32) -> JSVal { self.base.GetRenderbufferParameter(cx, target, pname) } @@ -505,14 +492,8 @@ impl WebGL2RenderingContextMethods for WebGL2RenderingContext { self.base.GetProgramInfoLog(program) } - #[allow(unsafe_code)] /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.9 - unsafe fn GetProgramParameter( - &self, - cx: *mut JSContext, - program: &WebGLProgram, - param_id: u32, - ) -> JSVal { + fn GetProgramParameter(&self, cx: JSContext, program: &WebGLProgram, param_id: u32) -> JSVal { self.base.GetProgramParameter(cx, program, param_id) } @@ -521,14 +502,8 @@ impl WebGL2RenderingContextMethods for WebGL2RenderingContext { self.base.GetShaderInfoLog(shader) } - #[allow(unsafe_code)] /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.9 - unsafe fn GetShaderParameter( - &self, - cx: *mut JSContext, - shader: &WebGLShader, - param_id: u32, - ) -> JSVal { + fn GetShaderParameter(&self, cx: JSContext, shader: &WebGLShader, param_id: u32) -> JSVal { self.base.GetShaderParameter(cx, shader, param_id) } @@ -551,9 +526,8 @@ impl WebGL2RenderingContextMethods for WebGL2RenderingContext { self.base.GetUniformLocation(program, name) } - #[allow(unsafe_code)] /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.9 - unsafe fn GetVertexAttrib(&self, cx: *mut JSContext, index: u32, pname: u32) -> JSVal { + fn GetVertexAttrib(&self, cx: JSContext, index: u32, pname: u32) -> JSVal { self.base.GetVertexAttrib(cx, index, pname) } @@ -815,10 +789,9 @@ impl WebGL2RenderingContextMethods for WebGL2RenderingContext { } // https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.10 - #[allow(unsafe_code)] - unsafe fn GetUniform( + fn GetUniform( &self, - cx: *mut JSContext, + cx: JSContext, program: &WebGLProgram, location: &WebGLUniformLocation, ) -> JSVal { -- cgit v1.2.3 From f2e2b3d34b5ed1afa2b937eedee4908cd5d07a05 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=C3=A1ty=C3=A1s=20Mustoha?= Date: Mon, 9 Sep 2019 11:21:46 +0200 Subject: Initial implementation of WebGLQueries This patch adds initial support for WeGLQueries. Most related WebGL functions and objects are implemented [1]. What's still missing is the `EXT_disjoint_timer_query_webgl2` support. [1]: https://www.khronos.org/registry/webgl/specs/latest/2.0/#3.7.12 --- components/script/dom/webgl2renderingcontext.rs | 157 +++++++++++++++++++++++- 1 file changed, 155 insertions(+), 2 deletions(-) (limited to 'components/script/dom/webgl2renderingcontext.rs') diff --git a/components/script/dom/webgl2renderingcontext.rs b/components/script/dom/webgl2renderingcontext.rs index 26b81f8ad3a..f33b10f7931 100644 --- a/components/script/dom/webgl2renderingcontext.rs +++ b/components/script/dom/webgl2renderingcontext.rs @@ -3,6 +3,7 @@ * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ use crate::dom::bindings::codegen::Bindings::WebGL2RenderingContextBinding; +use crate::dom::bindings::codegen::Bindings::WebGL2RenderingContextBinding::WebGL2RenderingContextConstants as constants; use crate::dom::bindings::codegen::Bindings::WebGL2RenderingContextBinding::WebGL2RenderingContextMethods; use crate::dom::bindings::codegen::Bindings::WebGLRenderingContextBinding::WebGLContextAttributes; use crate::dom::bindings::codegen::Bindings::WebGLRenderingContextBinding::WebGLRenderingContextMethods; @@ -12,7 +13,7 @@ use crate::dom::bindings::codegen::UnionTypes::ImageDataOrHTMLImageElementOrHTML use crate::dom::bindings::codegen::UnionTypes::Int32ArrayOrLongSequence; use crate::dom::bindings::error::{ErrorResult, Fallible}; use crate::dom::bindings::reflector::{reflect_dom_object, Reflector}; -use crate::dom::bindings::root::{Dom, DomRoot, LayoutDom}; +use crate::dom::bindings::root::{Dom, DomRoot, LayoutDom, MutNullableDom}; use crate::dom::bindings::str::DOMString; use crate::dom::htmlcanvaselement::HTMLCanvasElement; use crate::dom::htmliframeelement::HTMLIFrameElement; @@ -20,6 +21,7 @@ use crate::dom::webglactiveinfo::WebGLActiveInfo; use crate::dom::webglbuffer::WebGLBuffer; use crate::dom::webglframebuffer::WebGLFramebuffer; use crate::dom::webglprogram::WebGLProgram; +use crate::dom::webglquery::WebGLQuery; use crate::dom::webglrenderbuffer::WebGLRenderbuffer; use crate::dom::webglrenderingcontext::{ LayoutCanvasWebGLRenderingContextHelpers, WebGLRenderingContext, @@ -31,11 +33,12 @@ use crate::dom::webgluniformlocation::WebGLUniformLocation; use crate::dom::window::Window; use crate::script_runtime::JSContext; /// https://www.khronos.org/registry/webgl/specs/latest/2.0/webgl.idl +use canvas_traits::webgl::WebGLError::*; use canvas_traits::webgl::{GLContextAttributes, WebGLVersion}; use dom_struct::dom_struct; use euclid::default::Size2D; use js::jsapi::JSObject; -use js::jsval::JSVal; +use js::jsval::{BooleanValue, JSVal, NullValue, UInt32Value}; use js::rust::CustomAutoRooterGuard; use js::typedarray::ArrayBufferView; use script_layout_interface::HTMLCanvasDataSource; @@ -45,6 +48,8 @@ use std::ptr::NonNull; pub struct WebGL2RenderingContext { reflector_: Reflector, base: Dom, + occlusion_query: MutNullableDom, + primitives_query: MutNullableDom, } impl WebGL2RenderingContext { @@ -58,6 +63,8 @@ impl WebGL2RenderingContext { Some(WebGL2RenderingContext { reflector_: Reflector::new(), base: Dom::from_ref(&*base), + occlusion_query: MutNullableDom::new(None), + primitives_query: MutNullableDom::new(None), }) } @@ -1044,6 +1051,152 @@ impl WebGL2RenderingContextMethods for WebGL2RenderingContext { fn VertexAttribDivisor(&self, index: u32, divisor: u32) { self.base.vertex_attrib_divisor(index, divisor); } + + /// https://www.khronos.org/registry/webgl/specs/latest/2.0/#3.7.12 + fn CreateQuery(&self) -> Option> { + Some(WebGLQuery::new(&self.base)) + } + + /// https://www.khronos.org/registry/webgl/specs/latest/2.0/#3.7.12 + #[cfg_attr(rustfmt, rustfmt_skip)] + fn DeleteQuery(&self, query: Option<&WebGLQuery>) { + if let Some(query) = query { + handle_potential_webgl_error!(self.base, self.base.validate_ownership(query), return); + + if let Some(query_target) = query.target() { + let slot = match query_target { + constants::ANY_SAMPLES_PASSED | + constants::ANY_SAMPLES_PASSED_CONSERVATIVE => { + &self.occlusion_query + }, + constants::TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN => { + &self.primitives_query + }, + _ => unreachable!(), + }; + if let Some(stored_query) = slot.get() { + if stored_query.target() == query.target() { + slot.set(None); + } + } + } + + query.delete(false); + } + } + + /// https://www.khronos.org/registry/webgl/specs/latest/2.0/#3.7.12 + fn IsQuery(&self, query: Option<&WebGLQuery>) -> bool { + match query { + Some(query) => self.base.validate_ownership(query).is_ok() && query.is_valid(), + None => false, + } + } + + /// https://www.khronos.org/registry/webgl/specs/latest/2.0/#3.7.12 + #[cfg_attr(rustfmt, rustfmt_skip)] + fn BeginQuery(&self, target: u32, query: &WebGLQuery) { + handle_potential_webgl_error!(self.base, self.base.validate_ownership(query), return); + + let active_query = match target { + constants::ANY_SAMPLES_PASSED | + constants::ANY_SAMPLES_PASSED_CONSERVATIVE => { + &self.occlusion_query + }, + constants::TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN => { + &self.primitives_query + }, + _ => { + self.base.webgl_error(InvalidEnum); + return; + }, + }; + if active_query.get().is_some() { + self.base.webgl_error(InvalidOperation); + return; + } + let result = query.begin(&self.base, target); + match result { + Ok(_) => active_query.set(Some(query)), + Err(error) => self.base.webgl_error(error), + } + } + + /// https://www.khronos.org/registry/webgl/specs/latest/2.0/#3.7.12 + #[cfg_attr(rustfmt, rustfmt_skip)] + fn EndQuery(&self, target: u32) { + let active_query = match target { + constants::ANY_SAMPLES_PASSED | + constants::ANY_SAMPLES_PASSED_CONSERVATIVE => { + self.occlusion_query.take() + }, + constants::TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN => { + self.primitives_query.take() + }, + _ => { + self.base.webgl_error(InvalidEnum); + return; + }, + }; + match active_query { + None => self.base.webgl_error(InvalidOperation), + Some(query) => { + let result = query.end(&self.base, target); + if let Err(error) = result { + self.base.webgl_error(error); + } + }, + } + } + + /// https://www.khronos.org/registry/webgl/specs/latest/2.0/#3.7.12 + #[cfg_attr(rustfmt, rustfmt_skip)] + fn GetQuery(&self, target: u32, pname: u32) -> Option> { + if pname != constants::CURRENT_QUERY { + self.base.webgl_error(InvalidEnum); + return None; + } + let active_query = match target { + constants::ANY_SAMPLES_PASSED | + constants::ANY_SAMPLES_PASSED_CONSERVATIVE => { + self.occlusion_query.get() + }, + constants::TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN => { + self.primitives_query.get() + }, + _ => { + self.base.webgl_error(InvalidEnum); + None + }, + }; + if let Some(query) = active_query.as_ref() { + if query.target() != Some(target) { + return None; + } + } + active_query + } + + /// https://www.khronos.org/registry/webgl/specs/latest/2.0/#3.7.12 + #[cfg_attr(rustfmt, rustfmt_skip)] + fn GetQueryParameter(&self, _cx: JSContext, query: &WebGLQuery, pname: u32) -> JSVal { + handle_potential_webgl_error!( + self.base, + self.base.validate_ownership(query), + return NullValue() + ); + match query.get_parameter(&self.base, pname) { + Ok(value) => match pname { + constants::QUERY_RESULT => UInt32Value(value), + constants::QUERY_RESULT_AVAILABLE => BooleanValue(value != 0), + _ => unreachable!(), + }, + Err(error) => { + self.base.webgl_error(error); + NullValue() + }, + } + } } impl LayoutCanvasWebGLRenderingContextHelpers for LayoutDom { -- cgit v1.2.3 From 248545ddda503e06bc59b5274c63a6c25da4b355 Mon Sep 17 00:00:00 2001 From: Istvan Miklos Date: Mon, 16 Sep 2019 10:21:50 +0200 Subject: Initial implementation of WebGLSync This patch adds initial support for WebGLSync. Note: There is no test for the isSync, deleteSync and waitSync functions in the `conformance2/sync/sync-webgl-specific.html`. --- components/script/dom/webgl2renderingcontext.rs | 132 +++++++++++++++++++++++- 1 file changed, 128 insertions(+), 4 deletions(-) (limited to 'components/script/dom/webgl2renderingcontext.rs') diff --git a/components/script/dom/webgl2renderingcontext.rs b/components/script/dom/webgl2renderingcontext.rs index f33b10f7931..ec959177d32 100644 --- a/components/script/dom/webgl2renderingcontext.rs +++ b/components/script/dom/webgl2renderingcontext.rs @@ -28,17 +28,18 @@ use crate::dom::webglrenderingcontext::{ }; use crate::dom::webglshader::WebGLShader; use crate::dom::webglshaderprecisionformat::WebGLShaderPrecisionFormat; +use crate::dom::webglsync::WebGLSync; use crate::dom::webgltexture::WebGLTexture; use crate::dom::webgluniformlocation::WebGLUniformLocation; use crate::dom::window::Window; use crate::script_runtime::JSContext; -/// https://www.khronos.org/registry/webgl/specs/latest/2.0/webgl.idl use canvas_traits::webgl::WebGLError::*; -use canvas_traits::webgl::{GLContextAttributes, WebGLVersion}; +/// https://www.khronos.org/registry/webgl/specs/latest/2.0/webgl.idl +use canvas_traits::webgl::{webgl_channel, GLContextAttributes, WebGLCommand, WebGLVersion}; use dom_struct::dom_struct; use euclid::default::Size2D; use js::jsapi::JSObject; -use js::jsval::{BooleanValue, JSVal, NullValue, UInt32Value}; +use js::jsval::{BooleanValue, Int32Value, JSVal, NullValue, UInt32Value}; use js::rust::CustomAutoRooterGuard; use js::typedarray::ArrayBufferView; use script_layout_interface::HTMLCanvasDataSource; @@ -125,7 +126,12 @@ impl WebGL2RenderingContextMethods for WebGL2RenderingContext { #[allow(unsafe_code)] /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.3 fn GetParameter(&self, cx: JSContext, parameter: u32) -> JSVal { - self.base.GetParameter(cx, parameter) + match parameter { + constants::MAX_CLIENT_WAIT_TIMEOUT_WEBGL => { + Int32Value(self.base.limits().max_client_wait_timeout_webgl.as_nanos() as i32) + }, + _ => self.base.GetParameter(cx, parameter), + } } /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.8 @@ -1197,6 +1203,124 @@ impl WebGL2RenderingContextMethods for WebGL2RenderingContext { }, } } + + /// https://www.khronos.org/registry/webgl/specs/latest/2.0/#3.7.14 + fn FenceSync(&self, condition: u32, flags: u32) -> Option> { + if flags != 0 { + self.base.webgl_error(InvalidValue); + return None; + } + if condition != constants::SYNC_GPU_COMMANDS_COMPLETE { + self.base.webgl_error(InvalidEnum); + return None; + } + + Some(WebGLSync::new(&self.base)) + } + + /// https://www.khronos.org/registry/webgl/specs/latest/2.0/#3.7.14 + fn IsSync(&self, sync: Option<&WebGLSync>) -> bool { + match sync { + Some(sync) => { + if !sync.is_valid() { + return false; + } + handle_potential_webgl_error!( + self.base, + self.base.validate_ownership(sync), + return false + ); + let (sender, receiver) = webgl_channel().unwrap(); + self.base + .send_command(WebGLCommand::IsSync(sync.id(), sender)); + receiver.recv().unwrap() + }, + None => false, + } + } + + /// https://www.khronos.org/registry/webgl/specs/latest/2.0/#3.7.14 + fn ClientWaitSync(&self, sync: &WebGLSync, flags: u32, timeout: u64) -> u32 { + if !sync.is_valid() { + self.base.webgl_error(InvalidOperation); + return constants::WAIT_FAILED; + } + handle_potential_webgl_error!( + self.base, + self.base.validate_ownership(sync), + return constants::WAIT_FAILED + ); + if flags != 0 && flags != constants::SYNC_FLUSH_COMMANDS_BIT { + self.base.webgl_error(InvalidValue); + return constants::WAIT_FAILED; + } + if timeout > self.base.limits().max_client_wait_timeout_webgl.as_nanos() as u64 { + self.base.webgl_error(InvalidOperation); + return constants::WAIT_FAILED; + } + + match sync.client_wait_sync(&self.base, flags, timeout) { + Some(status) => status, + None => constants::WAIT_FAILED, + } + } + + /// https://www.khronos.org/registry/webgl/specs/latest/2.0/#3.7.14 + fn WaitSync(&self, sync: &WebGLSync, flags: u32, timeout: i64) { + if !sync.is_valid() { + self.base.webgl_error(InvalidOperation); + return; + } + handle_potential_webgl_error!(self.base, self.base.validate_ownership(sync), return); + if flags != 0 { + self.base.webgl_error(InvalidValue); + return; + } + if timeout != constants::TIMEOUT_IGNORED { + self.base.webgl_error(InvalidValue); + return; + } + + self.base + .send_command(WebGLCommand::WaitSync(sync.id(), flags, timeout)); + } + + /// https://www.khronos.org/registry/webgl/specs/latest/2.0/#3.7.14 + fn GetSyncParameter(&self, _cx: JSContext, sync: &WebGLSync, pname: u32) -> JSVal { + if !sync.is_valid() { + self.base.webgl_error(InvalidOperation); + return NullValue(); + } + handle_potential_webgl_error!( + self.base, + self.base.validate_ownership(sync), + return NullValue() + ); + match pname { + constants::OBJECT_TYPE | constants::SYNC_CONDITION | constants::SYNC_FLAGS => { + let (sender, receiver) = webgl_channel().unwrap(); + self.base + .send_command(WebGLCommand::GetSyncParameter(sync.id(), pname, sender)); + UInt32Value(receiver.recv().unwrap()) + }, + constants::SYNC_STATUS => match sync.get_sync_status(pname, &self.base) { + Some(status) => UInt32Value(status), + None => UInt32Value(constants::UNSIGNALED), + }, + _ => { + self.base.webgl_error(InvalidEnum); + NullValue() + }, + } + } + + /// https://www.khronos.org/registry/webgl/specs/latest/2.0/#3.7.14 + fn DeleteSync(&self, sync: Option<&WebGLSync>) { + if let Some(sync) = sync { + handle_potential_webgl_error!(self.base, self.base.validate_ownership(sync), return); + sync.delete(false); + } + } } impl LayoutCanvasWebGLRenderingContextHelpers for LayoutDom { -- cgit v1.2.3 From 26df1962c38421251a998b8acc7d6652116d4866 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=C3=A1ty=C3=A1s=20Mustoha?= Date: Fri, 4 Oct 2019 11:22:07 +0200 Subject: Add WebGLSampler support Reference: https://www.khronos.org/registry/webgl/specs/latest/2.0/#3.7.13 --- components/script/dom/webgl2renderingcontext.rs | 101 +++++++++++++++++++++++- 1 file changed, 100 insertions(+), 1 deletion(-) (limited to 'components/script/dom/webgl2renderingcontext.rs') diff --git a/components/script/dom/webgl2renderingcontext.rs b/components/script/dom/webgl2renderingcontext.rs index ec959177d32..63cfd0bc530 100644 --- a/components/script/dom/webgl2renderingcontext.rs +++ b/components/script/dom/webgl2renderingcontext.rs @@ -11,6 +11,7 @@ use crate::dom::bindings::codegen::UnionTypes::ArrayBufferViewOrArrayBuffer; use crate::dom::bindings::codegen::UnionTypes::Float32ArrayOrUnrestrictedFloatSequence; use crate::dom::bindings::codegen::UnionTypes::ImageDataOrHTMLImageElementOrHTMLCanvasElementOrHTMLVideoElement; use crate::dom::bindings::codegen::UnionTypes::Int32ArrayOrLongSequence; +use crate::dom::bindings::conversions::ToJSValConvertible; use crate::dom::bindings::error::{ErrorResult, Fallible}; use crate::dom::bindings::reflector::{reflect_dom_object, Reflector}; use crate::dom::bindings::root::{Dom, DomRoot, LayoutDom, MutNullableDom}; @@ -26,6 +27,7 @@ use crate::dom::webglrenderbuffer::WebGLRenderbuffer; use crate::dom::webglrenderingcontext::{ LayoutCanvasWebGLRenderingContextHelpers, WebGLRenderingContext, }; +use crate::dom::webglsampler::{WebGLSampler, WebGLSamplerValue}; use crate::dom::webglshader::WebGLShader; use crate::dom::webglshaderprecisionformat::WebGLShaderPrecisionFormat; use crate::dom::webglsync::WebGLSync; @@ -39,7 +41,7 @@ use canvas_traits::webgl::{webgl_channel, GLContextAttributes, WebGLCommand, Web use dom_struct::dom_struct; use euclid::default::Size2D; use js::jsapi::JSObject; -use js::jsval::{BooleanValue, Int32Value, JSVal, NullValue, UInt32Value}; +use js::jsval::{BooleanValue, DoubleValue, Int32Value, JSVal, NullValue, UInt32Value}; use js::rust::CustomAutoRooterGuard; use js::typedarray::ArrayBufferView; use script_layout_interface::HTMLCanvasDataSource; @@ -51,6 +53,7 @@ pub struct WebGL2RenderingContext { base: Dom, occlusion_query: MutNullableDom, primitives_query: MutNullableDom, + samplers: Box<[MutNullableDom]>, } impl WebGL2RenderingContext { @@ -61,11 +64,18 @@ impl WebGL2RenderingContext { attrs: GLContextAttributes, ) -> Option { let base = WebGLRenderingContext::new(window, canvas, WebGLVersion::WebGL2, size, attrs)?; + + let samplers = (0..base.limits().max_combined_texture_image_units) + .map(|_| Default::default()) + .collect::>() + .into(); + Some(WebGL2RenderingContext { reflector_: Reflector::new(), base: Dom::from_ref(&*base), occlusion_query: MutNullableDom::new(None), primitives_query: MutNullableDom::new(None), + samplers: samplers, }) } @@ -130,6 +140,12 @@ impl WebGL2RenderingContextMethods for WebGL2RenderingContext { constants::MAX_CLIENT_WAIT_TIMEOUT_WEBGL => { Int32Value(self.base.limits().max_client_wait_timeout_webgl.as_nanos() as i32) }, + constants::SAMPLER_BINDING => unsafe { + let idx = (self.base.textures().active_unit_enum() - constants::TEXTURE0) as usize; + assert!(idx < self.samplers.len()); + let sampler = self.samplers[idx].get(); + optional_root_object_to_js_or_null!(*cx, sampler) + }, _ => self.base.GetParameter(cx, parameter), } } @@ -1099,6 +1115,32 @@ impl WebGL2RenderingContextMethods for WebGL2RenderingContext { } } + /// https://www.khronos.org/registry/webgl/specs/latest/2.0/#3.7.13 + fn CreateSampler(&self) -> Option> { + Some(WebGLSampler::new(&self.base)) + } + + /// https://www.khronos.org/registry/webgl/specs/latest/2.0/#3.7.13 + fn DeleteSampler(&self, sampler: Option<&WebGLSampler>) { + if let Some(sampler) = sampler { + handle_potential_webgl_error!(self.base, self.base.validate_ownership(sampler), return); + for slot in self.samplers.iter() { + if slot.get().map_or(false, |s| sampler == &*s) { + slot.set(None); + } + } + sampler.delete(false); + } + } + + /// https://www.khronos.org/registry/webgl/specs/latest/2.0/#3.7.13 + fn IsSampler(&self, sampler: Option<&WebGLSampler>) -> bool { + match sampler { + Some(sampler) => self.base.validate_ownership(sampler).is_ok() && sampler.is_valid(), + None => false, + } + } + /// https://www.khronos.org/registry/webgl/specs/latest/2.0/#3.7.12 #[cfg_attr(rustfmt, rustfmt_skip)] fn BeginQuery(&self, target: u32, query: &WebGLQuery) { @@ -1321,6 +1363,63 @@ impl WebGL2RenderingContextMethods for WebGL2RenderingContext { sync.delete(false); } } + + /// https://www.khronos.org/registry/webgl/specs/latest/2.0/#3.7.13 + fn BindSampler(&self, unit: u32, sampler: Option<&WebGLSampler>) { + if let Some(sampler) = sampler { + handle_potential_webgl_error!(self.base, self.base.validate_ownership(sampler), return); + + if unit as usize >= self.samplers.len() { + self.base.webgl_error(InvalidValue); + return; + } + + let result = sampler.bind(&self.base, unit); + match result { + Ok(_) => self.samplers[unit as usize].set(Some(sampler)), + Err(error) => self.base.webgl_error(error), + } + } + } + + /// https://www.khronos.org/registry/webgl/specs/latest/2.0/#3.7.13 + fn SamplerParameteri(&self, sampler: &WebGLSampler, pname: u32, param: i32) { + handle_potential_webgl_error!(self.base, self.base.validate_ownership(sampler), return); + let param = WebGLSamplerValue::GLenum(param as u32); + let result = sampler.set_parameter(&self.base, pname, param); + if let Err(error) = result { + self.base.webgl_error(error); + } + } + + /// https://www.khronos.org/registry/webgl/specs/latest/2.0/#3.7.13 + fn SamplerParameterf(&self, sampler: &WebGLSampler, pname: u32, param: f32) { + handle_potential_webgl_error!(self.base, self.base.validate_ownership(sampler), return); + let param = WebGLSamplerValue::Float(param); + let result = sampler.set_parameter(&self.base, pname, param); + if let Err(error) = result { + self.base.webgl_error(error); + } + } + + /// https://www.khronos.org/registry/webgl/specs/latest/2.0/#3.7.13 + fn GetSamplerParameter(&self, _cx: JSContext, sampler: &WebGLSampler, pname: u32) -> JSVal { + handle_potential_webgl_error!( + self.base, + self.base.validate_ownership(sampler), + return NullValue() + ); + match sampler.get_parameter(&self.base, pname) { + Ok(value) => match value { + WebGLSamplerValue::GLenum(value) => UInt32Value(value), + WebGLSamplerValue::Float(value) => DoubleValue(value as f64), + }, + Err(error) => { + self.base.webgl_error(error); + NullValue() + }, + } + } } impl LayoutCanvasWebGLRenderingContextHelpers for LayoutDom { -- cgit v1.2.3 From a358bca7667a2da42024aca4ef619dad6d812862 Mon Sep 17 00:00:00 2001 From: Patrick Walton Date: Tue, 15 Oct 2019 12:57:00 -0500 Subject: Use surfman for managing GL surfaces Co-authored-by: Alan Jeffrey Co-authored-by: Zakor Gyula Co-authored-by: Josh Matthews --- components/script/dom/webgl2renderingcontext.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'components/script/dom/webgl2renderingcontext.rs') diff --git a/components/script/dom/webgl2renderingcontext.rs b/components/script/dom/webgl2renderingcontext.rs index 63cfd0bc530..4c7d9fb857a 100644 --- a/components/script/dom/webgl2renderingcontext.rs +++ b/components/script/dom/webgl2renderingcontext.rs @@ -1426,6 +1426,6 @@ impl LayoutCanvasWebGLRenderingContextHelpers for LayoutDom HTMLCanvasDataSource { let this = &*self.unsafe_get(); - HTMLCanvasDataSource::WebGL((*this.base.to_layout().unsafe_get()).layout_handle()) + (*this.base.to_layout().unsafe_get()).layout_handle() } } -- cgit v1.2.3 From 4050b7f9eca4c581d100fed778fa09f21d7e09dd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=C3=A1ty=C3=A1s=20Mustoha?= Date: Thu, 17 Oct 2019 11:34:06 +0200 Subject: Implement the basic WebGL2 buffer data operations Adds support for `bufferData`, `bufferSubData`, `copyBufferSubData` and `getBufferSubData`. Reference: https://www.khronos.org/registry/webgl/specs/latest/2.0/#3.7.3 --- components/script/dom/webgl2renderingcontext.rs | 317 +++++++++++++++++++++++- 1 file changed, 309 insertions(+), 8 deletions(-) (limited to 'components/script/dom/webgl2renderingcontext.rs') diff --git a/components/script/dom/webgl2renderingcontext.rs b/components/script/dom/webgl2renderingcontext.rs index 4c7d9fb857a..beff6ec6bfd 100644 --- a/components/script/dom/webgl2renderingcontext.rs +++ b/components/script/dom/webgl2renderingcontext.rs @@ -36,11 +36,13 @@ use crate::dom::webgluniformlocation::WebGLUniformLocation; use crate::dom::window::Window; use crate::script_runtime::JSContext; use canvas_traits::webgl::WebGLError::*; -/// https://www.khronos.org/registry/webgl/specs/latest/2.0/webgl.idl -use canvas_traits::webgl::{webgl_channel, GLContextAttributes, WebGLCommand, WebGLVersion}; +use canvas_traits::webgl::{ + webgl_channel, GLContextAttributes, WebGLCommand, WebGLResult, WebGLVersion, +}; use dom_struct::dom_struct; use euclid::default::Size2D; -use js::jsapi::JSObject; +use ipc_channel::ipc; +use js::jsapi::{JSObject, Type}; use js::jsval::{BooleanValue, DoubleValue, Int32Value, JSVal, NullValue, UInt32Value}; use js::rust::CustomAutoRooterGuard; use js::typedarray::ArrayBufferView; @@ -54,6 +56,22 @@ pub struct WebGL2RenderingContext { occlusion_query: MutNullableDom, primitives_query: MutNullableDom, samplers: Box<[MutNullableDom]>, + bound_copy_read_buffer: MutNullableDom, + bound_copy_write_buffer: MutNullableDom, + bound_pixel_pack_buffer: MutNullableDom, + bound_pixel_unpack_buffer: MutNullableDom, + bound_transform_feedback_buffer: MutNullableDom, + bound_uniform_buffer: MutNullableDom, +} + +fn typedarray_elem_size(typeid: Type) -> usize { + match typeid { + Type::Int8 | Type::Uint8 | Type::Uint8Clamped => 1, + Type::Int16 | Type::Uint16 => 2, + Type::Int32 | Type::Uint32 | Type::Float32 => 4, + Type::Int64 | Type::Float64 => 8, + Type::MaxTypedArrayViewType => unreachable!(), + } } impl WebGL2RenderingContext { @@ -76,6 +94,12 @@ impl WebGL2RenderingContext { occlusion_query: MutNullableDom::new(None), primitives_query: MutNullableDom::new(None), samplers: samplers, + bound_copy_read_buffer: MutNullableDom::new(None), + bound_copy_write_buffer: MutNullableDom::new(None), + bound_pixel_pack_buffer: MutNullableDom::new(None), + bound_pixel_unpack_buffer: MutNullableDom::new(None), + bound_transform_feedback_buffer: MutNullableDom::new(None), + bound_uniform_buffer: MutNullableDom::new(None), }) } @@ -100,6 +124,25 @@ impl WebGL2RenderingContext { pub fn base_context(&self) -> DomRoot { DomRoot::from_ref(&*self.base) } + + fn bound_buffer(&self, target: u32) -> WebGLResult>> { + match target { + constants::COPY_READ_BUFFER => Ok(self.bound_copy_read_buffer.get()), + constants::COPY_WRITE_BUFFER => Ok(self.bound_copy_write_buffer.get()), + constants::PIXEL_PACK_BUFFER => Ok(self.bound_pixel_pack_buffer.get()), + constants::PIXEL_UNPACK_BUFFER => Ok(self.bound_pixel_unpack_buffer.get()), + constants::TRANSFORM_FEEDBACK_BUFFER => Ok(self.bound_transform_feedback_buffer.get()), + constants::UNIFORM_BUFFER => Ok(self.bound_uniform_buffer.get()), + _ => self.base.bound_buffer(target), + } + } + + fn unbind_from(&self, slot: &MutNullableDom, buffer: &WebGLBuffer) { + if slot.get().map_or(false, |b| buffer == &*b) { + buffer.decrement_attached_counter(); + slot.set(None); + } + } } impl WebGL2RenderingContextMethods for WebGL2RenderingContext { @@ -146,6 +189,27 @@ impl WebGL2RenderingContextMethods for WebGL2RenderingContext { let sampler = self.samplers[idx].get(); optional_root_object_to_js_or_null!(*cx, sampler) }, + constants::COPY_READ_BUFFER_BINDING => unsafe { + optional_root_object_to_js_or_null!(*cx, &self.bound_copy_read_buffer.get()) + }, + constants::COPY_WRITE_BUFFER_BINDING => unsafe { + optional_root_object_to_js_or_null!(*cx, &self.bound_copy_write_buffer.get()) + }, + constants::PIXEL_PACK_BUFFER_BINDING => unsafe { + optional_root_object_to_js_or_null!(*cx, &self.bound_pixel_pack_buffer.get()) + }, + constants::PIXEL_UNPACK_BUFFER_BINDING => unsafe { + optional_root_object_to_js_or_null!(*cx, &self.bound_pixel_unpack_buffer.get()) + }, + constants::TRANSFORM_FEEDBACK_BUFFER_BINDING => unsafe { + optional_root_object_to_js_or_null!( + *cx, + &self.bound_transform_feedback_buffer.get() + ) + }, + constants::UNIFORM_BUFFER_BINDING => unsafe { + optional_root_object_to_js_or_null!(*cx, &self.bound_uniform_buffer.get()) + }, _ => self.base.GetParameter(cx, parameter), } } @@ -238,9 +302,18 @@ impl WebGL2RenderingContextMethods for WebGL2RenderingContext { self.base.BindAttribLocation(program, index, name) } - /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.5 + /// https://www.khronos.org/registry/webgl/specs/latest/2.0/#3.7.2 fn BindBuffer(&self, target: u32, buffer: Option<&WebGLBuffer>) { - self.base.BindBuffer(target, buffer) + let slot = match target { + constants::COPY_READ_BUFFER => &self.bound_copy_read_buffer, + constants::COPY_WRITE_BUFFER => &self.bound_copy_write_buffer, + constants::PIXEL_PACK_BUFFER => &self.bound_pixel_pack_buffer, + constants::PIXEL_UNPACK_BUFFER => &self.bound_pixel_unpack_buffer, + constants::TRANSFORM_FEEDBACK_BUFFER => &self.bound_transform_feedback_buffer, + constants::UNIFORM_BUFFER => &self.bound_uniform_buffer, + _ => return self.base.BindBuffer(target, buffer), + }; + self.base.bind_buffer_maybe(&slot, target, buffer); } /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.6 @@ -265,12 +338,59 @@ impl WebGL2RenderingContextMethods for WebGL2RenderingContext { /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.5 fn BufferData(&self, target: u32, data: Option, usage: u32) { - self.base.BufferData(target, data, usage) + let bound_buffer = + handle_potential_webgl_error!(self.base, self.bound_buffer(target), return); + self.base.buffer_data(target, data, usage, bound_buffer) } /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.5 fn BufferData_(&self, target: u32, size: i64, usage: u32) { - self.base.BufferData_(target, size, usage) + let bound_buffer = + handle_potential_webgl_error!(self.base, self.bound_buffer(target), return); + self.base.buffer_data_(target, size, usage, bound_buffer) + } + + /// https://www.khronos.org/registry/webgl/specs/latest/2.0/#3.7.3 + #[allow(unsafe_code)] + fn BufferData__( + &self, + target: u32, + data: CustomAutoRooterGuard, + usage: u32, + elem_offset: u32, + length: u32, + ) { + let bound_buffer = + handle_potential_webgl_error!(self.base, self.bound_buffer(target), return); + let bound_buffer = + handle_potential_webgl_error!(self.base, bound_buffer.ok_or(InvalidOperation), return); + + let elem_size = typedarray_elem_size(data.get_array_type()); + let elem_count = data.len() / elem_size; + let elem_offset = elem_offset as usize; + let byte_offset = elem_offset * elem_size; + + if byte_offset > data.len() { + return self.base.webgl_error(InvalidValue); + } + + let copy_count = if length == 0 { + elem_count - elem_offset + } else { + length as usize + }; + if copy_count == 0 { + return; + } + let copy_bytes = copy_count * elem_size; + + if byte_offset + copy_bytes > data.len() { + return self.base.webgl_error(InvalidValue); + } + + let data_end = byte_offset + copy_bytes; + let data: &[u8] = unsafe { &data.as_slice()[byte_offset..data_end] }; + handle_potential_webgl_error!(self.base, bound_buffer.buffer_data(target, &data, usage)); } /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.5 @@ -278,6 +398,171 @@ impl WebGL2RenderingContextMethods for WebGL2RenderingContext { self.base.BufferSubData(target, offset, data) } + /// https://www.khronos.org/registry/webgl/specs/latest/2.0/#3.7.3 + #[allow(unsafe_code)] + fn BufferSubData_( + &self, + target: u32, + dst_byte_offset: i64, + src_data: CustomAutoRooterGuard, + src_elem_offset: u32, + length: u32, + ) { + let bound_buffer = + handle_potential_webgl_error!(self.base, self.bound_buffer(target), return); + let bound_buffer = + handle_potential_webgl_error!(self.base, bound_buffer.ok_or(InvalidOperation), return); + + let src_elem_size = typedarray_elem_size(src_data.get_array_type()); + let src_elem_count = src_data.len() / src_elem_size; + let src_elem_offset = src_elem_offset as usize; + let src_byte_offset = src_elem_offset * src_elem_size; + + if dst_byte_offset < 0 || src_byte_offset > src_data.len() { + return self.base.webgl_error(InvalidValue); + } + + let copy_count = if length == 0 { + src_elem_count - src_elem_offset + } else { + length as usize + }; + if copy_count == 0 { + return; + } + let copy_bytes = copy_count * src_elem_size; + + let dst_byte_offset = dst_byte_offset as usize; + if dst_byte_offset + copy_bytes > bound_buffer.capacity() || + src_byte_offset + copy_bytes > src_data.len() + { + return self.base.webgl_error(InvalidValue); + } + + let (sender, receiver) = ipc::bytes_channel().unwrap(); + self.base.send_command(WebGLCommand::BufferSubData( + target, + dst_byte_offset as isize, + receiver, + )); + let src_end = src_byte_offset + copy_bytes; + let data: &[u8] = unsafe { &src_data.as_slice()[src_byte_offset..src_end] }; + sender.send(data).unwrap(); + } + + /// https://www.khronos.org/registry/webgl/specs/latest/2.0/#3.7.3 + fn CopyBufferSubData( + &self, + read_target: u32, + write_target: u32, + read_offset: i64, + write_offset: i64, + size: i64, + ) { + if read_offset < 0 || write_offset < 0 || size < 0 { + return self.base.webgl_error(InvalidValue); + } + + let read_buffer = + handle_potential_webgl_error!(self.base, self.bound_buffer(read_target), return); + let read_buffer = + handle_potential_webgl_error!(self.base, read_buffer.ok_or(InvalidOperation), return); + + let write_buffer = + handle_potential_webgl_error!(self.base, self.bound_buffer(write_target), return); + let write_buffer = + handle_potential_webgl_error!(self.base, write_buffer.ok_or(InvalidOperation), return); + + let read_until = read_offset + size; + let write_until = write_offset + size; + if read_until as usize > read_buffer.capacity() || + write_until as usize > write_buffer.capacity() + { + return self.base.webgl_error(InvalidValue); + } + + if read_target == write_target { + let is_separate = read_until <= write_offset || write_until <= read_offset; + if !is_separate { + return self.base.webgl_error(InvalidValue); + } + } + let src_is_elemarray = read_buffer + .target() + .map_or(false, |t| t == constants::ELEMENT_ARRAY_BUFFER); + let dst_is_elemarray = write_buffer + .target() + .map_or(false, |t| t == constants::ELEMENT_ARRAY_BUFFER); + if src_is_elemarray != dst_is_elemarray { + return self.base.webgl_error(InvalidOperation); + } + + self.base.send_command(WebGLCommand::CopyBufferSubData( + read_target, + write_target, + read_offset, + write_offset, + size, + )); + } + + /// https://www.khronos.org/registry/webgl/specs/latest/2.0/#3.7.3 + #[allow(unsafe_code)] + fn GetBufferSubData( + &self, + target: u32, + src_byte_offset: i64, + mut dst_buffer: CustomAutoRooterGuard, + dst_elem_offset: u32, + length: u32, + ) { + let bound_buffer = + handle_potential_webgl_error!(self.base, self.bound_buffer(target), return); + let bound_buffer = + handle_potential_webgl_error!(self.base, bound_buffer.ok_or(InvalidOperation), return); + + let dst_elem_size = typedarray_elem_size(dst_buffer.get_array_type()); + let dst_elem_count = dst_buffer.len() / dst_elem_size; + let dst_elem_offset = dst_elem_offset as usize; + let dst_byte_offset = dst_elem_offset * dst_elem_size; + + if src_byte_offset < 0 || dst_byte_offset > dst_buffer.len() { + return self.base.webgl_error(InvalidValue); + } + + let copy_count = if length == 0 { + dst_elem_count - dst_elem_offset + } else { + length as usize + }; + if copy_count == 0 { + return; + } + let copy_bytes = copy_count * dst_elem_size; + + // TODO(mmatyas): Transform Feedback + + let src_byte_offset = src_byte_offset as usize; + if src_byte_offset + copy_bytes > bound_buffer.capacity() || + dst_byte_offset + copy_bytes > dst_buffer.len() + { + return self.base.webgl_error(InvalidValue); + } + + let (sender, receiver) = ipc::bytes_channel().unwrap(); + self.base.send_command(WebGLCommand::GetBufferSubData( + target, + src_byte_offset, + copy_bytes, + sender, + )); + let data = receiver.recv().unwrap(); + let dst_end = dst_byte_offset + copy_bytes; + unsafe { + dst_buffer.as_mut_slice()[dst_byte_offset..dst_end].copy_from_slice(&data); + } + } + /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.8 fn CompressedTexImage2D( &self, @@ -445,7 +730,23 @@ impl WebGL2RenderingContextMethods for WebGL2RenderingContext { /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.5 fn DeleteBuffer(&self, buffer: Option<&WebGLBuffer>) { - self.base.DeleteBuffer(buffer) + let buffer = match buffer { + Some(buffer) => buffer, + None => return, + }; + handle_potential_webgl_error!(self.base, self.base.validate_ownership(buffer), return); + if buffer.is_marked_for_deletion() { + return; + } + self.base.current_vao().unbind_buffer(buffer); + self.unbind_from(&self.base.array_buffer_slot(), &buffer); + self.unbind_from(&self.bound_copy_read_buffer, &buffer); + self.unbind_from(&self.bound_copy_write_buffer, &buffer); + self.unbind_from(&self.bound_pixel_pack_buffer, &buffer); + self.unbind_from(&self.bound_pixel_unpack_buffer, &buffer); + self.unbind_from(&self.bound_transform_feedback_buffer, &buffer); + self.unbind_from(&self.bound_uniform_buffer, &buffer); + buffer.mark_for_deletion(false); } /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.6 -- cgit v1.2.3 From 4f112b1705c27ec07911429b12016feb3d588987 Mon Sep 17 00:00:00 2001 From: Istvan Miklos Date: Thu, 26 Sep 2019 11:55:20 +0200 Subject: Add Support for WebGL Transormfeedback Reference: https://www.khronos.org/registry/webgl/specs/latest/2.0/#3.7.15 --- components/script/dom/webgl2renderingcontext.rs | 234 +++++++++++++++++++++++- 1 file changed, 232 insertions(+), 2 deletions(-) (limited to 'components/script/dom/webgl2renderingcontext.rs') diff --git a/components/script/dom/webgl2renderingcontext.rs b/components/script/dom/webgl2renderingcontext.rs index beff6ec6bfd..d9a3e81b46a 100644 --- a/components/script/dom/webgl2renderingcontext.rs +++ b/components/script/dom/webgl2renderingcontext.rs @@ -11,8 +11,8 @@ use crate::dom::bindings::codegen::UnionTypes::ArrayBufferViewOrArrayBuffer; use crate::dom::bindings::codegen::UnionTypes::Float32ArrayOrUnrestrictedFloatSequence; use crate::dom::bindings::codegen::UnionTypes::ImageDataOrHTMLImageElementOrHTMLCanvasElementOrHTMLVideoElement; use crate::dom::bindings::codegen::UnionTypes::Int32ArrayOrLongSequence; -use crate::dom::bindings::conversions::ToJSValConvertible; use crate::dom::bindings::error::{ErrorResult, Fallible}; +use crate::dom::bindings::reflector::DomObject; use crate::dom::bindings::reflector::{reflect_dom_object, Reflector}; use crate::dom::bindings::root::{Dom, DomRoot, LayoutDom, MutNullableDom}; use crate::dom::bindings::str::DOMString; @@ -32,8 +32,10 @@ use crate::dom::webglshader::WebGLShader; use crate::dom::webglshaderprecisionformat::WebGLShaderPrecisionFormat; use crate::dom::webglsync::WebGLSync; use crate::dom::webgltexture::WebGLTexture; +use crate::dom::webgltransformfeedback::WebGLTransformFeedback; use crate::dom::webgluniformlocation::WebGLUniformLocation; use crate::dom::window::Window; +use crate::js::conversions::ToJSValConvertible; use crate::script_runtime::JSContext; use canvas_traits::webgl::WebGLError::*; use canvas_traits::webgl::{ @@ -62,6 +64,7 @@ pub struct WebGL2RenderingContext { bound_pixel_unpack_buffer: MutNullableDom, bound_transform_feedback_buffer: MutNullableDom, bound_uniform_buffer: MutNullableDom, + current_transform_feedback: MutNullableDom, } fn typedarray_elem_size(typeid: Type) -> usize { @@ -100,6 +103,7 @@ impl WebGL2RenderingContext { bound_pixel_unpack_buffer: MutNullableDom::new(None), bound_transform_feedback_buffer: MutNullableDom::new(None), bound_uniform_buffer: MutNullableDom::new(None), + current_transform_feedback: MutNullableDom::new(None), }) } @@ -210,6 +214,9 @@ impl WebGL2RenderingContextMethods for WebGL2RenderingContext { constants::UNIFORM_BUFFER_BINDING => unsafe { optional_root_object_to_js_or_null!(*cx, &self.bound_uniform_buffer.get()) }, + constants::TRANSFORM_FEEDBACK_BINDING => unsafe { + optional_root_object_to_js_or_null!(*cx, self.current_transform_feedback.get()) + }, _ => self.base.GetParameter(cx, parameter), } } @@ -824,7 +831,24 @@ impl WebGL2RenderingContextMethods for WebGL2RenderingContext { /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.9 fn GetProgramParameter(&self, cx: JSContext, program: &WebGLProgram, param_id: u32) -> JSVal { - self.base.GetProgramParameter(cx, program, param_id) + handle_potential_webgl_error!( + self.base, + self.base.validate_ownership(program), + return NullValue() + ); + if program.is_deleted() { + self.base.webgl_error(InvalidOperation); + return NullValue(); + } + match param_id { + constants::TRANSFORM_FEEDBACK_VARYINGS => { + Int32Value(program.transform_feedback_varyings_length()) + }, + constants::TRANSFORM_FEEDBACK_BUFFER_MODE => { + Int32Value(program.transform_feedback_buffer_mode()) + }, + _ => self.base.GetProgramParameter(cx, program, param_id), + } } /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.9 @@ -1721,6 +1745,212 @@ impl WebGL2RenderingContextMethods for WebGL2RenderingContext { }, } } + + /// https://www.khronos.org/registry/webgl/specs/latest/2.0/#3.7.15 + fn CreateTransformFeedback(&self) -> Option> { + Some(WebGLTransformFeedback::new(&self.base)) + } + + /// https://www.khronos.org/registry/webgl/specs/latest/2.0/#3.7.15 + fn DeleteTransformFeedback(&self, tf: Option<&WebGLTransformFeedback>) { + if let Some(tf) = tf { + handle_potential_webgl_error!(self.base, self.base.validate_ownership(tf), return); + if tf.is_active() { + self.base.webgl_error(InvalidOperation); + return; + } + tf.delete(false); + self.current_transform_feedback.set(None); + } + } + + /// https://www.khronos.org/registry/webgl/specs/latest/2.0/#3.7.15 + fn IsTransformFeedback(&self, tf: Option<&WebGLTransformFeedback>) -> bool { + match tf { + Some(tf) => { + if !tf.is_valid() { + return false; + } + handle_potential_webgl_error!( + self.base, + self.base.validate_ownership(tf), + return false + ); + let (sender, receiver) = webgl_channel().unwrap(); + self.base + .send_command(WebGLCommand::IsTransformFeedback(tf.id(), sender)); + receiver.recv().unwrap() + }, + None => false, + } + } + + /// https://www.khronos.org/registry/webgl/specs/latest/2.0/#3.7.15 + fn BindTransformFeedback(&self, target: u32, tf: Option<&WebGLTransformFeedback>) { + if target != constants::TRANSFORM_FEEDBACK { + self.base.webgl_error(InvalidEnum); + return; + } + match tf { + Some(transform_feedback) => { + handle_potential_webgl_error!( + self.base, + self.base.validate_ownership(transform_feedback), + return + ); + if !transform_feedback.is_valid() { + self.base.webgl_error(InvalidOperation); + return; + } + if let Some(current_tf) = self.current_transform_feedback.get() { + if current_tf.is_active() && !current_tf.is_paused() { + self.base.webgl_error(InvalidOperation); + return; + } + } + transform_feedback.bind(&self.base, target); + self.current_transform_feedback + .set(Some(transform_feedback)); + }, + None => self + .base + .send_command(WebGLCommand::BindTransformFeedback(target, 0)), + } + } + + /// https://www.khronos.org/registry/webgl/specs/latest/2.0/#3.7.15 + fn BeginTransformFeedback(&self, primitiveMode: u32) { + match primitiveMode { + constants::POINTS | constants::LINES | constants::TRIANGLES => {}, + _ => { + self.base.webgl_error(InvalidEnum); + return; + }, + }; + let current_tf = match self.current_transform_feedback.get() { + Some(current_tf) => current_tf, + None => { + self.base.webgl_error(InvalidOperation); + return; + }, + }; + if current_tf.is_active() { + self.base.webgl_error(InvalidOperation); + return; + }; + let program = match self.base.current_program() { + Some(program) => program, + None => { + self.base.webgl_error(InvalidOperation); + return; + }, + }; + if !program.is_linked() || program.transform_feedback_varyings_length() != 0 { + self.base.webgl_error(InvalidOperation); + return; + }; + current_tf.begin(&self.base, primitiveMode); + } + + /// https://www.khronos.org/registry/webgl/specs/latest/2.0/#3.7.15 + fn EndTransformFeedback(&self) { + if let Some(current_tf) = self.current_transform_feedback.get() { + if !current_tf.is_active() { + self.base.webgl_error(InvalidOperation); + return; + } + current_tf.end(&self.base); + } + } + + /// https://www.khronos.org/registry/webgl/specs/latest/2.0/#3.7.15 + fn ResumeTransformFeedback(&self) { + if let Some(current_tf) = self.current_transform_feedback.get() { + if !current_tf.is_active() || !current_tf.is_paused() { + self.base.webgl_error(InvalidOperation); + return; + } + current_tf.resume(&self.base); + } + } + + /// https://www.khronos.org/registry/webgl/specs/latest/2.0/#3.7.15 + fn PauseTransformFeedback(&self) { + if let Some(current_tf) = self.current_transform_feedback.get() { + if !current_tf.is_active() || current_tf.is_paused() { + self.base.webgl_error(InvalidOperation); + return; + } + current_tf.pause(&self.base); + } + } + + /// https://www.khronos.org/registry/webgl/specs/latest/2.0/#3.7.15 + fn TransformFeedbackVaryings( + &self, + program: &WebGLProgram, + varyings: Vec, + bufferMode: u32, + ) { + handle_potential_webgl_error!(self.base, program.validate(), return); + let strs = varyings + .iter() + .map(|name| String::from(name.to_owned())) + .collect::>(); + match bufferMode { + constants::INTERLEAVED_ATTRIBS => { + self.base + .send_command(WebGLCommand::TransformFeedbackVaryings( + program.id(), + strs, + bufferMode, + )); + }, + constants::SEPARATE_ATTRIBS => { + let max_tf_sp_att = + self.base.limits().max_transform_feedback_separate_attribs as usize; + if strs.len() >= max_tf_sp_att { + self.base.webgl_error(InvalidValue); + return; + } + self.base + .send_command(WebGLCommand::TransformFeedbackVaryings( + program.id(), + strs, + bufferMode, + )); + }, + _ => self.base.webgl_error(InvalidEnum), + } + } + + /// https://www.khronos.org/registry/webgl/specs/latest/2.0/#3.7.15 + fn GetTransformFeedbackVarying( + &self, + program: &WebGLProgram, + index: u32, + ) -> Option> { + handle_potential_webgl_error!(self.base, program.validate(), return None); + if index >= program.transform_feedback_varyings_length() as u32 { + self.base.webgl_error(InvalidValue); + return None; + } + + let (sender, receiver) = webgl_channel().unwrap(); + self.base + .send_command(WebGLCommand::GetTransformFeedbackVarying( + program.id(), + index, + sender, + )); + let (size, ty, name) = receiver.recv().unwrap(); + Some(WebGLActiveInfo::new( + self.base.global().as_window(), + size, + ty, + DOMString::from(name), + )) + } } impl LayoutCanvasWebGLRenderingContextHelpers for LayoutDom { -- cgit v1.2.3 From 8fefa230197452347a97554307f2629b07780916 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=C3=A1ty=C3=A1s=20Mustoha?= Date: Mon, 28 Oct 2019 13:12:41 +0100 Subject: Add support for WebGL2 ReadPixels functions Adds support for the new ReadPixels functions introduced with WebGL2 and the relevant PixelStorei parameters. Reference: https://www.khronos.org/registry/webgl/specs/latest/2.0/#3.7.10 --- components/script/dom/webgl2renderingcontext.rs | 367 +++++++++++++++++++++++- 1 file changed, 360 insertions(+), 7 deletions(-) (limited to 'components/script/dom/webgl2renderingcontext.rs') diff --git a/components/script/dom/webgl2renderingcontext.rs b/components/script/dom/webgl2renderingcontext.rs index d9a3e81b46a..2c63b775bb1 100644 --- a/components/script/dom/webgl2renderingcontext.rs +++ b/components/script/dom/webgl2renderingcontext.rs @@ -25,7 +25,7 @@ use crate::dom::webglprogram::WebGLProgram; use crate::dom::webglquery::WebGLQuery; use crate::dom::webglrenderbuffer::WebGLRenderbuffer; use crate::dom::webglrenderingcontext::{ - LayoutCanvasWebGLRenderingContextHelpers, WebGLRenderingContext, + LayoutCanvasWebGLRenderingContextHelpers, Size2DExt, WebGLRenderingContext, }; use crate::dom::webglsampler::{WebGLSampler, WebGLSamplerValue}; use crate::dom::webglshader::WebGLShader; @@ -42,13 +42,15 @@ use canvas_traits::webgl::{ webgl_channel, GLContextAttributes, WebGLCommand, WebGLResult, WebGLVersion, }; use dom_struct::dom_struct; -use euclid::default::Size2D; +use euclid::default::{Point2D, Rect, Size2D}; use ipc_channel::ipc; use js::jsapi::{JSObject, Type}; use js::jsval::{BooleanValue, DoubleValue, Int32Value, JSVal, NullValue, UInt32Value}; use js::rust::CustomAutoRooterGuard; use js::typedarray::ArrayBufferView; use script_layout_interface::HTMLCanvasDataSource; +use std::cell::Cell; +use std::cmp; use std::ptr::NonNull; #[dom_struct] @@ -65,6 +67,9 @@ pub struct WebGL2RenderingContext { bound_transform_feedback_buffer: MutNullableDom, bound_uniform_buffer: MutNullableDom, current_transform_feedback: MutNullableDom, + texture_pack_row_length: Cell, + texture_pack_skip_pixels: Cell, + texture_pack_skip_rows: Cell, } fn typedarray_elem_size(typeid: Type) -> usize { @@ -77,6 +82,17 @@ fn typedarray_elem_size(typeid: Type) -> usize { } } +struct ReadPixelsAllowedFormats<'a> { + array_types: &'a [Type], + channels: usize, +} + +struct ReadPixelsSizes { + row_stride: usize, + skipped_bytes: usize, + size: usize, +} + impl WebGL2RenderingContext { fn new_inherited( window: &Window, @@ -104,6 +120,9 @@ impl WebGL2RenderingContext { bound_transform_feedback_buffer: MutNullableDom::new(None), bound_uniform_buffer: MutNullableDom::new(None), current_transform_feedback: MutNullableDom::new(None), + texture_pack_row_length: Cell::new(0), + texture_pack_skip_pixels: Cell::new(0), + texture_pack_skip_rows: Cell::new(0), }) } @@ -147,6 +166,213 @@ impl WebGL2RenderingContext { slot.set(None); } } + + fn calc_read_pixel_formats( + &self, + pixel_type: u32, + format: u32, + ) -> WebGLResult { + let array_types = match pixel_type { + constants::BYTE => &[Type::Int8][..], + constants::SHORT => &[Type::Int16][..], + constants::INT => &[Type::Int32][..], + constants::UNSIGNED_BYTE => &[Type::Uint8, Type::Uint8Clamped][..], + constants::UNSIGNED_SHORT | + constants::UNSIGNED_SHORT_4_4_4_4 | + constants::UNSIGNED_SHORT_5_5_5_1 | + constants::UNSIGNED_SHORT_5_6_5 => &[Type::Uint16][..], + constants::UNSIGNED_INT | + constants::UNSIGNED_INT_2_10_10_10_REV | + constants::UNSIGNED_INT_10F_11F_11F_REV | + constants::UNSIGNED_INT_5_9_9_9_REV => &[Type::Uint32][..], + constants::FLOAT => &[Type::Float32][..], + constants::HALF_FLOAT => &[Type::Uint16][..], + _ => return Err(InvalidEnum), + }; + let channels = match format { + constants::ALPHA | constants::RED | constants::RED_INTEGER => 1, + constants::RG | constants::RG_INTEGER => 2, + constants::RGB | constants::RGB_INTEGER => 3, + constants::RGBA | constants::RGBA_INTEGER => 4, + _ => return Err(InvalidEnum), + }; + Ok(ReadPixelsAllowedFormats { + array_types, + channels, + }) + } + + fn calc_read_pixel_sizes( + &self, + width: i32, + height: i32, + bytes_per_pixel: usize, + ) -> WebGLResult { + if width < 0 || height < 0 { + return Err(InvalidValue); + } + + // See also https://www.khronos.org/registry/webgl/specs/latest/2.0/#5.36 + let pixels_per_row = if self.texture_pack_row_length.get() > 0 { + self.texture_pack_row_length.get() + } else { + width as usize + }; + if self.texture_pack_skip_pixels.get() + width as usize > pixels_per_row { + return Err(InvalidOperation); + } + + let bytes_per_row = pixels_per_row + .checked_mul(bytes_per_pixel) + .ok_or(InvalidOperation)?; + let row_padding_bytes = { + let pack_alignment = self.base.get_texture_packing_alignment() as usize; + match bytes_per_row % pack_alignment { + 0 => 0, + remainder => pack_alignment - remainder, + } + }; + let row_stride = bytes_per_row + row_padding_bytes; + let size = if width == 0 || height == 0 { + 0 + } else { + let full_row_bytes = row_stride + .checked_mul(height as usize - 1) + .ok_or(InvalidOperation)?; + let last_row_bytes = bytes_per_pixel + .checked_mul(width as usize) + .ok_or(InvalidOperation)?; + let result = full_row_bytes + .checked_add(last_row_bytes) + .ok_or(InvalidOperation)?; + result + }; + let skipped_bytes = { + let skipped_row_bytes = self + .texture_pack_skip_rows + .get() + .checked_mul(row_stride) + .ok_or(InvalidOperation)?; + let skipped_pixel_bytes = self + .texture_pack_skip_pixels + .get() + .checked_mul(bytes_per_pixel) + .ok_or(InvalidOperation)?; + let result = skipped_row_bytes + .checked_add(skipped_pixel_bytes) + .ok_or(InvalidOperation)?; + result + }; + Ok(ReadPixelsSizes { + row_stride, + skipped_bytes, + size, + }) + } + + #[allow(unsafe_code)] + fn read_pixels_into( + &self, + x: i32, + y: i32, + width: i32, + height: i32, + format: u32, + pixel_type: u32, + dst: &mut ArrayBufferView, + dst_elem_offset: u32, + ) { + handle_potential_webgl_error!(self.base, self.base.validate_framebuffer(), return); + + if self.bound_pixel_pack_buffer.get().is_some() { + return self.base.webgl_error(InvalidOperation); + } + + let dst_byte_offset = { + let dst_elem_size = typedarray_elem_size(dst.get_array_type()); + dst_elem_offset as usize * dst_elem_size + }; + if dst_byte_offset > dst.len() { + return self.base.webgl_error(InvalidValue); + } + + let dst_array_type = dst.get_array_type(); + let ReadPixelsAllowedFormats { + array_types: allowed_array_types, + channels, + } = match self.calc_read_pixel_formats(pixel_type, format) { + Ok(result) => result, + Err(error) => return self.base.webgl_error(error), + }; + if !allowed_array_types.contains(&dst_array_type) { + return self.base.webgl_error(InvalidOperation); + } + if format != constants::RGBA || pixel_type != constants::UNSIGNED_BYTE { + return self.base.webgl_error(InvalidOperation); + } + + let bytes_per_pixel = typedarray_elem_size(dst_array_type) * channels; + let ReadPixelsSizes { + row_stride, + skipped_bytes, + size, + } = match self.calc_read_pixel_sizes(width, height, bytes_per_pixel) { + Ok(result) => result, + Err(error) => return self.base.webgl_error(error), + }; + let dst_end = dst_byte_offset + skipped_bytes + size; + let dst_pixels = unsafe { dst.as_mut_slice() }; + if dst_pixels.len() < dst_end { + return self.base.webgl_error(InvalidOperation); + } + + let dst_byte_offset = { + let margin_left = cmp::max(0, -x) as usize; + let margin_top = cmp::max(0, -y) as usize; + dst_byte_offset + + skipped_bytes + + margin_left * bytes_per_pixel + + margin_top * row_stride + }; + let src_rect = { + let (fb_width, fb_height) = handle_potential_webgl_error!( + self.base, + self.base + .get_current_framebuffer_size() + .ok_or(InvalidOperation), + return + ); + let src_origin = Point2D::new(x, y); + let src_size = Size2D::new(width as u32, height as u32); + let fb_size = Size2D::new(fb_width as u32, fb_height as u32); + match pixels::clip(src_origin, src_size.to_u64(), fb_size.to_u64()) { + Some(rect) => rect.to_u32(), + None => return, + } + }; + let src_row_bytes = handle_potential_webgl_error!( + self.base, + src_rect + .size + .width + .checked_mul(bytes_per_pixel as u32) + .ok_or(InvalidOperation), + return + ); + + let (sender, receiver) = ipc::bytes_channel().unwrap(); + self.base.send_command(WebGLCommand::ReadPixels( + src_rect, format, pixel_type, sender, + )); + let src = receiver.recv().unwrap(); + + for i in 0..src_rect.size.height as usize { + let src_start = i * src_row_bytes as usize; + let dst_start = dst_byte_offset + i * row_stride; + dst_pixels[dst_start..dst_start + src_row_bytes as usize] + .copy_from_slice(&src[src_start..src_start + src_row_bytes as usize]); + } + } } impl WebGL2RenderingContextMethods for WebGL2RenderingContext { @@ -936,9 +1162,18 @@ impl WebGL2RenderingContextMethods for WebGL2RenderingContext { self.base.LineWidth(width) } - /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.3 + /// https://www.khronos.org/registry/webgl/specs/latest/2.0/#3.7.2 fn PixelStorei(&self, param_name: u32, param_value: i32) { - self.base.PixelStorei(param_name, param_value) + if param_value < 0 { + return self.base.webgl_error(InvalidValue); + } + + match param_name { + constants::PACK_ROW_LENGTH => self.texture_pack_row_length.set(param_value as _), + constants::PACK_SKIP_PIXELS => self.texture_pack_skip_pixels.set(param_value as _), + constants::PACK_SKIP_ROWS => self.texture_pack_skip_rows.set(param_value as _), + _ => self.base.PixelStorei(param_name, param_value), + } } /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.3 @@ -955,10 +1190,128 @@ impl WebGL2RenderingContextMethods for WebGL2RenderingContext { height: i32, format: u32, pixel_type: u32, - pixels: CustomAutoRooterGuard>, + mut pixels: CustomAutoRooterGuard>, ) { - self.base - .ReadPixels(x, y, width, height, format, pixel_type, pixels) + let pixels = + handle_potential_webgl_error!(self.base, pixels.as_mut().ok_or(InvalidValue), return); + + self.read_pixels_into(x, y, width, height, format, pixel_type, pixels, 0) + } + + /// https://www.khronos.org/registry/webgl/specs/latest/2.0/#3.7.10 + fn ReadPixels_( + &self, + x: i32, + y: i32, + width: i32, + height: i32, + format: u32, + pixel_type: u32, + dst_byte_offset: i64, + ) { + handle_potential_webgl_error!(self.base, self.base.validate_framebuffer(), return); + + let dst = match self.bound_pixel_pack_buffer.get() { + Some(buffer) => buffer, + None => return self.base.webgl_error(InvalidOperation), + }; + + if dst_byte_offset < 0 { + return self.base.webgl_error(InvalidValue); + } + let dst_byte_offset = dst_byte_offset as usize; + if dst_byte_offset > dst.capacity() { + return self.base.webgl_error(InvalidOperation); + } + + let ReadPixelsAllowedFormats { + array_types: _, + channels: bytes_per_pixel, + } = match self.calc_read_pixel_formats(pixel_type, format) { + Ok(result) => result, + Err(error) => return self.base.webgl_error(error), + }; + if format != constants::RGBA || pixel_type != constants::UNSIGNED_BYTE { + return self.base.webgl_error(InvalidOperation); + } + + let ReadPixelsSizes { + row_stride: _, + skipped_bytes, + size, + } = match self.calc_read_pixel_sizes(width, height, bytes_per_pixel) { + Ok(result) => result, + Err(error) => return self.base.webgl_error(error), + }; + let dst_end = dst_byte_offset + skipped_bytes + size; + if dst.capacity() < dst_end { + return self.base.webgl_error(InvalidOperation); + } + + { + let (fb_width, fb_height) = handle_potential_webgl_error!( + self.base, + self.base + .get_current_framebuffer_size() + .ok_or(InvalidOperation), + return + ); + let src_origin = Point2D::new(x, y); + let src_size = Size2D::new(width as u32, height as u32); + let fb_size = Size2D::new(fb_width as u32, fb_height as u32); + if pixels::clip(src_origin, src_size.to_u64(), fb_size.to_u64()).is_none() { + return; + } + } + let src_rect = Rect::new(Point2D::new(x, y), Size2D::new(width, height)); + + self.base.send_command(WebGLCommand::PixelStorei( + constants::PACK_ALIGNMENT, + self.base.get_texture_packing_alignment() as _, + )); + self.base.send_command(WebGLCommand::PixelStorei( + constants::PACK_ROW_LENGTH, + self.texture_pack_row_length.get() as _, + )); + self.base.send_command(WebGLCommand::PixelStorei( + constants::PACK_SKIP_ROWS, + self.texture_pack_skip_rows.get() as _, + )); + self.base.send_command(WebGLCommand::PixelStorei( + constants::PACK_SKIP_PIXELS, + self.texture_pack_skip_pixels.get() as _, + )); + self.base.send_command(WebGLCommand::ReadPixelsPP( + src_rect, + format, + pixel_type, + dst_byte_offset, + )); + } + + /// https://www.khronos.org/registry/webgl/specs/latest/2.0/#3.7.10 + #[allow(unsafe_code)] + fn ReadPixels__( + &self, + x: i32, + y: i32, + width: i32, + height: i32, + format: u32, + pixel_type: u32, + mut dst: CustomAutoRooterGuard, + dst_elem_offset: u32, + ) { + self.read_pixels_into( + x, + y, + width, + height, + format, + pixel_type, + &mut dst, + dst_elem_offset, + ) } /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.3 -- cgit v1.2.3 From da94f8d0e78546a40972596ad0ae4ded510057de Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=C3=A1ty=C3=A1s=20Mustoha?= Date: Mon, 25 Nov 2019 11:09:24 +0100 Subject: Add initial support for WebGL2 uniform buffer functions Adds initial support for the following WebGL2 calls: - bindBufferBase - bindBufferRange - getUniformIndices - getUniformBlockIndex - getActiveUniforms - getActiveUniformBlockParameter - getActiveUniformBlockName - uniformBlockBinding See: https://www.khronos.org/registry/webgl/specs/latest/2.0/#3.7.16 --- components/script/dom/webgl2renderingcontext.rs | 357 +++++++++++++++++++++++- 1 file changed, 342 insertions(+), 15 deletions(-) (limited to 'components/script/dom/webgl2renderingcontext.rs') diff --git a/components/script/dom/webgl2renderingcontext.rs b/components/script/dom/webgl2renderingcontext.rs index 2c63b775bb1..e8993f472d9 100644 --- a/components/script/dom/webgl2renderingcontext.rs +++ b/components/script/dom/webgl2renderingcontext.rs @@ -45,13 +45,14 @@ use dom_struct::dom_struct; use euclid::default::{Point2D, Rect, Size2D}; use ipc_channel::ipc; use js::jsapi::{JSObject, Type}; -use js::jsval::{BooleanValue, DoubleValue, Int32Value, JSVal, NullValue, UInt32Value}; +use js::jsval::{BooleanValue, DoubleValue, Int32Value, UInt32Value}; +use js::jsval::{JSVal, NullValue, ObjectValue, UndefinedValue}; use js::rust::CustomAutoRooterGuard; -use js::typedarray::ArrayBufferView; +use js::typedarray::{ArrayBufferView, CreateWith, Uint32Array}; use script_layout_interface::HTMLCanvasDataSource; use std::cell::Cell; use std::cmp; -use std::ptr::NonNull; +use std::ptr::{self, NonNull}; #[dom_struct] pub struct WebGL2RenderingContext { @@ -160,6 +161,18 @@ impl WebGL2RenderingContext { } } + pub fn buffer_usage(&self, usage: u32) -> WebGLResult { + match usage { + constants::STATIC_READ | + constants::DYNAMIC_READ | + constants::STREAM_READ | + constants::STATIC_COPY | + constants::DYNAMIC_COPY | + constants::STREAM_COPY => Ok(usage), + _ => self.base.buffer_usage(usage), + } + } + fn unbind_from(&self, slot: &MutNullableDom, buffer: &WebGLBuffer) { if slot.get().map_or(false, |b| buffer == &*b) { buffer.decrement_attached_counter(); @@ -411,40 +424,94 @@ impl WebGL2RenderingContextMethods for WebGL2RenderingContext { fn GetParameter(&self, cx: JSContext, parameter: u32) -> JSVal { match parameter { constants::MAX_CLIENT_WAIT_TIMEOUT_WEBGL => { - Int32Value(self.base.limits().max_client_wait_timeout_webgl.as_nanos() as i32) + return Int32Value( + self.base.limits().max_client_wait_timeout_webgl.as_nanos() as i32 + ); }, constants::SAMPLER_BINDING => unsafe { let idx = (self.base.textures().active_unit_enum() - constants::TEXTURE0) as usize; assert!(idx < self.samplers.len()); let sampler = self.samplers[idx].get(); - optional_root_object_to_js_or_null!(*cx, sampler) + return optional_root_object_to_js_or_null!(*cx, sampler); }, constants::COPY_READ_BUFFER_BINDING => unsafe { - optional_root_object_to_js_or_null!(*cx, &self.bound_copy_read_buffer.get()) + return optional_root_object_to_js_or_null!( + *cx, + &self.bound_copy_read_buffer.get() + ); }, constants::COPY_WRITE_BUFFER_BINDING => unsafe { - optional_root_object_to_js_or_null!(*cx, &self.bound_copy_write_buffer.get()) + return optional_root_object_to_js_or_null!( + *cx, + &self.bound_copy_write_buffer.get() + ); }, constants::PIXEL_PACK_BUFFER_BINDING => unsafe { - optional_root_object_to_js_or_null!(*cx, &self.bound_pixel_pack_buffer.get()) + return optional_root_object_to_js_or_null!( + *cx, + &self.bound_pixel_pack_buffer.get() + ); }, constants::PIXEL_UNPACK_BUFFER_BINDING => unsafe { - optional_root_object_to_js_or_null!(*cx, &self.bound_pixel_unpack_buffer.get()) + return optional_root_object_to_js_or_null!( + *cx, + &self.bound_pixel_unpack_buffer.get() + ); }, constants::TRANSFORM_FEEDBACK_BUFFER_BINDING => unsafe { - optional_root_object_to_js_or_null!( + return optional_root_object_to_js_or_null!( *cx, &self.bound_transform_feedback_buffer.get() - ) + ); }, constants::UNIFORM_BUFFER_BINDING => unsafe { - optional_root_object_to_js_or_null!(*cx, &self.bound_uniform_buffer.get()) + return optional_root_object_to_js_or_null!(*cx, &self.bound_uniform_buffer.get()); }, constants::TRANSFORM_FEEDBACK_BINDING => unsafe { - optional_root_object_to_js_or_null!(*cx, self.current_transform_feedback.get()) + return optional_root_object_to_js_or_null!( + *cx, + self.current_transform_feedback.get() + ); }, - _ => self.base.GetParameter(cx, parameter), + _ => {}, } + + let limit = match parameter { + constants::MAX_UNIFORM_BUFFER_BINDINGS => { + Some(self.base.limits().max_uniform_buffer_bindings) + }, + constants::MAX_UNIFORM_BLOCK_SIZE => Some(self.base.limits().max_uniform_block_size), + constants::MAX_COMBINED_UNIFORM_BLOCKS => { + Some(self.base.limits().max_combined_uniform_blocks) + }, + constants::MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS => { + Some(self.base.limits().max_combined_vertex_uniform_components) + }, + constants::MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS => { + Some(self.base.limits().max_combined_fragment_uniform_components) + }, + constants::MAX_VERTEX_UNIFORM_BLOCKS => { + Some(self.base.limits().max_vertex_uniform_blocks) + }, + constants::MAX_VERTEX_UNIFORM_COMPONENTS => { + Some(self.base.limits().max_vertex_uniform_components) + }, + constants::MAX_FRAGMENT_UNIFORM_BLOCKS => { + Some(self.base.limits().max_fragment_uniform_blocks) + }, + constants::MAX_FRAGMENT_UNIFORM_COMPONENTS => { + Some(self.base.limits().max_fragment_uniform_components) + }, + constants::UNIFORM_BUFFER_OFFSET_ALIGNMENT => { + Some(self.base.limits().uniform_buffer_offset_alignment) + }, + _ => None, + }; + if let Some(limit) = limit { + return UInt32Value(limit); + } + + self.base.GetParameter(cx, parameter) } /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.8 @@ -571,6 +638,7 @@ impl WebGL2RenderingContextMethods for WebGL2RenderingContext { /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.5 fn BufferData(&self, target: u32, data: Option, usage: u32) { + let usage = handle_potential_webgl_error!(self.base, self.buffer_usage(usage), return); let bound_buffer = handle_potential_webgl_error!(self.base, self.bound_buffer(target), return); self.base.buffer_data(target, data, usage, bound_buffer) @@ -578,6 +646,7 @@ impl WebGL2RenderingContextMethods for WebGL2RenderingContext { /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.5 fn BufferData_(&self, target: u32, size: i64, usage: u32) { + let usage = handle_potential_webgl_error!(self.base, self.buffer_usage(usage), return); let bound_buffer = handle_potential_webgl_error!(self.base, self.bound_buffer(target), return); self.base.buffer_data_(target, size, usage, bound_buffer) @@ -593,6 +662,7 @@ impl WebGL2RenderingContextMethods for WebGL2RenderingContext { elem_offset: u32, length: u32, ) { + let usage = handle_potential_webgl_error!(self.base, self.buffer_usage(usage), return); let bound_buffer = handle_potential_webgl_error!(self.base, self.bound_buffer(target), return); let bound_buffer = @@ -628,7 +698,10 @@ impl WebGL2RenderingContextMethods for WebGL2RenderingContext { /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.5 fn BufferSubData(&self, target: u32, offset: i64, data: ArrayBufferViewOrArrayBuffer) { - self.base.BufferSubData(target, offset, data) + let bound_buffer = + handle_potential_webgl_error!(self.base, self.bound_buffer(target), return); + self.base + .buffer_sub_data(target, offset, data, bound_buffer) } /// https://www.khronos.org/registry/webgl/specs/latest/2.0/#3.7.3 @@ -2304,6 +2377,260 @@ impl WebGL2RenderingContextMethods for WebGL2RenderingContext { DOMString::from(name), )) } + + /// https://www.khronos.org/registry/webgl/specs/latest/2.0/#3.7.16 + fn BindBufferBase(&self, target: u32, index: u32, buffer: Option<&WebGLBuffer>) { + let (bind_limit, slot) = match target { + constants::TRANSFORM_FEEDBACK_BUFFER => ( + self.base.limits().max_transform_feedback_separate_attribs, + &self.bound_transform_feedback_buffer, + ), + constants::UNIFORM_BUFFER => ( + self.base.limits().max_uniform_buffer_bindings, + &self.bound_uniform_buffer, + ), + _ => return self.base.webgl_error(InvalidEnum), + }; + if index >= bind_limit { + return self.base.webgl_error(InvalidValue); + } + + if let Some(buffer) = buffer { + handle_potential_webgl_error!(self.base, self.base.validate_ownership(buffer), return); + + if buffer.is_marked_for_deletion() { + return self.base.webgl_error(InvalidOperation); + } + handle_potential_webgl_error!(self.base, buffer.set_target_maybe(target), return); + buffer.increment_attached_counter(); + } + + self.base.send_command(WebGLCommand::BindBufferBase( + target, + index, + buffer.map(|b| b.id()), + )); + if let Some(old) = slot.get() { + old.decrement_attached_counter(); + } + + slot.set(buffer); + } + + /// https://www.khronos.org/registry/webgl/specs/latest/2.0/#3.7.16 + fn BindBufferRange( + &self, + target: u32, + index: u32, + buffer: Option<&WebGLBuffer>, + offset: i64, + size: i64, + ) { + let (bind_limit, slot) = match target { + constants::TRANSFORM_FEEDBACK_BUFFER => ( + self.base.limits().max_transform_feedback_separate_attribs, + &self.bound_transform_feedback_buffer, + ), + constants::UNIFORM_BUFFER => ( + self.base.limits().max_uniform_buffer_bindings, + &self.bound_uniform_buffer, + ), + _ => return self.base.webgl_error(InvalidEnum), + }; + if index >= bind_limit { + return self.base.webgl_error(InvalidValue); + } + + if offset < 0 || size < 0 { + return self.base.webgl_error(InvalidValue); + } + if buffer.is_some() && size == 0 { + return self.base.webgl_error(InvalidValue); + } + + match target { + constants::TRANSFORM_FEEDBACK_BUFFER => { + if size % 4 != 0 && offset % 4 != 0 { + return self.base.webgl_error(InvalidValue); + } + }, + constants::UNIFORM_BUFFER => { + let offset_alignment = self.base.limits().uniform_buffer_offset_alignment; + if offset % offset_alignment as i64 != 0 { + return self.base.webgl_error(InvalidValue); + } + }, + _ => unreachable!(), + } + + if let Some(buffer) = buffer { + handle_potential_webgl_error!(self.base, self.base.validate_ownership(buffer), return); + + if buffer.is_marked_for_deletion() { + return self.base.webgl_error(InvalidOperation); + } + handle_potential_webgl_error!(self.base, buffer.set_target_maybe(target), return); + buffer.increment_attached_counter(); + } + + self.base.send_command(WebGLCommand::BindBufferRange( + target, + index, + buffer.map(|b| b.id()), + offset, + size, + )); + if let Some(old) = slot.get() { + old.decrement_attached_counter(); + } + + slot.set(buffer); + } + + /// https://www.khronos.org/registry/webgl/specs/latest/2.0/#3.7.16 + fn GetUniformIndices(&self, program: &WebGLProgram, names: Vec) -> Option> { + handle_potential_webgl_error!( + self.base, + self.base.validate_ownership(program), + return None + ); + let indices = handle_potential_webgl_error!( + self.base, + program.get_uniform_indices(names), + return None + ); + Some(indices) + } + + /// https://www.khronos.org/registry/webgl/specs/latest/2.0/#3.7.16 + #[allow(unsafe_code)] + fn GetActiveUniforms( + &self, + cx: JSContext, + program: &WebGLProgram, + indices: Vec, + pname: u32, + ) -> JSVal { + handle_potential_webgl_error!( + self.base, + self.base.validate_ownership(program), + return NullValue() + ); + let values = handle_potential_webgl_error!( + self.base, + program.get_active_uniforms(indices, pname), + return NullValue() + ); + + rooted!(in(*cx) let mut rval = UndefinedValue()); + match pname { + constants::UNIFORM_SIZE | + constants::UNIFORM_TYPE | + constants::UNIFORM_BLOCK_INDEX | + constants::UNIFORM_OFFSET | + constants::UNIFORM_ARRAY_STRIDE | + constants::UNIFORM_MATRIX_STRIDE => unsafe { + values.to_jsval(*cx, rval.handle_mut()); + }, + constants::UNIFORM_IS_ROW_MAJOR => unsafe { + let values = values.iter().map(|&v| v != 0).collect::>(); + values.to_jsval(*cx, rval.handle_mut()); + }, + _ => unreachable!(), + } + rval.get() + } + + /// https://www.khronos.org/registry/webgl/specs/latest/2.0/#3.7.16 + fn GetUniformBlockIndex(&self, program: &WebGLProgram, block_name: DOMString) -> u32 { + handle_potential_webgl_error!( + self.base, + self.base.validate_ownership(program), + return constants::INVALID_INDEX + ); + let index = handle_potential_webgl_error!( + self.base, + program.get_uniform_block_index(block_name), + return constants::INVALID_INDEX + ); + index + } + + /// https://www.khronos.org/registry/webgl/specs/latest/2.0/#3.7.16 + #[allow(unsafe_code)] + fn GetActiveUniformBlockParameter( + &self, + cx: JSContext, + program: &WebGLProgram, + block_index: u32, + pname: u32, + ) -> JSVal { + handle_potential_webgl_error!( + self.base, + self.base.validate_ownership(program), + return NullValue() + ); + let values = handle_potential_webgl_error!( + self.base, + program.get_active_uniform_block_parameter(block_index, pname), + return NullValue() + ); + match pname { + constants::UNIFORM_BLOCK_BINDING | + constants::UNIFORM_BLOCK_DATA_SIZE | + constants::UNIFORM_BLOCK_ACTIVE_UNIFORMS => { + assert!(values.len() == 1); + UInt32Value(values[0] as u32) + }, + constants::UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES => unsafe { + let values = values.iter().map(|&v| v as u32).collect::>(); + rooted!(in(*cx) let mut result = ptr::null_mut::()); + let _ = Uint32Array::create(*cx, CreateWith::Slice(&values), result.handle_mut()) + .unwrap(); + ObjectValue(result.get()) + }, + constants::UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER | + constants::UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER => { + assert!(values.len() == 1); + BooleanValue(values[0] != 0) + }, + _ => unreachable!(), + } + } + + /// https://www.khronos.org/registry/webgl/specs/latest/2.0/#3.7.16 + fn GetActiveUniformBlockName( + &self, + program: &WebGLProgram, + block_index: u32, + ) -> Option { + handle_potential_webgl_error!( + self.base, + self.base.validate_ownership(program), + return None + ); + let name = handle_potential_webgl_error!( + self.base, + program.get_active_uniform_block_name(block_index), + return None + ); + Some(DOMString::from(name)) + } + + /// https://www.khronos.org/registry/webgl/specs/latest/2.0/#3.7.16 + fn UniformBlockBinding(&self, program: &WebGLProgram, block_index: u32, block_binding: u32) { + handle_potential_webgl_error!(self.base, self.base.validate_ownership(program), return); + + if block_binding >= self.base.limits().max_uniform_buffer_bindings { + return self.base.webgl_error(InvalidValue); + } + + handle_potential_webgl_error!( + self.base, + program.bind_uniform_block(block_index, block_binding), + return + ) + } } impl LayoutCanvasWebGLRenderingContextHelpers for LayoutDom { -- cgit v1.2.3 From 500b36b669aef57ea4194395483dbdee4b8d9868 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=C3=A1ty=C3=A1s=20Mustoha?= Date: Mon, 13 Jan 2020 12:21:17 +0100 Subject: Add support for WebGL2 `RASTERIZER_DISCARD` enum. Add support for the `RASTERIZER_DISCARD` enum for the WebGL2 version of the `Enable`, `Disable` and `IsEnabled` functions. See https://www.khronos.org/registry/webgl/specs/latest/2.0/#3.7.2 --- components/script/dom/webgl2renderingcontext.rs | 25 +++++++++++++++++++++---- 1 file changed, 21 insertions(+), 4 deletions(-) (limited to 'components/script/dom/webgl2renderingcontext.rs') diff --git a/components/script/dom/webgl2renderingcontext.rs b/components/script/dom/webgl2renderingcontext.rs index e8993f472d9..2689448e0bc 100644 --- a/components/script/dom/webgl2renderingcontext.rs +++ b/components/script/dom/webgl2renderingcontext.rs @@ -71,6 +71,7 @@ pub struct WebGL2RenderingContext { texture_pack_row_length: Cell, texture_pack_skip_pixels: Cell, texture_pack_skip_rows: Cell, + enable_rasterizer_discard: Cell, } fn typedarray_elem_size(typeid: Type) -> usize { @@ -124,6 +125,7 @@ impl WebGL2RenderingContext { texture_pack_row_length: Cell::new(0), texture_pack_skip_pixels: Cell::new(0), texture_pack_skip_rows: Cell::new(0), + enable_rasterizer_discard: Cell::new(false), }) } @@ -991,12 +993,24 @@ impl WebGL2RenderingContextMethods for WebGL2RenderingContext { /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.3 fn Enable(&self, cap: u32) { - self.base.Enable(cap) + match cap { + constants::RASTERIZER_DISCARD => { + self.enable_rasterizer_discard.set(true); + self.base.send_command(WebGLCommand::Enable(cap)); + }, + _ => self.base.Enable(cap), + } } /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.3 fn Disable(&self, cap: u32) { - self.base.Disable(cap) + match cap { + constants::RASTERIZER_DISCARD => { + self.enable_rasterizer_discard.set(false); + self.base.send_command(WebGLCommand::Disable(cap)); + }, + _ => self.base.Disable(cap), + } } /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.9 @@ -1200,9 +1214,12 @@ impl WebGL2RenderingContextMethods for WebGL2RenderingContext { } // TODO: We could write this without IPC, recording the calls to `enable` and `disable`. - /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.3 + /// https://www.khronos.org/registry/webgl/specs/latest/2.0/#3.7.2 fn IsEnabled(&self, cap: u32) -> bool { - self.base.IsEnabled(cap) + match cap { + constants::RASTERIZER_DISCARD => self.enable_rasterizer_discard.get(), + _ => self.base.IsEnabled(cap), + } } /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.6 -- cgit v1.2.3 From bc914381a8951f10bf028c31d50ab08b03a32ecf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=C3=A1ty=C3=A1s=20Mustoha?= Date: Fri, 10 Jan 2020 11:47:25 +0100 Subject: Add support for WebGL2 unsigned uniform operations This adds support for the WebGL2 `uniform[1234]ui` and `uniform[1234]uiv` operations. See: https://www.khronos.org/registry/webgl/specs/latest/2.0/#3.7.8 --- components/script/dom/webgl2renderingcontext.rs | 226 +++++++++++++++++++++++- 1 file changed, 222 insertions(+), 4 deletions(-) (limited to 'components/script/dom/webgl2renderingcontext.rs') diff --git a/components/script/dom/webgl2renderingcontext.rs b/components/script/dom/webgl2renderingcontext.rs index e8993f472d9..4967c0a940e 100644 --- a/components/script/dom/webgl2renderingcontext.rs +++ b/components/script/dom/webgl2renderingcontext.rs @@ -11,6 +11,7 @@ use crate::dom::bindings::codegen::UnionTypes::ArrayBufferViewOrArrayBuffer; use crate::dom::bindings::codegen::UnionTypes::Float32ArrayOrUnrestrictedFloatSequence; use crate::dom::bindings::codegen::UnionTypes::ImageDataOrHTMLImageElementOrHTMLCanvasElementOrHTMLVideoElement; use crate::dom::bindings::codegen::UnionTypes::Int32ArrayOrLongSequence; +use crate::dom::bindings::codegen::UnionTypes::Uint32ArrayOrUnsignedLongSequence; use crate::dom::bindings::error::{ErrorResult, Fallible}; use crate::dom::bindings::reflector::DomObject; use crate::dom::bindings::reflector::{reflect_dom_object, Reflector}; @@ -25,7 +26,8 @@ use crate::dom::webglprogram::WebGLProgram; use crate::dom::webglquery::WebGLQuery; use crate::dom::webglrenderbuffer::WebGLRenderbuffer; use crate::dom::webglrenderingcontext::{ - LayoutCanvasWebGLRenderingContextHelpers, Size2DExt, WebGLRenderingContext, + uniform_get, uniform_typed, LayoutCanvasWebGLRenderingContextHelpers, Size2DExt, + WebGLRenderingContext, }; use crate::dom::webglsampler::{WebGLSampler, WebGLSamplerValue}; use crate::dom::webglshader::WebGLShader; @@ -48,7 +50,7 @@ use js::jsapi::{JSObject, Type}; use js::jsval::{BooleanValue, DoubleValue, Int32Value, UInt32Value}; use js::jsval::{JSVal, NullValue, ObjectValue, UndefinedValue}; use js::rust::CustomAutoRooterGuard; -use js::typedarray::{ArrayBufferView, CreateWith, Uint32Array}; +use js::typedarray::{ArrayBufferView, CreateWith, Uint32, Uint32Array}; use script_layout_interface::HTMLCanvasDataSource; use std::cell::Cell; use std::cmp; @@ -386,6 +388,49 @@ impl WebGL2RenderingContext { .copy_from_slice(&src[src_start..src_start + src_row_bytes as usize]); } } + + fn uniform_vec_section( + &self, + vec: Uint32ArrayOrUnsignedLongSequence, + offset: u32, + length: u32, + uniform_size: usize, + uniform_location: &WebGLUniformLocation, + ) -> WebGLResult> { + let vec = match vec { + Uint32ArrayOrUnsignedLongSequence::Uint32Array(v) => v.to_vec(), + Uint32ArrayOrUnsignedLongSequence::UnsignedLongSequence(v) => v, + }; + + let offset = offset as usize; + if offset > vec.len() { + return Err(InvalidValue); + } + + let length = if length > 0 { + length as usize + } else { + vec.len() - offset + }; + if offset + length > vec.len() { + return Err(InvalidValue); + } + + let vec = if offset == 0 && length == vec.len() { + vec + } else { + vec[offset..offset + length].to_vec() + }; + + if vec.len() < uniform_size || vec.len() % uniform_size != 0 { + return Err(InvalidValue); + } + if uniform_location.size().is_none() && vec.len() != uniform_size { + return Err(InvalidOperation); + } + + Ok(vec) + } } impl WebGL2RenderingContextMethods for WebGL2RenderingContext { @@ -1457,6 +1502,57 @@ impl WebGL2RenderingContextMethods for WebGL2RenderingContext { self.base.Uniform1iv(location, v) } + // https://www.khronos.org/registry/webgl/specs/latest/2.0/#3.7.8 + fn Uniform1ui(&self, location: Option<&WebGLUniformLocation>, val: u32) { + self.base.with_location(location, |location| { + match location.type_() { + constants::BOOL | constants::UNSIGNED_INT => (), + _ => return Err(InvalidOperation), + } + self.base + .send_command(WebGLCommand::Uniform1ui(location.id(), val)); + Ok(()) + }); + } + + // https://www.khronos.org/registry/webgl/specs/latest/2.0/#3.7.8 + fn Uniform1uiv( + &self, + location: Option<&WebGLUniformLocation>, + val: Uint32ArrayOrUnsignedLongSequence, + src_offset: u32, + src_length: u32, + ) { + self.base.with_location(location, |location| { + match location.type_() { + constants::BOOL | + constants::UNSIGNED_INT | + constants::SAMPLER_2D | + constants::SAMPLER_CUBE => {}, + _ => return Err(InvalidOperation), + } + + let val = self.uniform_vec_section(val, src_offset, src_length, 1, location)?; + + match location.type_() { + constants::SAMPLER_2D | constants::SAMPLER_CUBE => { + for &v in val + .iter() + .take(cmp::min(location.size().unwrap_or(1) as usize, val.len())) + { + if v >= self.base.limits().max_combined_texture_image_units { + return Err(InvalidValue); + } + } + }, + _ => {}, + } + self.base + .send_command(WebGLCommand::Uniform1uiv(location.id(), val)); + Ok(()) + }); + } + /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.10 fn Uniform1fv( &self, @@ -1490,6 +1586,39 @@ impl WebGL2RenderingContextMethods for WebGL2RenderingContext { self.base.Uniform2iv(location, v) } + // https://www.khronos.org/registry/webgl/specs/latest/2.0/#3.7.8 + fn Uniform2ui(&self, location: Option<&WebGLUniformLocation>, x: u32, y: u32) { + self.base.with_location(location, |location| { + match location.type_() { + constants::BOOL_VEC2 | constants::UNSIGNED_INT_VEC2 => {}, + _ => return Err(InvalidOperation), + } + self.base + .send_command(WebGLCommand::Uniform2ui(location.id(), x, y)); + Ok(()) + }); + } + + // https://www.khronos.org/registry/webgl/specs/latest/2.0/#3.7.8 + fn Uniform2uiv( + &self, + location: Option<&WebGLUniformLocation>, + val: Uint32ArrayOrUnsignedLongSequence, + src_offset: u32, + src_length: u32, + ) { + self.base.with_location(location, |location| { + match location.type_() { + constants::BOOL_VEC2 | constants::UNSIGNED_INT_VEC2 => {}, + _ => return Err(InvalidOperation), + } + let val = self.uniform_vec_section(val, src_offset, src_length, 2, location)?; + self.base + .send_command(WebGLCommand::Uniform2uiv(location.id(), val)); + Ok(()) + }); + } + /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.10 fn Uniform3f(&self, location: Option<&WebGLUniformLocation>, x: f32, y: f32, z: f32) { self.base.Uniform3f(location, x, y, z) @@ -1514,6 +1643,39 @@ impl WebGL2RenderingContextMethods for WebGL2RenderingContext { self.base.Uniform3iv(location, v) } + // https://www.khronos.org/registry/webgl/specs/latest/2.0/#3.7.8 + fn Uniform3ui(&self, location: Option<&WebGLUniformLocation>, x: u32, y: u32, z: u32) { + self.base.with_location(location, |location| { + match location.type_() { + constants::BOOL_VEC3 | constants::UNSIGNED_INT_VEC3 => {}, + _ => return Err(InvalidOperation), + } + self.base + .send_command(WebGLCommand::Uniform3ui(location.id(), x, y, z)); + Ok(()) + }); + } + + // https://www.khronos.org/registry/webgl/specs/latest/2.0/#3.7.8 + fn Uniform3uiv( + &self, + location: Option<&WebGLUniformLocation>, + val: Uint32ArrayOrUnsignedLongSequence, + src_offset: u32, + src_length: u32, + ) { + self.base.with_location(location, |location| { + match location.type_() { + constants::BOOL_VEC3 | constants::UNSIGNED_INT_VEC3 => {}, + _ => return Err(InvalidOperation), + } + let val = self.uniform_vec_section(val, src_offset, src_length, 3, location)?; + self.base + .send_command(WebGLCommand::Uniform3uiv(location.id(), val)); + Ok(()) + }); + } + /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.10 fn Uniform4i(&self, location: Option<&WebGLUniformLocation>, x: i32, y: i32, z: i32, w: i32) { self.base.Uniform4i(location, x, y, z, w) @@ -1524,6 +1686,39 @@ impl WebGL2RenderingContextMethods for WebGL2RenderingContext { self.base.Uniform4iv(location, v) } + // https://www.khronos.org/registry/webgl/specs/latest/2.0/#3.7.8 + fn Uniform4ui(&self, location: Option<&WebGLUniformLocation>, x: u32, y: u32, z: u32, w: u32) { + self.base.with_location(location, |location| { + match location.type_() { + constants::BOOL_VEC4 | constants::UNSIGNED_INT_VEC4 => {}, + _ => return Err(InvalidOperation), + } + self.base + .send_command(WebGLCommand::Uniform4ui(location.id(), x, y, z, w)); + Ok(()) + }); + } + + // https://www.khronos.org/registry/webgl/specs/latest/2.0/#3.7.8 + fn Uniform4uiv( + &self, + location: Option<&WebGLUniformLocation>, + val: Uint32ArrayOrUnsignedLongSequence, + src_offset: u32, + src_length: u32, + ) { + self.base.with_location(location, |location| { + match location.type_() { + constants::BOOL_VEC4 | constants::UNSIGNED_INT_VEC4 => {}, + _ => return Err(InvalidOperation), + } + let val = self.uniform_vec_section(val, src_offset, src_length, 4, location)?; + self.base + .send_command(WebGLCommand::Uniform4uiv(location.id(), val)); + Ok(()) + }); + } + /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.10 fn Uniform4f(&self, location: Option<&WebGLUniformLocation>, x: f32, y: f32, z: f32, w: f32) { self.base.Uniform4f(location, x, y, z, w) @@ -1568,14 +1763,37 @@ impl WebGL2RenderingContextMethods for WebGL2RenderingContext { self.base.UniformMatrix4fv(location, transpose, v) } - // https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.10 + /// https://www.khronos.org/registry/webgl/specs/latest/2.0/#3.7.8 + #[allow(unsafe_code)] fn GetUniform( &self, cx: JSContext, program: &WebGLProgram, location: &WebGLUniformLocation, ) -> JSVal { - self.base.GetUniform(cx, program, location) + handle_potential_webgl_error!( + self.base, + self.base.uniform_check_program(program, location), + return NullValue() + ); + + let triple = (&*self.base, program.id(), location.id()); + + match location.type_() { + constants::UNSIGNED_INT => { + UInt32Value(uniform_get(triple, WebGLCommand::GetUniformUint)) + }, + constants::UNSIGNED_INT_VEC2 => unsafe { + uniform_typed::(*cx, &uniform_get(triple, WebGLCommand::GetUniformUint2)) + }, + constants::UNSIGNED_INT_VEC3 => unsafe { + uniform_typed::(*cx, &uniform_get(triple, WebGLCommand::GetUniformUint3)) + }, + constants::UNSIGNED_INT_VEC4 => unsafe { + uniform_typed::(*cx, &uniform_get(triple, WebGLCommand::GetUniformUint4)) + }, + _ => self.base.GetUniform(cx, program, location), + } } /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.9 -- cgit v1.2.3 From 0650fc319905ecd018ee0f6e059f9f40589e10b6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=C3=A1ty=C3=A1s=20Mustoha?= Date: Thu, 16 Jan 2020 10:22:52 +0100 Subject: Add support for WebGL2 uniform array operations Adds support for the WebGL2 overloads of `uniform[1234][if]v`. --- components/script/dom/webgl2renderingcontext.rs | 97 +++++++++++++------------ 1 file changed, 51 insertions(+), 46 deletions(-) (limited to 'components/script/dom/webgl2renderingcontext.rs') diff --git a/components/script/dom/webgl2renderingcontext.rs b/components/script/dom/webgl2renderingcontext.rs index 4967c0a940e..3fadd2b8743 100644 --- a/components/script/dom/webgl2renderingcontext.rs +++ b/components/script/dom/webgl2renderingcontext.rs @@ -389,7 +389,7 @@ impl WebGL2RenderingContext { } } - fn uniform_vec_section( + fn uniform_vec_section_uint( &self, vec: Uint32ArrayOrUnsignedLongSequence, offset: u32, @@ -401,35 +401,8 @@ impl WebGL2RenderingContext { Uint32ArrayOrUnsignedLongSequence::Uint32Array(v) => v.to_vec(), Uint32ArrayOrUnsignedLongSequence::UnsignedLongSequence(v) => v, }; - - let offset = offset as usize; - if offset > vec.len() { - return Err(InvalidValue); - } - - let length = if length > 0 { - length as usize - } else { - vec.len() - offset - }; - if offset + length > vec.len() { - return Err(InvalidValue); - } - - let vec = if offset == 0 && length == vec.len() { - vec - } else { - vec[offset..offset + length].to_vec() - }; - - if vec.len() < uniform_size || vec.len() % uniform_size != 0 { - return Err(InvalidValue); - } - if uniform_location.size().is_none() && vec.len() != uniform_size { - return Err(InvalidOperation); - } - - Ok(vec) + self.base + .uniform_vec_section::(vec, offset, length, uniform_size, uniform_location) } } @@ -1498,8 +1471,14 @@ impl WebGL2RenderingContextMethods for WebGL2RenderingContext { } /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.10 - fn Uniform1iv(&self, location: Option<&WebGLUniformLocation>, v: Int32ArrayOrLongSequence) { - self.base.Uniform1iv(location, v) + fn Uniform1iv( + &self, + location: Option<&WebGLUniformLocation>, + v: Int32ArrayOrLongSequence, + src_offset: u32, + src_length: u32, + ) { + self.base.Uniform1iv(location, v, src_offset, src_length) } // https://www.khronos.org/registry/webgl/specs/latest/2.0/#3.7.8 @@ -1532,7 +1511,7 @@ impl WebGL2RenderingContextMethods for WebGL2RenderingContext { _ => return Err(InvalidOperation), } - let val = self.uniform_vec_section(val, src_offset, src_length, 1, location)?; + let val = self.uniform_vec_section_uint(val, src_offset, src_length, 1, location)?; match location.type_() { constants::SAMPLER_2D | constants::SAMPLER_CUBE => { @@ -1558,8 +1537,10 @@ impl WebGL2RenderingContextMethods for WebGL2RenderingContext { &self, location: Option<&WebGLUniformLocation>, v: Float32ArrayOrUnrestrictedFloatSequence, + src_offset: u32, + src_length: u32, ) { - self.base.Uniform1fv(location, v); + self.base.Uniform1fv(location, v, src_offset, src_length); } /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.10 @@ -1572,8 +1553,10 @@ impl WebGL2RenderingContextMethods for WebGL2RenderingContext { &self, location: Option<&WebGLUniformLocation>, v: Float32ArrayOrUnrestrictedFloatSequence, + src_offset: u32, + src_length: u32, ) { - self.base.Uniform2fv(location, v); + self.base.Uniform2fv(location, v, src_offset, src_length); } /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.10 @@ -1582,8 +1565,14 @@ impl WebGL2RenderingContextMethods for WebGL2RenderingContext { } /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.10 - fn Uniform2iv(&self, location: Option<&WebGLUniformLocation>, v: Int32ArrayOrLongSequence) { - self.base.Uniform2iv(location, v) + fn Uniform2iv( + &self, + location: Option<&WebGLUniformLocation>, + v: Int32ArrayOrLongSequence, + src_offset: u32, + src_length: u32, + ) { + self.base.Uniform2iv(location, v, src_offset, src_length) } // https://www.khronos.org/registry/webgl/specs/latest/2.0/#3.7.8 @@ -1612,7 +1601,7 @@ impl WebGL2RenderingContextMethods for WebGL2RenderingContext { constants::BOOL_VEC2 | constants::UNSIGNED_INT_VEC2 => {}, _ => return Err(InvalidOperation), } - let val = self.uniform_vec_section(val, src_offset, src_length, 2, location)?; + let val = self.uniform_vec_section_uint(val, src_offset, src_length, 2, location)?; self.base .send_command(WebGLCommand::Uniform2uiv(location.id(), val)); Ok(()) @@ -1629,8 +1618,10 @@ impl WebGL2RenderingContextMethods for WebGL2RenderingContext { &self, location: Option<&WebGLUniformLocation>, v: Float32ArrayOrUnrestrictedFloatSequence, + src_offset: u32, + src_length: u32, ) { - self.base.Uniform3fv(location, v); + self.base.Uniform3fv(location, v, src_offset, src_length); } /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.10 @@ -1639,8 +1630,14 @@ impl WebGL2RenderingContextMethods for WebGL2RenderingContext { } /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.10 - fn Uniform3iv(&self, location: Option<&WebGLUniformLocation>, v: Int32ArrayOrLongSequence) { - self.base.Uniform3iv(location, v) + fn Uniform3iv( + &self, + location: Option<&WebGLUniformLocation>, + v: Int32ArrayOrLongSequence, + src_offset: u32, + src_length: u32, + ) { + self.base.Uniform3iv(location, v, src_offset, src_length) } // https://www.khronos.org/registry/webgl/specs/latest/2.0/#3.7.8 @@ -1669,7 +1666,7 @@ impl WebGL2RenderingContextMethods for WebGL2RenderingContext { constants::BOOL_VEC3 | constants::UNSIGNED_INT_VEC3 => {}, _ => return Err(InvalidOperation), } - let val = self.uniform_vec_section(val, src_offset, src_length, 3, location)?; + let val = self.uniform_vec_section_uint(val, src_offset, src_length, 3, location)?; self.base .send_command(WebGLCommand::Uniform3uiv(location.id(), val)); Ok(()) @@ -1682,8 +1679,14 @@ impl WebGL2RenderingContextMethods for WebGL2RenderingContext { } /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.10 - fn Uniform4iv(&self, location: Option<&WebGLUniformLocation>, v: Int32ArrayOrLongSequence) { - self.base.Uniform4iv(location, v) + fn Uniform4iv( + &self, + location: Option<&WebGLUniformLocation>, + v: Int32ArrayOrLongSequence, + src_offset: u32, + src_length: u32, + ) { + self.base.Uniform4iv(location, v, src_offset, src_length) } // https://www.khronos.org/registry/webgl/specs/latest/2.0/#3.7.8 @@ -1712,7 +1715,7 @@ impl WebGL2RenderingContextMethods for WebGL2RenderingContext { constants::BOOL_VEC4 | constants::UNSIGNED_INT_VEC4 => {}, _ => return Err(InvalidOperation), } - let val = self.uniform_vec_section(val, src_offset, src_length, 4, location)?; + let val = self.uniform_vec_section_uint(val, src_offset, src_length, 4, location)?; self.base .send_command(WebGLCommand::Uniform4uiv(location.id(), val)); Ok(()) @@ -1729,8 +1732,10 @@ impl WebGL2RenderingContextMethods for WebGL2RenderingContext { &self, location: Option<&WebGLUniformLocation>, v: Float32ArrayOrUnrestrictedFloatSequence, + src_offset: u32, + src_length: u32, ) { - self.base.Uniform4fv(location, v); + self.base.Uniform4fv(location, v, src_offset, src_length); } /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.10 -- cgit v1.2.3 From 7d5048f8852df0de2a0a86cb16e2a54f493b6e7c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=C3=A1ty=C3=A1s=20Mustoha?= Date: Thu, 16 Jan 2020 12:34:45 +0100 Subject: Add support for WebGL2 uniform matrix operations Adds support for the `uniformMatrix[234]x[234]fv` WebGL2 functions. See: https://www.khronos.org/registry/webgl/specs/latest/2.0/#3.7.8 --- components/script/dom/webgl2renderingcontext.rs | 221 +++++++++++++++++++++++- 1 file changed, 217 insertions(+), 4 deletions(-) (limited to 'components/script/dom/webgl2renderingcontext.rs') diff --git a/components/script/dom/webgl2renderingcontext.rs b/components/script/dom/webgl2renderingcontext.rs index 3fadd2b8743..4606fa5ec32 100644 --- a/components/script/dom/webgl2renderingcontext.rs +++ b/components/script/dom/webgl2renderingcontext.rs @@ -50,7 +50,7 @@ use js::jsapi::{JSObject, Type}; use js::jsval::{BooleanValue, DoubleValue, Int32Value, UInt32Value}; use js::jsval::{JSVal, NullValue, ObjectValue, UndefinedValue}; use js::rust::CustomAutoRooterGuard; -use js::typedarray::{ArrayBufferView, CreateWith, Uint32, Uint32Array}; +use js::typedarray::{ArrayBufferView, CreateWith, Float32, Uint32, Uint32Array}; use script_layout_interface::HTMLCanvasDataSource; use std::cell::Cell; use std::cmp; @@ -1744,8 +1744,11 @@ impl WebGL2RenderingContextMethods for WebGL2RenderingContext { location: Option<&WebGLUniformLocation>, transpose: bool, v: Float32ArrayOrUnrestrictedFloatSequence, + src_offset: u32, + src_length: u32, ) { - self.base.UniformMatrix2fv(location, transpose, v) + self.base + .UniformMatrix2fv(location, transpose, v, src_offset, src_length) } /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.10 @@ -1754,8 +1757,11 @@ impl WebGL2RenderingContextMethods for WebGL2RenderingContext { location: Option<&WebGLUniformLocation>, transpose: bool, v: Float32ArrayOrUnrestrictedFloatSequence, + src_offset: u32, + src_length: u32, ) { - self.base.UniformMatrix3fv(location, transpose, v) + self.base + .UniformMatrix3fv(location, transpose, v, src_offset, src_length) } /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.10 @@ -1764,8 +1770,179 @@ impl WebGL2RenderingContextMethods for WebGL2RenderingContext { location: Option<&WebGLUniformLocation>, transpose: bool, v: Float32ArrayOrUnrestrictedFloatSequence, + src_offset: u32, + src_length: u32, + ) { + self.base + .UniformMatrix4fv(location, transpose, v, src_offset, src_length) + } + + /// https://www.khronos.org/registry/webgl/specs/latest/2.0/#3.7.8 + fn UniformMatrix3x2fv( + &self, + location: Option<&WebGLUniformLocation>, + transpose: bool, + val: Float32ArrayOrUnrestrictedFloatSequence, + src_offset: u32, + src_length: u32, ) { - self.base.UniformMatrix4fv(location, transpose, v) + self.base.with_location(location, |location| { + match location.type_() { + constants::FLOAT_MAT3x2 => {}, + _ => return Err(InvalidOperation), + } + let val = self.base.uniform_matrix_section( + val, + src_offset, + src_length, + transpose, + 3 * 2, + location, + )?; + self.base + .send_command(WebGLCommand::UniformMatrix3x2fv(location.id(), val)); + Ok(()) + }); + } + + /// https://www.khronos.org/registry/webgl/specs/latest/2.0/#3.7.8 + fn UniformMatrix4x2fv( + &self, + location: Option<&WebGLUniformLocation>, + transpose: bool, + val: Float32ArrayOrUnrestrictedFloatSequence, + src_offset: u32, + src_length: u32, + ) { + self.base.with_location(location, |location| { + match location.type_() { + constants::FLOAT_MAT4x2 => {}, + _ => return Err(InvalidOperation), + } + let val = self.base.uniform_matrix_section( + val, + src_offset, + src_length, + transpose, + 4 * 2, + location, + )?; + self.base + .send_command(WebGLCommand::UniformMatrix4x2fv(location.id(), val)); + Ok(()) + }); + } + + /// https://www.khronos.org/registry/webgl/specs/latest/2.0/#3.7.8 + fn UniformMatrix2x3fv( + &self, + location: Option<&WebGLUniformLocation>, + transpose: bool, + val: Float32ArrayOrUnrestrictedFloatSequence, + src_offset: u32, + src_length: u32, + ) { + self.base.with_location(location, |location| { + match location.type_() { + constants::FLOAT_MAT2x3 => {}, + _ => return Err(InvalidOperation), + } + let val = self.base.uniform_matrix_section( + val, + src_offset, + src_length, + transpose, + 2 * 3, + location, + )?; + self.base + .send_command(WebGLCommand::UniformMatrix2x3fv(location.id(), val)); + Ok(()) + }); + } + + /// https://www.khronos.org/registry/webgl/specs/latest/2.0/#3.7.8 + fn UniformMatrix4x3fv( + &self, + location: Option<&WebGLUniformLocation>, + transpose: bool, + val: Float32ArrayOrUnrestrictedFloatSequence, + src_offset: u32, + src_length: u32, + ) { + self.base.with_location(location, |location| { + match location.type_() { + constants::FLOAT_MAT4x3 => {}, + _ => return Err(InvalidOperation), + } + let val = self.base.uniform_matrix_section( + val, + src_offset, + src_length, + transpose, + 4 * 3, + location, + )?; + self.base + .send_command(WebGLCommand::UniformMatrix4x3fv(location.id(), val)); + Ok(()) + }); + } + + /// https://www.khronos.org/registry/webgl/specs/latest/2.0/#3.7.8 + fn UniformMatrix2x4fv( + &self, + location: Option<&WebGLUniformLocation>, + transpose: bool, + val: Float32ArrayOrUnrestrictedFloatSequence, + src_offset: u32, + src_length: u32, + ) { + self.base.with_location(location, |location| { + match location.type_() { + constants::FLOAT_MAT2x4 => {}, + _ => return Err(InvalidOperation), + } + let val = self.base.uniform_matrix_section( + val, + src_offset, + src_length, + transpose, + 2 * 4, + location, + )?; + self.base + .send_command(WebGLCommand::UniformMatrix2x4fv(location.id(), val)); + Ok(()) + }); + } + + /// https://www.khronos.org/registry/webgl/specs/latest/2.0/#3.7.8 + fn UniformMatrix3x4fv( + &self, + location: Option<&WebGLUniformLocation>, + transpose: bool, + val: Float32ArrayOrUnrestrictedFloatSequence, + src_offset: u32, + src_length: u32, + ) { + self.base.with_location(location, |location| { + match location.type_() { + constants::FLOAT_MAT3x4 => {}, + _ => return Err(InvalidOperation), + } + let val = self.base.uniform_matrix_section( + val, + src_offset, + src_length, + transpose, + 3 * 4, + location, + )?; + self.base + .send_command(WebGLCommand::UniformMatrix3x4fv(location.id(), val)); + Ok(()) + }); } /// https://www.khronos.org/registry/webgl/specs/latest/2.0/#3.7.8 @@ -1797,6 +1974,42 @@ impl WebGL2RenderingContextMethods for WebGL2RenderingContext { constants::UNSIGNED_INT_VEC4 => unsafe { uniform_typed::(*cx, &uniform_get(triple, WebGLCommand::GetUniformUint4)) }, + constants::FLOAT_MAT2x3 => unsafe { + uniform_typed::( + *cx, + &uniform_get(triple, WebGLCommand::GetUniformFloat2x3), + ) + }, + constants::FLOAT_MAT2x4 => unsafe { + uniform_typed::( + *cx, + &uniform_get(triple, WebGLCommand::GetUniformFloat2x4), + ) + }, + constants::FLOAT_MAT3x2 => unsafe { + uniform_typed::( + *cx, + &uniform_get(triple, WebGLCommand::GetUniformFloat3x2), + ) + }, + constants::FLOAT_MAT3x4 => unsafe { + uniform_typed::( + *cx, + &uniform_get(triple, WebGLCommand::GetUniformFloat3x4), + ) + }, + constants::FLOAT_MAT4x2 => unsafe { + uniform_typed::( + *cx, + &uniform_get(triple, WebGLCommand::GetUniformFloat4x2), + ) + }, + constants::FLOAT_MAT4x3 => unsafe { + uniform_typed::( + *cx, + &uniform_get(triple, WebGLCommand::GetUniformFloat4x3), + ) + }, _ => self.base.GetUniform(cx, program, location), } } -- cgit v1.2.3 From 01ca317235eb2b6b1d55b67df9ea60a59f61bcf0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=C3=A1ty=C3=A1s=20Mustoha?= Date: Fri, 17 Jan 2020 11:52:01 +0100 Subject: Add WebGL2 specific version strings Updated the `VERSION` and `SHADING_LANGUAGE_VERSION` WebGL parameters to report the correct version strings when WebGL2 is in use. See: https://www.khronos.org/registry/webgl/specs/latest/2.0/#3.7.2 --- components/script/dom/webgl2renderingcontext.rs | 10 ++++++++++ 1 file changed, 10 insertions(+) (limited to 'components/script/dom/webgl2renderingcontext.rs') diff --git a/components/script/dom/webgl2renderingcontext.rs b/components/script/dom/webgl2renderingcontext.rs index 3fadd2b8743..d3279955576 100644 --- a/components/script/dom/webgl2renderingcontext.rs +++ b/components/script/dom/webgl2renderingcontext.rs @@ -441,6 +441,16 @@ impl WebGL2RenderingContextMethods for WebGL2RenderingContext { /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.3 fn GetParameter(&self, cx: JSContext, parameter: u32) -> JSVal { match parameter { + constants::VERSION => unsafe { + rooted!(in(*cx) let mut rval = UndefinedValue()); + "WebGL 2.0".to_jsval(*cx, rval.handle_mut()); + return rval.get(); + }, + constants::SHADING_LANGUAGE_VERSION => unsafe { + rooted!(in(*cx) let mut rval = UndefinedValue()); + "WebGL GLSL ES 3.00".to_jsval(*cx, rval.handle_mut()); + return rval.get(); + }, constants::MAX_CLIENT_WAIT_TIMEOUT_WEBGL => { return Int32Value( self.base.limits().max_client_wait_timeout_webgl.as_nanos() as i32 -- cgit v1.2.3 From f7db4b7f8011239f01c3ba2e5e402c866fbe68fb Mon Sep 17 00:00:00 2001 From: Kunal Mohan Date: Sat, 18 Jan 2020 01:29:26 +0530 Subject: Modify `script` to prevent further violations of snake_case --- components/script/dom/webgl2renderingcontext.rs | 2 ++ 1 file changed, 2 insertions(+) (limited to 'components/script/dom/webgl2renderingcontext.rs') diff --git a/components/script/dom/webgl2renderingcontext.rs b/components/script/dom/webgl2renderingcontext.rs index af11e947eda..2d782d8604f 100644 --- a/components/script/dom/webgl2renderingcontext.rs +++ b/components/script/dom/webgl2renderingcontext.rs @@ -2708,6 +2708,7 @@ impl WebGL2RenderingContextMethods for WebGL2RenderingContext { } /// https://www.khronos.org/registry/webgl/specs/latest/2.0/#3.7.15 + #[allow(non_snake_case)] fn BeginTransformFeedback(&self, primitiveMode: u32) { match primitiveMode { constants::POINTS | constants::LINES | constants::TRIANGLES => {}, @@ -2775,6 +2776,7 @@ impl WebGL2RenderingContextMethods for WebGL2RenderingContext { } /// https://www.khronos.org/registry/webgl/specs/latest/2.0/#3.7.15 + #[allow(non_snake_case)] fn TransformFeedbackVaryings( &self, program: &WebGLProgram, -- cgit v1.2.3 From 833485887e9e8a4ae4beb71c473df101a4106ee4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=C3=A1ty=C3=A1s=20Mustoha?= Date: Thu, 13 Feb 2020 14:14:19 +0100 Subject: Add support for WebGL2 `MAX_COLOR_ATTACHMENTS` and `MAX_DRAW_BUFFERS` Adds support for using the WebGL2 enums `MAX_COLOR_ATTACHMENTS` and `MAX_DRAW_BUFFERS` with `GetParameter`. See https://www.khronos.org/registry/webgl/specs/latest/2.0/#3.7.2 --- components/script/dom/webgl2renderingcontext.rs | 2 ++ 1 file changed, 2 insertions(+) (limited to 'components/script/dom/webgl2renderingcontext.rs') diff --git a/components/script/dom/webgl2renderingcontext.rs b/components/script/dom/webgl2renderingcontext.rs index 2d782d8604f..71f1f108b39 100644 --- a/components/script/dom/webgl2renderingcontext.rs +++ b/components/script/dom/webgl2renderingcontext.rs @@ -535,6 +535,8 @@ impl WebGL2RenderingContextMethods for WebGL2RenderingContext { constants::UNIFORM_BUFFER_OFFSET_ALIGNMENT => { Some(self.base.limits().uniform_buffer_offset_alignment) }, + constants::MAX_COLOR_ATTACHMENTS => Some(self.base.limits().max_color_attachments), + constants::MAX_DRAW_BUFFERS => Some(self.base.limits().max_draw_buffers), _ => None, }; if let Some(limit) = limit { -- cgit v1.2.3 From 796ee705976f8072032a0fc88579ca18aed85999 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=C3=A1ty=C3=A1s=20Mustoha?= Date: Fri, 14 Feb 2020 11:57:11 +0100 Subject: Add initial support for WebGL2 read framebuffer Adds support for binding to the read framebuffer slot and querying its status. --- components/script/dom/webgl2renderingcontext.rs | 49 ++++++++++++++++++++++++- 1 file changed, 47 insertions(+), 2 deletions(-) (limited to 'components/script/dom/webgl2renderingcontext.rs') diff --git a/components/script/dom/webgl2renderingcontext.rs b/components/script/dom/webgl2renderingcontext.rs index 71f1f108b39..0e9d24075a6 100644 --- a/components/script/dom/webgl2renderingcontext.rs +++ b/components/script/dom/webgl2renderingcontext.rs @@ -503,6 +503,13 @@ impl WebGL2RenderingContextMethods for WebGL2RenderingContext { self.current_transform_feedback.get() ); }, + // NOTE: DRAW_FRAMEBUFFER_BINDING is the same as FRAMEBUFFER_BINDING, handled on the WebGL1 side + constants::READ_FRAMEBUFFER_BINDING => unsafe { + return optional_root_object_to_js_or_null!( + *cx, + &self.base.get_read_framebuffer_slot().get() + ); + }, _ => {}, } @@ -650,7 +657,32 @@ impl WebGL2RenderingContextMethods for WebGL2RenderingContext { /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.6 fn BindFramebuffer(&self, target: u32, framebuffer: Option<&WebGLFramebuffer>) { - self.base.BindFramebuffer(target, framebuffer) + handle_potential_webgl_error!( + self.base, + self.base.validate_new_framebuffer_binding(framebuffer), + return + ); + + let (bind_read, bind_draw) = match target { + constants::FRAMEBUFFER => (true, true), + constants::READ_FRAMEBUFFER => (true, false), + constants::DRAW_FRAMEBUFFER => (false, true), + _ => return self.base.webgl_error(InvalidEnum), + }; + if bind_read { + self.base.bind_framebuffer_to( + target, + framebuffer, + &self.base.get_read_framebuffer_slot(), + ); + } + if bind_draw { + self.base.bind_framebuffer_to( + target, + framebuffer, + &self.base.get_draw_framebuffer_slot(), + ); + } } /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.7 @@ -2221,7 +2253,20 @@ impl WebGL2RenderingContextMethods for WebGL2RenderingContext { /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.6 fn CheckFramebufferStatus(&self, target: u32) -> u32 { - self.base.CheckFramebufferStatus(target) + let fb_slot = match target { + constants::FRAMEBUFFER | constants::DRAW_FRAMEBUFFER => { + self.base.get_draw_framebuffer_slot() + }, + constants::READ_FRAMEBUFFER => &self.base.get_read_framebuffer_slot(), + _ => { + self.base.webgl_error(InvalidEnum); + return 0; + }, + }; + match fb_slot.get() { + Some(fb) => fb.check_status(), + None => constants::FRAMEBUFFER_COMPLETE, + } } /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.7 -- cgit v1.2.3 From b41805a9206f940737c2644f73d975ae35e38f99 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=C3=A1ty=C3=A1s=20Mustoha?= Date: Thu, 20 Feb 2020 13:32:38 +0100 Subject: Add support for WebGL2 framebuffer attachments Adds an initial implementation for the framebuffer attachments introduced with WebGL2 and the related enums and constrains checks. --- components/script/dom/webgl2renderingcontext.rs | 54 +++++++++++++++++++++++-- 1 file changed, 50 insertions(+), 4 deletions(-) (limited to 'components/script/dom/webgl2renderingcontext.rs') diff --git a/components/script/dom/webgl2renderingcontext.rs b/components/script/dom/webgl2renderingcontext.rs index 0e9d24075a6..4c69efdcb55 100644 --- a/components/script/dom/webgl2renderingcontext.rs +++ b/components/script/dom/webgl2renderingcontext.rs @@ -2283,8 +2283,38 @@ impl WebGL2RenderingContextMethods for WebGL2RenderingContext { renderbuffertarget: u32, rb: Option<&WebGLRenderbuffer>, ) { - self.base - .FramebufferRenderbuffer(target, attachment, renderbuffertarget, rb) + if let Some(rb) = rb { + handle_potential_webgl_error!(self.base, self.base.validate_ownership(rb), return); + } + + let fb_slot = match target { + constants::FRAMEBUFFER | constants::DRAW_FRAMEBUFFER => { + self.base.get_draw_framebuffer_slot() + }, + constants::READ_FRAMEBUFFER => &self.base.get_read_framebuffer_slot(), + _ => return self.base.webgl_error(InvalidEnum), + }; + + if renderbuffertarget != constants::RENDERBUFFER { + return self.base.webgl_error(InvalidEnum); + } + + match fb_slot.get() { + Some(fb) => match attachment { + constants::DEPTH_STENCIL_ATTACHMENT => { + handle_potential_webgl_error!( + self.base, + fb.renderbuffer(constants::DEPTH_ATTACHMENT, rb) + ); + handle_potential_webgl_error!( + self.base, + fb.renderbuffer(constants::STENCIL_ATTACHMENT, rb) + ); + }, + _ => handle_potential_webgl_error!(self.base, fb.renderbuffer(attachment, rb)), + }, + None => self.base.webgl_error(InvalidOperation), + }; } /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.6 @@ -2296,8 +2326,24 @@ impl WebGL2RenderingContextMethods for WebGL2RenderingContext { texture: Option<&WebGLTexture>, level: i32, ) { - self.base - .FramebufferTexture2D(target, attachment, textarget, texture, level) + if let Some(texture) = texture { + handle_potential_webgl_error!(self.base, self.base.validate_ownership(texture), return); + } + + let fb_slot = match target { + constants::FRAMEBUFFER | constants::DRAW_FRAMEBUFFER => { + self.base.get_draw_framebuffer_slot() + }, + constants::READ_FRAMEBUFFER => self.base.get_read_framebuffer_slot(), + _ => return self.base.webgl_error(InvalidEnum), + }; + match fb_slot.get() { + Some(fb) => handle_potential_webgl_error!( + self.base, + fb.texture2d(attachment, textarget, texture, level) + ), + None => self.base.webgl_error(InvalidOperation), + } } /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.9 -- cgit v1.2.3 From d5d0a788e315530de7e738643652b0adf10e2c80 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=C3=A1ty=C3=A1s=20Mustoha?= Date: Fri, 14 Feb 2020 13:14:07 +0100 Subject: Add support for WebGL2 getFramebufferAttachmentParameter Implements the WebGL2 variant of `getFramebufferAttachmentParameter` and the related parameter checks. See: https://www.khronos.org/registry/webgl/specs/latest/2.0/#3.7.4 --- components/script/dom/webgl2renderingcontext.rs | 182 +++++++++++++++++++++++- 1 file changed, 179 insertions(+), 3 deletions(-) (limited to 'components/script/dom/webgl2renderingcontext.rs') diff --git a/components/script/dom/webgl2renderingcontext.rs b/components/script/dom/webgl2renderingcontext.rs index 4c69efdcb55..dfce0f043ab 100644 --- a/components/script/dom/webgl2renderingcontext.rs +++ b/components/script/dom/webgl2renderingcontext.rs @@ -21,7 +21,7 @@ use crate::dom::htmlcanvaselement::HTMLCanvasElement; use crate::dom::htmliframeelement::HTMLIFrameElement; use crate::dom::webglactiveinfo::WebGLActiveInfo; use crate::dom::webglbuffer::WebGLBuffer; -use crate::dom::webglframebuffer::WebGLFramebuffer; +use crate::dom::webglframebuffer::{WebGLFramebuffer, WebGLFramebufferAttachmentRoot}; use crate::dom::webglprogram::WebGLProgram; use crate::dom::webglquery::WebGLQuery; use crate::dom::webglrenderbuffer::WebGLRenderbuffer; @@ -406,6 +406,157 @@ impl WebGL2RenderingContext { self.base .uniform_vec_section::(vec, offset, length, uniform_size, uniform_location) } + + #[allow(unsafe_code)] + fn get_default_fb_attachment_param(&self, attachment: u32, pname: u32) -> WebGLResult { + match attachment { + constants::BACK | constants::DEPTH | constants::STENCIL => {}, + _ => return Err(InvalidEnum), + } + + if pname == constants::FRAMEBUFFER_ATTACHMENT_OBJECT_NAME { + return Ok(NullValue()); + } + + let attrs = self + .GetContextAttributes() + .unwrap_or_else(WebGLContextAttributes::empty); + + let intval = match pname { + constants::FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE => match attachment { + constants::DEPTH if !attrs.depth => constants::NONE as _, + constants::STENCIL if !attrs.stencil => constants::NONE as _, + _ => constants::FRAMEBUFFER_DEFAULT as _, + }, + constants::FRAMEBUFFER_ATTACHMENT_RED_SIZE | + constants::FRAMEBUFFER_ATTACHMENT_GREEN_SIZE | + constants::FRAMEBUFFER_ATTACHMENT_BLUE_SIZE => match attachment { + constants::BACK => 8, + _ => 0, + }, + constants::FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE => match attachment { + constants::BACK if attrs.alpha => 8, + constants::BACK => return Err(InvalidOperation), + _ => 0, + }, + constants::FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE => match attachment { + constants::DEPTH if attrs.depth => 24, + constants::DEPTH => return Err(InvalidOperation), + _ => 0, + }, + constants::FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE => match attachment { + constants::STENCIL if attrs.stencil => 8, + constants::STENCIL => return Err(InvalidOperation), + _ => 0, + }, + constants::FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE => match attachment { + constants::DEPTH if attrs.depth => constants::UNSIGNED_NORMALIZED as _, + constants::STENCIL if attrs.stencil => constants::UNSIGNED_INT as _, + constants::DEPTH => return Err(InvalidOperation), + constants::STENCIL => return Err(InvalidOperation), + _ => constants::UNSIGNED_NORMALIZED as _, + }, + constants::FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING => match attachment { + constants::DEPTH if !attrs.depth => return Err(InvalidOperation), + constants::STENCIL if !attrs.stencil => return Err(InvalidOperation), + _ => constants::LINEAR as _, + }, + _ => return Err(InvalidEnum), + }; + Ok(Int32Value(intval)) + } + + #[allow(unsafe_code)] + fn get_specific_fb_attachment_param( + &self, + cx: JSContext, + fb: &WebGLFramebuffer, + target: u32, + attachment: u32, + pname: u32, + ) -> WebGLResult { + use crate::dom::webglframebuffer::WebGLFramebufferAttachmentRoot::{Renderbuffer, Texture}; + + match attachment { + constants::DEPTH_ATTACHMENT | constants::STENCIL_ATTACHMENT => {}, + constants::DEPTH_STENCIL_ATTACHMENT => { + if pname == constants::FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE { + return Err(InvalidOperation); + } + + let a = fb.attachment(constants::DEPTH_ATTACHMENT); + let b = fb.attachment(constants::STENCIL_ATTACHMENT); + match (a, b) { + (Some(Renderbuffer(ref a)), Some(Renderbuffer(ref b))) if a.id() == b.id() => { + }, + (Some(Texture(ref a)), Some(Texture(ref b))) if a.id() == b.id() => {}, + _ => return Err(InvalidOperation), + } + }, + constants::COLOR_ATTACHMENT0..=constants::COLOR_ATTACHMENT15 => { + let last_slot = + constants::COLOR_ATTACHMENT0 + self.base.limits().max_color_attachments - 1; + if last_slot < attachment { + return Err(InvalidEnum); + } + }, + _ => return Err(InvalidEnum), + } + + let attachment = match attachment { + constants::DEPTH_STENCIL_ATTACHMENT => constants::DEPTH_ATTACHMENT, + _ => attachment, + }; + + if pname == constants::FRAMEBUFFER_ATTACHMENT_OBJECT_NAME { + rooted!(in(*cx) let mut rval = NullValue()); + match fb.attachment(attachment) { + Some(Renderbuffer(rb)) => unsafe { + rb.to_jsval(*cx, rval.handle_mut()); + }, + Some(Texture(texture)) => unsafe { + texture.to_jsval(*cx, rval.handle_mut()); + }, + _ => {}, + } + return Ok(rval.get()); + } + + match pname { + constants::FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE => {}, + _ => match fb.attachment(attachment) { + Some(webgl_attachment) => match pname { + constants::FRAMEBUFFER_ATTACHMENT_RED_SIZE | + constants::FRAMEBUFFER_ATTACHMENT_GREEN_SIZE | + constants::FRAMEBUFFER_ATTACHMENT_BLUE_SIZE | + constants::FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE | + constants::FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE | + constants::FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE | + constants::FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE | + constants::FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING => {}, + _ => match webgl_attachment { + WebGLFramebufferAttachmentRoot::Renderbuffer(_) => return Err(InvalidEnum), + WebGLFramebufferAttachmentRoot::Texture(_) => match pname { + constants::FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL | + constants::FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE | + constants::FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER => {}, + _ => return Err(InvalidEnum), + }, + }, + }, + None => return Err(InvalidOperation), + }, + } + + let (sender, receiver) = webgl_channel().unwrap(); + self.base + .send_command(WebGLCommand::GetFramebufferAttachmentParameter( + target, attachment, pname, sender, + )); + + let retval = receiver.recv().unwrap(); + Ok(Int32Value(retval)) + } } impl WebGL2RenderingContextMethods for WebGL2RenderingContext { @@ -586,8 +737,33 @@ impl WebGL2RenderingContextMethods for WebGL2RenderingContext { attachment: u32, pname: u32, ) -> JSVal { - self.base - .GetFramebufferAttachmentParameter(cx, target, attachment, pname) + let fb_slot = match target { + constants::FRAMEBUFFER | constants::DRAW_FRAMEBUFFER => { + self.base.get_draw_framebuffer_slot() + }, + constants::READ_FRAMEBUFFER => &self.base.get_read_framebuffer_slot(), + _ => { + self.base.webgl_error(InvalidEnum); + return NullValue(); + }, + }; + + if let Some(fb) = fb_slot.get() { + // A selected framebuffer is bound to the target + handle_potential_webgl_error!(self.base, fb.validate_transparent(), return NullValue()); + handle_potential_webgl_error!( + self.base, + self.get_specific_fb_attachment_param(cx, &fb, target, attachment, pname), + return NullValue() + ) + } else { + // The default framebuffer is bound to the target + handle_potential_webgl_error!( + self.base, + self.get_default_fb_attachment_param(attachment, pname), + return NullValue() + ) + } } /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.7 -- cgit v1.2.3 From 8701d4571517ddbddbb0aa5dffb2e485e9876938 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=C3=A1ty=C3=A1s=20Mustoha?= Date: Tue, 18 Feb 2020 12:13:59 +0100 Subject: Add support for WebGL2 clear buffer operations Adds support for the following WebGL2 methods: - `clearBufferfv` - `clearBufferiv` - `clearBufferuiv` - `clearBufferfi` See: https://www.khronos.org/registry/webgl/specs/latest/2.0/#3.7.11 --- components/script/dom/webgl2renderingcontext.rs | 132 ++++++++++++++++++++++++ 1 file changed, 132 insertions(+) (limited to 'components/script/dom/webgl2renderingcontext.rs') diff --git a/components/script/dom/webgl2renderingcontext.rs b/components/script/dom/webgl2renderingcontext.rs index dfce0f043ab..cc735f36e41 100644 --- a/components/script/dom/webgl2renderingcontext.rs +++ b/components/script/dom/webgl2renderingcontext.rs @@ -557,6 +557,52 @@ impl WebGL2RenderingContext { let retval = receiver.recv().unwrap(); Ok(Int32Value(retval)) } + + fn clearbuffer_array_size(&self, buffer: u32, draw_buffer: i32) -> WebGLResult { + match buffer { + constants::COLOR => { + if draw_buffer < 0 || draw_buffer as u32 >= self.base.limits().max_draw_buffers { + return Err(InvalidValue); + } + Ok(4) + }, + constants::DEPTH | constants::STENCIL | constants::DEPTH_STENCIL => { + if draw_buffer != 0 { + return Err(InvalidValue); + } + Ok(1) + }, + _ => unreachable!(), + } + } + + fn clear_buffer( + &self, + buffer: u32, + draw_buffer: i32, + valid_buffers: &[u32], + src_offset: u32, + array: Vec, + msg: fn(u32, i32, Vec) -> WebGLCommand, + ) { + if !valid_buffers.contains(&buffer) { + return self.base.webgl_error(InvalidEnum); + } + + let array_size = handle_potential_webgl_error!( + self.base, + self.clearbuffer_array_size(buffer, draw_buffer), + return + ); + let src_offset = src_offset as usize; + + if array.len() < src_offset + array_size { + return self.base.webgl_error(InvalidValue); + } + let array = array[src_offset..src_offset + array_size].to_vec(); + + self.base.send_command(msg(buffer, draw_buffer, array)); + } } impl WebGL2RenderingContextMethods for WebGL2RenderingContext { @@ -3365,6 +3411,92 @@ impl WebGL2RenderingContextMethods for WebGL2RenderingContext { return ) } + + /// https://www.khronos.org/registry/webgl/specs/latest/2.0/#3.7.11 + fn ClearBufferfv( + &self, + buffer: u32, + draw_buffer: i32, + values: Float32ArrayOrUnrestrictedFloatSequence, + src_offset: u32, + ) { + let array = match values { + Float32ArrayOrUnrestrictedFloatSequence::Float32Array(v) => v.to_vec(), + Float32ArrayOrUnrestrictedFloatSequence::UnrestrictedFloatSequence(v) => v, + }; + self.clear_buffer::( + buffer, + draw_buffer, + &[constants::COLOR, constants::DEPTH], + src_offset, + array, + WebGLCommand::ClearBufferfv, + ) + } + + /// https://www.khronos.org/registry/webgl/specs/latest/2.0/#3.7.11 + fn ClearBufferiv( + &self, + buffer: u32, + draw_buffer: i32, + values: Int32ArrayOrLongSequence, + src_offset: u32, + ) { + let array = match values { + Int32ArrayOrLongSequence::Int32Array(v) => v.to_vec(), + Int32ArrayOrLongSequence::LongSequence(v) => v, + }; + self.clear_buffer::( + buffer, + draw_buffer, + &[constants::COLOR, constants::STENCIL], + src_offset, + array, + WebGLCommand::ClearBufferiv, + ) + } + + /// https://www.khronos.org/registry/webgl/specs/latest/2.0/#3.7.11 + fn ClearBufferuiv( + &self, + buffer: u32, + draw_buffer: i32, + values: Uint32ArrayOrUnsignedLongSequence, + src_offset: u32, + ) { + let array = match values { + Uint32ArrayOrUnsignedLongSequence::Uint32Array(v) => v.to_vec(), + Uint32ArrayOrUnsignedLongSequence::UnsignedLongSequence(v) => v, + }; + self.clear_buffer::( + buffer, + draw_buffer, + &[constants::COLOR], + src_offset, + array, + WebGLCommand::ClearBufferuiv, + ) + } + + /// https://www.khronos.org/registry/webgl/specs/latest/2.0/#3.7.11 + fn ClearBufferfi(&self, buffer: u32, draw_buffer: i32, depth: f32, stencil: i32) { + if buffer != constants::DEPTH_STENCIL { + return self.base.webgl_error(InvalidEnum); + } + + handle_potential_webgl_error!( + self.base, + self.clearbuffer_array_size(buffer, draw_buffer), + return + ); + + self.base.send_command(WebGLCommand::ClearBufferfi( + buffer, + draw_buffer, + depth, + stencil, + )); + } } impl LayoutCanvasWebGLRenderingContextHelpers for LayoutDom { -- cgit v1.2.3 From cc07d930c8aa92a27c4c5d8867ae090a5dc46f6b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=C3=A1ty=C3=A1s=20Mustoha?= Date: Fri, 14 Feb 2020 13:14:07 +0100 Subject: Add support for WebGL2 framebuffer invalidation Adds support for the `invalidateFramebuffer` and `invalideSubFramebuffer` WebGL2 calls. See: https://www.khronos.org/registry/webgl/specs/latest/2.0/#3.7.4 --- components/script/dom/webgl2renderingcontext.rs | 84 +++++++++++++++++++++++++ 1 file changed, 84 insertions(+) (limited to 'components/script/dom/webgl2renderingcontext.rs') diff --git a/components/script/dom/webgl2renderingcontext.rs b/components/script/dom/webgl2renderingcontext.rs index cc735f36e41..f3c88cbb7c8 100644 --- a/components/script/dom/webgl2renderingcontext.rs +++ b/components/script/dom/webgl2renderingcontext.rs @@ -603,6 +603,51 @@ impl WebGL2RenderingContext { self.base.send_command(msg(buffer, draw_buffer, array)); } + + fn valid_fb_attachment_values(&self, target: u32, attachments: &[u32]) -> bool { + let fb_slot = match target { + constants::FRAMEBUFFER | constants::DRAW_FRAMEBUFFER => { + self.base.get_draw_framebuffer_slot() + }, + constants::READ_FRAMEBUFFER => self.base.get_read_framebuffer_slot(), + _ => { + self.base.webgl_error(InvalidEnum); + return false; + }, + }; + + if let Some(fb) = fb_slot.get() { + if fb.check_status() != constants::FRAMEBUFFER_COMPLETE { + return false; + } + + for &attachment in attachments { + match attachment { + constants::DEPTH_ATTACHMENT | + constants::STENCIL_ATTACHMENT | + constants::DEPTH_STENCIL_ATTACHMENT => {}, + constants::COLOR_ATTACHMENT0..=constants::COLOR_ATTACHMENT15 => { + let last_slot = constants::COLOR_ATTACHMENT0 + + self.base.limits().max_color_attachments - + 1; + if last_slot < attachment { + return false; + } + }, + _ => return false, + } + } + } else { + for &attachment in attachments { + match attachment { + constants::COLOR | constants::DEPTH | constants::STENCIL => {}, + _ => return false, + } + } + } + + true + } } impl WebGL2RenderingContextMethods for WebGL2RenderingContext { @@ -3497,6 +3542,45 @@ impl WebGL2RenderingContextMethods for WebGL2RenderingContext { stencil, )); } + + /// https://www.khronos.org/registry/webgl/specs/latest/2.0/#3.7.4 + fn InvalidateFramebuffer(&self, target: u32, attachments: Vec) { + if !self.valid_fb_attachment_values(target, &attachments) { + return; + } + + self.base + .send_command(WebGLCommand::InvalidateFramebuffer(target, attachments)) + } + + /// https://www.khronos.org/registry/webgl/specs/latest/2.0/#3.7.4 + fn InvalidateSubFramebuffer( + &self, + target: u32, + attachments: Vec, + x: i32, + y: i32, + width: i32, + height: i32, + ) { + if !self.valid_fb_attachment_values(target, &attachments) { + return; + } + + if width < 0 || height < 0 { + return; + } + + self.base + .send_command(WebGLCommand::InvalidateSubFramebuffer( + target, + attachments, + x, + y, + width, + height, + )) + } } impl LayoutCanvasWebGLRenderingContextHelpers for LayoutDom { -- cgit v1.2.3 From 8389189d943dfd5b404401ae41e73da71ec774be Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=C3=A1ty=C3=A1s=20Mustoha?= Date: Fri, 14 Feb 2020 13:14:07 +0100 Subject: Add support for WebGL2 FramebufferTextureLayer Adds support for `FramebufferTextureLayer` WebGL2 call. See: https://www.khronos.org/registry/webgl/specs/latest/2.0/#3.7.4 --- components/script/dom/webgl2renderingcontext.rs | 30 +++++++++++++++++++++++++ 1 file changed, 30 insertions(+) (limited to 'components/script/dom/webgl2renderingcontext.rs') diff --git a/components/script/dom/webgl2renderingcontext.rs b/components/script/dom/webgl2renderingcontext.rs index f3c88cbb7c8..9f0bfcd89c3 100644 --- a/components/script/dom/webgl2renderingcontext.rs +++ b/components/script/dom/webgl2renderingcontext.rs @@ -3581,6 +3581,36 @@ impl WebGL2RenderingContextMethods for WebGL2RenderingContext { height, )) } + + /// https://www.khronos.org/registry/webgl/specs/latest/2.0/#3.7.4 + fn FramebufferTextureLayer( + &self, + target: u32, + attachment: u32, + texture: Option<&WebGLTexture>, + level: i32, + layer: i32, + ) { + if let Some(tex) = texture { + handle_potential_webgl_error!(self.base, self.base.validate_ownership(tex), return); + } + + let fb_slot = match target { + constants::FRAMEBUFFER | constants::DRAW_FRAMEBUFFER => { + self.base.get_draw_framebuffer_slot() + }, + constants::READ_FRAMEBUFFER => self.base.get_read_framebuffer_slot(), + _ => return self.base.webgl_error(InvalidEnum), + }; + + match fb_slot.get() { + Some(fb) => handle_potential_webgl_error!( + self.base, + fb.texture_layer(attachment, texture, level, layer) + ), + None => self.base.webgl_error(InvalidOperation), + } + } } impl LayoutCanvasWebGLRenderingContextHelpers for LayoutDom { -- cgit v1.2.3 From 5a4f8cf93f9f674a164a0a3cfc586accef3d06f9 Mon Sep 17 00:00:00 2001 From: Anthony Ramine Date: Mon, 2 Mar 2020 11:16:46 +0100 Subject: Update SpiderMonkey --- components/script/dom/webgl2renderingcontext.rs | 1 + 1 file changed, 1 insertion(+) (limited to 'components/script/dom/webgl2renderingcontext.rs') diff --git a/components/script/dom/webgl2renderingcontext.rs b/components/script/dom/webgl2renderingcontext.rs index 9f0bfcd89c3..ec2741c44dd 100644 --- a/components/script/dom/webgl2renderingcontext.rs +++ b/components/script/dom/webgl2renderingcontext.rs @@ -82,6 +82,7 @@ fn typedarray_elem_size(typeid: Type) -> usize { Type::Int16 | Type::Uint16 => 2, Type::Int32 | Type::Uint32 | Type::Float32 => 4, Type::Int64 | Type::Float64 => 8, + Type::BigInt64 | Type::BigUint64 => 8, Type::MaxTypedArrayViewType => unreachable!(), } } -- cgit v1.2.3 From ced67af6b2519c577f7830ea76e0426ff44a9a2a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=C3=A1ty=C3=A1s=20Mustoha?= Date: Fri, 6 Mar 2020 11:42:21 +0100 Subject: Add support for WebGL2 GetFragDataLocation Adds support for the `GetFragDataLocation` WebGL2 call. See: https://www.khronos.org/registry/webgl/specs/latest/2.0/#3.7.7 --- components/script/dom/webgl2renderingcontext.rs | 6 ++++++ 1 file changed, 6 insertions(+) (limited to 'components/script/dom/webgl2renderingcontext.rs') diff --git a/components/script/dom/webgl2renderingcontext.rs b/components/script/dom/webgl2renderingcontext.rs index ec2741c44dd..d6452a88043 100644 --- a/components/script/dom/webgl2renderingcontext.rs +++ b/components/script/dom/webgl2renderingcontext.rs @@ -1467,6 +1467,12 @@ impl WebGL2RenderingContextMethods for WebGL2RenderingContext { self.base.GetAttribLocation(program, name) } + /// https://www.khronos.org/registry/webgl/specs/latest/2.0/#3.7.7 + fn GetFragDataLocation(&self, program: &WebGLProgram, name: DOMString) -> i32 { + handle_potential_webgl_error!(self.base, self.base.validate_ownership(program), return -1); + handle_potential_webgl_error!(self.base, program.get_frag_data_location(name), -1) + } + /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.9 fn GetProgramInfoLog(&self, program: &WebGLProgram) -> Option { self.base.GetProgramInfoLog(program) -- cgit v1.2.3 From 215dd0a1d8a1790c503424a4789fe7a664f896eb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=C3=A1ty=C3=A1s=20Mustoha?= Date: Fri, 6 Mar 2020 13:18:40 +0100 Subject: Add support for WebGL2 GetIndexedParameter Adds support for the `GetIndexedParameter` WebGL2 call. See: https://www.khronos.org/registry/webgl/specs/latest/2.0/#3.7.2 --- components/script/dom/webgl2renderingcontext.rs | 135 ++++++++++++++++++++---- 1 file changed, 115 insertions(+), 20 deletions(-) (limited to 'components/script/dom/webgl2renderingcontext.rs') diff --git a/components/script/dom/webgl2renderingcontext.rs b/components/script/dom/webgl2renderingcontext.rs index d6452a88043..1c458778a1c 100644 --- a/components/script/dom/webgl2renderingcontext.rs +++ b/components/script/dom/webgl2renderingcontext.rs @@ -56,6 +56,24 @@ use std::cell::Cell; use std::cmp; use std::ptr::{self, NonNull}; +#[unrooted_must_root_lint::must_root] +#[derive(JSTraceable, MallocSizeOf)] +struct IndexedBinding { + buffer: MutNullableDom, + start: Cell, + size: Cell, +} + +impl IndexedBinding { + fn new() -> IndexedBinding { + IndexedBinding { + buffer: MutNullableDom::new(None), + start: Cell::new(0), + size: Cell::new(0), + } + } +} + #[dom_struct] pub struct WebGL2RenderingContext { reflector_: Reflector, @@ -69,6 +87,8 @@ pub struct WebGL2RenderingContext { bound_pixel_unpack_buffer: MutNullableDom, bound_transform_feedback_buffer: MutNullableDom, bound_uniform_buffer: MutNullableDom, + indexed_uniform_buffer_bindings: Box<[IndexedBinding]>, + indexed_transform_feedback_buffer_bindings: Box<[IndexedBinding]>, current_transform_feedback: MutNullableDom, texture_pack_row_length: Cell, texture_pack_skip_pixels: Cell, @@ -111,6 +131,15 @@ impl WebGL2RenderingContext { .map(|_| Default::default()) .collect::>() .into(); + let indexed_uniform_buffer_bindings = (0..base.limits().max_uniform_buffer_bindings) + .map(|_| IndexedBinding::new()) + .collect::>() + .into(); + let indexed_transform_feedback_buffer_bindings = + (0..base.limits().max_transform_feedback_separate_attribs) + .map(|_| IndexedBinding::new()) + .collect::>() + .into(); Some(WebGL2RenderingContext { reflector_: Reflector::new(), @@ -124,6 +153,8 @@ impl WebGL2RenderingContext { bound_pixel_unpack_buffer: MutNullableDom::new(None), bound_transform_feedback_buffer: MutNullableDom::new(None), bound_uniform_buffer: MutNullableDom::new(None), + indexed_uniform_buffer_bindings, + indexed_transform_feedback_buffer_bindings, current_transform_feedback: MutNullableDom::new(None), texture_pack_row_length: Cell::new(0), texture_pack_skip_pixels: Cell::new(0), @@ -1396,6 +1427,14 @@ impl WebGL2RenderingContextMethods for WebGL2RenderingContext { self.unbind_from(&self.bound_pixel_unpack_buffer, &buffer); self.unbind_from(&self.bound_transform_feedback_buffer, &buffer); self.unbind_from(&self.bound_uniform_buffer, &buffer); + + for binding in self.indexed_uniform_buffer_bindings.iter() { + self.unbind_from(&binding.buffer, &buffer); + } + for binding in self.indexed_transform_feedback_buffer_bindings.iter() { + self.unbind_from(&binding.buffer, &buffer); + } + buffer.mark_for_deletion(false); } @@ -1520,6 +1559,46 @@ impl WebGL2RenderingContextMethods for WebGL2RenderingContext { .GetShaderPrecisionFormat(shader_type, precision_type) } + /// https://www.khronos.org/registry/webgl/specs/latest/2.0/#3.7.2 + #[allow(unsafe_code)] + fn GetIndexedParameter(&self, cx: JSContext, target: u32, index: u32) -> JSVal { + let bindings = match target { + constants::TRANSFORM_FEEDBACK_BUFFER_BINDING | + constants::TRANSFORM_FEEDBACK_BUFFER_SIZE | + constants::TRANSFORM_FEEDBACK_BUFFER_START => { + &self.indexed_transform_feedback_buffer_bindings + }, + constants::UNIFORM_BUFFER_BINDING | + constants::UNIFORM_BUFFER_SIZE | + constants::UNIFORM_BUFFER_START => &self.indexed_uniform_buffer_bindings, + _ => { + self.base.webgl_error(InvalidEnum); + return NullValue(); + }, + }; + + let binding = match bindings.get(index as usize) { + Some(binding) => binding, + None => { + self.base.webgl_error(InvalidValue); + return NullValue(); + }, + }; + + match target { + constants::TRANSFORM_FEEDBACK_BUFFER_BINDING | constants::UNIFORM_BUFFER_BINDING => unsafe { + optional_root_object_to_js_or_null!(*cx, binding.buffer.get()) + }, + constants::TRANSFORM_FEEDBACK_BUFFER_START | constants::UNIFORM_BUFFER_START => { + Int32Value(binding.start.get() as _) + }, + constants::TRANSFORM_FEEDBACK_BUFFER_SIZE | constants::UNIFORM_BUFFER_SIZE => { + Int32Value(binding.size.get() as _) + }, + _ => unreachable!(), + } + } + /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.10 fn GetUniformLocation( &self, @@ -3212,20 +3291,21 @@ impl WebGL2RenderingContextMethods for WebGL2RenderingContext { /// https://www.khronos.org/registry/webgl/specs/latest/2.0/#3.7.16 fn BindBufferBase(&self, target: u32, index: u32, buffer: Option<&WebGLBuffer>) { - let (bind_limit, slot) = match target { + let (generic_slot, indexed_bindings) = match target { constants::TRANSFORM_FEEDBACK_BUFFER => ( - self.base.limits().max_transform_feedback_separate_attribs, &self.bound_transform_feedback_buffer, + &self.indexed_transform_feedback_buffer_bindings, ), constants::UNIFORM_BUFFER => ( - self.base.limits().max_uniform_buffer_bindings, &self.bound_uniform_buffer, + &self.indexed_uniform_buffer_bindings, ), _ => return self.base.webgl_error(InvalidEnum), }; - if index >= bind_limit { - return self.base.webgl_error(InvalidValue); - } + let indexed_binding = match indexed_bindings.get(index as usize) { + Some(slot) => slot, + None => return self.base.webgl_error(InvalidValue), + }; if let Some(buffer) = buffer { handle_potential_webgl_error!(self.base, self.base.validate_ownership(buffer), return); @@ -3234,6 +3314,9 @@ impl WebGL2RenderingContextMethods for WebGL2RenderingContext { return self.base.webgl_error(InvalidOperation); } handle_potential_webgl_error!(self.base, buffer.set_target_maybe(target), return); + + // for both the generic and the indexed bindings + buffer.increment_attached_counter(); buffer.increment_attached_counter(); } @@ -3242,11 +3325,15 @@ impl WebGL2RenderingContextMethods for WebGL2RenderingContext { index, buffer.map(|b| b.id()), )); - if let Some(old) = slot.get() { - old.decrement_attached_counter(); - } - slot.set(buffer); + for slot in &[&generic_slot, &indexed_binding.buffer] { + if let Some(old) = slot.get() { + old.decrement_attached_counter(); + } + slot.set(buffer); + } + indexed_binding.start.set(0); + indexed_binding.size.set(0); } /// https://www.khronos.org/registry/webgl/specs/latest/2.0/#3.7.16 @@ -3258,20 +3345,21 @@ impl WebGL2RenderingContextMethods for WebGL2RenderingContext { offset: i64, size: i64, ) { - let (bind_limit, slot) = match target { + let (generic_slot, indexed_bindings) = match target { constants::TRANSFORM_FEEDBACK_BUFFER => ( - self.base.limits().max_transform_feedback_separate_attribs, &self.bound_transform_feedback_buffer, + &self.indexed_transform_feedback_buffer_bindings, ), constants::UNIFORM_BUFFER => ( - self.base.limits().max_uniform_buffer_bindings, &self.bound_uniform_buffer, + &self.indexed_uniform_buffer_bindings, ), _ => return self.base.webgl_error(InvalidEnum), }; - if index >= bind_limit { - return self.base.webgl_error(InvalidValue); - } + let indexed_binding = match indexed_bindings.get(index as usize) { + Some(slot) => slot, + None => return self.base.webgl_error(InvalidValue), + }; if offset < 0 || size < 0 { return self.base.webgl_error(InvalidValue); @@ -3302,6 +3390,9 @@ impl WebGL2RenderingContextMethods for WebGL2RenderingContext { return self.base.webgl_error(InvalidOperation); } handle_potential_webgl_error!(self.base, buffer.set_target_maybe(target), return); + + // for both the generic and the indexed bindings + buffer.increment_attached_counter(); buffer.increment_attached_counter(); } @@ -3312,11 +3403,15 @@ impl WebGL2RenderingContextMethods for WebGL2RenderingContext { offset, size, )); - if let Some(old) = slot.get() { - old.decrement_attached_counter(); - } - slot.set(buffer); + for slot in &[&generic_slot, &indexed_binding.buffer] { + if let Some(old) = slot.get() { + old.decrement_attached_counter(); + } + slot.set(buffer); + } + indexed_binding.start.set(offset); + indexed_binding.size.set(size); } /// https://www.khronos.org/registry/webgl/specs/latest/2.0/#3.7.16 -- cgit v1.2.3 From 1b4a3d8987077ce003ab0755b33663bda7f31935 Mon Sep 17 00:00:00 2001 From: Istvan Miklos Date: Thu, 5 Mar 2020 15:51:18 +0100 Subject: Add VertexArrayObject support for WebGL2 The implementation was already in place for OpenGL ES. My approach with this patch is to add support for WebGL2 by sharing the implementation between the WebGL2 and GLES. --- components/script/dom/webgl2renderingcontext.rs | 42 ++++++++++++++++++++++++- 1 file changed, 41 insertions(+), 1 deletion(-) (limited to 'components/script/dom/webgl2renderingcontext.rs') diff --git a/components/script/dom/webgl2renderingcontext.rs b/components/script/dom/webgl2renderingcontext.rs index 1c458778a1c..699631de5d2 100644 --- a/components/script/dom/webgl2renderingcontext.rs +++ b/components/script/dom/webgl2renderingcontext.rs @@ -36,6 +36,7 @@ use crate::dom::webglsync::WebGLSync; use crate::dom::webgltexture::WebGLTexture; use crate::dom::webgltransformfeedback::WebGLTransformFeedback; use crate::dom::webgluniformlocation::WebGLUniformLocation; +use crate::dom::webglvertexarrayobject::WebGLVertexArrayObject; use crate::dom::window::Window; use crate::js::conversions::ToJSValConvertible; use crate::script_runtime::JSContext; @@ -181,6 +182,10 @@ impl WebGL2RenderingContext { self.base.recreate(size) } + pub fn current_vao(&self) -> DomRoot { + self.base.current_vao_webgl2() + } + pub fn base_context(&self) -> DomRoot { DomRoot::from_ref(&*self.base) } @@ -193,6 +198,7 @@ impl WebGL2RenderingContext { constants::PIXEL_UNPACK_BUFFER => Ok(self.bound_pixel_unpack_buffer.get()), constants::TRANSFORM_FEEDBACK_BUFFER => Ok(self.bound_transform_feedback_buffer.get()), constants::UNIFORM_BUFFER => Ok(self.bound_uniform_buffer.get()), + constants::ELEMENT_ARRAY_BUFFER => Ok(self.current_vao().element_array_buffer().get()), _ => self.base.bound_buffer(target), } } @@ -777,6 +783,15 @@ impl WebGL2RenderingContextMethods for WebGL2RenderingContext { self.current_transform_feedback.get() ); }, + constants::ELEMENT_ARRAY_BUFFER_BINDING => unsafe { + let buffer = self.current_vao().element_array_buffer().get(); + return optional_root_object_to_js_or_null!(*cx, buffer); + }, + constants::VERTEX_ARRAY_BINDING => unsafe { + let vao = self.current_vao(); + let vao = vao.id().map(|_| &*vao); + return optional_root_object_to_js_or_null!(*cx, vao); + }, // NOTE: DRAW_FRAMEBUFFER_BINDING is the same as FRAMEBUFFER_BINDING, handled on the WebGL1 side constants::READ_FRAMEBUFFER_BINDING => unsafe { return optional_root_object_to_js_or_null!( @@ -942,6 +957,7 @@ impl WebGL2RenderingContextMethods for WebGL2RenderingContext { /// https://www.khronos.org/registry/webgl/specs/latest/2.0/#3.7.2 fn BindBuffer(&self, target: u32, buffer: Option<&WebGLBuffer>) { + let current_vao; let slot = match target { constants::COPY_READ_BUFFER => &self.bound_copy_read_buffer, constants::COPY_WRITE_BUFFER => &self.bound_copy_write_buffer, @@ -949,6 +965,10 @@ impl WebGL2RenderingContextMethods for WebGL2RenderingContext { constants::PIXEL_UNPACK_BUFFER => &self.bound_pixel_unpack_buffer, constants::TRANSFORM_FEEDBACK_BUFFER => &self.bound_transform_feedback_buffer, constants::UNIFORM_BUFFER => &self.bound_uniform_buffer, + constants::ELEMENT_ARRAY_BUFFER => { + current_vao = self.current_vao(); + current_vao.element_array_buffer() + }, _ => return self.base.BindBuffer(target, buffer), }; self.base.bind_buffer_maybe(&slot, target, buffer); @@ -1409,6 +1429,11 @@ impl WebGL2RenderingContextMethods for WebGL2RenderingContext { self.base.CreateShader(shader_type) } + /// https://www.khronos.org/registry/webgl/specs/latest/2.0/#3.7.17 + fn CreateVertexArray(&self) -> Option> { + self.base.create_vertex_array_webgl2() + } + /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.5 fn DeleteBuffer(&self, buffer: Option<&WebGLBuffer>) { let buffer = match buffer { @@ -1419,7 +1444,7 @@ impl WebGL2RenderingContextMethods for WebGL2RenderingContext { if buffer.is_marked_for_deletion() { return; } - self.base.current_vao().unbind_buffer(buffer); + self.current_vao().unbind_buffer(buffer); self.unbind_from(&self.base.array_buffer_slot(), &buffer); self.unbind_from(&self.bound_copy_read_buffer, &buffer); self.unbind_from(&self.bound_copy_write_buffer, &buffer); @@ -1463,6 +1488,11 @@ impl WebGL2RenderingContextMethods for WebGL2RenderingContext { self.base.DeleteShader(shader) } + /// https://www.khronos.org/registry/webgl/specs/latest/2.0/#3.7.17 + fn DeleteVertexArray(&self, vertex_array: Option<&WebGLVertexArrayObject>) { + self.base.delete_vertex_array_webgl2(vertex_array); + } + /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.11 fn DrawArrays(&self, mode: u32, first: i32, count: i32) { self.base.DrawArrays(mode, first, count) @@ -1662,6 +1692,11 @@ impl WebGL2RenderingContextMethods for WebGL2RenderingContext { self.base.IsTexture(texture) } + /// https://www.khronos.org/registry/webgl/specs/latest/2.0/#3.7.17 + fn IsVertexArray(&self, vertex_array: Option<&WebGLVertexArrayObject>) -> bool { + self.base.is_vertex_array_webgl2(vertex_array) + } + /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.3 fn LineWidth(&self, width: f32) { self.base.LineWidth(width) @@ -3042,6 +3077,11 @@ impl WebGL2RenderingContextMethods for WebGL2RenderingContext { } } + /// https://www.khronos.org/registry/webgl/specs/latest/2.0/#3.7.17 + fn BindVertexArray(&self, array: Option<&WebGLVertexArrayObject>) { + self.base.bind_vertex_array_webgl2(array); + } + /// https://www.khronos.org/registry/webgl/specs/latest/2.0/#3.7.13 fn SamplerParameteri(&self, sampler: &WebGLSampler, pname: u32, param: i32) { handle_potential_webgl_error!(self.base, self.base.validate_ownership(sampler), return); -- cgit v1.2.3 From 5eaa9ef8cb552063df2645847a4ab3793c3ebcd6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=C3=A1ty=C3=A1s=20Mustoha?= Date: Tue, 3 Mar 2020 14:44:33 +0100 Subject: Add support for some more WebGL2 renderbuffer functions Adds support for the following WebGL2 calls: - `RenderbufferStorageMultisample` - `GetInternalFormativ` See: https://www.khronos.org/registry/webgl/specs/latest/2.0/#3.7.5 --- components/script/dom/webgl2renderingcontext.rs | 59 ++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 2 deletions(-) (limited to 'components/script/dom/webgl2renderingcontext.rs') diff --git a/components/script/dom/webgl2renderingcontext.rs b/components/script/dom/webgl2renderingcontext.rs index 699631de5d2..4928974bb20 100644 --- a/components/script/dom/webgl2renderingcontext.rs +++ b/components/script/dom/webgl2renderingcontext.rs @@ -42,7 +42,8 @@ use crate::js::conversions::ToJSValConvertible; use crate::script_runtime::JSContext; use canvas_traits::webgl::WebGLError::*; use canvas_traits::webgl::{ - webgl_channel, GLContextAttributes, WebGLCommand, WebGLResult, WebGLVersion, + webgl_channel, GLContextAttributes, InternalFormatParameter, WebGLCommand, WebGLResult, + WebGLVersion, }; use dom_struct::dom_struct; use euclid::default::{Point2D, Rect, Size2D}; @@ -51,7 +52,7 @@ use js::jsapi::{JSObject, Type}; use js::jsval::{BooleanValue, DoubleValue, Int32Value, UInt32Value}; use js::jsval::{JSVal, NullValue, ObjectValue, UndefinedValue}; use js::rust::CustomAutoRooterGuard; -use js::typedarray::{ArrayBufferView, CreateWith, Float32, Uint32, Uint32Array}; +use js::typedarray::{ArrayBufferView, CreateWith, Float32, Int32Array, Uint32, Uint32Array}; use script_layout_interface::HTMLCanvasDataSource; use std::cell::Cell; use std::cmp; @@ -3753,6 +3754,60 @@ impl WebGL2RenderingContextMethods for WebGL2RenderingContext { None => self.base.webgl_error(InvalidOperation), } } + + /// https://www.khronos.org/registry/webgl/specs/latest/2.0/#3.7.5 + #[allow(unsafe_code)] + fn GetInternalformatParameter( + &self, + cx: JSContext, + target: u32, + internal_format: u32, + pname: u32, + ) -> JSVal { + if target != constants::RENDERBUFFER { + self.base.webgl_error(InvalidEnum); + return NullValue(); + } + + match handle_potential_webgl_error!( + self.base, + InternalFormatParameter::from_u32(pname), + return NullValue() + ) { + InternalFormatParameter::IntVec(param) => unsafe { + let (sender, receiver) = webgl_channel().unwrap(); + self.base + .send_command(WebGLCommand::GetInternalFormatIntVec( + target, + internal_format, + param, + sender, + )); + + rooted!(in(*cx) let mut rval = ptr::null_mut::()); + let _ = Int32Array::create( + *cx, + CreateWith::Slice(&receiver.recv().unwrap()), + rval.handle_mut(), + ) + .unwrap(); + ObjectValue(rval.get()) + }, + } + } + + /// https://www.khronos.org/registry/webgl/specs/latest/2.0/#3.7.5 + fn RenderbufferStorageMultisample( + &self, + target: u32, + samples: i32, + internal_format: u32, + width: i32, + height: i32, + ) { + self.base + .renderbuffer_storage(target, samples, internal_format, width, height) + } } impl LayoutCanvasWebGLRenderingContextHelpers for LayoutDom { -- cgit v1.2.3 From 6cdbab5581b642bf44ea18cb1714892962ddbaa9 Mon Sep 17 00:00:00 2001 From: Josh Matthews Date: Tue, 10 Mar 2020 12:34:24 -0400 Subject: webgl: Don't panic on sampler3D and sampler2DArray uniforms. --- components/script/dom/webgl2renderingcontext.rs | 3 +++ 1 file changed, 3 insertions(+) (limited to 'components/script/dom/webgl2renderingcontext.rs') diff --git a/components/script/dom/webgl2renderingcontext.rs b/components/script/dom/webgl2renderingcontext.rs index 4928974bb20..dabcd4cf54e 100644 --- a/components/script/dom/webgl2renderingcontext.rs +++ b/components/script/dom/webgl2renderingcontext.rs @@ -2460,6 +2460,9 @@ impl WebGL2RenderingContextMethods for WebGL2RenderingContext { &uniform_get(triple, WebGLCommand::GetUniformFloat4x3), ) }, + constants::SAMPLER_3D | constants::SAMPLER_2D_ARRAY => { + Int32Value(uniform_get(triple, WebGLCommand::GetUniformInt)) + }, _ => self.base.GetUniform(cx, program, location), } } -- cgit v1.2.3 From 0afe27ef18e1bb458863bd881c79d0fa63d9c4a4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=C3=A1ty=C3=A1s=20Mustoha?= Date: Tue, 25 Feb 2020 10:47:59 +0100 Subject: Add support for WebGL2 read and draw buffer settings Adds support for the `ReadBuffer` and `DrawBuffers` WebGL2 calls and the related parameter getters. See: - https://www.khronos.org/registry/webgl/specs/latest/2.0/#3.7.2 - https://www.khronos.org/registry/webgl/specs/latest/2.0/#3.7.4 - https://www.khronos.org/registry/webgl/specs/latest/2.0/#3.7.11 --- components/script/dom/webgl2renderingcontext.rs | 69 +++++++++++++++++++++++++ 1 file changed, 69 insertions(+) (limited to 'components/script/dom/webgl2renderingcontext.rs') diff --git a/components/script/dom/webgl2renderingcontext.rs b/components/script/dom/webgl2renderingcontext.rs index dabcd4cf54e..c0c3aab5ad6 100644 --- a/components/script/dom/webgl2renderingcontext.rs +++ b/components/script/dom/webgl2renderingcontext.rs @@ -96,6 +96,8 @@ pub struct WebGL2RenderingContext { texture_pack_skip_pixels: Cell, texture_pack_skip_rows: Cell, enable_rasterizer_discard: Cell, + default_fb_readbuffer: Cell, + default_fb_drawbuffer: Cell, } fn typedarray_elem_size(typeid: Type) -> usize { @@ -162,6 +164,8 @@ impl WebGL2RenderingContext { texture_pack_skip_pixels: Cell::new(0), texture_pack_skip_rows: Cell::new(0), enable_rasterizer_discard: Cell::new(false), + default_fb_readbuffer: Cell::new(constants::BACK), + default_fb_drawbuffer: Cell::new(constants::BACK), }) } @@ -344,6 +348,11 @@ impl WebGL2RenderingContext { return self.base.webgl_error(InvalidOperation); } + let fb_slot = self.base.get_draw_framebuffer_slot(); + if fb_slot.get().is_none() && self.default_fb_readbuffer.get() == constants::NONE { + return self.base.webgl_error(InvalidOperation); + } + let dst_byte_offset = { let dst_elem_size = typedarray_elem_size(dst.get_array_type()); dst_elem_offset as usize * dst_elem_size @@ -800,6 +809,26 @@ impl WebGL2RenderingContextMethods for WebGL2RenderingContext { &self.base.get_read_framebuffer_slot().get() ); }, + constants::READ_BUFFER => { + let buffer = match self.base.get_read_framebuffer_slot().get() { + Some(fb) => fb.read_buffer(), + None => self.default_fb_readbuffer.get(), + }; + return UInt32Value(buffer); + }, + constants::DRAW_BUFFER0..=constants::DRAW_BUFFER15 => { + let buffer = match self.base.get_read_framebuffer_slot().get() { + Some(fb) => { + let idx = parameter - constants::DRAW_BUFFER0; + fb.draw_buffer_i(idx as usize) + }, + None if parameter == constants::DRAW_BUFFER0 => { + self.default_fb_readbuffer.get() + }, + None => constants::NONE, + }; + return UInt32Value(buffer); + }, _ => {}, } @@ -3811,6 +3840,46 @@ impl WebGL2RenderingContextMethods for WebGL2RenderingContext { self.base .renderbuffer_storage(target, samples, internal_format, width, height) } + + /// https://www.khronos.org/registry/webgl/specs/latest/2.0/#3.7.4 + fn ReadBuffer(&self, src: u32) { + match src { + constants::BACK | constants::NONE => {}, + _ if self.base.valid_color_attachment_enum(src) => {}, + _ => return self.base.webgl_error(InvalidEnum), + } + + if let Some(fb) = self.base.get_read_framebuffer_slot().get() { + handle_potential_webgl_error!(self.base, fb.set_read_buffer(src), return) + } else { + match src { + constants::NONE | constants::BACK => {}, + _ => return self.base.webgl_error(InvalidOperation), + } + + self.default_fb_readbuffer.set(src); + self.base.send_command(WebGLCommand::ReadBuffer(src)); + } + } + + /// https://www.khronos.org/registry/webgl/specs/latest/2.0/#3.7.11 + fn DrawBuffers(&self, buffers: Vec) { + if let Some(fb) = self.base.get_draw_framebuffer_slot().get() { + handle_potential_webgl_error!(self.base, fb.set_draw_buffers(buffers), return) + } else { + if buffers.len() != 1 { + return self.base.webgl_error(InvalidOperation); + } + + match buffers[0] { + constants::NONE | constants::BACK => {}, + _ => return self.base.webgl_error(InvalidOperation), + } + + self.default_fb_drawbuffer.set(buffers[0]); + self.base.send_command(WebGLCommand::DrawBuffers(buffers)); + } + } } impl LayoutCanvasWebGLRenderingContextHelpers for LayoutDom { -- cgit v1.2.3 From a6359fe587aa5ed55aee8bb1b7a4a2c4138ec6c3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=C3=A1ty=C3=A1s=20Mustoha?= Date: Mon, 16 Mar 2020 13:06:02 +0100 Subject: Do not try to read pixels from an FBO without read buffer Adds another check to the WebGL2 ReadPixels implementation to fix an OpenGL invalid operation crash when the method is called on a bound framebuffer that has no read buffer. --- components/script/dom/webgl2renderingcontext.rs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) (limited to 'components/script/dom/webgl2renderingcontext.rs') diff --git a/components/script/dom/webgl2renderingcontext.rs b/components/script/dom/webgl2renderingcontext.rs index c0c3aab5ad6..7b1a68b475a 100644 --- a/components/script/dom/webgl2renderingcontext.rs +++ b/components/script/dom/webgl2renderingcontext.rs @@ -349,7 +349,11 @@ impl WebGL2RenderingContext { } let fb_slot = self.base.get_draw_framebuffer_slot(); - if fb_slot.get().is_none() && self.default_fb_readbuffer.get() == constants::NONE { + let fb_readbuffer_valid = match fb_slot.get() { + Some(fb) => fb.attachment(fb.read_buffer()).is_some(), + None => self.default_fb_readbuffer.get() != constants::NONE, + }; + if !fb_readbuffer_valid { return self.base.webgl_error(InvalidOperation); } -- cgit v1.2.3 From 3a3397fbce728c79aa5edf469a1a7763c3efcbde Mon Sep 17 00:00:00 2001 From: Josh Matthews Date: Thu, 19 Mar 2020 23:34:26 -0400 Subject: webgl: Ignore webgl communication errors when dropping vertex array objects. --- components/script/dom/webgl2renderingcontext.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'components/script/dom/webgl2renderingcontext.rs') diff --git a/components/script/dom/webgl2renderingcontext.rs b/components/script/dom/webgl2renderingcontext.rs index 7b1a68b475a..779fecd3194 100644 --- a/components/script/dom/webgl2renderingcontext.rs +++ b/components/script/dom/webgl2renderingcontext.rs @@ -222,7 +222,7 @@ impl WebGL2RenderingContext { fn unbind_from(&self, slot: &MutNullableDom, buffer: &WebGLBuffer) { if slot.get().map_or(false, |b| buffer == &*b) { - buffer.decrement_attached_counter(); + buffer.decrement_attached_counter(false); slot.set(None); } } @@ -3405,7 +3405,7 @@ impl WebGL2RenderingContextMethods for WebGL2RenderingContext { for slot in &[&generic_slot, &indexed_binding.buffer] { if let Some(old) = slot.get() { - old.decrement_attached_counter(); + old.decrement_attached_counter(false); } slot.set(buffer); } @@ -3483,7 +3483,7 @@ impl WebGL2RenderingContextMethods for WebGL2RenderingContext { for slot in &[&generic_slot, &indexed_binding.buffer] { if let Some(old) = slot.get() { - old.decrement_attached_counter(); + old.decrement_attached_counter(false); } slot.set(buffer); } -- cgit v1.2.3 From 3ea6d87bcc37167464e856949a4b9b77d0e9318a Mon Sep 17 00:00:00 2001 From: YUAN LYU Date: Fri, 20 Mar 2020 22:14:18 -0400 Subject: Add trait DomObjectWrap to provide WRAP function --- components/script/dom/webgl2renderingcontext.rs | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) (limited to 'components/script/dom/webgl2renderingcontext.rs') diff --git a/components/script/dom/webgl2renderingcontext.rs b/components/script/dom/webgl2renderingcontext.rs index 7b1a68b475a..fef9b062123 100644 --- a/components/script/dom/webgl2renderingcontext.rs +++ b/components/script/dom/webgl2renderingcontext.rs @@ -2,7 +2,6 @@ * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ -use crate::dom::bindings::codegen::Bindings::WebGL2RenderingContextBinding; use crate::dom::bindings::codegen::Bindings::WebGL2RenderingContextBinding::WebGL2RenderingContextConstants as constants; use crate::dom::bindings::codegen::Bindings::WebGL2RenderingContextBinding::WebGL2RenderingContextMethods; use crate::dom::bindings::codegen::Bindings::WebGLRenderingContextBinding::WebGLContextAttributes; @@ -176,9 +175,8 @@ impl WebGL2RenderingContext { size: Size2D, attrs: GLContextAttributes, ) -> Option> { - WebGL2RenderingContext::new_inherited(window, canvas, size, attrs).map(|ctx| { - reflect_dom_object(Box::new(ctx), window, WebGL2RenderingContextBinding::Wrap) - }) + WebGL2RenderingContext::new_inherited(window, canvas, size, attrs) + .map(|ctx| reflect_dom_object(Box::new(ctx), window)) } } -- cgit v1.2.3 From dba6a635e5df980b2837495aae59711739c23716 Mon Sep 17 00:00:00 2001 From: Anthony Ramine Date: Fri, 27 Mar 2020 17:37:56 +0100 Subject: Give a lifetime parameter to LayoutDom --- components/script/dom/webgl2renderingcontext.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'components/script/dom/webgl2renderingcontext.rs') diff --git a/components/script/dom/webgl2renderingcontext.rs b/components/script/dom/webgl2renderingcontext.rs index fef9b062123..80f8d1bc0f5 100644 --- a/components/script/dom/webgl2renderingcontext.rs +++ b/components/script/dom/webgl2renderingcontext.rs @@ -3884,7 +3884,7 @@ impl WebGL2RenderingContextMethods for WebGL2RenderingContext { } } -impl LayoutCanvasWebGLRenderingContextHelpers for LayoutDom { +impl LayoutCanvasWebGLRenderingContextHelpers for LayoutDom<'_, WebGL2RenderingContext> { #[allow(unsafe_code)] unsafe fn canvas_data_source(&self) -> HTMLCanvasDataSource { let this = &*self.unsafe_get(); -- cgit v1.2.3 From d87444cb1fab20b0f4458f5cb8559a541babbca6 Mon Sep 17 00:00:00 2001 From: Anthony Ramine Date: Sun, 29 Mar 2020 17:25:59 +0200 Subject: Make LayoutCanvasWebGLRenderingContextHelpers methods take self --- components/script/dom/webgl2renderingcontext.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'components/script/dom/webgl2renderingcontext.rs') diff --git a/components/script/dom/webgl2renderingcontext.rs b/components/script/dom/webgl2renderingcontext.rs index 03eb5e7abc2..8ae05c05363 100644 --- a/components/script/dom/webgl2renderingcontext.rs +++ b/components/script/dom/webgl2renderingcontext.rs @@ -3886,7 +3886,7 @@ impl WebGL2RenderingContextMethods for WebGL2RenderingContext { impl LayoutCanvasWebGLRenderingContextHelpers for LayoutDom<'_, WebGL2RenderingContext> { #[allow(unsafe_code)] - unsafe fn canvas_data_source(&self) -> HTMLCanvasDataSource { + unsafe fn canvas_data_source(self) -> HTMLCanvasDataSource { let this = &*self.unsafe_get(); (*this.base.to_layout().unsafe_get()).layout_handle() } -- cgit v1.2.3 From bfa43fbeba1ffb1adca44d18bb22dbee81069af9 Mon Sep 17 00:00:00 2001 From: Istvan Date: Wed, 18 Mar 2020 10:53:23 +0100 Subject: Add support for DrawRangeElements in WebGL2 Adds initial support for the WebGL2 `DrawRangeElements` call. --- components/script/dom/webgl2renderingcontext.rs | 68 +++++++++++++++++++++++++ 1 file changed, 68 insertions(+) (limited to 'components/script/dom/webgl2renderingcontext.rs') diff --git a/components/script/dom/webgl2renderingcontext.rs b/components/script/dom/webgl2renderingcontext.rs index 03eb5e7abc2..3892d2bf320 100644 --- a/components/script/dom/webgl2renderingcontext.rs +++ b/components/script/dom/webgl2renderingcontext.rs @@ -189,6 +189,48 @@ impl WebGL2RenderingContext { self.base.current_vao_webgl2() } + pub fn validate_uniform_block_for_draw(&self) { + let program = match self.base.current_program() { + Some(program) => program, + None => return, + }; + for uniform_block in program.active_uniform_blocks().iter() { + let data_size = uniform_block.size as usize; + for block in program.active_uniforms().iter() { + let index = match block.bind_index { + Some(index) => index, + None => continue, + }; + let indexed = &self.indexed_uniform_buffer_bindings[index as usize]; + let buffer = match indexed.buffer.get() { + Some(buffer) => buffer, + None => { + self.base.webgl_error(InvalidOperation); + return; + }, + }; + if indexed.size.get() == 0 { + if data_size > buffer.capacity() { + self.base.webgl_error(InvalidOperation); + return; + } + } else { + let start = indexed.start.get() as usize; + let mut size = indexed.size.get() as usize; + if start >= size { + self.base.webgl_error(InvalidOperation); + return; + } + size -= start; + if data_size > size { + self.base.webgl_error(InvalidOperation); + return; + } + } + } + } + } + pub fn base_context(&self) -> DomRoot { DomRoot::from_ref(&*self.base) } @@ -1527,11 +1569,13 @@ impl WebGL2RenderingContextMethods for WebGL2RenderingContext { /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.11 fn DrawArrays(&self, mode: u32, first: i32, count: i32) { + self.validate_uniform_block_for_draw(); self.base.DrawArrays(mode, first, count) } /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.11 fn DrawElements(&self, mode: u32, count: i32, type_: u32, offset: i64) { + self.validate_uniform_block_for_draw(); self.base.DrawElements(mode, count, type_, offset) } @@ -2776,6 +2820,7 @@ impl WebGL2RenderingContextMethods for WebGL2RenderingContext { /// https://www.khronos.org/registry/webgl/specs/latest/2.0/#3.7.9 fn DrawArraysInstanced(&self, mode: u32, first: i32, count: i32, primcount: i32) { + self.validate_uniform_block_for_draw(); handle_potential_webgl_error!( self.base, self.base @@ -2792,6 +2837,7 @@ impl WebGL2RenderingContextMethods for WebGL2RenderingContext { offset: i64, primcount: i32, ) { + self.validate_uniform_block_for_draw(); handle_potential_webgl_error!( self.base, self.base @@ -2799,6 +2845,28 @@ impl WebGL2RenderingContextMethods for WebGL2RenderingContext { ) } + /// https://www.khronos.org/registry/webgl/specs/latest/2.0/#3.7.9 + fn DrawRangeElements( + &self, + mode: u32, + start: u32, + end: u32, + count: i32, + type_: u32, + offset: i64, + ) { + if end < start { + self.base.webgl_error(InvalidValue); + return; + } + self.validate_uniform_block_for_draw(); + handle_potential_webgl_error!( + self.base, + self.base + .draw_elements_instanced(mode, count, type_, offset, 1) + ) + } + /// https://www.khronos.org/registry/webgl/specs/latest/2.0/#3.7.9 fn VertexAttribDivisor(&self, index: u32, divisor: u32) { self.base.vertex_attrib_divisor(index, divisor); -- cgit v1.2.3 From fccfff11c521377c91a26729710d54920379a8eb Mon Sep 17 00:00:00 2001 From: Manish Goregaokar Date: Mon, 6 Apr 2020 17:41:55 -0700 Subject: Update euclid --- components/script/dom/webgl2renderingcontext.rs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) (limited to 'components/script/dom/webgl2renderingcontext.rs') diff --git a/components/script/dom/webgl2renderingcontext.rs b/components/script/dom/webgl2renderingcontext.rs index 54c0da20333..fea8b54e849 100644 --- a/components/script/dom/webgl2renderingcontext.rs +++ b/components/script/dom/webgl2renderingcontext.rs @@ -25,8 +25,7 @@ use crate::dom::webglprogram::WebGLProgram; use crate::dom::webglquery::WebGLQuery; use crate::dom::webglrenderbuffer::WebGLRenderbuffer; use crate::dom::webglrenderingcontext::{ - uniform_get, uniform_typed, LayoutCanvasWebGLRenderingContextHelpers, Size2DExt, - WebGLRenderingContext, + uniform_get, uniform_typed, LayoutCanvasWebGLRenderingContextHelpers, WebGLRenderingContext, }; use crate::dom::webglsampler::{WebGLSampler, WebGLSamplerValue}; use crate::dom::webglshader::WebGLShader; -- cgit v1.2.3 From 62f00df79d8945e43c42a6100d87faefa1aa04e0 Mon Sep 17 00:00:00 2001 From: Istvan Date: Fri, 27 Mar 2020 15:56:19 +0100 Subject: Add initial support for VertexAttribI4*, VertexAttribIPointer Adds initial support for the WebGL2 `VertexAttribI4i`, `VertexAttribI4iv`, `VertexAttribI4ui`, `VertexAttribI4uiv` and `VertexAttribIPointer` calls. --- components/script/dom/webgl2renderingcontext.rs | 134 +++++++++++++++++++++++- 1 file changed, 133 insertions(+), 1 deletion(-) (limited to 'components/script/dom/webgl2renderingcontext.rs') diff --git a/components/script/dom/webgl2renderingcontext.rs b/components/script/dom/webgl2renderingcontext.rs index fea8b54e849..ae6b66187cd 100644 --- a/components/script/dom/webgl2renderingcontext.rs +++ b/components/script/dom/webgl2renderingcontext.rs @@ -25,7 +25,7 @@ use crate::dom::webglprogram::WebGLProgram; use crate::dom::webglquery::WebGLQuery; use crate::dom::webglrenderbuffer::WebGLRenderbuffer; use crate::dom::webglrenderingcontext::{ - uniform_get, uniform_typed, LayoutCanvasWebGLRenderingContextHelpers, WebGLRenderingContext, + uniform_get, uniform_typed, LayoutCanvasWebGLRenderingContextHelpers, VertexAttrib, WebGLRenderingContext, }; use crate::dom::webglsampler::{WebGLSampler, WebGLSamplerValue}; use crate::dom::webglshader::WebGLShader; @@ -230,6 +230,62 @@ impl WebGL2RenderingContext { } } + fn validate_vertex_attribs_for_draw(&self) { + let program = match self.base.current_program() { + Some(program) => program, + None => return, + }; + let groups = [ + [ + constants::INT, + constants::INT_VEC2, + constants::INT_VEC3, + constants::INT_VEC4, + ], + [ + constants::UNSIGNED_INT, + constants::UNSIGNED_INT_VEC2, + constants::UNSIGNED_INT_VEC3, + constants::UNSIGNED_INT_VEC4, + ], + [ + constants::FLOAT, + constants::FLOAT_VEC2, + constants::FLOAT_VEC3, + constants::FLOAT_VEC4, + ], + ]; + let vao = self.current_vao(); + for prog_attrib in program.active_attribs().iter() { + let attrib = handle_potential_webgl_error!( + self.base, + vao.get_vertex_attrib(prog_attrib.location as u32) + .ok_or(InvalidOperation), + return + ); + + let current_vertex_attrib = + self.base.current_vertex_attribs()[prog_attrib.location as usize]; + let attrib_data_base_type = if !attrib.enabled_as_array { + match current_vertex_attrib { + VertexAttrib::Int(_, _, _, _) => constants::INT, + VertexAttrib::Uint(_, _, _, _) => constants::UNSIGNED_INT, + VertexAttrib::Float(_, _, _, _) => constants::FLOAT, + } + } else { + attrib.type_ + }; + + let contains = groups + .iter() + .find(|g| g.contains(&attrib_data_base_type) && g.contains(&prog_attrib.type_)); + if contains.is_none() { + self.base.webgl_error(InvalidOperation); + return; + } + } + } + pub fn base_context(&self) -> DomRoot { DomRoot::from_ref(&*self.base) } @@ -739,6 +795,28 @@ impl WebGL2RenderingContext { true } + + fn vertex_attrib_i(&self, index: u32, x: i32, y: i32, z: i32, w: i32) { + if index >= self.base.limits().max_vertex_attribs { + return self.base.webgl_error(InvalidValue); + } + self.base.current_vertex_attribs()[index as usize] = VertexAttrib::Int(x, y, z, w); + self.current_vao() + .set_vertex_attrib_type(index, constants::INT); + self.base + .send_command(WebGLCommand::VertexAttribI(index, x, y, z, w)); + } + + fn vertex_attrib_u(&self, index: u32, x: u32, y: u32, z: u32, w: u32) { + if index >= self.base.limits().max_vertex_attribs { + return self.base.webgl_error(InvalidValue); + } + self.base.current_vertex_attribs()[index as usize] = VertexAttrib::Uint(x, y, z, w); + self.current_vao() + .set_vertex_attrib_type(index, constants::UNSIGNED_INT); + self.base + .send_command(WebGLCommand::VertexAttribU(index, x, y, z, w)); + } } impl WebGL2RenderingContextMethods for WebGL2RenderingContext { @@ -1569,12 +1647,14 @@ impl WebGL2RenderingContextMethods for WebGL2RenderingContext { /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.11 fn DrawArrays(&self, mode: u32, first: i32, count: i32) { self.validate_uniform_block_for_draw(); + self.validate_vertex_attribs_for_draw(); self.base.DrawArrays(mode, first, count) } /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.11 fn DrawElements(&self, mode: u32, count: i32, type_: u32, offset: i64) { self.validate_uniform_block_for_draw(); + self.validate_vertex_attribs_for_draw(); self.base.DrawElements(mode, count, type_, offset) } @@ -2591,6 +2671,40 @@ impl WebGL2RenderingContextMethods for WebGL2RenderingContext { self.base.VertexAttrib4fv(indx, v) } + /// https://www.khronos.org/registry/webgl/specs/latest/2.0/#3.7.8 + fn VertexAttribI4i(&self, index: u32, x: i32, y: i32, z: i32, w: i32) { + self.vertex_attrib_i(index, x, y, z, w) + } + + /// https://www.khronos.org/registry/webgl/specs/latest/2.0/#3.7.8 + fn VertexAttribI4iv(&self, index: u32, v: Int32ArrayOrLongSequence) { + let values = match v { + Int32ArrayOrLongSequence::Int32Array(v) => v.to_vec(), + Int32ArrayOrLongSequence::LongSequence(v) => v, + }; + if values.len() < 4 { + return self.base.webgl_error(InvalidValue); + } + self.vertex_attrib_i(index, values[0], values[1], values[2], values[3]); + } + + /// https://www.khronos.org/registry/webgl/specs/latest/2.0/#3.7.8 + fn VertexAttribI4ui(&self, index: u32, x: u32, y: u32, z: u32, w: u32) { + self.vertex_attrib_u(index, x, y, z, w) + } + + /// https://www.khronos.org/registry/webgl/specs/latest/2.0/#3.7.8 + fn VertexAttribI4uiv(&self, index: u32, v: Uint32ArrayOrUnsignedLongSequence) { + let values = match v { + Uint32ArrayOrUnsignedLongSequence::Uint32Array(v) => v.to_vec(), + Uint32ArrayOrUnsignedLongSequence::UnsignedLongSequence(v) => v, + }; + if values.len() < 4 { + return self.base.webgl_error(InvalidValue); + } + self.vertex_attrib_u(index, values[0], values[1], values[2], values[3]); + } + /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.10 fn VertexAttribPointer( &self, @@ -2605,6 +2719,21 @@ impl WebGL2RenderingContextMethods for WebGL2RenderingContext { .VertexAttribPointer(attrib_id, size, data_type, normalized, stride, offset) } + /// https://www.khronos.org/registry/webgl/specs/latest/2.0/#3.7.8 + fn VertexAttribIPointer(&self, index: u32, size: i32, type_: u32, stride: i32, offset: i64) { + match type_ { + constants::BYTE | + constants::UNSIGNED_BYTE | + constants::SHORT | + constants::UNSIGNED_SHORT | + constants::INT | + constants::UNSIGNED_INT => {}, + _ => return self.base.webgl_error(InvalidEnum), + }; + self.base + .VertexAttribPointer(index, size, type_, false, stride, offset) + } + /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.4 fn Viewport(&self, x: i32, y: i32, width: i32, height: i32) { self.base.Viewport(x, y, width, height) @@ -2820,6 +2949,7 @@ impl WebGL2RenderingContextMethods for WebGL2RenderingContext { /// https://www.khronos.org/registry/webgl/specs/latest/2.0/#3.7.9 fn DrawArraysInstanced(&self, mode: u32, first: i32, count: i32, primcount: i32) { self.validate_uniform_block_for_draw(); + self.validate_vertex_attribs_for_draw(); handle_potential_webgl_error!( self.base, self.base @@ -2837,6 +2967,7 @@ impl WebGL2RenderingContextMethods for WebGL2RenderingContext { primcount: i32, ) { self.validate_uniform_block_for_draw(); + self.validate_vertex_attribs_for_draw(); handle_potential_webgl_error!( self.base, self.base @@ -2859,6 +2990,7 @@ impl WebGL2RenderingContextMethods for WebGL2RenderingContext { return; } self.validate_uniform_block_for_draw(); + self.validate_vertex_attribs_for_draw(); handle_potential_webgl_error!( self.base, self.base -- cgit v1.2.3 From 66b2b3293de3ae99f807d30420e34affa1d3770d Mon Sep 17 00:00:00 2001 From: Josh Matthews Date: Tue, 7 Apr 2020 14:33:16 -0400 Subject: webgl: Fix active uniform block length check. --- components/script/dom/webgl2renderingcontext.rs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'components/script/dom/webgl2renderingcontext.rs') diff --git a/components/script/dom/webgl2renderingcontext.rs b/components/script/dom/webgl2renderingcontext.rs index ae6b66187cd..777eb87ae55 100644 --- a/components/script/dom/webgl2renderingcontext.rs +++ b/components/script/dom/webgl2renderingcontext.rs @@ -25,7 +25,8 @@ use crate::dom::webglprogram::WebGLProgram; use crate::dom::webglquery::WebGLQuery; use crate::dom::webglrenderbuffer::WebGLRenderbuffer; use crate::dom::webglrenderingcontext::{ - uniform_get, uniform_typed, LayoutCanvasWebGLRenderingContextHelpers, VertexAttrib, WebGLRenderingContext, + uniform_get, uniform_typed, LayoutCanvasWebGLRenderingContextHelpers, VertexAttrib, + WebGLRenderingContext, }; use crate::dom::webglsampler::{WebGLSampler, WebGLSamplerValue}; use crate::dom::webglshader::WebGLShader; -- cgit v1.2.3 From 9673091d7ab5a005ad6a042482127aa17224a492 Mon Sep 17 00:00:00 2001 From: Josh Matthews Date: Tue, 7 Apr 2020 21:57:38 -0400 Subject: webgl: Only error when beginning transform feedback on programs that have no varying values. --- components/script/dom/webgl2renderingcontext.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'components/script/dom/webgl2renderingcontext.rs') diff --git a/components/script/dom/webgl2renderingcontext.rs b/components/script/dom/webgl2renderingcontext.rs index 777eb87ae55..62af18d1002 100644 --- a/components/script/dom/webgl2renderingcontext.rs +++ b/components/script/dom/webgl2renderingcontext.rs @@ -3456,7 +3456,7 @@ impl WebGL2RenderingContextMethods for WebGL2RenderingContext { return; }, }; - if !program.is_linked() || program.transform_feedback_varyings_length() != 0 { + if !program.is_linked() || program.transform_feedback_varyings_length() == 0 { self.base.webgl_error(InvalidOperation); return; }; -- cgit v1.2.3 From e2845a69391e434fb6a4a9cdf18349dcb92f63e2 Mon Sep 17 00:00:00 2001 From: Josh Matthews Date: Wed, 15 Apr 2020 11:42:02 -0400 Subject: Automatically enable WebGL 2 for specific domains. --- components/script/dom/webgl2renderingcontext.rs | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) (limited to 'components/script/dom/webgl2renderingcontext.rs') diff --git a/components/script/dom/webgl2renderingcontext.rs b/components/script/dom/webgl2renderingcontext.rs index 62af18d1002..8e967fbcb86 100644 --- a/components/script/dom/webgl2renderingcontext.rs +++ b/components/script/dom/webgl2renderingcontext.rs @@ -16,6 +16,7 @@ use crate::dom::bindings::reflector::DomObject; use crate::dom::bindings::reflector::{reflect_dom_object, Reflector}; use crate::dom::bindings::root::{Dom, DomRoot, LayoutDom, MutNullableDom}; use crate::dom::bindings::str::DOMString; +use crate::dom::globalscope::GlobalScope; use crate::dom::htmlcanvaselement::HTMLCanvasElement; use crate::dom::htmliframeelement::HTMLIFrameElement; use crate::dom::webglactiveinfo::WebGLActiveInfo; @@ -50,12 +51,14 @@ use ipc_channel::ipc; use js::jsapi::{JSObject, Type}; use js::jsval::{BooleanValue, DoubleValue, Int32Value, UInt32Value}; use js::jsval::{JSVal, NullValue, ObjectValue, UndefinedValue}; -use js::rust::CustomAutoRooterGuard; +use js::rust::{CustomAutoRooterGuard, HandleObject}; use js::typedarray::{ArrayBufferView, CreateWith, Float32, Int32Array, Uint32, Uint32Array}; use script_layout_interface::HTMLCanvasDataSource; +use servo_config::pref; use std::cell::Cell; use std::cmp; use std::ptr::{self, NonNull}; +use url::Host; #[unrooted_must_root_lint::must_root] #[derive(JSTraceable, MallocSizeOf)] @@ -178,8 +181,26 @@ impl WebGL2RenderingContext { WebGL2RenderingContext::new_inherited(window, canvas, size, attrs) .map(|ctx| reflect_dom_object(Box::new(ctx), window)) } + + #[allow(unsafe_code)] + pub fn is_webgl2_enabled(_cx: JSContext, global: HandleObject) -> bool { + if pref!(dom.webgl2.enabled) { + return true; + } + + let global = unsafe { GlobalScope::from_object(global.get()) }; + let origin = global.origin(); + let host = origin.host(); + WEBGL2_ORIGINS + .iter() + .any(|origin| host == Host::parse(origin).ok().as_ref()) + } } +/// List of domains for which WebGL 2 is enabled automatically, regardless +/// of the status of the dom.webgl2.enabled preference. +static WEBGL2_ORIGINS: &[&str] = &["www.servoexperiments.com"]; + impl WebGL2RenderingContext { pub fn recreate(&self, size: Size2D) { self.base.recreate(size) -- cgit v1.2.3 From a90f034976853f6826fdef80b098a4744599c28d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=C3=A1ty=C3=A1s=20Mustoha?= Date: Wed, 22 Apr 2020 12:25:36 +0200 Subject: Fix InvalidateSubFramebuffer error handling The WebGL2 InvalidateSubFramebuffer function should generate INVALID_VALUE when width or height is negative. --- components/script/dom/webgl2renderingcontext.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'components/script/dom/webgl2renderingcontext.rs') diff --git a/components/script/dom/webgl2renderingcontext.rs b/components/script/dom/webgl2renderingcontext.rs index 8e967fbcb86..4bb102bff12 100644 --- a/components/script/dom/webgl2renderingcontext.rs +++ b/components/script/dom/webgl2renderingcontext.rs @@ -3966,7 +3966,7 @@ impl WebGL2RenderingContextMethods for WebGL2RenderingContext { } if width < 0 || height < 0 { - return; + return self.base.webgl_error(InvalidValue); } self.base -- cgit v1.2.3 From 9c343fcc9600a1a2b768a4632793d0856d55ddce Mon Sep 17 00:00:00 2001 From: Tobias Tschinkowitz Date: Thu, 23 Apr 2020 18:23:01 +0200 Subject: Replaced failible boolean with an enum --- components/script/dom/webgl2renderingcontext.rs | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) (limited to 'components/script/dom/webgl2renderingcontext.rs') diff --git a/components/script/dom/webgl2renderingcontext.rs b/components/script/dom/webgl2renderingcontext.rs index 4bb102bff12..9d73a22e0ad 100644 --- a/components/script/dom/webgl2renderingcontext.rs +++ b/components/script/dom/webgl2renderingcontext.rs @@ -26,7 +26,7 @@ use crate::dom::webglprogram::WebGLProgram; use crate::dom::webglquery::WebGLQuery; use crate::dom::webglrenderbuffer::WebGLRenderbuffer; use crate::dom::webglrenderingcontext::{ - uniform_get, uniform_typed, LayoutCanvasWebGLRenderingContextHelpers, VertexAttrib, + uniform_get, uniform_typed, LayoutCanvasWebGLRenderingContextHelpers, Operation, VertexAttrib, WebGLRenderingContext, }; use crate::dom::webglsampler::{WebGLSampler, WebGLSamplerValue}; @@ -339,7 +339,7 @@ impl WebGL2RenderingContext { fn unbind_from(&self, slot: &MutNullableDom, buffer: &WebGLBuffer) { if slot.get().map_or(false, |b| buffer == &*b) { - buffer.decrement_attached_counter(false); + buffer.decrement_attached_counter(Operation::Infallible); slot.set(None); } } @@ -1633,7 +1633,7 @@ impl WebGL2RenderingContextMethods for WebGL2RenderingContext { self.unbind_from(&binding.buffer, &buffer); } - buffer.mark_for_deletion(false); + buffer.mark_for_deletion(Operation::Infallible); } /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.6 @@ -3054,7 +3054,7 @@ impl WebGL2RenderingContextMethods for WebGL2RenderingContext { } } - query.delete(false); + query.delete(Operation::Infallible); } } @@ -3080,7 +3080,7 @@ impl WebGL2RenderingContextMethods for WebGL2RenderingContext { slot.set(None); } } - sampler.delete(false); + sampler.delete(Operation::Infallible); } } @@ -3311,7 +3311,7 @@ impl WebGL2RenderingContextMethods for WebGL2RenderingContext { fn DeleteSync(&self, sync: Option<&WebGLSync>) { if let Some(sync) = sync { handle_potential_webgl_error!(self.base, self.base.validate_ownership(sync), return); - sync.delete(false); + sync.delete(Operation::Infallible); } } @@ -3390,7 +3390,7 @@ impl WebGL2RenderingContextMethods for WebGL2RenderingContext { self.base.webgl_error(InvalidOperation); return; } - tf.delete(false); + tf.delete(Operation::Infallible); self.current_transform_feedback.set(None); } } @@ -3624,7 +3624,7 @@ impl WebGL2RenderingContextMethods for WebGL2RenderingContext { for slot in &[&generic_slot, &indexed_binding.buffer] { if let Some(old) = slot.get() { - old.decrement_attached_counter(false); + old.decrement_attached_counter(Operation::Infallible); } slot.set(buffer); } @@ -3702,7 +3702,7 @@ impl WebGL2RenderingContextMethods for WebGL2RenderingContext { for slot in &[&generic_slot, &indexed_binding.buffer] { if let Some(old) = slot.get() { - old.decrement_attached_counter(false); + old.decrement_attached_counter(Operation::Infallible); } slot.set(buffer); } -- cgit v1.2.3 From 1ce68eb4ea0beebda910d6b32a2fdb8c76dc5b3c Mon Sep 17 00:00:00 2001 From: Josh Matthews Date: Thu, 23 Apr 2020 15:21:57 -0400 Subject: webgl: Update IDL from upstream to avoid overloading issues. --- components/script/dom/webgl2renderingcontext.rs | 91 +++++++++++++------------ 1 file changed, 46 insertions(+), 45 deletions(-) (limited to 'components/script/dom/webgl2renderingcontext.rs') diff --git a/components/script/dom/webgl2renderingcontext.rs b/components/script/dom/webgl2renderingcontext.rs index 4bb102bff12..d86879907c9 100644 --- a/components/script/dom/webgl2renderingcontext.rs +++ b/components/script/dom/webgl2renderingcontext.rs @@ -18,7 +18,6 @@ use crate::dom::bindings::root::{Dom, DomRoot, LayoutDom, MutNullableDom}; use crate::dom::bindings::str::DOMString; use crate::dom::globalscope::GlobalScope; use crate::dom::htmlcanvaselement::HTMLCanvasElement; -use crate::dom::htmliframeelement::HTMLIFrameElement; use crate::dom::webglactiveinfo::WebGLActiveInfo; use crate::dom::webglbuffer::WebGLBuffer; use crate::dom::webglframebuffer::{WebGLFramebuffer, WebGLFramebufferAttachmentRoot}; @@ -1193,7 +1192,7 @@ impl WebGL2RenderingContextMethods for WebGL2RenderingContext { } /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.5 - fn BufferData(&self, target: u32, data: Option, usage: u32) { + fn BufferData_(&self, target: u32, data: Option, usage: u32) { let usage = handle_potential_webgl_error!(self.base, self.buffer_usage(usage), return); let bound_buffer = handle_potential_webgl_error!(self.base, self.bound_buffer(target), return); @@ -1201,7 +1200,7 @@ impl WebGL2RenderingContextMethods for WebGL2RenderingContext { } /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.5 - fn BufferData_(&self, target: u32, size: i64, usage: u32) { + fn BufferData(&self, target: u32, size: i64, usage: u32) { let usage = handle_potential_webgl_error!(self.base, self.buffer_usage(usage), return); let bound_buffer = handle_potential_webgl_error!(self.base, self.bound_buffer(target), return); @@ -1425,7 +1424,8 @@ impl WebGL2RenderingContextMethods for WebGL2RenderingContext { } } - /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.8 + /// https://www.khronos.org/registry/webgl/specs/latest/2.0/#3.7.6 + #[allow(unsafe_code)] fn CompressedTexImage2D( &self, target: u32, @@ -1435,19 +1435,32 @@ impl WebGL2RenderingContextMethods for WebGL2RenderingContext { height: i32, border: i32, pixels: CustomAutoRooterGuard, + src_offset: u32, + src_length_override: u32, ) { - self.base.CompressedTexImage2D( + let mut data = unsafe { pixels.as_slice() }; + let start = src_offset as usize; + let end = (src_offset + src_length_override) as usize; + if start > data.len() || end > data.len() { + self.base.webgl_error(InvalidValue); + return; + } + if src_length_override != 0 { + data = &data[start..end]; + } + self.base.compressed_tex_image_2d( target, level, internal_format, width, height, border, - pixels, + data, ) } /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.8 + #[allow(unsafe_code)] fn CompressedTexSubImage2D( &self, target: u32, @@ -1458,9 +1471,21 @@ impl WebGL2RenderingContextMethods for WebGL2RenderingContext { height: i32, format: u32, pixels: CustomAutoRooterGuard, + src_offset: u32, + src_length_override: u32, ) { - self.base.CompressedTexSubImage2D( - target, level, xoffset, yoffset, width, height, format, pixels, + let mut data = unsafe { pixels.as_slice() }; + let start = src_offset as usize; + let end = (src_offset + src_length_override) as usize; + if start > data.len() || end > data.len() { + self.base.webgl_error(InvalidValue); + return; + } + if src_length_override != 0 { + data = &data[start..end]; + } + self.base.compressed_tex_sub_image_2d( + target, level, xoffset, yoffset, width, height, format, data, ) } @@ -2104,7 +2129,7 @@ impl WebGL2RenderingContextMethods for WebGL2RenderingContext { src_offset: u32, src_length: u32, ) { - self.base.Uniform1iv(location, v, src_offset, src_length) + self.base.uniform1iv(location, v, src_offset, src_length) } // https://www.khronos.org/registry/webgl/specs/latest/2.0/#3.7.8 @@ -2166,7 +2191,7 @@ impl WebGL2RenderingContextMethods for WebGL2RenderingContext { src_offset: u32, src_length: u32, ) { - self.base.Uniform1fv(location, v, src_offset, src_length); + self.base.uniform1fv(location, v, src_offset, src_length); } /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.10 @@ -2182,7 +2207,7 @@ impl WebGL2RenderingContextMethods for WebGL2RenderingContext { src_offset: u32, src_length: u32, ) { - self.base.Uniform2fv(location, v, src_offset, src_length); + self.base.uniform2fv(location, v, src_offset, src_length); } /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.10 @@ -2198,7 +2223,7 @@ impl WebGL2RenderingContextMethods for WebGL2RenderingContext { src_offset: u32, src_length: u32, ) { - self.base.Uniform2iv(location, v, src_offset, src_length) + self.base.uniform2iv(location, v, src_offset, src_length) } // https://www.khronos.org/registry/webgl/specs/latest/2.0/#3.7.8 @@ -2247,7 +2272,7 @@ impl WebGL2RenderingContextMethods for WebGL2RenderingContext { src_offset: u32, src_length: u32, ) { - self.base.Uniform3fv(location, v, src_offset, src_length); + self.base.uniform3fv(location, v, src_offset, src_length); } /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.10 @@ -2263,7 +2288,7 @@ impl WebGL2RenderingContextMethods for WebGL2RenderingContext { src_offset: u32, src_length: u32, ) { - self.base.Uniform3iv(location, v, src_offset, src_length) + self.base.uniform3iv(location, v, src_offset, src_length) } // https://www.khronos.org/registry/webgl/specs/latest/2.0/#3.7.8 @@ -2312,7 +2337,7 @@ impl WebGL2RenderingContextMethods for WebGL2RenderingContext { src_offset: u32, src_length: u32, ) { - self.base.Uniform4iv(location, v, src_offset, src_length) + self.base.uniform4iv(location, v, src_offset, src_length) } // https://www.khronos.org/registry/webgl/specs/latest/2.0/#3.7.8 @@ -2361,7 +2386,7 @@ impl WebGL2RenderingContextMethods for WebGL2RenderingContext { src_offset: u32, src_length: u32, ) { - self.base.Uniform4fv(location, v, src_offset, src_length); + self.base.uniform4fv(location, v, src_offset, src_length); } /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.10 @@ -2374,7 +2399,7 @@ impl WebGL2RenderingContextMethods for WebGL2RenderingContext { src_length: u32, ) { self.base - .UniformMatrix2fv(location, transpose, v, src_offset, src_length) + .uniform_matrix_2fv(location, transpose, v, src_offset, src_length) } /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.10 @@ -2387,7 +2412,7 @@ impl WebGL2RenderingContextMethods for WebGL2RenderingContext { src_length: u32, ) { self.base - .UniformMatrix3fv(location, transpose, v, src_offset, src_length) + .uniform_matrix_3fv(location, transpose, v, src_offset, src_length) } /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.10 @@ -2400,7 +2425,7 @@ impl WebGL2RenderingContextMethods for WebGL2RenderingContext { src_length: u32, ) { self.base - .UniformMatrix4fv(location, transpose, v, src_offset, src_length) + .uniform_matrix_4fv(location, transpose, v, src_offset, src_length) } /// https://www.khronos.org/registry/webgl/specs/latest/2.0/#3.7.8 @@ -2766,7 +2791,7 @@ impl WebGL2RenderingContextMethods for WebGL2RenderingContext { &self, target: u32, level: i32, - internal_format: u32, + internal_format: i32, width: i32, height: i32, border: i32, @@ -2792,7 +2817,7 @@ impl WebGL2RenderingContextMethods for WebGL2RenderingContext { &self, target: u32, level: i32, - internal_format: u32, + internal_format: i32, format: u32, data_type: u32, source: ImageDataOrHTMLImageElementOrHTMLCanvasElementOrHTMLVideoElement, @@ -2801,30 +2826,6 @@ impl WebGL2RenderingContextMethods for WebGL2RenderingContext { .TexImage2D_(target, level, internal_format, format, data_type, source) } - /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.8 - fn TexImageDOM( - &self, - target: u32, - level: i32, - internal_format: u32, - width: i32, - height: i32, - format: u32, - data_type: u32, - source: &HTMLIFrameElement, - ) -> Fallible<()> { - self.base.TexImageDOM( - target, - level, - internal_format, - width, - height, - format, - data_type, - source, - ) - } - /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.8 fn TexSubImage2D( &self, -- cgit v1.2.3 From 2810c8d41373cc957f91f668d8b393f3798870fe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=C3=A1ty=C3=A1s=20Mustoha?= Date: Tue, 28 Apr 2020 13:12:06 +0200 Subject: Add support for WebGL2 buffer types in GetBufferParameter This makes the new buffer types introduced in WebGL2 usable by the GetBufferParameter call. --- components/script/dom/webgl2renderingcontext.rs | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) (limited to 'components/script/dom/webgl2renderingcontext.rs') diff --git a/components/script/dom/webgl2renderingcontext.rs b/components/script/dom/webgl2renderingcontext.rs index 1828ab6fe7d..116de787178 100644 --- a/components/script/dom/webgl2renderingcontext.rs +++ b/components/script/dom/webgl2renderingcontext.rs @@ -867,8 +867,10 @@ impl WebGL2RenderingContextMethods for WebGL2RenderingContext { } /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.5 - fn GetBufferParameter(&self, cx: JSContext, target: u32, parameter: u32) -> JSVal { - self.base.GetBufferParameter(cx, target, parameter) + fn GetBufferParameter(&self, _cx: JSContext, target: u32, parameter: u32) -> JSVal { + let buffer = + handle_potential_webgl_error!(self.base, self.bound_buffer(target), return NullValue()); + self.base.get_buffer_param(buffer, parameter) } #[allow(unsafe_code)] -- cgit v1.2.3 From c5f0bff99ef5c897b5034fc72a3e407057e9dd2d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=C3=A1ty=C3=A1s=20Mustoha?= Date: Wed, 22 Apr 2020 14:48:14 +0200 Subject: Add support for some more WebGL2 limit parameters Adds support for the following new WebGL2 GetParameter values: - `MAX_ELEMENT_INDEX` - `MAX_ELEMENTS_INDICES` - `MAX_ELEMENTS_VERTICES` - `MAX_FRAGMENT_INPUT_COMPONENTS` - `MAX_SAMPLES` - `MAX_SERVER_WAIT_TIMEOUT` - `MAX_TEXTURE_LOD_BIAS` - `MAX_VARYING_COMPONENTS` - `MAX_VERTEX_OUTPUT_COMPONENTS` See: https://www.khronos.org/registry/webgl/specs/latest/2.0/#3.7.2 --- components/script/dom/webgl2renderingcontext.rs | 66 ++++++++++++++++++------- 1 file changed, 49 insertions(+), 17 deletions(-) (limited to 'components/script/dom/webgl2renderingcontext.rs') diff --git a/components/script/dom/webgl2renderingcontext.rs b/components/script/dom/webgl2renderingcontext.rs index 8e967fbcb86..949f3a3bbdc 100644 --- a/components/script/dom/webgl2renderingcontext.rs +++ b/components/script/dom/webgl2renderingcontext.rs @@ -887,10 +887,13 @@ impl WebGL2RenderingContextMethods for WebGL2RenderingContext { return rval.get(); }, constants::MAX_CLIENT_WAIT_TIMEOUT_WEBGL => { - return Int32Value( - self.base.limits().max_client_wait_timeout_webgl.as_nanos() as i32 + return DoubleValue( + self.base.limits().max_client_wait_timeout_webgl.as_nanos() as f64 ); }, + constants::MAX_SERVER_WAIT_TIMEOUT => { + return DoubleValue(self.base.limits().max_server_wait_timeout.as_nanos() as f64); + }, constants::SAMPLER_BINDING => unsafe { let idx = (self.base.textures().active_unit_enum() - constants::TEXTURE0) as usize; assert!(idx < self.samplers.len()); @@ -972,22 +975,59 @@ impl WebGL2RenderingContextMethods for WebGL2RenderingContext { }; return UInt32Value(buffer); }, + constants::MAX_TEXTURE_LOD_BIAS => { + return DoubleValue(self.base.limits().max_texture_lod_bias as f64) + }, + constants::MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS => { + return DoubleValue( + self.base.limits().max_combined_fragment_uniform_components as f64, + ) + }, + constants::MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS => { + return DoubleValue( + self.base.limits().max_combined_vertex_uniform_components as f64, + ) + }, + constants::MAX_ELEMENT_INDEX => { + return DoubleValue(self.base.limits().max_element_index as f64) + }, + constants::MAX_UNIFORM_BLOCK_SIZE => { + return DoubleValue(self.base.limits().max_uniform_block_size as f64) + }, _ => {}, } let limit = match parameter { - constants::MAX_UNIFORM_BUFFER_BINDINGS => { - Some(self.base.limits().max_uniform_buffer_bindings) + constants::MAX_3D_TEXTURE_SIZE => Some(self.base.limits().max_3d_texture_size), + constants::MAX_ARRAY_TEXTURE_LAYERS => { + Some(self.base.limits().max_array_texture_layers) }, - constants::MAX_UNIFORM_BLOCK_SIZE => Some(self.base.limits().max_uniform_block_size), + constants::MAX_COLOR_ATTACHMENTS => Some(self.base.limits().max_color_attachments), constants::MAX_COMBINED_UNIFORM_BLOCKS => { Some(self.base.limits().max_combined_uniform_blocks) }, - constants::MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS => { - Some(self.base.limits().max_combined_vertex_uniform_components) + constants::MAX_DRAW_BUFFERS => Some(self.base.limits().max_draw_buffers), + constants::MAX_ELEMENTS_INDICES => Some(self.base.limits().max_elements_indices), + constants::MAX_ELEMENTS_VERTICES => Some(self.base.limits().max_elements_vertices), + constants::MAX_FRAGMENT_INPUT_COMPONENTS => { + Some(self.base.limits().max_fragment_input_components) }, - constants::MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS => { - Some(self.base.limits().max_combined_fragment_uniform_components) + constants::MAX_FRAGMENT_UNIFORM_BLOCKS => { + Some(self.base.limits().max_fragment_uniform_blocks) + }, + constants::MAX_FRAGMENT_UNIFORM_COMPONENTS => { + Some(self.base.limits().max_fragment_uniform_components) + }, + constants::MAX_PROGRAM_TEXEL_OFFSET => { + Some(self.base.limits().max_program_texel_offset) + }, + constants::MAX_SAMPLES => Some(self.base.limits().max_samples), + constants::MAX_UNIFORM_BUFFER_BINDINGS => { + Some(self.base.limits().max_uniform_buffer_bindings) + }, + constants::MAX_VARYING_COMPONENTS => Some(self.base.limits().max_varying_components), + constants::MAX_VERTEX_OUTPUT_COMPONENTS => { + Some(self.base.limits().max_vertex_output_components) }, constants::MAX_VERTEX_UNIFORM_BLOCKS => { Some(self.base.limits().max_vertex_uniform_blocks) @@ -995,17 +1035,9 @@ impl WebGL2RenderingContextMethods for WebGL2RenderingContext { constants::MAX_VERTEX_UNIFORM_COMPONENTS => { Some(self.base.limits().max_vertex_uniform_components) }, - constants::MAX_FRAGMENT_UNIFORM_BLOCKS => { - Some(self.base.limits().max_fragment_uniform_blocks) - }, - constants::MAX_FRAGMENT_UNIFORM_COMPONENTS => { - Some(self.base.limits().max_fragment_uniform_components) - }, constants::UNIFORM_BUFFER_OFFSET_ALIGNMENT => { Some(self.base.limits().uniform_buffer_offset_alignment) }, - constants::MAX_COLOR_ATTACHMENTS => Some(self.base.limits().max_color_attachments), - constants::MAX_DRAW_BUFFERS => Some(self.base.limits().max_draw_buffers), _ => None, }; if let Some(limit) = limit { -- cgit v1.2.3 From 8789a6a8d8186416a766f7ef2a71af217e20f9fb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=C3=A1ty=C3=A1s=20Mustoha?= Date: Thu, 12 Mar 2020 14:55:46 +0100 Subject: Add support for WebGL2 TexStorage2D Adds initial support for the WebGL2 `TexStorage2D` call, adds support for the related texture enums and enables some of the texture tests. See: https://www.khronos.org/registry/webgl/specs/latest/2.0/#3.7.6 --- components/script/dom/webgl2renderingcontext.rs | 76 +++++++++++++++++++++++++ 1 file changed, 76 insertions(+) (limited to 'components/script/dom/webgl2renderingcontext.rs') diff --git a/components/script/dom/webgl2renderingcontext.rs b/components/script/dom/webgl2renderingcontext.rs index 6ed42deea01..037457960fe 100644 --- a/components/script/dom/webgl2renderingcontext.rs +++ b/components/script/dom/webgl2renderingcontext.rs @@ -18,6 +18,8 @@ use crate::dom::bindings::root::{Dom, DomRoot, LayoutDom, MutNullableDom}; use crate::dom::bindings::str::DOMString; use crate::dom::globalscope::GlobalScope; use crate::dom::htmlcanvaselement::HTMLCanvasElement; +use crate::dom::webgl_validations::tex_image_2d::{TexStorageValidator, TexStorageValidatorResult}; +use crate::dom::webgl_validations::WebGLValidator; use crate::dom::webglactiveinfo::WebGLActiveInfo; use crate::dom::webglbuffer::WebGLBuffer; use crate::dom::webglframebuffer::{WebGLFramebuffer, WebGLFramebufferAttachmentRoot}; @@ -838,6 +840,55 @@ impl WebGL2RenderingContext { self.base .send_command(WebGLCommand::VertexAttribU(index, x, y, z, w)); } + + fn tex_storage( + &self, + dimensions: u8, + target: u32, + levels: i32, + internal_format: u32, + width: i32, + height: i32, + depth: i32, + ) { + let expected_dimensions = match target { + constants::TEXTURE_2D | constants::TEXTURE_CUBE_MAP => 2, + constants::TEXTURE_3D | constants::TEXTURE_2D_ARRAY => 3, + _ => return self.base.webgl_error(InvalidEnum), + }; + if dimensions != expected_dimensions { + return self.base.webgl_error(InvalidEnum); + } + + let validator = TexStorageValidator::new( + &self.base, + dimensions, + target, + levels, + internal_format, + width, + height, + depth, + ); + let TexStorageValidatorResult { + texture, + target, + levels, + internal_format, + width, + height, + depth, + } = match validator.validate() { + Ok(result) => result, + Err(_) => return, // NB: The validator sets the correct error for us. + }; + + handle_potential_webgl_error!( + self.base, + texture.storage(target, levels, internal_format, width, height, depth), + return + ); + } } impl WebGL2RenderingContextMethods for WebGL2RenderingContext { @@ -4138,6 +4189,31 @@ impl WebGL2RenderingContextMethods for WebGL2RenderingContext { self.base.send_command(WebGLCommand::DrawBuffers(buffers)); } } + + /// https://www.khronos.org/registry/webgl/specs/latest/2.0/#3.7.6 + fn TexStorage2D( + &self, + target: u32, + levels: i32, + internal_format: u32, + width: i32, + height: i32, + ) { + self.tex_storage(2, target, levels, internal_format, width, height, 1) + } + + /// https://www.khronos.org/registry/webgl/specs/latest/2.0/#3.7.6 + fn TexStorage3D( + &self, + target: u32, + levels: i32, + internal_format: u32, + width: i32, + height: i32, + depth: i32, + ) { + self.tex_storage(3, target, levels, internal_format, width, height, depth) + } } impl LayoutCanvasWebGLRenderingContextHelpers for LayoutDom<'_, WebGL2RenderingContext> { -- cgit v1.2.3 From 1431a389daf6fb1f44187628f70b84d0087f3f96 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=C3=A1ty=C3=A1s=20Mustoha?= Date: Tue, 28 Apr 2020 10:00:14 +0200 Subject: Add support for WebGL2 MIN_PROGRAM_TEXEL_OFFSET Improves the support of the WebGL2 `MIN_PROGRAM_TEXEL_OFFSET` property (ie. stores it as a signed integer) and adds support for querying it using GetParameter. See: https://www.khronos.org/registry/webgl/specs/latest/2.0/#3.7.2 --- components/script/dom/webgl2renderingcontext.rs | 3 +++ 1 file changed, 3 insertions(+) (limited to 'components/script/dom/webgl2renderingcontext.rs') diff --git a/components/script/dom/webgl2renderingcontext.rs b/components/script/dom/webgl2renderingcontext.rs index 6ed42deea01..136b47b1ef2 100644 --- a/components/script/dom/webgl2renderingcontext.rs +++ b/components/script/dom/webgl2renderingcontext.rs @@ -995,6 +995,9 @@ impl WebGL2RenderingContextMethods for WebGL2RenderingContext { constants::MAX_UNIFORM_BLOCK_SIZE => { return DoubleValue(self.base.limits().max_uniform_block_size as f64) }, + constants::MIN_PROGRAM_TEXEL_OFFSET => { + return Int32Value(self.base.limits().min_program_texel_offset) + }, _ => {}, } -- cgit v1.2.3 From 035cb6ebaa66562be3db002e29a5526819fb5f5b Mon Sep 17 00:00:00 2001 From: Istvan Miklos Date: Mon, 4 May 2020 10:17:46 +0200 Subject: Add support for WebGL2 TexImage2D Adds initial support for one of the WebGL2 `TexImage2D` call. --- components/script/dom/webgl2renderingcontext.rs | 104 +++++++++++++++++++++++- 1 file changed, 100 insertions(+), 4 deletions(-) (limited to 'components/script/dom/webgl2renderingcontext.rs') diff --git a/components/script/dom/webgl2renderingcontext.rs b/components/script/dom/webgl2renderingcontext.rs index 9bc4b8fe0a8..7dd7ddd0279 100644 --- a/components/script/dom/webgl2renderingcontext.rs +++ b/components/script/dom/webgl2renderingcontext.rs @@ -18,7 +18,9 @@ use crate::dom::bindings::root::{Dom, DomRoot, LayoutDom, MutNullableDom}; use crate::dom::bindings::str::DOMString; use crate::dom::globalscope::GlobalScope; use crate::dom::htmlcanvaselement::HTMLCanvasElement; -use crate::dom::webgl_validations::tex_image_2d::{TexStorageValidator, TexStorageValidatorResult}; +use crate::dom::webgl_validations::tex_image_2d::{ + TexImage2DValidator, TexImage2DValidatorResult, TexStorageValidator, TexStorageValidatorResult, +}; use crate::dom::webgl_validations::WebGLValidator; use crate::dom::webglactiveinfo::WebGLActiveInfo; use crate::dom::webglbuffer::WebGLBuffer; @@ -27,8 +29,8 @@ use crate::dom::webglprogram::WebGLProgram; use crate::dom::webglquery::WebGLQuery; use crate::dom::webglrenderbuffer::WebGLRenderbuffer; use crate::dom::webglrenderingcontext::{ - uniform_get, uniform_typed, LayoutCanvasWebGLRenderingContextHelpers, Operation, VertexAttrib, - WebGLRenderingContext, + uniform_get, uniform_typed, LayoutCanvasWebGLRenderingContextHelpers, Operation, TexPixels, + VertexAttrib, WebGLRenderingContext, }; use crate::dom::webglsampler::{WebGLSampler, WebGLSamplerValue}; use crate::dom::webglshader::WebGLShader; @@ -48,7 +50,7 @@ use canvas_traits::webgl::{ }; use dom_struct::dom_struct; use euclid::default::{Point2D, Rect, Size2D}; -use ipc_channel::ipc; +use ipc_channel::ipc::{self, IpcSharedMemory}; use js::jsapi::{JSObject, Type}; use js::jsval::{BooleanValue, DoubleValue, Int32Value, UInt32Value}; use js::jsval::{JSVal, NullValue, ObjectValue, UndefinedValue}; @@ -2914,6 +2916,100 @@ impl WebGL2RenderingContextMethods for WebGL2RenderingContext { .TexImage2D_(target, level, internal_format, format, data_type, source) } + /// https://www.khronos.org/registry/webgl/specs/latest/2.0/#3.7.6 + #[allow(unsafe_code)] + fn TexImage2D__( + &self, + target: u32, + level: i32, + internalformat: i32, + width: i32, + height: i32, + border: i32, + format: u32, + type_: u32, + src_data: CustomAutoRooterGuard, + src_offset: u32, + ) -> Fallible<()> { + if self.bound_pixel_unpack_buffer.get().is_some() { + return Ok(self.base.webgl_error(InvalidOperation)); + } + + if type_ == constants::FLOAT_32_UNSIGNED_INT_24_8_REV { + return Ok(self.base.webgl_error(InvalidOperation)); + } + + let validator = TexImage2DValidator::new( + &self.base, + target, + level, + internalformat as u32, + width, + height, + border, + format, + type_, + ); + + let TexImage2DValidatorResult { + texture, + target, + width, + height, + level, + border, + internal_format, + format, + data_type, + } = match validator.validate() { + Ok(result) => result, + Err(_) => return Ok(()), + }; + + let unpacking_alignment = self.base.texture_unpacking_alignment(); + + let src_elem_size = typedarray_elem_size(src_data.get_array_type()); + let src_byte_offset = src_offset as usize * src_elem_size; + + if src_data.len() <= src_byte_offset { + return Ok(self.base.webgl_error(InvalidOperation)); + } + + let buff = IpcSharedMemory::from_bytes(unsafe { &src_data.as_slice()[src_byte_offset..] }); + + let expected_byte_length = match { + self.base.validate_tex_image_2d_data( + width, + height, + format, + data_type, + unpacking_alignment, + Some(&*src_data), + ) + } { + Ok(byte_length) => byte_length, + Err(()) => return Ok(()), + }; + + if expected_byte_length as usize > buff.len() { + return Ok(self.base.webgl_error(InvalidOperation)); + } + + self.base.tex_image_2d( + &texture, + target, + data_type, + internal_format, + format, + level, + border, + unpacking_alignment, + TexPixels::from_array(buff, Size2D::new(width, height)), + ); + + Ok(()) + } + /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.8 fn TexSubImage2D( &self, -- cgit v1.2.3 From b298160ff28182d8e894e436429d86b459e3e0a4 Mon Sep 17 00:00:00 2001 From: Istvan Miklos Date: Mon, 18 May 2020 13:30:39 +0200 Subject: Add support for WebGL2 TexImage2D Adds initial support for one of the WebGL2 `TexImage2D` call. --- components/script/dom/webgl2renderingcontext.rs | 68 ++++++++++++++++++++++++- 1 file changed, 67 insertions(+), 1 deletion(-) (limited to 'components/script/dom/webgl2renderingcontext.rs') diff --git a/components/script/dom/webgl2renderingcontext.rs b/components/script/dom/webgl2renderingcontext.rs index 7dd7ddd0279..41d3cd5b66c 100644 --- a/components/script/dom/webgl2renderingcontext.rs +++ b/components/script/dom/webgl2renderingcontext.rs @@ -2917,8 +2917,74 @@ impl WebGL2RenderingContextMethods for WebGL2RenderingContext { } /// https://www.khronos.org/registry/webgl/specs/latest/2.0/#3.7.6 - #[allow(unsafe_code)] fn TexImage2D__( + &self, + target: u32, + level: i32, + internalformat: i32, + width: i32, + height: i32, + border: i32, + format: u32, + type_: u32, + source: ImageDataOrHTMLImageElementOrHTMLCanvasElementOrHTMLVideoElement, + ) -> Fallible<()> { + if self.bound_pixel_unpack_buffer.get().is_some() { + return Ok(self.base.webgl_error(InvalidOperation)); + } + + let validator = TexImage2DValidator::new( + &self.base, + target, + level, + internalformat as u32, + width, + height, + border, + format, + type_, + ); + + let TexImage2DValidatorResult { + texture, + target, + width: _, + height: _, + level, + border, + internal_format, + format, + data_type, + } = match validator.validate() { + Ok(result) => result, + Err(_) => return Ok(()), + }; + + let unpacking_alignment = self.base.texture_unpacking_alignment(); + + let pixels = match self.base.get_image_pixels(source)? { + Some(pixels) => pixels, + None => return Ok(()), + }; + + self.base.tex_image_2d( + &texture, + target, + data_type, + internal_format, + format, + level, + border, + unpacking_alignment, + pixels, + ); + + Ok(()) + } + + /// https://www.khronos.org/registry/webgl/specs/latest/2.0/#3.7.6 + #[allow(unsafe_code)] + fn TexImage2D___( &self, target: u32, level: i32, -- cgit v1.2.3 From 71401e0855c24e4cf86a754171f0162ae08d8e55 Mon Sep 17 00:00:00 2001 From: Kunal Mohan Date: Thu, 4 Jun 2020 19:28:25 +0530 Subject: Implement GPUSwapChain and GPUCanvasContext and interface with Webrender --- components/script/dom/webgl2renderingcontext.rs | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) (limited to 'components/script/dom/webgl2renderingcontext.rs') diff --git a/components/script/dom/webgl2renderingcontext.rs b/components/script/dom/webgl2renderingcontext.rs index 41d3cd5b66c..0ca44ab3d7c 100644 --- a/components/script/dom/webgl2renderingcontext.rs +++ b/components/script/dom/webgl2renderingcontext.rs @@ -17,7 +17,7 @@ use crate::dom::bindings::reflector::{reflect_dom_object, Reflector}; use crate::dom::bindings::root::{Dom, DomRoot, LayoutDom, MutNullableDom}; use crate::dom::bindings::str::DOMString; use crate::dom::globalscope::GlobalScope; -use crate::dom::htmlcanvaselement::HTMLCanvasElement; +use crate::dom::htmlcanvaselement::{HTMLCanvasElement, LayoutCanvasRenderingContextHelpers}; use crate::dom::webgl_validations::tex_image_2d::{ TexImage2DValidator, TexImage2DValidatorResult, TexStorageValidator, TexStorageValidatorResult, }; @@ -29,8 +29,7 @@ use crate::dom::webglprogram::WebGLProgram; use crate::dom::webglquery::WebGLQuery; use crate::dom::webglrenderbuffer::WebGLRenderbuffer; use crate::dom::webglrenderingcontext::{ - uniform_get, uniform_typed, LayoutCanvasWebGLRenderingContextHelpers, Operation, TexPixels, - VertexAttrib, WebGLRenderingContext, + uniform_get, uniform_typed, Operation, TexPixels, VertexAttrib, WebGLRenderingContext, }; use crate::dom::webglsampler::{WebGLSampler, WebGLSamplerValue}; use crate::dom::webglshader::WebGLShader; @@ -4381,7 +4380,7 @@ impl WebGL2RenderingContextMethods for WebGL2RenderingContext { } } -impl LayoutCanvasWebGLRenderingContextHelpers for LayoutDom<'_, WebGL2RenderingContext> { +impl LayoutCanvasRenderingContextHelpers for LayoutDom<'_, WebGL2RenderingContext> { #[allow(unsafe_code)] unsafe fn canvas_data_source(self) -> HTMLCanvasDataSource { let this = &*self.unsafe_get(); -- cgit v1.2.3 From 6591fa54f929dd76a0383f5b40a7490f22d0f7cc Mon Sep 17 00:00:00 2001 From: Istvan Miklos Date: Tue, 26 May 2020 16:09:57 +0200 Subject: Add support for WebGL2 TexImage2D Adds initial support for one of the WebGL2 `TexImage2D` call. --- components/script/dom/webgl2renderingcontext.rs | 86 +++++++++++++++++++++++-- 1 file changed, 82 insertions(+), 4 deletions(-) (limited to 'components/script/dom/webgl2renderingcontext.rs') diff --git a/components/script/dom/webgl2renderingcontext.rs b/components/script/dom/webgl2renderingcontext.rs index 0ca44ab3d7c..4af734253af 100644 --- a/components/script/dom/webgl2renderingcontext.rs +++ b/components/script/dom/webgl2renderingcontext.rs @@ -29,7 +29,8 @@ use crate::dom::webglprogram::WebGLProgram; use crate::dom::webglquery::WebGLQuery; use crate::dom::webglrenderbuffer::WebGLRenderbuffer; use crate::dom::webglrenderingcontext::{ - uniform_get, uniform_typed, Operation, TexPixels, VertexAttrib, WebGLRenderingContext, + uniform_get, uniform_typed, Operation, TexPixels, TexSource, VertexAttrib, + WebGLRenderingContext, }; use crate::dom::webglsampler::{WebGLSampler, WebGLSamplerValue}; use crate::dom::webglshader::WebGLShader; @@ -2917,6 +2918,79 @@ impl WebGL2RenderingContextMethods for WebGL2RenderingContext { /// https://www.khronos.org/registry/webgl/specs/latest/2.0/#3.7.6 fn TexImage2D__( + &self, + target: u32, + level: i32, + internalformat: i32, + width: i32, + height: i32, + border: i32, + format: u32, + type_: u32, + pbo_offset: i64, + ) -> Fallible<()> { + let pixel_unpack_buffer = match self.bound_pixel_unpack_buffer.get() { + Some(pixel_unpack_buffer) => pixel_unpack_buffer, + None => return Ok(self.base.webgl_error(InvalidOperation)), + }; + + if let Some(tf_buffer) = self.bound_transform_feedback_buffer.get() { + if pixel_unpack_buffer == tf_buffer { + return Ok(self.base.webgl_error(InvalidOperation)); + } + } + + if pbo_offset < 0 || pbo_offset as usize > pixel_unpack_buffer.capacity() { + return Ok(self.base.webgl_error(InvalidValue)); + } + + let unpacking_alignment = self.base.texture_unpacking_alignment(); + + let validator = TexImage2DValidator::new( + &self.base, + target, + level, + internalformat as u32, + width, + height, + border, + format, + type_, + ); + + let TexImage2DValidatorResult { + texture, + target, + width, + height, + level, + border, + internal_format, + format, + data_type, + } = match validator.validate() { + Ok(result) => result, + Err(_) => return Ok(()), + }; + + self.base.tex_image_2d( + &texture, + target, + data_type, + internal_format, + format, + level, + border, + unpacking_alignment, + Size2D::new(width, height), + TexSource::BufferOffset(pbo_offset), + ); + + Ok(()) + } + + /// https://www.khronos.org/registry/webgl/specs/latest/2.0/#3.7.6 + fn TexImage2D___( &self, target: u32, level: i32, @@ -2975,7 +3049,8 @@ impl WebGL2RenderingContextMethods for WebGL2RenderingContext { level, border, unpacking_alignment, - pixels, + pixels.size(), + TexSource::Pixels(pixels), ); Ok(()) @@ -2983,7 +3058,7 @@ impl WebGL2RenderingContextMethods for WebGL2RenderingContext { /// https://www.khronos.org/registry/webgl/specs/latest/2.0/#3.7.6 #[allow(unsafe_code)] - fn TexImage2D___( + fn TexImage2D____( &self, target: u32, level: i32, @@ -3060,6 +3135,8 @@ impl WebGL2RenderingContextMethods for WebGL2RenderingContext { return Ok(self.base.webgl_error(InvalidOperation)); } + let size = Size2D::new(width, height); + self.base.tex_image_2d( &texture, target, @@ -3069,7 +3146,8 @@ impl WebGL2RenderingContextMethods for WebGL2RenderingContext { level, border, unpacking_alignment, - TexPixels::from_array(buff, Size2D::new(width, height)), + size, + TexSource::Pixels(TexPixels::from_array(buff, size)), ); Ok(()) -- cgit v1.2.3 From 795560ad521f3ec2eebd85c5c3568beba50129ea Mon Sep 17 00:00:00 2001 From: Josh Matthews Date: Fri, 3 Jul 2020 12:22:48 -0400 Subject: webgl: Add stub isContextLost API. --- components/script/dom/webgl2renderingcontext.rs | 5 +++++ 1 file changed, 5 insertions(+) (limited to 'components/script/dom/webgl2renderingcontext.rs') diff --git a/components/script/dom/webgl2renderingcontext.rs b/components/script/dom/webgl2renderingcontext.rs index 4af734253af..b6a34dbc60a 100644 --- a/components/script/dom/webgl2renderingcontext.rs +++ b/components/script/dom/webgl2renderingcontext.rs @@ -1119,6 +1119,11 @@ impl WebGL2RenderingContextMethods for WebGL2RenderingContext { self.base.GetContextAttributes() } + // https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.13 + fn IsContextLost(&self) -> bool { + self.base.IsContextLost() + } + /// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.14 fn GetSupportedExtensions(&self) -> Option> { self.base.GetSupportedExtensions() -- cgit v1.2.3 From 5c4939599e2793154569b19db87be8cc05ca9269 Mon Sep 17 00:00:00 2001 From: Josh Matthews Date: Sun, 24 Jan 2021 14:07:10 -0500 Subject: Update mozjs. --- components/script/dom/webgl2renderingcontext.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'components/script/dom/webgl2renderingcontext.rs') diff --git a/components/script/dom/webgl2renderingcontext.rs b/components/script/dom/webgl2renderingcontext.rs index b6a34dbc60a..b438056e622 100644 --- a/components/script/dom/webgl2renderingcontext.rs +++ b/components/script/dom/webgl2renderingcontext.rs @@ -112,7 +112,7 @@ fn typedarray_elem_size(typeid: Type) -> usize { Type::Int32 | Type::Uint32 | Type::Float32 => 4, Type::Int64 | Type::Float64 => 8, Type::BigInt64 | Type::BigUint64 => 8, - Type::MaxTypedArrayViewType => unreachable!(), + Type::Simd128 | Type::MaxTypedArrayViewType => unreachable!(), } } -- cgit v1.2.3