address review comments

This commit is contained in:
ecoal95 2015-07-06 22:56:42 +02:00
parent 9b306aced6
commit 8438db89e1
8 changed files with 42 additions and 39 deletions

View file

@ -131,7 +131,6 @@ pub enum CanvasWebGLMsg {
#[derive(Clone, Copy, PartialEq)] #[derive(Clone, Copy, PartialEq)]
pub enum WebGLError { pub enum WebGLError {
NoError,
InvalidEnum, InvalidEnum,
InvalidOperation, InvalidOperation,
InvalidValue, InvalidValue,

View file

@ -34,8 +34,9 @@ impl WebGLBuffer {
pub fn maybe_new(global: GlobalRef, renderer: Sender<CanvasMsg>) -> Option<Root<WebGLBuffer>> { pub fn maybe_new(global: GlobalRef, renderer: Sender<CanvasMsg>) -> Option<Root<WebGLBuffer>> {
let (sender, receiver) = channel(); let (sender, receiver) = channel();
renderer.send(CanvasMsg::WebGL(CanvasWebGLMsg::CreateBuffer(sender))).unwrap(); renderer.send(CanvasMsg::WebGL(CanvasWebGLMsg::CreateBuffer(sender))).unwrap();
receiver.recv().unwrap()
.map(|buffer_id| WebGLBuffer::new(global, renderer, *buffer_id)) let result = receiver.recv().unwrap();
result.map(|buffer_id| WebGLBuffer::new(global, renderer, *buffer_id))
} }
pub fn new(global: GlobalRef, renderer: Sender<CanvasMsg>, id: u32) -> Root<WebGLBuffer> { pub fn new(global: GlobalRef, renderer: Sender<CanvasMsg>, id: u32) -> Root<WebGLBuffer> {

View file

@ -34,8 +34,9 @@ impl WebGLFramebuffer {
pub fn maybe_new(global: GlobalRef, renderer: Sender<CanvasMsg>) -> Option<Root<WebGLFramebuffer>> { pub fn maybe_new(global: GlobalRef, renderer: Sender<CanvasMsg>) -> Option<Root<WebGLFramebuffer>> {
let (sender, receiver) = channel(); let (sender, receiver) = channel();
renderer.send(CanvasMsg::WebGL(CanvasWebGLMsg::CreateFramebuffer(sender))).unwrap(); renderer.send(CanvasMsg::WebGL(CanvasWebGLMsg::CreateFramebuffer(sender))).unwrap();
receiver.recv().unwrap()
.map(|fb_id| WebGLFramebuffer::new(global, renderer, *fb_id)) let result = receiver.recv().unwrap();
result.map(|fb_id| WebGLFramebuffer::new(global, renderer, *fb_id))
} }
pub fn new(global: GlobalRef, renderer: Sender<CanvasMsg>, id: u32) -> Root<WebGLFramebuffer> { pub fn new(global: GlobalRef, renderer: Sender<CanvasMsg>, id: u32) -> Root<WebGLFramebuffer> {
@ -55,9 +56,8 @@ impl<'a> WebGLFramebufferHelpers for &'a WebGLFramebuffer {
} }
fn bind(self, target: u32) { fn bind(self, target: u32) {
self.renderer.send( let cmd = CanvasWebGLMsg::BindFramebuffer(target, WebGLFramebufferBindingRequest::Explicit(self.id));
CanvasMsg::WebGL( self.renderer.send(CanvasMsg::WebGL(cmd)).unwrap();
CanvasWebGLMsg::BindFramebuffer(target, WebGLFramebufferBindingRequest::Explicit(self.id)))).unwrap();
} }
fn delete(self) { fn delete(self) {

View file

@ -42,8 +42,9 @@ impl WebGLProgram {
pub fn maybe_new(global: GlobalRef, renderer: Sender<CanvasMsg>) -> Option<Root<WebGLProgram>> { pub fn maybe_new(global: GlobalRef, renderer: Sender<CanvasMsg>) -> Option<Root<WebGLProgram>> {
let (sender, receiver) = channel(); let (sender, receiver) = channel();
renderer.send(CanvasMsg::WebGL(CanvasWebGLMsg::CreateProgram(sender))).unwrap(); renderer.send(CanvasMsg::WebGL(CanvasWebGLMsg::CreateProgram(sender))).unwrap();
receiver.recv().unwrap()
.map(|program_id| WebGLProgram::new(global, renderer, *program_id)) let result = receiver.recv().unwrap();
result.map(|program_id| WebGLProgram::new(global, renderer, *program_id))
} }
pub fn new(global: GlobalRef, renderer: Sender<CanvasMsg>, id: u32) -> Root<WebGLProgram> { pub fn new(global: GlobalRef, renderer: Sender<CanvasMsg>, id: u32) -> Root<WebGLProgram> {
@ -87,7 +88,7 @@ impl<'a> WebGLProgramHelpers for &'a WebGLProgram {
_ => return Err(WebGLError::InvalidOperation), _ => return Err(WebGLError::InvalidOperation),
}; };
// TODO(ecoal95): Differenciate between same shader already assigned and other previous // TODO(ecoal95): Differentiate between same shader already assigned and other previous
// shader. // shader.
if shader_slot.get().is_some() { if shader_slot.get().is_some() {
return Err(WebGLError::InvalidOperation); return Err(WebGLError::InvalidOperation);

View file

@ -34,8 +34,9 @@ impl WebGLRenderbuffer {
pub fn maybe_new(global: GlobalRef, renderer: Sender<CanvasMsg>) -> Option<Root<WebGLRenderbuffer>> { pub fn maybe_new(global: GlobalRef, renderer: Sender<CanvasMsg>) -> Option<Root<WebGLRenderbuffer>> {
let (sender, receiver) = channel(); let (sender, receiver) = channel();
renderer.send(CanvasMsg::WebGL(CanvasWebGLMsg::CreateRenderbuffer(sender))).unwrap(); renderer.send(CanvasMsg::WebGL(CanvasWebGLMsg::CreateRenderbuffer(sender))).unwrap();
receiver.recv().unwrap()
.map(|renderbuffer_id| WebGLRenderbuffer::new(global, renderer, *renderbuffer_id)) let result = receiver.recv().unwrap();
result.map(|renderbuffer_id| WebGLRenderbuffer::new(global, renderer, *renderbuffer_id))
} }
pub fn new(global: GlobalRef, renderer: Sender<CanvasMsg>, id: u32) -> Root<WebGLRenderbuffer> { pub fn new(global: GlobalRef, renderer: Sender<CanvasMsg>, id: u32) -> Root<WebGLRenderbuffer> {

View file

@ -34,7 +34,7 @@ use std::sync::mpsc::{channel, Sender};
use util::str::DOMString; use util::str::DOMString;
use offscreen_gl_context::GLContextAttributes; use offscreen_gl_context::GLContextAttributes;
pub const MAX_UNIFORM_AND_ATTRIBUTE_LEN : usize = 256; pub const MAX_UNIFORM_AND_ATTRIBUTE_LEN: usize = 256;
macro_rules! handle_potential_webgl_error { macro_rules! handle_potential_webgl_error {
($context:ident, $call:expr, $return_on_error:expr) => { ($context:ident, $call:expr, $return_on_error:expr) => {
@ -54,7 +54,7 @@ pub struct WebGLRenderingContext {
global: GlobalField, global: GlobalField,
renderer: Sender<CanvasMsg>, renderer: Sender<CanvasMsg>,
canvas: JS<HTMLCanvasElement>, canvas: JS<HTMLCanvasElement>,
last_error: Cell<WebGLError>, last_error: Cell<Option<WebGLError>>,
} }
impl WebGLRenderingContext { impl WebGLRenderingContext {
@ -69,7 +69,7 @@ impl WebGLRenderingContext {
reflector_: Reflector::new(), reflector_: Reflector::new(),
global: GlobalField::from_rooted(&global), global: GlobalField::from_rooted(&global),
renderer: chan, renderer: chan,
last_error: Cell::new(WebGLError::NoError), last_error: Cell::new(None),
canvas: JS::from_ref(canvas), canvas: JS::from_ref(canvas),
}) })
} }
@ -134,15 +134,18 @@ impl<'a> WebGLRenderingContextMethods for &'a WebGLRenderingContext {
// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.3 // https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.3
fn GetError(self) -> u32 { fn GetError(self) -> u32 {
let error_code = match self.last_error.get() { let error_code = if let Some(error) = self.last_error.get() {
WebGLError::NoError => constants::NO_ERROR, match error {
WebGLError::InvalidEnum => constants::INVALID_ENUM, WebGLError::InvalidEnum => constants::INVALID_ENUM,
WebGLError::InvalidValue => constants::INVALID_VALUE, WebGLError::InvalidValue => constants::INVALID_VALUE,
WebGLError::InvalidOperation => constants::INVALID_OPERATION, WebGLError::InvalidOperation => constants::INVALID_OPERATION,
WebGLError::OutOfMemory => constants::OUT_OF_MEMORY, WebGLError::OutOfMemory => constants::OUT_OF_MEMORY,
WebGLError::ContextLost => constants::CONTEXT_LOST_WEBGL, WebGLError::ContextLost => constants::CONTEXT_LOST_WEBGL,
}
} else {
constants::NO_ERROR
}; };
self.last_error.set(WebGLError::NoError); self.last_error.set(None);
error_code error_code
} }
@ -231,9 +234,8 @@ impl<'a> WebGLRenderingContextMethods for &'a WebGLRenderingContext {
framebuffer.bind(target) framebuffer.bind(target)
} else { } else {
// Bind the default framebuffer // Bind the default framebuffer
self.renderer.send( let cmd = CanvasWebGLMsg::BindFramebuffer(target, WebGLFramebufferBindingRequest::Default);
CanvasMsg::WebGL( self.renderer.send(CanvasMsg::WebGL(cmd)).unwrap();
CanvasWebGLMsg::BindFramebuffer(target, WebGLFramebufferBindingRequest::Default))).unwrap()
} }
} }
@ -502,8 +504,8 @@ impl<'a> WebGLRenderingContextHelpers for &'a WebGLRenderingContext {
fn handle_webgl_error(&self, err: WebGLError) { fn handle_webgl_error(&self, err: WebGLError) {
// If an error has been detected no further errors must be // If an error has been detected no further errors must be
// recorded until `getError` has been called // recorded until `getError` has been called
if self.last_error.get() == WebGLError::NoError { if self.last_error.get().is_none() {
self.last_error.set(err); self.last_error.set(Some(err));
} }
} }
} }

View file

@ -21,10 +21,9 @@ pub struct WebGLShader {
webgl_object: WebGLObject, webgl_object: WebGLObject,
id: u32, id: u32,
gl_type: u32, gl_type: u32,
// TODO(ecoal95): is RefCell ok?
source: RefCell<Option<String>>, source: RefCell<Option<String>>,
is_deleted: Cell<bool>, is_deleted: Cell<bool>,
// TODO(ecoal95): Valorate moving this to `WebGLObject` // TODO(ecoal95): Evaluate moving this to `WebGLObject`
renderer: Sender<CanvasMsg>, renderer: Sender<CanvasMsg>,
} }
@ -45,8 +44,9 @@ impl WebGLShader {
shader_type: u32) -> Option<Root<WebGLShader>> { shader_type: u32) -> Option<Root<WebGLShader>> {
let (sender, receiver) = channel(); let (sender, receiver) = channel();
renderer.send(CanvasMsg::WebGL(CanvasWebGLMsg::CreateShader(shader_type, sender))).unwrap(); renderer.send(CanvasMsg::WebGL(CanvasWebGLMsg::CreateShader(shader_type, sender))).unwrap();
receiver.recv().unwrap()
.map(|shader_id| WebGLShader::new(global, renderer, *shader_id, shader_type)) let result = receiver.recv().unwrap();
result.map(|shader_id| WebGLShader::new(global, renderer, *shader_id, shader_type))
} }
pub fn new(global: GlobalRef, pub fn new(global: GlobalRef,
@ -81,13 +81,11 @@ impl<'a> WebGLShaderHelpers for &'a WebGLShader {
// TODO(ecoal95): Validate shaders to be conforming to the WebGL spec // TODO(ecoal95): Validate shaders to be conforming to the WebGL spec
/// glCompileShader /// glCompileShader
fn compile(self) { fn compile(self) {
// NB(ecoal95): We intentionally don't check for source, we don't wan't
// to change gl error behavior
self.renderer.send(CanvasMsg::WebGL(CanvasWebGLMsg::CompileShader(self.id))).unwrap() self.renderer.send(CanvasMsg::WebGL(CanvasWebGLMsg::CompileShader(self.id))).unwrap()
} }
/// Mark this shader as deleted (if it wasn't previously) /// Mark this shader as deleted (if it wasn't previously)
/// and delete it as if calling tr glDeleteShader. /// and delete it as if calling glDeleteShader.
fn delete(self) { fn delete(self) {
if !self.is_deleted.get() { if !self.is_deleted.get() {
self.is_deleted.set(true); self.is_deleted.set(true);
@ -116,7 +114,7 @@ impl<'a> WebGLShaderHelpers for &'a WebGLShader {
/// Get the shader source /// Get the shader source
fn source(self) -> Option<String> { fn source(self) -> Option<String> {
(*self.source.borrow()).clone() self.source.borrow().clone()
} }
/// glShaderSource /// glShaderSource

View file

@ -34,8 +34,9 @@ impl WebGLTexture {
pub fn maybe_new(global: GlobalRef, renderer: Sender<CanvasMsg>) -> Option<Root<WebGLTexture>> { pub fn maybe_new(global: GlobalRef, renderer: Sender<CanvasMsg>) -> Option<Root<WebGLTexture>> {
let (sender, receiver) = channel(); let (sender, receiver) = channel();
renderer.send(CanvasMsg::WebGL(CanvasWebGLMsg::CreateTexture(sender))).unwrap(); renderer.send(CanvasMsg::WebGL(CanvasWebGLMsg::CreateTexture(sender))).unwrap();
receiver.recv().unwrap()
.map(|texture_id| WebGLTexture::new(global, renderer, *texture_id)) let result = receiver.recv().unwrap();
result.map(|texture_id| WebGLTexture::new(global, renderer, *texture_id))
} }
pub fn new(global: GlobalRef, renderer: Sender<CanvasMsg>, id: u32) -> Root<WebGLTexture> { pub fn new(global: GlobalRef, renderer: Sender<CanvasMsg>, id: u32) -> Root<WebGLTexture> {