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