1 /*
2  * Copyright 2016 Google Inc.
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 GrTexureOpList_DEFINED
9 #define GrTexureOpList_DEFINED
10 
11 #include "GrGpuResource.h"
12 #include "GrOpList.h"
13 #include "GrSurfaceProxy.h"
14 
15 #include "SkTArray.h"
16 
17 class GrAuditTrail;
18 class GrGpu;
19 class GrOp;
20 class GrTextureProxy;
21 struct SkIPoint;
22 struct SkIRect;
23 
24 class GrTextureOpList final : public GrOpList {
25 public:
26     GrTextureOpList(GrResourceProvider*, sk_sp<GrOpMemoryPool>, GrTextureProxy*, GrAuditTrail*);
27     ~GrTextureOpList() override;
28 
29     /**
30      * Empties the draw buffer of any queued ops.
31      */
32     void endFlush() override;
33 
34     /**
35      * Together these two functions flush all queued ops to GrGpuCommandBuffer. The return value
36      * of executeOps() indicates whether any commands were actually issued to the GPU.
37      */
38     void onPrepare(GrOpFlushState* flushState) override;
39     bool onExecute(GrOpFlushState* flushState) override;
40 
41     /**
42      * Copies a pixel rectangle from one surface to another. This call may finalize
43      * reserved vertex/index data (as though a draw call was made). The src pixels
44      * copied are specified by srcRect. They are copied to a rect of the same
45      * size in dst with top left at dstPoint. If the src rect is clipped by the
46      * src bounds then  pixel values in the dst rect corresponding to area clipped
47      * by the src rect are not overwritten. This method is not guaranteed to succeed
48      * depending on the type of surface, configs, etc, and the backend-specific
49      * limitations.
50      */
51     bool copySurface(GrContext*,
52                      GrSurfaceProxy* dst,
53                      GrSurfaceProxy* src,
54                      const SkIRect& srcRect,
55                      const SkIPoint& dstPoint) override;
56 
57     GrTextureOpList* asTextureOpList() override { return this; }
58 
59     SkDEBUGCODE(void dump(bool printDependencies) const override;)
60 
61 private:
62     void deleteOp(int index);
63     void deleteOps();
64 
65     void purgeOpsWithUninstantiatedProxies() override;
66 
67     void gatherProxyIntervals(GrResourceAllocator*) const override;
68 
69     void recordOp(std::unique_ptr<GrOp>);
70 
71     // The memory for the ops in 'fOpChains' is actually stored in 'fOpMemoryPool'
72     SkSTArray<2, std::unique_ptr<GrOp>, true> fRecordedOps;
73 
74     typedef GrOpList INHERITED;
75 };
76 
77 #endif
78