BGL refactoring to allow for auto pipelines to use cache better.
- Introduces BindGroupLayoutInternalBase that is equivalent to the
old BindGroupLayoutBase.
- New BindGroupLayoutBase is now just a wrapper over the internal
version with a tagged pipeline compatibility token.
- Adjusts the existing tests to accomodate the change.
- Follow up CL to separate the new class.
Bug: dawn:1933
Change-Id: Ia167b987b4dfa504bbb70c85f6a72c1b16725b85
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/143521
Kokoro: Kokoro <noreply+kokoro@google.com>
Commit-Queue: Loko Kung <lokokung@google.com>
Reviewed-by: Austin Eng <enga@chromium.org>
diff --git a/include/dawn/native/DawnNative.h b/include/dawn/native/DawnNative.h
index e4913a1..51b3cc6 100644
--- a/include/dawn/native/DawnNative.h
+++ b/include/dawn/native/DawnNative.h
@@ -294,9 +294,6 @@
DAWN_NATIVE_EXPORT uint64_t GetAllocatedSizeForTesting(WGPUBuffer buffer);
-DAWN_NATIVE_EXPORT bool BindGroupLayoutBindingsEqualForTesting(WGPUBindGroupLayout a,
- WGPUBindGroupLayout b);
-
} // namespace dawn::native
// Alias the DawnInstanceDescriptor up to wgpu.
diff --git a/src/dawn/native/BindGroup.cpp b/src/dawn/native/BindGroup.cpp
index f49f8ab..1e91b14 100644
--- a/src/dawn/native/BindGroup.cpp
+++ b/src/dawn/native/BindGroup.cpp
@@ -286,7 +286,7 @@
descriptor->entryCount, static_cast<uint32_t>(descriptor->layout->GetBindingCount()),
descriptor->layout, descriptor->layout->EntriesToString());
- const BindGroupLayoutBase::BindingMap& bindingMap = descriptor->layout->GetBindingMap();
+ const BindGroupLayoutInternalBase::BindingMap& bindingMap = descriptor->layout->GetBindingMap();
ASSERT(bindingMap.size() <= kMaxBindingsPerPipelineLayout);
ityp::bitset<BindingIndex, kMaxBindingsPerPipelineLayout> bindingsSet;
diff --git a/src/dawn/native/BindGroup.h b/src/dawn/native/BindGroup.h
index 922d813..acf4363 100644
--- a/src/dawn/native/BindGroup.h
+++ b/src/dawn/native/BindGroup.h
@@ -87,7 +87,7 @@
void DeleteThis() override;
Ref<BindGroupLayoutBase> mLayout;
- BindGroupLayoutBase::BindingDataPointers mBindingData;
+ BindGroupLayoutInternalBase::BindingDataPointers mBindingData;
// TODO(dawn:1293): Store external textures in
// BindGroupLayoutBase::BindingDataPointers::bindings
diff --git a/src/dawn/native/BindGroupLayout.cpp b/src/dawn/native/BindGroupLayout.cpp
index 6bb8c5f..d7dd201 100644
--- a/src/dawn/native/BindGroupLayout.cpp
+++ b/src/dawn/native/BindGroupLayout.cpp
@@ -458,15 +458,13 @@
} // namespace
-// BindGroupLayoutBase
+// BindGroupLayoutInternalBase
-BindGroupLayoutBase::BindGroupLayoutBase(DeviceBase* device,
- const BindGroupLayoutDescriptor* descriptor,
- PipelineCompatibilityToken pipelineCompatibilityToken,
- ApiObjectBase::UntrackedByDeviceTag tag)
- : ApiObjectBase(device, descriptor->label),
- mPipelineCompatibilityToken(pipelineCompatibilityToken),
- mUnexpandedBindingCount(descriptor->entryCount) {
+BindGroupLayoutInternalBase::BindGroupLayoutInternalBase(
+ DeviceBase* device,
+ const BindGroupLayoutDescriptor* descriptor,
+ ApiObjectBase::UntrackedByDeviceTag tag)
+ : ApiObjectBase(device, descriptor->label), mUnexpandedBindingCount(descriptor->entryCount) {
std::vector<BindGroupLayoutEntry> sortedBindings = ExtractAndExpandBglEntries(
descriptor, &mBindingCounts, &mExternalTextureBindingExpansionMap);
@@ -490,52 +488,52 @@
ASSERT(mBindingInfo.size() <= kMaxBindingsPerPipelineLayoutTyped);
}
-BindGroupLayoutBase::BindGroupLayoutBase(DeviceBase* device,
- const BindGroupLayoutDescriptor* descriptor,
- PipelineCompatibilityToken pipelineCompatibilityToken)
- : BindGroupLayoutBase(device, descriptor, pipelineCompatibilityToken, kUntrackedByDevice) {
+BindGroupLayoutInternalBase::BindGroupLayoutInternalBase(
+ DeviceBase* device,
+ const BindGroupLayoutDescriptor* descriptor)
+ : BindGroupLayoutInternalBase(device, descriptor, kUntrackedByDevice) {
GetObjectTrackingList()->Track(this);
}
-BindGroupLayoutBase::BindGroupLayoutBase(DeviceBase* device,
- ObjectBase::ErrorTag tag,
- const char* label)
+BindGroupLayoutInternalBase::BindGroupLayoutInternalBase(DeviceBase* device,
+ ObjectBase::ErrorTag tag,
+ const char* label)
: ApiObjectBase(device, tag, label) {}
-BindGroupLayoutBase::~BindGroupLayoutBase() = default;
+BindGroupLayoutInternalBase::~BindGroupLayoutInternalBase() = default;
-void BindGroupLayoutBase::DestroyImpl() {
+void BindGroupLayoutInternalBase::DestroyImpl() {
Uncache();
}
-// static
-BindGroupLayoutBase* BindGroupLayoutBase::MakeError(DeviceBase* device, const char* label) {
- return new BindGroupLayoutBase(device, ObjectBase::kError, label);
-}
-
-ObjectType BindGroupLayoutBase::GetType() const {
+ObjectType BindGroupLayoutInternalBase::GetType() const {
return ObjectType::BindGroupLayout;
}
-const BindGroupLayoutBase::BindingMap& BindGroupLayoutBase::GetBindingMap() const {
+const BindingInfo& BindGroupLayoutInternalBase::GetBindingInfo(BindingIndex bindingIndex) const {
+ ASSERT(!IsError());
+ ASSERT(bindingIndex < mBindingInfo.size());
+ return mBindingInfo[bindingIndex];
+}
+
+const BindGroupLayoutInternalBase::BindingMap& BindGroupLayoutInternalBase::GetBindingMap() const {
ASSERT(!IsError());
return mBindingMap;
}
-bool BindGroupLayoutBase::HasBinding(BindingNumber bindingNumber) const {
+bool BindGroupLayoutInternalBase::HasBinding(BindingNumber bindingNumber) const {
return mBindingMap.count(bindingNumber) != 0;
}
-BindingIndex BindGroupLayoutBase::GetBindingIndex(BindingNumber bindingNumber) const {
+BindingIndex BindGroupLayoutInternalBase::GetBindingIndex(BindingNumber bindingNumber) const {
ASSERT(!IsError());
const auto& it = mBindingMap.find(bindingNumber);
ASSERT(it != mBindingMap.end());
return it->second;
}
-size_t BindGroupLayoutBase::ComputeContentHash() {
+size_t BindGroupLayoutInternalBase::ComputeContentHash() {
ObjectContentHasher recorder;
- recorder.Record(mPipelineCompatibilityToken);
// std::map is sorted by key, so two BGLs constructed in different orders
// will still record the same.
@@ -553,53 +551,49 @@
return recorder.GetContentHash();
}
-bool BindGroupLayoutBase::EqualityFunc::operator()(const BindGroupLayoutBase* a,
- const BindGroupLayoutBase* b) const {
+bool BindGroupLayoutInternalBase::EqualityFunc::operator()(
+ const BindGroupLayoutInternalBase* a,
+ const BindGroupLayoutInternalBase* b) const {
return a->IsLayoutEqual(b);
}
-BindingIndex BindGroupLayoutBase::GetBindingCount() const {
+BindingIndex BindGroupLayoutInternalBase::GetBindingCount() const {
return mBindingInfo.size();
}
-BindingIndex BindGroupLayoutBase::GetBufferCount() const {
+BindingIndex BindGroupLayoutInternalBase::GetBufferCount() const {
return BindingIndex(mBindingCounts.bufferCount);
}
-BindingIndex BindGroupLayoutBase::GetDynamicBufferCount() const {
+BindingIndex BindGroupLayoutInternalBase::GetDynamicBufferCount() const {
// This is a binding index because dynamic buffers are packed at the front of the binding
// info.
return static_cast<BindingIndex>(mBindingCounts.dynamicStorageBufferCount +
mBindingCounts.dynamicUniformBufferCount);
}
-uint32_t BindGroupLayoutBase::GetUnverifiedBufferCount() const {
+uint32_t BindGroupLayoutInternalBase::GetUnverifiedBufferCount() const {
return mBindingCounts.unverifiedBufferCount;
}
-uint32_t BindGroupLayoutBase::GetExternalTextureBindingCount() const {
+uint32_t BindGroupLayoutInternalBase::GetExternalTextureBindingCount() const {
return mExternalTextureBindingExpansionMap.size();
}
-const BindingCounts& BindGroupLayoutBase::GetBindingCountInfo() const {
+const BindingCounts& BindGroupLayoutInternalBase::GetBindingCountInfo() const {
return mBindingCounts;
}
const ExternalTextureBindingExpansionMap&
-BindGroupLayoutBase::GetExternalTextureBindingExpansionMap() const {
+BindGroupLayoutInternalBase::GetExternalTextureBindingExpansionMap() const {
return mExternalTextureBindingExpansionMap;
}
-uint32_t BindGroupLayoutBase::GetUnexpandedBindingCount() const {
+uint32_t BindGroupLayoutInternalBase::GetUnexpandedBindingCount() const {
return mUnexpandedBindingCount;
}
-bool BindGroupLayoutBase::IsLayoutEqual(const BindGroupLayoutBase* other,
- bool excludePipelineCompatibiltyToken) const {
- if (!excludePipelineCompatibiltyToken &&
- GetPipelineCompatibilityToken() != other->GetPipelineCompatibilityToken()) {
- return false;
- }
+bool BindGroupLayoutInternalBase::IsLayoutEqual(const BindGroupLayoutInternalBase* other) const {
if (GetBindingCount() != other->GetBindingCount()) {
return false;
}
@@ -611,11 +605,7 @@
return mBindingMap == other->mBindingMap;
}
-PipelineCompatibilityToken BindGroupLayoutBase::GetPipelineCompatibilityToken() const {
- return mPipelineCompatibilityToken;
-}
-
-size_t BindGroupLayoutBase::GetBindingDataSize() const {
+size_t BindGroupLayoutInternalBase::GetBindingDataSize() const {
// | ------ buffer-specific ----------| ------------ object pointers -------------|
// | --- offsets + sizes -------------| --------------- Ref<ObjectBase> ----------|
// Followed by:
@@ -629,8 +619,8 @@
return bufferSizeArrayStart + mBindingCounts.unverifiedBufferCount * sizeof(uint64_t);
}
-BindGroupLayoutBase::BindingDataPointers BindGroupLayoutBase::ComputeBindingDataPointers(
- void* dataStart) const {
+BindGroupLayoutInternalBase::BindingDataPointers
+BindGroupLayoutInternalBase::ComputeBindingDataPointers(void* dataStart) const {
BufferBindingData* bufferData = reinterpret_cast<BufferBindingData*>(dataStart);
auto bindings = reinterpret_cast<Ref<ObjectBase>*>(bufferData + mBindingCounts.bufferCount);
uint64_t* unverifiedBufferSizes = AlignPtr(
@@ -645,7 +635,7 @@
{unverifiedBufferSizes, mBindingCounts.unverifiedBufferCount}};
}
-bool BindGroupLayoutBase::IsStorageBufferBinding(BindingIndex bindingIndex) const {
+bool BindGroupLayoutInternalBase::IsStorageBufferBinding(BindingIndex bindingIndex) const {
ASSERT(bindingIndex < GetBufferCount());
switch (GetBindingInfo(bindingIndex).buffer.type) {
case wgpu::BufferBindingType::Uniform:
@@ -660,10 +650,10 @@
UNREACHABLE();
}
-std::string BindGroupLayoutBase::EntriesToString() const {
+std::string BindGroupLayoutInternalBase::EntriesToString() const {
std::string entries = "[";
std::string sep = "";
- const BindGroupLayoutBase::BindingMap& bindingMap = GetBindingMap();
+ const BindGroupLayoutInternalBase::BindingMap& bindingMap = GetBindingMap();
for (const auto [bindingNumber, bindingIndex] : bindingMap) {
const BindingInfo& bindingInfo = GetBindingInfo(bindingIndex);
entries += absl::StrFormat("%s%s", sep, bindingInfo);
@@ -673,4 +663,43 @@
return entries;
}
+BindGroupLayoutBase::BindGroupLayoutBase(DeviceBase* device,
+ const char* label,
+ Ref<BindGroupLayoutInternalBase> internal,
+ PipelineCompatibilityToken pipelineCompatibilityToken)
+ : ApiObjectBase(device, label),
+ mInternalLayout(internal),
+ mPipelineCompatibilityToken(pipelineCompatibilityToken) {
+ GetObjectTrackingList()->Track(this);
+}
+
+BindGroupLayoutBase::BindGroupLayoutBase(DeviceBase* device,
+ ObjectBase::ErrorTag tag,
+ const char* label)
+ : ApiObjectBase(device, tag, label) {}
+
+ObjectType BindGroupLayoutBase::GetType() const {
+ return ObjectType::BindGroupLayout;
+}
+
+// static
+BindGroupLayoutBase* BindGroupLayoutBase::MakeError(DeviceBase* device, const char* label) {
+ return new BindGroupLayoutBase(device, ObjectBase::kError, label);
+}
+
+BindGroupLayoutInternalBase* BindGroupLayoutBase::GetInternalBindGroupLayout() const {
+ return mInternalLayout.Get();
+}
+
+bool BindGroupLayoutBase::IsLayoutEqual(const BindGroupLayoutBase* other,
+ bool excludePipelineCompatibiltyToken) const {
+ if (!excludePipelineCompatibiltyToken &&
+ GetPipelineCompatibilityToken() != other->GetPipelineCompatibilityToken()) {
+ return false;
+ }
+ return GetInternalBindGroupLayout() == other->GetInternalBindGroupLayout();
+}
+
+void BindGroupLayoutBase::DestroyImpl() {}
+
} // namespace dawn::native
diff --git a/src/dawn/native/BindGroupLayout.h b/src/dawn/native/BindGroupLayout.h
index 77042b9..6bf49bb 100644
--- a/src/dawn/native/BindGroupLayout.h
+++ b/src/dawn/native/BindGroupLayout.h
@@ -50,31 +50,22 @@
// Bindings are specified as a |BindingNumber| in the BindGroupLayoutDescriptor.
// These numbers may be arbitrary and sparse. Internally, Dawn packs these numbers
// into a packed range of |BindingIndex| integers.
-class BindGroupLayoutBase : public ApiObjectBase,
- public CachedObject,
- public ContentLessObjectCacheable<BindGroupLayoutBase> {
+class BindGroupLayoutInternalBase : public ApiObjectBase,
+ public CachedObject,
+ public ContentLessObjectCacheable<BindGroupLayoutInternalBase> {
public:
- BindGroupLayoutBase(DeviceBase* device,
- const BindGroupLayoutDescriptor* descriptor,
- PipelineCompatibilityToken pipelineCompatibilityToken,
- ApiObjectBase::UntrackedByDeviceTag tag);
- BindGroupLayoutBase(DeviceBase* device,
- const BindGroupLayoutDescriptor* descriptor,
- PipelineCompatibilityToken pipelineCompatibilityToken);
- ~BindGroupLayoutBase() override;
-
- static BindGroupLayoutBase* MakeError(DeviceBase* device, const char* label = nullptr);
+ BindGroupLayoutInternalBase(DeviceBase* device,
+ const BindGroupLayoutDescriptor* descriptor,
+ ApiObjectBase::UntrackedByDeviceTag tag);
+ BindGroupLayoutInternalBase(DeviceBase* device, const BindGroupLayoutDescriptor* descriptor);
+ ~BindGroupLayoutInternalBase() override;
ObjectType GetType() const override;
// A map from the BindingNumber to its packed BindingIndex.
using BindingMap = std::map<BindingNumber, BindingIndex>;
- const BindingInfo& GetBindingInfo(BindingIndex bindingIndex) const {
- ASSERT(!IsError());
- ASSERT(bindingIndex < mBindingInfo.size());
- return mBindingInfo[bindingIndex];
- }
+ const BindingInfo& GetBindingInfo(BindingIndex bindingIndex) const;
const BindingMap& GetBindingMap() const;
bool HasBinding(BindingNumber bindingNumber) const;
BindingIndex GetBindingIndex(BindingNumber bindingNumber) const;
@@ -83,7 +74,8 @@
size_t ComputeContentHash() override;
struct EqualityFunc {
- bool operator()(const BindGroupLayoutBase* a, const BindGroupLayoutBase* b) const;
+ bool operator()(const BindGroupLayoutInternalBase* a,
+ const BindGroupLayoutInternalBase* b) const;
};
BindingIndex GetBindingCount() const;
@@ -104,11 +96,8 @@
uint32_t GetUnexpandedBindingCount() const;
- // Tests that the BindingInfo of two bind groups are equal,
- // ignoring their compatibility groups.
- bool IsLayoutEqual(const BindGroupLayoutBase* other,
- bool excludePipelineCompatibiltyToken = false) const;
- PipelineCompatibilityToken GetPipelineCompatibilityToken() const;
+ // Tests that the BindingInfo of two bind groups are equal.
+ bool IsLayoutEqual(const BindGroupLayoutInternalBase* other) const;
struct BufferBindingData {
uint64_t offset;
@@ -149,7 +138,7 @@
}
private:
- BindGroupLayoutBase(DeviceBase* device, ObjectBase::ErrorTag tag, const char* label);
+ BindGroupLayoutInternalBase(DeviceBase* device, ObjectBase::ErrorTag tag, const char* label);
BindingCounts mBindingCounts = {};
ityp::vector<BindingIndex, BindingInfo> mBindingInfo;
@@ -159,10 +148,85 @@
ExternalTextureBindingExpansionMap mExternalTextureBindingExpansionMap;
+ uint32_t mUnexpandedBindingCount;
+};
+
+// Wrapper passthrough frontend object that is essentially just a Ref to a backing
+// BindGroupLayoutInternalBase and a pipeline compatibility token.
+// TODO(lokokung) Could maybe make this a final class if we update the mock objects.
+class BindGroupLayoutBase : public ApiObjectBase {
+ public:
+ BindGroupLayoutBase(DeviceBase* device,
+ const char* label,
+ Ref<BindGroupLayoutInternalBase> internal,
+ PipelineCompatibilityToken pipelineCompatibilityToken);
+
+ static BindGroupLayoutBase* MakeError(DeviceBase* device, const char* label = nullptr);
+
+ ObjectType GetType() const override;
+
+ // Proxy functions that just call their respective counterparts in the internal layout.
+ const BindingInfo& GetBindingInfo(BindingIndex bindingIndex) const {
+ return mInternalLayout->GetBindingInfo(bindingIndex);
+ }
+ const BindGroupLayoutInternalBase::BindingMap& GetBindingMap() const {
+ return mInternalLayout->GetBindingMap();
+ }
+ bool HasBinding(BindingNumber bindingNumber) const {
+ return mInternalLayout->HasBinding(bindingNumber);
+ }
+ BindingIndex GetBindingIndex(BindingNumber bindingNumber) const {
+ return mInternalLayout->GetBindingIndex(bindingNumber);
+ }
+ BindingIndex GetBindingCount() const { return mInternalLayout->GetBindingCount(); }
+ BindingIndex GetBufferCount() const { return mInternalLayout->GetBufferCount(); }
+ BindingIndex GetDynamicBufferCount() const { return mInternalLayout->GetDynamicBufferCount(); }
+ uint32_t GetUnverifiedBufferCount() const {
+ return mInternalLayout->GetUnverifiedBufferCount();
+ }
+ const BindingCounts& GetBindingCountInfo() const {
+ return mInternalLayout->GetBindingCountInfo();
+ }
+ uint32_t GetExternalTextureBindingCount() const {
+ return mInternalLayout->GetExternalTextureBindingCount();
+ }
+ const ExternalTextureBindingExpansionMap& GetExternalTextureBindingExpansionMap() const {
+ return mInternalLayout->GetExternalTextureBindingExpansionMap();
+ }
+ uint32_t GetUnexpandedBindingCount() const {
+ return mInternalLayout->GetUnexpandedBindingCount();
+ }
+ size_t GetBindingDataSize() const { return mInternalLayout->GetBindingDataSize(); }
+ static constexpr size_t GetBindingDataAlignment() {
+ return BindGroupLayoutInternalBase::GetBindingDataAlignment();
+ }
+ BindGroupLayoutInternalBase::BindingDataPointers ComputeBindingDataPointers(
+ void* dataStart) const {
+ return mInternalLayout->ComputeBindingDataPointers(dataStart);
+ }
+ bool IsStorageBufferBinding(BindingIndex bindingIndex) const {
+ return mInternalLayout->IsStorageBufferBinding(bindingIndex);
+ }
+ std::string EntriesToString() const { return mInternalLayout->EntriesToString(); }
+
+ // Non-proxy functions that are specific to the realized frontend object.
+ BindGroupLayoutInternalBase* GetInternalBindGroupLayout() const;
+ bool IsLayoutEqual(const BindGroupLayoutBase* other,
+ bool excludePipelineCompatibiltyToken = false) const;
+ PipelineCompatibilityToken GetPipelineCompatibilityToken() const {
+ return mPipelineCompatibilityToken;
+ }
+
+ protected:
+ void DestroyImpl() override;
+
+ private:
+ BindGroupLayoutBase(DeviceBase* device, ObjectBase::ErrorTag tag, const char* label);
+
+ const Ref<BindGroupLayoutInternalBase> mInternalLayout;
+
// Non-0 if this BindGroupLayout was created as part of a default PipelineLayout.
const PipelineCompatibilityToken mPipelineCompatibilityToken = PipelineCompatibilityToken(0);
-
- uint32_t mUnexpandedBindingCount;
};
} // namespace dawn::native
diff --git a/src/dawn/native/CommandBufferStateTracker.cpp b/src/dawn/native/CommandBufferStateTracker.cpp
index eae1916..6eb25bd 100644
--- a/src/dawn/native/CommandBufferStateTracker.cpp
+++ b/src/dawn/native/CommandBufferStateTracker.cpp
@@ -510,7 +510,8 @@
for (BindGroupIndex i : IterateBitSet(mLastPipelineLayout->GetBindGroupLayoutsMask())) {
if (mBindgroups[i] == nullptr ||
- mLastPipelineLayout->GetBindGroupLayout(i) != mBindgroups[i]->GetLayout() ||
+ mLastPipelineLayout->GetBindGroupLayout(i)->GetInternalBindGroupLayout() !=
+ mBindgroups[i]->GetLayout()->GetInternalBindGroupLayout() ||
FindFirstUndersizedBuffer(mBindgroups[i]->GetUnverifiedBufferSizes(),
(*mMinBufferSizes)[i])
.has_value()) {
@@ -632,7 +633,8 @@
mBindgroups[i], static_cast<uint32_t>(i), currentBGL, mLastPipeline);
DAWN_INVALID_IF(
- mLastPipelineLayout->GetBindGroupLayout(i) != mBindgroups[i]->GetLayout(),
+ mLastPipelineLayout->GetBindGroupLayout(i)->GetInternalBindGroupLayout() !=
+ mBindgroups[i]->GetLayout()->GetInternalBindGroupLayout(),
"Bind group layout %s of pipeline layout %s does not match layout %s of bind "
"group %s set at group index %u.",
requiredBGL, mLastPipelineLayout, currentBGL, mBindgroups[i],
diff --git a/src/dawn/native/DawnNative.cpp b/src/dawn/native/DawnNative.cpp
index 7a1f008..f2fb809 100644
--- a/src/dawn/native/DawnNative.cpp
+++ b/src/dawn/native/DawnNative.cpp
@@ -309,9 +309,4 @@
return FromAPI(buffer)->GetAllocatedSize();
}
-bool BindGroupLayoutBindingsEqualForTesting(WGPUBindGroupLayout a, WGPUBindGroupLayout b) {
- bool excludePipelineCompatibiltyToken = true;
- return FromAPI(a)->IsLayoutEqual(FromAPI(b), excludePipelineCompatibiltyToken);
-}
-
} // namespace dawn::native
diff --git a/src/dawn/native/Device.cpp b/src/dawn/native/Device.cpp
index b4bad4b..5fdbaf4 100644
--- a/src/dawn/native/Device.cpp
+++ b/src/dawn/native/Device.cpp
@@ -63,7 +63,7 @@
struct DeviceBase::Caches {
ContentLessObjectCache<AttachmentState> attachmentStates;
- ContentLessObjectCache<BindGroupLayoutBase> bindGroupLayouts;
+ ContentLessObjectCache<BindGroupLayoutInternalBase> bindGroupLayouts;
ContentLessObjectCache<ComputePipelineBase> computePipelines;
ContentLessObjectCache<PipelineLayoutBase> pipelineLayouts;
ContentLessObjectCache<RenderPipelineBase> renderPipelines;
@@ -799,20 +799,22 @@
ResultOrError<Ref<BindGroupLayoutBase>> DeviceBase::GetOrCreateBindGroupLayout(
const BindGroupLayoutDescriptor* descriptor,
PipelineCompatibilityToken pipelineCompatibilityToken) {
- BindGroupLayoutBase blueprint(this, descriptor, pipelineCompatibilityToken,
- ApiObjectBase::kUntrackedByDevice);
+ BindGroupLayoutInternalBase blueprint(this, descriptor, ApiObjectBase::kUntrackedByDevice);
const size_t blueprintHash = blueprint.ComputeContentHash();
blueprint.SetContentHash(blueprintHash);
- return GetOrCreate(
- mCaches->bindGroupLayouts, &blueprint, [&]() -> ResultOrError<Ref<BindGroupLayoutBase>> {
- Ref<BindGroupLayoutBase> result;
- DAWN_TRY_ASSIGN(result,
- CreateBindGroupLayoutImpl(descriptor, pipelineCompatibilityToken));
- result->SetContentHash(blueprintHash);
- return result;
- });
+ Ref<BindGroupLayoutInternalBase> internal;
+ DAWN_TRY_ASSIGN(internal, GetOrCreate(mCaches->bindGroupLayouts, &blueprint,
+ [&]() -> ResultOrError<Ref<BindGroupLayoutInternalBase>> {
+ Ref<BindGroupLayoutInternalBase> result;
+ DAWN_TRY_ASSIGN(
+ result, CreateBindGroupLayoutImpl(descriptor));
+ result->SetContentHash(blueprintHash);
+ return result;
+ }));
+ return AcquireRef(
+ new BindGroupLayoutBase(this, descriptor->label, internal, pipelineCompatibilityToken));
}
// Private function used at initialization
diff --git a/src/dawn/native/Device.h b/src/dawn/native/Device.h
index 684c40f..bf337a8 100644
--- a/src/dawn/native/Device.h
+++ b/src/dawn/native/Device.h
@@ -458,9 +458,8 @@
virtual ResultOrError<Ref<BindGroupBase>> CreateBindGroupImpl(
const BindGroupDescriptor* descriptor) = 0;
- virtual ResultOrError<Ref<BindGroupLayoutBase>> CreateBindGroupLayoutImpl(
- const BindGroupLayoutDescriptor* descriptor,
- PipelineCompatibilityToken pipelineCompatibilityToken) = 0;
+ virtual ResultOrError<Ref<BindGroupLayoutInternalBase>> CreateBindGroupLayoutImpl(
+ const BindGroupLayoutDescriptor* descriptor) = 0;
virtual ResultOrError<Ref<BufferBase>> CreateBufferImpl(const BufferDescriptor* descriptor) = 0;
virtual ResultOrError<Ref<ExternalTextureBase>> CreateExternalTextureImpl(
const ExternalTextureDescriptor* descriptor);
diff --git a/src/dawn/native/Forward.h b/src/dawn/native/Forward.h
index bcf07a6..a2529fc 100644
--- a/src/dawn/native/Forward.h
+++ b/src/dawn/native/Forward.h
@@ -29,6 +29,7 @@
class AdapterBase;
class BindGroupBase;
class BindGroupLayoutBase;
+class BindGroupLayoutInternalBase;
class BufferBase;
class ComputePipelineBase;
class CommandBufferBase;
diff --git a/src/dawn/native/PipelineLayout.cpp b/src/dawn/native/PipelineLayout.cpp
index 839efe9..fac4693 100644
--- a/src/dawn/native/PipelineLayout.cpp
+++ b/src/dawn/native/PipelineLayout.cpp
@@ -379,7 +379,7 @@
recorder.Record(mMask);
for (BindGroupIndex group : IterateBitSet(mMask)) {
- recorder.Record(GetBindGroupLayout(group)->GetContentHash());
+ recorder.Record(GetBindGroupLayout(group)->GetInternalBindGroupLayout()->GetContentHash());
}
return recorder.GetContentHash();
diff --git a/src/dawn/native/ShaderModule.cpp b/src/dawn/native/ShaderModule.cpp
index 5502912..bea2d7b 100644
--- a/src/dawn/native/ShaderModule.cpp
+++ b/src/dawn/native/ShaderModule.cpp
@@ -369,7 +369,7 @@
SingleShaderStage entryPointStage,
BindingNumber bindingNumber,
const ShaderBindingInfo& shaderInfo) {
- const BindGroupLayoutBase::BindingMap& layoutBindings = layout->GetBindingMap();
+ const BindGroupLayoutInternalBase::BindingMap& layoutBindings = layout->GetBindingMap();
// An external texture binding found in the shader will later be expanded into multiple
// bindings at compile time. This expansion will have already happened in the bgl - so
diff --git a/src/dawn/native/ToBackend.h b/src/dawn/native/ToBackend.h
index ffc507b..664da57 100644
--- a/src/dawn/native/ToBackend.h
+++ b/src/dawn/native/ToBackend.h
@@ -34,7 +34,7 @@
};
template <typename BackendTraits>
-struct ToBackendTraits<BindGroupLayoutBase, BackendTraits> {
+struct ToBackendTraits<BindGroupLayoutInternalBase, BackendTraits> {
using BackendType = typename BackendTraits::BindGroupLayoutType;
};
diff --git a/src/dawn/native/d3d11/BindGroupD3D11.cpp b/src/dawn/native/d3d11/BindGroupD3D11.cpp
index b3b8640..e2e3f85 100644
--- a/src/dawn/native/d3d11/BindGroupD3D11.cpp
+++ b/src/dawn/native/d3d11/BindGroupD3D11.cpp
@@ -24,7 +24,8 @@
// static
Ref<BindGroup> BindGroup::Create(Device* device, const BindGroupDescriptor* descriptor) {
- return ToBackend(descriptor->layout)->AllocateBindGroup(device, descriptor);
+ return ToBackend(descriptor->layout->GetInternalBindGroupLayout())
+ ->AllocateBindGroup(device, descriptor);
}
BindGroup::BindGroup(Device* device, const BindGroupDescriptor* descriptor)
@@ -34,7 +35,7 @@
void BindGroup::DestroyImpl() {
BindGroupBase::DestroyImpl();
- ToBackend(GetLayout())->DeallocateBindGroup(this);
+ ToBackend(GetLayout()->GetInternalBindGroupLayout())->DeallocateBindGroup(this);
}
} // namespace dawn::native::d3d11
diff --git a/src/dawn/native/d3d11/BindGroupLayoutD3D11.cpp b/src/dawn/native/d3d11/BindGroupLayoutD3D11.cpp
index bd1d8fd..0cfe3c9 100644
--- a/src/dawn/native/d3d11/BindGroupLayoutD3D11.cpp
+++ b/src/dawn/native/d3d11/BindGroupLayoutD3D11.cpp
@@ -20,15 +20,12 @@
ResultOrError<Ref<BindGroupLayout>> BindGroupLayout::Create(
Device* device,
- const BindGroupLayoutDescriptor* descriptor,
- PipelineCompatibilityToken pipelineCompatibilityToken) {
- return AcquireRef(new BindGroupLayout(device, descriptor, pipelineCompatibilityToken));
+ const BindGroupLayoutDescriptor* descriptor) {
+ return AcquireRef(new BindGroupLayout(device, descriptor));
}
-BindGroupLayout::BindGroupLayout(Device* device,
- const BindGroupLayoutDescriptor* descriptor,
- PipelineCompatibilityToken pipelineCompatibilityToken)
- : BindGroupLayoutBase(device, descriptor, pipelineCompatibilityToken),
+BindGroupLayout::BindGroupLayout(Device* device, const BindGroupLayoutDescriptor* descriptor)
+ : BindGroupLayoutInternalBase(device, descriptor),
mBindGroupAllocator(MakeFrontendBindGroupAllocator<BindGroup>(4096)) {}
Ref<BindGroup> BindGroupLayout::AllocateBindGroup(Device* device,
diff --git a/src/dawn/native/d3d11/BindGroupLayoutD3D11.h b/src/dawn/native/d3d11/BindGroupLayoutD3D11.h
index 5f61eef..74ddf96 100644
--- a/src/dawn/native/d3d11/BindGroupLayoutD3D11.h
+++ b/src/dawn/native/d3d11/BindGroupLayoutD3D11.h
@@ -23,20 +23,16 @@
class Device;
-class BindGroupLayout final : public BindGroupLayoutBase {
+class BindGroupLayout final : public BindGroupLayoutInternalBase {
public:
- static ResultOrError<Ref<BindGroupLayout>> Create(
- Device* device,
- const BindGroupLayoutDescriptor* descriptor,
- PipelineCompatibilityToken pipelineCompatibilityToken);
+ static ResultOrError<Ref<BindGroupLayout>> Create(Device* device,
+ const BindGroupLayoutDescriptor* descriptor);
Ref<BindGroup> AllocateBindGroup(Device* device, const BindGroupDescriptor* descriptor);
void DeallocateBindGroup(BindGroup* bindGroup);
private:
- BindGroupLayout(Device* device,
- const BindGroupLayoutDescriptor* descriptor,
- PipelineCompatibilityToken pipelineCompatibilityToken);
+ BindGroupLayout(Device* device, const BindGroupLayoutDescriptor* descriptor);
~BindGroupLayout() override = default;
SlabAllocator<BindGroup> mBindGroupAllocator;
diff --git a/src/dawn/native/d3d11/DeviceD3D11.cpp b/src/dawn/native/d3d11/DeviceD3D11.cpp
index 74a5cd3..7de44ac 100644
--- a/src/dawn/native/d3d11/DeviceD3D11.cpp
+++ b/src/dawn/native/d3d11/DeviceD3D11.cpp
@@ -229,10 +229,9 @@
return BindGroup::Create(this, descriptor);
}
-ResultOrError<Ref<BindGroupLayoutBase>> Device::CreateBindGroupLayoutImpl(
- const BindGroupLayoutDescriptor* descriptor,
- PipelineCompatibilityToken pipelineCompatibilityToken) {
- return BindGroupLayout::Create(this, descriptor, pipelineCompatibilityToken);
+ResultOrError<Ref<BindGroupLayoutInternalBase>> Device::CreateBindGroupLayoutImpl(
+ const BindGroupLayoutDescriptor* descriptor) {
+ return BindGroupLayout::Create(this, descriptor);
}
ResultOrError<Ref<BufferBase>> Device::CreateBufferImpl(const BufferDescriptor* descriptor) {
diff --git a/src/dawn/native/d3d11/DeviceD3D11.h b/src/dawn/native/d3d11/DeviceD3D11.h
index e2d3af9..64366e1 100644
--- a/src/dawn/native/d3d11/DeviceD3D11.h
+++ b/src/dawn/native/d3d11/DeviceD3D11.h
@@ -90,9 +90,8 @@
ResultOrError<Ref<BindGroupBase>> CreateBindGroupImpl(
const BindGroupDescriptor* descriptor) override;
- ResultOrError<Ref<BindGroupLayoutBase>> CreateBindGroupLayoutImpl(
- const BindGroupLayoutDescriptor* descriptor,
- PipelineCompatibilityToken pipelineCompatibilityToken) override;
+ ResultOrError<Ref<BindGroupLayoutInternalBase>> CreateBindGroupLayoutImpl(
+ const BindGroupLayoutDescriptor* descriptor) override;
ResultOrError<Ref<BufferBase>> CreateBufferImpl(const BufferDescriptor* descriptor) override;
ResultOrError<Ref<PipelineLayoutBase>> CreatePipelineLayoutImpl(
const PipelineLayoutDescriptor* descriptor) override;
diff --git a/src/dawn/native/d3d11/ShaderModuleD3D11.cpp b/src/dawn/native/d3d11/ShaderModuleD3D11.cpp
index 8f90985..d1907c0 100644
--- a/src/dawn/native/d3d11/ShaderModuleD3D11.cpp
+++ b/src/dawn/native/d3d11/ShaderModuleD3D11.cpp
@@ -113,7 +113,8 @@
const BindingInfoArray& moduleBindingInfo = entryPoint.bindings;
for (BindGroupIndex group : IterateBitSet(layout->GetBindGroupLayoutsMask())) {
- const BindGroupLayout* groupLayout = ToBackend(layout->GetBindGroupLayout(group));
+ const BindGroupLayout* groupLayout =
+ ToBackend(layout->GetBindGroupLayout(group)->GetInternalBindGroupLayout());
const auto& indices = layout->GetBindingIndexInfo()[group];
const auto& groupBindingInfo = moduleBindingInfo[group];
diff --git a/src/dawn/native/d3d12/BindGroupD3D12.cpp b/src/dawn/native/d3d12/BindGroupD3D12.cpp
index f0f8471..56160cf 100644
--- a/src/dawn/native/d3d12/BindGroupD3D12.cpp
+++ b/src/dawn/native/d3d12/BindGroupD3D12.cpp
@@ -30,7 +30,8 @@
// static
ResultOrError<Ref<BindGroup>> BindGroup::Create(Device* device,
const BindGroupDescriptor* descriptor) {
- return ToBackend(descriptor->layout)->AllocateBindGroup(device, descriptor);
+ return ToBackend(descriptor->layout->GetInternalBindGroupLayout())
+ ->AllocateBindGroup(device, descriptor);
}
BindGroup::BindGroup(Device* device,
@@ -38,7 +39,7 @@
uint32_t viewSizeIncrement,
const CPUDescriptorHeapAllocation& viewAllocation)
: BindGroupBase(this, device, descriptor) {
- BindGroupLayout* bgl = ToBackend(GetLayout());
+ BindGroupLayout* bgl = ToBackend(GetLayout()->GetInternalBindGroupLayout());
mCPUViewAllocation = viewAllocation;
@@ -207,12 +208,13 @@
void BindGroup::DestroyImpl() {
BindGroupBase::DestroyImpl();
- ToBackend(GetLayout())->DeallocateBindGroup(this, &mCPUViewAllocation);
+ ToBackend(GetLayout()->GetInternalBindGroupLayout())
+ ->DeallocateBindGroup(this, &mCPUViewAllocation);
ASSERT(!mCPUViewAllocation.IsValid());
}
bool BindGroup::PopulateViews(ShaderVisibleDescriptorAllocator* viewAllocator) {
- const BindGroupLayout* bgl = ToBackend(GetLayout());
+ const BindGroupLayout* bgl = ToBackend(GetLayout()->GetInternalBindGroupLayout());
const uint32_t descriptorCount = bgl->GetCbvUavSrvDescriptorCount();
if (descriptorCount == 0 || viewAllocator->IsAllocationStillValid(mGPUViewAllocation)) {
diff --git a/src/dawn/native/d3d12/BindGroupLayoutD3D12.cpp b/src/dawn/native/d3d12/BindGroupLayoutD3D12.cpp
index 97f094a..62c66b3 100644
--- a/src/dawn/native/d3d12/BindGroupLayoutD3D12.cpp
+++ b/src/dawn/native/d3d12/BindGroupLayoutD3D12.cpp
@@ -57,17 +57,13 @@
} // anonymous namespace
// static
-Ref<BindGroupLayout> BindGroupLayout::Create(
- Device* device,
- const BindGroupLayoutDescriptor* descriptor,
- PipelineCompatibilityToken pipelineCompatibilityToken) {
- return AcquireRef(new BindGroupLayout(device, descriptor, pipelineCompatibilityToken));
+Ref<BindGroupLayout> BindGroupLayout::Create(Device* device,
+ const BindGroupLayoutDescriptor* descriptor) {
+ return AcquireRef(new BindGroupLayout(device, descriptor));
}
-BindGroupLayout::BindGroupLayout(Device* device,
- const BindGroupLayoutDescriptor* descriptor,
- PipelineCompatibilityToken pipelineCompatibilityToken)
- : BindGroupLayoutBase(device, descriptor, pipelineCompatibilityToken),
+BindGroupLayout::BindGroupLayout(Device* device, const BindGroupLayoutDescriptor* descriptor)
+ : BindGroupLayoutInternalBase(device, descriptor),
mDescriptorHeapOffsets(GetBindingCount()),
mShaderRegisters(GetBindingCount()),
mCbvUavSrvDescriptorCount(0),
diff --git a/src/dawn/native/d3d12/BindGroupLayoutD3D12.h b/src/dawn/native/d3d12/BindGroupLayoutD3D12.h
index 288597f..4d8799b 100644
--- a/src/dawn/native/d3d12/BindGroupLayoutD3D12.h
+++ b/src/dawn/native/d3d12/BindGroupLayoutD3D12.h
@@ -37,11 +37,9 @@
static constexpr uint32_t kRegisterSpacePlaceholder =
D3D12_DRIVER_RESERVED_REGISTER_SPACE_VALUES_START;
-class BindGroupLayout final : public BindGroupLayoutBase {
+class BindGroupLayout final : public BindGroupLayoutInternalBase {
public:
- static Ref<BindGroupLayout> Create(Device* device,
- const BindGroupLayoutDescriptor* descriptor,
- PipelineCompatibilityToken pipelineCompatibilityToken);
+ static Ref<BindGroupLayout> Create(Device* device, const BindGroupLayoutDescriptor* descriptor);
ResultOrError<Ref<BindGroup>> AllocateBindGroup(Device* device,
const BindGroupDescriptor* descriptor);
@@ -63,9 +61,7 @@
const std::vector<D3D12_DESCRIPTOR_RANGE1>& GetSamplerDescriptorRanges() const;
private:
- BindGroupLayout(Device* device,
- const BindGroupLayoutDescriptor* descriptor,
- PipelineCompatibilityToken pipelineCompatibilityToken);
+ BindGroupLayout(Device* device, const BindGroupLayoutDescriptor* descriptor);
~BindGroupLayout() override = default;
// Contains the offset into the descriptor heap for the given resource view. Samplers and
diff --git a/src/dawn/native/d3d12/CommandBufferD3D12.cpp b/src/dawn/native/d3d12/CommandBufferD3D12.cpp
index 6c57af3..8421e9e 100644
--- a/src/dawn/native/d3d12/CommandBufferD3D12.cpp
+++ b/src/dawn/native/d3d12/CommandBufferD3D12.cpp
@@ -548,9 +548,10 @@
return;
}
- const uint32_t cbvUavSrvCount =
- ToBackend(group->GetLayout())->GetCbvUavSrvDescriptorCount();
- const uint32_t samplerCount = ToBackend(group->GetLayout())->GetSamplerDescriptorCount();
+ const uint32_t cbvUavSrvCount = ToBackend(group->GetLayout()->GetInternalBindGroupLayout())
+ ->GetCbvUavSrvDescriptorCount();
+ const uint32_t samplerCount = ToBackend(group->GetLayout()->GetInternalBindGroupLayout())
+ ->GetSamplerDescriptorCount();
if (cbvUavSrvCount > 0) {
uint32_t parameterIndex = pipelineLayout->GetCbvUavSrvRootParameterIndex(index);
diff --git a/src/dawn/native/d3d12/DeviceD3D12.cpp b/src/dawn/native/d3d12/DeviceD3D12.cpp
index 2424692..44ac992 100644
--- a/src/dawn/native/d3d12/DeviceD3D12.cpp
+++ b/src/dawn/native/d3d12/DeviceD3D12.cpp
@@ -392,10 +392,9 @@
const BindGroupDescriptor* descriptor) {
return BindGroup::Create(this, descriptor);
}
-ResultOrError<Ref<BindGroupLayoutBase>> Device::CreateBindGroupLayoutImpl(
- const BindGroupLayoutDescriptor* descriptor,
- PipelineCompatibilityToken pipelineCompatibilityToken) {
- return BindGroupLayout::Create(this, descriptor, pipelineCompatibilityToken);
+ResultOrError<Ref<BindGroupLayoutInternalBase>> Device::CreateBindGroupLayoutImpl(
+ const BindGroupLayoutDescriptor* descriptor) {
+ return BindGroupLayout::Create(this, descriptor);
}
ResultOrError<Ref<BufferBase>> Device::CreateBufferImpl(const BufferDescriptor* descriptor) {
return Buffer::Create(this, descriptor);
diff --git a/src/dawn/native/d3d12/DeviceD3D12.h b/src/dawn/native/d3d12/DeviceD3D12.h
index a2f479e..4d1e3c3 100644
--- a/src/dawn/native/d3d12/DeviceD3D12.h
+++ b/src/dawn/native/d3d12/DeviceD3D12.h
@@ -173,9 +173,8 @@
ResultOrError<Ref<BindGroupBase>> CreateBindGroupImpl(
const BindGroupDescriptor* descriptor) override;
- ResultOrError<Ref<BindGroupLayoutBase>> CreateBindGroupLayoutImpl(
- const BindGroupLayoutDescriptor* descriptor,
- PipelineCompatibilityToken pipelineCompatibilityToken) override;
+ ResultOrError<Ref<BindGroupLayoutInternalBase>> CreateBindGroupLayoutImpl(
+ const BindGroupLayoutDescriptor* descriptor) override;
ResultOrError<Ref<BufferBase>> CreateBufferImpl(const BufferDescriptor* descriptor) override;
ResultOrError<Ref<PipelineLayoutBase>> CreatePipelineLayoutImpl(
const PipelineLayoutDescriptor* descriptor) override;
diff --git a/src/dawn/native/d3d12/PipelineLayoutD3D12.cpp b/src/dawn/native/d3d12/PipelineLayoutD3D12.cpp
index 82912e7..f6a8167 100644
--- a/src/dawn/native/d3d12/PipelineLayoutD3D12.cpp
+++ b/src/dawn/native/d3d12/PipelineLayoutD3D12.cpp
@@ -157,7 +157,8 @@
size_t rangesCount = 0;
for (BindGroupIndex group : IterateBitSet(GetBindGroupLayoutsMask())) {
- const BindGroupLayout* bindGroupLayout = ToBackend(GetBindGroupLayout(group));
+ const BindGroupLayout* bindGroupLayout =
+ ToBackend(GetBindGroupLayout(group)->GetInternalBindGroupLayout());
rangesCount += bindGroupLayout->GetCbvUavSrvDescriptorRanges().size() +
bindGroupLayout->GetSamplerDescriptorRanges().size();
}
@@ -168,7 +169,8 @@
uint32_t rangeIndex = 0;
for (BindGroupIndex group : IterateBitSet(GetBindGroupLayoutsMask())) {
- const BindGroupLayout* bindGroupLayout = ToBackend(GetBindGroupLayout(group));
+ const BindGroupLayout* bindGroupLayout =
+ ToBackend(GetBindGroupLayout(group)->GetInternalBindGroupLayout());
// Set the root descriptor table parameter and copy ranges. Ranges are offset by the
// bind group index Returns whether or not the parameter was set. A root parameter is
diff --git a/src/dawn/native/d3d12/SamplerHeapCacheD3D12.cpp b/src/dawn/native/d3d12/SamplerHeapCacheD3D12.cpp
index f1d12e3..4bbad54 100644
--- a/src/dawn/native/d3d12/SamplerHeapCacheD3D12.cpp
+++ b/src/dawn/native/d3d12/SamplerHeapCacheD3D12.cpp
@@ -91,7 +91,7 @@
ResultOrError<Ref<SamplerHeapCacheEntry>> SamplerHeapCache::GetOrCreate(
const BindGroup* group,
StagingDescriptorAllocator* samplerAllocator) {
- const BindGroupLayout* bgl = ToBackend(group->GetLayout());
+ const BindGroupLayout* bgl = ToBackend(group->GetLayout()->GetInternalBindGroupLayout());
// If a previously created bindgroup used the same samplers, the backing sampler heap
// allocation can be reused. The packed list of samplers acts as the key to lookup the
diff --git a/src/dawn/native/d3d12/ShaderModuleD3D12.cpp b/src/dawn/native/d3d12/ShaderModuleD3D12.cpp
index abde309..6b97e2d 100644
--- a/src/dawn/native/d3d12/ShaderModuleD3D12.cpp
+++ b/src/dawn/native/d3d12/ShaderModuleD3D12.cpp
@@ -131,7 +131,8 @@
const BindingInfoArray& moduleBindingInfo = entryPoint.bindings;
for (BindGroupIndex group : IterateBitSet(layout->GetBindGroupLayoutsMask())) {
- const BindGroupLayout* bgl = ToBackend(layout->GetBindGroupLayout(group));
+ const BindGroupLayout* bgl =
+ ToBackend(layout->GetBindGroupLayout(group)->GetInternalBindGroupLayout());
const auto& moduleGroupBindingInfo = moduleBindingInfo[group];
// d3d12::BindGroupLayout packs the bindings per HLSL register-space. We modify
diff --git a/src/dawn/native/metal/BindGroupLayoutMTL.h b/src/dawn/native/metal/BindGroupLayoutMTL.h
index ab2abef..1126c1a 100644
--- a/src/dawn/native/metal/BindGroupLayoutMTL.h
+++ b/src/dawn/native/metal/BindGroupLayoutMTL.h
@@ -23,19 +23,16 @@
class BindGroup;
class Device;
-class BindGroupLayout final : public BindGroupLayoutBase {
+class BindGroupLayout final : public BindGroupLayoutInternalBase {
public:
static Ref<BindGroupLayout> Create(DeviceBase* device,
- const BindGroupLayoutDescriptor* descriptor,
- PipelineCompatibilityToken pipelineCompatibilityToken);
+ const BindGroupLayoutDescriptor* descriptor);
Ref<BindGroup> AllocateBindGroup(Device* device, const BindGroupDescriptor* descriptor);
void DeallocateBindGroup(BindGroup* bindGroup);
private:
- BindGroupLayout(DeviceBase* device,
- const BindGroupLayoutDescriptor* descriptor,
- PipelineCompatibilityToken pipelineCompatibilityToken);
+ BindGroupLayout(DeviceBase* device, const BindGroupLayoutDescriptor* descriptor);
~BindGroupLayout() override;
SlabAllocator<BindGroup> mBindGroupAllocator;
diff --git a/src/dawn/native/metal/BindGroupLayoutMTL.mm b/src/dawn/native/metal/BindGroupLayoutMTL.mm
index 6c1a7ac..a4f5de9 100644
--- a/src/dawn/native/metal/BindGroupLayoutMTL.mm
+++ b/src/dawn/native/metal/BindGroupLayoutMTL.mm
@@ -19,17 +19,13 @@
namespace dawn::native::metal {
// static
-Ref<BindGroupLayout> BindGroupLayout::Create(
- DeviceBase* device,
- const BindGroupLayoutDescriptor* descriptor,
- PipelineCompatibilityToken pipelineCompatibilityToken) {
- return AcquireRef(new BindGroupLayout(device, descriptor, pipelineCompatibilityToken));
+Ref<BindGroupLayout> BindGroupLayout::Create(DeviceBase* device,
+ const BindGroupLayoutDescriptor* descriptor) {
+ return AcquireRef(new BindGroupLayout(device, descriptor));
}
-BindGroupLayout::BindGroupLayout(DeviceBase* device,
- const BindGroupLayoutDescriptor* descriptor,
- PipelineCompatibilityToken pipelineCompatibilityToken)
- : BindGroupLayoutBase(device, descriptor, pipelineCompatibilityToken),
+BindGroupLayout::BindGroupLayout(DeviceBase* device, const BindGroupLayoutDescriptor* descriptor)
+ : BindGroupLayoutInternalBase(device, descriptor),
mBindGroupAllocator(MakeFrontendBindGroupAllocator<BindGroup>(4096)) {}
BindGroupLayout::~BindGroupLayout() = default;
diff --git a/src/dawn/native/metal/BindGroupMTL.mm b/src/dawn/native/metal/BindGroupMTL.mm
index 90b9e23..73a8adf 100644
--- a/src/dawn/native/metal/BindGroupMTL.mm
+++ b/src/dawn/native/metal/BindGroupMTL.mm
@@ -25,12 +25,13 @@
void BindGroup::DestroyImpl() {
BindGroupBase::DestroyImpl();
- ToBackend(GetLayout())->DeallocateBindGroup(this);
+ ToBackend(GetLayout()->GetInternalBindGroupLayout())->DeallocateBindGroup(this);
}
// static
Ref<BindGroup> BindGroup::Create(Device* device, const BindGroupDescriptor* descriptor) {
- return ToBackend(descriptor->layout)->AllocateBindGroup(device, descriptor);
+ return ToBackend(descriptor->layout->GetInternalBindGroupLayout())
+ ->AllocateBindGroup(device, descriptor);
}
} // namespace dawn::native::metal
diff --git a/src/dawn/native/metal/DeviceMTL.h b/src/dawn/native/metal/DeviceMTL.h
index ea876a0..0e6d84d 100644
--- a/src/dawn/native/metal/DeviceMTL.h
+++ b/src/dawn/native/metal/DeviceMTL.h
@@ -97,9 +97,8 @@
ResultOrError<Ref<BindGroupBase>> CreateBindGroupImpl(
const BindGroupDescriptor* descriptor) override;
- ResultOrError<Ref<BindGroupLayoutBase>> CreateBindGroupLayoutImpl(
- const BindGroupLayoutDescriptor* descriptor,
- PipelineCompatibilityToken pipelineCompatibilityToken) override;
+ ResultOrError<Ref<BindGroupLayoutInternalBase>> CreateBindGroupLayoutImpl(
+ const BindGroupLayoutDescriptor* descriptor) override;
ResultOrError<Ref<BufferBase>> CreateBufferImpl(const BufferDescriptor* descriptor) override;
ResultOrError<Ref<CommandBufferBase>> CreateCommandBuffer(
CommandEncoder* encoder,
diff --git a/src/dawn/native/metal/DeviceMTL.mm b/src/dawn/native/metal/DeviceMTL.mm
index 946babf..494e040 100644
--- a/src/dawn/native/metal/DeviceMTL.mm
+++ b/src/dawn/native/metal/DeviceMTL.mm
@@ -180,10 +180,9 @@
const BindGroupDescriptor* descriptor) {
return BindGroup::Create(this, descriptor);
}
-ResultOrError<Ref<BindGroupLayoutBase>> Device::CreateBindGroupLayoutImpl(
- const BindGroupLayoutDescriptor* descriptor,
- PipelineCompatibilityToken pipelineCompatibilityToken) {
- return BindGroupLayout::Create(this, descriptor, pipelineCompatibilityToken);
+ResultOrError<Ref<BindGroupLayoutInternalBase>> Device::CreateBindGroupLayoutImpl(
+ const BindGroupLayoutDescriptor* descriptor) {
+ return BindGroupLayout::Create(this, descriptor);
}
ResultOrError<Ref<BufferBase>> Device::CreateBufferImpl(const BufferDescriptor* descriptor) {
return Buffer::Create(this, descriptor);
diff --git a/src/dawn/native/metal/ShaderModuleMTL.mm b/src/dawn/native/metal/ShaderModuleMTL.mm
index 889492e..0091d23 100644
--- a/src/dawn/native/metal/ShaderModuleMTL.mm
+++ b/src/dawn/native/metal/ShaderModuleMTL.mm
@@ -123,7 +123,7 @@
arrayLengthFromUniform.ubo_binding = {0, kBufferLengthBufferSlot};
for (BindGroupIndex group : IterateBitSet(layout->GetBindGroupLayoutsMask())) {
- const BindGroupLayoutBase::BindingMap& bindingMap =
+ const BindGroupLayoutInternalBase::BindingMap& bindingMap =
layout->GetBindGroupLayout(group)->GetBindingMap();
for (const auto [bindingNumber, bindingIndex] : bindingMap) {
const BindingInfo& bindingInfo =
diff --git a/src/dawn/native/null/DeviceNull.cpp b/src/dawn/native/null/DeviceNull.cpp
index 89c2b20..9296027 100644
--- a/src/dawn/native/null/DeviceNull.cpp
+++ b/src/dawn/native/null/DeviceNull.cpp
@@ -149,10 +149,9 @@
const BindGroupDescriptor* descriptor) {
return AcquireRef(new BindGroup(this, descriptor));
}
-ResultOrError<Ref<BindGroupLayoutBase>> Device::CreateBindGroupLayoutImpl(
- const BindGroupLayoutDescriptor* descriptor,
- PipelineCompatibilityToken pipelineCompatibilityToken) {
- return AcquireRef(new BindGroupLayout(this, descriptor, pipelineCompatibilityToken));
+ResultOrError<Ref<BindGroupLayoutInternalBase>> Device::CreateBindGroupLayoutImpl(
+ const BindGroupLayoutDescriptor* descriptor) {
+ return AcquireRef(new BindGroupLayout(this, descriptor));
}
ResultOrError<Ref<BufferBase>> Device::CreateBufferImpl(const BufferDescriptor* descriptor) {
DAWN_TRY(IncrementMemoryUsage(descriptor->size));
@@ -312,10 +311,8 @@
// BindGroupLayout
-BindGroupLayout::BindGroupLayout(DeviceBase* device,
- const BindGroupLayoutDescriptor* descriptor,
- PipelineCompatibilityToken pipelineCompatibilityToken)
- : BindGroupLayoutBase(device, descriptor, pipelineCompatibilityToken) {}
+BindGroupLayout::BindGroupLayout(DeviceBase* device, const BindGroupLayoutDescriptor* descriptor)
+ : BindGroupLayoutInternalBase(device, descriptor) {}
// Buffer
diff --git a/src/dawn/native/null/DeviceNull.h b/src/dawn/native/null/DeviceNull.h
index 6cacc8f..3f110ec 100644
--- a/src/dawn/native/null/DeviceNull.h
+++ b/src/dawn/native/null/DeviceNull.h
@@ -131,9 +131,8 @@
ResultOrError<Ref<BindGroupBase>> CreateBindGroupImpl(
const BindGroupDescriptor* descriptor) override;
- ResultOrError<Ref<BindGroupLayoutBase>> CreateBindGroupLayoutImpl(
- const BindGroupLayoutDescriptor* descriptor,
- PipelineCompatibilityToken pipelineCompatibilityToken) override;
+ ResultOrError<Ref<BindGroupLayoutInternalBase>> CreateBindGroupLayoutImpl(
+ const BindGroupLayoutDescriptor* descriptor) override;
ResultOrError<Ref<BufferBase>> CreateBufferImpl(const BufferDescriptor* descriptor) override;
Ref<ComputePipelineBase> CreateUninitializedComputePipelineImpl(
const ComputePipelineDescriptor* descriptor) override;
@@ -222,11 +221,9 @@
~BindGroup() override = default;
};
-class BindGroupLayout final : public BindGroupLayoutBase {
+class BindGroupLayout final : public BindGroupLayoutInternalBase {
public:
- BindGroupLayout(DeviceBase* device,
- const BindGroupLayoutDescriptor* descriptor,
- PipelineCompatibilityToken pipelineCompatibilityToken);
+ BindGroupLayout(DeviceBase* device, const BindGroupLayoutDescriptor* descriptor);
private:
~BindGroupLayout() override = default;
diff --git a/src/dawn/native/opengl/BindGroupGL.cpp b/src/dawn/native/opengl/BindGroupGL.cpp
index a688c2e..147138b 100644
--- a/src/dawn/native/opengl/BindGroupGL.cpp
+++ b/src/dawn/native/opengl/BindGroupGL.cpp
@@ -21,7 +21,7 @@
namespace dawn::native::opengl {
MaybeError ValidateGLBindGroupDescriptor(const BindGroupDescriptor* descriptor) {
- const BindGroupLayoutBase::BindingMap& bindingMap = descriptor->layout->GetBindingMap();
+ const BindGroupLayoutInternalBase::BindingMap& bindingMap = descriptor->layout->GetBindingMap();
for (uint32_t i = 0; i < descriptor->entryCount; ++i) {
const BindGroupEntry& entry = descriptor->entries[i];
@@ -53,12 +53,13 @@
void BindGroup::DestroyImpl() {
BindGroupBase::DestroyImpl();
- ToBackend(GetLayout())->DeallocateBindGroup(this);
+ ToBackend(GetLayout()->GetInternalBindGroupLayout())->DeallocateBindGroup(this);
}
// static
Ref<BindGroup> BindGroup::Create(Device* device, const BindGroupDescriptor* descriptor) {
- return ToBackend(descriptor->layout)->AllocateBindGroup(device, descriptor);
+ return ToBackend(descriptor->layout->GetInternalBindGroupLayout())
+ ->AllocateBindGroup(device, descriptor);
}
} // namespace dawn::native::opengl
diff --git a/src/dawn/native/opengl/BindGroupLayoutGL.cpp b/src/dawn/native/opengl/BindGroupLayoutGL.cpp
index b665d17..c0eb56d 100644
--- a/src/dawn/native/opengl/BindGroupLayoutGL.cpp
+++ b/src/dawn/native/opengl/BindGroupLayoutGL.cpp
@@ -16,10 +16,8 @@
namespace dawn::native::opengl {
-BindGroupLayout::BindGroupLayout(DeviceBase* device,
- const BindGroupLayoutDescriptor* descriptor,
- PipelineCompatibilityToken pipelineCompatibilityToken)
- : BindGroupLayoutBase(device, descriptor, pipelineCompatibilityToken),
+BindGroupLayout::BindGroupLayout(DeviceBase* device, const BindGroupLayoutDescriptor* descriptor)
+ : BindGroupLayoutInternalBase(device, descriptor),
mBindGroupAllocator(MakeFrontendBindGroupAllocator<BindGroup>(4096)) {}
Ref<BindGroup> BindGroupLayout::AllocateBindGroup(Device* device,
diff --git a/src/dawn/native/opengl/BindGroupLayoutGL.h b/src/dawn/native/opengl/BindGroupLayoutGL.h
index 136b16f..18b1d4e 100644
--- a/src/dawn/native/opengl/BindGroupLayoutGL.h
+++ b/src/dawn/native/opengl/BindGroupLayoutGL.h
@@ -23,11 +23,9 @@
class Device;
-class BindGroupLayout final : public BindGroupLayoutBase {
+class BindGroupLayout final : public BindGroupLayoutInternalBase {
public:
- BindGroupLayout(DeviceBase* device,
- const BindGroupLayoutDescriptor* descriptor,
- PipelineCompatibilityToken pipelineCompatibilityToken);
+ BindGroupLayout(DeviceBase* device, const BindGroupLayoutDescriptor* descriptor);
Ref<BindGroup> AllocateBindGroup(Device* device, const BindGroupDescriptor* descriptor);
void DeallocateBindGroup(BindGroup* bindGroup);
diff --git a/src/dawn/native/opengl/DeviceGL.cpp b/src/dawn/native/opengl/DeviceGL.cpp
index 35f8dd3..1e59ed3 100644
--- a/src/dawn/native/opengl/DeviceGL.cpp
+++ b/src/dawn/native/opengl/DeviceGL.cpp
@@ -201,10 +201,9 @@
DAWN_TRY(ValidateGLBindGroupDescriptor(descriptor));
return BindGroup::Create(this, descriptor);
}
-ResultOrError<Ref<BindGroupLayoutBase>> Device::CreateBindGroupLayoutImpl(
- const BindGroupLayoutDescriptor* descriptor,
- PipelineCompatibilityToken pipelineCompatibilityToken) {
- return AcquireRef(new BindGroupLayout(this, descriptor, pipelineCompatibilityToken));
+ResultOrError<Ref<BindGroupLayoutInternalBase>> Device::CreateBindGroupLayoutImpl(
+ const BindGroupLayoutDescriptor* descriptor) {
+ return AcquireRef(new BindGroupLayout(this, descriptor));
}
ResultOrError<Ref<BufferBase>> Device::CreateBufferImpl(const BufferDescriptor* descriptor) {
return AcquireRef(new Buffer(this, descriptor));
diff --git a/src/dawn/native/opengl/DeviceGL.h b/src/dawn/native/opengl/DeviceGL.h
index c020877..2be89e1 100644
--- a/src/dawn/native/opengl/DeviceGL.h
+++ b/src/dawn/native/opengl/DeviceGL.h
@@ -99,9 +99,8 @@
ResultOrError<Ref<BindGroupBase>> CreateBindGroupImpl(
const BindGroupDescriptor* descriptor) override;
- ResultOrError<Ref<BindGroupLayoutBase>> CreateBindGroupLayoutImpl(
- const BindGroupLayoutDescriptor* descriptor,
- PipelineCompatibilityToken pipelineCompatibilityToken) override;
+ ResultOrError<Ref<BindGroupLayoutInternalBase>> CreateBindGroupLayoutImpl(
+ const BindGroupLayoutDescriptor* descriptor) override;
ResultOrError<Ref<BufferBase>> CreateBufferImpl(const BufferDescriptor* descriptor) override;
ResultOrError<Ref<PipelineLayoutBase>> CreatePipelineLayoutImpl(
const PipelineLayoutDescriptor* descriptor) override;
diff --git a/src/dawn/native/vulkan/BindGroupLayoutVk.cpp b/src/dawn/native/vulkan/BindGroupLayoutVk.cpp
index 94b5a7d..03fdf56 100644
--- a/src/dawn/native/vulkan/BindGroupLayoutVk.cpp
+++ b/src/dawn/native/vulkan/BindGroupLayoutVk.cpp
@@ -81,10 +81,8 @@
// static
ResultOrError<Ref<BindGroupLayout>> BindGroupLayout::Create(
Device* device,
- const BindGroupLayoutDescriptor* descriptor,
- PipelineCompatibilityToken pipelineCompatibilityToken) {
- Ref<BindGroupLayout> bgl =
- AcquireRef(new BindGroupLayout(device, descriptor, pipelineCompatibilityToken));
+ const BindGroupLayoutDescriptor* descriptor) {
+ Ref<BindGroupLayout> bgl = AcquireRef(new BindGroupLayout(device, descriptor));
DAWN_TRY(bgl->Initialize());
return bgl;
}
@@ -144,16 +142,14 @@
return {};
}
-BindGroupLayout::BindGroupLayout(DeviceBase* device,
- const BindGroupLayoutDescriptor* descriptor,
- PipelineCompatibilityToken pipelineCompatibilityToken)
- : BindGroupLayoutBase(device, descriptor, pipelineCompatibilityToken),
+BindGroupLayout::BindGroupLayout(DeviceBase* device, const BindGroupLayoutDescriptor* descriptor)
+ : BindGroupLayoutInternalBase(device, descriptor),
mBindGroupAllocator(MakeFrontendBindGroupAllocator<BindGroup>(4096)) {}
BindGroupLayout::~BindGroupLayout() = default;
void BindGroupLayout::DestroyImpl() {
- BindGroupLayoutBase::DestroyImpl();
+ BindGroupLayoutInternalBase::DestroyImpl();
Device* device = ToBackend(GetDevice());
diff --git a/src/dawn/native/vulkan/BindGroupLayoutVk.h b/src/dawn/native/vulkan/BindGroupLayoutVk.h
index 924e121..f78903a 100644
--- a/src/dawn/native/vulkan/BindGroupLayoutVk.h
+++ b/src/dawn/native/vulkan/BindGroupLayoutVk.h
@@ -47,16 +47,12 @@
// the pools are reused when no longer used. Minimizing the number of descriptor pool allocation
// is important because creating them can incur GPU memory allocation which is usually an
// expensive syscall.
-class BindGroupLayout final : public BindGroupLayoutBase {
+class BindGroupLayout final : public BindGroupLayoutInternalBase {
public:
- static ResultOrError<Ref<BindGroupLayout>> Create(
- Device* device,
- const BindGroupLayoutDescriptor* descriptor,
- PipelineCompatibilityToken pipelineCompatibilityToken);
+ static ResultOrError<Ref<BindGroupLayout>> Create(Device* device,
+ const BindGroupLayoutDescriptor* descriptor);
- BindGroupLayout(DeviceBase* device,
- const BindGroupLayoutDescriptor* descriptor,
- PipelineCompatibilityToken pipelineCompatibilityToken);
+ BindGroupLayout(DeviceBase* device, const BindGroupLayoutDescriptor* descriptor);
VkDescriptorSetLayout GetHandle() const;
diff --git a/src/dawn/native/vulkan/BindGroupVk.cpp b/src/dawn/native/vulkan/BindGroupVk.cpp
index e4547fc..fe2f4f0 100644
--- a/src/dawn/native/vulkan/BindGroupVk.cpp
+++ b/src/dawn/native/vulkan/BindGroupVk.cpp
@@ -31,7 +31,8 @@
// static
ResultOrError<Ref<BindGroup>> BindGroup::Create(Device* device,
const BindGroupDescriptor* descriptor) {
- return ToBackend(descriptor->layout)->AllocateBindGroup(device, descriptor);
+ return ToBackend(descriptor->layout->GetInternalBindGroupLayout())
+ ->AllocateBindGroup(device, descriptor);
}
BindGroup::BindGroup(Device* device,
@@ -152,7 +153,8 @@
void BindGroup::DestroyImpl() {
BindGroupBase::DestroyImpl();
- ToBackend(GetLayout())->DeallocateBindGroup(this, &mDescriptorSetAllocation);
+ ToBackend(GetLayout()->GetInternalBindGroupLayout())
+ ->DeallocateBindGroup(this, &mDescriptorSetAllocation);
}
VkDescriptorSet BindGroup::GetHandle() const {
diff --git a/src/dawn/native/vulkan/DeviceVk.cpp b/src/dawn/native/vulkan/DeviceVk.cpp
index 399e114..da45500 100644
--- a/src/dawn/native/vulkan/DeviceVk.cpp
+++ b/src/dawn/native/vulkan/DeviceVk.cpp
@@ -154,10 +154,9 @@
const BindGroupDescriptor* descriptor) {
return BindGroup::Create(this, descriptor);
}
-ResultOrError<Ref<BindGroupLayoutBase>> Device::CreateBindGroupLayoutImpl(
- const BindGroupLayoutDescriptor* descriptor,
- PipelineCompatibilityToken pipelineCompatibilityToken) {
- return BindGroupLayout::Create(this, descriptor, pipelineCompatibilityToken);
+ResultOrError<Ref<BindGroupLayoutInternalBase>> Device::CreateBindGroupLayoutImpl(
+ const BindGroupLayoutDescriptor* descriptor) {
+ return BindGroupLayout::Create(this, descriptor);
}
ResultOrError<Ref<BufferBase>> Device::CreateBufferImpl(const BufferDescriptor* descriptor) {
return Buffer::Create(this, descriptor);
diff --git a/src/dawn/native/vulkan/DeviceVk.h b/src/dawn/native/vulkan/DeviceVk.h
index 7117d9c..ef716f6 100644
--- a/src/dawn/native/vulkan/DeviceVk.h
+++ b/src/dawn/native/vulkan/DeviceVk.h
@@ -124,9 +124,8 @@
ResultOrError<Ref<BindGroupBase>> CreateBindGroupImpl(
const BindGroupDescriptor* descriptor) override;
- ResultOrError<Ref<BindGroupLayoutBase>> CreateBindGroupLayoutImpl(
- const BindGroupLayoutDescriptor* descriptor,
- PipelineCompatibilityToken pipelineCompatibilityToken) override;
+ ResultOrError<Ref<BindGroupLayoutInternalBase>> CreateBindGroupLayoutImpl(
+ const BindGroupLayoutDescriptor* descriptor) override;
ResultOrError<Ref<BufferBase>> CreateBufferImpl(const BufferDescriptor* descriptor) override;
ResultOrError<Ref<PipelineLayoutBase>> CreatePipelineLayoutImpl(
const PipelineLayoutDescriptor* descriptor) override;
diff --git a/src/dawn/native/vulkan/PipelineLayoutVk.cpp b/src/dawn/native/vulkan/PipelineLayoutVk.cpp
index 69b0d23..7bbba52 100644
--- a/src/dawn/native/vulkan/PipelineLayoutVk.cpp
+++ b/src/dawn/native/vulkan/PipelineLayoutVk.cpp
@@ -40,7 +40,8 @@
std::array<VkDescriptorSetLayout, kMaxBindGroups> setLayouts;
std::array<const CachedObject*, kMaxBindGroups> cachedObjects;
for (BindGroupIndex setIndex : IterateBitSet(GetBindGroupLayoutsMask())) {
- const BindGroupLayoutBase* bindGroupLayout = GetBindGroupLayout(setIndex);
+ const BindGroupLayoutInternalBase* bindGroupLayout =
+ GetBindGroupLayout(setIndex)->GetInternalBindGroupLayout();
setLayouts[numSetLayouts] = ToBackend(bindGroupLayout)->GetHandle();
cachedObjects[numSetLayouts] = bindGroupLayout;
numSetLayouts++;
diff --git a/src/dawn/native/vulkan/ShaderModuleVk.cpp b/src/dawn/native/vulkan/ShaderModuleVk.cpp
index 2fe207b..e5fe7c9 100644
--- a/src/dawn/native/vulkan/ShaderModuleVk.cpp
+++ b/src/dawn/native/vulkan/ShaderModuleVk.cpp
@@ -215,7 +215,8 @@
GetEntryPoint(programmableStage.entryPoint.c_str()).bindings;
for (BindGroupIndex group : IterateBitSet(layout->GetBindGroupLayoutsMask())) {
- const BindGroupLayout* bgl = ToBackend(layout->GetBindGroupLayout(group));
+ const BindGroupLayout* bgl =
+ ToBackend(layout->GetBindGroupLayout(group)->GetInternalBindGroupLayout());
const auto& groupBindingInfo = moduleBindingInfo[group];
for (const auto& [binding, _] : groupBindingInfo) {
BindingIndex bindingIndex = bgl->GetBindingIndex(binding);
diff --git a/src/dawn/tests/unittests/native/DestroyObjectTests.cpp b/src/dawn/tests/unittests/native/DestroyObjectTests.cpp
index 3bc14e5..de22766 100644
--- a/src/dawn/tests/unittests/native/DestroyObjectTests.cpp
+++ b/src/dawn/tests/unittests/native/DestroyObjectTests.cpp
@@ -89,7 +89,7 @@
TEST_F(DestroyObjectTests, BindGroupNativeExplicit) {
BindGroupDescriptor desc = {};
- desc.layout = mDeviceMock->GetEmptyBindGroupLayoutMock();
+ desc.layout = mDeviceMock->GetEmptyBindGroupLayout();
desc.entryCount = 0;
desc.entries = nullptr;
@@ -105,7 +105,7 @@
// will also complain if there is a memory leak.
TEST_F(DestroyObjectTests, BindGroupImplicit) {
BindGroupDescriptor desc = {};
- desc.layout = mDeviceMock->GetEmptyBindGroupLayoutMock();
+ desc.layout = mDeviceMock->GetEmptyBindGroupLayout();
desc.entryCount = 0;
desc.entries = nullptr;
@@ -447,7 +447,7 @@
TEST_F(DestroyObjectTests, PipelineLayoutNativeExplicit) {
PipelineLayoutDescriptor desc = {};
std::vector<BindGroupLayoutBase*> bindGroupLayouts;
- bindGroupLayouts.push_back(mDeviceMock->GetEmptyBindGroupLayoutMock());
+ bindGroupLayouts.push_back(mDeviceMock->GetEmptyBindGroupLayout());
desc.bindGroupLayoutCount = bindGroupLayouts.size();
desc.bindGroupLayouts = bindGroupLayouts.data();
@@ -465,7 +465,7 @@
TEST_F(DestroyObjectTests, PipelineLayoutImplicit) {
PipelineLayoutDescriptor desc = {};
std::vector<BindGroupLayoutBase*> bindGroupLayouts;
- bindGroupLayouts.push_back(mDeviceMock->GetEmptyBindGroupLayoutMock());
+ bindGroupLayouts.push_back(mDeviceMock->GetEmptyBindGroupLayout());
desc.bindGroupLayoutCount = bindGroupLayouts.size();
desc.bindGroupLayouts = bindGroupLayouts.data();
@@ -779,7 +779,7 @@
wgpu::BindGroup bindGroup;
{
BindGroupDescriptor desc = {};
- desc.layout = mDeviceMock->GetEmptyBindGroupLayoutMock();
+ desc.layout = mDeviceMock->GetEmptyBindGroupLayout();
desc.entryCount = 0;
desc.entries = nullptr;
@@ -884,7 +884,7 @@
{
PipelineLayoutDescriptor desc = {};
std::vector<BindGroupLayoutBase*> bindGroupLayouts;
- bindGroupLayouts.push_back(mDeviceMock->GetEmptyBindGroupLayoutMock());
+ bindGroupLayouts.push_back(mDeviceMock->GetEmptyBindGroupLayout());
desc.bindGroupLayoutCount = bindGroupLayouts.size();
desc.bindGroupLayouts = bindGroupLayouts.data();
diff --git a/src/dawn/tests/unittests/native/mocks/BindGroupLayoutMock.cpp b/src/dawn/tests/unittests/native/mocks/BindGroupLayoutMock.cpp
index b4b4173..55a8e27 100644
--- a/src/dawn/tests/unittests/native/mocks/BindGroupLayoutMock.cpp
+++ b/src/dawn/tests/unittests/native/mocks/BindGroupLayoutMock.cpp
@@ -17,10 +17,11 @@
namespace dawn::native {
BindGroupLayoutMock::BindGroupLayoutMock(DeviceMock* device,
- const BindGroupLayoutDescriptor* descriptor,
- PipelineCompatibilityToken pipelineCompatibilityToken)
- : BindGroupLayoutBase(device, descriptor, pipelineCompatibilityToken) {
- ON_CALL(*this, DestroyImpl).WillByDefault([this] { this->BindGroupLayoutBase::DestroyImpl(); });
+ const BindGroupLayoutDescriptor* descriptor)
+ : BindGroupLayoutInternalBase(device, descriptor) {
+ ON_CALL(*this, DestroyImpl).WillByDefault([this] {
+ this->BindGroupLayoutInternalBase::DestroyImpl();
+ });
SetContentHash(ComputeContentHash());
}
diff --git a/src/dawn/tests/unittests/native/mocks/BindGroupLayoutMock.h b/src/dawn/tests/unittests/native/mocks/BindGroupLayoutMock.h
index cc38952..b349223 100644
--- a/src/dawn/tests/unittests/native/mocks/BindGroupLayoutMock.h
+++ b/src/dawn/tests/unittests/native/mocks/BindGroupLayoutMock.h
@@ -22,12 +22,9 @@
namespace dawn::native {
-class BindGroupLayoutMock : public BindGroupLayoutBase {
+class BindGroupLayoutMock : public BindGroupLayoutInternalBase {
public:
- BindGroupLayoutMock(
- DeviceMock* device,
- const BindGroupLayoutDescriptor* descriptor,
- PipelineCompatibilityToken pipelineCompatibilityToken = PipelineCompatibilityToken(0));
+ BindGroupLayoutMock(DeviceMock* device, const BindGroupLayoutDescriptor* descriptor);
~BindGroupLayoutMock() override;
MOCK_METHOD(void, DestroyImpl, (), (override));
diff --git a/src/dawn/tests/unittests/native/mocks/DeviceMock.cpp b/src/dawn/tests/unittests/native/mocks/DeviceMock.cpp
index 548e8a8..62c4ccb 100644
--- a/src/dawn/tests/unittests/native/mocks/DeviceMock.cpp
+++ b/src/dawn/tests/unittests/native/mocks/DeviceMock.cpp
@@ -43,11 +43,9 @@
return AcquireRef(new NiceMock<BindGroupMock>(this, descriptor));
}));
ON_CALL(*this, CreateBindGroupLayoutImpl)
- .WillByDefault(WithArgs<0, 1>([this](const BindGroupLayoutDescriptor* descriptor,
- PipelineCompatibilityToken pipelineCompatibilityToken)
- -> ResultOrError<Ref<BindGroupLayoutBase>> {
- return AcquireRef(
- new NiceMock<BindGroupLayoutMock>(this, descriptor, pipelineCompatibilityToken));
+ .WillByDefault(WithArgs<0>([this](const BindGroupLayoutDescriptor* descriptor)
+ -> ResultOrError<Ref<BindGroupLayoutInternalBase>> {
+ return AcquireRef(new NiceMock<BindGroupLayoutMock>(this, descriptor));
}));
ON_CALL(*this, CreateBufferImpl)
.WillByDefault(WithArgs<0>(
@@ -125,8 +123,4 @@
return reinterpret_cast<QueueMock*>(GetQueue());
}
-BindGroupLayoutMock* DeviceMock::GetEmptyBindGroupLayoutMock() {
- return reinterpret_cast<BindGroupLayoutMock*>(GetEmptyBindGroupLayout());
-}
-
} // namespace dawn::native
diff --git a/src/dawn/tests/unittests/native/mocks/DeviceMock.h b/src/dawn/tests/unittests/native/mocks/DeviceMock.h
index 76e9475..348f9a3 100644
--- a/src/dawn/tests/unittests/native/mocks/DeviceMock.h
+++ b/src/dawn/tests/unittests/native/mocks/DeviceMock.h
@@ -44,7 +44,6 @@
// Mock specific functionality.
QueueMock* GetQueueMock();
- BindGroupLayoutMock* GetEmptyBindGroupLayoutMock();
MOCK_METHOD(ResultOrError<Ref<CommandBufferBase>>,
CreateCommandBuffer,
@@ -70,9 +69,9 @@
CreateBindGroupImpl,
(const BindGroupDescriptor*),
(override));
- MOCK_METHOD(ResultOrError<Ref<BindGroupLayoutBase>>,
+ MOCK_METHOD(ResultOrError<Ref<BindGroupLayoutInternalBase>>,
CreateBindGroupLayoutImpl,
- (const BindGroupLayoutDescriptor*, PipelineCompatibilityToken),
+ (const BindGroupLayoutDescriptor*),
(override));
MOCK_METHOD(ResultOrError<Ref<BufferBase>>,
CreateBufferImpl,
diff --git a/src/dawn/tests/unittests/validation/GetBindGroupLayoutValidationTests.cpp b/src/dawn/tests/unittests/validation/GetBindGroupLayoutValidationTests.cpp
index 74662fd..1004938 100644
--- a/src/dawn/tests/unittests/validation/GetBindGroupLayoutValidationTests.cpp
+++ b/src/dawn/tests/unittests/validation/GetBindGroupLayoutValidationTests.cpp
@@ -14,12 +14,15 @@
#include "dawn/tests/unittests/validation/ValidationTest.h"
+#include "dawn/native/BindGroupLayout.h"
#include "dawn/utils/ComboRenderPipelineDescriptor.h"
#include "dawn/utils/WGPUHelpers.h"
namespace dawn {
namespace {
+using testing::Not;
+
class GetBindGroupLayoutTests : public ValidationTest {
protected:
wgpu::RenderPipeline RenderPipelineFromFragmentShader(const char* shader) {
@@ -42,10 +45,7 @@
// Test that GetBindGroupLayout returns the same object for the same index
// and for matching layouts.
-TEST_F(GetBindGroupLayoutTests, SameObject) {
- // This test works assuming Dawn Native's object deduplication.
- // Getting the same pointer to equivalent bind group layouts is an implementation detail of Dawn
- // Native.
+TEST_F(GetBindGroupLayoutTests, EquivalentBGLs) {
DAWN_SKIP_TEST_IF(UsesWire());
wgpu::ShaderModule vsModule = utils::CreateShaderModule(device, R"(
@@ -85,17 +85,19 @@
wgpu::RenderPipeline pipeline = device.CreateRenderPipeline(&descriptor);
- // The same value is returned for the same index.
- EXPECT_EQ(pipeline.GetBindGroupLayout(0).Get(), pipeline.GetBindGroupLayout(0).Get());
+ // A fully equivalent layout is returned for the same index.
+ EXPECT_THAT(pipeline.GetBindGroupLayout(0), BindGroupLayoutEq(pipeline.GetBindGroupLayout(0)));
- // Matching bind group layouts at different indices are the same object.
- EXPECT_EQ(pipeline.GetBindGroupLayout(0).Get(), pipeline.GetBindGroupLayout(1).Get());
+ // Matching bind group layouts at different indices are fully equivalent.
+ EXPECT_THAT(pipeline.GetBindGroupLayout(0), BindGroupLayoutEq(pipeline.GetBindGroupLayout(1)));
- // BGLs with different bindings types are different objects.
- EXPECT_NE(pipeline.GetBindGroupLayout(2).Get(), pipeline.GetBindGroupLayout(3).Get());
+ // BGLs with different bindings types are different.
+ EXPECT_THAT(pipeline.GetBindGroupLayout(2),
+ Not(BindGroupLayoutEq(pipeline.GetBindGroupLayout(3))));
- // BGLs with different visibilities are different objects.
- EXPECT_NE(pipeline.GetBindGroupLayout(0).Get(), pipeline.GetBindGroupLayout(2).Get());
+ // BGLs with different visibilities are different.
+ EXPECT_THAT(pipeline.GetBindGroupLayout(0),
+ Not(BindGroupLayoutEq(pipeline.GetBindGroupLayout(2))));
}
// Test that default BindGroupLayouts cannot be used in the creation of a new PipelineLayout
@@ -117,9 +119,6 @@
// - shader stage visibility is the stage that adds the binding.
// - dynamic offsets is false
TEST_F(GetBindGroupLayoutTests, DefaultShaderStageAndDynamicOffsets) {
- // This test works assuming Dawn Native's object deduplication.
- // Getting the same pointer to equivalent bind group layouts is an implementation detail of Dawn
- // Native.
DAWN_SKIP_TEST_IF(UsesWire());
wgpu::RenderPipeline pipeline = RenderPipelineFromFragmentShader(R"(
@@ -141,29 +140,33 @@
desc.entryCount = 1;
desc.entries = &binding;
- // Check that an otherwise compatible bind group layout doesn't match one created as part of a
- // default pipeline layout.
- binding.buffer.hasDynamicOffset = false;
- binding.visibility = wgpu::ShaderStage::Fragment;
- EXPECT_NE(device.CreateBindGroupLayout(&desc).Get(), pipeline.GetBindGroupLayout(0).Get());
+ // Check that an otherwise compatible bind group layout is not fully equivalent to one created
+ // as part of a default pipeline layout, but cache equivalent.
+ {
+ binding.buffer.hasDynamicOffset = false;
+ binding.visibility = wgpu::ShaderStage::Fragment;
+ wgpu::BindGroupLayout bgl = device.CreateBindGroupLayout(&desc);
+ EXPECT_THAT(bgl, BindGroupLayoutCacheEq(pipeline.GetBindGroupLayout(0)));
+ EXPECT_THAT(bgl, Not(BindGroupLayoutEq(pipeline.GetBindGroupLayout(0))));
+ }
// Check that any change in visibility doesn't match.
binding.visibility = wgpu::ShaderStage::Vertex;
- EXPECT_NE(device.CreateBindGroupLayout(&desc).Get(), pipeline.GetBindGroupLayout(0).Get());
+ EXPECT_THAT(device.CreateBindGroupLayout(&desc),
+ Not(BindGroupLayoutEq(pipeline.GetBindGroupLayout(0))));
binding.visibility = wgpu::ShaderStage::Compute;
- EXPECT_NE(device.CreateBindGroupLayout(&desc).Get(), pipeline.GetBindGroupLayout(0).Get());
+ EXPECT_THAT(device.CreateBindGroupLayout(&desc),
+ Not(BindGroupLayoutEq(pipeline.GetBindGroupLayout(0))));
// Check that any change in hasDynamicOffsets doesn't match.
binding.buffer.hasDynamicOffset = true;
binding.visibility = wgpu::ShaderStage::Fragment;
- EXPECT_NE(device.CreateBindGroupLayout(&desc).Get(), pipeline.GetBindGroupLayout(0).Get());
+ EXPECT_THAT(device.CreateBindGroupLayout(&desc),
+ Not(BindGroupLayoutEq(pipeline.GetBindGroupLayout(0))));
}
TEST_F(GetBindGroupLayoutTests, DefaultTextureSampleType) {
- // This test works assuming Dawn Native's object deduplication.
- // Getting the same pointer to equivalent bind group layouts is an implementation detail of Dawn
- // Native.
DAWN_SKIP_TEST_IF(UsesWire());
wgpu::BindGroupLayout filteringBGL = utils::MakeBindGroupLayout(
@@ -237,59 +240,57 @@
};
// Textures not used default to non-filtering
- EXPECT_TRUE(native::BindGroupLayoutBindingsEqualForTesting(
- BGLFromModules(emptyVertexModule, unusedTextureFragmentModule).Get(),
- nonFilteringBGL.Get()));
- EXPECT_FALSE(native::BindGroupLayoutBindingsEqualForTesting(
- BGLFromModules(emptyVertexModule, unusedTextureFragmentModule).Get(), filteringBGL.Get()));
+ {
+ wgpu::BindGroupLayout bgl = BGLFromModules(emptyVertexModule, unusedTextureFragmentModule);
+ EXPECT_THAT(bgl, BindGroupLayoutCacheEq(nonFilteringBGL));
+ EXPECT_THAT(bgl, Not(BindGroupLayoutCacheEq(filteringBGL)));
+ }
// Textures used with textureLoad default to non-filtering
- EXPECT_TRUE(native::BindGroupLayoutBindingsEqualForTesting(
- BGLFromModules(emptyVertexModule, textureLoadFragmentModule).Get(), nonFilteringBGL.Get()));
- EXPECT_FALSE(native::BindGroupLayoutBindingsEqualForTesting(
- BGLFromModules(emptyVertexModule, textureLoadFragmentModule).Get(), filteringBGL.Get()));
+ {
+ wgpu::BindGroupLayout bgl = BGLFromModules(emptyVertexModule, textureLoadFragmentModule);
+ EXPECT_THAT(bgl, BindGroupLayoutCacheEq(nonFilteringBGL));
+ EXPECT_THAT(bgl, Not(BindGroupLayoutCacheEq(filteringBGL)));
+ }
// Textures used with textureLoad on both stages default to non-filtering
- EXPECT_TRUE(native::BindGroupLayoutBindingsEqualForTesting(
- BGLFromModules(textureLoadVertexModule, textureLoadFragmentModule).Get(),
- nonFilteringBGL.Get()));
- EXPECT_FALSE(native::BindGroupLayoutBindingsEqualForTesting(
- BGLFromModules(textureLoadVertexModule, textureLoadFragmentModule).Get(),
- filteringBGL.Get()));
+ {
+ wgpu::BindGroupLayout bgl =
+ BGLFromModules(textureLoadVertexModule, textureLoadFragmentModule);
+ EXPECT_THAT(bgl, BindGroupLayoutCacheEq(nonFilteringBGL));
+ EXPECT_THAT(bgl, Not(BindGroupLayoutCacheEq(filteringBGL)));
+ }
// Textures used with textureSample default to filtering
- EXPECT_FALSE(native::BindGroupLayoutBindingsEqualForTesting(
- BGLFromModules(emptyVertexModule, textureSampleFragmentModule).Get(),
- nonFilteringBGL.Get()));
- EXPECT_TRUE(native::BindGroupLayoutBindingsEqualForTesting(
- BGLFromModules(emptyVertexModule, textureSampleFragmentModule).Get(), filteringBGL.Get()));
- EXPECT_FALSE(native::BindGroupLayoutBindingsEqualForTesting(
- BGLFromModules(textureSampleVertexModule, unusedTextureFragmentModule).Get(),
- nonFilteringBGL.Get()));
- EXPECT_TRUE(native::BindGroupLayoutBindingsEqualForTesting(
- BGLFromModules(textureSampleVertexModule, unusedTextureFragmentModule).Get(),
- filteringBGL.Get()));
+ {
+ wgpu::BindGroupLayout bgl = BGLFromModules(emptyVertexModule, textureSampleFragmentModule);
+ EXPECT_THAT(bgl, Not(BindGroupLayoutCacheEq(nonFilteringBGL)));
+ EXPECT_THAT(bgl, BindGroupLayoutCacheEq(filteringBGL));
+ }
+ {
+ wgpu::BindGroupLayout bgl =
+ BGLFromModules(textureSampleVertexModule, unusedTextureFragmentModule);
+ EXPECT_THAT(bgl, Not(BindGroupLayoutCacheEq(nonFilteringBGL)));
+ EXPECT_THAT(bgl, BindGroupLayoutCacheEq(filteringBGL));
+ }
// Textures used with both textureLoad and textureSample default to filtering
- EXPECT_FALSE(native::BindGroupLayoutBindingsEqualForTesting(
- BGLFromModules(textureLoadVertexModule, textureSampleFragmentModule).Get(),
- nonFilteringBGL.Get()));
- EXPECT_TRUE(native::BindGroupLayoutBindingsEqualForTesting(
- BGLFromModules(textureLoadVertexModule, textureSampleFragmentModule).Get(),
- filteringBGL.Get()));
- EXPECT_FALSE(native::BindGroupLayoutBindingsEqualForTesting(
- BGLFromModules(textureSampleVertexModule, textureLoadFragmentModule).Get(),
- nonFilteringBGL.Get()));
- EXPECT_TRUE(native::BindGroupLayoutBindingsEqualForTesting(
- BGLFromModules(textureSampleVertexModule, textureLoadFragmentModule).Get(),
- filteringBGL.Get()));
+ {
+ wgpu::BindGroupLayout bgl =
+ BGLFromModules(textureLoadVertexModule, textureSampleFragmentModule);
+ EXPECT_THAT(bgl, Not(BindGroupLayoutCacheEq(nonFilteringBGL)));
+ EXPECT_THAT(bgl, BindGroupLayoutCacheEq(filteringBGL));
+ }
+ {
+ wgpu::BindGroupLayout bgl =
+ BGLFromModules(textureSampleVertexModule, textureLoadFragmentModule);
+ EXPECT_THAT(bgl, Not(BindGroupLayoutCacheEq(nonFilteringBGL)));
+ EXPECT_THAT(bgl, BindGroupLayoutCacheEq(filteringBGL));
+ }
}
// Test GetBindGroupLayout works with a compute pipeline
TEST_F(GetBindGroupLayoutTests, ComputePipeline) {
- // This test works assuming Dawn Native's object deduplication.
- // Getting the same pointer to equivalent bind group layouts is an implementation detail of Dawn
- // Native.
DAWN_SKIP_TEST_IF(UsesWire());
wgpu::ShaderModule csModule = utils::CreateShaderModule(device, R"(
@@ -320,15 +321,15 @@
desc.entryCount = 1;
desc.entries = &binding;
- EXPECT_TRUE(native::BindGroupLayoutBindingsEqualForTesting(
- device.CreateBindGroupLayout(&desc).Get(), pipeline.GetBindGroupLayout(0).Get()));
+ // The pipeline bind group should be cache equivalent, but not fully equivalent since it was
+ // default created by the pipeline.
+ wgpu::BindGroupLayout bgl = device.CreateBindGroupLayout(&desc);
+ EXPECT_THAT(bgl, Not(BindGroupLayoutEq(pipeline.GetBindGroupLayout(0))));
+ EXPECT_THAT(bgl, BindGroupLayoutCacheEq(pipeline.GetBindGroupLayout(0)));
}
// Test that the binding type matches the shader.
TEST_F(GetBindGroupLayoutTests, BindingType) {
- // This test works assuming Dawn Native's object deduplication.
- // Getting the same pointer to equivalent bind group layouts is an implementation detail of Dawn
- // Native.
DAWN_SKIP_TEST_IF(UsesWire());
wgpu::BindGroupLayoutEntry binding = {};
@@ -354,8 +355,8 @@
@fragment fn main() {
var pos : vec4f = ssbo.pos;
})");
- EXPECT_TRUE(native::BindGroupLayoutBindingsEqualForTesting(
- device.CreateBindGroupLayout(&desc).Get(), pipeline.GetBindGroupLayout(0).Get()));
+ EXPECT_THAT(device.CreateBindGroupLayout(&desc),
+ BindGroupLayoutCacheEq(pipeline.GetBindGroupLayout(0)));
}
{
binding.buffer.type = wgpu::BufferBindingType::Uniform;
@@ -368,8 +369,8 @@
@fragment fn main() {
var pos : vec4f = uniforms.pos;
})");
- EXPECT_TRUE(native::BindGroupLayoutBindingsEqualForTesting(
- device.CreateBindGroupLayout(&desc).Get(), pipeline.GetBindGroupLayout(0).Get()));
+ EXPECT_THAT(device.CreateBindGroupLayout(&desc),
+ BindGroupLayoutCacheEq(pipeline.GetBindGroupLayout(0)));
}
{
@@ -383,8 +384,8 @@
@fragment fn main() {
var pos : vec4f = ssbo.pos;
})");
- EXPECT_TRUE(native::BindGroupLayoutBindingsEqualForTesting(
- device.CreateBindGroupLayout(&desc).Get(), pipeline.GetBindGroupLayout(0).Get()));
+ EXPECT_THAT(device.CreateBindGroupLayout(&desc),
+ BindGroupLayoutCacheEq(pipeline.GetBindGroupLayout(0)));
}
binding.buffer.type = wgpu::BufferBindingType::Undefined;
@@ -397,8 +398,8 @@
@fragment fn main() {
_ = textureDimensions(myTexture);
})");
- EXPECT_TRUE(native::BindGroupLayoutBindingsEqualForTesting(
- device.CreateBindGroupLayout(&desc).Get(), pipeline.GetBindGroupLayout(0).Get()));
+ EXPECT_THAT(device.CreateBindGroupLayout(&desc),
+ BindGroupLayoutCacheEq(pipeline.GetBindGroupLayout(0)));
}
{
@@ -409,8 +410,8 @@
@fragment fn main() {
_ = textureDimensions(myTexture);
})");
- EXPECT_TRUE(native::BindGroupLayoutBindingsEqualForTesting(
- device.CreateBindGroupLayout(&desc).Get(), pipeline.GetBindGroupLayout(0).Get()));
+ EXPECT_THAT(device.CreateBindGroupLayout(&desc),
+ BindGroupLayoutCacheEq(pipeline.GetBindGroupLayout(0)));
}
binding.texture.sampleType = wgpu::TextureSampleType::Undefined;
@@ -422,17 +423,14 @@
@fragment fn main() {
_ = mySampler;
})");
- EXPECT_TRUE(native::BindGroupLayoutBindingsEqualForTesting(
- device.CreateBindGroupLayout(&desc).Get(), pipeline.GetBindGroupLayout(0).Get()));
+ EXPECT_THAT(device.CreateBindGroupLayout(&desc),
+ BindGroupLayoutCacheEq(pipeline.GetBindGroupLayout(0)));
}
}
// Tests that the external texture binding type matches with a texture_external declared in the
// shader.
TEST_F(GetBindGroupLayoutTests, ExternalTextureBindingType) {
- // This test works assuming Dawn Native's object deduplication.
- // Getting the same pointer to equivalent bind group layouts is an implementation detail of Dawn
- // Native.
DAWN_SKIP_TEST_IF(UsesWire());
wgpu::BindGroupLayoutEntry binding = {};
@@ -450,15 +448,12 @@
@fragment fn main() {
_ = myExternalTexture;
})");
- EXPECT_TRUE(native::BindGroupLayoutBindingsEqualForTesting(
- device.CreateBindGroupLayout(&desc).Get(), pipeline.GetBindGroupLayout(0).Get()));
+ EXPECT_THAT(device.CreateBindGroupLayout(&desc),
+ BindGroupLayoutCacheEq(pipeline.GetBindGroupLayout(0)));
}
// Test that texture view dimension matches the shader.
TEST_F(GetBindGroupLayoutTests, ViewDimension) {
- // This test works assuming Dawn Native's object deduplication.
- // Getting the same pointer to equivalent bind group layouts is an implementation detail of Dawn
- // Native.
DAWN_SKIP_TEST_IF(UsesWire());
wgpu::BindGroupLayoutEntry binding = {};
@@ -478,8 +473,8 @@
@fragment fn main() {
_ = textureDimensions(myTexture);
})");
- EXPECT_TRUE(native::BindGroupLayoutBindingsEqualForTesting(
- device.CreateBindGroupLayout(&desc).Get(), pipeline.GetBindGroupLayout(0).Get()));
+ EXPECT_THAT(device.CreateBindGroupLayout(&desc),
+ BindGroupLayoutCacheEq(pipeline.GetBindGroupLayout(0)));
}
{
@@ -490,8 +485,8 @@
@fragment fn main() {
_ = textureDimensions(myTexture);
})");
- EXPECT_TRUE(native::BindGroupLayoutBindingsEqualForTesting(
- device.CreateBindGroupLayout(&desc).Get(), pipeline.GetBindGroupLayout(0).Get()));
+ EXPECT_THAT(device.CreateBindGroupLayout(&desc),
+ BindGroupLayoutCacheEq(pipeline.GetBindGroupLayout(0)));
}
{
@@ -502,8 +497,8 @@
@fragment fn main() {
_ = textureDimensions(myTexture);
})");
- EXPECT_TRUE(native::BindGroupLayoutBindingsEqualForTesting(
- device.CreateBindGroupLayout(&desc).Get(), pipeline.GetBindGroupLayout(0).Get()));
+ EXPECT_THAT(device.CreateBindGroupLayout(&desc),
+ BindGroupLayoutCacheEq(pipeline.GetBindGroupLayout(0)));
}
{
@@ -514,8 +509,8 @@
@fragment fn main() {
_ = textureDimensions(myTexture);
})");
- EXPECT_TRUE(native::BindGroupLayoutBindingsEqualForTesting(
- device.CreateBindGroupLayout(&desc).Get(), pipeline.GetBindGroupLayout(0).Get()));
+ EXPECT_THAT(device.CreateBindGroupLayout(&desc),
+ BindGroupLayoutCacheEq(pipeline.GetBindGroupLayout(0)));
}
{
@@ -526,8 +521,8 @@
@fragment fn main() {
_ = textureDimensions(myTexture);
})");
- EXPECT_TRUE(native::BindGroupLayoutBindingsEqualForTesting(
- device.CreateBindGroupLayout(&desc).Get(), pipeline.GetBindGroupLayout(0).Get()));
+ EXPECT_THAT(device.CreateBindGroupLayout(&desc),
+ BindGroupLayoutCacheEq(pipeline.GetBindGroupLayout(0)));
}
{
@@ -538,16 +533,13 @@
@fragment fn main() {
_ = textureDimensions(myTexture);
})");
- EXPECT_TRUE(native::BindGroupLayoutBindingsEqualForTesting(
- device.CreateBindGroupLayout(&desc).Get(), pipeline.GetBindGroupLayout(0).Get()));
+ EXPECT_THAT(device.CreateBindGroupLayout(&desc),
+ BindGroupLayoutCacheEq(pipeline.GetBindGroupLayout(0)));
}
}
// Test that texture component type matches the shader.
TEST_F(GetBindGroupLayoutTests, TextureComponentType) {
- // This test works assuming Dawn Native's object deduplication.
- // Getting the same pointer to equivalent bind group layouts is an implementation detail of Dawn
- // Native.
DAWN_SKIP_TEST_IF(UsesWire());
wgpu::BindGroupLayoutEntry binding = {};
@@ -566,8 +558,8 @@
@fragment fn main() {
_ = textureDimensions(myTexture);
})");
- EXPECT_TRUE(native::BindGroupLayoutBindingsEqualForTesting(
- device.CreateBindGroupLayout(&desc).Get(), pipeline.GetBindGroupLayout(0).Get()));
+ EXPECT_THAT(device.CreateBindGroupLayout(&desc),
+ BindGroupLayoutCacheEq(pipeline.GetBindGroupLayout(0)));
}
{
@@ -578,8 +570,8 @@
@fragment fn main() {
_ = textureDimensions(myTexture);
})");
- EXPECT_TRUE(native::BindGroupLayoutBindingsEqualForTesting(
- device.CreateBindGroupLayout(&desc).Get(), pipeline.GetBindGroupLayout(0).Get()));
+ EXPECT_THAT(device.CreateBindGroupLayout(&desc),
+ BindGroupLayoutCacheEq(pipeline.GetBindGroupLayout(0)));
}
{
@@ -590,16 +582,13 @@
@fragment fn main() {
_ = textureDimensions(myTexture);
})");
- EXPECT_TRUE(native::BindGroupLayoutBindingsEqualForTesting(
- device.CreateBindGroupLayout(&desc).Get(), pipeline.GetBindGroupLayout(0).Get()));
+ EXPECT_THAT(device.CreateBindGroupLayout(&desc),
+ BindGroupLayoutCacheEq(pipeline.GetBindGroupLayout(0)));
}
}
// Test that binding= indices match.
TEST_F(GetBindGroupLayoutTests, BindingIndices) {
- // This test works assuming Dawn Native's object deduplication.
- // Getting the same pointer to equivalent bind group layouts is an implementation detail of Dawn
- // Native.
DAWN_SKIP_TEST_IF(UsesWire());
wgpu::BindGroupLayoutEntry binding = {};
@@ -623,8 +612,8 @@
@fragment fn main() {
var pos : vec4f = uniforms.pos;
})");
- EXPECT_TRUE(native::BindGroupLayoutBindingsEqualForTesting(
- device.CreateBindGroupLayout(&desc).Get(), pipeline.GetBindGroupLayout(0).Get()));
+ EXPECT_THAT(device.CreateBindGroupLayout(&desc),
+ BindGroupLayoutCacheEq(pipeline.GetBindGroupLayout(0)));
}
{
@@ -638,8 +627,8 @@
@fragment fn main() {
var pos : vec4f = uniforms.pos;
})");
- EXPECT_TRUE(native::BindGroupLayoutBindingsEqualForTesting(
- device.CreateBindGroupLayout(&desc).Get(), pipeline.GetBindGroupLayout(0).Get()));
+ EXPECT_THAT(device.CreateBindGroupLayout(&desc),
+ BindGroupLayoutCacheEq(pipeline.GetBindGroupLayout(0)));
}
{
@@ -653,8 +642,8 @@
@fragment fn main() {
var pos : vec4f = uniforms.pos;
})");
- EXPECT_FALSE(native::BindGroupLayoutBindingsEqualForTesting(
- device.CreateBindGroupLayout(&desc).Get(), pipeline.GetBindGroupLayout(0).Get()));
+ EXPECT_THAT(device.CreateBindGroupLayout(&desc),
+ Not(BindGroupLayoutCacheEq(pipeline.GetBindGroupLayout(0))));
}
}
@@ -694,9 +683,6 @@
// Test that minBufferSize is set on the BGL and that the max of the min buffer sizes is used.
TEST_F(GetBindGroupLayoutTests, MinBufferSize) {
- // This test works assuming Dawn Native's object deduplication.
- // Getting the same pointer to equivalent bind group layouts is an implementation detail of Dawn
- // Native.
DAWN_SKIP_TEST_IF(UsesWire());
wgpu::ShaderModule vsModule4 = utils::CreateShaderModule(device, R"(
@@ -765,8 +751,7 @@
descriptor.vertex.module = vsModule4;
descriptor.cFragment.module = fsModule4;
wgpu::RenderPipeline pipeline = device.CreateRenderPipeline(&descriptor);
- EXPECT_TRUE(native::BindGroupLayoutBindingsEqualForTesting(
- pipeline.GetBindGroupLayout(0).Get(), bgl4.Get()));
+ EXPECT_THAT(pipeline.GetBindGroupLayout(0), BindGroupLayoutCacheEq(bgl4));
}
// Check that the max is taken between 4 and 64.
@@ -774,8 +759,7 @@
descriptor.vertex.module = vsModule64;
descriptor.cFragment.module = fsModule4;
wgpu::RenderPipeline pipeline = device.CreateRenderPipeline(&descriptor);
- EXPECT_TRUE(native::BindGroupLayoutBindingsEqualForTesting(
- pipeline.GetBindGroupLayout(0).Get(), bgl64.Get()));
+ EXPECT_THAT(pipeline.GetBindGroupLayout(0), BindGroupLayoutCacheEq(bgl64));
}
// Check that the order doesn't change that the max is taken.
@@ -783,16 +767,12 @@
descriptor.vertex.module = vsModule4;
descriptor.cFragment.module = fsModule64;
wgpu::RenderPipeline pipeline = device.CreateRenderPipeline(&descriptor);
- EXPECT_TRUE(native::BindGroupLayoutBindingsEqualForTesting(
- pipeline.GetBindGroupLayout(0).Get(), bgl64.Get()));
+ EXPECT_THAT(pipeline.GetBindGroupLayout(0), BindGroupLayoutCacheEq(bgl64));
}
}
// Test that the visibility is correctly aggregated if two stages have the exact same binding.
TEST_F(GetBindGroupLayoutTests, StageAggregation) {
- // This test works assuming Dawn Native's object deduplication.
- // Getting the same pointer to equivalent bind group layouts is an implementation detail of Dawn
- // Native.
DAWN_SKIP_TEST_IF(UsesWire());
wgpu::ShaderModule vsModuleNoSampler = utils::CreateShaderModule(device, R"(
@@ -837,8 +817,8 @@
wgpu::RenderPipeline pipeline = device.CreateRenderPipeline(&descriptor);
binding.visibility = wgpu::ShaderStage::Vertex;
- EXPECT_TRUE(native::BindGroupLayoutBindingsEqualForTesting(
- pipeline.GetBindGroupLayout(0).Get(), device.CreateBindGroupLayout(&desc).Get()));
+ EXPECT_THAT(device.CreateBindGroupLayout(&desc),
+ BindGroupLayoutCacheEq(pipeline.GetBindGroupLayout(0)));
}
// Check with only the fragment shader using the sampler
@@ -848,8 +828,8 @@
wgpu::RenderPipeline pipeline = device.CreateRenderPipeline(&descriptor);
binding.visibility = wgpu::ShaderStage::Fragment;
- EXPECT_TRUE(native::BindGroupLayoutBindingsEqualForTesting(
- pipeline.GetBindGroupLayout(0).Get(), device.CreateBindGroupLayout(&desc).Get()));
+ EXPECT_THAT(device.CreateBindGroupLayout(&desc),
+ BindGroupLayoutCacheEq(pipeline.GetBindGroupLayout(0)));
}
// Check with both shaders using the sampler
@@ -859,8 +839,8 @@
wgpu::RenderPipeline pipeline = device.CreateRenderPipeline(&descriptor);
binding.visibility = wgpu::ShaderStage::Fragment | wgpu::ShaderStage::Vertex;
- EXPECT_TRUE(native::BindGroupLayoutBindingsEqualForTesting(
- pipeline.GetBindGroupLayout(0).Get(), device.CreateBindGroupLayout(&desc).Get()));
+ EXPECT_THAT(device.CreateBindGroupLayout(&desc),
+ BindGroupLayoutCacheEq(pipeline.GetBindGroupLayout(0)));
}
}
@@ -986,9 +966,6 @@
// Test that unused indices return the empty bind group layout if before the last used index, an
// error otherwise.
TEST_F(GetBindGroupLayoutTests, UnusedIndex) {
- // This test works assuming Dawn Native's object deduplication.
- // Getting the same pointer to equivalent bind group layouts is an implementation detail of Dawn
- // Native.
DAWN_SKIP_TEST_IF(UsesWire());
wgpu::RenderPipeline pipeline = RenderPipelineFromFragmentShader(R"(
@@ -1009,21 +986,18 @@
wgpu::BindGroupLayout emptyBindGroupLayout = device.CreateBindGroupLayout(&desc);
- EXPECT_FALSE(native::BindGroupLayoutBindingsEqualForTesting(
- pipeline.GetBindGroupLayout(0).Get(), emptyBindGroupLayout.Get())); // Used
- EXPECT_TRUE(native::BindGroupLayoutBindingsEqualForTesting(
- pipeline.GetBindGroupLayout(1).Get(), emptyBindGroupLayout.Get())); // Not Used.
- EXPECT_FALSE(native::BindGroupLayoutBindingsEqualForTesting(
- pipeline.GetBindGroupLayout(2).Get(), emptyBindGroupLayout.Get())); // Used.
+ EXPECT_THAT(pipeline.GetBindGroupLayout(0),
+ Not(BindGroupLayoutCacheEq(emptyBindGroupLayout))); // Used
+ EXPECT_THAT(pipeline.GetBindGroupLayout(1),
+ BindGroupLayoutCacheEq(emptyBindGroupLayout)); // Not used
+ EXPECT_THAT(pipeline.GetBindGroupLayout(2),
+ Not(BindGroupLayoutCacheEq(emptyBindGroupLayout))); // Used
ASSERT_DEVICE_ERROR(pipeline.GetBindGroupLayout(3)); // Past last defined BGL, error!
}
// Test that after explicitly creating a pipeline with a pipeline layout, calling
// GetBindGroupLayout reflects the same bind group layouts.
TEST_F(GetBindGroupLayoutTests, Reflection) {
- // This test works assuming Dawn Native's object deduplication.
- // Getting the same pointer to equivalent bind group layouts is an implementation detail of Dawn
- // Native.
DAWN_SKIP_TEST_IF(UsesWire());
wgpu::BindGroupLayoutEntry binding = {};
@@ -1066,7 +1040,7 @@
wgpu::RenderPipeline pipeline = device.CreateRenderPipeline(&pipelineDesc);
- EXPECT_EQ(pipeline.GetBindGroupLayout(0).Get(), bindGroupLayout.Get());
+ EXPECT_THAT(pipeline.GetBindGroupLayout(0), BindGroupLayoutEq(bindGroupLayout));
}
// Test that fragment output validation is for the correct entryPoint
@@ -1116,9 +1090,6 @@
// Test that a pipeline full of explicitly empty BGLs correctly reflects them.
TEST_F(GetBindGroupLayoutTests, FullOfEmptyBGLs) {
- // This test works assuming Dawn Native's object deduplication.
- // Getting the same pointer to equivalent bind group layouts is an implementation detail of Dawn
- // Native.
DAWN_SKIP_TEST_IF(UsesWire());
wgpu::BindGroupLayout emptyBGL = utils::MakeBindGroupLayout(device, {});
@@ -1134,10 +1105,10 @@
)");
wgpu::ComputePipeline pipeline = device.CreateComputePipeline(&pipelineDesc);
- EXPECT_EQ(pipeline.GetBindGroupLayout(0).Get(), emptyBGL.Get());
- EXPECT_EQ(pipeline.GetBindGroupLayout(1).Get(), emptyBGL.Get());
- EXPECT_EQ(pipeline.GetBindGroupLayout(2).Get(), emptyBGL.Get());
- EXPECT_EQ(pipeline.GetBindGroupLayout(3).Get(), emptyBGL.Get());
+ EXPECT_THAT(pipeline.GetBindGroupLayout(0), BindGroupLayoutEq(emptyBGL));
+ EXPECT_THAT(pipeline.GetBindGroupLayout(1), BindGroupLayoutEq(emptyBGL));
+ EXPECT_THAT(pipeline.GetBindGroupLayout(2), BindGroupLayoutEq(emptyBGL));
+ EXPECT_THAT(pipeline.GetBindGroupLayout(3), BindGroupLayoutEq(emptyBGL));
}
} // anonymous namespace
diff --git a/src/dawn/tests/unittests/validation/MinimumBufferSizeValidationTests.cpp b/src/dawn/tests/unittests/validation/MinimumBufferSizeValidationTests.cpp
index a0e219e..3ca4ec4 100644
--- a/src/dawn/tests/unittests/validation/MinimumBufferSizeValidationTests.cpp
+++ b/src/dawn/tests/unittests/validation/MinimumBufferSizeValidationTests.cpp
@@ -24,6 +24,8 @@
namespace dawn {
namespace {
+using testing::Not;
+
// Helper for describing bindings throughout the tests
struct BindingDescriptor {
uint32_t group;
diff --git a/src/dawn/tests/unittests/validation/ObjectCachingTests.cpp b/src/dawn/tests/unittests/validation/ObjectCachingTests.cpp
index b01c69c..493144a 100644
--- a/src/dawn/tests/unittests/validation/ObjectCachingTests.cpp
+++ b/src/dawn/tests/unittests/validation/ObjectCachingTests.cpp
@@ -22,6 +22,8 @@
namespace dawn {
namespace {
+using testing::Not;
+
// These tests works assuming Dawn Native's object deduplication. Comparing the pointer is
// exploiting an implementation detail of Dawn Native.
class ObjectCachingTest : public ValidationTest {
@@ -40,8 +42,8 @@
wgpu::BindGroupLayout otherBgl = utils::MakeBindGroupLayout(
device, {{1, wgpu::ShaderStage::Vertex, wgpu::BufferBindingType::Uniform}});
- EXPECT_NE(bgl.Get(), otherBgl.Get());
- EXPECT_EQ(bgl.Get(), sameBgl.Get());
+ EXPECT_THAT(bgl, Not(BindGroupLayoutEq(otherBgl)));
+ EXPECT_THAT(bgl, BindGroupLayoutEq(sameBgl));
}
// Test that two similar bind group layouts won't refer to the same one if they differ by dynamic.
@@ -53,8 +55,8 @@
wgpu::BindGroupLayout otherBgl = utils::MakeBindGroupLayout(
device, {{1, wgpu::ShaderStage::Fragment, wgpu::BufferBindingType::Uniform, false}});
- EXPECT_NE(bgl.Get(), otherBgl.Get());
- EXPECT_EQ(bgl.Get(), sameBgl.Get());
+ EXPECT_THAT(bgl, Not(BindGroupLayoutEq(otherBgl)));
+ EXPECT_THAT(bgl, BindGroupLayoutEq(sameBgl));
}
// Test that two similar bind group layouts won't refer to the same one if they differ by min size.
@@ -66,8 +68,8 @@
wgpu::BindGroupLayout otherBgl = utils::MakeBindGroupLayout(
device, {{1, wgpu::ShaderStage::Compute, wgpu::BufferBindingType::Uniform, false, 4}});
- EXPECT_NE(bgl.Get(), otherBgl.Get());
- EXPECT_EQ(bgl.Get(), sameBgl.Get());
+ EXPECT_THAT(bgl, Not(BindGroupLayoutEq(otherBgl)));
+ EXPECT_THAT(bgl, BindGroupLayoutEq(sameBgl));
}
// Test that two similar bind group layouts won't refer to the same one if they differ by
@@ -80,8 +82,8 @@
wgpu::BindGroupLayout otherBgl = utils::MakeBindGroupLayout(
device, {{1, wgpu::ShaderStage::Fragment, wgpu::TextureSampleType::Uint}});
- EXPECT_NE(bgl.Get(), otherBgl.Get());
- EXPECT_EQ(bgl.Get(), sameBgl.Get());
+ EXPECT_THAT(bgl, Not(BindGroupLayoutEq(otherBgl)));
+ EXPECT_THAT(bgl, BindGroupLayoutEq(sameBgl));
}
// Test that two similar bind group layouts won't refer to the same one if they differ by
@@ -95,8 +97,8 @@
device, {{1, wgpu::ShaderStage::Fragment, wgpu::TextureSampleType::Float,
wgpu::TextureViewDimension::e2DArray}});
- EXPECT_NE(bgl.Get(), otherBgl.Get());
- EXPECT_EQ(bgl.Get(), sameBgl.Get());
+ EXPECT_THAT(bgl, Not(BindGroupLayoutEq(otherBgl)));
+ EXPECT_THAT(bgl, BindGroupLayoutEq(sameBgl));
}
// Test that PipelineLayouts are correctly deduplicated.
diff --git a/src/dawn/tests/unittests/validation/ValidationTest.h b/src/dawn/tests/unittests/validation/ValidationTest.h
index 318e833..40f35a0 100644
--- a/src/dawn/tests/unittests/validation/ValidationTest.h
+++ b/src/dawn/tests/unittests/validation/ValidationTest.h
@@ -19,6 +19,7 @@
#include <string>
#include "dawn/common/Log.h"
+#include "dawn/native/BindGroupLayout.h"
#include "dawn/native/DawnNative.h"
#include "dawn/webgpu_cpp.h"
#include "gmock/gmock.h"
@@ -89,6 +90,20 @@
} while (0)
#define EXPECT_DEPRECATION_WARNING(statement) EXPECT_DEPRECATION_WARNINGS(statement, 1)
+// Gmock matcher helpers that may be used throughout other tests.
+
+// BindGroupLayouts can either be cache equivalent meaning that they may have different
+// compatibility tokens but same internal layout, or fully equivalent meaning that they have the
+// same token and internal layout. Note that being fully equivalent implies that they are cache
+// equivalent.
+MATCHER_P(BindGroupLayoutCacheEq, other, "") {
+ return dawn::native::FromAPI(arg.Get())->GetInternalBindGroupLayout() ==
+ dawn::native::FromAPI(other.Get())->GetInternalBindGroupLayout();
+}
+MATCHER_P(BindGroupLayoutEq, other, "") {
+ return dawn::native::FromAPI(arg.Get())->IsLayoutEqual(dawn::native::FromAPI(other.Get()));
+}
+
namespace dawn::utils {
class WireHelper;
} // namespace dawn::utils