blob: a71b4bd97425ce9af27055db6d9bc5d1c625edfc [file] [log] [blame] [edit]
// Copyright 2013 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "impeller/renderer/pipeline.h"
#include <optional>
#include "compute_pipeline_descriptor.h"
#include "impeller/base/promise.h"
#include "impeller/renderer/compute_pipeline_descriptor.h"
#include "impeller/renderer/context.h"
#include "impeller/renderer/pipeline_library.h"
#include "pipeline_descriptor.h"
namespace impeller {
template <typename T>
Pipeline<T>::Pipeline(std::weak_ptr<PipelineLibrary> library, T desc)
: library_(std::move(library)), desc_(std::move(desc)) {}
template <typename T>
Pipeline<T>::~Pipeline() = default;
PipelineFuture<PipelineDescriptor> CreatePipelineFuture(
const Context& context,
std::optional<PipelineDescriptor> desc) {
if (!context.IsValid()) {
return {desc, RealizedFuture<std::shared_ptr<Pipeline<PipelineDescriptor>>>(
nullptr)};
}
return context.GetPipelineLibrary()->GetPipeline(std::move(desc));
}
PipelineFuture<ComputePipelineDescriptor> CreatePipelineFuture(
const Context& context,
std::optional<ComputePipelineDescriptor> desc) {
if (!context.IsValid()) {
return {
desc,
RealizedFuture<std::shared_ptr<Pipeline<ComputePipelineDescriptor>>>(
nullptr)};
}
return context.GetPipelineLibrary()->GetPipeline(std::move(desc));
}
template <typename T>
const T& Pipeline<T>::GetDescriptor() const {
return desc_;
}
template <typename T>
PipelineFuture<T> Pipeline<T>::CreateVariant(
std::function<void(T& desc)> descriptor_callback) const {
if (!descriptor_callback) {
return {std::nullopt,
RealizedFuture<std::shared_ptr<Pipeline<T>>>(nullptr)};
}
auto copied_desc = desc_;
descriptor_callback(copied_desc);
auto library = library_.lock();
if (!library) {
VALIDATION_LOG << "The library from which this pipeline was created was "
"already collected.";
return {desc_, RealizedFuture<std::shared_ptr<Pipeline<T>>>(nullptr)};
}
return library->GetPipeline(std::move(copied_desc));
}
template class Pipeline<PipelineDescriptor>;
template class Pipeline<ComputePipelineDescriptor>;
} // namespace impeller