Skip to content

Commit 11ee1ff

Browse files
committed
servo: Merge #6240 - WebGLRenderingContext getters and getParameter (from emilio:webgl-context-enhancements); r=nox
This implements the `canvas`, `drawingBufferHeight` and `drawingBufferWidth` getters to `WebGLRenderingContext`, and an initial version of `getParameter`. r? jdm or nox? Source-Repo: https://github.com/servo/servo Source-Revision: 042737793b1995ad93dc093ea12ec986b99e64b8 UltraBlame original commit: 08315987d48b2049b6e499840edecef4bfc21576
1 parent f4aaaf0 commit 11ee1ff

File tree

6 files changed

+89
-13
lines changed

6 files changed

+89
-13
lines changed

servo/components/canvas/webgl_paint_task.rs

Lines changed: 21 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -32,9 +32,15 @@ impl WebGLPaintTask {
3232
let context = try!(
3333
GLContext::create_offscreen_with_color_attachment(
3434
size, attrs, ColorAttachmentType::TextureWithSurface));
35+
36+
37+
38+
39+
let real_size = context.borrow_draw_buffer().unwrap().size();
40+
3541
Ok(WebGLPaintTask {
36-
size: size,
37-
original_context_size: size,
42+
size: real_size,
43+
original_context_size: real_size,
3844
gl_context: context
3945
})
4046
}
@@ -64,10 +70,11 @@ impl WebGLPaintTask {
6470
CanvasWebGLMsg::ShaderSource(shader_id, source) => self.shader_source(shader_id, source),
6571
CanvasWebGLMsg::Uniform4fv(uniform_id, data) => self.uniform_4fv(uniform_id, data),
6672
CanvasWebGLMsg::UseProgram(program_id) => self.use_program(program_id),
67-
CanvasWebGLMsg::VertexAttribPointer2f(attrib_id, size, normalized, stride, offset) => {
68-
self.vertex_attrib_pointer_f32(attrib_id, size, normalized, stride, offset);
69-
},
73+
CanvasWebGLMsg::VertexAttribPointer2f(attrib_id, size, normalized, stride, offset) =>
74+
self.vertex_attrib_pointer_f32(attrib_id, size, normalized, stride, offset),
7075
CanvasWebGLMsg::Viewport(x, y, width, height) => self.viewport(x, y, width, height),
76+
CanvasWebGLMsg::DrawingBufferWidth(sender) => self.send_drawing_buffer_width(sender),
77+
CanvasWebGLMsg::DrawingBufferHeight(sender) => self.send_drawing_buffer_height(sender),
7178
}
7279
}
7380

@@ -102,6 +109,14 @@ impl WebGLPaintTask {
102109
sender.send(*self.gl_context.borrow_attributes()).unwrap()
103110
}
104111

112+
fn send_drawing_buffer_width(&self, sender: Sender<i32>) {
113+
sender.send(self.size.width).unwrap()
114+
}
115+
116+
fn send_drawing_buffer_height(&self, sender: Sender<i32>) {
117+
sender.send(self.size.height).unwrap()
118+
}
119+
105120
fn attach_shader(&self, program_id: u32, shader_id: u32) {
106121
gl::attach_shader(program_id, shader_id);
107122
}
@@ -229,7 +244,7 @@ impl WebGLPaintTask {
229244
if size.width > self.original_context_size.width ||
230245
size.height > self.original_context_size.height {
231246
try!(self.gl_context.resize(size));
232-
self.size = size;
247+
self.size = self.gl_context.borrow_draw_buffer().unwrap().size();
233248
} else {
234249
self.size = size;
235250
unsafe { gl::Scissor(0, 0, size.width, size.height); }

servo/components/canvas_traits/lib.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,8 @@ pub enum CanvasWebGLMsg {
9090
UseProgram(u32),
9191
VertexAttribPointer2f(u32, i32, bool, i32, i64),
9292
Viewport(i32, i32, i32, i32),
93+
DrawingBufferWidth(Sender<i32>),
94+
DrawingBufferHeight(Sender<i32>),
9395
}
9496

9597
#[derive(Clone)]

servo/components/script/dom/webglrenderingcontext.rs

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ use dom::bindings::codegen::Bindings::WebGLRenderingContextBinding::{
1010
use dom::bindings::global::{GlobalRef, GlobalField};
1111
use dom::bindings::js::{JS, JSRef, LayoutJS, Temporary};
1212
use dom::bindings::utils::{Reflector, reflect_dom_object};
13+
use dom::bindings::conversions::ToJSValConvertible;
1314
use dom::htmlcanvaselement::{HTMLCanvasElement};
1415
use dom::webglbuffer::{WebGLBuffer, WebGLBufferHelpers};
1516
use dom::webglshader::{WebGLShader, WebGLShaderHelpers};
@@ -73,6 +74,38 @@ impl Drop for WebGLRenderingContext {
7374
}
7475

7576
impl<'a> WebGLRenderingContextMethods for JSRef<'a, WebGLRenderingContext> {
77+
// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.1
78+
fn Canvas(self) -> Temporary<HTMLCanvasElement> {
79+
Temporary::from_rooted(self.canvas)
80+
}
81+
82+
// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.1
83+
fn DrawingBufferWidth(self) -> i32 {
84+
let (sender, receiver) = channel();
85+
self.renderer.send(CanvasMsg::WebGL(CanvasWebGLMsg::DrawingBufferWidth(sender))).unwrap();
86+
receiver.recv().unwrap()
87+
}
88+
89+
// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.1
90+
fn DrawingBufferHeight(self) -> i32 {
91+
let (sender, receiver) = channel();
92+
self.renderer.send(CanvasMsg::WebGL(CanvasWebGLMsg::DrawingBufferHeight(sender))).unwrap();
93+
receiver.recv().unwrap()
94+
}
95+
96+
// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.3
97+
fn GetParameter(self, cx: *mut JSContext, parameter: u32) -> JSVal {
98+
// TODO(ecoal95): Implement the missing parameters from the spec
99+
match parameter {
100+
WebGLRenderingContextConstants::VERSION =>
101+
DOMString::from_str("WebGL 1.0").to_jsval(cx),
102+
WebGLRenderingContextConstants::RENDERER |
103+
WebGLRenderingContextConstants::VENDOR =>
104+
DOMString::from_str("Mozilla/Servo").to_jsval(cx),
105+
_ => NullValue(),
106+
}
107+
}
108+
76109
// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.2
77110
fn GetContextAttributes(self) -> Option<WebGLContextAttributes> {
78111
let (sender, receiver) = channel();

servo/components/script/dom/webidls/WebGLRenderingContext.webidl

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -307,9 +307,9 @@ interface WebGLRenderingContextBase
307307
//const GLenum DECR_WRAP = 0x8508;
308308

309309
/* StringName */
310-
//const GLenum VENDOR = 0x1F00;
311-
//const GLenum RENDERER = 0x1F01;
312-
//const GLenum VERSION = 0x1F02;
310+
const GLenum VENDOR = 0x1F00;
311+
const GLenum RENDERER = 0x1F01;
312+
const GLenum VERSION = 0x1F02;
313313

314314
/* TextureMagFilter */
315315
//const GLenum NEAREST = 0x2600;
@@ -477,9 +477,9 @@ interface WebGLRenderingContextBase
477477
//const GLenum UNPACK_COLORSPACE_CONVERSION_WEBGL = 0x9243;
478478
//const GLenum BROWSER_DEFAULT_WEBGL = 0x9244;
479479

480-
//readonly attribute HTMLCanvasElement canvas;
481-
//readonly attribute GLsizei drawingBufferWidth;
482-
//readonly attribute GLsizei drawingBufferHeight;
480+
readonly attribute HTMLCanvasElement canvas;
481+
readonly attribute GLsizei drawingBufferWidth;
482+
readonly attribute GLsizei drawingBufferHeight;
483483

484484
[WebGLHandlesContextLoss] WebGLContextAttributes? getContextAttributes();
485485
//[WebGLHandlesContextLoss] boolean isContextLost();
@@ -577,7 +577,7 @@ interface WebGLRenderingContextBase
577577
[WebGLHandlesContextLoss] GLint getAttribLocation(WebGLProgram? program, DOMString name);
578578

579579
//any getBufferParameter(GLenum target, GLenum pname);
580-
//any getParameter(GLenum pname);
580+
any getParameter(GLenum pname);
581581

582582
//[WebGLHandlesContextLoss] GLenum getError();
583583

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
<!doctype html>
2+
<meta charset="utf-8">
3+
<title>WebGLRenderingContext getParameter test</title>
4+
<script>
5+
var gl = document.createElement("canvas").getContext("webgl");
6+
7+
if ( typeof gl.getParameter !== "function" )
8+
console.error("getParameter should be a function");
9+
10+
if ( gl.getParameter(gl.VERSION).indexOf("WebGL 1.0") !== 0 )
11+
console.error("getParameter(VERSION) should return a string beginning with \"WebGL 1.0\"");
12+
</script>
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
<!doctype html>
2+
<meta charset="utf-8">
3+
<title>WebGLRenderingContext attributes test</title>
4+
<script>
5+
var canvas = document.createElement('canvas'),
6+
gl = canvas.getContext('webgl');
7+
8+
if ( gl.canvas !== canvas )
9+
console.error("Expected a canvas getter");
10+
11+
if ( typeof gl.drawingBufferWidth !== "number" ||
12+
typeof gl.drawingBufferHeight !== "number" )
13+
console.error("drawingBuffer{Height/Width} should be numbers");
14+
</script>

0 commit comments

Comments
 (0)