blob: fc8d5da7c502bca9b1f849652c0bdd5daa95b003 [file] [log] [blame]
/*
* Copyright 2025 Google LLC
*
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
#ifndef skgpu_graphite_GraphicsPipelineHandle_DEFINED
#define skgpu_graphite_GraphicsPipelineHandle_DEFINED
#include "include/core/SkRefCnt.h"
#include <variant>
namespace skgpu::graphite {
class GraphicsPipeline;
class PipelineCreationTask;
/*
* The PipelineHandle holds a ref to either a Pipeline or the Task that will create the Pipeline.
* In the latter case, ResourceProvider::resolveHandle can be used to wait for the Task to
* complete. How this works is:
* At Recorder::snap time, the DrawPass will create GraphicsPipelineHandles and will
* kick off all the tasks (using ResourceProvider::kickOffTask)
* Upon Context::insertRecording, all the Handles will be exchanged for GraphicsPipelines in
* the DrawPass::addResourceRefs. This will also release any Tasks being held by the Handles.
*
* Note that the Tasks lock the generated Pipelines in the cache until they are deleted. This avoids
* any race conditions where a Pipeline could be purged between when it was created on a thread
* and when it was actually requested by a DrawPass.
*/
class GraphicsPipelineHandle {
private:
friend class PipelineManager; // for ctors
GraphicsPipelineHandle(sk_sp<PipelineCreationTask> task);
GraphicsPipelineHandle(sk_sp<GraphicsPipeline> pipeline);
std::variant<sk_sp<PipelineCreationTask>, sk_sp<GraphicsPipeline>> fTaskOrPipeline;
};
} // namespace skgpu::graphite
#endif // skgpu_graphite_GraphicsPipelineHandle_DEFINED