aboutsummaryrefslogtreecommitdiffstats
path: root/components/script
diff options
context:
space:
mode:
Diffstat (limited to 'components/script')
-rw-r--r--components/script/dom/macros.rs15
-rw-r--r--components/script/dom/webgl2renderingcontext.rs2
-rw-r--r--components/script/dom/webglbuffer.rs20
-rw-r--r--components/script/dom/webglrenderingcontext.rs91
-rw-r--r--components/script/dom/webidls/WebGL2RenderingContext.webidl44
-rw-r--r--components/script/dom/webidls/WebGLRenderingContext.webidl72
6 files changed, 129 insertions, 115 deletions
diff --git a/components/script/dom/macros.rs b/components/script/dom/macros.rs
index 2fd7368525b..b2963305aa6 100644
--- a/components/script/dom/macros.rs
+++ b/components/script/dom/macros.rs
@@ -614,3 +614,18 @@ macro_rules! impl_performance_entry_struct(
}
);
);
+
+macro_rules! handle_potential_webgl_error {
+ ($context:expr, $call:expr, $return_on_error:expr) => {
+ match $call {
+ Ok(ret) => ret,
+ Err(error) => {
+ $context.webgl_error(error);
+ $return_on_error
+ }
+ }
+ };
+ ($context:expr, $call:expr) => {
+ handle_potential_webgl_error!($context, $call, ());
+ };
+}
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<ArrayBufferViewOrArrayBuffer>) {
+ fn BufferSubData(&self, target: u32, offset: i64, data: ArrayBufferViewOrArrayBuffer) {
self.base.BufferSubData(target, offset, data)
}
diff --git a/components/script/dom/webglbuffer.rs b/components/script/dom/webglbuffer.rs
index 4bb7959f8dd..5f00c7f45cc 100644
--- a/components/script/dom/webglbuffer.rs
+++ b/components/script/dom/webglbuffer.rs
@@ -7,6 +7,7 @@ use canvas_traits::webgl::{WebGLBufferId, WebGLCommand, WebGLError, WebGLMsgSend
use canvas_traits::webgl::webgl_channel;
use dom::bindings::cell::DomRefCell;
use dom::bindings::codegen::Bindings::WebGLBufferBinding;
+use dom::bindings::codegen::Bindings::WebGLRenderingContextBinding::WebGLRenderingContextConstants;
use dom::bindings::reflector::reflect_dom_object;
use dom::bindings::root::DomRoot;
use dom::webglobject::WebGLObject;
@@ -86,18 +87,25 @@ impl WebGLBuffer {
Ok(())
}
- pub fn buffer_data(&self, target: u32, data: &[u8], usage: u32) -> WebGLResult<()> {
+ pub fn buffer_data<T>(&self, target: u32, data: T, usage: u32) -> WebGLResult<()>
+ where
+ T: Into<Vec<u8>>,
+ {
+ match usage {
+ WebGLRenderingContextConstants::STREAM_DRAW |
+ WebGLRenderingContextConstants::STATIC_DRAW |
+ WebGLRenderingContextConstants::DYNAMIC_DRAW => (),
+ _ => return Err(WebGLError::InvalidEnum),
+ }
+
if let Some(previous_target) = self.target.get() {
if target != previous_target {
return Err(WebGLError::InvalidOperation);
}
}
+ let data = data.into();
self.capacity.set(data.len());
- self.renderer.send(WebGLCommand::BufferData(
- target,
- data.to_vec().into(),
- usage,
- )).unwrap();
+ self.renderer.send(WebGLCommand::BufferData(target, data.into(), usage)).unwrap();
Ok(())
}
diff --git a/components/script/dom/webglrenderingcontext.rs b/components/script/dom/webglrenderingcontext.rs
index 4fc569ca331..eca047d66d8 100644
--- a/components/script/dom/webglrenderingcontext.rs
+++ b/components/script/dom/webglrenderingcontext.rs
@@ -4,8 +4,9 @@
use byteorder::{NativeEndian, ReadBytesExt, WriteBytesExt};
use canvas_traits::canvas::{byte_swap, multiply_u8_pixel};
-use canvas_traits::webgl::{WebGLContextShareMode, WebGLCommand, WebGLError, WebGLVersion, WebGLSLVersion};
-use canvas_traits::webgl::{WebGLFramebufferBindingRequest, WebGLMsg, WebGLMsgSender, WebGLParameter, WebVRCommand};
+use canvas_traits::webgl::{WebGLCommand, WebGLContextShareMode, WebGLError};
+use canvas_traits::webgl::{WebGLFramebufferBindingRequest, WebGLMsg, WebGLMsgSender};
+use canvas_traits::webgl::{WebGLParameter, WebGLResult, WebGLSLVersion, WebGLVersion, WebVRCommand};
use canvas_traits::webgl::DOMToTextureCommand;
use canvas_traits::webgl::WebGLError::*;
use canvas_traits::webgl::webgl_channel;
@@ -67,21 +68,6 @@ use webrender_api;
type ImagePixelResult = Result<(Vec<u8>, Size2D<i32>, bool), ()>;
pub const MAX_UNIFORM_AND_ATTRIBUTE_LEN: usize = 256;
-macro_rules! handle_potential_webgl_error {
- ($context:ident, $call:expr, $return_on_error:expr) => {
- match $call {
- Ok(ret) => ret,
- Err(error) => {
- $context.webgl_error(error);
- $return_on_error
- }
- }
- };
- ($context:ident, $call:expr) => {
- handle_potential_webgl_error!($context, $call, ());
- };
-}
-
// From the GLES 2.0.25 spec, page 85:
//
// "If a texture that is currently bound to one of the targets
@@ -1195,6 +1181,14 @@ impl WebGLRenderingContext {
));
Some(receiver.recv().unwrap().into())
}
+
+ pub fn bound_buffer(&self, target: u32) -> WebGLResult<Option<DomRoot<WebGLBuffer>>> {
+ match target {
+ constants::ARRAY_BUFFER => Ok(self.bound_buffer_array.get()),
+ constants::ELEMENT_ARRAY_BUFFER => Ok(self.bound_buffer_element_array.get()),
+ _ => Err(WebGLError::InvalidEnum),
+ }
+ }
}
impl Drop for WebGLRenderingContext {
@@ -1256,14 +1250,8 @@ impl WebGLRenderingContextMethods for WebGLRenderingContext {
target: u32,
parameter: u32,
) -> JSVal {
- let buffer = match target {
- constants::ARRAY_BUFFER => self.bound_buffer_array.get(),
- constants::ELEMENT_ARRAY_BUFFER => self.bound_buffer_element_array.get(),
- _ => {
- self.webgl_error(InvalidEnum);
- return NullValue();
- }
- };
+ let buffer = handle_potential_webgl_error!(self, self.bound_buffer(target), return NullValue());
+
match parameter {
constants::BUFFER_SIZE | constants::BUFFER_USAGE => {},
_ => {
@@ -1693,77 +1681,44 @@ impl WebGLRenderingContextMethods for WebGLRenderingContext {
Err(_) => fallible_array_buffer_view_to_vec(cx, data)?,
};
- let bound_buffer = match target {
- constants::ARRAY_BUFFER => self.bound_buffer_array.get(),
- constants::ELEMENT_ARRAY_BUFFER => self.bound_buffer_element_array.get(),
- _ => return Ok(self.webgl_error(InvalidEnum)),
- };
-
+ let bound_buffer = handle_potential_webgl_error!(self, self.bound_buffer(target), return Ok(()));
let bound_buffer = match bound_buffer {
Some(bound_buffer) => bound_buffer,
- None => return Ok(self.webgl_error(InvalidValue)),
+ None => return Ok(self.webgl_error(InvalidOperation)),
};
- match usage {
- constants::STREAM_DRAW |
- constants::STATIC_DRAW |
- constants::DYNAMIC_DRAW => (),
- _ => return Ok(self.webgl_error(InvalidEnum)),
- }
-
- handle_potential_webgl_error!(self, bound_buffer.buffer_data(target, &data_vec, usage));
-
+ handle_potential_webgl_error!(self, bound_buffer.buffer_data(target, data_vec, usage));
Ok(())
}
// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.5
fn BufferData_(&self, target: u32, size: i64, usage: u32) -> ErrorResult {
- let bound_buffer = match target {
- constants::ARRAY_BUFFER => self.bound_buffer_array.get(),
- constants::ELEMENT_ARRAY_BUFFER => self.bound_buffer_element_array.get(),
- _ => return Ok(self.webgl_error(InvalidEnum)),
- };
-
+ let bound_buffer = handle_potential_webgl_error!(self, self.bound_buffer(target), return Ok(()));
let bound_buffer = match bound_buffer {
Some(bound_buffer) => bound_buffer,
- None => return Ok(self.webgl_error(InvalidValue)),
+ None => return Ok(self.webgl_error(InvalidOperation)),
};
if size < 0 {
return Ok(self.webgl_error(InvalidValue));
}
- match usage {
- constants::STREAM_DRAW |
- constants::STATIC_DRAW |
- constants::DYNAMIC_DRAW => (),
- _ => return Ok(self.webgl_error(InvalidEnum)),
- }
-
// FIXME: Allocating a buffer based on user-requested size is
// not great, but we don't have a fallible allocation to try.
let data = vec![0u8; size as usize];
- handle_potential_webgl_error!(self, bound_buffer.buffer_data(target, &data, usage));
-
+ handle_potential_webgl_error!(self, bound_buffer.buffer_data(target, data, usage));
Ok(())
}
// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.5
- fn BufferSubData(&self, target: u32, offset: i64, data: Option<ArrayBufferViewOrArrayBuffer>) {
+ fn BufferSubData(&self, target: u32, offset: i64, data: ArrayBufferViewOrArrayBuffer) {
let data_vec = match data {
// Typed array is rooted, so we can safely temporarily retrieve its slice
- Some(ArrayBufferViewOrArrayBuffer::ArrayBuffer(mut inner)) => inner.to_vec(),
- Some(ArrayBufferViewOrArrayBuffer::ArrayBufferView(mut inner)) => inner.to_vec(),
- // Spec: If data is null then an INVALID_VALUE error is generated.
- None => return self.webgl_error(InvalidValue),
- };
-
- let bound_buffer = match target {
- constants::ARRAY_BUFFER => self.bound_buffer_array.get(),
- constants::ELEMENT_ARRAY_BUFFER => self.bound_buffer_element_array.get(),
- _ => return self.webgl_error(InvalidEnum),
+ ArrayBufferViewOrArrayBuffer::ArrayBuffer(mut inner) => inner.to_vec(),
+ ArrayBufferViewOrArrayBuffer::ArrayBufferView(mut inner) => inner.to_vec(),
};
+ let bound_buffer = handle_potential_webgl_error!(self, self.bound_buffer(target), return);
let bound_buffer = match bound_buffer {
Some(bound_buffer) => bound_buffer,
None => return self.webgl_error(InvalidOperation),
diff --git a/components/script/dom/webidls/WebGL2RenderingContext.webidl b/components/script/dom/webidls/WebGL2RenderingContext.webidl
index d7492f8c2d1..76b04e277ea 100644
--- a/components/script/dom/webidls/WebGL2RenderingContext.webidl
+++ b/components/script/dom/webidls/WebGL2RenderingContext.webidl
@@ -179,6 +179,7 @@ interface WebGL2RenderingContextBase
const GLenum FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE = 0x8216;
const GLenum FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE = 0x8217;
const GLenum FRAMEBUFFER_DEFAULT = 0x8218;
+ // BUG: https://github.com/KhronosGroup/WebGL/issues/2216
// const GLenum DEPTH_STENCIL_ATTACHMENT = 0x821A;
// const GLenum DEPTH_STENCIL = 0x84F9;
const GLenum UNSIGNED_INT_24_8 = 0x84FA;
@@ -303,9 +304,13 @@ interface WebGL2RenderingContextBase
/* Buffer objects */
// WebGL1:
- // void bufferData(GLenum target, GLsizeiptr size, GLenum usage);
- // void bufferData(GLenum target, [AllowShared] BufferSource? srcData, GLenum usage);
- // void bufferSubData(GLenum target, GLintptr dstByteOffset, [AllowShared] BufferSource srcData);
+ // BUG: https://github.com/KhronosGroup/WebGL/issues/2216
+ // FIXME(xanewok): https://github.com/servo/servo/issues/20513
+ [Throws]
+ void bufferData(GLenum target, object? data, GLenum usage);
+ [Throws]
+ void bufferData(GLenum target, GLsizeiptr size, GLenum usage);
+ void bufferSubData(GLenum target, GLintptr dstByteOffset, /*[AllowShared]*/ BufferSource srcData);
// WebGL2:
// void bufferData(GLenum target, [AllowShared] ArrayBufferView srcData, GLenum usage, GLuint srcOffset,
// optional GLuint length = 0);
@@ -342,17 +347,23 @@ interface WebGL2RenderingContextBase
// GLsizei height, GLsizei depth);
// WebGL1 legacy entrypoints:
- // void texImage2D(GLenum target, GLint level, GLint internalformat,
- // GLsizei width, GLsizei height, GLint border, GLenum format,
- // GLenum type, [AllowShared] ArrayBufferView? pixels);
- // void texImage2D(GLenum target, GLint level, GLint internalformat,
- // GLenum format, GLenum type, TexImageSource source); // May throw DOMException
-
- // void texSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset,
- // GLsizei width, GLsizei height,
- // GLenum format, GLenum type, [AllowShared] ArrayBufferView? pixels);
- // void texSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset,
- // GLenum format, GLenum type, TexImageSource source); // May throw DOMException
+ // BUG: https://github.com/KhronosGroup/WebGL/issues/2216
+ [Throws]
+ void texImage2D(GLenum target, GLint level, GLenum internalformat,
+ GLsizei width, GLsizei height, GLint border, GLenum format,
+ GLenum type, /*[AllowShared]*/ ArrayBufferView? pixels);
+ [Throws]
+ void texImage2D(GLenum target, GLint level, GLenum internalformat,
+ GLenum format, GLenum type, TexImageSource source); // May throw DOMException
+
+ // BUG: https://github.com/KhronosGroup/WebGL/issues/2216
+ [Throws]
+ void texSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset,
+ GLsizei width, GLsizei height,
+ GLenum format, GLenum type, /*[AllowShared]*/ ArrayBufferView? pixels);
+ [Throws]
+ void texSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset,
+ GLenum format, GLenum type, TexImageSource source); // May throw DOMException
// WebGL2 entrypoints:
// void texImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height,
@@ -498,8 +509,9 @@ interface WebGL2RenderingContextBase
/* Reading back pixels */
// WebGL1:
- // void readPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type,
- // [AllowShared] ArrayBufferView? dstData);
+ // BUG: https://github.com/KhronosGroup/WebGL/issues/2216
+ void readPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type,
+ /*[AllowShared]*/ ArrayBufferView? dstData);
// WebGL2:
// void readPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type,
// GLintptr offset);
diff --git a/components/script/dom/webidls/WebGLRenderingContext.webidl b/components/script/dom/webidls/WebGLRenderingContext.webidl
index cd89abccee4..cd714b4c787 100644
--- a/components/script/dom/webidls/WebGLRenderingContext.webidl
+++ b/components/script/dom/webidls/WebGLRenderingContext.webidl
@@ -491,12 +491,10 @@ interface WebGLRenderingContextBase
void blendFuncSeparate(GLenum srcRGB, GLenum dstRGB,
GLenum srcAlpha, GLenum dstAlpha);
- // FIXME(xanewok): https://github.com/servo/servo/issues/20513
- [Throws]
- void bufferData(GLenum target, object? data, GLenum usage);
- [Throws]
- void bufferData(GLenum target, GLsizeiptr size, GLenum usage);
- void bufferSubData(GLenum target, GLintptr offset, /*[AllowShared]*/ BufferSource? data);
+ // BUG: https://github.com/KhronosGroup/WebGL/issues/2216
+ // void bufferData(GLenum target, object? data, GLenum usage);
+ // void bufferData(GLenum target, GLsizeiptr size, GLenum usage);
+ // void bufferSubData(GLenum target, GLintptr offset, /*[AllowShared]*/ BufferSource data);
[WebGLHandlesContextLoss] GLenum checkFramebufferStatus(GLenum target);
void clear(GLbitfield mask);
@@ -604,8 +602,9 @@ interface WebGLRenderingContextBase
void pixelStorei(GLenum pname, GLint param);
void polygonOffset(GLfloat factor, GLfloat units);
- void readPixels(GLint x, GLint y, GLsizei width, GLsizei height,
- GLenum format, GLenum type, /*[AllowShared]*/ ArrayBufferView? pixels);
+ // BUG: https://github.com/KhronosGroup/WebGL/issues/2216
+ // void readPixels(GLint x, GLint y, GLsizei width, GLsizei height,
+ // GLenum format, GLenum type, /*[AllowShared]*/ ArrayBufferView? pixels);
void renderbufferStorage(GLenum target, GLenum internalformat,
GLsizei width, GLsizei height);
@@ -621,14 +620,12 @@ interface WebGLRenderingContextBase
void stencilOp(GLenum fail, GLenum zfail, GLenum zpass);
void stencilOpSeparate(GLenum face, GLenum fail, GLenum zfail, GLenum zpass);
- // FIXME: https://github.com/servo/servo/issues/20516
- [Throws]
- void texImage2D(GLenum target, GLint level, GLenum internalformat,
- GLsizei width, GLsizei height, GLint border, GLenum format,
- GLenum type, /*[AllowShared]*/ ArrayBufferView? pixels);
- [Throws]
- void texImage2D(GLenum target, GLint level, GLenum internalformat,
- GLenum format, GLenum type, TexImageSource source); // May throw DOMException
+ // BUG: https://github.com/KhronosGroup/WebGL/issues/2216
+ // void texImage2D(GLenum target, GLint level, GLenum internalformat,
+ // GLsizei width, GLsizei height, GLint border, GLenum format,
+ // GLenum type, /*[AllowShared]*/ ArrayBufferView? pixels);
+ // void texImage2D(GLenum target, GLint level, GLenum internalformat,
+ // GLenum format, GLenum type, TexImageSource source); // May throw DOMException
[Throws, Pref="dom.webgl.dom_to_texture.enabled"]
void texImageDOM(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height,
GLenum format, GLenum type, HTMLIFrameElement source); // May throw DOMException
@@ -636,14 +633,12 @@ interface WebGLRenderingContextBase
void texParameterf(GLenum target, GLenum pname, GLfloat param);
void texParameteri(GLenum target, GLenum pname, GLint param);
- // FIXME: https://github.com/servo/servo/issues/20516
- [Throws]
- void texSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset,
- GLsizei width, GLsizei height,
- GLenum format, GLenum type, /*[AllowShared]*/ ArrayBufferView? pixels);
- [Throws]
- void texSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset,
- GLenum format, GLenum type, TexImageSource source); // May throw DOMException
+ // BUG: https://github.com/KhronosGroup/WebGL/issues/2216
+ // void texSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset,
+ // GLsizei width, GLsizei height,
+ // GLenum format, GLenum type, /*[AllowShared]*/ ArrayBufferView? pixels);
+ // void texSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset,
+ // GLenum format, GLenum type, TexImageSource source); // May throw DOMException
void uniform1f(WebGLUniformLocation? location, GLfloat x);
void uniform2f(WebGLUniformLocation? location, GLfloat x, GLfloat y);
@@ -691,5 +686,34 @@ interface WebGLRenderingContextBase
[Exposed=Window]
interface WebGLRenderingContext
{
+ // BUG: https://github.com/KhronosGroup/WebGL/issues/2216
+
+ // FIXME(xanewok): https://github.com/servo/servo/issues/20513
+ [Throws]
+ void bufferData(GLenum target, object? data, GLenum usage);
+ [Throws]
+ void bufferData(GLenum target, GLsizeiptr size, GLenum usage);
+ void bufferSubData(GLenum target, GLintptr offset, /*[AllowShared]*/ BufferSource data);
+
+ // FIXME: https://github.com/servo/servo/issues/20516
+ [Throws]
+ void texImage2D(GLenum target, GLint level, GLenum internalformat,
+ GLsizei width, GLsizei height, GLint border, GLenum format,
+ GLenum type, /*[AllowShared]*/ ArrayBufferView? pixels);
+ [Throws]
+ void texImage2D(GLenum target, GLint level, GLenum internalformat,
+ GLenum format, GLenum type, TexImageSource source); // May throw DOMException
+
+ // FIXME: https://github.com/servo/servo/issues/20516
+ [Throws]
+ void texSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset,
+ GLsizei width, GLsizei height,
+ GLenum format, GLenum type, /*[AllowShared]*/ ArrayBufferView? pixels);
+ [Throws]
+ void texSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset,
+ GLenum format, GLenum type, TexImageSource source); // May throw DOMException
+
+ void readPixels(GLint x, GLint y, GLsizei width, GLsizei height,
+ GLenum format, GLenum type, /*[AllowShared]*/ ArrayBufferView? pixels);
};
WebGLRenderingContext implements WebGLRenderingContextBase;