aboutsummaryrefslogtreecommitdiffstats
path: root/components/canvas/webgl_thread.rs
diff options
context:
space:
mode:
authorJosh Matthews <josh@joshmatthews.net>2020-04-09 17:18:35 -0400
committerJosh Matthews <josh@joshmatthews.net>2020-04-30 00:21:49 -0400
commit29ab55d076eedff3847b13885f8ea8b2374af45c (patch)
tree4ae01efe7899c34caf06a0ba8d37483a46600c66 /components/canvas/webgl_thread.rs
parent8789a6a8d8186416a766f7ef2a71af217e20f9fb (diff)
downloadservo-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.rs33
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();