mirror of
https://github.com/servo/servo.git
synced 2025-08-03 20:50:07 +01:00
Implement IsShader fn and IsTexture fn for WebGLRenderingContext
This commit is contained in:
parent
a09b2374f9
commit
8a5b0b8972
5 changed files with 51 additions and 2 deletions
|
@ -68,6 +68,14 @@ impl WebGLProgram {
|
||||||
if !self.is_deleted.get() {
|
if !self.is_deleted.get() {
|
||||||
self.is_deleted.set(true);
|
self.is_deleted.set(true);
|
||||||
let _ = self.renderer.send(CanvasMsg::WebGL(WebGLCommand::DeleteProgram(self.id)));
|
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_slot.set(Some(shader));
|
||||||
|
shader.increment_attached_counter();
|
||||||
|
|
||||||
self.renderer.send(CanvasMsg::WebGL(WebGLCommand::AttachShader(self.id, shader.id()))).unwrap();
|
self.renderer.send(CanvasMsg::WebGL(WebGLCommand::AttachShader(self.id, shader.id()))).unwrap();
|
||||||
|
|
||||||
|
@ -144,6 +153,7 @@ impl WebGLProgram {
|
||||||
}
|
}
|
||||||
|
|
||||||
shader_slot.set(None);
|
shader_slot.set(None);
|
||||||
|
shader.decrement_attached_counter();
|
||||||
|
|
||||||
self.renderer.send(CanvasMsg::WebGL(WebGLCommand::DetachShader(self.id, shader.id()))).unwrap();
|
self.renderer.send(CanvasMsg::WebGL(WebGLCommand::DetachShader(self.id, shader.id()))).unwrap();
|
||||||
|
|
||||||
|
|
|
@ -1157,6 +1157,16 @@ impl WebGLRenderingContextMethods for WebGLRenderingContext {
|
||||||
.unwrap()
|
.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
|
// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.3
|
||||||
fn LineWidth(&self, width: f32) {
|
fn LineWidth(&self, width: f32) {
|
||||||
if width.is_nan() || width <= 0f32 {
|
if width.is_nan() || width <= 0f32 {
|
||||||
|
|
|
@ -32,6 +32,7 @@ pub struct WebGLShader {
|
||||||
source: DOMRefCell<Option<DOMString>>,
|
source: DOMRefCell<Option<DOMString>>,
|
||||||
info_log: DOMRefCell<Option<String>>,
|
info_log: DOMRefCell<Option<String>>,
|
||||||
is_deleted: Cell<bool>,
|
is_deleted: Cell<bool>,
|
||||||
|
attached_counter: Cell<u32>,
|
||||||
compilation_status: Cell<ShaderCompilationStatus>,
|
compilation_status: Cell<ShaderCompilationStatus>,
|
||||||
#[ignore_heap_size_of = "Defined in ipc-channel"]
|
#[ignore_heap_size_of = "Defined in ipc-channel"]
|
||||||
renderer: IpcSender<CanvasMsg>,
|
renderer: IpcSender<CanvasMsg>,
|
||||||
|
@ -55,6 +56,7 @@ impl WebGLShader {
|
||||||
source: DOMRefCell::new(None),
|
source: DOMRefCell::new(None),
|
||||||
info_log: DOMRefCell::new(None),
|
info_log: DOMRefCell::new(None),
|
||||||
is_deleted: Cell::new(false),
|
is_deleted: Cell::new(false),
|
||||||
|
attached_counter: Cell::new(0),
|
||||||
compilation_status: Cell::new(ShaderCompilationStatus::NotCompiled),
|
compilation_status: Cell::new(ShaderCompilationStatus::NotCompiled),
|
||||||
renderer: renderer,
|
renderer: renderer,
|
||||||
}
|
}
|
||||||
|
@ -126,6 +128,7 @@ impl WebGLShader {
|
||||||
|
|
||||||
/// 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 glDeleteShader.
|
/// and delete it as if calling glDeleteShader.
|
||||||
|
/// Currently does not check if shader is attached
|
||||||
pub fn delete(&self) {
|
pub fn delete(&self) {
|
||||||
if !self.is_deleted.get() {
|
if !self.is_deleted.get() {
|
||||||
self.is_deleted.set(true);
|
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
|
/// glGetShaderInfoLog
|
||||||
pub fn info_log(&self) -> Option<String> {
|
pub fn info_log(&self) -> Option<String> {
|
||||||
self.info_log.borrow().clone()
|
self.info_log.borrow().clone()
|
||||||
|
@ -162,6 +182,7 @@ impl WebGLShader {
|
||||||
|
|
||||||
impl Drop for WebGLShader {
|
impl Drop for WebGLShader {
|
||||||
fn drop(&mut self) {
|
fn drop(&mut self) {
|
||||||
|
assert!(self.attached_counter.get() == 0);
|
||||||
self.delete();
|
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:
|
/// We have to follow the conversion rules for GLES 2.0. See:
|
||||||
/// https://www.khronos.org/webgl/public-mailing-list/archives/1008/msg00014.html
|
/// 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 isFramebuffer(WebGLFramebuffer? framebuffer);
|
||||||
//[WebGLHandlesContextLoss] GLboolean isProgram(WebGLProgram? program);
|
//[WebGLHandlesContextLoss] GLboolean isProgram(WebGLProgram? program);
|
||||||
//[WebGLHandlesContextLoss] GLboolean isRenderbuffer(WebGLRenderbuffer? renderbuffer);
|
//[WebGLHandlesContextLoss] GLboolean isRenderbuffer(WebGLRenderbuffer? renderbuffer);
|
||||||
//[WebGLHandlesContextLoss] GLboolean isShader(WebGLShader? shader);
|
[WebGLHandlesContextLoss] GLboolean isShader(WebGLShader? shader);
|
||||||
//[WebGLHandlesContextLoss] GLboolean isTexture(WebGLTexture? texture);
|
[WebGLHandlesContextLoss] GLboolean isTexture(WebGLTexture? texture);
|
||||||
void lineWidth(GLfloat width);
|
void lineWidth(GLfloat width);
|
||||||
void linkProgram(WebGLProgram? program);
|
void linkProgram(WebGLProgram? program);
|
||||||
void pixelStorei(GLenum pname, GLint param);
|
void pixelStorei(GLenum pname, GLint param);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue