dawn_native: deduplicate render pipelines
BUG=dawn:143
Change-Id: I2f66387f95bcb44dc20f308b4a582b878803dbe8
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/6864
Reviewed-by: Kai Ninomiya <kainino@chromium.org>
Reviewed-by: Austin Eng <enga@chromium.org>
Commit-Queue: Corentin Wallez <cwallez@chromium.org>
diff --git a/src/dawn_native/Device.cpp b/src/dawn_native/Device.cpp
index c11a67e..753f709 100644
--- a/src/dawn_native/Device.cpp
+++ b/src/dawn_native/Device.cpp
@@ -50,6 +50,7 @@
ContentLessObjectCache<BindGroupLayoutBase> bindGroupLayouts;
ContentLessObjectCache<ComputePipelineBase> computePipelines;
ContentLessObjectCache<PipelineLayoutBase> pipelineLayouts;
+ ContentLessObjectCache<RenderPipelineBase> renderPipelines;
ContentLessObjectCache<ShaderModuleBase> shaderModules;
};
@@ -164,6 +165,27 @@
ASSERT(removedCount == 1);
}
+ ResultOrError<RenderPipelineBase*> DeviceBase::GetOrCreateRenderPipeline(
+ const RenderPipelineDescriptor* descriptor) {
+ RenderPipelineBase blueprint(this, descriptor, true);
+
+ auto iter = mCaches->renderPipelines.find(&blueprint);
+ if (iter != mCaches->renderPipelines.end()) {
+ (*iter)->Reference();
+ return *iter;
+ }
+
+ RenderPipelineBase* backendObj;
+ DAWN_TRY_ASSIGN(backendObj, CreateRenderPipelineImpl(descriptor));
+ mCaches->renderPipelines.insert(backendObj);
+ return backendObj;
+ }
+
+ void DeviceBase::UncacheRenderPipeline(RenderPipelineBase* obj) {
+ size_t removedCount = mCaches->renderPipelines.erase(obj);
+ ASSERT(removedCount == 1);
+ }
+
ResultOrError<ShaderModuleBase*> DeviceBase::GetOrCreateShaderModule(
const ShaderModuleDescriptor* descriptor) {
ShaderModuleBase blueprint(this, descriptor, true);
@@ -412,7 +434,7 @@
RenderPipelineBase** result,
const RenderPipelineDescriptor* descriptor) {
DAWN_TRY(ValidateRenderPipelineDescriptor(this, descriptor));
- DAWN_TRY_ASSIGN(*result, CreateRenderPipelineImpl(descriptor));
+ DAWN_TRY_ASSIGN(*result, GetOrCreateRenderPipeline(descriptor));
return {};
}