Changing pointers to Ref<> in GetOrCreateBGL
DeviceBase::GetOrCreateBindGroupLayout and
DeviceBase::GetOrCreateEmptyBindGroupLayout are now returning
ResultOrError<Ref<BindGroupLayoutBase>> instead of
ResultOrError<BindGroupLayoutBase*>.
Bug: dawn:466
Change-Id: I223864325aba9011b0ba6dc67589ead48d930309
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/24082
Commit-Queue: Tomek Ponitka <tommek@google.com>
Reviewed-by: Corentin Wallez <cwallez@chromium.org>
diff --git a/src/dawn_native/Device.cpp b/src/dawn_native/Device.cpp
index b0ef00d..adc75fc 100644
--- a/src/dawn_native/Device.cpp
+++ b/src/dawn_native/Device.cpp
@@ -112,6 +112,8 @@
// alive.
mState = State::Alive;
+ DAWN_TRY_ASSIGN(mEmptyBindGroupLayout, CreateEmptyBindGroupLayout());
+
return {};
}
@@ -390,21 +392,22 @@
return mFormatTable[index];
}
- ResultOrError<BindGroupLayoutBase*> DeviceBase::GetOrCreateBindGroupLayout(
+ ResultOrError<Ref<BindGroupLayoutBase>> DeviceBase::GetOrCreateBindGroupLayout(
const BindGroupLayoutDescriptor* descriptor) {
BindGroupLayoutBase blueprint(this, descriptor);
+ Ref<BindGroupLayoutBase> result = nullptr;
auto iter = mCaches->bindGroupLayouts.find(&blueprint);
if (iter != mCaches->bindGroupLayouts.end()) {
- (*iter)->Reference();
- return *iter;
+ result = *iter;
+ } else {
+ BindGroupLayoutBase* backendObj;
+ DAWN_TRY_ASSIGN(backendObj, CreateBindGroupLayoutImpl(descriptor));
+ backendObj->SetIsCachedReference();
+ mCaches->bindGroupLayouts.insert(backendObj);
+ result = AcquireRef(backendObj);
}
-
- BindGroupLayoutBase* backendObj;
- DAWN_TRY_ASSIGN(backendObj, CreateBindGroupLayoutImpl(descriptor));
- backendObj->SetIsCachedReference();
- mCaches->bindGroupLayouts.insert(backendObj);
- return backendObj;
+ return std::move(result);
}
void DeviceBase::UncacheBindGroupLayout(BindGroupLayoutBase* obj) {
@@ -413,22 +416,18 @@
ASSERT(removedCount == 1);
}
- ResultOrError<BindGroupLayoutBase*> DeviceBase::GetOrCreateEmptyBindGroupLayout() {
- if (!mEmptyBindGroupLayout) {
- BindGroupLayoutDescriptor desc = {};
- desc.entryCount = 0;
- desc.entries = nullptr;
+ // Private function used at initialization
+ ResultOrError<Ref<BindGroupLayoutBase>> DeviceBase::CreateEmptyBindGroupLayout() {
+ BindGroupLayoutDescriptor desc = {};
+ desc.entryCount = 0;
+ desc.entries = nullptr;
- BindGroupLayoutBase* bgl = nullptr;
- if (ConsumedError(GetOrCreateBindGroupLayout(&desc), &bgl)) {
- return BindGroupLayoutBase::MakeError(this);
- }
- mEmptyBindGroupLayout = bgl;
- return bgl;
- } else {
- mEmptyBindGroupLayout->Reference();
- return mEmptyBindGroupLayout.Get();
- }
+ return GetOrCreateBindGroupLayout(&desc);
+ }
+
+ BindGroupLayoutBase* DeviceBase::GetEmptyBindGroupLayout() {
+ ASSERT(mEmptyBindGroupLayout);
+ return mEmptyBindGroupLayout.Get();
}
ResultOrError<ComputePipelineBase*> DeviceBase::GetOrCreateComputePipeline(
@@ -871,7 +870,9 @@
if (IsValidationEnabled()) {
DAWN_TRY(ValidateBindGroupLayoutDescriptor(this, descriptor));
}
- DAWN_TRY_ASSIGN(*result, GetOrCreateBindGroupLayout(descriptor));
+ Ref<BindGroupLayoutBase> bgl;
+ DAWN_TRY_ASSIGN(bgl, GetOrCreateBindGroupLayout(descriptor));
+ *result = bgl.Detach();
return {};
}
@@ -1107,4 +1108,4 @@
}
}
-} // namespace dawn_native
+} // namespace dawn_native
\ No newline at end of file
diff --git a/src/dawn_native/Device.h b/src/dawn_native/Device.h
index f9a3b43..a513796 100644
--- a/src/dawn_native/Device.h
+++ b/src/dawn_native/Device.h
@@ -108,11 +108,11 @@
// the created object will be, the "blueprint". The blueprint is just a FooBase object
// instead of a backend Foo object. If the blueprint doesn't match an object in the
// cache, then the descriptor is used to make a new object.
- ResultOrError<BindGroupLayoutBase*> GetOrCreateBindGroupLayout(
+ ResultOrError<Ref<BindGroupLayoutBase>> GetOrCreateBindGroupLayout(
const BindGroupLayoutDescriptor* descriptor);
void UncacheBindGroupLayout(BindGroupLayoutBase* obj);
- ResultOrError<BindGroupLayoutBase*> GetOrCreateEmptyBindGroupLayout();
+ BindGroupLayoutBase* GetEmptyBindGroupLayout();
ResultOrError<ComputePipelineBase*> GetOrCreateComputePipeline(
const ComputePipelineDescriptor* descriptor);
@@ -266,6 +266,8 @@
TextureBase* texture,
const TextureViewDescriptor* descriptor) = 0;
+ ResultOrError<Ref<BindGroupLayoutBase>> CreateEmptyBindGroupLayout();
+
MaybeError CreateBindGroupInternal(BindGroupBase** result,
const BindGroupDescriptor* descriptor);
MaybeError CreateBindGroupLayoutInternal(BindGroupLayoutBase** result,
diff --git a/src/dawn_native/Pipeline.cpp b/src/dawn_native/Pipeline.cpp
index 15dd068..074f647 100644
--- a/src/dawn_native/Pipeline.cpp
+++ b/src/dawn_native/Pipeline.cpp
@@ -92,17 +92,14 @@
BindGroupIndex groupIndex(groupIndexIn);
+ BindGroupLayoutBase* bgl = nullptr;
if (!mLayout->GetBindGroupLayoutsMask()[groupIndex]) {
- BindGroupLayoutBase* bgl = nullptr;
- if (GetDevice()->ConsumedError(GetDevice()->GetOrCreateEmptyBindGroupLayout(), &bgl)) {
- return BindGroupLayoutBase::MakeError(GetDevice());
- }
- return bgl;
+ bgl = GetDevice()->GetEmptyBindGroupLayout();
+ } else {
+ bgl = mLayout->GetBindGroupLayout(groupIndex);
}
-
- BindGroupLayoutBase* bgl = mLayout->GetBindGroupLayout(groupIndex);
bgl->Reference();
return bgl;
}
-} // namespace dawn_native
+} // namespace dawn_native
\ No newline at end of file
diff --git a/src/dawn_native/PipelineLayout.cpp b/src/dawn_native/PipelineLayout.cpp
index def4875..995a3ee 100644
--- a/src/dawn_native/PipelineLayout.cpp
+++ b/src/dawn_native/PipelineLayout.cpp
@@ -222,7 +222,10 @@
// We should never produce a bad descriptor.
ASSERT(!ValidateBindGroupLayoutDescriptor(device, &desc).IsError());
- DAWN_TRY_ASSIGN(bindGroupLayouts[group], device->GetOrCreateBindGroupLayout(&desc));
+
+ Ref<BindGroupLayoutBase> bgl;
+ DAWN_TRY_ASSIGN(bgl, device->GetOrCreateBindGroupLayout(&desc));
+ bindGroupLayouts[group] = bgl.Detach();
}
PipelineLayoutDescriptor desc = {};
@@ -313,4 +316,4 @@
return true;
}
-} // namespace dawn_native
+} // namespace dawn_native
\ No newline at end of file