aboutsummaryrefslogtreecommitdiffstats
path: root/components/canvas/webgl_paint_thread.rs
diff options
context:
space:
mode:
authorGlenn Watson <github@intuitionlibrary.com>2017-03-22 11:07:44 +1000
committerGlenn Watson <github@intuitionlibrary.com>2017-03-23 14:32:03 +1000
commitfe75382bcbb20efe43e650d144fa3bde7160f853 (patch)
treedab694c7670fe1f7e792772a20c2c5fe0d068bc6 /components/canvas/webgl_paint_thread.rs
parent9d72e89ce3502cb58147375c8ecc4e9e9356b1ee (diff)
downloadservo-fe75382bcbb20efe43e650d144fa3bde7160f853.tar.gz
servo-fe75382bcbb20efe43e650d144fa3bde7160f853.zip
Update WR (gl/es runtime table, scroll roots).
Diffstat (limited to 'components/canvas/webgl_paint_thread.rs')
-rw-r--r--components/canvas/webgl_paint_thread.rs41
1 files changed, 29 insertions, 12 deletions
diff --git a/components/canvas/webgl_paint_thread.rs b/components/canvas/webgl_paint_thread.rs
index 53a3732889f..2894df71a06 100644
--- a/components/canvas/webgl_paint_thread.rs
+++ b/components/canvas/webgl_paint_thread.rs
@@ -22,17 +22,20 @@ enum GLContextWrapper {
impl GLContextWrapper {
fn new(size: Size2D<i32>,
- attributes: GLContextAttributes) -> Result<GLContextWrapper, &'static str> {
+ attributes: GLContextAttributes,
+ gl_type: gl::GlType) -> Result<GLContextWrapper, &'static str> {
if opts::get().should_use_osmesa() {
let ctx = GLContext::<OSMesaContext>::new(size,
attributes,
ColorAttachmentType::Texture,
+ gl_type,
None);
ctx.map(GLContextWrapper::OSMesa)
} else {
let ctx = GLContext::<NativeGLContext>::new(size,
attributes,
ColorAttachmentType::Texture,
+ gl_type,
None);
ctx.map(GLContextWrapper::Native)
}
@@ -62,6 +65,17 @@ impl GLContextWrapper {
}
}
+ fn gl(&self) -> &gl::Gl {
+ match *self {
+ GLContextWrapper::Native(ref ctx) => {
+ ctx.gl()
+ }
+ GLContextWrapper::OSMesa(ref ctx) => {
+ ctx.gl()
+ }
+ }
+ }
+
pub fn make_current(&self) {
match *self {
GLContextWrapper::Native(ref ctx) => {
@@ -97,9 +111,10 @@ pub struct WebGLPaintThread {
fn create_readback_painter(size: Size2D<i32>,
attrs: GLContextAttributes,
- webrender_api: webrender_traits::RenderApi)
+ webrender_api: webrender_traits::RenderApi,
+ gl_type: gl::GlType)
-> Result<(WebGLPaintThread, GLLimits), String> {
- let context = try!(GLContextWrapper::new(size, attrs));
+ let context = try!(GLContextWrapper::new(size, attrs, gl_type));
let limits = context.get_limits();
let image_key = webrender_api.generate_image_key();
let painter = WebGLPaintThread {
@@ -113,7 +128,8 @@ fn create_readback_painter(size: Size2D<i32>,
impl WebGLPaintThread {
fn new(size: Size2D<i32>,
attrs: GLContextAttributes,
- webrender_api_sender: webrender_traits::RenderApiSender)
+ webrender_api_sender: webrender_traits::RenderApiSender,
+ gl_type: gl::GlType)
-> Result<(WebGLPaintThread, GLLimits), String> {
let wr_api = webrender_api_sender.create_api();
let device_size = webrender_traits::DeviceIntSize::from_untyped(&size);
@@ -127,7 +143,7 @@ impl WebGLPaintThread {
},
Err(msg) => {
warn!("Initial context creation failed, falling back to readback: {}", msg);
- create_readback_painter(size, attrs, wr_api)
+ create_readback_painter(size, attrs, wr_api, gl_type)
}
}
}
@@ -165,7 +181,8 @@ impl WebGLPaintThread {
let (sender, receiver) = ipc::channel::<CanvasMsg>().unwrap();
let (result_chan, result_port) = channel();
thread::Builder::new().name("WebGLThread".to_owned()).spawn(move || {
- let mut painter = match WebGLPaintThread::new(size, attrs, webrender_api_sender) {
+ let gl_type = gl::GlType::default();
+ let mut painter = match WebGLPaintThread::new(size, attrs, webrender_api_sender, gl_type) {
Ok((thread, limits)) => {
result_chan.send(Ok(limits)).unwrap();
thread
@@ -212,14 +229,14 @@ impl WebGLPaintThread {
fn send_data(&mut self, chan: IpcSender<CanvasData>) {
match self.data {
- WebGLPaintTaskData::Readback(_, ref webrender_api, image_key) => {
+ WebGLPaintTaskData::Readback(ref ctx, ref webrender_api, image_key) => {
let width = self.size.width as usize;
let height = self.size.height as usize;
- let mut pixels = gl::read_pixels(0, 0,
- self.size.width as gl::GLsizei,
- self.size.height as gl::GLsizei,
- gl::RGBA, gl::UNSIGNED_BYTE);
+ let mut pixels = ctx.gl().read_pixels(0, 0,
+ self.size.width as gl::GLsizei,
+ self.size.height as gl::GLsizei,
+ gl::RGBA, gl::UNSIGNED_BYTE);
// flip image vertically (texture is upside down)
let orig_pixels = pixels.clone();
let stride = width * 4;
@@ -267,7 +284,7 @@ impl WebGLPaintThread {
self.size = try!(context.resize(size));
} else {
self.size = size;
- unsafe { gl::Scissor(0, 0, size.width, size.height); }
+ context.gl().scissor(0, 0, size.width, size.height);
}
}
WebGLPaintTaskData::WebRender(ref api, id) => {