diff options
Diffstat (limited to 'components/script/dom/webgl2renderingcontext.rs')
-rw-r--r-- | components/script/dom/webgl2renderingcontext.rs | 117 |
1 files changed, 60 insertions, 57 deletions
diff --git a/components/script/dom/webgl2renderingcontext.rs b/components/script/dom/webgl2renderingcontext.rs index 949f3a3bbdc..6ed42deea01 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}; @@ -26,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, VertexAttrib, + uniform_get, uniform_typed, LayoutCanvasWebGLRenderingContextHelpers, Operation, VertexAttrib, WebGLRenderingContext, }; use crate::dom::webglsampler::{WebGLSampler, WebGLSamplerValue}; @@ -339,7 +338,7 @@ impl WebGL2RenderingContext { fn unbind_from(&self, slot: &MutNullableDom<WebGLBuffer>, 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); } } @@ -868,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)] @@ -1225,7 +1226,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<ArrayBufferViewOrArrayBuffer>, usage: u32) { + fn BufferData_(&self, target: u32, data: Option<ArrayBufferViewOrArrayBuffer>, 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); @@ -1233,7 +1234,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); @@ -1457,7 +1458,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, @@ -1467,19 +1469,32 @@ impl WebGL2RenderingContextMethods for WebGL2RenderingContext { height: i32, border: i32, pixels: CustomAutoRooterGuard<ArrayBufferView>, + 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, @@ -1490,9 +1505,21 @@ impl WebGL2RenderingContextMethods for WebGL2RenderingContext { height: i32, format: u32, pixels: CustomAutoRooterGuard<ArrayBufferView>, + 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, ) } @@ -1665,7 +1692,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 @@ -2136,7 +2163,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 @@ -2198,7 +2225,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 @@ -2214,7 +2241,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 @@ -2230,7 +2257,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 @@ -2279,7 +2306,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 @@ -2295,7 +2322,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 @@ -2344,7 +2371,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 @@ -2393,7 +2420,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 @@ -2406,7 +2433,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 @@ -2419,7 +2446,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 @@ -2432,7 +2459,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 @@ -2798,7 +2825,7 @@ impl WebGL2RenderingContextMethods for WebGL2RenderingContext { &self, target: u32, level: i32, - internal_format: u32, + internal_format: i32, width: i32, height: i32, border: i32, @@ -2824,7 +2851,7 @@ impl WebGL2RenderingContextMethods for WebGL2RenderingContext { &self, target: u32, level: i32, - internal_format: u32, + internal_format: i32, format: u32, data_type: u32, source: ImageDataOrHTMLImageElementOrHTMLCanvasElementOrHTMLVideoElement, @@ -2834,30 +2861,6 @@ impl WebGL2RenderingContextMethods for WebGL2RenderingContext { } /// 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, target: u32, @@ -3086,7 +3089,7 @@ impl WebGL2RenderingContextMethods for WebGL2RenderingContext { } } - query.delete(false); + query.delete(Operation::Infallible); } } @@ -3112,7 +3115,7 @@ impl WebGL2RenderingContextMethods for WebGL2RenderingContext { slot.set(None); } } - sampler.delete(false); + sampler.delete(Operation::Infallible); } } @@ -3343,7 +3346,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); } } @@ -3422,7 +3425,7 @@ impl WebGL2RenderingContextMethods for WebGL2RenderingContext { self.base.webgl_error(InvalidOperation); return; } - tf.delete(false); + tf.delete(Operation::Infallible); self.current_transform_feedback.set(None); } } @@ -3656,7 +3659,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); } @@ -3734,7 +3737,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); } @@ -3998,7 +4001,7 @@ impl WebGL2RenderingContextMethods for WebGL2RenderingContext { } if width < 0 || height < 0 { - return; + return self.base.webgl_error(InvalidValue); } self.base |