mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-10-28 12:45:27 +00:00
servo: Merge #11072 - Implement IsShader fn and IsTexture fn for WebGLRenderingContext (from DDEFISHER:master); r=emilio
fixes #11064 Source-Repo: https://github.com/servo/servo Source-Revision: f45a99c9fe5a4b05dd0d27f129d53ed1f75ea8ff
This commit is contained in:
parent
3867862e33
commit
bb11573405
@ -68,6 +68,14 @@ impl WebGLProgram {
|
||||
if !self.is_deleted.get() {
|
||||
self.is_deleted.set(true);
|
||||
let _ = self.renderer.send(CanvasMsg::WebGL(WebGLCommand::DeleteProgram(self.id)));
|
||||
|
||||
if let Some(shader) = self.fragment_shader.get() {
|
||||
shader.decrement_attached_counter();
|
||||
}
|
||||
|
||||
if let Some(shader) = self.vertex_shader.get() {
|
||||
shader.decrement_attached_counter();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -118,6 +126,7 @@ impl WebGLProgram {
|
||||
}
|
||||
|
||||
shader_slot.set(Some(shader));
|
||||
shader.increment_attached_counter();
|
||||
|
||||
self.renderer.send(CanvasMsg::WebGL(WebGLCommand::AttachShader(self.id, shader.id()))).unwrap();
|
||||
|
||||
@ -144,6 +153,7 @@ impl WebGLProgram {
|
||||
}
|
||||
|
||||
shader_slot.set(None);
|
||||
shader.decrement_attached_counter();
|
||||
|
||||
self.renderer.send(CanvasMsg::WebGL(WebGLCommand::DetachShader(self.id, shader.id()))).unwrap();
|
||||
|
||||
|
@ -1157,6 +1157,16 @@ impl WebGLRenderingContextMethods for WebGLRenderingContext {
|
||||
.unwrap()
|
||||
}
|
||||
|
||||
// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.9
|
||||
fn IsShader(&self, shader: Option<&WebGLShader>) -> bool {
|
||||
shader.map_or(false, |s| !s.is_deleted() || s.is_attached())
|
||||
}
|
||||
|
||||
// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.8
|
||||
fn IsTexture(&self, texture: Option<&WebGLTexture>) -> bool {
|
||||
texture.map_or(false, |tex| tex.target().is_some() && !tex.is_deleted())
|
||||
}
|
||||
|
||||
// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.3
|
||||
fn LineWidth(&self, width: f32) {
|
||||
if width.is_nan() || width <= 0f32 {
|
||||
|
@ -32,6 +32,7 @@ pub struct WebGLShader {
|
||||
source: DOMRefCell<Option<DOMString>>,
|
||||
info_log: DOMRefCell<Option<String>>,
|
||||
is_deleted: Cell<bool>,
|
||||
attached_counter: Cell<u32>,
|
||||
compilation_status: Cell<ShaderCompilationStatus>,
|
||||
#[ignore_heap_size_of = "Defined in ipc-channel"]
|
||||
renderer: IpcSender<CanvasMsg>,
|
||||
@ -55,6 +56,7 @@ impl WebGLShader {
|
||||
source: DOMRefCell::new(None),
|
||||
info_log: DOMRefCell::new(None),
|
||||
is_deleted: Cell::new(false),
|
||||
attached_counter: Cell::new(0),
|
||||
compilation_status: Cell::new(ShaderCompilationStatus::NotCompiled),
|
||||
renderer: renderer,
|
||||
}
|
||||
@ -126,6 +128,7 @@ impl WebGLShader {
|
||||
|
||||
/// Mark this shader as deleted (if it wasn't previously)
|
||||
/// and delete it as if calling glDeleteShader.
|
||||
/// Currently does not check if shader is attached
|
||||
pub fn delete(&self) {
|
||||
if !self.is_deleted.get() {
|
||||
self.is_deleted.set(true);
|
||||
@ -133,6 +136,23 @@ impl WebGLShader {
|
||||
}
|
||||
}
|
||||
|
||||
pub fn is_deleted(&self) -> bool {
|
||||
self.is_deleted.get()
|
||||
}
|
||||
|
||||
pub fn is_attached(&self) -> bool {
|
||||
self.attached_counter.get() > 0
|
||||
}
|
||||
|
||||
pub fn increment_attached_counter(&self) {
|
||||
self.attached_counter.set(self.attached_counter.get() + 1);
|
||||
}
|
||||
|
||||
pub fn decrement_attached_counter(&self) {
|
||||
assert!(self.attached_counter.get() > 0);
|
||||
self.attached_counter.set(self.attached_counter.get() - 1);
|
||||
}
|
||||
|
||||
/// glGetShaderInfoLog
|
||||
pub fn info_log(&self) -> Option<String> {
|
||||
self.info_log.borrow().clone()
|
||||
@ -162,6 +182,7 @@ impl WebGLShader {
|
||||
|
||||
impl Drop for WebGLShader {
|
||||
fn drop(&mut self) {
|
||||
assert!(self.attached_counter.get() == 0);
|
||||
self.delete();
|
||||
}
|
||||
}
|
||||
|
@ -176,6 +176,14 @@ impl WebGLTexture {
|
||||
}
|
||||
}
|
||||
|
||||
pub fn is_deleted(&self) -> bool {
|
||||
self.is_deleted.get()
|
||||
}
|
||||
|
||||
pub fn target(&self) -> Option<u32> {
|
||||
self.target.get()
|
||||
}
|
||||
|
||||
/// We have to follow the conversion rules for GLES 2.0. See:
|
||||
/// https://www.khronos.org/webgl/public-mailing-list/archives/1008/msg00014.html
|
||||
///
|
||||
|
@ -605,8 +605,8 @@ interface WebGLRenderingContextBase
|
||||
//[WebGLHandlesContextLoss] GLboolean isFramebuffer(WebGLFramebuffer? framebuffer);
|
||||
//[WebGLHandlesContextLoss] GLboolean isProgram(WebGLProgram? program);
|
||||
//[WebGLHandlesContextLoss] GLboolean isRenderbuffer(WebGLRenderbuffer? renderbuffer);
|
||||
//[WebGLHandlesContextLoss] GLboolean isShader(WebGLShader? shader);
|
||||
//[WebGLHandlesContextLoss] GLboolean isTexture(WebGLTexture? texture);
|
||||
[WebGLHandlesContextLoss] GLboolean isShader(WebGLShader? shader);
|
||||
[WebGLHandlesContextLoss] GLboolean isTexture(WebGLTexture? texture);
|
||||
void lineWidth(GLfloat width);
|
||||
void linkProgram(WebGLProgram? program);
|
||||
void pixelStorei(GLenum pname, GLint param);
|
||||
|
Loading…
Reference in New Issue
Block a user