blob: ab90e28d0fb0a4e1b5307671d648a8135a1cf7a0 [file] [log] [blame]
Robert Phillips07f675d2020-11-16 13:44:01 -05001/*
2 * Copyright 2020 Google LLC
3 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 */
7
8#include "src/gpu/GrDDLTask.h"
9
10#include "include/core/SkDeferredDisplayList.h"
11#include "src/core/SkDeferredDisplayListPriv.h"
12#include "src/gpu/GrResourceAllocator.h"
13
14GrDDLTask::GrDDLTask(GrDrawingManager* drawingMgr,
15 sk_sp<GrRenderTargetProxy> ddlTarget,
Robert Phillips88b29612020-11-16 15:15:08 -050016 sk_sp<const SkDeferredDisplayList> ddl,
17 SkIPoint offset)
Robert Phillips07f675d2020-11-16 13:44:01 -050018 : fDDL(std::move(ddl))
Robert Phillips88b29612020-11-16 15:15:08 -050019 , fDDLTarget(std::move(ddlTarget))
20 , fOffset(offset) {
21 (void) fOffset; // fOffset will be used shortly
Robert Phillips07f675d2020-11-16 13:44:01 -050022
Robert Phillips14357842021-01-06 12:13:34 -050023 for (auto& task : fDDL->priv().renderTasks()) {
Robert Phillips07f675d2020-11-16 13:44:01 -050024 SkASSERT(task->isClosed());
25
26 for (int i = 0; i < task->numTargets(); ++i) {
27 drawingMgr->setLastRenderTask(task->target(i).proxy(), task.get());
28 }
29 }
30
31 // The DDL task never accepts additional tasks
32 this->setFlag(kClosed_Flag);
33}
34
35GrDDLTask::~GrDDLTask() { }
36
37void GrDDLTask::endFlush(GrDrawingManager* drawingManager) {
38 for (auto& task : fDDL->priv().renderTasks()) {
39 task->endFlush(drawingManager);
40 }
41
42 INHERITED::endFlush(drawingManager);
43}
44
45void GrDDLTask::disown(GrDrawingManager* drawingManager) {
46 for (auto& task : fDDL->priv().renderTasks()) {
47 task->disown(drawingManager);
48 }
49
50 INHERITED::disown(drawingManager);
51}
52
53bool GrDDLTask::onIsUsed(GrSurfaceProxy* proxy) const {
Robert Phillips58a8ccc2021-01-11 09:07:55 -050054 if (proxy == fDDLTarget.get()) {
55 return true;
56 }
57
Robert Phillips07f675d2020-11-16 13:44:01 -050058 for (auto& task : fDDL->priv().renderTasks()) {
59 if (task->isUsed(proxy)) {
60 return true;
61 }
62 }
63
64 return false;
65}
66
67void GrDDLTask::handleInternalAllocationFailure() {
68 for (auto& task : fDDL->priv().renderTasks()) {
69 task->handleInternalAllocationFailure();
70 }
71}
72
73void GrDDLTask::gatherProxyIntervals(GrResourceAllocator* alloc) const {
74 // We don't have any proxies, but the resource allocator will still bark
75 // if a task doesn't claim any op indices, so we oblige it.
76 alloc->incOps();
77
78 for (auto& task : fDDL->priv().renderTasks()) {
79 task->gatherProxyIntervals(alloc);
80 }
81}
82
83GrRenderTask::ExpectedOutcome GrDDLTask::onMakeClosed(const GrCaps& caps,
84 SkIRect* targetUpdateBounds) {
85 SkASSERT(0);
86 return ExpectedOutcome::kTargetUnchanged;
87}
88
89void GrDDLTask::gatherIDs(SkSTArray<8, uint32_t, true>* idArray) const {
90 for (auto& task : fDDL->priv().renderTasks()) {
91 task->gatherIDs(idArray);
92 }
93}
94
95void GrDDLTask::onPrepare(GrOpFlushState* flushState) {
96 for (auto& task : fDDL->priv().renderTasks()) {
97 task->prepare(flushState);
98 }
99}
100
101bool GrDDLTask::onExecute(GrOpFlushState* flushState) {
102 bool anyCommandsIssued = false;
103 for (auto& task : fDDL->priv().renderTasks()) {
104 if (task->execute(flushState)) {
105 anyCommandsIssued = true;
106 }
107 }
108
109 return anyCommandsIssued;
110}
Robert Phillips14357842021-01-06 12:13:34 -0500111
112#if GR_TEST_UTILS
Robert Phillips047d5bb2021-01-08 13:39:19 -0500113void GrDDLTask::dump(const SkString& label,
114 SkString indent,
115 bool printDependencies,
116 bool close) const {
117 INHERITED::dump(label, indent, printDependencies, false);
Robert Phillips14357842021-01-06 12:13:34 -0500118
Robert Phillips047d5bb2021-01-08 13:39:19 -0500119 SkDebugf("%sDDL Target: ", indent.c_str());
120 if (fDDLTarget) {
121 SkString proxyStr = fDDLTarget->dump();
122 SkDebugf("%s", proxyStr.c_str());
123 }
124 SkDebugf("\n");
125
126 SkDebugf("%s%d sub-tasks\n", indent.c_str(), fDDL->priv().numRenderTasks());
127
128 SkString subIndent(indent);
129 subIndent.append(" ");
130
131 int index = 0;
Robert Phillips14357842021-01-06 12:13:34 -0500132 for (auto& task : fDDL->priv().renderTasks()) {
Robert Phillips047d5bb2021-01-08 13:39:19 -0500133 SkString subLabel;
134 subLabel.printf("sub-task %d/%d", index++, fDDL->priv().numRenderTasks());
135 task->dump(subLabel, subIndent, printDependencies, true);
136 }
137
138 if (close) {
139 SkDebugf("%s--------------------------------------------------------------\n\n",
140 indent.c_str());
Robert Phillips14357842021-01-06 12:13:34 -0500141 }
142}
143#endif