Skip to content

Commit 9d8eb26

Browse files
KangzDawn LUCI CQ
authored andcommitted
[dawn][native] Create DynamicArrayState even for error ResourceTable
This will be used in a future CL to implement the "content timeline" validation for Update/InsertBinding/RemoveBinding even for error tables. Bug: 463925499 Change-Id: I019b7ef5481b8ddf51915e16b59e0da69ccdd605 Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/280896 Reviewed-by: dan sinclair <dsinclair@chromium.org> Commit-Queue: Corentin Wallez <cwallez@chromium.org>
1 parent 43cc409 commit 9d8eb26

File tree

3 files changed

+28
-12
lines changed

3 files changed

+28
-12
lines changed

src/dawn/native/Device.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1452,7 +1452,7 @@ ResourceTableBase* DeviceBase::APICreateResourceTable(const ResourceTableDescrip
14521452
Ref<ResourceTableBase> result;
14531453
if (ConsumedError(CreateResourceTable(descriptor), &result,
14541454
"calling %s.CreateResourceTable(%s).", this, descriptor)) {
1455-
result = ResourceTableBase::MakeError(this);
1455+
result = ResourceTableBase::MakeError(this, descriptor);
14561456
}
14571457
return ReturnToAPI(std::move(result));
14581458
}

src/dawn/native/ResourceTable.cpp

Lines changed: 22 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -58,12 +58,23 @@ ResourceTableBase::ResourceTableBase(DeviceBase* device, const ResourceTableDesc
5858
GetObjectTrackingList()->Track(this);
5959
}
6060

61-
ResourceTableBase::ResourceTableBase(DeviceBase* device, ObjectBase::ErrorTag tag, StringView label)
62-
: ApiObjectBase(device, tag, label), mDestroyed(true) {}
61+
ResourceTableBase::ResourceTableBase(DeviceBase* device,
62+
const ResourceTableDescriptor* descriptor,
63+
ObjectBase::ErrorTag tag)
64+
: ApiObjectBase(device, tag, descriptor->label) {
65+
// Create a DynamicArrayState even for an error resource table because we need to do state
66+
// tracking used for the validation of synchronous errors. However skip creating it for tables
67+
// above the limit because that's caught on the content-timeline as well.
68+
if (descriptor->size <= device->GetLimits().resourceTableLimits.maxResourceTableSize) {
69+
mDynamicArray = AcquireRef(new DynamicArrayState(device, BindingIndex(descriptor->size),
70+
wgpu::DynamicBindingKind::SampledTexture));
71+
}
72+
}
6373

6474
// static
65-
Ref<ResourceTableBase> ResourceTableBase::MakeError(DeviceBase* device, StringView label) {
66-
return AcquireRef(new ResourceTableBase(device, ObjectBase::kError, label));
75+
Ref<ResourceTableBase> ResourceTableBase::MakeError(DeviceBase* device,
76+
const ResourceTableDescriptor* descriptor) {
77+
return AcquireRef(new ResourceTableBase(device, descriptor, ObjectBase::kError));
6778
}
6879

6980
ObjectType ResourceTableBase::GetType() const {
@@ -79,19 +90,22 @@ DynamicArrayState* ResourceTableBase::GetDynamicArrayState() {
7990
}
8091

8192
void ResourceTableBase::DestroyImpl() {
82-
if (mDynamicArray) {
93+
if (!mDynamicArray->IsDestroyed()) {
8394
mDynamicArray->Destroy();
8495
}
85-
mDestroyed = true;
8696
}
8797

8898
void ResourceTableBase::APIDestroy() {
89-
Destroy(); // Calls DestroyImpl
99+
// Don't just call Destroy() because it skips running on error objects.
100+
if (!mDynamicArray->IsDestroyed()) {
101+
mDynamicArray->Destroy();
102+
}
90103
}
91104

92105
MaybeError ResourceTableBase::ValidateCanUseInSubmitNow() const {
93106
DAWN_ASSERT(!IsError());
94-
DAWN_INVALID_IF(mDestroyed, "%s used while destroyed.", this);
107+
DAWN_ASSERT(mDynamicArray != nullptr);
108+
DAWN_INVALID_IF(mDynamicArray->IsDestroyed(), "%s used while destroyed.", this);
95109
return {};
96110
}
97111

src/dawn/native/ResourceTable.h

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,8 @@ MaybeError ValidateResourceTableDescriptor(const DeviceBase* device,
4040

4141
class ResourceTableBase : public ApiObjectBase {
4242
public:
43-
static Ref<ResourceTableBase> MakeError(DeviceBase* device, StringView label = {});
43+
static Ref<ResourceTableBase> MakeError(DeviceBase* device,
44+
const ResourceTableDescriptor* descriptor);
4445

4546
ObjectType GetType() const override;
4647

@@ -58,12 +59,13 @@ class ResourceTableBase : public ApiObjectBase {
5859
DynamicArrayState* GetDynamicArrayState();
5960

6061
private:
61-
ResourceTableBase(DeviceBase* device, ObjectBase::ErrorTag tag, StringView label);
62+
ResourceTableBase(DeviceBase* device,
63+
const ResourceTableDescriptor* descriptor,
64+
ObjectBase::ErrorTag tag);
6265

6366
// TODO(https://issues.chromium.org/463925499): Inline the functionality of DynamicArrayState in
6467
// ResourceTable once bindless bindgroup support is removed.
6568
Ref<DynamicArrayState> mDynamicArray;
66-
bool mDestroyed = false;
6769
};
6870

6971
} // namespace dawn::native

0 commit comments

Comments
 (0)