Provide origin info for ExternalTexture

Current ExternalTexture visible related info only contains width and height.

But not all the visible rect started at (0, 0). This CL add visibleOrigin to contain origin info and record (width, height) in
visibleSize

Bug: chromium:1361363
Change-Id: I3d8931e490c97740f152653383f07d0a2d984dd3
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/108024
Reviewed-by: Austin Eng <enga@chromium.org>
Kokoro: Kokoro <noreply+kokoro@google.com>
Commit-Queue: Shaobo Yan <shaobo.yan@intel.com>
This commit is contained in:
Yan,Shaobo 2022-11-03 09:03:01 +00:00 committed by Dawn LUCI CQ
parent c6b381495d
commit e8dd681f19
9 changed files with 107 additions and 34 deletions

View File

@ -1331,6 +1331,7 @@
}, },
"extent 2D": { "extent 2D": {
"category": "structure", "category": "structure",
"tags": ["dawn"],
"_TODO": "crbug.com/1316671: Remove default value of 'width' after chromium side chagnes landed", "_TODO": "crbug.com/1316671: Remove default value of 'width' after chromium side chagnes landed",
"members": [ "members": [
{"name": "width", "type": "uint32_t", "default": 0}, {"name": "width", "type": "uint32_t", "default": 0},
@ -1370,7 +1371,8 @@
{"name": "label", "type": "char", "annotation": "const*", "length": "strlen", "optional": true}, {"name": "label", "type": "char", "annotation": "const*", "length": "strlen", "optional": true},
{"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": "visible rect", "type": "extent 2D"}, {"name": "visible origin", "type": "origin 2D"},
{"name": "visible size", "type": "extent 2D"},
{"name": "do yuv to rgb conversion only", "type": "bool", "default": "false"}, {"name": "do yuv to rgb conversion only", "type": "bool", "default": "false"},
{"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, "optional": true},
@ -1562,6 +1564,14 @@
{"name": "z", "type": "uint32_t", "default": "0"} {"name": "z", "type": "uint32_t", "default": "0"}
] ]
}, },
"origin 2D": {
"category": "structure",
"tags": ["dawn"],
"members": [
{"name": "x", "type": "uint32_t", "default": "0"},
{"name": "y", "type": "uint32_t", "default": "0"}
]
},
"pipeline layout": { "pipeline layout": {
"category": "object", "category": "object",
"methods": [ "methods": [

View File

@ -711,17 +711,19 @@ MaybeError ValidateCopyExternalTextureForBrowser(DeviceBase* device,
// Validate source // Validate source
DAWN_TRY(device->ValidateObject(source->externalTexture)); DAWN_TRY(device->ValidateObject(source->externalTexture));
DAWN_TRY(source->externalTexture->ValidateCanUseInSubmitNow()); DAWN_TRY(source->externalTexture->ValidateCanUseInSubmitNow());
const Extent2D& sourceVisibleRect = source->externalTexture->GetVisibleRect();
const Extent2D& sourceVisibleSize = source->externalTexture->GetVisibleSize();
// All texture dimensions are in uint32_t so by doing checks in uint64_t we avoid // All texture dimensions are in uint32_t so by doing checks in uint64_t we avoid
// overflows. // overflows.
DAWN_INVALID_IF( DAWN_INVALID_IF(
static_cast<uint64_t>(source->origin.x) + static_cast<uint64_t>(copySize->width) > static_cast<uint64_t>(source->origin.x) + static_cast<uint64_t>(copySize->width) >
static_cast<uint64_t>(sourceVisibleRect.width) || static_cast<uint64_t>(sourceVisibleSize.width) ||
static_cast<uint64_t>(source->origin.y) + static_cast<uint64_t>(copySize->height) > static_cast<uint64_t>(source->origin.y) + static_cast<uint64_t>(copySize->height) >
static_cast<uint64_t>(sourceVisibleRect.height) || static_cast<uint64_t>(sourceVisibleSize.height) ||
static_cast<uint64_t>(source->origin.z) > 0, static_cast<uint64_t>(source->origin.z) > 0,
"Texture copy range (origin: %s, copySize: %s) touches outside of %s visible size (%s).", "Texture copy range (origin: %s, copySize: %s) touches outside of %s visible size (%s).",
&source->origin, copySize, source->externalTexture, &sourceVisibleRect); &source->origin, copySize, source->externalTexture, &sourceVisibleSize);
DAWN_INVALID_IF(source->origin.z > 0, "Source has a non-zero z origin (%u).", source->origin.z); DAWN_INVALID_IF(source->origin.z > 0, "Source has a non-zero z origin (%u).", source->origin.z);
DAWN_INVALID_IF( DAWN_INVALID_IF(
options->internalUsage && !device->HasFeature(Feature::DawnInternalUsages), options->internalUsage && !device->HasFeature(Feature::DawnInternalUsages),
@ -747,8 +749,8 @@ MaybeError DoCopyExternalTextureForBrowser(DeviceBase* device,
const CopyTextureForBrowserOptions* options) { const CopyTextureForBrowserOptions* options) {
TextureInfo info; TextureInfo info;
info.origin = source->origin; info.origin = source->origin;
const Extent2D& visibleRect = source->externalTexture->GetVisibleRect(); const Extent2D& visibleSize = source->externalTexture->GetVisibleSize();
info.size = {visibleRect.width, visibleRect.height, 1}; info.size = {visibleSize.width, visibleSize.height, 1};
RenderPipelineBase* pipeline; RenderPipelineBase* pipeline;
DAWN_TRY_ASSIGN(pipeline, GetOrCreateCopyExternalTextureForBrowserPipeline( DAWN_TRY_ASSIGN(pipeline, GetOrCreateCopyExternalTextureForBrowserPipeline(

View File

@ -99,20 +99,25 @@ MaybeError ValidateExternalTextureDescriptor(const DeviceBase* device,
} }
} }
// TODO(crbug.com/1316671): visibleRect must have valid value after chromium side changes // TODO(crbug.com/1316671): visible size width must have valid value after chromium side changes
// landed. // landed.
if (descriptor->visibleRect.width > 0) { if (descriptor->visibleSize.width > 0) {
DAWN_INVALID_IF(descriptor->visibleRect.width == 0 || descriptor->visibleRect.height == 0, DAWN_INVALID_IF(descriptor->visibleSize.width == 0 || descriptor->visibleSize.height == 0,
"VisibleRect(%u, %u) have 0 on width or height.", "VisibleSize %s have 0 on width or height.", &descriptor->visibleSize);
descriptor->visibleRect.width, descriptor->visibleRect.height);
Extent3D maxVisibleRectSize = descriptor->plane0->GetTexture()->GetSize(); const Extent3D textureSize = descriptor->plane0->GetTexture()->GetSize();
DAWN_INVALID_IF(descriptor->visibleRect.width > maxVisibleRectSize.width || DAWN_INVALID_IF(
descriptor->visibleRect.height > maxVisibleRectSize.height, descriptor->visibleSize.width > textureSize.width ||
"VisibleRect(%u, %u) is exceed the max visible rect size, defined by " descriptor->visibleSize.height > textureSize.height,
"Plane0 size (%u, %u).", "VisibleSize %s is exceed the texture size, defined by Plane0 size (%u, %u).",
descriptor->visibleRect.width, descriptor->visibleRect.height, &descriptor->visibleSize, textureSize.width, textureSize.height);
maxVisibleRectSize.width, maxVisibleRectSize.height); DAWN_INVALID_IF(
descriptor->visibleOrigin.x > textureSize.width - descriptor->visibleSize.width ||
descriptor->visibleOrigin.y > textureSize.height - descriptor->visibleSize.height,
"VisibleRect[Origin: %s, Size: %s] is exceed the texture size, defined by "
"Plane0 size (%u, %u).",
&descriptor->visibleOrigin, &descriptor->visibleSize, textureSize.width,
textureSize.height);
} }
return {}; return {};
@ -131,7 +136,8 @@ ResultOrError<Ref<ExternalTextureBase>> ExternalTextureBase::Create(
ExternalTextureBase::ExternalTextureBase(DeviceBase* device, ExternalTextureBase::ExternalTextureBase(DeviceBase* device,
const ExternalTextureDescriptor* descriptor) const ExternalTextureDescriptor* descriptor)
: ApiObjectBase(device, descriptor->label), : ApiObjectBase(device, descriptor->label),
mVisibleRect(descriptor->visibleRect), mVisibleOrigin(descriptor->visibleOrigin),
mVisibleSize(descriptor->visibleSize),
mState(ExternalTextureState::Alive) { mState(ExternalTextureState::Alive) {
GetObjectTrackingList()->Track(this); GetObjectTrackingList()->Track(this);
} }
@ -252,9 +258,14 @@ ObjectType ExternalTextureBase::GetType() const {
return ObjectType::ExternalTexture; return ObjectType::ExternalTexture;
} }
const Extent2D& ExternalTextureBase::GetVisibleRect() const { const Extent2D& ExternalTextureBase::GetVisibleSize() const {
ASSERT(!IsError()); ASSERT(!IsError());
return mVisibleRect; return mVisibleSize;
}
const Origin2D& ExternalTextureBase::GetVisibleOrigin() const {
ASSERT(!IsError());
return mVisibleOrigin;
} }
} // namespace dawn::native } // namespace dawn::native

View File

@ -49,7 +49,9 @@ class ExternalTextureBase : public ApiObjectBase {
BufferBase* GetParamsBuffer() const; BufferBase* GetParamsBuffer() const;
const std::array<Ref<TextureViewBase>, kMaxPlanesPerFormat>& GetTextureViews() const; const std::array<Ref<TextureViewBase>, kMaxPlanesPerFormat>& GetTextureViews() const;
ObjectType GetType() const override; ObjectType GetType() const override;
const Extent2D& GetVisibleRect() const;
const Extent2D& GetVisibleSize() const;
const Origin2D& GetVisibleOrigin() const;
MaybeError ValidateCanUseInSubmitNow() const; MaybeError ValidateCanUseInSubmitNow() const;
static ExternalTextureBase* MakeError(DeviceBase* device); static ExternalTextureBase* MakeError(DeviceBase* device);
@ -74,9 +76,10 @@ class ExternalTextureBase : public ApiObjectBase {
Ref<BufferBase> mParamsBuffer; Ref<BufferBase> mParamsBuffer;
std::array<Ref<TextureViewBase>, kMaxPlanesPerFormat> mTextureViews; std::array<Ref<TextureViewBase>, kMaxPlanesPerFormat> mTextureViews;
// TODO(dawn:1082) Use the visible rect in the external texture shader code to sample // TODO(dawn:1082) Use the visible size and origin in the external texture shader
// video content. // code to sample video content.
Extent2D mVisibleRect; Origin2D mVisibleOrigin;
Extent2D mVisibleSize;
ExternalTextureState mState; ExternalTextureState mState;
}; };

View File

@ -70,6 +70,18 @@ absl::FormatConvertResult<absl::FormatConversionCharSet::kString> AbslFormatConv
return {true}; return {true};
} }
absl::FormatConvertResult<absl::FormatConversionCharSet::kString> AbslFormatConvert(
const Origin2D* value,
const absl::FormatConversionSpec& spec,
absl::FormatSink* s) {
if (value == nullptr) {
s->Append("[null]");
return {true};
}
s->Append(absl::StrFormat("[Origin2D x:%u, y:%u]", value->x, value->y));
return {true};
}
absl::FormatConvertResult<absl::FormatConversionCharSet::kString> AbslFormatConvert( absl::FormatConvertResult<absl::FormatConversionCharSet::kString> AbslFormatConvert(
const Origin3D* value, const Origin3D* value,
const absl::FormatConversionSpec& spec, const absl::FormatConversionSpec& spec,

View File

@ -41,6 +41,12 @@ absl::FormatConvertResult<absl::FormatConversionCharSet::kString> AbslFormatConv
const absl::FormatConversionSpec& spec, const absl::FormatConversionSpec& spec,
absl::FormatSink* s); absl::FormatSink* s);
struct Origin2D;
absl::FormatConvertResult<absl::FormatConversionCharSet::kString> AbslFormatConvert(
const Origin2D* value,
const absl::FormatConversionSpec& spec,
absl::FormatSink* s);
struct Origin3D; struct Origin3D;
absl::FormatConvertResult<absl::FormatConversionCharSet::kString> AbslFormatConvert( absl::FormatConvertResult<absl::FormatConversionCharSet::kString> AbslFormatConvert(
const Origin3D* value, const Origin3D* value,

View File

@ -114,7 +114,8 @@ class CopyExternalTextureForBrowserTests : public Parent {
externalDesc.plane0 = externalTexturePlane0.CreateView(); externalDesc.plane0 = externalTexturePlane0.CreateView();
externalDesc.plane1 = externalTexturePlane1.CreateView(); externalDesc.plane1 = externalTexturePlane1.CreateView();
externalDesc.visibleRect = {kWidth, kHeight}; externalDesc.visibleOrigin = {0, 0};
externalDesc.visibleSize = {kWidth, kHeight};
// Import the external texture // Import the external texture
return this->device.CreateExternalTexture(&externalDesc); return this->device.CreateExternalTexture(&externalDesc);

View File

@ -63,7 +63,8 @@ wgpu::ExternalTexture CreateExternalTexture(wgpu::Device device, uint32_t width,
externalDesc.plane0 = view; externalDesc.plane0 = view;
externalDesc.visibleRect = {width, height}; externalDesc.visibleOrigin = {0, 0};
externalDesc.visibleSize = {width, height};
// Import the external texture // Import the external texture
return device.CreateExternalTexture(&externalDesc); return device.CreateExternalTexture(&externalDesc);

View File

@ -582,7 +582,7 @@ TEST_F(ExternalTextureTest, UseErrorExternalTextureInBindGroup) {
} }
// Test create external texture with too large visible rect results in error. // Test create external texture with too large visible rect results in error.
TEST_F(ExternalTextureTest, CreateExternalTextureWithErrorVisibleRect) { TEST_F(ExternalTextureTest, CreateExternalTextureWithErrorVisibleOriginOrSize) {
// Control case should succeed. // Control case should succeed.
{ {
wgpu::TextureDescriptor textureDescriptor = CreateTextureDescriptor(); wgpu::TextureDescriptor textureDescriptor = CreateTextureDescriptor();
@ -590,29 +590,56 @@ TEST_F(ExternalTextureTest, CreateExternalTextureWithErrorVisibleRect) {
wgpu::ExternalTextureDescriptor externalDesc = CreateDefaultExternalTextureDescriptor(); wgpu::ExternalTextureDescriptor externalDesc = CreateDefaultExternalTextureDescriptor();
externalDesc.plane0 = texture.CreateView(); externalDesc.plane0 = texture.CreateView();
externalDesc.visibleRect = {texture.GetWidth(), texture.GetHeight()}; externalDesc.visibleOrigin = {0, 0};
externalDesc.visibleSize = {texture.GetWidth(), texture.GetHeight()};
device.CreateExternalTexture(&externalDesc); device.CreateExternalTexture(&externalDesc);
} }
// VisibleRect is OOB on width // VisibleOrigin is OOB on x
{ {
wgpu::TextureDescriptor textureDescriptor = CreateTextureDescriptor(); wgpu::TextureDescriptor textureDescriptor = CreateTextureDescriptor();
wgpu::Texture texture = device.CreateTexture(&textureDescriptor); wgpu::Texture texture = device.CreateTexture(&textureDescriptor);
wgpu::ExternalTextureDescriptor externalDesc = CreateDefaultExternalTextureDescriptor(); wgpu::ExternalTextureDescriptor externalDesc = CreateDefaultExternalTextureDescriptor();
externalDesc.plane0 = texture.CreateView(); externalDesc.plane0 = texture.CreateView();
externalDesc.visibleRect = {texture.GetWidth() + 1, texture.GetHeight()}; externalDesc.visibleOrigin = {1, 0};
externalDesc.visibleSize = {texture.GetWidth(), texture.GetHeight()};
ASSERT_DEVICE_ERROR(device.CreateExternalTexture(&externalDesc)); ASSERT_DEVICE_ERROR(device.CreateExternalTexture(&externalDesc));
} }
// VisibleRect is OOB on height // VisibleOrigin is OOB on y
{ {
wgpu::TextureDescriptor textureDescriptor = CreateTextureDescriptor(); wgpu::TextureDescriptor textureDescriptor = CreateTextureDescriptor();
wgpu::Texture texture = device.CreateTexture(&textureDescriptor); wgpu::Texture texture = device.CreateTexture(&textureDescriptor);
wgpu::ExternalTextureDescriptor externalDesc = CreateDefaultExternalTextureDescriptor(); wgpu::ExternalTextureDescriptor externalDesc = CreateDefaultExternalTextureDescriptor();
externalDesc.plane0 = texture.CreateView(); externalDesc.plane0 = texture.CreateView();
externalDesc.visibleRect = {texture.GetWidth(), texture.GetHeight() + 1}; externalDesc.visibleOrigin = {0, 1};
externalDesc.visibleSize = {texture.GetWidth(), texture.GetHeight()};
ASSERT_DEVICE_ERROR(device.CreateExternalTexture(&externalDesc));
}
// VisibleSize is OOB on width
{
wgpu::TextureDescriptor textureDescriptor = CreateTextureDescriptor();
wgpu::Texture texture = device.CreateTexture(&textureDescriptor);
wgpu::ExternalTextureDescriptor externalDesc = CreateDefaultExternalTextureDescriptor();
externalDesc.plane0 = texture.CreateView();
externalDesc.visibleOrigin = {0, 0};
externalDesc.visibleSize = {texture.GetWidth() + 1, texture.GetHeight()};
ASSERT_DEVICE_ERROR(device.CreateExternalTexture(&externalDesc));
}
// VisibleSize is OOB on height
{
wgpu::TextureDescriptor textureDescriptor = CreateTextureDescriptor();
wgpu::Texture texture = device.CreateTexture(&textureDescriptor);
wgpu::ExternalTextureDescriptor externalDesc = CreateDefaultExternalTextureDescriptor();
externalDesc.plane0 = texture.CreateView();
externalDesc.visibleOrigin = {0, 0};
externalDesc.visibleSize = {texture.GetWidth(), texture.GetHeight() + 1};
ASSERT_DEVICE_ERROR(device.CreateExternalTexture(&externalDesc)); ASSERT_DEVICE_ERROR(device.CreateExternalTexture(&externalDesc));
} }
} }