dawn_native: deduplicate compute pipelines
BUG=dawn:143
Change-Id: I64e4660de2241bb72bb7c615a0bd1e675e043295
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/6863
Commit-Queue: Corentin Wallez <cwallez@chromium.org>
Reviewed-by: Kai Ninomiya <kainino@chromium.org>
diff --git a/src/dawn_native/Device.cpp b/src/dawn_native/Device.cpp
index 844feb0..c11a67e 100644
--- a/src/dawn_native/Device.cpp
+++ b/src/dawn_native/Device.cpp
@@ -48,6 +48,7 @@
struct DeviceBase::Caches {
ContentLessObjectCache<BindGroupLayoutBase> bindGroupLayouts;
+ ContentLessObjectCache<ComputePipelineBase> computePipelines;
ContentLessObjectCache<PipelineLayoutBase> pipelineLayouts;
ContentLessObjectCache<ShaderModuleBase> shaderModules;
};
@@ -121,6 +122,27 @@
ASSERT(removedCount == 1);
}
+ ResultOrError<ComputePipelineBase*> DeviceBase::GetOrCreateComputePipeline(
+ const ComputePipelineDescriptor* descriptor) {
+ ComputePipelineBase blueprint(this, descriptor, true);
+
+ auto iter = mCaches->computePipelines.find(&blueprint);
+ if (iter != mCaches->computePipelines.end()) {
+ (*iter)->Reference();
+ return *iter;
+ }
+
+ ComputePipelineBase* backendObj;
+ DAWN_TRY_ASSIGN(backendObj, CreateComputePipelineImpl(descriptor));
+ mCaches->computePipelines.insert(backendObj);
+ return backendObj;
+ }
+
+ void DeviceBase::UncacheComputePipeline(ComputePipelineBase* obj) {
+ size_t removedCount = mCaches->computePipelines.erase(obj);
+ ASSERT(removedCount == 1);
+ }
+
ResultOrError<PipelineLayoutBase*> DeviceBase::GetOrCreatePipelineLayout(
const PipelineLayoutDescriptor* descriptor) {
PipelineLayoutBase blueprint(this, descriptor, true);
@@ -369,7 +391,7 @@
ComputePipelineBase** result,
const ComputePipelineDescriptor* descriptor) {
DAWN_TRY(ValidateComputePipelineDescriptor(this, descriptor));
- DAWN_TRY_ASSIGN(*result, CreateComputePipelineImpl(descriptor));
+ DAWN_TRY_ASSIGN(*result, GetOrCreateComputePipeline(descriptor));
return {};
}