aboutsummaryrefslogtreecommitdiffstats
path: root/components/script/dom/webgl2renderingcontext.rs
diff options
context:
space:
mode:
Diffstat (limited to 'components/script/dom/webgl2renderingcontext.rs')
-rw-r--r--components/script/dom/webgl2renderingcontext.rs117
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