D3D11: Add 16 bits Unorm formats' support to B2T shaders.

Bug: 348653642
Change-Id: I8b5d5a96b983f64c4b79ba14696735a0ac67efd7
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/232114
Reviewed-by: Geoff Lang <geofflang@chromium.org>
Commit-Queue: Quyen Le <lehoangquyen@chromium.org>
Reviewed-by: Loko Kung <lokokung@google.com>
diff --git a/src/dawn/native/BlitBufferToTexture.cpp b/src/dawn/native/BlitBufferToTexture.cpp
index 805690d..1f40095 100644
--- a/src/dawn/native/BlitBufferToTexture.cpp
+++ b/src/dawn/native/BlitBufferToTexture.cpp
@@ -132,12 +132,27 @@
 }
 )";
 
+constexpr std::string_view kUnpackR16Unorm = R"(
+fn unpackData(byteOffset: u32) -> vec4f {
+    return vec4f(f32(loadU16AsU32(byteOffset)) / f32(0xffff), 0.0, 0.0, 1.0);
+}
+)";
+
 constexpr std::string_view kUnpackRG16Float = R"(
 fn unpackData(byteOffset: u32) -> vec4f {
     return vec4f(unpack2x16float(loadU32(byteOffset)), 0.0, 1.0);
 }
 )";
 
+constexpr std::string_view kUnpackRG16Unorm = R"(
+fn unpackData(byteOffset: u32) -> vec4f {
+    let word = loadU32(byteOffset);
+    let x = f32(word & 0xffff);
+    let y = f32(word >> 16);
+    return vec4f(vec2f(x, y) / f32(0xffff), 0.0, 1.0);
+}
+)";
+
 constexpr std::string_view kUnpackRGBA16Float = R"(
 fn unpackData(byteOffset: u32) -> vec4f {
     let data = loadTwoU32s(byteOffset);
@@ -145,6 +160,17 @@
 }
 )";
 
+constexpr std::string_view kUnpackRGBA16Unorm = R"(
+fn unpackData(byteOffset: u32) -> vec4f {
+    let words = loadTwoU32s(byteOffset);
+    let x = f32(words[0] & 0xffff);
+    let y = f32(words[0] >> 16);
+    let z = f32(words[1] & 0xffff);
+    let w = f32(words[1] >> 16);
+    return vec4f(x, y, z, w) / f32(0xffff);
+}
+)";
+
 constexpr std::string_view kUnpackR32Float = R"(
 fn unpackData(byteOffset: u32) -> vec4f {
     return vec4f(bitcast<f32>(loadU32(byteOffset)), 0.0, 0.0, 1.0);
@@ -189,14 +215,26 @@
             pixelSize = 2;
             ss << kUnpackR16Float;
             break;
+        case wgpu::TextureFormat::R16Unorm:
+            pixelSize = 2;
+            ss << kUnpackR16Unorm;
+            break;
         case wgpu::TextureFormat::RG16Float:
             pixelSize = 4;
             ss << kUnpackRG16Float;
             break;
+        case wgpu::TextureFormat::RG16Unorm:
+            pixelSize = 4;
+            ss << kUnpackRG16Unorm;
+            break;
         case wgpu::TextureFormat::RGBA16Float:
             pixelSize = 8;
             ss << kUnpackRGBA16Float;
             break;
+        case wgpu::TextureFormat::RGBA16Unorm:
+            pixelSize = 8;
+            ss << kUnpackRGBA16Unorm;
+            break;
         case wgpu::TextureFormat::R32Float:
             pixelSize = 4;
             ss << kUnpackR32Float;
@@ -291,8 +329,11 @@
         case wgpu::TextureFormat::RGBA8Unorm:
         case wgpu::TextureFormat::BGRA8Unorm:
         case wgpu::TextureFormat::R16Float:
+        case wgpu::TextureFormat::R16Unorm:
         case wgpu::TextureFormat::RG16Float:
+        case wgpu::TextureFormat::RG16Unorm:
         case wgpu::TextureFormat::RGBA16Float:
+        case wgpu::TextureFormat::RGBA16Unorm:
         case wgpu::TextureFormat::R32Float:
         case wgpu::TextureFormat::RG32Float:
         case wgpu::TextureFormat::RGBA32Float:
diff --git a/src/dawn/tests/end2end/CopyTests.cpp b/src/dawn/tests/end2end/CopyTests.cpp
index f0b4a59..3b54665 100644
--- a/src/dawn/tests/end2end/CopyTests.cpp
+++ b/src/dawn/tests/end2end/CopyTests.cpp
@@ -383,8 +383,35 @@
         TextureSpec() { format = GetParam().mTextureFormat; }
     };
 
+    void SetUp() override {
+        DawnTestWithParams<CopyTextureFormatParams>::SetUp();
+        switch (GetParam().mTextureFormat) {
+            case wgpu::TextureFormat::R16Unorm:
+            case wgpu::TextureFormat::RG16Unorm:
+            case wgpu::TextureFormat::RGBA16Unorm:
+                DAWN_TEST_UNSUPPORTED_IF(
+                    !device.HasFeature(wgpu::FeatureName::Unorm16TextureFormats));
+                break;
+            default:
+                break;
+        }
+    }
+
     std::vector<wgpu::FeatureName> GetRequiredFeatures() override {
         std::vector<wgpu::FeatureName> requiredFeatures = {};
+
+        switch (GetParam().mTextureFormat) {
+            case wgpu::TextureFormat::R16Unorm:
+            case wgpu::TextureFormat::RG16Unorm:
+            case wgpu::TextureFormat::RGBA16Unorm:
+                if (SupportsFeatures({wgpu::FeatureName::Unorm16TextureFormats})) {
+                    requiredFeatures.push_back(wgpu::FeatureName::Unorm16TextureFormats);
+                }
+                break;
+            default:
+                break;
+        }
+
         if (SupportsFeatures({wgpu::FeatureName::DawnTexelCopyBufferRowAlignment})) {
             requiredFeatures.push_back(wgpu::FeatureName::DawnTexelCopyBufferRowAlignment);
         }
@@ -632,14 +659,26 @@
                 DoTestImpl<ColorF16<1>>(textureSpec, bufferSpec, copySize, dimension,
                                         /*tolerance=*/ColorF16<1>(0.001f));
                 break;
+            case wgpu::TextureFormat::R16Unorm:
+                DoTestImpl<Color<uint16_t, 1>>(textureSpec, bufferSpec, copySize, dimension,
+                                               /*tolerance=*/Color<uint16_t, 1>(1));
+                break;
             case wgpu::TextureFormat::RG16Float:
                 DoTestImpl<ColorF16<2>>(textureSpec, bufferSpec, copySize, dimension,
                                         /*tolerance=*/ColorF16<2>(0.001f));
                 break;
+            case wgpu::TextureFormat::RG16Unorm:
+                DoTestImpl<Color<uint16_t, 2>>(textureSpec, bufferSpec, copySize, dimension,
+                                               /*tolerance=*/Color<uint16_t, 2>(1));
+                break;
             case wgpu::TextureFormat::RGBA16Float:
                 DoTestImpl<ColorF16<4>>(textureSpec, bufferSpec, copySize, dimension,
                                         /*tolerance=*/ColorF16<4>(0.001f));
                 break;
+            case wgpu::TextureFormat::RGBA16Unorm:
+                DoTestImpl<Color<uint16_t, 4>>(textureSpec, bufferSpec, copySize, dimension,
+                                               /*tolerance=*/Color<uint16_t, 4>(1));
+                break;
             case wgpu::TextureFormat::R32Float:
                 DoTestImpl<Color<float, 1>>(textureSpec, bufferSpec, copySize, dimension,
                                             /*tolerance=*/Color<float, 1>(0.0001f));
@@ -2761,14 +2800,17 @@
                             wgpu::TextureFormat::RGBA8Unorm,
 
                             wgpu::TextureFormat::R16Float,
+                            wgpu::TextureFormat::R16Unorm,
 
                             wgpu::TextureFormat::RG16Float,
+                            wgpu::TextureFormat::RG16Unorm,
 
                             wgpu::TextureFormat::R32Float,
 
                             wgpu::TextureFormat::RG32Float,
 
                             wgpu::TextureFormat::RGBA16Float,
+                            wgpu::TextureFormat::RGBA16Unorm,
 
                             wgpu::TextureFormat::RGBA32Float,