Graphite: Add remnant P010 support for Vulkan

Vulkan/Gbm is only one without P010 support. This change adds support
for it.

Bug: dawn:2073
Change-Id: I02ad94ef48b1c13bb9eb65dac28d1b957cb582f2
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/154700
Commit-Queue: Saifuddin Hitawala <hitawala@chromium.org>
Reviewed-by: Corentin Wallez <cwallez@chromium.org>
Kokoro: Kokoro <noreply+kokoro@google.com>
Reviewed-by: Austin Eng <enga@chromium.org>
diff --git a/src/dawn/native/vulkan/PhysicalDeviceVk.cpp b/src/dawn/native/vulkan/PhysicalDeviceVk.cpp
index 6080dc4..8d3ebca 100644
--- a/src/dawn/native/vulkan/PhysicalDeviceVk.cpp
+++ b/src/dawn/native/vulkan/PhysicalDeviceVk.cpp
@@ -300,6 +300,7 @@
     // Multiplanar formats.
     constexpr VkFormat multiplanarFormats[] = {
         VK_FORMAT_G8_B8R8_2PLANE_420_UNORM,
+        VK_FORMAT_G10X6_B10X6R10X6_2PLANE_420_UNORM_3PACK16,
     };
 
     bool allMultiplanarFormatsSupported = true;
@@ -320,6 +321,7 @@
     if (allMultiplanarFormatsSupported) {
         EnableFeature(Feature::DawnMultiPlanarFormats);
         EnableFeature(Feature::MultiPlanarFormatExtendedUsages);
+        EnableFeature(Feature::MultiPlanarFormatP010);
     }
 
     EnableFeature(Feature::SurfaceCapabilities);
diff --git a/src/dawn/tests/end2end/VideoViewsTests_gbm.cpp b/src/dawn/tests/end2end/VideoViewsTests_gbm.cpp
index e3d09c0..b5a3077 100644
--- a/src/dawn/tests/end2end/VideoViewsTests_gbm.cpp
+++ b/src/dawn/tests/end2end/VideoViewsTests_gbm.cpp
@@ -106,6 +106,8 @@
         switch (format) {
             case wgpu::TextureFormat::R8BG8Biplanar420Unorm:
                 return GBM_FORMAT_NV12;
+            case wgpu::TextureFormat::R10X6BG10X6Biplanar420Unorm:
+                return GBM_FORMAT_P010;
             default:
                 DAWN_UNREACHABLE();
         }
@@ -115,6 +117,8 @@
         switch (format) {
             case wgpu::TextureFormat::R8BG8Biplanar420Unorm:
                 return WGPUTextureFormat_R8BG8Biplanar420Unorm;
+            case wgpu::TextureFormat::R10X6BG10X6Biplanar420Unorm:
+                return WGPUTextureFormat_R10X6BG10X6Biplanar420Unorm;
             default:
                 DAWN_UNREACHABLE();
         }
@@ -157,14 +161,30 @@
                                     VideoViewsTestsBase::kYUVImageDataHeightInTexels,
                                     GBM_BO_TRANSFER_WRITE, &strideBytes, &mapHandle);
             EXPECT_NE(addr, nullptr);
-            std::vector<uint8_t> initialData =
-                VideoViewsTestsBase::GetTestTextureData<uint8_t>(format, isCheckerboard);
-            uint8_t* srcBegin = initialData.data();
-            uint8_t* srcEnd = srcBegin + initialData.size();
-            uint8_t* dstBegin = static_cast<uint8_t*>(addr);
-            for (; srcBegin < srcEnd; srcBegin += VideoViewsTestsBase::kYUVImageDataWidthInTexels,
-                                      dstBegin += strideBytes) {
-                std::memcpy(dstBegin, srcBegin, VideoViewsTestsBase::kYUVImageDataWidthInTexels);
+            if (format == wgpu::TextureFormat::R10X6BG10X6Biplanar420Unorm) {
+                std::vector<uint16_t> initialData =
+                    VideoViewsTestsBase::GetTestTextureData<uint16_t>(format, isCheckerboard);
+                uint16_t* srcBegin = initialData.data();
+                uint16_t* srcEnd = srcBegin + (initialData.size() * 2);
+                uint16_t* dstBegin = static_cast<uint16_t*>(addr);
+                for (; srcBegin < srcEnd;
+                     srcBegin += VideoViewsTestsBase::kYUVImageDataWidthInTexels,
+                     dstBegin += strideBytes) {
+                    std::memcpy(dstBegin, srcBegin,
+                                VideoViewsTestsBase::kYUVImageDataWidthInTexels);
+                }
+            } else {
+                std::vector<uint8_t> initialData =
+                    VideoViewsTestsBase::GetTestTextureData<uint8_t>(format, isCheckerboard);
+                uint8_t* srcBegin = initialData.data();
+                uint8_t* srcEnd = srcBegin + initialData.size();
+                uint8_t* dstBegin = static_cast<uint8_t*>(addr);
+                for (; srcBegin < srcEnd;
+                     srcBegin += VideoViewsTestsBase::kYUVImageDataWidthInTexels,
+                     dstBegin += strideBytes) {
+                    std::memcpy(dstBegin, srcBegin,
+                                VideoViewsTestsBase::kYUVImageDataWidthInTexels);
+                }
             }
 
             gbm_bo_unmap(gbmBo, mapHandle);
@@ -226,8 +246,8 @@
 
 // static
 std::vector<Format> VideoViewsTestBackend::Formats() {
-    // TODO(dawn:551): Support sharing P010 video surfaces.
-    return {wgpu::TextureFormat::R8BG8Biplanar420Unorm};
+    return {wgpu::TextureFormat::R8BG8Biplanar420Unorm,
+            wgpu::TextureFormat::R10X6BG10X6Biplanar420Unorm};
 }
 
 // static