Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(79)

Side by Side Diff: src/gpu/GrInOrderDrawBuffer.h

Issue 654863003: Revert of Create a single command buffer for GrInOrderDrawBuffer (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: Created 6 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « gyp/tests.gypi ('k') | src/gpu/GrInOrderDrawBuffer.cpp » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright 2011 Google Inc. 2 * Copyright 2011 Google Inc.
3 * 3 *
4 * Use of this source code is governed by a BSD-style license that can be 4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file. 5 * found in the LICENSE file.
6 */ 6 */
7 7
8 #ifndef GrInOrderDrawBuffer_DEFINED 8 #ifndef GrInOrderDrawBuffer_DEFINED
9 #define GrInOrderDrawBuffer_DEFINED 9 #define GrInOrderDrawBuffer_DEFINED
10 10
11 #include "GrDrawTarget.h" 11 #include "GrDrawTarget.h"
12 #include "GrAllocPool.h" 12 #include "GrAllocPool.h"
13 #include "GrAllocator.h" 13 #include "GrAllocator.h"
14 #include "GrIndexBuffer.h" 14 #include "GrIndexBuffer.h"
15 #include "GrRenderTarget.h" 15 #include "GrRenderTarget.h"
16 #include "GrPath.h" 16 #include "GrPath.h"
17 #include "GrPathRange.h" 17 #include "GrPathRange.h"
18 #include "GrSurface.h" 18 #include "GrSurface.h"
19 #include "GrTRecorder.h"
20 #include "GrVertexBuffer.h" 19 #include "GrVertexBuffer.h"
21 20
22 #include "SkClipStack.h" 21 #include "SkClipStack.h"
23 #include "SkTemplates.h" 22 #include "SkTemplates.h"
24 #include "SkTypes.h" 23 #include "SkTypes.h"
25 24
26 class GrGpu; 25 class GrGpu;
27 class GrIndexBufferAllocPool; 26 class GrIndexBufferAllocPool;
28 class GrVertexBufferAllocPool; 27 class GrVertexBufferAllocPool;
29 28
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
81 GrRenderTarget* renderTarget) SK_OVERRIDE; 80 GrRenderTarget* renderTarget) SK_OVERRIDE;
82 81
83 virtual void discard(GrRenderTarget*) SK_OVERRIDE; 82 virtual void discard(GrRenderTarget*) SK_OVERRIDE;
84 83
85 virtual void initCopySurfaceDstDesc(const GrSurface* src, GrTextureDesc* des c) SK_OVERRIDE; 84 virtual void initCopySurfaceDstDesc(const GrSurface* src, GrTextureDesc* des c) SK_OVERRIDE;
86 85
87 protected: 86 protected:
88 virtual void clipWillBeSet(const GrClipData* newClip) SK_OVERRIDE; 87 virtual void clipWillBeSet(const GrClipData* newClip) SK_OVERRIDE;
89 88
90 private: 89 private:
91 enum { 90 enum Cmd {
92 kDraw_Cmd = 1, 91 kDraw_Cmd = 1,
93 kStencilPath_Cmd = 2, 92 kStencilPath_Cmd = 2,
94 kSetState_Cmd = 3, 93 kSetState_Cmd = 3,
95 kSetClip_Cmd = 4, 94 kSetClip_Cmd = 4,
96 kClear_Cmd = 5, 95 kClear_Cmd = 5,
97 kCopySurface_Cmd = 6, 96 kCopySurface_Cmd = 6,
98 kDrawPath_Cmd = 7, 97 kDrawPath_Cmd = 7,
99 kDrawPaths_Cmd = 8, 98 kDrawPaths_Cmd = 8,
100 }; 99 };
101 100
102 struct Cmd : ::SkNoncopyable { 101 class Draw : public DrawInfo {
103 Cmd(uint8_t type) : fType(type) {} 102 public:
104 virtual ~Cmd() {}
105
106 virtual void execute(GrDrawTarget*) = 0;
107
108 uint8_t fType;
109 };
110
111 struct Draw : public Cmd {
112 Draw(const DrawInfo& info, const GrVertexBuffer* vb, const GrIndexBuffer * ib) 103 Draw(const DrawInfo& info, const GrVertexBuffer* vb, const GrIndexBuffer * ib)
113 : Cmd(kDraw_Cmd) 104 : DrawInfo(info)
114 , fInfo(info)
115 , fVertexBuffer(vb) 105 , fVertexBuffer(vb)
116 , fIndexBuffer(ib) {} 106 , fIndexBuffer(ib) {}
117 107
118 const GrVertexBuffer* vertexBuffer() const { return fVertexBuffer.get(); } 108 const GrVertexBuffer* vertexBuffer() const { return fVertexBuffer.get(); }
119 const GrIndexBuffer* indexBuffer() const { return fIndexBuffer.get(); } 109 const GrIndexBuffer* indexBuffer() const { return fIndexBuffer.get(); }
120 110
121 virtual void execute(GrDrawTarget*);
122
123 DrawInfo fInfo;
124
125 private: 111 private:
126 GrPendingIOResource<const GrVertexBuffer, kRead_GrIOType> fVertexBuff er; 112 GrPendingIOResource<const GrVertexBuffer, kRead_GrIOType> fVertexBuff er;
127 GrPendingIOResource<const GrIndexBuffer, kRead_GrIOType> fIndexBuffe r; 113 GrPendingIOResource<const GrIndexBuffer, kRead_GrIOType> fIndexBuffe r;
128 }; 114 };
129 115
130 struct StencilPath : public Cmd { 116 struct StencilPath : public ::SkNoncopyable {
131 StencilPath(const GrPath* path) : Cmd(kStencilPath_Cmd), fPath(path) {} 117 StencilPath(const GrPath* path) : fPath(path) {}
132 118
133 const GrPath* path() const { return fPath.get(); } 119 const GrPath* path() const { return fPath.get(); }
134 120
135 virtual void execute(GrDrawTarget*);
136
137 SkPath::FillType fFill; 121 SkPath::FillType fFill;
138 122
139 private: 123 private:
140 GrPendingIOResource<const GrPath, kRead_GrIOType> fPath; 124 GrPendingIOResource<const GrPath, kRead_GrIOType> fPath;
141 }; 125 };
142 126
143 struct DrawPath : public Cmd { 127 struct DrawPath : public ::SkNoncopyable {
144 DrawPath(const GrPath* path) : Cmd(kDrawPath_Cmd), fPath(path) {} 128 DrawPath(const GrPath* path) : fPath(path) {}
145 129
146 const GrPath* path() const { return fPath.get(); } 130 const GrPath* path() const { return fPath.get(); }
147 131
148 virtual void execute(GrDrawTarget*);
149
150 SkPath::FillType fFill; 132 SkPath::FillType fFill;
151 GrDeviceCoordTexture fDstCopy; 133 GrDeviceCoordTexture fDstCopy;
152 134
153 private: 135 private:
154 GrPendingIOResource<const GrPath, kRead_GrIOType> fPath; 136 GrPendingIOResource<const GrPath, kRead_GrIOType> fPath;
155 }; 137 };
156 138
157 struct DrawPaths : public Cmd { 139 struct DrawPaths : public ::SkNoncopyable {
158 DrawPaths(const GrPathRange* pathRange) : Cmd(kDrawPaths_Cmd), fPathRang e(pathRange) {} 140 DrawPaths(const GrPathRange* pathRange)
141 : fPathRange(pathRange) {}
142
143 ~DrawPaths() {
144 if (fTransforms) {
145 SkDELETE_ARRAY(fTransforms);
146 }
147 if (fIndices) {
148 SkDELETE_ARRAY(fIndices);
149 }
150 }
159 151
160 const GrPathRange* pathRange() const { return fPathRange.get(); } 152 const GrPathRange* pathRange() const { return fPathRange.get(); }
161 uint32_t* indices() { return reinterpret_cast<uint32_t*>(CmdBuffer::GetD ataForItem(this)); }
162 float* transforms() { return reinterpret_cast<float*>(&this->indices()[f Count]); }
163 153
164 virtual void execute(GrDrawTarget*); 154 uint32_t* fIndices;
165
166 size_t fCount; 155 size_t fCount;
156 float* fTransforms;
167 PathTransformType fTransformsType; 157 PathTransformType fTransformsType;
168 SkPath::FillType fFill; 158 SkPath::FillType fFill;
169 GrDeviceCoordTexture fDstCopy; 159 GrDeviceCoordTexture fDstCopy;
170 160
171 private: 161 private:
172 GrPendingIOResource<const GrPathRange, kRead_GrIOType> fPathRange; 162 GrPendingIOResource<const GrPathRange, kRead_GrIOType> fPathRange;
173 }; 163 };
174 164
175 // This is also used to record a discard by setting the color to GrColor_ILL EGAL 165 // This is also used to record a discard by setting the color to GrColor_ILL EGAL
176 struct Clear : public Cmd { 166 struct Clear : public ::SkNoncopyable {
177 Clear(GrRenderTarget* rt) : Cmd(kClear_Cmd), fRenderTarget(rt) {} 167 Clear(GrRenderTarget* rt) : fRenderTarget(rt) {}
178 168 ~Clear() { }
179 GrRenderTarget* renderTarget() const { return fRenderTarget.get(); } 169 GrRenderTarget* renderTarget() const { return fRenderTarget.get(); }
180 170
181 virtual void execute(GrDrawTarget*);
182
183 SkIRect fRect; 171 SkIRect fRect;
184 GrColor fColor; 172 GrColor fColor;
185 bool fCanIgnoreRect; 173 bool fCanIgnoreRect;
186 174
187 private: 175 private:
188 GrPendingIOResource<GrRenderTarget, kWrite_GrIOType> fRenderTarget; 176 GrPendingIOResource<GrRenderTarget, kWrite_GrIOType> fRenderTarget;
189 }; 177 };
190 178
191 struct CopySurface : public Cmd { 179 struct CopySurface : public ::SkNoncopyable {
192 CopySurface(GrSurface* dst, GrSurface* src) : Cmd(kCopySurface_Cmd), fDs t(dst), fSrc(src) {} 180 CopySurface(GrSurface* dst, GrSurface* src) : fDst(dst), fSrc(src) {}
193 181
194 GrSurface* dst() const { return fDst.get(); } 182 GrSurface* dst() const { return fDst.get(); }
195 GrSurface* src() const { return fSrc.get(); } 183 GrSurface* src() const { return fSrc.get(); }
196 184
197 virtual void execute(GrDrawTarget*);
198
199 SkIPoint fDstPoint; 185 SkIPoint fDstPoint;
200 SkIRect fSrcRect; 186 SkIRect fSrcRect;
201 187
202 private: 188 private:
203 GrPendingIOResource<GrSurface, kWrite_GrIOType> fDst; 189 GrPendingIOResource<GrSurface, kWrite_GrIOType> fDst;
204 GrPendingIOResource<GrSurface, kRead_GrIOType> fSrc; 190 GrPendingIOResource<GrSurface, kRead_GrIOType> fSrc;
205 }; 191 };
206 192
207 struct SetState : public Cmd { 193 struct Clip : public ::SkNoncopyable {
208 SetState(const GrDrawState& state) : Cmd(kSetState_Cmd), fState(state) { } 194 SkClipStack fStack;
209 195 SkIPoint fOrigin;
210 virtual void execute(GrDrawTarget*);
211
212 GrDrawState fState;
213 }; 196 };
214 197
215 struct SetClip : public Cmd {
216 SetClip(const GrClipData* clipData)
217 : Cmd(kSetClip_Cmd),
218 fStackStorage(*clipData->fClipStack) {
219 fClipData.fClipStack = &fStackStorage;
220 fClipData.fOrigin = clipData->fOrigin;
221 }
222
223 virtual void execute(GrDrawTarget*);
224
225 GrClipData fClipData;
226
227 private:
228 SkClipStack fStackStorage;
229 };
230
231 typedef void* TCmdAlign; // This wouldn't be enough align if a command used long double.
232 typedef GrTRecorder<Cmd, TCmdAlign> CmdBuffer;
233
234 // overrides from GrDrawTarget 198 // overrides from GrDrawTarget
235 virtual void onDraw(const DrawInfo&) SK_OVERRIDE; 199 virtual void onDraw(const DrawInfo&) SK_OVERRIDE;
236 virtual void onDrawRect(const SkRect& rect, 200 virtual void onDrawRect(const SkRect& rect,
237 const SkRect* localRect, 201 const SkRect* localRect,
238 const SkMatrix* localMatrix) SK_OVERRIDE; 202 const SkMatrix* localMatrix) SK_OVERRIDE;
239 203
240 virtual void onStencilPath(const GrPath*, SkPath::FillType) SK_OVERRIDE; 204 virtual void onStencilPath(const GrPath*, SkPath::FillType) SK_OVERRIDE;
241 virtual void onDrawPath(const GrPath*, SkPath::FillType, 205 virtual void onDrawPath(const GrPath*, SkPath::FillType,
242 const GrDeviceCoordTexture* dstCopy) SK_OVERRIDE; 206 const GrDeviceCoordTexture* dstCopy) SK_OVERRIDE;
243 virtual void onDrawPaths(const GrPathRange*, 207 virtual void onDrawPaths(const GrPathRange*,
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
276 virtual void didAddGpuTraceMarker() SK_OVERRIDE {} 240 virtual void didAddGpuTraceMarker() SK_OVERRIDE {}
277 virtual void didRemoveGpuTraceMarker() SK_OVERRIDE {} 241 virtual void didRemoveGpuTraceMarker() SK_OVERRIDE {}
278 242
279 // Attempts to concat instances from info onto the previous draw. info must represent an 243 // Attempts to concat instances from info onto the previous draw. info must represent an
280 // instanced draw. The caller must have already recorded a new draw state an d clip if necessary. 244 // instanced draw. The caller must have already recorded a new draw state an d clip if necessary.
281 int concatInstancedDraw(const DrawInfo& info); 245 int concatInstancedDraw(const DrawInfo& info);
282 246
283 // Determines whether the current draw operation requieres a new drawstate a nd if so records it. 247 // Determines whether the current draw operation requieres a new drawstate a nd if so records it.
284 void recordStateIfNecessary(); 248 void recordStateIfNecessary();
285 // We lazily record clip changes in order to skip clips that have no effect. 249 // We lazily record clip changes in order to skip clips that have no effect.
286 void recordClipIfNecessary(); 250 bool needsNewClip() const;
287 // Records any trace markers for a command after adding it to the buffer. 251
288 void recordTraceMarkersIfNecessary(); 252 // these functions record a command
253 void recordState();
254 void recordClip();
255 Draw* recordDraw(const DrawInfo&, const GrVertexBuffer*, const GrI ndexBuffer*);
256 StencilPath* recordStencilPath(const GrPath*);
257 DrawPath* recordDrawPath(const GrPath*);
258 DrawPaths* recordDrawPaths(const GrPathRange*);
259 Clear* recordClear(GrRenderTarget*);
260 CopySurface* recordCopySurface(GrSurface* dst, GrSurface* src);
289 261
290 virtual bool isIssued(uint32_t drawID) { return drawID != fDrawID; } 262 virtual bool isIssued(uint32_t drawID) { return drawID != fDrawID; }
263 void addToCmdBuffer(uint8_t cmd);
291 264
292 // TODO: Use a single allocator for commands and records 265 // TODO: Use a single allocator for commands and records
293 enum { 266 enum {
294 kCmdBufferInitialSizeInBytes = 64 * 1024, 267 kCmdPreallocCnt = 32,
295 kGeoPoolStatePreAllocCnt = 4, 268 kDrawPreallocCnt = 16,
269 kStencilPathPreallocCnt = 8,
270 kDrawPathPreallocCnt = 8,
271 kDrawPathsPreallocCnt = 8,
272 kStatePreallocCnt = 8,
273 kClipPreallocCnt = 8,
274 kClearPreallocCnt = 8,
275 kGeoPoolStatePreAllocCnt = 4,
276 kCopySurfacePreallocCnt = 4,
296 }; 277 };
297 278
298 CmdBuffer fCmdBuffer; 279 typedef GrTAllocator<Draw> DrawAllocator;
299 GrDrawState* fLastState; 280 typedef GrTAllocator<StencilPath> StencilPathAllocator;
300 GrClipData* fLastClip; 281 typedef GrTAllocator<DrawPath> DrawPathAllocator;
282 typedef GrTAllocator<DrawPaths> DrawPathsAllocator;
283 typedef GrTAllocator<GrDrawState> StateAllocator;
284 typedef GrTAllocator<Clear> ClearAllocator;
285 typedef GrTAllocator<CopySurface> CopySurfaceAllocator;
286 typedef GrTAllocator<Clip> ClipAllocator;
301 287
302 SkTArray<GrTraceMarkerSet, false> fGpuCmdMarkers; 288 GrSTAllocator<kDrawPreallocCnt, Draw> fDraws;
303 GrDrawTarget* fDstGpu; 289 GrSTAllocator<kStencilPathPreallocCnt, StencilPath> fStencilPaths;
304 bool fClipSet; 290 GrSTAllocator<kDrawPathPreallocCnt, DrawPath> fDrawPath;
291 GrSTAllocator<kDrawPathsPreallocCnt, DrawPaths> fDrawPaths;
292 GrSTAllocator<kStatePreallocCnt, GrDrawState> fStates;
293 GrSTAllocator<kClearPreallocCnt, Clear> fClears;
294 GrSTAllocator<kCopySurfacePreallocCnt, CopySurface> fCopySurfaces;
295 GrSTAllocator<kClipPreallocCnt, Clip> fClips;
296
297 SkTArray<GrTraceMarkerSet, false> fGpuCmdMarkers;
298 SkSTArray<kCmdPreallocCnt, uint8_t, true> fCmds;
299 GrDrawTarget* fDstGpu;
300 bool fClipSet;
305 301
306 enum ClipProxyState { 302 enum ClipProxyState {
307 kUnknown_ClipProxyState, 303 kUnknown_ClipProxyState,
308 kValid_ClipProxyState, 304 kValid_ClipProxyState,
309 kInvalid_ClipProxyState 305 kInvalid_ClipProxyState
310 }; 306 };
311 307
312 ClipProxyState fClipProxyState; 308 ClipProxyState fClipProxyState;
313 SkRect fClipProxy; 309 SkRect fClipProxy;
314 GrVertexBufferAllocPool& fVertexPool; 310 GrVertexBufferAllocPool& fVertexPool;
(...skipping 14 matching lines...) Expand all
329 typedef SkSTArray<kGeoPoolStatePreAllocCnt, GeometryPoolState> GeoPoolStateS tack; 325 typedef SkSTArray<kGeoPoolStatePreAllocCnt, GeometryPoolState> GeoPoolStateS tack;
330 326
331 GeoPoolStateStack fGeoPoolStateStack; 327 GeoPoolStateStack fGeoPoolStateStack;
332 bool fFlushing; 328 bool fFlushing;
333 uint32_t fDrawID; 329 uint32_t fDrawID;
334 330
335 typedef GrDrawTarget INHERITED; 331 typedef GrDrawTarget INHERITED;
336 }; 332 };
337 333
338 #endif 334 #endif
OLDNEW
« no previous file with comments | « gyp/tests.gypi ('k') | src/gpu/GrInOrderDrawBuffer.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698