diff options
author | Eric Anholt <eric@anholt.net> | 2016-08-14 18:35:32 -0700 |
---|---|---|
committer | Eric Anholt <eric@anholt.net> | 2016-08-26 14:04:20 -0700 |
commit | db9fe23903d53193a969df35c5a142def6b6893f (patch) | |
tree | f508e0f08a5f0f2d67e91ad3be5fd69d34564ff2 /components/script/dom/webglrenderingcontext.rs | |
parent | 6ec2c41df8a07c81ada5d4d1d6f5ec647fb9868b (diff) | |
download | servo-db9fe23903d53193a969df35c5a142def6b6893f.tar.gz servo-db9fe23903d53193a969df35c5a142def6b6893f.zip |
webgl: Remove objects from binding points on object deletion.
We keep bindings that shadow what's mapped in the GL state currently,
and so we need to remove the objects from our binding points when they
get implicitly removed from the GL binding points during object deletion.
Diffstat (limited to 'components/script/dom/webglrenderingcontext.rs')
-rw-r--r-- | components/script/dom/webglrenderingcontext.rs | 29 |
1 files changed, 24 insertions, 5 deletions
diff --git a/components/script/dom/webglrenderingcontext.rs b/components/script/dom/webglrenderingcontext.rs index cd336e02e50..96eb0ae98df 100644 --- a/components/script/dom/webglrenderingcontext.rs +++ b/components/script/dom/webglrenderingcontext.rs @@ -61,6 +61,24 @@ macro_rules! handle_potential_webgl_error { }; } +// From the GLES 2.0.25 spec, page 85: +// +// "If a texture that is currently bound to one of the targets +// TEXTURE_2D, or TEXTURE_CUBE_MAP is deleted, it is as though +// BindTexture had been executed with the same target and texture +// zero." +// +// and similar text occurs for other object types. +macro_rules! handle_object_deletion { + ($binding:expr, $object:ident) => { + if let Some(bound_object) = $binding.get() { + if bound_object.id() == $object.id() { + $binding.set(None); + } + } + }; +} + /// Set of bitflags for texture unpacking (texImage2d, etc...) bitflags! { #[derive(HeapSizeOf, JSTraceable)] @@ -1101,6 +1119,8 @@ impl WebGLRenderingContextMethods for WebGLRenderingContext { // https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.5 fn DeleteBuffer(&self, buffer: Option<&WebGLBuffer>) { if let Some(buffer) = buffer { + handle_object_deletion!(self.bound_buffer_array, buffer); + handle_object_deletion!(self.bound_buffer_element_array, buffer); buffer.delete() } } @@ -1108,11 +1128,7 @@ impl WebGLRenderingContextMethods for WebGLRenderingContext { // https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.6 fn DeleteFramebuffer(&self, framebuffer: Option<&WebGLFramebuffer>) { if let Some(framebuffer) = framebuffer { - if let Some(bound_fb) = self.bound_framebuffer.get() { - if bound_fb.id() == framebuffer.id() { - self.bound_framebuffer.set(None); - } - } + handle_object_deletion!(self.bound_framebuffer, framebuffer); framebuffer.delete() } } @@ -1127,6 +1143,8 @@ impl WebGLRenderingContextMethods for WebGLRenderingContext { // https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.8 fn DeleteTexture(&self, texture: Option<&WebGLTexture>) { if let Some(texture) = texture { + handle_object_deletion!(self.bound_texture_2d, texture); + handle_object_deletion!(self.bound_texture_cube_map, texture); texture.delete() } } @@ -1134,6 +1152,7 @@ impl WebGLRenderingContextMethods for WebGLRenderingContext { // https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.9 fn DeleteProgram(&self, program: Option<&WebGLProgram>) { if let Some(program) = program { + handle_object_deletion!(self.current_program, program); program.delete() } } |