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