[dawn][native] Add TransferFunctionDawn::BT_1886

And add tests that it is indeed Gamma 2.4.

Fixed: 537798743
Change-Id: I79437bdd7f6da703e0b2b8cf5a1e6042d002cff1
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/329615
Reviewed-by: Yordan Chaparov <dancho@google.com>
Commit-Queue: Corentin Wallez <cwallez@chromium.org>
Reviewed-by: Loko Kung <lokokung@google.com>
diff --git a/src/dawn/common/ColorSpace.h b/src/dawn/common/ColorSpace.h
index b05aeb1..7d726e8 100644
--- a/src/dawn/common/ColorSpace.h
+++ b/src/dawn/common/ColorSpace.h
@@ -255,6 +255,18 @@
     .f = 0.0f,
 };
 
+// https://registry.khronos.org/DataFormat/specs/1.4/dataformat.1.4.html#TRANSFER_BT1886
+// BT1886 also known as Gamma 2.4
+inline constexpr TransferFunction kEOTF_BT_1886 = {
+    .g = 2.4f,
+    .a = 1.0f,
+    .b = 0.0f,
+    .c = 0.0f,
+    .d = 0.0f,
+    .e = 0.0f,
+    .f = 0.0f,
+};
+
 // https://registry.khronos.org/DataFormat/specs/1.4/dataformat.1.4.html#TRANSFER_DCIP3
 inline constexpr TransferFunction kEOTF_DisplayP3 = {
     .g = 2.6f,
diff --git a/src/dawn/common/ExternalTextureParams.cpp b/src/dawn/common/ExternalTextureParams.cpp
index 0486641..e9a8179 100644
--- a/src/dawn/common/ExternalTextureParams.cpp
+++ b/src/dawn/common/ExternalTextureParams.cpp
@@ -155,6 +155,9 @@
             srcLuminanceOf1 = kPQLuminanceOf1;
             srcEOTF = kEOTF_PQ;
             break;
+        case wgpu::ColorSpaceTransferDawn::BT_1886:
+            srcEOTF = kEOTF_BT_1886;
+            break;
         default:
             return wgpu::Status::Error;
     }
diff --git a/src/dawn/dawn.json b/src/dawn/dawn.json
index b75c873..c08b003 100644
--- a/src/dawn/dawn.json
+++ b/src/dawn/dawn.json
@@ -1905,7 +1905,8 @@
             {"value": 3, "name": "display p3"},
             {"value": 4, "name": "SMPTE_170M"},
             {"value": 5, "name": "HLG"},
-            {"value": 6, "name": "PQ"}
+            {"value": 6, "name": "PQ"},
+            {"value": 7, "name": "BT_1886"}
         ]
     },
     "color space y cb cr range dawn": {
diff --git a/src/dawn/tests/end2end/ExternalTextureTests.cpp b/src/dawn/tests/end2end/ExternalTextureTests.cpp
index fefffe8..75d285a 100644
--- a/src/dawn/tests/end2end/ExternalTextureTests.cpp
+++ b/src/dawn/tests/end2end/ExternalTextureTests.cpp
@@ -2138,6 +2138,27 @@
         wgpu::PredefinedColorSpace::Rec2020Linear, {0.4, 0.2, 0.1, 1}, {0.4, 0.2, 0.1});
 }
 
+// Test that ColorSpaceTransferDawn::BT_1886 is indeed Gamma 2.4.
+TEST_P(ExternalTextureTests, ColorSpaceConversion_BT1886) {
+    auto G = [](float f) -> float { return std::powf(f, 2.4); };
+
+    CheckColorSpaceConversion(
+        {
+            .primaries = wgpu::ColorSpacePrimariesDawn::Rec2020,
+            .transfer = wgpu::ColorSpaceTransferDawn::BT_1886,
+        },
+        wgpu::PredefinedColorSpace::Rec2020Linear, {0.4, 0.2, 0.1, 1}, {G(0.4), G(0.2), G(0.1)});
+
+    // Test with small values that would be in the linear ramp of sRGB (between 0 and 0.05).
+    CheckColorSpaceConversion(
+        {
+            .primaries = wgpu::ColorSpacePrimariesDawn::Rec2020,
+            .transfer = wgpu::ColorSpaceTransferDawn::BT_1886,
+        },
+        wgpu::PredefinedColorSpace::Rec2020Linear, {0.04, 0.02, 0.01, 1},
+        {G(0.04), G(0.02), G(0.01)});
+}
+
 // TODO(https://crbug.com/468988322): Add tests of ExternalTextures being used with a resource table
 // and with Vulkan's extended dynamic state as these are other interactions that could easily break.