Remove RenderTarget pointer from GrRenderTargetOpList::RecordedOp
authorRobert Phillips <robertphillips@google.com>
Wed, 17 May 2017 13:36:38 +0000 (09:36 -0400)
committerSkia Commit-Bot <skia-commit-bot@chromium.org>
Wed, 17 May 2017 14:19:40 +0000 (14:19 +0000)
Change-Id: I08afe531cd9c65af4b3f6b6006bc3eaf7071cfec

Change-Id: I08afe531cd9c65af4b3f6b6006bc3eaf7071cfec
Reviewed-on: https://skia-review.googlesource.com/17117
Commit-Queue: Robert Phillips <robertphillips@google.com>
Reviewed-by: Brian Salomon <bsalomon@google.com>
include/private/GrAuditTrail.h
src/gpu/GrAuditTrail.cpp
src/gpu/GrDrawingManager.cpp
src/gpu/GrOpList.cpp
src/gpu/GrOpList.h
src/gpu/GrRenderTargetOpList.cpp
src/gpu/GrRenderTargetOpList.h
src/gpu/GrSurfaceProxyPriv.h
src/gpu/GrTextureOpList.cpp
src/gpu/GrTextureOpList.h
tools/debugger/SkDebugCanvas.cpp

index 9fdae30..05f6fc5 100644 (file)
@@ -81,9 +81,7 @@ public:
         fCurrentStackTrace.push_back(SkString(framename));
     }
 
-    void addOp(const GrOp*,
-               GrGpuResource::UniqueID resourceID,
-               GrRenderTargetProxy::UniqueID proxyID);
+    void addOp(const GrOp*, GrRenderTargetProxy::UniqueID proxyID);
 
     void opsCombined(const GrOp* consumer, const GrOp* consumed);
 
@@ -106,21 +104,12 @@ public:
     // We could just return our internal bookkeeping struct if copying the data out becomes
     // a performance issue, but until then its nice to decouple
     struct OpInfo {
-        // Will the resourceID comparison yield the same decision as the proxyID comparison?
-        bool sameDecision(GrGpuResource::UniqueID resourceUniqueID,
-                          GrSurfaceProxy::UniqueID proxyUniqueID) const {
-            return (fResourceUniqueID == resourceUniqueID) ==
-                   (fProxyUniqueID == proxyUniqueID);
-        }
-
         struct Op {
             int    fClientID;
             SkRect fBounds;
         };
 
         SkRect                   fBounds;
-        // MDB TODO: remove fResourceUniqueID
-        GrGpuResource::UniqueID  fResourceUniqueID;
         GrSurfaceProxy::UniqueID fProxyUniqueID;
         SkTArray<Op>             fOps;
     };
@@ -148,15 +137,11 @@ private:
     typedef SkTArray<Op*> Ops;
 
     struct OpNode {
-        OpNode(const GrGpuResource::UniqueID& resourceID, const GrSurfaceProxy::UniqueID& proxyID)
-            : fResourceUniqueID(resourceID)
-            , fProxyUniqueID(proxyID) {
-        }
+        OpNode(const GrSurfaceProxy::UniqueID& proxyID) : fProxyUniqueID(proxyID) { }
         SkString toJson() const;
 
         SkRect                         fBounds;
         Ops                            fChildren;
-        const GrGpuResource::UniqueID  fResourceUniqueID;
         const GrSurfaceProxy::UniqueID fProxyUniqueID;
     };
     typedef SkTArray<std::unique_ptr<OpNode>, true> OpList;
@@ -189,8 +174,8 @@ private:
 #define GR_AUDIT_TRAIL_RESET(audit_trail) \
     //GR_AUDIT_TRAIL_INVOKE_GUARD(audit_trail, fullReset);
 
-#define GR_AUDIT_TRAIL_ADD_OP(audit_trail, op, resource_id, proxy_id) \
-    GR_AUDIT_TRAIL_INVOKE_GUARD(audit_trail, addOp, op, resource_id, proxy_id);
+#define GR_AUDIT_TRAIL_ADD_OP(audit_trail, op, proxy_id) \
+    GR_AUDIT_TRAIL_INVOKE_GUARD(audit_trail, addOp, op, proxy_id);
 
 #define GR_AUDIT_TRAIL_OPS_RESULT_COMBINED(audit_trail, combineWith, op) \
     GR_AUDIT_TRAIL_INVOKE_GUARD(audit_trail, opsCombined, combineWith, op);
index e6b5c3a..411be3f 100644 (file)
@@ -10,9 +10,7 @@
 
 const int GrAuditTrail::kGrAuditTrailInvalidID = -1;
 
-void GrAuditTrail::addOp(const GrOp* op,
-                         GrGpuResource::UniqueID resourceID,
-                         GrRenderTargetProxy::UniqueID proxyID) {
+void GrAuditTrail::addOp(const GrOp* op, GrRenderTargetProxy::UniqueID proxyID) {
     SkASSERT(fEnabled);
     Op* auditOp = new Op;
     fOpPool.emplace_back(auditOp);
@@ -46,7 +44,7 @@ void GrAuditTrail::addOp(const GrOp* op,
 
     // We use the op pointer as a key to find the OpNode we are 'glomming' ops onto
     fIDLookup.set(op->uniqueID(), auditOp->fOpListID);
-    OpNode* opNode = new OpNode(resourceID, proxyID);
+    OpNode* opNode = new OpNode(proxyID);
     opNode->fBounds = op->bounds();
     opNode->fChildren.push_back(auditOp);
     fOpList.emplace_back(opNode);
@@ -91,7 +89,6 @@ void GrAuditTrail::copyOutFromOpList(OpInfo* outOpInfo, int opListID) {
     const OpNode* bn = fOpList[opListID].get();
     SkASSERT(bn);
     outOpInfo->fBounds = bn->fBounds;
-    outOpInfo->fResourceUniqueID = bn->fResourceUniqueID;
     outOpInfo->fProxyUniqueID    = bn->fProxyUniqueID;
     for (int j = 0; j < bn->fChildren.count(); j++) {
         OpInfo::Op& outOp = outOpInfo->fOps.push_back();
@@ -289,7 +286,6 @@ SkString GrAuditTrail::Op::toJson() const {
 SkString GrAuditTrail::OpNode::toJson() const {
     SkString json;
     json.append("{");
-    json.appendf("\"ResourceID\": \"%u\",", fResourceUniqueID.asUInt());
     json.appendf("\"ProxyID\": \"%u\",", fProxyUniqueID.asUInt());
     skrect_to_json(&json, "Bounds", fBounds);
     JsonifyTArray(&json, "Ops", fChildren, true);
index 9c49ab8..0c2485b 100644 (file)
@@ -93,7 +93,6 @@ void GrDrawingManager::internalFlush(GrSurfaceProxy*, GrResourceCache::FlushType
         // but need to be flushed anyway. Closing such GrOpLists here will mean new
         // GrOpLists will be created to replace them if the SkGpuDevice(s) write to them again.
         fOpLists[i]->makeClosed(*fContext->caps());
-        SkDEBUGCODE(fOpLists[i]->validateTargetsSingleRenderTarget());
     }
 
 #ifdef ENABLE_MDB
@@ -127,7 +126,6 @@ void GrDrawingManager::internalFlush(GrSurfaceProxy*, GrResourceCache::FlushType
                     continue;   // Odd - but not a big deal
                 }
                 opList->makeClosed(*fContext->caps());
-                SkDEBUGCODE(opList->validateTargetsSingleRenderTarget());
                 opList->prepareOps(&fFlushState);
                 if (!opList->executeOps(&fFlushState)) {
                     continue;         // This is bad
@@ -137,10 +135,6 @@ void GrDrawingManager::internalFlush(GrSurfaceProxy*, GrResourceCache::FlushType
         }
     }
 
-    for (int i = 0; i < fOpLists.count(); ++i) {
-        fOpLists[i]->prepareOps(&fFlushState);
-    }
-
 #if 0
     // Enable this to print out verbose GrOp information
     for (int i = 0; i < fOpLists.count(); ++i) {
@@ -148,10 +142,23 @@ void GrDrawingManager::internalFlush(GrSurfaceProxy*, GrResourceCache::FlushType
     }
 #endif
 
+    for (int i = 0; i < fOpLists.count(); ++i) {
+        if (!fOpLists[i]->instantiate(fContext->resourceProvider())) {
+            fOpLists[i] = nullptr;
+            continue;
+        }
+
+        fOpLists[i]->prepareOps(&fFlushState);
+    }
+
     // Upload all data to the GPU
     fFlushState.preIssueDraws();
 
     for (int i = 0; i < fOpLists.count(); ++i) {
+        if (!fOpLists[i]) {
+            continue;
+        }
+
         if (fOpLists[i]->executeOps(&fFlushState)) {
             flushed = true;
         }
index cf67dab..2af34a5 100644 (file)
@@ -34,6 +34,10 @@ GrOpList::~GrOpList() {
     }
 }
 
+bool GrOpList::instantiate(GrResourceProvider* resourceProvider) {
+    return SkToBool(fTarget.get()->instantiate(resourceProvider));
+}
+
 void GrOpList::reset() {
     if (fTarget.get() && this == fTarget.get()->getLastOpList()) {
         fTarget.get()->setLastOpList(nullptr);
index f0dc1c1..1eaad48 100644 (file)
@@ -19,6 +19,7 @@ class GrAuditTrail;
 class GrCaps;
 class GrOpFlushState;
 class GrRenderTargetOpList;
+class GrResourceProvider;
 class GrSurfaceProxy;
 class GrTextureOpList;
 
@@ -27,7 +28,8 @@ public:
     GrOpList(GrSurfaceProxy*, GrAuditTrail*);
     ~GrOpList() override;
 
-    // These two methods are invoked as flush time
+    // These three methods are invoked at flush time
+    bool instantiate(GrResourceProvider* resourceProvider);
     virtual void prepareOps(GrOpFlushState* flushState) = 0;
     virtual bool executeOps(GrOpFlushState* flushState) = 0;
 
@@ -73,8 +75,6 @@ public:
      */
     SkDEBUGCODE(virtual void dump() const;)
 
-    SkDEBUGCODE(virtual void validateTargetsSingleRenderTarget() const = 0;)
-
     SkDEBUGCODE(virtual int numOps() const = 0;)
     SkDEBUGCODE(virtual int numClips() const { return 0; })
 
index fe87bde..537f9e6 100644 (file)
@@ -60,37 +60,21 @@ void GrRenderTargetOpList::dump() const {
         }
     }
 }
-
-void GrRenderTargetOpList::validateTargetsSingleRenderTarget() const {
-    GrRenderTarget* rt = nullptr;
-    for (int i = 0; i < fRecordedOps.count(); ++i) {
-        if (!fRecordedOps[i].fOp) {
-            continue;       // combined forward
-        }
-
-        if (!rt) {
-            rt = fRecordedOps[i].fRenderTarget.get();
-        } else {
-            SkASSERT(fRecordedOps[i].fRenderTarget.get() == rt);
-        }
-    }
-}
 #endif
 
 void GrRenderTargetOpList::prepareOps(GrOpFlushState* flushState) {
+    SkASSERT(fTarget.get()->priv().peekRenderTarget());
     SkASSERT(this->isClosed());
 
     // Loop over the ops that haven't yet been prepared.
     for (int i = 0; i < fRecordedOps.count(); ++i) {
         if (fRecordedOps[i].fOp) {
-            GrOpFlushState::DrawOpArgs opArgs;
-            if (fRecordedOps[i].fRenderTarget) {
-                opArgs = {
-                    fRecordedOps[i].fRenderTarget.get(),
-                    fRecordedOps[i].fAppliedClip,
-                    fRecordedOps[i].fDstTexture
-                };
-            }
+            GrOpFlushState::DrawOpArgs opArgs = {
+                fTarget.get()->priv().peekRenderTarget(),
+                fRecordedOps[i].fAppliedClip,
+                fRecordedOps[i].fDstTexture
+            };
+
             flushState->setDrawOpArgs(&opArgs);
             fRecordedOps[i].fOp->prepare(flushState);
             flushState->setDrawOpArgs(nullptr);
@@ -132,14 +116,7 @@ bool GrRenderTargetOpList::executeOps(GrOpFlushState* flushState) {
         return false;
     }
 
-#ifdef SK_DEBUG
-    GrSurface* target = fTarget.get()->instantiate(flushState->resourceProvider());
-    if (!target) {
-        return false;
-    }
-    const GrRenderTarget* currentRenderTarget = target->asRenderTarget();
-    SkASSERT(currentRenderTarget);
-#endif
+    SkASSERT(fTarget.get()->priv().peekRenderTarget());
 
     std::unique_ptr<GrGpuCommandBuffer> commandBuffer = create_command_buffer(flushState->gpu());
     flushState->setCommandBuffer(commandBuffer.get());
@@ -150,8 +127,6 @@ bool GrRenderTargetOpList::executeOps(GrOpFlushState* flushState) {
             continue;
         }
 
-        SkASSERT(fRecordedOps[i].fRenderTarget.get() == currentRenderTarget);
-
         if (fRecordedOps[i].fOp->needsCommandBufferIsolation()) {
             // This op is a special snowflake and must occur between command buffers
             // TODO: make this go through the command buffer
@@ -165,7 +140,7 @@ bool GrRenderTargetOpList::executeOps(GrOpFlushState* flushState) {
         }
 
         GrOpFlushState::DrawOpArgs opArgs {
-            fRecordedOps[i].fRenderTarget.get(),
+            fTarget.get()->priv().peekRenderTarget(),
             fRecordedOps[i].fAppliedClip,
             fRecordedOps[i].fDstTexture
         };
@@ -299,21 +274,9 @@ GrOp* GrRenderTargetOpList::recordOp(std::unique_ptr<GrOp> op,
                                      GrRenderTargetContext* renderTargetContext,
                                      GrAppliedClip* clip,
                                      const DstTexture* dstTexture) {
-    GrRenderTarget* renderTarget = renderTargetContext->accessRenderTarget();
-    if (!renderTarget) {
-        SkASSERT(false);
-        return nullptr;
-    }
-
+    SkASSERT(fTarget.get());
     const GrCaps* caps = renderTargetContext->caps();
 
-#ifdef SK_DEBUG
-    if (!fRecordedOps.empty()) {
-        GrRenderTargetOpList::RecordedOp& back = fRecordedOps.back();
-        SkASSERT(back.fRenderTarget == renderTarget);
-    }
-#endif
-
     // A closed GrOpList should never receive new/more ops
     SkASSERT(!this->isClosed());
 
@@ -321,7 +284,7 @@ GrOp* GrRenderTargetOpList::recordOp(std::unique_ptr<GrOp> op,
     // 1) check every op
     // 2) intersect with something
     // 3) find a 'blocker'
-    GR_AUDIT_TRAIL_ADD_OP(fAuditTrail, op.get(), renderTarget->uniqueID(),
+    GR_AUDIT_TRAIL_ADD_OP(fAuditTrail, op.get(),
                           renderTargetContext->asRenderTargetProxy()->uniqueID());
     GrOP_INFO("opList: %d Recording (%s, opID: %u)\n"
               "\tBounds [L: %.2f, T: %.2f R: %.2f B: %.2f]\n",
@@ -334,17 +297,11 @@ GrOp* GrRenderTargetOpList::recordOp(std::unique_ptr<GrOp> op,
     GrOP_INFO("\tOutcome:\n");
     int maxCandidates = SkTMin(kMaxOpLookback, fRecordedOps.count());
     // If we don't have a valid destination render target then we cannot reorder.
-    if (maxCandidates && renderTarget) {
+    if (maxCandidates) {
         int i = 0;
         while (true) {
             const RecordedOp& candidate = fRecordedOps.fromBack(i);
-            // We cannot continue to search backwards if the render target changes
-            if (candidate.fRenderTarget.get() != renderTarget) {
-                GrOP_INFO("\t\tBackward: Breaking because of (%s, opID: %u) Rendertarget mismatch\n",
-                          candidate.fOp->name(),
-                          candidate.fOp->uniqueID());
-                break;
-            }
+
             if (this->combineIfPossible(candidate, op.get(), clip, dstTexture, *caps)) {
                 GrOP_INFO("\t\tBackward: Combining with (%s, opID: %u)\n", candidate.fOp->name(),
                           candidate.fOp->uniqueID());
@@ -373,7 +330,7 @@ GrOp* GrRenderTargetOpList::recordOp(std::unique_ptr<GrOp> op,
         clip = fClipAllocator.make<GrAppliedClip>(std::move(*clip));
         SkDEBUGCODE(fNumClips++;)
     }
-    fRecordedOps.emplace_back(std::move(op), renderTarget, clip, dstTexture);
+    fRecordedOps.emplace_back(std::move(op), clip, dstTexture);
     fRecordedOps.back().fOp->wasRecorded(this);
     fLastFullClearOp = nullptr;
     fLastFullClearResourceID.makeInvalid();
@@ -386,23 +343,12 @@ void GrRenderTargetOpList::forwardCombine(const GrCaps& caps) {
 
     for (int i = 0; i < fRecordedOps.count() - 1; ++i) {
         GrOp* op = fRecordedOps[i].fOp.get();
-        GrRenderTarget* renderTarget = fRecordedOps[i].fRenderTarget.get();
-        SkASSERT(renderTarget);
-        // If we don't have a valid destination render target ID then we cannot reorder.
-        if (!renderTarget) {
-            continue;
-        }
+
         int maxCandidateIdx = SkTMin(i + kMaxOpLookahead, fRecordedOps.count() - 1);
         int j = i + 1;
         while (true) {
             const RecordedOp& candidate = fRecordedOps[j];
-            // We cannot continue to search if the render target changes
-            if (candidate.fRenderTarget.get() != renderTarget) {
-                GrOP_INFO("\t\tForward: Breaking because of (%s, opID: %u) Rendertarget\n",
-                          candidate.fOp->name(),
-                          candidate.fOp->uniqueID());
-                break;
-            }
+
             if (this->combineIfPossible(fRecordedOps[i], candidate.fOp.get(),
                                         candidate.fAppliedClip, &candidate.fDstTexture, caps)) {
                 GrOP_INFO("\t\tForward: Combining with (%s, opID: %u)\n", candidate.fOp->name(),
index aa8c6c6..7f40782 100644 (file)
@@ -104,8 +104,6 @@ public:
 
     SkDEBUGCODE(void dump() const override;)
 
-    SkDEBUGCODE(void validateTargetsSingleRenderTarget() const override;)
-
     SkDEBUGCODE(int numOps() const override { return fRecordedOps.count(); })
     SkDEBUGCODE(int numClips() const override { return fNumClips; })
 
@@ -114,19 +112,15 @@ private:
 
     struct RecordedOp {
         RecordedOp(std::unique_ptr<GrOp> op,
-                   GrRenderTarget* rt,
                    const GrAppliedClip* appliedClip,
                    const DstTexture* dstTexture)
                 : fOp(std::move(op))
-                , fRenderTarget(rt)
                 , fAppliedClip(appliedClip) {
             if (dstTexture) {
                 fDstTexture = *dstTexture;
             }
         }
         std::unique_ptr<GrOp> fOp;
-        // TODO: These ops will all to target the same render target and this won't be needed.
-        GrPendingIOResource<GrRenderTarget, kWrite_GrIOType> fRenderTarget;
         DstTexture fDstTexture;
         const GrAppliedClip* fAppliedClip;
     };
index 0d0da4e..ea4d9b6 100644 (file)
@@ -21,6 +21,10 @@ public:
         return fProxy->fTarget ? fProxy->fTarget->asTexture() : nullptr;
     }
 
+    GrRenderTarget* peekRenderTarget() const {
+        return fProxy->fTarget ? fProxy->fTarget->asRenderTarget() : nullptr;
+    }
+
     // Beware! This call is only guaranteed to tell you if the proxy in question has
     // any pending IO in its current state. It won't tell you about the IO state in the
     // future when the proxy is actually used/instantiated.
index dd1c840..0963f35 100644 (file)
@@ -41,10 +41,6 @@ void GrTextureOpList::dump() const {
     }
 }
 
-void GrTextureOpList::validateTargetsSingleRenderTarget() const {
-    SkASSERT(1 == fRecordedOps.count() || 0 == fRecordedOps.count());
-}
-
 #endif
 
 void GrTextureOpList::prepareOps(GrOpFlushState* flushState) {
@@ -93,20 +89,16 @@ bool GrTextureOpList::copySurface(GrResourceProvider* resourceProvider,
     this->addDependency(src);
 #endif
 
-    // See the comment in GrRenderTargetOpList about why we pass the invalid ID here.
-    this->recordOp(std::move(op),
-                   GrGpuResource::UniqueID::InvalidID(),
-                   GrSurfaceProxy::UniqueID::InvalidID());
+    this->recordOp(std::move(op));
     return true;
 }
 
-void GrTextureOpList::recordOp(std::unique_ptr<GrOp> op,
-                               GrGpuResource::UniqueID resourceUniqueID,
-                               GrSurfaceProxy::UniqueID proxyUniqueID) {
+void GrTextureOpList::recordOp(std::unique_ptr<GrOp> op) {
+    SkASSERT(fTarget.get());
     // A closed GrOpList should never receive new/more ops
     SkASSERT(!this->isClosed());
 
-    GR_AUDIT_TRAIL_ADD_OP(fAuditTrail, op.get(), resourceUniqueID, proxyUniqueID);
+    GR_AUDIT_TRAIL_ADD_OP(fAuditTrail, op.get(), fTarget.get()->uniqueID());
     GrOP_INFO("Re-Recording (%s, opID: %u)\n"
         "\tBounds LRTB (%f, %f, %f, %f)\n",
         op->name(),
index 163c05c..a9ec1cc 100644 (file)
@@ -62,16 +62,10 @@ public:
 
     SkDEBUGCODE(void dump() const override;)
 
-    SkDEBUGCODE(virtual void validateTargetsSingleRenderTarget() const override;)
-
     SkDEBUGCODE(int numOps() const override { return fRecordedOps.count(); })
 
 private:
-    // MDB TODO: The unique IDs are only needed for the audit trail. There should only be one
-    // on the opList itself.
-    void recordOp(std::unique_ptr<GrOp>,
-                  GrGpuResource::UniqueID resourceUniqueID,
-                  GrSurfaceProxy::UniqueID proxyUniqueID);
+    void recordOp(std::unique_ptr<GrOp>);
 
     SkSTArray<2, std::unique_ptr<GrOp>, true> fRecordedOps;
 
index 23f4ae3..fdde0a6 100644 (file)
@@ -287,7 +287,7 @@ void SkDebugCanvas::drawTo(SkCanvas* originalCanvas, int index, int m) {
         // drawn offscreen
         GrRenderTargetContext* rtc =
                 originalCanvas->internal_private_accessTopLayerRenderTargetContext();
-        GrGpuResource::UniqueID rtID = rtc->accessRenderTarget()->uniqueID();
+        GrSurfaceProxy::UniqueID proxyID = rtc->asSurfaceProxy()->uniqueID();
 
         // get the bounding boxes to draw
         SkTArray<GrAuditTrail::OpInfo> childrenBounds;
@@ -301,8 +301,7 @@ void SkDebugCanvas::drawTo(SkCanvas* originalCanvas, int index, int m) {
         paint.setStyle(SkPaint::kStroke_Style);
         paint.setStrokeWidth(1);
         for (int i = 0; i < childrenBounds.count(); i++) {
-            SkASSERT(childrenBounds[i].sameDecision(rtID, rtc->asSurfaceProxy()->uniqueID()));
-            if (childrenBounds[i].fResourceUniqueID != rtID) {
+            if (childrenBounds[i].fProxyUniqueID != proxyID) {
                 // offscreen draw, ignore for now
                 continue;
             }