Skip to content

Commit fff9da2

Browse files
kainino0xDawn LUCI CQ
authored andcommitted
Reland "Add Getter for TextureBindingViewDimension"
This reverts commit adb36e4. Reason for revert: Should be able to cleanly reland over https://dawn-review.googlesource.com/c/dawn/+/282095 The GN issue should be fixed, so we should be able to rely on CQ. (Technically these should be bundled into one change, but they come from different authors, and can be landed separately, so that's what I'm doing.) Bug: 466134210 Bug: 458616688 Change-Id: I3324ca170661b3c5c176cc3ff5e5fd88edef4a99 Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/282896 Bot-Commit: rubber-stamper@appspot.gserviceaccount.com <rubber-stamper@appspot.gserviceaccount.com> Commit-Queue: Kai Ninomiya <kainino@chromium.org>
1 parent 36c1659 commit fff9da2

File tree

13 files changed

+216
-34
lines changed

13 files changed

+216
-34
lines changed

src/dawn/dawn.json

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4087,6 +4087,11 @@
40874087
"no autolock": true,
40884088
"returns": "texture usage"
40894089
},
4090+
{
4091+
"name": "get texture binding view dimension",
4092+
"no autolock": true,
4093+
"returns": "texture view dimension"
4094+
},
40904095
{
40914096
"name": "destroy"
40924097
},

src/dawn/dawn_wire.json

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -304,13 +304,16 @@
304304
"TextureGetSampleCount",
305305
"TextureGetDimension",
306306
"TextureGetFormat",
307-
"TextureGetUsage"
307+
"TextureGetUsage",
308+
"TextureGetTextureBindingViewDimension"
308309
],
309310
"client_handwritten_commands": [
310311
"AdapterGetInstance",
311312
"BufferDestroy",
312313
"BufferUnmap",
313314
"DeviceCreateErrorBuffer",
315+
"DeviceCreateErrorTexture",
316+
"DeviceCreateTexture",
314317
"DeviceDestroy",
315318
"DeviceGetQueue",
316319
"DeviceGetSupportedSurfaceUsage",

src/dawn/native/Texture.cpp

Lines changed: 41 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -602,37 +602,49 @@ bool CopySrcNeedsInternalTextureBindingUsage(const DeviceBase* device, const For
602602
return false;
603603
}
604604

605-
wgpu::TextureViewDimension ResolveDefaultCompatiblityTextureBindingViewDimension(
605+
wgpu::TextureViewDimension ResolveDefaultCompatiblityTextureBindingViewDimensionImpl(
606606
const DeviceBase* device,
607-
const UnpackedPtr<TextureDescriptor>& descriptor) {
607+
wgpu::TextureDimension dimension,
608+
uint32_t depthOrArrayLayers,
609+
wgpu::TextureViewDimension textureBindingViewDimension) {
608610
// In non-compatibility mode this value is not used so return undefined so that it is not
609611
// used by mistake.
610612
if (device->HasFlexibleTextureViews()) {
611613
return wgpu::TextureViewDimension::Undefined;
612614
}
613615

614-
auto textureBindingViewDimension = wgpu::TextureViewDimension::Undefined;
615-
if (auto* subDesc = descriptor.Get<TextureBindingViewDimensionDescriptor>()) {
616-
textureBindingViewDimension = subDesc->textureBindingViewDimension;
617-
}
618616
if (textureBindingViewDimension != wgpu::TextureViewDimension::Undefined) {
619617
return textureBindingViewDimension;
620618
}
621619

622-
switch (descriptor->dimension) {
620+
switch (dimension) {
623621
case wgpu::TextureDimension::e1D:
624622
return wgpu::TextureViewDimension::e1D;
625623
case wgpu::TextureDimension::e2D:
626-
return descriptor->size.depthOrArrayLayers == 1 ? wgpu::TextureViewDimension::e2D
627-
: wgpu::TextureViewDimension::e2DArray;
624+
return depthOrArrayLayers == 1 ? wgpu::TextureViewDimension::e2D
625+
: wgpu::TextureViewDimension::e2DArray;
628626
case wgpu::TextureDimension::e3D:
629627
return wgpu::TextureViewDimension::e3D;
630628
case wgpu::TextureDimension::Undefined:
631629
default:
632-
DAWN_UNREACHABLE();
630+
// We could get here on an error texture.
631+
return wgpu::TextureViewDimension::Undefined;
633632
}
634633
}
635634

635+
wgpu::TextureViewDimension ResolveDefaultCompatiblityTextureBindingViewDimension(
636+
const DeviceBase* device,
637+
const UnpackedPtr<TextureDescriptor>& descriptor) {
638+
auto textureBindingViewDimension = wgpu::TextureViewDimension::Undefined;
639+
if (auto* subDesc = descriptor.Get<TextureBindingViewDimensionDescriptor>()) {
640+
textureBindingViewDimension = subDesc->textureBindingViewDimension;
641+
}
642+
643+
return ResolveDefaultCompatiblityTextureBindingViewDimensionImpl(
644+
device, descriptor->dimension, descriptor->size.depthOrArrayLayers,
645+
textureBindingViewDimension);
646+
}
647+
636648
wgpu::TextureUsage AddInternalUsages(const DeviceBase* device,
637649
wgpu::TextureUsage usage,
638650
const Format& format,
@@ -1023,7 +1035,21 @@ TextureBase::TextureBase(DeviceBase* device,
10231035
mMipLevelCount(descriptor->mipLevelCount),
10241036
mSampleCount(descriptor->sampleCount),
10251037
mUsage(descriptor->usage),
1026-
mFormatEnumForReflection(descriptor->format) {}
1038+
mFormatEnumForReflection(descriptor->format) {
1039+
auto textureBindingViewDimension = wgpu::TextureViewDimension::Undefined;
1040+
for (const wgpu::ChainedStruct* chain = descriptor->nextInChain; chain != nullptr;
1041+
chain = chain->nextInChain) {
1042+
if (chain->sType == wgpu::SType::TextureBindingViewDimensionDescriptor) {
1043+
textureBindingViewDimension =
1044+
reinterpret_cast<const TextureBindingViewDimensionDescriptor*>(chain)
1045+
->textureBindingViewDimension;
1046+
}
1047+
}
1048+
1049+
mCompatibilityTextureBindingViewDimension =
1050+
ResolveDefaultCompatiblityTextureBindingViewDimensionImpl(
1051+
device, mDimension, mBaseSize.depthOrArrayLayers, textureBindingViewDimension);
1052+
}
10271053

10281054
void TextureBase::DestroyImpl() {
10291055
// TODO(crbug.com/dawn/831): DestroyImpl is called from two places.
@@ -1545,6 +1571,10 @@ wgpu::TextureUsage TextureBase::APIGetUsage() const {
15451571
return mUsage;
15461572
}
15471573

1574+
wgpu::TextureViewDimension TextureBase::APIGetTextureBindingViewDimension() const {
1575+
return mCompatibilityTextureBindingViewDimension;
1576+
}
1577+
15481578
void TextureBase::APIPin(wgpu::TextureUsage usage) {
15491579
// There is no status to return so we don't need to handle the case where an error has been
15501580
// consumed.

src/dawn/native/Texture.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -248,6 +248,7 @@ class TextureBase : public RefCountedWithExternalCount<SharedResource> {
248248
wgpu::TextureDimension APIGetDimension() const;
249249
wgpu::TextureFormat APIGetFormat() const;
250250
wgpu::TextureUsage APIGetUsage() const;
251+
wgpu::TextureViewDimension APIGetTextureBindingViewDimension() const;
251252

252253
protected:
253254
TextureBase(DeviceBase* device, const UnpackedPtr<TextureDescriptor>& descriptor);

src/dawn/tests/unittests/validation/TextureValidationTests.cpp

Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -712,6 +712,78 @@ TEST_F(TextureValidationTest, UseASTCFormatWithoutEnablingFeature) {
712712
}
713713
}
714714

715+
class TextureCompatValidationTest : public ValidationTest {
716+
protected:
717+
bool UseCompatibilityMode() const override { return true; }
718+
719+
wgpu::TextureDescriptor CreateDefaultTextureDescriptor() {
720+
wgpu::TextureDescriptor descriptor;
721+
descriptor.size.width = 1;
722+
descriptor.size.height = 1;
723+
descriptor.size.depthOrArrayLayers = 1;
724+
descriptor.mipLevelCount = 1;
725+
descriptor.sampleCount = 1;
726+
descriptor.dimension = wgpu::TextureDimension::e2D;
727+
descriptor.format = wgpu::TextureFormat::RGBA8Unorm;
728+
descriptor.usage = wgpu::TextureUsage::TextureBinding;
729+
return descriptor;
730+
}
731+
};
732+
733+
TEST_F(TextureCompatValidationTest, TextureBindingViewDimension1DDefaultsTo1D) {
734+
wgpu::TextureDescriptor descriptor = CreateDefaultTextureDescriptor();
735+
descriptor.dimension = wgpu::TextureDimension::e1D;
736+
wgpu::Texture tex = device.CreateTexture(&descriptor);
737+
738+
EXPECT_EQ(wgpu::TextureViewDimension::e1D, tex.GetTextureBindingViewDimension());
739+
}
740+
741+
TEST_F(TextureCompatValidationTest, TextureBindingViewDimension2DDefaultsTo2D) {
742+
wgpu::TextureDescriptor descriptor = CreateDefaultTextureDescriptor();
743+
descriptor.dimension = wgpu::TextureDimension::e2D;
744+
wgpu::Texture tex = device.CreateTexture(&descriptor);
745+
746+
EXPECT_EQ(wgpu::TextureViewDimension::e2D, tex.GetTextureBindingViewDimension());
747+
}
748+
749+
TEST_F(TextureCompatValidationTest, TextureBindingViewDimension2DWith2PlusLayersDefaultsTo2D) {
750+
wgpu::TextureDescriptor descriptor = CreateDefaultTextureDescriptor();
751+
descriptor.dimension = wgpu::TextureDimension::e2D;
752+
descriptor.size.depthOrArrayLayers = 2;
753+
wgpu::Texture tex = device.CreateTexture(&descriptor);
754+
755+
EXPECT_EQ(wgpu::TextureViewDimension::e2DArray, tex.GetTextureBindingViewDimension());
756+
}
757+
758+
TEST_F(TextureCompatValidationTest, TextureBindingViewDimension3DDefaultsTo3D) {
759+
wgpu::TextureDescriptor descriptor = CreateDefaultTextureDescriptor();
760+
descriptor.dimension = wgpu::TextureDimension::e3D;
761+
wgpu::Texture tex = device.CreateTexture(&descriptor);
762+
763+
EXPECT_EQ(wgpu::TextureViewDimension::e3D, tex.GetTextureBindingViewDimension());
764+
}
765+
766+
TEST_F(TextureCompatValidationTest, TextureBindingViewDimensionInvalidDefaultsToUndefined) {
767+
wgpu::TextureDescriptor descriptor = CreateDefaultTextureDescriptor();
768+
descriptor.dimension = static_cast<wgpu::TextureDimension>(12345);
769+
770+
wgpu::Texture tex;
771+
ASSERT_DEVICE_ERROR(tex = device.CreateTexture(&descriptor));
772+
773+
EXPECT_EQ(wgpu::TextureViewDimension::Undefined, tex.GetTextureBindingViewDimension());
774+
}
775+
776+
TEST_F(TextureCompatValidationTest, TextureBindingViewDimensionInvalidFormatStillSetsDimension) {
777+
wgpu::TextureDescriptor descriptor = CreateDefaultTextureDescriptor();
778+
descriptor.format = static_cast<wgpu::TextureFormat>(12345);
779+
descriptor.size.depthOrArrayLayers = 2;
780+
781+
wgpu::Texture tex;
782+
ASSERT_DEVICE_ERROR(tex = device.CreateTexture(&descriptor));
783+
784+
EXPECT_EQ(wgpu::TextureViewDimension::e2DArray, tex.GetTextureBindingViewDimension());
785+
}
786+
715787
class D32S8TextureFormatsValidationTests : public TextureValidationTest {
716788
protected:
717789
std::vector<wgpu::FeatureName> GetRequiredFeatures() override {
@@ -1027,6 +1099,8 @@ static void CheckTextureMatchesDescriptor(const wgpu::Texture& tex,
10271099
}
10281100
EXPECT_EQ(desc.usage, tex.GetUsage());
10291101
EXPECT_EQ(desc.format, tex.GetFormat());
1102+
// This is undefined in core, set in compat.
1103+
EXPECT_EQ(wgpu::TextureViewDimension::Undefined, tex.GetTextureBindingViewDimension());
10301104
}
10311105

10321106
// Test that the texture creation parameters are correctly reflected for succesfully created

src/dawn/tests/unittests/wire/WireInjectTextureTests.cpp

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,10 @@ class WireInjectTextureTests : public WireTest {
5252
// A placeholder texture format for ReserveTexture. The data in it doesn't matter as long as
5353
// we don't call texture reflection methods.
5454
static constexpr wgpu::TextureDescriptor kPlaceholderDesc = {};
55+
56+
bool IsCompatibilityMode() {
57+
return !device.HasFeature(wgpu::FeatureName::CoreFeaturesAndLimits);
58+
}
5559
};
5660

5761
// Test that reserving and injecting a texture makes calls on the client object forward to the
@@ -198,6 +202,12 @@ TEST_F(WireInjectTextureTests, ReservedTextureReflection) {
198202
ASSERT_EQ(desc.dimension, texture.GetDimension());
199203
ASSERT_EQ(desc.mipLevelCount, texture.GetMipLevelCount());
200204
ASSERT_EQ(desc.sampleCount, texture.GetSampleCount());
205+
206+
wgpu::TextureViewDimension expectedTextureBindingViewDimension =
207+
IsCompatibilityMode() ? wgpu::TextureViewDimension::e3D
208+
: wgpu::TextureViewDimension::Undefined;
209+
210+
ASSERT_EQ(expectedTextureBindingViewDimension, texture.GetTextureBindingViewDimension());
201211
}
202212

203213
} // anonymous namespace

src/dawn/wire/client/Client.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,7 @@ ReservedBuffer Client::ReserveBuffer(WGPUDevice device, const WGPUBufferDescript
9696
}
9797

9898
ReservedTexture Client::ReserveTexture(WGPUDevice device, const WGPUTextureDescriptor* descriptor) {
99-
Ref<Texture> texture = Make<Texture>(descriptor);
99+
Ref<Texture> texture = Make<Texture>(FromAPI(device), descriptor);
100100

101101
ReservedTexture result;
102102
result.handle = texture->GetWireHandle(this);

src/dawn/wire/client/Device.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -395,6 +395,14 @@ WGPUBuffer Device::APICreateErrorBuffer(const WGPUBufferDescriptor* descriptor)
395395
return Buffer::CreateError(this, descriptor);
396396
}
397397

398+
WGPUTexture Device::APICreateTexture(const WGPUTextureDescriptor* descriptor) {
399+
return Texture::Create(this, descriptor);
400+
}
401+
402+
WGPUTexture Device::APICreateErrorTexture(const WGPUTextureDescriptor* descriptor) {
403+
return Texture::CreateError(this, descriptor);
404+
}
405+
398406
WGPUAdapter Device::APIGetAdapter() const {
399407
Ref<Adapter> adapter = mAdapter;
400408
return ReturnToAPI(std::move(adapter));

src/dawn/wire/client/Device.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,8 @@ class Device final : public RefCountedWithExternalCount<ObjectWithEventsBase> {
7777
WGPUFuture APICreateRenderPipelineAsync(
7878
WGPURenderPipelineDescriptor const* descriptor,
7979
const WGPUCreateRenderPipelineAsyncCallbackInfo& callbackInfo);
80+
WGPUTexture APICreateTexture(const WGPUTextureDescriptor* descriptor);
81+
WGPUTexture APICreateErrorTexture(const WGPUTextureDescriptor* descriptor);
8082

8183
WGPUStatus APIGetLimits(WGPULimits* limits) const;
8284
WGPUFuture APIGetLostFuture();

src/dawn/wire/client/Surface.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -153,7 +153,7 @@ void Surface::APIGetCurrentTexture(WGPUSurfaceTexture* surfaceTexture) {
153153

154154
// Assume texture creation will work in the server and return a new texture proxy.
155155
Client* wireClient = GetClient();
156-
Ref<Texture> texture = wireClient->Make<Texture>(&mTextureDescriptor);
156+
Ref<Texture> texture = wireClient->Make<Texture>(mConfiguredDevice.Get(), &mTextureDescriptor);
157157

158158
SurfaceGetCurrentTextureCmd cmd;
159159
cmd.surfaceId = GetWireHandle(wireClient).id;

0 commit comments

Comments
 (0)