diff options
author | Josh Matthews <josh@joshmatthews.net> | 2020-04-09 17:18:35 -0400 |
---|---|---|
committer | Josh Matthews <josh@joshmatthews.net> | 2020-04-30 00:21:49 -0400 |
commit | 29ab55d076eedff3847b13885f8ea8b2374af45c (patch) | |
tree | 4ae01efe7899c34caf06a0ba8d37483a46600c66 /components/canvas/webgl_thread.rs | |
parent | 8789a6a8d8186416a766f7ef2a71af217e20f9fb (diff) | |
download | servo-29ab55d076eedff3847b13885f8ea8b2374af45c.tar.gz servo-29ab55d076eedff3847b13885f8ea8b2374af45c.zip |
webgl: Fix support for float/half-float texture formats.
Diffstat (limited to 'components/canvas/webgl_thread.rs')
-rw-r--r-- | components/canvas/webgl_thread.rs | 33 |
1 files changed, 22 insertions, 11 deletions
diff --git a/components/canvas/webgl_thread.rs b/components/canvas/webgl_thread.rs index 4613110019a..5e4bdbc4056 100644 --- a/components/canvas/webgl_thread.rs +++ b/components/canvas/webgl_thread.rs @@ -2773,7 +2773,8 @@ fn image_to_tex_image_data( } match (format, data_type) { - (TexFormat::RGBA, TexDataType::UnsignedByte) => pixels, + (TexFormat::RGBA, TexDataType::UnsignedByte) | + (TexFormat::RGBA8, TexDataType::UnsignedByte) => pixels, (TexFormat::RGB, TexDataType::UnsignedByte) => { for i in 0..pixel_count { let rgb = { @@ -2854,7 +2855,8 @@ fn image_to_tex_image_data( pixels.truncate(pixel_count * 2); pixels }, - (TexFormat::RGBA, TexDataType::Float) => { + (TexFormat::RGBA, TexDataType::Float) | + (TexFormat::RGBA32f, TexDataType::Float) => { let mut rgbaf32 = Vec::<u8>::with_capacity(pixel_count * 16); for rgba8 in pixels.chunks(4) { rgbaf32.write_f32::<NativeEndian>(rgba8[0] as f32).unwrap(); @@ -2865,7 +2867,8 @@ fn image_to_tex_image_data( rgbaf32 }, - (TexFormat::RGB, TexDataType::Float) => { + (TexFormat::RGB, TexDataType::Float) | + (TexFormat::RGB32f, TexDataType::Float) => { let mut rgbf32 = Vec::<u8>::with_capacity(pixel_count * 12); for rgba8 in pixels.chunks(4) { rgbf32.write_f32::<NativeEndian>(rgba8[0] as f32).unwrap(); @@ -2875,7 +2878,8 @@ fn image_to_tex_image_data( rgbf32 }, - (TexFormat::Alpha, TexDataType::Float) => { + (TexFormat::Alpha, TexDataType::Float) | + (TexFormat::Alpha32f, TexDataType::Float) => { for rgba8 in pixels.chunks_mut(4) { let p = rgba8[3] as f32; NativeEndian::write_f32(rgba8, p); @@ -2883,7 +2887,8 @@ fn image_to_tex_image_data( pixels }, - (TexFormat::Luminance, TexDataType::Float) => { + (TexFormat::Luminance, TexDataType::Float) | + (TexFormat::Luminance32f, TexDataType::Float) => { for rgba8 in pixels.chunks_mut(4) { let p = rgba8[0] as f32; NativeEndian::write_f32(rgba8, p); @@ -2891,7 +2896,8 @@ fn image_to_tex_image_data( pixels }, - (TexFormat::LuminanceAlpha, TexDataType::Float) => { + (TexFormat::LuminanceAlpha, TexDataType::Float) | + (TexFormat::LuminanceAlpha32f, TexDataType::Float) => { let mut data = Vec::<u8>::with_capacity(pixel_count * 8); for rgba8 in pixels.chunks(4) { data.write_f32::<NativeEndian>(rgba8[0] as f32).unwrap(); @@ -2900,7 +2906,8 @@ fn image_to_tex_image_data( data }, - (TexFormat::RGBA, TexDataType::HalfFloat) => { + (TexFormat::RGBA, TexDataType::HalfFloat) | + (TexFormat::RGBA16f, TexDataType::HalfFloat) => { let mut rgbaf16 = Vec::<u8>::with_capacity(pixel_count * 8); for rgba8 in pixels.chunks(4) { rgbaf16 @@ -2919,7 +2926,8 @@ fn image_to_tex_image_data( rgbaf16 }, - (TexFormat::RGB, TexDataType::HalfFloat) => { + (TexFormat::RGB, TexDataType::HalfFloat) | + (TexFormat::RGB16f, TexDataType::HalfFloat) => { let mut rgbf16 = Vec::<u8>::with_capacity(pixel_count * 6); for rgba8 in pixels.chunks(4) { rgbf16 @@ -2934,7 +2942,8 @@ fn image_to_tex_image_data( } rgbf16 }, - (TexFormat::Alpha, TexDataType::HalfFloat) => { + (TexFormat::Alpha, TexDataType::HalfFloat) | + (TexFormat::Alpha16f, TexDataType::HalfFloat) => { for i in 0..pixel_count { let p = f16::from_f32(pixels[i * 4 + 3] as f32).as_bits(); NativeEndian::write_u16(&mut pixels[i * 2..i * 2 + 2], p); @@ -2942,7 +2951,8 @@ fn image_to_tex_image_data( pixels.truncate(pixel_count * 2); pixels }, - (TexFormat::Luminance, TexDataType::HalfFloat) => { + (TexFormat::Luminance, TexDataType::HalfFloat) | + (TexFormat::Luminance16f, TexDataType::HalfFloat) => { for i in 0..pixel_count { let p = f16::from_f32(pixels[i * 4] as f32).as_bits(); NativeEndian::write_u16(&mut pixels[i * 2..i * 2 + 2], p); @@ -2950,7 +2960,8 @@ fn image_to_tex_image_data( pixels.truncate(pixel_count * 2); pixels }, - (TexFormat::LuminanceAlpha, TexDataType::HalfFloat) => { + (TexFormat::LuminanceAlpha, TexDataType::HalfFloat) | + (TexFormat::LuminanceAlpha16f, TexDataType::HalfFloat) => { for rgba8 in pixels.chunks_mut(4) { let lum = f16::from_f32(rgba8[0] as f32).as_bits(); let a = f16::from_f32(rgba8[3] as f32).as_bits(); |