mirror of
https://github.com/encounter/dawn-cmake.git
synced 2025-12-12 14:46:08 +00:00
Fix BindGroupLayout leak in PipelineLayout default.
PipelineLayout was re-entering in NXT to create the default empty BGLs, but forgot to remove the initial external refcount for them. Fixing this showed an issue where it was impossible to externally reference a RefCounted that had only internal references, fix this as well and add a test.
This commit is contained in:
committed by
Corentin Wallez
parent
df5a18d883
commit
bfeb285dcf
@@ -60,6 +60,8 @@ namespace backend {
|
||||
for (size_t group = 0; group < kMaxBindGroups; ++group) {
|
||||
if (!mBindGroupLayouts[group]) {
|
||||
mBindGroupLayouts[group] = mDevice->CreateBindGroupLayoutBuilder()->GetResult();
|
||||
// Remove the external ref objects are created with
|
||||
mBindGroupLayouts[group]->Release();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -26,13 +26,16 @@ namespace backend {
|
||||
|
||||
void RefCounted::ReferenceInternal() {
|
||||
ASSERT(mInternalRefs != 0);
|
||||
|
||||
// TODO(cwallez@chromium.org): what to do on overflow?
|
||||
mInternalRefs++;
|
||||
}
|
||||
|
||||
void RefCounted::ReleaseInternal() {
|
||||
ASSERT(mInternalRefs != 0);
|
||||
|
||||
mInternalRefs--;
|
||||
|
||||
if (mInternalRefs == 0) {
|
||||
ASSERT(mExternalRefs == 0);
|
||||
// TODO(cwallez@chromium.org): would this work with custom allocators?
|
||||
@@ -49,14 +52,23 @@ namespace backend {
|
||||
}
|
||||
|
||||
void RefCounted::Reference() {
|
||||
ASSERT(mExternalRefs != 0);
|
||||
ASSERT(mInternalRefs != 0);
|
||||
|
||||
// mExternalRefs != 0 counts as one internal ref.
|
||||
if (mExternalRefs == 0) {
|
||||
ReferenceInternal();
|
||||
}
|
||||
|
||||
// TODO(cwallez@chromium.org): what to do on overflow?
|
||||
mExternalRefs++;
|
||||
}
|
||||
|
||||
void RefCounted::Release() {
|
||||
ASSERT(mInternalRefs != 0);
|
||||
ASSERT(mExternalRefs != 0);
|
||||
|
||||
mExternalRefs--;
|
||||
// mExternalRefs != 0 counts as one internal ref.
|
||||
if (mExternalRefs == 0) {
|
||||
ReleaseInternal();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user