blob: ec03d99438165b3d7bdf5e39a9b0260328c0a3d0 [file] [log] [blame]
// 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.
#pragma once
#include "flutter/fml/concurrent_message_loop.h"
#include "flutter/fml/macros.h"
#include "flutter/fml/mapping.h"
#include "impeller/base/backend_cast.h"
#include "impeller/base/thread.h"
#include "impeller/renderer/backend/vulkan/pipeline_vk.h"
#include "impeller/renderer/backend/vulkan/vk.h"
#include "impeller/renderer/pipeline_library.h"
#include "vulkan/vulkan_handles.hpp"
namespace impeller {
class ContextVK;
class PipelineLibraryVK final
: public PipelineLibrary,
public BackendCast<PipelineLibraryVK, PipelineLibrary> {
public:
// |PipelineLibrary|
~PipelineLibraryVK() override;
private:
friend ContextVK;
vk::Device device_;
// On locking around the pipeline cache: The cache is internally synchronized.
// So there is no need to hold a writer lock around its use when pipelines are
// being created. The time it takes for implementations to spend within the
// critical section of the cache is limited compared to the time it
// takes for the "create pipeline" call itself. The writer lock is only
// necessary when fetching pipeline cache data for persisting to disk.
mutable RWMutex cache_mutex_;
vk::UniquePipelineCache cache_ IPLR_GUARDED_BY(cache_mutex_);
std::shared_ptr<fml::ConcurrentTaskRunner> worker_task_runner_;
Mutex pipelines_mutex_;
PipelineMap pipelines_ IPLR_GUARDED_BY(pipelines_mutex_);
bool is_valid_ = false;
PipelineLibraryVK(
const vk::Device& device,
const std::shared_ptr<const fml::Mapping>& pipeline_cache_data,
std::shared_ptr<fml::ConcurrentTaskRunner> worker_task_runner);
// |PipelineLibrary|
bool IsValid() const override;
// |PipelineLibrary|
PipelineFuture<PipelineDescriptor> GetPipeline(
PipelineDescriptor descriptor) override;
// |PipelineLibrary|
PipelineFuture<ComputePipelineDescriptor> GetPipeline(
ComputePipelineDescriptor descriptor) override;
// |PipelineLibrary|
void RemovePipelinesWithEntryPoint(
std::shared_ptr<const ShaderFunction> function) override;
std::unique_ptr<PipelineCreateInfoVK> CreatePipeline(
const PipelineDescriptor& desc);
std::optional<vk::UniqueRenderPass> CreateRenderPass(
const PipelineDescriptor& desc);
FML_DISALLOW_COPY_AND_ASSIGN(PipelineLibraryVK);
};
} // namespace impeller