1 /*
2  * Copyright 2019 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 #ifndef GrTransferFromRenderTask_DEFINED
9 #define GrTransferFromRenderTask_DEFINED
10 
11 #include "src/gpu/GrRenderTask.h"
12 
13 class GrTransferFromRenderTask final : public GrRenderTask {
14 public:
GrTransferFromRenderTask(sk_sp<GrSurfaceProxy> srcProxy,const SkIRect & srcRect,GrColorType surfaceColorType,GrColorType dstColorType,sk_sp<GrGpuBuffer> dstBuffer,size_t dstOffset)15     GrTransferFromRenderTask(sk_sp<GrSurfaceProxy> srcProxy,
16                              const SkIRect& srcRect,
17                              GrColorType surfaceColorType,
18                              GrColorType dstColorType,
19                              sk_sp<GrGpuBuffer> dstBuffer,
20                              size_t dstOffset)
21             : GrRenderTask()
22             , fSrcProxy(std::move(srcProxy))
23             , fSrcRect(srcRect)
24             , fSurfaceColorType(surfaceColorType)
25             , fDstColorType(dstColorType)
26             , fDstBuffer(std::move(dstBuffer))
27             , fDstOffset(dstOffset) {}
28 
29 private:
onIsUsed(GrSurfaceProxy * proxy)30     bool onIsUsed(GrSurfaceProxy* proxy) const override {
31         SkASSERT(0 == this->numTargets());
32         return proxy == fSrcProxy.get();
33     }
34     // If fSrcProxy is uninstantiated at flush time we simply will skip doing the transfer.
handleInternalAllocationFailure()35     void handleInternalAllocationFailure() override {}
36     void gatherProxyIntervals(GrResourceAllocator*) const override;
37 
onMakeClosed(const GrCaps &,SkIRect *)38     ExpectedOutcome onMakeClosed(const GrCaps&, SkIRect*) override {
39         return ExpectedOutcome::kTargetUnchanged;
40     }
41 
42     bool onExecute(GrOpFlushState*) override;
43 
44 #if GR_TEST_UTILS
name()45     const char* name() const final { return "TransferFrom"; }
46 #endif
47 #ifdef SK_DEBUG
visitProxies_debugOnly(const GrOp::VisitProxyFunc & fn)48     void visitProxies_debugOnly(const GrOp::VisitProxyFunc& fn) const override {
49         fn(fSrcProxy.get(), GrMipmapped::kNo);
50     }
51 #endif
52 
53     sk_sp<GrSurfaceProxy> fSrcProxy;
54     SkIRect fSrcRect;
55     GrColorType fSurfaceColorType;
56     GrColorType fDstColorType;
57     sk_sp<GrGpuBuffer> fDstBuffer;
58     size_t fDstOffset;
59 
60 };
61 
62 #endif
63 
64