mirror of
https://github.com/encounter/dawn-cmake.git
synced 2025-06-27 17:03:43 +00:00
Make External Texture ColorSpace Conversion Configurable
Changes external texture creation to use constants provided by Chromium instead of hardcoded values. Bug: dawn:1082 Change-Id: Icfe58f5585732b1e66d2faa50d3aee4a8c53bf84 Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/89703 Commit-Queue: Brandon1 Jones <brandon1.jones@intel.com> Reviewed-by: Austin Eng <enga@chromium.org> Kokoro: Kokoro <noreply+kokoro@google.com>
This commit is contained in:
parent
92244ec9d4
commit
e61a390b31
@ -1334,13 +1334,13 @@
|
|||||||
{"name": "plane 0", "type": "texture view"},
|
{"name": "plane 0", "type": "texture view"},
|
||||||
{"name": "plane 1", "type": "texture view", "optional": true},
|
{"name": "plane 1", "type": "texture view", "optional": true},
|
||||||
{"name": "yuv to rgb conversion matrix", "type": "float", "annotation": "const*",
|
{"name": "yuv to rgb conversion matrix", "type": "float", "annotation": "const*",
|
||||||
"length": 12, "optional": true},
|
"length": 12},
|
||||||
{"name": "src transfer function parameters", "type": "float", "annotation": "const*",
|
{"name": "src transfer function parameters", "type": "float", "annotation": "const*",
|
||||||
"length": 7, "optional": true},
|
"length": 7},
|
||||||
{"name": "dst transfer function parameters", "type": "float", "annotation": "const*",
|
{"name": "dst transfer function parameters", "type": "float", "annotation": "const*",
|
||||||
"length": 7, "optional": true},
|
"length": 7},
|
||||||
{"name": "gamut conversion matrix", "type": "float", "annotation": "const*",
|
{"name": "gamut conversion matrix", "type": "float", "annotation": "const*",
|
||||||
"length": 9, "optional": true},
|
"length": 9},
|
||||||
{"name": "color space", "type": "predefined color space", "default": "srgb"}
|
{"name": "color space", "type": "predefined color space", "default": "srgb"}
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
@ -14,6 +14,7 @@
|
|||||||
|
|
||||||
#include "dawn/native/ExternalTexture.h"
|
#include "dawn/native/ExternalTexture.h"
|
||||||
|
|
||||||
|
#include <algorithm>
|
||||||
#include <utility>
|
#include <utility>
|
||||||
|
|
||||||
#include "dawn/native/Buffer.h"
|
#include "dawn/native/Buffer.h"
|
||||||
@ -56,6 +57,18 @@ MaybeError ValidateExternalTextureDescriptor(const DeviceBase* device,
|
|||||||
|
|
||||||
wgpu::TextureFormat plane0Format = descriptor->plane0->GetFormat().format;
|
wgpu::TextureFormat plane0Format = descriptor->plane0->GetFormat().format;
|
||||||
|
|
||||||
|
DAWN_INVALID_IF(!descriptor->yuvToRgbConversionMatrix,
|
||||||
|
"The YUV-to-RGB conversion matrix must be non-null.");
|
||||||
|
|
||||||
|
DAWN_INVALID_IF(!descriptor->gamutConversionMatrix,
|
||||||
|
"The gamut conversion matrix must be non-null.");
|
||||||
|
|
||||||
|
DAWN_INVALID_IF(!descriptor->srcTransferFunctionParameters,
|
||||||
|
"The source transfer function parameters must be non-null.");
|
||||||
|
|
||||||
|
DAWN_INVALID_IF(!descriptor->dstTransferFunctionParameters,
|
||||||
|
"The destination transfer function parameters must be non-null.");
|
||||||
|
|
||||||
if (descriptor->plane1) {
|
if (descriptor->plane1) {
|
||||||
DAWN_INVALID_IF(descriptor->colorSpace != wgpu::PredefinedColorSpace::Srgb,
|
DAWN_INVALID_IF(descriptor->colorSpace != wgpu::PredefinedColorSpace::Srgb,
|
||||||
"The specified color space (%s) is not %s.", descriptor->colorSpace,
|
"The specified color space (%s) is not %s.", descriptor->colorSpace,
|
||||||
@ -139,46 +152,34 @@ MaybeError ExternalTextureBase::Initialize(DeviceBase* device,
|
|||||||
|
|
||||||
DAWN_TRY_ASSIGN(mParamsBuffer, device->CreateBuffer(&bufferDesc));
|
DAWN_TRY_ASSIGN(mParamsBuffer, device->CreateBuffer(&bufferDesc));
|
||||||
|
|
||||||
// Dawn & Tint's YUV-to-RGB conversion implementation is a simple 3x4 matrix multiplication
|
|
||||||
// using a standard conversion matrix. These matrices can be found in
|
|
||||||
// chromium/src/third_party/skia/src/core/SkYUVMath.cpp
|
|
||||||
ExternalTextureParams params;
|
ExternalTextureParams params;
|
||||||
params.numPlanes = descriptor->plane1 == nullptr ? 1 : 2;
|
params.numPlanes = descriptor->plane1 == nullptr ? 1 : 2;
|
||||||
|
|
||||||
// TODO(dawn:1082): Make this field configurable from outside of Dawn.
|
// YUV-to-RGB conversion is performed by multiplying the source YUV values with a 4x3 matrix
|
||||||
// Conversion matrix for BT.709 limited range. Columns 1, 2 and 3 are copied
|
// passed from Chromium. The matrix was originally sourced from /skia/src/core/SkYUVMath.cpp.
|
||||||
// directly from the corresponding matrix in SkYUVMath.cpp. Column 4 is the range
|
const float* yMat = descriptor->yuvToRgbConversionMatrix;
|
||||||
// bias (for RGB) found in column 5 of the same SkYUVMath.cpp matrix.
|
std::copy(yMat, yMat + 12, params.yuvToRgbConversionMatrix.begin());
|
||||||
params.yuvToRgbConversionMatrix = {1.164384f, 0.0f, 1.792741f, -0.972945f,
|
|
||||||
1.164384f, -0.213249f, -0.532909f, 0.301483f,
|
|
||||||
1.164384f, 2.112402f, 0.0f, -1.133402f};
|
|
||||||
|
|
||||||
// TODO(dawn:1082): Make this field configurable from outside of Dawn.
|
// Gamut correction is performed by multiplying a 3x3 matrix passed from Chromium. The
|
||||||
// Use an identity matrix when converting BT.709 to sRGB because they shared the
|
// matrix was computed by multiplying the appropriate source and destination gamut
|
||||||
// same primaries.
|
// matrices sourced from ui/gfx/color_space.cc.
|
||||||
params.gamutConversionMatrix = {1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f,
|
const float* gMat = descriptor->gamutConversionMatrix;
|
||||||
0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f};
|
params.gamutConversionMatrix = {gMat[0], gMat[1], gMat[2], 0.0f, //
|
||||||
|
gMat[3], gMat[4], gMat[5], 0.0f, //
|
||||||
|
gMat[6], gMat[7], gMat[8], 0.0f};
|
||||||
|
|
||||||
switch (descriptor->colorSpace) {
|
// Gamma decode/encode is performed by the logic:
|
||||||
case wgpu::PredefinedColorSpace::Undefined:
|
// if (abs(v) < params.D) {
|
||||||
// Undefined color space should eventually produce an error. For now, these
|
// return sign(v) * (params.C * abs(v) + params.F);
|
||||||
// constants will effectively perform no gamma correction so tests can continue
|
// }
|
||||||
// passing.
|
// return pow(A * x + B, G) + E
|
||||||
params.gammaDecodingParams = {1.0, 1.0, 0.0, 1.0, 1.0, 0.0, 0.0};
|
//
|
||||||
params.gammaEncodingParams = {1.0, 1.0, 0.0, 1.0, 1.0, 0.0, 0.0};
|
// Constants are passed from Chromium and originally sourced from ui/gfx/color_space.cc
|
||||||
break;
|
const float* srcFn = descriptor->srcTransferFunctionParameters;
|
||||||
case wgpu::PredefinedColorSpace::Srgb:
|
std::copy(srcFn, srcFn + 7, params.gammaDecodingParams.begin());
|
||||||
// TODO(dawn:1082): Make this field configurable from outside of Dawn.
|
|
||||||
// These are the inverted parameters as specified by Rec. ITU-R BT.1886 for BT.709
|
|
||||||
params.gammaDecodingParams = {2.2, 1.0 / 1.099, 0.099 / 1.099, 1 / 4.5, 0.081,
|
|
||||||
0.0, 0.0};
|
|
||||||
|
|
||||||
// Constants for sRGB transfer function pulled from
|
const float* dstFn = descriptor->dstTransferFunctionParameters;
|
||||||
// https://en.wikipedia.org/wiki/SRGB
|
std::copy(dstFn, dstFn + 7, params.gammaEncodingParams.begin());
|
||||||
params.gammaEncodingParams = {
|
|
||||||
1 / 2.4, 1.137119 /*1.055^2.4*/, 0.0, 12.92, 0.0031308, -0.055, 0.0};
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
DAWN_TRY(device->GetQueue()->WriteBuffer(mParamsBuffer.Get(), 0, ¶ms,
|
DAWN_TRY(device->GetQueue()->WriteBuffer(mParamsBuffer.Get(), 0, ¶ms,
|
||||||
sizeof(ExternalTextureParams)));
|
sizeof(ExternalTextureParams)));
|
||||||
|
@ -26,23 +26,12 @@ namespace dawn::native {
|
|||||||
|
|
||||||
class TextureViewBase;
|
class TextureViewBase;
|
||||||
|
|
||||||
struct GammaTransferParams {
|
|
||||||
float G = 0.0;
|
|
||||||
float A = 0.0;
|
|
||||||
float B = 0.0;
|
|
||||||
float C = 0.0;
|
|
||||||
float D = 0.0;
|
|
||||||
float E = 0.0;
|
|
||||||
float F = 0.0;
|
|
||||||
uint32_t padding = 0;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct ExternalTextureParams {
|
struct ExternalTextureParams {
|
||||||
uint32_t numPlanes;
|
uint32_t numPlanes;
|
||||||
std::array<uint32_t, 3> padding;
|
std::array<uint32_t, 3> padding;
|
||||||
std::array<float, 12> yuvToRgbConversionMatrix;
|
std::array<float, 12> yuvToRgbConversionMatrix;
|
||||||
GammaTransferParams gammaDecodingParams = {};
|
std::array<float, 8> gammaDecodingParams = {};
|
||||||
GammaTransferParams gammaEncodingParams = {};
|
std::array<float, 8> gammaEncodingParams = {};
|
||||||
std::array<float, 12> gamutConversionMatrix = {};
|
std::array<float, 12> gamutConversionMatrix = {};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -37,10 +37,28 @@ wgpu::Texture Create2DTexture(wgpu::Device device,
|
|||||||
|
|
||||||
class ExternalTextureTests : public DawnTest {
|
class ExternalTextureTests : public DawnTest {
|
||||||
protected:
|
protected:
|
||||||
|
wgpu::ExternalTextureDescriptor CreateDefaultExternalTextureDescriptor() {
|
||||||
|
wgpu::ExternalTextureDescriptor desc;
|
||||||
|
desc.yuvToRgbConversionMatrix = kYuvToRGBMatrixBT709.data();
|
||||||
|
desc.gamutConversionMatrix = kGamutConversionMatrixBT709ToSrgb.data();
|
||||||
|
desc.srcTransferFunctionParameters = kGammaDecodeBT709.data();
|
||||||
|
desc.dstTransferFunctionParameters = kGammaEncodeSrgb.data();
|
||||||
|
|
||||||
|
return desc;
|
||||||
|
}
|
||||||
|
|
||||||
static constexpr uint32_t kWidth = 4;
|
static constexpr uint32_t kWidth = 4;
|
||||||
static constexpr uint32_t kHeight = 4;
|
static constexpr uint32_t kHeight = 4;
|
||||||
static constexpr wgpu::TextureFormat kFormat = wgpu::TextureFormat::RGBA8Unorm;
|
static constexpr wgpu::TextureFormat kFormat = wgpu::TextureFormat::RGBA8Unorm;
|
||||||
static constexpr wgpu::TextureUsage kSampledUsage = wgpu::TextureUsage::TextureBinding;
|
static constexpr wgpu::TextureUsage kSampledUsage = wgpu::TextureUsage::TextureBinding;
|
||||||
|
std::array<float, 12> kYuvToRGBMatrixBT709 = {1.164384f, 0.0f, 1.792741f, -0.972945f,
|
||||||
|
1.164384f, -0.213249f, -0.532909f, 0.301483f,
|
||||||
|
1.164384f, 2.112402f, 0.0f, -1.133402f};
|
||||||
|
std::array<float, 9> kGamutConversionMatrixBT709ToSrgb = {1.0f, 0.0f, 0.0f, 0.0f, 1.0f,
|
||||||
|
0.0f, 0.0f, 0.0f, 1.0f};
|
||||||
|
std::array<float, 7> kGammaDecodeBT709 = {2.2, 1.0 / 1.099, 0.099 / 1.099, 1 / 4.5, 0.081,
|
||||||
|
0.0, 0.0};
|
||||||
|
std::array<float, 7> kGammaEncodeSrgb = {1 / 2.4, 1.137119, 0.0, 12.92, 0.0031308, -0.055, 0.0};
|
||||||
};
|
};
|
||||||
} // anonymous namespace
|
} // anonymous namespace
|
||||||
|
|
||||||
@ -51,7 +69,7 @@ TEST_P(ExternalTextureTests, CreateExternalTextureSuccess) {
|
|||||||
wgpu::TextureView view = texture.CreateView();
|
wgpu::TextureView view = texture.CreateView();
|
||||||
|
|
||||||
// Create an ExternalTextureDescriptor from the texture view
|
// Create an ExternalTextureDescriptor from the texture view
|
||||||
wgpu::ExternalTextureDescriptor externalDesc;
|
wgpu::ExternalTextureDescriptor externalDesc = CreateDefaultExternalTextureDescriptor();
|
||||||
externalDesc.plane0 = view;
|
externalDesc.plane0 = view;
|
||||||
|
|
||||||
// Import the external texture
|
// Import the external texture
|
||||||
@ -114,7 +132,7 @@ TEST_P(ExternalTextureTests, SampleExternalTexture) {
|
|||||||
wgpu::RenderPipeline pipeline = device.CreateRenderPipeline(&descriptor);
|
wgpu::RenderPipeline pipeline = device.CreateRenderPipeline(&descriptor);
|
||||||
|
|
||||||
// Create an ExternalTextureDescriptor from the texture view
|
// Create an ExternalTextureDescriptor from the texture view
|
||||||
wgpu::ExternalTextureDescriptor externalDesc;
|
wgpu::ExternalTextureDescriptor externalDesc = CreateDefaultExternalTextureDescriptor();
|
||||||
externalDesc.plane0 = externalView;
|
externalDesc.plane0 = externalView;
|
||||||
|
|
||||||
// Import the external texture
|
// Import the external texture
|
||||||
@ -225,7 +243,7 @@ TEST_P(ExternalTextureTests, SampleMultiplanarExternalTexture) {
|
|||||||
wgpu::RenderPipeline pipeline = device.CreateRenderPipeline(&descriptor);
|
wgpu::RenderPipeline pipeline = device.CreateRenderPipeline(&descriptor);
|
||||||
|
|
||||||
// Create an ExternalTextureDescriptor from the texture views
|
// Create an ExternalTextureDescriptor from the texture views
|
||||||
wgpu::ExternalTextureDescriptor externalDesc;
|
wgpu::ExternalTextureDescriptor externalDesc = CreateDefaultExternalTextureDescriptor();
|
||||||
externalDesc.plane0 = externalViewPlane0;
|
externalDesc.plane0 = externalViewPlane0;
|
||||||
externalDesc.plane1 = externalViewPlane1;
|
externalDesc.plane1 = externalViewPlane1;
|
||||||
|
|
||||||
|
@ -60,7 +60,8 @@ class BindGroupValidationTest : public ValidationTest {
|
|||||||
CreateTexture(wgpu::TextureUsage::TextureBinding, kDefaultTextureFormat, 1);
|
CreateTexture(wgpu::TextureUsage::TextureBinding, kDefaultTextureFormat, 1);
|
||||||
mSampledTextureView = mSampledTexture.CreateView();
|
mSampledTextureView = mSampledTexture.CreateView();
|
||||||
|
|
||||||
wgpu::ExternalTextureDescriptor externalTextureDesc;
|
wgpu::ExternalTextureDescriptor externalTextureDesc =
|
||||||
|
CreateDefaultExternalTextureDescriptor();
|
||||||
externalTextureDesc.plane0 = mSampledTextureView;
|
externalTextureDesc.plane0 = mSampledTextureView;
|
||||||
mExternalTexture = device.CreateExternalTexture(&externalTextureDesc);
|
mExternalTexture = device.CreateExternalTexture(&externalTextureDesc);
|
||||||
mExternalTextureBindingEntry.externalTexture = mExternalTexture;
|
mExternalTextureBindingEntry.externalTexture = mExternalTexture;
|
||||||
@ -68,6 +69,15 @@ class BindGroupValidationTest : public ValidationTest {
|
|||||||
}
|
}
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
wgpu::ExternalTextureDescriptor CreateDefaultExternalTextureDescriptor() {
|
||||||
|
wgpu::ExternalTextureDescriptor desc;
|
||||||
|
desc.yuvToRgbConversionMatrix = mPlaceholderConstantArray.data();
|
||||||
|
desc.gamutConversionMatrix = mPlaceholderConstantArray.data();
|
||||||
|
desc.srcTransferFunctionParameters = mPlaceholderConstantArray.data();
|
||||||
|
desc.dstTransferFunctionParameters = mPlaceholderConstantArray.data();
|
||||||
|
return desc;
|
||||||
|
}
|
||||||
|
|
||||||
wgpu::Buffer mUBO;
|
wgpu::Buffer mUBO;
|
||||||
wgpu::Buffer mSSBO;
|
wgpu::Buffer mSSBO;
|
||||||
wgpu::Sampler mSampler;
|
wgpu::Sampler mSampler;
|
||||||
@ -79,6 +89,7 @@ class BindGroupValidationTest : public ValidationTest {
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
wgpu::ExternalTexture mExternalTexture;
|
wgpu::ExternalTexture mExternalTexture;
|
||||||
|
std::array<float, 12> mPlaceholderConstantArray;
|
||||||
};
|
};
|
||||||
|
|
||||||
// Test the validation of BindGroupDescriptor::nextInChain
|
// Test the validation of BindGroupDescriptor::nextInChain
|
||||||
@ -311,7 +322,7 @@ TEST_F(BindGroupValidationTest, ExternalTextureBindingType) {
|
|||||||
// Create an external texture
|
// Create an external texture
|
||||||
wgpu::Texture texture =
|
wgpu::Texture texture =
|
||||||
CreateTexture(wgpu::TextureUsage::TextureBinding, kDefaultTextureFormat, 1);
|
CreateTexture(wgpu::TextureUsage::TextureBinding, kDefaultTextureFormat, 1);
|
||||||
wgpu::ExternalTextureDescriptor externalDesc;
|
wgpu::ExternalTextureDescriptor externalDesc = CreateDefaultExternalTextureDescriptor();
|
||||||
externalDesc.plane0 = texture.CreateView();
|
externalDesc.plane0 = texture.CreateView();
|
||||||
wgpu::ExternalTexture externalTexture = device.CreateExternalTexture(&externalDesc);
|
wgpu::ExternalTexture externalTexture = device.CreateExternalTexture(&externalDesc);
|
||||||
|
|
||||||
@ -360,7 +371,8 @@ TEST_F(BindGroupValidationTest, ExternalTextureBindingType) {
|
|||||||
{
|
{
|
||||||
wgpu::Texture errorTexture = CreateTexture(wgpu::TextureUsage::TextureBinding,
|
wgpu::Texture errorTexture = CreateTexture(wgpu::TextureUsage::TextureBinding,
|
||||||
wgpu::TextureFormat::RGBA8UnormSrgb, 1);
|
wgpu::TextureFormat::RGBA8UnormSrgb, 1);
|
||||||
wgpu::ExternalTextureDescriptor errorExternalDesciptor;
|
wgpu::ExternalTextureDescriptor errorExternalDesciptor =
|
||||||
|
CreateDefaultExternalTextureDescriptor();
|
||||||
errorExternalDesciptor.plane0 = errorTexture.CreateView();
|
errorExternalDesciptor.plane0 = errorTexture.CreateView();
|
||||||
|
|
||||||
wgpu::ExternalTexture errorExternalTexture;
|
wgpu::ExternalTexture errorExternalTexture;
|
||||||
|
@ -41,6 +41,16 @@ class ExternalTextureTest : public ValidationTest {
|
|||||||
queue = device.GetQueue();
|
queue = device.GetQueue();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
wgpu::ExternalTextureDescriptor CreateDefaultExternalTextureDescriptor() {
|
||||||
|
wgpu::ExternalTextureDescriptor desc;
|
||||||
|
desc.yuvToRgbConversionMatrix = mPlaceholderConstantArray.data();
|
||||||
|
desc.gamutConversionMatrix = mPlaceholderConstantArray.data();
|
||||||
|
desc.srcTransferFunctionParameters = mPlaceholderConstantArray.data();
|
||||||
|
desc.dstTransferFunctionParameters = mPlaceholderConstantArray.data();
|
||||||
|
|
||||||
|
return desc;
|
||||||
|
}
|
||||||
|
|
||||||
static constexpr uint32_t kWidth = 32;
|
static constexpr uint32_t kWidth = 32;
|
||||||
static constexpr uint32_t kHeight = 32;
|
static constexpr uint32_t kHeight = 32;
|
||||||
static constexpr uint32_t kDefaultDepth = 1;
|
static constexpr uint32_t kDefaultDepth = 1;
|
||||||
@ -53,6 +63,8 @@ class ExternalTextureTest : public ValidationTest {
|
|||||||
static constexpr wgpu::TextureFormat kBiplanarPlane0Format = wgpu::TextureFormat::R8Unorm;
|
static constexpr wgpu::TextureFormat kBiplanarPlane0Format = wgpu::TextureFormat::R8Unorm;
|
||||||
static constexpr wgpu::TextureFormat kBiplanarPlane1Format = wgpu::TextureFormat::RG8Unorm;
|
static constexpr wgpu::TextureFormat kBiplanarPlane1Format = wgpu::TextureFormat::RG8Unorm;
|
||||||
|
|
||||||
|
std::array<float, 12> mPlaceholderConstantArray;
|
||||||
|
|
||||||
wgpu::Queue queue;
|
wgpu::Queue queue;
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -62,7 +74,7 @@ TEST_F(ExternalTextureTest, CreateExternalTextureValidation) {
|
|||||||
wgpu::TextureDescriptor textureDescriptor = CreateTextureDescriptor();
|
wgpu::TextureDescriptor textureDescriptor = CreateTextureDescriptor();
|
||||||
wgpu::Texture texture = device.CreateTexture(&textureDescriptor);
|
wgpu::Texture texture = device.CreateTexture(&textureDescriptor);
|
||||||
|
|
||||||
wgpu::ExternalTextureDescriptor externalDesc;
|
wgpu::ExternalTextureDescriptor externalDesc = CreateDefaultExternalTextureDescriptor();
|
||||||
externalDesc.plane0 = texture.CreateView();
|
externalDesc.plane0 = texture.CreateView();
|
||||||
device.CreateExternalTexture(&externalDesc);
|
device.CreateExternalTexture(&externalDesc);
|
||||||
}
|
}
|
||||||
@ -74,7 +86,7 @@ TEST_F(ExternalTextureTest, CreateExternalTextureValidation) {
|
|||||||
textureDescriptor.usage = wgpu::TextureUsage::TextureBinding;
|
textureDescriptor.usage = wgpu::TextureUsage::TextureBinding;
|
||||||
wgpu::Texture internalTexture = device.CreateTexture(&textureDescriptor);
|
wgpu::Texture internalTexture = device.CreateTexture(&textureDescriptor);
|
||||||
|
|
||||||
wgpu::ExternalTextureDescriptor externalDesc;
|
wgpu::ExternalTextureDescriptor externalDesc = CreateDefaultExternalTextureDescriptor();
|
||||||
externalDesc.plane0 = internalTexture.CreateView();
|
externalDesc.plane0 = internalTexture.CreateView();
|
||||||
ASSERT_DEVICE_ERROR(device.CreateExternalTexture(&externalDesc));
|
ASSERT_DEVICE_ERROR(device.CreateExternalTexture(&externalDesc));
|
||||||
}
|
}
|
||||||
@ -85,7 +97,7 @@ TEST_F(ExternalTextureTest, CreateExternalTextureValidation) {
|
|||||||
textureDescriptor.mipLevelCount = 2;
|
textureDescriptor.mipLevelCount = 2;
|
||||||
wgpu::Texture internalTexture = device.CreateTexture(&textureDescriptor);
|
wgpu::Texture internalTexture = device.CreateTexture(&textureDescriptor);
|
||||||
|
|
||||||
wgpu::ExternalTextureDescriptor externalDesc;
|
wgpu::ExternalTextureDescriptor externalDesc = CreateDefaultExternalTextureDescriptor();
|
||||||
externalDesc.plane0 = internalTexture.CreateView();
|
externalDesc.plane0 = internalTexture.CreateView();
|
||||||
ASSERT_DEVICE_ERROR(device.CreateExternalTexture(&externalDesc));
|
ASSERT_DEVICE_ERROR(device.CreateExternalTexture(&externalDesc));
|
||||||
}
|
}
|
||||||
@ -97,7 +109,7 @@ TEST_F(ExternalTextureTest, CreateExternalTextureValidation) {
|
|||||||
textureDescriptor.mipLevelCount = 2;
|
textureDescriptor.mipLevelCount = 2;
|
||||||
wgpu::Texture internalTexture = device.CreateTexture(&textureDescriptor);
|
wgpu::Texture internalTexture = device.CreateTexture(&textureDescriptor);
|
||||||
|
|
||||||
wgpu::ExternalTextureDescriptor externalDesc;
|
wgpu::ExternalTextureDescriptor externalDesc = CreateDefaultExternalTextureDescriptor();
|
||||||
externalDesc.plane0 = internalTexture.CreateView();
|
externalDesc.plane0 = internalTexture.CreateView();
|
||||||
ASSERT_DEVICE_ERROR(device.CreateExternalTexture(&externalDesc));
|
ASSERT_DEVICE_ERROR(device.CreateExternalTexture(&externalDesc));
|
||||||
}
|
}
|
||||||
@ -108,7 +120,7 @@ TEST_F(ExternalTextureTest, CreateExternalTextureValidation) {
|
|||||||
textureDescriptor.format = wgpu::TextureFormat::R8Uint;
|
textureDescriptor.format = wgpu::TextureFormat::R8Uint;
|
||||||
wgpu::Texture internalTexture = device.CreateTexture(&textureDescriptor);
|
wgpu::Texture internalTexture = device.CreateTexture(&textureDescriptor);
|
||||||
|
|
||||||
wgpu::ExternalTextureDescriptor externalDesc;
|
wgpu::ExternalTextureDescriptor externalDesc = CreateDefaultExternalTextureDescriptor();
|
||||||
externalDesc.plane0 = internalTexture.CreateView();
|
externalDesc.plane0 = internalTexture.CreateView();
|
||||||
ASSERT_DEVICE_ERROR(device.CreateExternalTexture(&externalDesc));
|
ASSERT_DEVICE_ERROR(device.CreateExternalTexture(&externalDesc));
|
||||||
}
|
}
|
||||||
@ -119,7 +131,7 @@ TEST_F(ExternalTextureTest, CreateExternalTextureValidation) {
|
|||||||
textureDescriptor.sampleCount = 4;
|
textureDescriptor.sampleCount = 4;
|
||||||
wgpu::Texture internalTexture = device.CreateTexture(&textureDescriptor);
|
wgpu::Texture internalTexture = device.CreateTexture(&textureDescriptor);
|
||||||
|
|
||||||
wgpu::ExternalTextureDescriptor externalDesc;
|
wgpu::ExternalTextureDescriptor externalDesc = CreateDefaultExternalTextureDescriptor();
|
||||||
externalDesc.plane0 = internalTexture.CreateView();
|
externalDesc.plane0 = internalTexture.CreateView();
|
||||||
ASSERT_DEVICE_ERROR(device.CreateExternalTexture(&externalDesc));
|
ASSERT_DEVICE_ERROR(device.CreateExternalTexture(&externalDesc));
|
||||||
}
|
}
|
||||||
@ -137,12 +149,59 @@ TEST_F(ExternalTextureTest, CreateExternalTextureValidation) {
|
|||||||
ASSERT_DEVICE_ERROR(wgpu::TextureView errorTextureView =
|
ASSERT_DEVICE_ERROR(wgpu::TextureView errorTextureView =
|
||||||
internalTexture.CreateView(&errorViewDescriptor));
|
internalTexture.CreateView(&errorViewDescriptor));
|
||||||
|
|
||||||
wgpu::ExternalTextureDescriptor externalDesc;
|
wgpu::ExternalTextureDescriptor externalDesc = CreateDefaultExternalTextureDescriptor();
|
||||||
externalDesc.plane0 = errorTextureView;
|
externalDesc.plane0 = errorTextureView;
|
||||||
ASSERT_DEVICE_ERROR(device.CreateExternalTexture(&externalDesc));
|
ASSERT_DEVICE_ERROR(device.CreateExternalTexture(&externalDesc));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST_F(ExternalTextureTest, CreateExternalTextureConstantValueValidation) {
|
||||||
|
DAWN_SKIP_TEST_IF(UsesWire());
|
||||||
|
// Creating an external texture without a YUV-to-RGB matrix should fail.
|
||||||
|
{
|
||||||
|
wgpu::TextureDescriptor textureDescriptor = CreateTextureDescriptor();
|
||||||
|
wgpu::Texture texture = device.CreateTexture(&textureDescriptor);
|
||||||
|
|
||||||
|
wgpu::ExternalTextureDescriptor externalDesc = CreateDefaultExternalTextureDescriptor();
|
||||||
|
externalDesc.plane0 = texture.CreateView();
|
||||||
|
externalDesc.yuvToRgbConversionMatrix = nullptr;
|
||||||
|
ASSERT_DEVICE_ERROR(device.CreateExternalTexture(&externalDesc));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Creating an external texture without a gamut conversion matrix should fail.
|
||||||
|
{
|
||||||
|
wgpu::TextureDescriptor textureDescriptor = CreateTextureDescriptor();
|
||||||
|
wgpu::Texture texture = device.CreateTexture(&textureDescriptor);
|
||||||
|
|
||||||
|
wgpu::ExternalTextureDescriptor externalDesc = CreateDefaultExternalTextureDescriptor();
|
||||||
|
externalDesc.plane0 = texture.CreateView();
|
||||||
|
externalDesc.gamutConversionMatrix = nullptr;
|
||||||
|
ASSERT_DEVICE_ERROR(device.CreateExternalTexture(&externalDesc));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Creating an external texture without source transfer function constants should fail.
|
||||||
|
{
|
||||||
|
wgpu::TextureDescriptor textureDescriptor = CreateTextureDescriptor();
|
||||||
|
wgpu::Texture texture = device.CreateTexture(&textureDescriptor);
|
||||||
|
|
||||||
|
wgpu::ExternalTextureDescriptor externalDesc = CreateDefaultExternalTextureDescriptor();
|
||||||
|
externalDesc.plane0 = texture.CreateView();
|
||||||
|
externalDesc.srcTransferFunctionParameters = nullptr;
|
||||||
|
ASSERT_DEVICE_ERROR(device.CreateExternalTexture(&externalDesc));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Creating an external texture without destination transfer function constants should fail.
|
||||||
|
{
|
||||||
|
wgpu::TextureDescriptor textureDescriptor = CreateTextureDescriptor();
|
||||||
|
wgpu::Texture texture = device.CreateTexture(&textureDescriptor);
|
||||||
|
|
||||||
|
wgpu::ExternalTextureDescriptor externalDesc = CreateDefaultExternalTextureDescriptor();
|
||||||
|
externalDesc.plane0 = texture.CreateView();
|
||||||
|
externalDesc.dstTransferFunctionParameters = nullptr;
|
||||||
|
ASSERT_DEVICE_ERROR(device.CreateExternalTexture(&externalDesc));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Test that external texture creation works as expected in multiplane scenarios.
|
// Test that external texture creation works as expected in multiplane scenarios.
|
||||||
TEST_F(ExternalTextureTest, CreateMultiplanarExternalTextureValidation) {
|
TEST_F(ExternalTextureTest, CreateMultiplanarExternalTextureValidation) {
|
||||||
// Creating an external texture from two 2D, single-subresource textures with a biplanar
|
// Creating an external texture from two 2D, single-subresource textures with a biplanar
|
||||||
@ -155,7 +214,7 @@ TEST_F(ExternalTextureTest, CreateMultiplanarExternalTextureValidation) {
|
|||||||
wgpu::Texture texture0 = device.CreateTexture(&plane0TextureDescriptor);
|
wgpu::Texture texture0 = device.CreateTexture(&plane0TextureDescriptor);
|
||||||
wgpu::Texture texture1 = device.CreateTexture(&plane1TextureDescriptor);
|
wgpu::Texture texture1 = device.CreateTexture(&plane1TextureDescriptor);
|
||||||
|
|
||||||
wgpu::ExternalTextureDescriptor externalDesc;
|
wgpu::ExternalTextureDescriptor externalDesc = CreateDefaultExternalTextureDescriptor();
|
||||||
externalDesc.plane0 = texture0.CreateView();
|
externalDesc.plane0 = texture0.CreateView();
|
||||||
externalDesc.plane1 = texture1.CreateView();
|
externalDesc.plane1 = texture1.CreateView();
|
||||||
|
|
||||||
@ -172,7 +231,7 @@ TEST_F(ExternalTextureTest, CreateMultiplanarExternalTextureValidation) {
|
|||||||
wgpu::Texture texture0 = device.CreateTexture(&plane0TextureDescriptor);
|
wgpu::Texture texture0 = device.CreateTexture(&plane0TextureDescriptor);
|
||||||
wgpu::Texture texture1 = device.CreateTexture(&plane1TextureDescriptor);
|
wgpu::Texture texture1 = device.CreateTexture(&plane1TextureDescriptor);
|
||||||
|
|
||||||
wgpu::ExternalTextureDescriptor externalDesc;
|
wgpu::ExternalTextureDescriptor externalDesc = CreateDefaultExternalTextureDescriptor();
|
||||||
externalDesc.plane0 = texture0.CreateView();
|
externalDesc.plane0 = texture0.CreateView();
|
||||||
externalDesc.plane1 = texture1.CreateView();
|
externalDesc.plane1 = texture1.CreateView();
|
||||||
|
|
||||||
@ -189,7 +248,7 @@ TEST_F(ExternalTextureTest, CreateMultiplanarExternalTextureValidation) {
|
|||||||
wgpu::Texture texture0 = device.CreateTexture(&plane0TextureDescriptor);
|
wgpu::Texture texture0 = device.CreateTexture(&plane0TextureDescriptor);
|
||||||
wgpu::Texture texture1 = device.CreateTexture(&plane1TextureDescriptor);
|
wgpu::Texture texture1 = device.CreateTexture(&plane1TextureDescriptor);
|
||||||
|
|
||||||
wgpu::ExternalTextureDescriptor externalDesc;
|
wgpu::ExternalTextureDescriptor externalDesc = CreateDefaultExternalTextureDescriptor();
|
||||||
externalDesc.plane0 = texture0.CreateView();
|
externalDesc.plane0 = texture0.CreateView();
|
||||||
externalDesc.plane1 = texture1.CreateView();
|
externalDesc.plane1 = texture1.CreateView();
|
||||||
|
|
||||||
@ -205,7 +264,7 @@ TEST_F(ExternalTextureTest, CreateMultiplanarExternalTextureValidation) {
|
|||||||
wgpu::Texture texture0 = device.CreateTexture(&plane0TextureDescriptor);
|
wgpu::Texture texture0 = device.CreateTexture(&plane0TextureDescriptor);
|
||||||
wgpu::Texture texture1 = device.CreateTexture(&plane1TextureDescriptor);
|
wgpu::Texture texture1 = device.CreateTexture(&plane1TextureDescriptor);
|
||||||
|
|
||||||
wgpu::ExternalTextureDescriptor externalDesc;
|
wgpu::ExternalTextureDescriptor externalDesc = CreateDefaultExternalTextureDescriptor();
|
||||||
externalDesc.plane0 = texture0.CreateView();
|
externalDesc.plane0 = texture0.CreateView();
|
||||||
externalDesc.plane1 = texture1.CreateView();
|
externalDesc.plane1 = texture1.CreateView();
|
||||||
externalDesc.colorSpace = wgpu::PredefinedColorSpace::Undefined;
|
externalDesc.colorSpace = wgpu::PredefinedColorSpace::Undefined;
|
||||||
@ -219,7 +278,7 @@ TEST_F(ExternalTextureTest, SubmitDestroyedExternalTextureInRenderPass) {
|
|||||||
wgpu::TextureDescriptor textureDescriptor = CreateTextureDescriptor();
|
wgpu::TextureDescriptor textureDescriptor = CreateTextureDescriptor();
|
||||||
wgpu::Texture texture = device.CreateTexture(&textureDescriptor);
|
wgpu::Texture texture = device.CreateTexture(&textureDescriptor);
|
||||||
|
|
||||||
wgpu::ExternalTextureDescriptor externalDesc;
|
wgpu::ExternalTextureDescriptor externalDesc = CreateDefaultExternalTextureDescriptor();
|
||||||
externalDesc.plane0 = texture.CreateView();
|
externalDesc.plane0 = texture.CreateView();
|
||||||
wgpu::ExternalTexture externalTexture = device.CreateExternalTexture(&externalDesc);
|
wgpu::ExternalTexture externalTexture = device.CreateExternalTexture(&externalDesc);
|
||||||
|
|
||||||
@ -270,7 +329,7 @@ TEST_F(ExternalTextureTest, SubmitDereferencedExternalTextureInRenderPass) {
|
|||||||
wgpu::TextureDescriptor textureDescriptor = CreateTextureDescriptor();
|
wgpu::TextureDescriptor textureDescriptor = CreateTextureDescriptor();
|
||||||
wgpu::Texture texture = device.CreateTexture(&textureDescriptor);
|
wgpu::Texture texture = device.CreateTexture(&textureDescriptor);
|
||||||
|
|
||||||
wgpu::ExternalTextureDescriptor externalDesc;
|
wgpu::ExternalTextureDescriptor externalDesc = CreateDefaultExternalTextureDescriptor();
|
||||||
externalDesc.plane0 = texture.CreateView();
|
externalDesc.plane0 = texture.CreateView();
|
||||||
wgpu::ExternalTexture externalTexture = device.CreateExternalTexture(&externalDesc);
|
wgpu::ExternalTexture externalTexture = device.CreateExternalTexture(&externalDesc);
|
||||||
|
|
||||||
@ -321,7 +380,7 @@ TEST_F(ExternalTextureTest, SubmitDestroyedExternalTexturePlaneInRenderPass) {
|
|||||||
wgpu::TextureDescriptor textureDescriptor = CreateTextureDescriptor();
|
wgpu::TextureDescriptor textureDescriptor = CreateTextureDescriptor();
|
||||||
wgpu::Texture texture = device.CreateTexture(&textureDescriptor);
|
wgpu::Texture texture = device.CreateTexture(&textureDescriptor);
|
||||||
|
|
||||||
wgpu::ExternalTextureDescriptor externalDesc;
|
wgpu::ExternalTextureDescriptor externalDesc = CreateDefaultExternalTextureDescriptor();
|
||||||
externalDesc.plane0 = texture.CreateView();
|
externalDesc.plane0 = texture.CreateView();
|
||||||
wgpu::ExternalTexture externalTexture = device.CreateExternalTexture(&externalDesc);
|
wgpu::ExternalTexture externalTexture = device.CreateExternalTexture(&externalDesc);
|
||||||
|
|
||||||
@ -372,7 +431,7 @@ TEST_F(ExternalTextureTest, SubmitDestroyedExternalTextureInComputePass) {
|
|||||||
wgpu::TextureDescriptor textureDescriptor = CreateTextureDescriptor();
|
wgpu::TextureDescriptor textureDescriptor = CreateTextureDescriptor();
|
||||||
wgpu::Texture texture = device.CreateTexture(&textureDescriptor);
|
wgpu::Texture texture = device.CreateTexture(&textureDescriptor);
|
||||||
|
|
||||||
wgpu::ExternalTextureDescriptor externalDesc;
|
wgpu::ExternalTextureDescriptor externalDesc = CreateDefaultExternalTextureDescriptor();
|
||||||
externalDesc.plane0 = texture.CreateView();
|
externalDesc.plane0 = texture.CreateView();
|
||||||
wgpu::ExternalTexture externalTexture = device.CreateExternalTexture(&externalDesc);
|
wgpu::ExternalTexture externalTexture = device.CreateExternalTexture(&externalDesc);
|
||||||
|
|
||||||
@ -418,7 +477,7 @@ TEST_F(ExternalTextureTest, SubmitDestroyedExternalTexturePlaneInComputePass) {
|
|||||||
wgpu::TextureDescriptor textureDescriptor = CreateTextureDescriptor();
|
wgpu::TextureDescriptor textureDescriptor = CreateTextureDescriptor();
|
||||||
wgpu::Texture texture = device.CreateTexture(&textureDescriptor);
|
wgpu::Texture texture = device.CreateTexture(&textureDescriptor);
|
||||||
|
|
||||||
wgpu::ExternalTextureDescriptor externalDesc;
|
wgpu::ExternalTextureDescriptor externalDesc = CreateDefaultExternalTextureDescriptor();
|
||||||
externalDesc.plane0 = texture.CreateView();
|
externalDesc.plane0 = texture.CreateView();
|
||||||
wgpu::ExternalTexture externalTexture = device.CreateExternalTexture(&externalDesc);
|
wgpu::ExternalTexture externalTexture = device.CreateExternalTexture(&externalDesc);
|
||||||
|
|
||||||
@ -462,7 +521,7 @@ TEST_F(ExternalTextureTest, BindGroupDoesNotMatchLayout) {
|
|||||||
wgpu::TextureDescriptor textureDescriptor = CreateTextureDescriptor();
|
wgpu::TextureDescriptor textureDescriptor = CreateTextureDescriptor();
|
||||||
wgpu::Texture texture = device.CreateTexture(&textureDescriptor);
|
wgpu::Texture texture = device.CreateTexture(&textureDescriptor);
|
||||||
|
|
||||||
wgpu::ExternalTextureDescriptor externalDesc;
|
wgpu::ExternalTextureDescriptor externalDesc = CreateDefaultExternalTextureDescriptor();
|
||||||
externalDesc.plane0 = texture.CreateView();
|
externalDesc.plane0 = texture.CreateView();
|
||||||
wgpu::ExternalTexture externalTexture = device.CreateExternalTexture(&externalDesc);
|
wgpu::ExternalTexture externalTexture = device.CreateExternalTexture(&externalDesc);
|
||||||
|
|
||||||
|
@ -229,6 +229,11 @@ TEST_F(LabelTest, ExternalTexture) {
|
|||||||
|
|
||||||
wgpu::ExternalTextureDescriptor descriptor;
|
wgpu::ExternalTextureDescriptor descriptor;
|
||||||
descriptor.plane0 = texture.CreateView();
|
descriptor.plane0 = texture.CreateView();
|
||||||
|
std::array<float, 12> mPlaceholderConstantArray;
|
||||||
|
descriptor.yuvToRgbConversionMatrix = mPlaceholderConstantArray.data();
|
||||||
|
descriptor.gamutConversionMatrix = mPlaceholderConstantArray.data();
|
||||||
|
descriptor.srcTransferFunctionParameters = mPlaceholderConstantArray.data();
|
||||||
|
descriptor.dstTransferFunctionParameters = mPlaceholderConstantArray.data();
|
||||||
|
|
||||||
// The label should be empty if one was not set.
|
// The label should be empty if one was not set.
|
||||||
{
|
{
|
||||||
|
Loading…
x
Reference in New Issue
Block a user