From 29ab55d076eedff3847b13885f8ea8b2374af45c Mon Sep 17 00:00:00 2001 From: Josh Matthews Date: Thu, 9 Apr 2020 17:18:35 -0400 Subject: webgl: Fix support for float/half-float texture formats. --- components/canvas/webgl_thread.rs | 33 ++++++++++++++++++++++----------- 1 file changed, 22 insertions(+), 11 deletions(-) (limited to 'components/canvas/webgl_thread.rs') 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::::with_capacity(pixel_count * 16); for rgba8 in pixels.chunks(4) { rgbaf32.write_f32::(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::::with_capacity(pixel_count * 12); for rgba8 in pixels.chunks(4) { rgbf32.write_f32::(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::::with_capacity(pixel_count * 8); for rgba8 in pixels.chunks(4) { data.write_f32::(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::::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::::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(); -- cgit v1.2.3