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

Unified Diff: src/gpu/GrDrawTarget.cpp

Issue 1962243002: Separate user and raw stencil settings (Closed) Base URL: https://skia.googlesource.com/skia.git@master
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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « src/gpu/GrDrawTarget.h ('k') | src/gpu/GrGpu.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/gpu/GrDrawTarget.cpp
diff --git a/src/gpu/GrDrawTarget.cpp b/src/gpu/GrDrawTarget.cpp
index 0f180dc861b92ced07c2ddc9548564894f7642b0..7166fc7160008159ab4bcc7208fcb6ae8d93f64f 100644
--- a/src/gpu/GrDrawTarget.cpp
+++ b/src/gpu/GrDrawTarget.cpp
@@ -16,6 +16,7 @@
#include "GrRenderTarget.h"
#include "GrResourceProvider.h"
#include "GrRenderTargetPriv.h"
+#include "GrStencilAttachment.h"
#include "GrSurfacePriv.h"
#include "GrTexture.h"
#include "gl/GrGLRenderTarget.h"
@@ -235,17 +236,16 @@ void GrDrawTarget::drawBatch(const GrPipelineBuilder& pipelineBuilder,
GrDrawBatch* batch,
const SkIRect* scissorRect) {
// Setup clip
- GrPipelineBuilder::AutoRestoreStencil ars;
GrAppliedClip clip;
if (scissorRect) {
SkASSERT(GrClip::kWideOpen_ClipType == pipelineBuilder.clip().clipType());
- if (!fClipMaskManager->setupScissorClip(pipelineBuilder, &ars, *scissorRect,
+ if (!fClipMaskManager->setupScissorClip(pipelineBuilder, *scissorRect,
&batch->bounds(), &clip)) {
return;
}
} else {
- if (!fClipMaskManager->setupClipping(pipelineBuilder, &ars, &batch->bounds(), &clip)) {
+ if (!fClipMaskManager->setupClipping(pipelineBuilder, &batch->bounds(), &clip)) {
return;
}
}
@@ -257,7 +257,8 @@ void GrDrawTarget::drawBatch(const GrPipelineBuilder& pipelineBuilder,
}
GrPipeline::CreateArgs args;
- if (!this->installPipelineInDrawBatch(&pipelineBuilder, &clip.scissorState(), batch)) {
+ if (!this->installPipelineInDrawBatch(&pipelineBuilder, &clip.scissorState(),
+ clip.hasStencilClip(), batch)) {
return;
}
@@ -269,34 +270,36 @@ void GrDrawTarget::drawBatch(const GrPipelineBuilder& pipelineBuilder,
this->recordBatch(batch);
}
-void GrDrawTarget::getPathStencilSettingsForFilltype(GrPathRendering::FillType fill,
- const GrStencilAttachment* sb,
- GrStencilSettings* outStencilSettings) {
- static constexpr GrStencilSettings kWindingStencilSettings(
- kIncClamp_StencilOp,
- kIncClamp_StencilOp,
- kAlwaysIfInClip_StencilFunc,
- 0xFFFF, 0xFFFF, 0xFFFF
+inline static const GrUserStencilSettings& get_path_stencil_settings_for_fill(
+ GrPathRendering::FillType fill) {
+ static constexpr GrUserStencilSettings kWindingStencilSettings(
+ GrUserStencilSettings::StaticInit<
+ 0xffff,
+ GrUserStencilTest::kAlwaysIfInClip,
+ 0xffff,
+ GrUserStencilOp::kIncMaybeClamp, // TODO: Use wrap ops for NVPR.
+ GrUserStencilOp::kIncMaybeClamp,
+ 0xffff>()
);
- static constexpr GrStencilSettings kEvenODdStencilSettings(
- kInvert_StencilOp,
- kInvert_StencilOp,
- kAlwaysIfInClip_StencilFunc,
- 0xFFFF, 0xFFFF, 0xFFFF
+ static constexpr GrUserStencilSettings kEvenOddStencilSettings(
+ GrUserStencilSettings::StaticInit<
+ 0xffff,
+ GrUserStencilTest::kAlwaysIfInClip,
+ 0xffff,
+ GrUserStencilOp::kInvert,
+ GrUserStencilOp::kInvert,
+ 0xffff>()
);
switch (fill) {
default:
SkFAIL("Unexpected path fill.");
case GrPathRendering::kWinding_FillType:
- *outStencilSettings = kWindingStencilSettings;
- break;
+ return kWindingStencilSettings;
case GrPathRendering::kEvenOdd_FillType:
- *outStencilSettings = kEvenODdStencilSettings;
- break;
+ return kEvenOddStencilSettings;
}
- fClipMaskManager->adjustPathStencilParams(sb, outStencilSettings);
}
void GrDrawTarget::stencilPath(const GrPipelineBuilder& pipelineBuilder,
@@ -308,9 +311,8 @@ void GrDrawTarget::stencilPath(const GrPipelineBuilder& pipelineBuilder,
SkASSERT(this->caps()->shaderCaps()->pathRenderingSupport());
// Setup clip
- GrPipelineBuilder::AutoRestoreStencil ars;
GrAppliedClip clip;
- if (!fClipMaskManager->setupClipping(pipelineBuilder, &ars, nullptr, &clip)) {
+ if (!fClipMaskManager->setupClipping(pipelineBuilder, nullptr, &clip)) {
return;
}
@@ -320,15 +322,15 @@ void GrDrawTarget::stencilPath(const GrPipelineBuilder& pipelineBuilder,
arfps.addCoverageFragmentProcessor(clip.clipCoverageFragmentProcessor());
}
- // set stencil settings for path
- GrStencilSettings stencilSettings;
GrRenderTarget* rt = pipelineBuilder.getRenderTarget();
- GrStencilAttachment* sb = fResourceProvider->attachStencilAttachment(rt);
- this->getPathStencilSettingsForFilltype(fill, sb, &stencilSettings);
+ GrStencilAttachment* stencilAttachment = fResourceProvider->attachStencilAttachment(rt);
GrBatch* batch = GrStencilPathBatch::Create(viewMatrix,
pipelineBuilder.isHWAntialias(),
- stencilSettings, clip.scissorState(),
+ get_path_stencil_settings_for_fill(fill),
+ clip.hasStencilClip(),
+ stencilAttachment->bits(),
+ clip.scissorState(),
pipelineBuilder.getRenderTarget(),
path);
this->recordBatch(batch);
@@ -343,9 +345,8 @@ void GrDrawTarget::drawPathBatch(const GrPipelineBuilder& pipelineBuilder,
// batches.
SkASSERT(this->caps()->shaderCaps()->pathRenderingSupport());
- GrPipelineBuilder::AutoRestoreStencil ars;
GrAppliedClip clip;
- if (!fClipMaskManager->setupClipping(pipelineBuilder, &ars, &batch->bounds(), &clip)) {
+ if (!fClipMaskManager->setupClipping(pipelineBuilder, &batch->bounds(), &clip)) {
return;
}
@@ -356,14 +357,16 @@ void GrDrawTarget::drawPathBatch(const GrPipelineBuilder& pipelineBuilder,
}
// Ensure the render target has a stencil buffer and get the stencil settings.
- GrStencilSettings stencilSettings;
GrRenderTarget* rt = pipelineBuilder.getRenderTarget();
GrStencilAttachment* sb = fResourceProvider->attachStencilAttachment(rt);
- this->getPathStencilSettingsForFilltype(batch->fillType(), sb, &stencilSettings);
- batch->setStencilSettings(stencilSettings);
+ // TODO: Move this step into GrDrawPathPath::onPrepare().
+ batch->setStencilSettings(get_path_stencil_settings_for_fill(batch->fillType()),
+ clip.hasStencilClip(),
+ sb->bits());
GrPipeline::CreateArgs args;
- if (!this->installPipelineInDrawBatch(&pipelineBuilder, &clip.scissorState(), batch)) {
+ if (!this->installPipelineInDrawBatch(&pipelineBuilder, &clip.scissorState(),
+ clip.hasStencilClip(), batch)) {
return;
}
@@ -547,11 +550,20 @@ void GrDrawTarget::forwardCombine() {
bool GrDrawTarget::installPipelineInDrawBatch(const GrPipelineBuilder* pipelineBuilder,
const GrScissorState* scissor,
+ bool hasStencilClip,
GrDrawBatch* batch) {
GrPipeline::CreateArgs args;
args.fPipelineBuilder = pipelineBuilder;
args.fCaps = this->caps();
args.fScissor = scissor;
+ if (pipelineBuilder->hasUserStencilSettings() || hasStencilClip) {
+ GrRenderTarget* rt = pipelineBuilder->getRenderTarget();
+ GrStencilAttachment* sb = fResourceProvider->attachStencilAttachment(rt);
+ args.fNumStencilBits = sb->bits();
+ } else {
+ args.fNumStencilBits = 0;
+ }
+ args.fHasStencilClip = hasStencilClip;
batch->getPipelineOptimizations(&args.fOpts);
GrScissorState finalScissor;
if (args.fOpts.fOverrides.fUsePLSDstRead) {
« no previous file with comments | « src/gpu/GrDrawTarget.h ('k') | src/gpu/GrGpu.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698