| /* | |
| * 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 |