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

Side by Side Diff: src/gpu/GrDrawTarget.cpp

Issue 1538013002: Add Drawing Manager guards against re-entrant flushes (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: Created 5 years 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 | « src/gpu/GrDrawTarget.h ('k') | src/gpu/GrDrawingManager.h » ('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 /* 2 /*
3 * Copyright 2010 Google Inc. 3 * Copyright 2010 Google Inc.
4 * 4 *
5 * Use of this source code is governed by a BSD-style license that can be 5 * Use of this source code is governed by a BSD-style license that can be
6 * found in the LICENSE file. 6 * found in the LICENSE file.
7 */ 7 */
8 8
9 #include "GrDrawTarget.h" 9 #include "GrDrawTarget.h"
10 10
(...skipping 21 matching lines...) Expand all
32 32
33 //////////////////////////////////////////////////////////////////////////////// 33 ////////////////////////////////////////////////////////////////////////////////
34 34
35 // Experimentally we have found that most batching occurs within the first 10 co mparisons. 35 // Experimentally we have found that most batching occurs within the first 10 co mparisons.
36 static const int kDefaultMaxBatchLookback = 10; 36 static const int kDefaultMaxBatchLookback = 10;
37 37
38 GrDrawTarget::GrDrawTarget(GrRenderTarget* rt, GrGpu* gpu, GrResourceProvider* r esourceProvider, 38 GrDrawTarget::GrDrawTarget(GrRenderTarget* rt, GrGpu* gpu, GrResourceProvider* r esourceProvider,
39 const Options& options) 39 const Options& options)
40 : fGpu(SkRef(gpu)) 40 : fGpu(SkRef(gpu))
41 , fResourceProvider(resourceProvider) 41 , fResourceProvider(resourceProvider)
42 , fFlushing(false)
43 , fFlags(0) 42 , fFlags(0)
44 , fRenderTarget(rt) { 43 , fRenderTarget(rt) {
45 // TODO: Stop extracting the context (currently needed by GrClipMaskManager) 44 // TODO: Stop extracting the context (currently needed by GrClipMaskManager)
46 fContext = fGpu->getContext(); 45 fContext = fGpu->getContext();
47 fClipMaskManager.reset(new GrClipMaskManager(this, options.fClipBatchToBound s)); 46 fClipMaskManager.reset(new GrClipMaskManager(this, options.fClipBatchToBound s));
48 47
49 fDrawBatchBounds = options.fDrawBatchBounds; 48 fDrawBatchBounds = options.fDrawBatchBounds;
50 fMaxBatchLookback = (options.fMaxBatchLookback < 0) ? kDefaultMaxBatchLookba ck : 49 fMaxBatchLookback = (options.fMaxBatchLookback < 0) ? kDefaultMaxBatchLookba ck :
51 options.fMaxBatchLookb ack; 50 options.fMaxBatchLookb ack;
52 51
(...skipping 123 matching lines...) Expand 10 before | Expand all | Expand 10 after
176 return false; 175 return false;
177 } 176 }
178 SkIPoint dstPoint = {0, 0}; 177 SkIPoint dstPoint = {0, 0};
179 this->copySurface(copy, rt, copyRect, dstPoint); 178 this->copySurface(copy, rt, copyRect, dstPoint);
180 dstTexture->setTexture(copy); 179 dstTexture->setTexture(copy);
181 dstTexture->setOffset(copyRect.fLeft, copyRect.fTop); 180 dstTexture->setOffset(copyRect.fLeft, copyRect.fTop);
182 return true; 181 return true;
183 } 182 }
184 183
185 void GrDrawTarget::prepareBatches(GrBatchFlushState* flushState) { 184 void GrDrawTarget::prepareBatches(GrBatchFlushState* flushState) {
186 if (fFlushing) {
187 return;
188 }
189 fFlushing = true;
190
191 // Semi-usually the drawTargets are already closed at this point, but someti mes Ganesh 185 // Semi-usually the drawTargets are already closed at this point, but someti mes Ganesh
192 // needs to flush mid-draw. In that case, the SkGpuDevice's drawTargets won' t be closed 186 // needs to flush mid-draw. In that case, the SkGpuDevice's drawTargets won' t be closed
193 // but need to be flushed anyway. Closing such drawTargets here will mean ne w 187 // but need to be flushed anyway. Closing such drawTargets here will mean ne w
194 // drawTargets will be created to replace them if the SkGpuDevice(s) write t o them again. 188 // drawTargets will be created to replace them if the SkGpuDevice(s) write t o them again.
195 this->makeClosed(); 189 this->makeClosed();
196 190
197 // Loop over the batches that haven't yet generated their geometry 191 // Loop over the batches that haven't yet generated their geometry
198 for (int i = 0; i < fBatches.count(); ++i) { 192 for (int i = 0; i < fBatches.count(); ++i) {
199 fBatches[i]->prepare(flushState); 193 fBatches[i]->prepare(flushState);
200 } 194 }
201 } 195 }
202 196
203 void GrDrawTarget::drawBatches(GrBatchFlushState* flushState) { 197 void GrDrawTarget::drawBatches(GrBatchFlushState* flushState) {
204 // Draw all the generated geometry. 198 // Draw all the generated geometry.
205 SkRandom random; 199 SkRandom random;
206 for (int i = 0; i < fBatches.count(); ++i) { 200 for (int i = 0; i < fBatches.count(); ++i) {
207 if (fDrawBatchBounds) { 201 if (fDrawBatchBounds) {
208 const SkRect& bounds = fBatches[i]->bounds(); 202 const SkRect& bounds = fBatches[i]->bounds();
209 SkIRect ibounds; 203 SkIRect ibounds;
210 bounds.roundOut(&ibounds); 204 bounds.roundOut(&ibounds);
211 // In multi-draw buffer all the batches use the same render target a nd we won't need to 205 // In multi-draw buffer all the batches use the same render target a nd we won't need to
212 // get the batchs bounds. 206 // get the batchs bounds.
213 if (GrRenderTarget* rt = fBatches[i]->renderTarget()) { 207 if (GrRenderTarget* rt = fBatches[i]->renderTarget()) {
214 fGpu->drawDebugWireRect(rt, ibounds, 0xFF000000 | random.nextU() ); 208 fGpu->drawDebugWireRect(rt, ibounds, 0xFF000000 | random.nextU() );
215 } 209 }
216 } 210 }
217 fBatches[i]->draw(flushState); 211 fBatches[i]->draw(flushState);
218 } 212 }
219
220 fFlushing = false;
221 } 213 }
222 214
223 void GrDrawTarget::reset() { 215 void GrDrawTarget::reset() {
224 fBatches.reset(); 216 fBatches.reset();
225 } 217 }
226 218
227 void GrDrawTarget::drawBatch(const GrPipelineBuilder& pipelineBuilder, GrDrawBat ch* batch) { 219 void GrDrawTarget::drawBatch(const GrPipelineBuilder& pipelineBuilder, GrDrawBat ch* batch) {
228 // Setup clip 220 // Setup clip
229 GrPipelineBuilder::AutoRestoreStencil ars; 221 GrPipelineBuilder::AutoRestoreStencil ars;
230 GrAppliedClip clip; 222 GrAppliedClip clip;
(...skipping 313 matching lines...) Expand 10 before | Expand all | Expand 10 after
544 } 536 }
545 537
546 return true; 538 return true;
547 } 539 }
548 540
549 void GrDrawTarget::clearStencilClip(const SkIRect& rect, bool insideClip, GrRend erTarget* rt) { 541 void GrDrawTarget::clearStencilClip(const SkIRect& rect, bool insideClip, GrRend erTarget* rt) {
550 GrBatch* batch = new GrClearStencilClipBatch(rect, insideClip, rt); 542 GrBatch* batch = new GrClearStencilClipBatch(rect, insideClip, rt);
551 this->recordBatch(batch); 543 this->recordBatch(batch);
552 batch->unref(); 544 batch->unref();
553 } 545 }
OLDNEW
« no previous file with comments | « src/gpu/GrDrawTarget.h ('k') | src/gpu/GrDrawingManager.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698