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

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

Issue 1966763002: Eliminate special case nvpr batch handling (Closed) Base URL: https://skia.googlesource.com/skia.git@reallyupload_userstencil
Patch Set: Created 4 years, 7 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
OLDNEW
1 /* 1 /*
2 * Copyright 2010 Google Inc. 2 * Copyright 2010 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 #include "GrDrawTarget.h" 8 #include "GrDrawTarget.h"
9 9
10 #include "GrAuditTrail.h" 10 #include "GrAuditTrail.h"
(...skipping 252 matching lines...) Expand 10 before | Expand all | Expand 10 after
263 } 263 }
264 264
265 #ifdef ENABLE_MDB 265 #ifdef ENABLE_MDB
266 SkASSERT(fRenderTarget); 266 SkASSERT(fRenderTarget);
267 batch->pipeline()->addDependenciesTo(fRenderTarget); 267 batch->pipeline()->addDependenciesTo(fRenderTarget);
268 #endif 268 #endif
269 269
270 this->recordBatch(batch); 270 this->recordBatch(batch);
271 } 271 }
272 272
273 inline static const GrUserStencilSettings& get_path_stencil_settings_for_fill(
274 GrPathRendering::FillType fill) {
275 static constexpr GrUserStencilSettings kWindingStencilSettings(
276 GrUserStencilSettings::StaticInit<
277 0xffff,
278 GrUserStencilTest::kAlwaysIfInClip,
279 0xffff,
280 GrUserStencilOp::kIncMaybeClamp, // TODO: Use wrap ops for NVPR.
281 GrUserStencilOp::kIncMaybeClamp,
282 0xffff>()
283 );
284
285 static constexpr GrUserStencilSettings kEvenOddStencilSettings(
286 GrUserStencilSettings::StaticInit<
287 0xffff,
288 GrUserStencilTest::kAlwaysIfInClip,
289 0xffff,
290 GrUserStencilOp::kInvert,
291 GrUserStencilOp::kInvert,
292 0xffff>()
293 );
294
295 switch (fill) {
296 default:
297 SkFAIL("Unexpected path fill.");
298 case GrPathRendering::kWinding_FillType:
299 return kWindingStencilSettings;
300 case GrPathRendering::kEvenOdd_FillType:
301 return kEvenOddStencilSettings;
302 }
303 }
304
305 void GrDrawTarget::stencilPath(const GrPipelineBuilder& pipelineBuilder, 273 void GrDrawTarget::stencilPath(const GrPipelineBuilder& pipelineBuilder,
306 const SkMatrix& viewMatrix, 274 const SkMatrix& viewMatrix,
307 const GrPath* path, 275 const GrPath* path,
308 GrPathRendering::FillType fill) { 276 GrPathRendering::FillType fill) {
309 // TODO: extract portions of checkDraw that are relevant to path stenciling. 277 // TODO: extract portions of checkDraw that are relevant to path stenciling.
310 SkASSERT(path); 278 SkASSERT(path);
311 SkASSERT(this->caps()->shaderCaps()->pathRenderingSupport()); 279 SkASSERT(this->caps()->shaderCaps()->pathRenderingSupport());
312 280
313 // Setup clip 281 // Setup clip
314 GrAppliedClip clip; 282 GrAppliedClip clip;
315 if (!fClipMaskManager->setupClipping(pipelineBuilder, nullptr, &clip)) { 283 if (!fClipMaskManager->setupClipping(pipelineBuilder, nullptr, &clip)) {
316 return; 284 return;
317 } 285 }
318 286
319 GrPipelineBuilder::AutoRestoreFragmentProcessorState arfps; 287 GrPipelineBuilder::AutoRestoreFragmentProcessorState arfps;
320 if (clip.clipCoverageFragmentProcessor()) { 288 if (clip.clipCoverageFragmentProcessor()) {
321 arfps.set(&pipelineBuilder); 289 arfps.set(&pipelineBuilder);
322 arfps.addCoverageFragmentProcessor(clip.clipCoverageFragmentProcessor()) ; 290 arfps.addCoverageFragmentProcessor(clip.clipCoverageFragmentProcessor()) ;
323 } 291 }
324 292
325 GrRenderTarget* rt = pipelineBuilder.getRenderTarget(); 293 const GrRenderTargetPriv& rtPriv = pipelineBuilder.getRenderTarget()->render TargetPriv();
326 GrStencilAttachment* stencilAttachment = rt->renderTargetPriv().getStencilAt tachment();
327 SkASSERT(stencilAttachment)
328 294
329 GrBatch* batch = GrStencilPathBatch::Create(viewMatrix, 295 GrBatch* batch = GrStencilPathBatch::Create(viewMatrix,
330 pipelineBuilder.isHWAntialias(), 296 pipelineBuilder.isHWAntialias(),
331 get_path_stencil_settings_for_fi ll(fill), 297 fill,
332 clip.hasStencilClip(), 298 clip.hasStencilClip(),
333 stencilAttachment->bits(), 299 rtPriv.numStencilBits(),
334 clip.scissorState(), 300 clip.scissorState(),
335 pipelineBuilder.getRenderTarget( ), 301 pipelineBuilder.getRenderTarget( ),
336 path); 302 path);
337 this->recordBatch(batch); 303 this->recordBatch(batch);
338 batch->unref(); 304 batch->unref();
339 } 305 }
340 306
341 void GrDrawTarget::drawPathBatch(const GrPipelineBuilder& pipelineBuilder,
342 GrDrawPathBatchBase* batch) {
343 // This looks like drawBatch() but there is an added wrinkle that stencil se ttings get inserted
344 // after setting up clipping but before onDrawBatch(). TODO: Figure out a be tter model for
345 // handling stencil settings WRT interactions between pipeline(builder), cli pmaskmanager, and
346 // batches.
347 SkASSERT(this->caps()->shaderCaps()->pathRenderingSupport());
348
349 GrAppliedClip clip;
350 if (!fClipMaskManager->setupClipping(pipelineBuilder, &batch->bounds(), &cli p)) {
351 return;
352 }
353
354 GrPipelineBuilder::AutoRestoreFragmentProcessorState arfps;
355 if (clip.clipCoverageFragmentProcessor()) {
356 arfps.set(&pipelineBuilder);
357 arfps.addCoverageFragmentProcessor(clip.clipCoverageFragmentProcessor()) ;
358 }
359
360 // Ensure the render target has a stencil buffer and get the stencil setting s.
361 GrRenderTarget* rt = pipelineBuilder.getRenderTarget();
362 GrStencilAttachment* sb = fResourceProvider->attachStencilAttachment(rt);
363 // TODO: Move this step into GrDrawPathPath::onPrepare().
364 batch->setStencilSettings(get_path_stencil_settings_for_fill(batch->fillType ()),
365 clip.hasStencilClip(),
366 sb->bits());
367
368 GrPipeline::CreateArgs args;
369 if (!this->installPipelineInDrawBatch(&pipelineBuilder, &clip.scissorState() ,
370 clip.hasStencilClip(), batch)) {
371 return;
372 }
373
374 this->recordBatch(batch);
375 }
376
377 void GrDrawTarget::clear(const SkIRect* rect, 307 void GrDrawTarget::clear(const SkIRect* rect,
378 GrColor color, 308 GrColor color,
379 bool canIgnoreRect, 309 bool canIgnoreRect,
380 GrRenderTarget* renderTarget) { 310 GrRenderTarget* renderTarget) {
381 SkIRect rtRect = SkIRect::MakeWH(renderTarget->width(), renderTarget->height ()); 311 SkIRect rtRect = SkIRect::MakeWH(renderTarget->width(), renderTarget->height ());
382 SkIRect clippedRect; 312 SkIRect clippedRect;
383 if (!rect || 313 if (!rect ||
384 (canIgnoreRect && this->caps()->fullClearIsFree()) || 314 (canIgnoreRect && this->caps()->fullClearIsFree()) ||
385 rect->contains(rtRect)) { 315 rect->contains(rtRect)) {
386 rect = &rtRect; 316 rect = &rtRect;
(...skipping 164 matching lines...) Expand 10 before | Expand all | Expand 10 after
551 481
552 bool GrDrawTarget::installPipelineInDrawBatch(const GrPipelineBuilder* pipelineB uilder, 482 bool GrDrawTarget::installPipelineInDrawBatch(const GrPipelineBuilder* pipelineB uilder,
553 const GrScissorState* scissor, 483 const GrScissorState* scissor,
554 bool hasStencilClip, 484 bool hasStencilClip,
555 GrDrawBatch* batch) { 485 GrDrawBatch* batch) {
556 GrPipeline::CreateArgs args; 486 GrPipeline::CreateArgs args;
557 args.fPipelineBuilder = pipelineBuilder; 487 args.fPipelineBuilder = pipelineBuilder;
558 args.fCaps = this->caps(); 488 args.fCaps = this->caps();
559 args.fScissor = scissor; 489 args.fScissor = scissor;
560 if (pipelineBuilder->hasUserStencilSettings() || hasStencilClip) { 490 if (pipelineBuilder->hasUserStencilSettings() || hasStencilClip) {
561 GrRenderTarget* rt = pipelineBuilder->getRenderTarget(); 491 fResourceProvider->attachStencilAttachment(pipelineBuilder->getRenderTar get());
562 GrStencilAttachment* sb = fResourceProvider->attachStencilAttachment(rt) ;
563 args.fNumStencilBits = sb->bits();
564 } else {
565 args.fNumStencilBits = 0;
566 } 492 }
567 args.fHasStencilClip = hasStencilClip; 493 args.fHasStencilClip = hasStencilClip;
568 batch->getPipelineOptimizations(&args.fOpts); 494 batch->getPipelineOptimizations(&args.fOpts);
569 GrScissorState finalScissor; 495 GrScissorState finalScissor;
570 if (args.fOpts.fOverrides.fUsePLSDstRead) { 496 if (args.fOpts.fOverrides.fUsePLSDstRead) {
571 GrRenderTarget* rt = pipelineBuilder->getRenderTarget(); 497 GrRenderTarget* rt = pipelineBuilder->getRenderTarget();
572 GrGLIRect viewport; 498 GrGLIRect viewport;
573 viewport.fLeft = 0; 499 viewport.fLeft = 0;
574 viewport.fBottom = 0; 500 viewport.fBottom = 0;
575 viewport.fWidth = rt->width(); 501 viewport.fWidth = rt->width();
(...skipping 30 matching lines...) Expand all
606 } 532 }
607 533
608 return true; 534 return true;
609 } 535 }
610 536
611 void GrDrawTarget::clearStencilClip(const SkIRect& rect, bool insideClip, GrRend erTarget* rt) { 537 void GrDrawTarget::clearStencilClip(const SkIRect& rect, bool insideClip, GrRend erTarget* rt) {
612 GrBatch* batch = new GrClearStencilClipBatch(rect, insideClip, rt); 538 GrBatch* batch = new GrClearStencilClipBatch(rect, insideClip, rt);
613 this->recordBatch(batch); 539 this->recordBatch(batch);
614 batch->unref(); 540 batch->unref();
615 } 541 }
OLDNEW
« no previous file with comments | « src/gpu/GrDrawTarget.h ('k') | src/gpu/GrPathRendering.h » ('j') | src/gpu/GrPipeline.h » ('J')

Powered by Google App Engine
This is Rietveld 408576698