xref: /aosp_15_r20/external/skia/src/gpu/ganesh/GrDDLTask.h (revision c8dee2aa9b3f27cf6c858bd81872bdeb2c07ed17)
1*c8dee2aaSAndroid Build Coastguard Worker /*
2*c8dee2aaSAndroid Build Coastguard Worker  * Copyright 2020 Google LLC
3*c8dee2aaSAndroid Build Coastguard Worker  *
4*c8dee2aaSAndroid Build Coastguard Worker  * Use of this source code is governed by a BSD-style license that can be
5*c8dee2aaSAndroid Build Coastguard Worker  * found in the LICENSE file.
6*c8dee2aaSAndroid Build Coastguard Worker  */
7*c8dee2aaSAndroid Build Coastguard Worker 
8*c8dee2aaSAndroid Build Coastguard Worker #ifndef GrDDLTask_DEFINED
9*c8dee2aaSAndroid Build Coastguard Worker #define GrDDLTask_DEFINED
10*c8dee2aaSAndroid Build Coastguard Worker 
11*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkRefCnt.h"
12*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkTypes.h"
13*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/gpu/ganesh/GrTypesPriv.h"
14*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrRenderTask.h"
15*c8dee2aaSAndroid Build Coastguard Worker 
16*c8dee2aaSAndroid Build Coastguard Worker class GrDeferredDisplayList;
17*c8dee2aaSAndroid Build Coastguard Worker class GrDrawingManager;
18*c8dee2aaSAndroid Build Coastguard Worker class GrOpFlushState;
19*c8dee2aaSAndroid Build Coastguard Worker class GrRecordingContext;
20*c8dee2aaSAndroid Build Coastguard Worker class GrRenderTargetProxy;
21*c8dee2aaSAndroid Build Coastguard Worker class GrResourceAllocator;
22*c8dee2aaSAndroid Build Coastguard Worker class GrSurfaceProxy;
23*c8dee2aaSAndroid Build Coastguard Worker class SkString;
24*c8dee2aaSAndroid Build Coastguard Worker struct SkIRect;
25*c8dee2aaSAndroid Build Coastguard Worker 
26*c8dee2aaSAndroid Build Coastguard Worker /**
27*c8dee2aaSAndroid Build Coastguard Worker  * This render task isolates the DDL's tasks from the rest of the DAG. This means that
28*c8dee2aaSAndroid Build Coastguard Worker  * the DDL's tasks cannot be reordered by the topological sort and are always executed
29*c8dee2aaSAndroid Build Coastguard Worker  * as a single block.
30*c8dee2aaSAndroid Build Coastguard Worker  * It almost entirely just forwards calls down to the DDL's render tasks.
31*c8dee2aaSAndroid Build Coastguard Worker  */
32*c8dee2aaSAndroid Build Coastguard Worker class GrDDLTask final : public GrRenderTask {
33*c8dee2aaSAndroid Build Coastguard Worker public:
34*c8dee2aaSAndroid Build Coastguard Worker     GrDDLTask(GrDrawingManager*,
35*c8dee2aaSAndroid Build Coastguard Worker               sk_sp<GrRenderTargetProxy> ddlTarget,
36*c8dee2aaSAndroid Build Coastguard Worker               sk_sp<const GrDeferredDisplayList>);
37*c8dee2aaSAndroid Build Coastguard Worker 
38*c8dee2aaSAndroid Build Coastguard Worker     ~GrDDLTask() override;
39*c8dee2aaSAndroid Build Coastguard Worker 
40*c8dee2aaSAndroid Build Coastguard Worker     // The render tasks w/in the DDL don't appear in the DAG so need explicit notification
41*c8dee2aaSAndroid Build Coastguard Worker     // when they can free their contents.
requiresExplicitCleanup()42*c8dee2aaSAndroid Build Coastguard Worker     bool requiresExplicitCleanup() const override { return true; }
43*c8dee2aaSAndroid Build Coastguard Worker 
44*c8dee2aaSAndroid Build Coastguard Worker     void endFlush(GrDrawingManager*) override;
45*c8dee2aaSAndroid Build Coastguard Worker 
46*c8dee2aaSAndroid Build Coastguard Worker     void disown(GrDrawingManager*) override;
47*c8dee2aaSAndroid Build Coastguard Worker 
48*c8dee2aaSAndroid Build Coastguard Worker private:
49*c8dee2aaSAndroid Build Coastguard Worker     bool onIsUsed(GrSurfaceProxy*) const override;
50*c8dee2aaSAndroid Build Coastguard Worker 
51*c8dee2aaSAndroid Build Coastguard Worker     void gatherProxyIntervals(GrResourceAllocator*) const override;
52*c8dee2aaSAndroid Build Coastguard Worker 
53*c8dee2aaSAndroid Build Coastguard Worker     ExpectedOutcome onMakeClosed(GrRecordingContext*, SkIRect* targetUpdateBounds) override;
54*c8dee2aaSAndroid Build Coastguard Worker 
onPrePrepare(GrRecordingContext *)55*c8dee2aaSAndroid Build Coastguard Worker     void onPrePrepare(GrRecordingContext*) override {
56*c8dee2aaSAndroid Build Coastguard Worker         // This entry point is only called when a DDL is snapped off of a recorder.
57*c8dee2aaSAndroid Build Coastguard Worker         // Since DDL tasks should never recursively appear within a DDL this should never
58*c8dee2aaSAndroid Build Coastguard Worker         // be called.
59*c8dee2aaSAndroid Build Coastguard Worker         SkASSERT(0);
60*c8dee2aaSAndroid Build Coastguard Worker     }
61*c8dee2aaSAndroid Build Coastguard Worker 
62*c8dee2aaSAndroid Build Coastguard Worker     void onPrepare(GrOpFlushState*) override;
63*c8dee2aaSAndroid Build Coastguard Worker 
64*c8dee2aaSAndroid Build Coastguard Worker     bool onExecute(GrOpFlushState*) override;
65*c8dee2aaSAndroid Build Coastguard Worker 
66*c8dee2aaSAndroid Build Coastguard Worker #if defined(GPU_TEST_UTILS)
67*c8dee2aaSAndroid Build Coastguard Worker     void dump(const SkString& label,
68*c8dee2aaSAndroid Build Coastguard Worker               SkString indent,
69*c8dee2aaSAndroid Build Coastguard Worker               bool printDependencies,
70*c8dee2aaSAndroid Build Coastguard Worker               bool close) const final;
name()71*c8dee2aaSAndroid Build Coastguard Worker     const char* name() const final { return "DDL"; }
72*c8dee2aaSAndroid Build Coastguard Worker #endif
73*c8dee2aaSAndroid Build Coastguard Worker #ifdef SK_DEBUG
visitProxies_debugOnly(const GrVisitProxyFunc &)74*c8dee2aaSAndroid Build Coastguard Worker     void visitProxies_debugOnly(const GrVisitProxyFunc&) const override {}
75*c8dee2aaSAndroid Build Coastguard Worker #endif
76*c8dee2aaSAndroid Build Coastguard Worker 
77*c8dee2aaSAndroid Build Coastguard Worker     sk_sp<const GrDeferredDisplayList> fDDL;
78*c8dee2aaSAndroid Build Coastguard Worker     sk_sp<GrRenderTargetProxy>         fDDLTarget;
79*c8dee2aaSAndroid Build Coastguard Worker 
80*c8dee2aaSAndroid Build Coastguard Worker     typedef GrRenderTask INHERITED;
81*c8dee2aaSAndroid Build Coastguard Worker };
82*c8dee2aaSAndroid Build Coastguard Worker 
83*c8dee2aaSAndroid Build Coastguard Worker #endif
84