Auto merge of #21207 - servo:webgl, r=emilio

Some WebGL drive-by fixes

<!-- Reviewable:start -->
This change is [<img src="https://reviewable.io/review_button.svg" height="34" align="absmiddle" alt="Reviewable"/>](https://reviewable.io/reviews/servo/servo/21207)
<!-- Reviewable:end -->
This commit is contained in:
bors-servo 2018-07-19 09:38:21 -04:00 committed by GitHub
commit 48db1ed65e
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 38 additions and 16 deletions

View file

@ -28,6 +28,7 @@ pub struct WebGLProgram {
is_deleted: Cell<bool>,
link_called: Cell<bool>,
linked: Cell<bool>,
link_generation: Cell<u64>,
fragment_shader: MutNullableDom<WebGLShader>,
vertex_shader: MutNullableDom<WebGLShader>,
#[ignore_malloc_size_of = "Defined in ipc-channel"]
@ -37,15 +38,14 @@ pub struct WebGLProgram {
}
impl WebGLProgram {
fn new_inherited(renderer: WebGLMsgSender,
id: WebGLProgramId)
-> WebGLProgram {
WebGLProgram {
fn new_inherited(renderer: WebGLMsgSender, id: WebGLProgramId) -> Self {
Self {
webgl_object: WebGLObject::new_inherited(),
id: id,
is_deleted: Cell::new(false),
link_called: Cell::new(false),
linked: Cell::new(false),
link_generation: Default::default(),
fragment_shader: Default::default(),
vertex_shader: Default::default(),
renderer: renderer,
@ -109,7 +109,9 @@ impl WebGLProgram {
return Err(WebGLError::InvalidOperation);
}
self.linked.set(false);
*self.active_attribs.borrow_mut() = vec![].into();
self.link_generation.set(self.link_generation.get().checked_add(1).unwrap());
*self.active_attribs.borrow_mut() = Box::new([]);
*self.active_uniforms.borrow_mut() = Box::new([]);
match self.fragment_shader.get() {
Some(ref shader) if shader.successfully_compiled() => {},
@ -354,7 +356,14 @@ impl WebGLProgram {
.unwrap();
let location = receiver.recv().unwrap();
Ok(Some(WebGLUniformLocation::new(self.global().as_window(), location, self.id, size, type_)))
Ok(Some(WebGLUniformLocation::new(
self.global().as_window(),
location,
self.id,
self.link_generation.get(),
size,
type_,
)))
}
/// glGetProgramInfoLog
@ -388,6 +397,10 @@ impl WebGLProgram {
(None, None) => vec![]
})
}
pub fn link_generation(&self) -> u64 {
self.link_generation.get()
}
}
impl Drop for WebGLProgram {

View file

@ -436,7 +436,10 @@ impl WebGLRenderingContext {
None => return,
};
match self.current_program.get() {
Some(ref program) if program.id() == location.program_id() => {}
Some(ref program) if
program.id() == location.program_id() &&
program.link_generation() == location.link_generation()
=> {}
_ => return self.webgl_error(InvalidOperation),
}
handle_potential_webgl_error!(self, f(location));
@ -3612,7 +3615,12 @@ impl WebGLRenderingContextMethods for WebGLRenderingContext {
) -> JSVal {
// FIXME(nox): https://github.com/servo/servo/issues/21133
if program.is_deleted() || !program.is_linked() || program.id() != location.program_id() {
if
program.is_deleted() ||
!program.is_linked() ||
program.id() != location.program_id() ||
program.link_generation() != location.link_generation()
{
self.webgl_error(InvalidOperation);
return NullValue();
}

View file

@ -15,6 +15,7 @@ pub struct WebGLUniformLocation {
reflector_: Reflector,
id: i32,
program_id: WebGLProgramId,
link_generation: u64,
size: Option<i32>,
type_: u32,
}
@ -23,6 +24,7 @@ impl WebGLUniformLocation {
fn new_inherited(
id: i32,
program_id: WebGLProgramId,
link_generation: u64,
size: Option<i32>,
type_: u32,
) -> Self {
@ -30,6 +32,7 @@ impl WebGLUniformLocation {
reflector_: Reflector::new(),
id,
program_id,
link_generation,
size,
type_,
}
@ -39,11 +42,12 @@ impl WebGLUniformLocation {
window: &Window,
id: i32,
program_id: WebGLProgramId,
link_generation: u64,
size: Option<i32>,
type_: u32,
) -> DomRoot<Self> {
reflect_dom_object(
Box::new(Self::new_inherited(id, program_id, size, type_)),
Box::new(Self::new_inherited(id, program_id, link_generation, size, type_)),
window,
WebGLUniformLocationBinding::Wrap,
)
@ -57,6 +61,10 @@ impl WebGLUniformLocation {
self.program_id
}
pub fn link_generation(&self) -> u64 {
self.link_generation
}
pub fn size(&self) -> Option<i32> {
self.size
}

View file

@ -1,7 +0,0 @@
[uniform-location.html]
[WebGL test #20: getError expected: INVALID_OPERATION. Was NO_ERROR : after evaluating: contextA.uniform1i(locationSx, 3)]
expected: FAIL
[WebGL test #21: getError expected: INVALID_OPERATION. Was NO_ERROR : after evaluating: contextA.getUniform(programS, locationSx)]
expected: FAIL