aboutsummaryrefslogtreecommitdiffstats
path: root/components/script/dom
diff options
context:
space:
mode:
authorImanol Fernandez <mortimergoro@gmail.com>2017-04-20 14:55:43 +0200
committerImanol Fernandez <mortimergoro@gmail.com>2017-04-21 20:23:55 +0200
commit6b0c898e1a2cde3d47ca6593b8250b765cc06771 (patch)
treeedeb0a8f7c2373abce26c334bdb67f8537b13935 /components/script/dom
parent7f825d2119a480a64b103e1d60a2d469af98d3de (diff)
downloadservo-6b0c898e1a2cde3d47ca6593b8250b765cc06771.tar.gz
servo-6b0c898e1a2cde3d47ca6593b8250b765cc06771.zip
Fix highp precision in shaders & Implement WebGL::GetShaderPrecisionFormat
Diffstat (limited to 'components/script/dom')
-rw-r--r--components/script/dom/webglrenderingcontext.rs22
-rw-r--r--components/script/dom/webglshader.rs4
-rw-r--r--components/script/dom/webidls/WebGLRenderingContext.webidl2
3 files changed, 26 insertions, 2 deletions
diff --git a/components/script/dom/webglrenderingcontext.rs b/components/script/dom/webglrenderingcontext.rs
index 8d99e1303d0..34f5b368a42 100644
--- a/components/script/dom/webglrenderingcontext.rs
+++ b/components/script/dom/webglrenderingcontext.rs
@@ -31,6 +31,7 @@ use dom::webglframebuffer::WebGLFramebuffer;
use dom::webglprogram::WebGLProgram;
use dom::webglrenderbuffer::WebGLRenderbuffer;
use dom::webglshader::WebGLShader;
+use dom::webglshaderprecisionformat::WebGLShaderPrecisionFormat;
use dom::webgltexture::{TexParameterValue, WebGLTexture};
use dom::webgluniformlocation::WebGLUniformLocation;
use dom::window::Window;
@@ -1902,6 +1903,27 @@ impl WebGLRenderingContextMethods for WebGLRenderingContext {
}
}
+ // https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.9
+ fn GetShaderPrecisionFormat(&self,
+ shader_type: u32,
+ precision_type: u32)
+ -> Option<Root<WebGLShaderPrecisionFormat>> {
+ let (sender, receiver) = webrender_traits::channel::msg_channel().unwrap();
+ self.ipc_renderer.send(CanvasMsg::WebGL(WebGLCommand::GetShaderPrecisionFormat(shader_type,
+ precision_type,
+ sender)))
+ .unwrap();
+ match receiver.recv().unwrap() {
+ Ok((range_min, range_max, precision)) => {
+ Some(WebGLShaderPrecisionFormat::new(self.global().as_window(), range_min, range_max, precision))
+ },
+ Err(error) => {
+ self.webgl_error(error);
+ None
+ }
+ }
+ }
+
// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.10
fn GetUniformLocation(&self,
program: Option<&WebGLProgram>,
diff --git a/components/script/dom/webglshader.rs b/components/script/dom/webglshader.rs
index 1526b5303f7..b66151bf353 100644
--- a/components/script/dom/webglshader.rs
+++ b/components/script/dom/webglshader.rs
@@ -106,9 +106,11 @@ impl WebGLShader {
}
if let Some(ref source) = *self.source.borrow() {
+ let mut params = BuiltInResources::default();
+ params.FragmentPrecisionHigh = 1;
let validator = ShaderValidator::for_webgl(self.gl_type,
SHADER_OUTPUT_FORMAT,
- &BuiltInResources::default()).unwrap();
+ &params).unwrap();
match validator.compile_and_translate(&[source]) {
Ok(translated_source) => {
debug!("Shader translated: {}", translated_source);
diff --git a/components/script/dom/webidls/WebGLRenderingContext.webidl b/components/script/dom/webidls/WebGLRenderingContext.webidl
index ef0be0f9465..0d4c14a05df 100644
--- a/components/script/dom/webidls/WebGLRenderingContext.webidl
+++ b/components/script/dom/webidls/WebGLRenderingContext.webidl
@@ -595,7 +595,7 @@ interface WebGLRenderingContextBase
DOMString? getProgramInfoLog(WebGLProgram? program);
//any getRenderbufferParameter(GLenum target, GLenum pname);
any getShaderParameter(WebGLShader? shader, GLenum pname);
- //WebGLShaderPrecisionFormat? getShaderPrecisionFormat(GLenum shadertype, GLenum precisiontype);
+ WebGLShaderPrecisionFormat? getShaderPrecisionFormat(GLenum shadertype, GLenum precisiontype);
DOMString? getShaderInfoLog(WebGLShader? shader);
DOMString? getShaderSource(WebGLShader? shader);