mirror of
https://github.com/servo/servo.git
synced 2025-06-21 07:38:59 +01:00
Use byte channels to send textures to the WebGL thread
This commit is contained in:
parent
408e540c55
commit
4bd8efa49e
3 changed files with 38 additions and 17 deletions
|
@ -834,11 +834,32 @@ impl WebGLImpl {
|
||||||
WebGLCommand::SetViewport(x, y, width, height) => {
|
WebGLCommand::SetViewport(x, y, width, height) => {
|
||||||
ctx.gl().viewport(x, y, width, height);
|
ctx.gl().viewport(x, y, width, height);
|
||||||
}
|
}
|
||||||
WebGLCommand::TexImage2D(target, level, internal, width, height, format, data_type, ref data) =>
|
WebGLCommand::TexImage2D(target, level, internal, width, height, format, data_type, ref chan) => {
|
||||||
ctx.gl().tex_image_2d(target, level, internal, width, height,
|
ctx.gl().tex_image_2d(
|
||||||
/*border*/0, format, data_type, Some(data)),
|
target,
|
||||||
WebGLCommand::TexSubImage2D(target, level, xoffset, yoffset, x, y, width, height, ref data) =>
|
level,
|
||||||
ctx.gl().tex_sub_image_2d(target, level, xoffset, yoffset, x, y, width, height, data),
|
internal,
|
||||||
|
width,
|
||||||
|
height,
|
||||||
|
0,
|
||||||
|
format,
|
||||||
|
data_type,
|
||||||
|
Some(&chan.recv().unwrap()),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
WebGLCommand::TexSubImage2D(target, level, xoffset, yoffset, x, y, width, height, ref chan) => {
|
||||||
|
ctx.gl().tex_sub_image_2d(
|
||||||
|
target,
|
||||||
|
level,
|
||||||
|
xoffset,
|
||||||
|
yoffset,
|
||||||
|
x,
|
||||||
|
y,
|
||||||
|
width,
|
||||||
|
height,
|
||||||
|
&chan.recv().unwrap(),
|
||||||
|
)
|
||||||
|
}
|
||||||
WebGLCommand::DrawingBufferWidth(ref sender) =>
|
WebGLCommand::DrawingBufferWidth(ref sender) =>
|
||||||
sender.send(ctx.borrow_draw_buffer().unwrap().size().width).unwrap(),
|
sender.send(ctx.borrow_draw_buffer().unwrap().size().width).unwrap(),
|
||||||
WebGLCommand::DrawingBufferHeight(ref sender) =>
|
WebGLCommand::DrawingBufferHeight(ref sender) =>
|
||||||
|
|
|
@ -252,8 +252,8 @@ pub enum WebGLCommand {
|
||||||
VertexAttribPointer(u32, i32, u32, bool, i32, u32),
|
VertexAttribPointer(u32, i32, u32, bool, i32, u32),
|
||||||
VertexAttribPointer2f(u32, i32, bool, i32, u32),
|
VertexAttribPointer2f(u32, i32, bool, i32, u32),
|
||||||
SetViewport(i32, i32, i32, i32),
|
SetViewport(i32, i32, i32, i32),
|
||||||
TexImage2D(u32, i32, i32, i32, i32, u32, u32, ByteBuf),
|
TexImage2D(u32, i32, i32, i32, i32, u32, u32, IpcBytesReceiver),
|
||||||
TexSubImage2D(u32, i32, i32, i32, i32, i32, u32, u32, ByteBuf),
|
TexSubImage2D(u32, i32, i32, i32, i32, i32, u32, u32, IpcBytesReceiver),
|
||||||
DrawingBufferWidth(WebGLSender<i32>),
|
DrawingBufferWidth(WebGLSender<i32>),
|
||||||
DrawingBufferHeight(WebGLSender<i32>),
|
DrawingBufferHeight(WebGLSender<i32>),
|
||||||
Finish(WebGLSender<()>),
|
Finish(WebGLSender<()>),
|
||||||
|
|
|
@ -966,17 +966,17 @@ impl WebGLRenderingContext {
|
||||||
let internal_format = self.extension_manager.get_effective_tex_internal_format(format, data_type);
|
let internal_format = self.extension_manager.get_effective_tex_internal_format(format, data_type);
|
||||||
|
|
||||||
// TODO(emilio): convert colorspace if requested
|
// TODO(emilio): convert colorspace if requested
|
||||||
let msg = WebGLCommand::TexImage2D(
|
let (sender, receiver) = ipc::bytes_channel().unwrap();
|
||||||
|
self.send_command(WebGLCommand::TexImage2D(
|
||||||
target.as_gl_constant(),
|
target.as_gl_constant(),
|
||||||
level as i32,
|
level as i32,
|
||||||
internal_format as i32,
|
internal_format as i32,
|
||||||
width as i32, height as i32,
|
width as i32, height as i32,
|
||||||
format,
|
format,
|
||||||
data_type,
|
data_type,
|
||||||
pixels.into(),
|
receiver,
|
||||||
);
|
));
|
||||||
|
sender.send(&pixels).unwrap();
|
||||||
self.send_command(msg);
|
|
||||||
|
|
||||||
if let Some(fb) = self.bound_framebuffer.get() {
|
if let Some(fb) = self.bound_framebuffer.get() {
|
||||||
fb.invalidate_texture(&*texture);
|
fb.invalidate_texture(&*texture);
|
||||||
|
@ -1021,7 +1021,8 @@ impl WebGLRenderingContext {
|
||||||
self.send_command(WebGLCommand::PixelStorei(constants::UNPACK_ALIGNMENT, unpacking_alignment as i32));
|
self.send_command(WebGLCommand::PixelStorei(constants::UNPACK_ALIGNMENT, unpacking_alignment as i32));
|
||||||
|
|
||||||
// TODO(emilio): convert colorspace if requested
|
// TODO(emilio): convert colorspace if requested
|
||||||
let msg = WebGLCommand::TexSubImage2D(
|
let (sender, receiver) = ipc::bytes_channel().unwrap();
|
||||||
|
self.send_command(WebGLCommand::TexSubImage2D(
|
||||||
target.as_gl_constant(),
|
target.as_gl_constant(),
|
||||||
level as i32,
|
level as i32,
|
||||||
xoffset,
|
xoffset,
|
||||||
|
@ -1030,10 +1031,9 @@ impl WebGLRenderingContext {
|
||||||
height as i32,
|
height as i32,
|
||||||
format.as_gl_constant(),
|
format.as_gl_constant(),
|
||||||
data_type.as_gl_constant(),
|
data_type.as_gl_constant(),
|
||||||
pixels.into(),
|
receiver,
|
||||||
);
|
));
|
||||||
|
sender.send(&pixels).unwrap();
|
||||||
self.send_command(msg);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fn get_gl_extensions(&self) -> String {
|
fn get_gl_extensions(&self) -> String {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue