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

Unified Diff: src/gpu/GrDrawTarget.cpp

Issue 685883003: Clip in grdrawtarget (Closed) Base URL: https://skia.googlesource.com/skia.git@drawtarget_on_clip_manager
Patch Set: add ccclip to ignore Created 6 years, 1 month 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 08a62a534cf0ff0d9f0ee42bf9d0b52659365c78..89300f7e5f0b93b81d7ed27e204940771b1bdc5f 100644
--- a/src/gpu/GrDrawTarget.cpp
+++ b/src/gpu/GrDrawTarget.cpp
@@ -451,6 +451,14 @@ void GrDrawTarget::drawIndexed(GrPrimitiveType type,
int indexCount,
const SkRect* devBounds) {
if (indexCount > 0 && this->checkDraw(type, startVertex, startIndex, vertexCount, indexCount)) {
+ // Setup clip
+ GrClipMaskManager::ScissorState scissorState;
+ GrDrawState::AutoRestoreEffects are;
+ GrDrawState::AutoRestoreStencil ars;
+ if (!this->setupClip(devBounds, &are, &ars, &scissorState)) {
+ return;
+ }
+
DrawInfo info;
info.fPrimitiveType = type;
info.fStartVertex = startVertex;
@@ -469,7 +477,7 @@ void GrDrawTarget::drawIndexed(GrPrimitiveType type,
if (!this->setupDstReadIfNecessary(&info)) {
return;
}
- this->onDraw(info);
+ this->onDraw(info, scissorState);
}
}
@@ -478,6 +486,14 @@ void GrDrawTarget::drawNonIndexed(GrPrimitiveType type,
int vertexCount,
const SkRect* devBounds) {
if (vertexCount > 0 && this->checkDraw(type, startVertex, -1, vertexCount, -1)) {
+ // Setup clip
+ GrClipMaskManager::ScissorState scissorState;
+ GrDrawState::AutoRestoreEffects are;
+ GrDrawState::AutoRestoreStencil ars;
+ if (!this->setupClip(devBounds, &are, &ars, &scissorState)) {
+ return;
+ }
+
DrawInfo info;
info.fPrimitiveType = type;
info.fStartVertex = startVertex;
@@ -492,19 +508,67 @@ void GrDrawTarget::drawNonIndexed(GrPrimitiveType type,
if (devBounds) {
info.setDevBounds(*devBounds);
}
+
// TODO: We should continue with incorrect blending.
if (!this->setupDstReadIfNecessary(&info)) {
return;
}
- this->onDraw(info);
+ this->onDraw(info, scissorState);
+ }
+}
+
+static const GrStencilSettings& winding_path_stencil_settings() {
+ GR_STATIC_CONST_SAME_STENCIL_STRUCT(gSettings,
+ kIncClamp_StencilOp,
+ kIncClamp_StencilOp,
+ kAlwaysIfInClip_StencilFunc,
+ 0xFFFF, 0xFFFF, 0xFFFF);
+ return *GR_CONST_STENCIL_SETTINGS_PTR_FROM_STRUCT_PTR(&gSettings);
+}
+
+static const GrStencilSettings& even_odd_path_stencil_settings() {
+ GR_STATIC_CONST_SAME_STENCIL_STRUCT(gSettings,
+ kInvert_StencilOp,
+ kInvert_StencilOp,
+ kAlwaysIfInClip_StencilFunc,
+ 0xFFFF, 0xFFFF, 0xFFFF);
+ return *GR_CONST_STENCIL_SETTINGS_PTR_FROM_STRUCT_PTR(&gSettings);
+}
+
+void GrDrawTarget::getPathStencilSettingsForFilltype(GrPathRendering::FillType fill,
+ GrStencilSettings* outStencilSettings) {
+
+ switch (fill) {
+ default:
+ SkFAIL("Unexpected path fill.");
+ case GrPathRendering::kWinding_FillType:
+ *outStencilSettings = winding_path_stencil_settings();
+ break;
+ case GrPathRendering::kEvenOdd_FillType:
+ *outStencilSettings = even_odd_path_stencil_settings();
+ break;
}
+ this->clipMaskManager()->adjustPathStencilParams(outStencilSettings);
}
void GrDrawTarget::stencilPath(const GrPath* path, GrPathRendering::FillType fill) {
// TODO: extract portions of checkDraw that are relevant to path stenciling.
SkASSERT(path);
SkASSERT(this->caps()->pathRenderingSupport());
- this->onStencilPath(path, fill);
+
+ // Setup clip
+ GrClipMaskManager::ScissorState scissorState;
+ GrDrawState::AutoRestoreEffects are;
+ GrDrawState::AutoRestoreStencil ars;
+ if (!this->setupClip(NULL, &are, &ars, &scissorState)) {
+ return;
+ }
+
+ // set stencil settings for path
+ GrStencilSettings stencilSettings;
+ this->getPathStencilSettingsForFilltype(fill, &stencilSettings);
+
+ this->onStencilPath(path, scissorState, stencilSettings);
}
void GrDrawTarget::drawPath(const GrPath* path, GrPathRendering::FillType fill) {
@@ -516,12 +580,24 @@ void GrDrawTarget::drawPath(const GrPath* path, GrPathRendering::FillType fill)
SkMatrix viewM = this->drawState()->getViewMatrix();
viewM.mapRect(&devBounds);
+ // Setup clip
+ GrClipMaskManager::ScissorState scissorState;
+ GrDrawState::AutoRestoreEffects are;
+ GrDrawState::AutoRestoreStencil ars;
+ if (!this->setupClip(&devBounds, &are, &ars, &scissorState)) {
+ return;
+ }
+
+ // set stencil settings for path
+ GrStencilSettings stencilSettings;
+ this->getPathStencilSettingsForFilltype(fill, &stencilSettings);
+
GrDeviceCoordTexture dstCopy;
if (!this->setupDstReadIfNecessary(&dstCopy, &devBounds)) {
return;
}
- this->onDrawPath(path, fill, dstCopy.texture() ? &dstCopy : NULL);
+ this->onDrawPath(path, scissorState, stencilSettings, dstCopy.texture() ? &dstCopy : NULL);
}
void GrDrawTarget::drawPaths(const GrPathRange* pathRange,
@@ -533,6 +609,19 @@ void GrDrawTarget::drawPaths(const GrPathRange* pathRange,
SkASSERT(indices);
SkASSERT(transforms);
+ // Setup clip
+ GrClipMaskManager::ScissorState scissorState;
+ GrDrawState::AutoRestoreEffects are;
+ GrDrawState::AutoRestoreStencil ars;
+
+ if (!this->setupClip(NULL, &are, &ars, &scissorState)) {
+ return;
+ }
+
+ // set stencil settings for path
+ GrStencilSettings stencilSettings;
+ this->getPathStencilSettingsForFilltype(fill, &stencilSettings);
+
// Don't compute a bounding box for setupDstReadIfNecessary(), we'll opt
// instead for it to just copy the entire dst. Realistically this is a moot
// point, because any context that supports NV_path_rendering will also
@@ -542,8 +631,8 @@ void GrDrawTarget::drawPaths(const GrPathRange* pathRange,
return;
}
- this->onDrawPaths(pathRange, indices, count, transforms, transformsType, fill,
- dstCopy.texture() ? &dstCopy : NULL);
+ this->onDrawPaths(pathRange, indices, count, transforms, transformsType, scissorState,
+ stencilSettings, dstCopy.texture() ? &dstCopy : NULL);
}
void GrDrawTarget::clear(const SkIRect* rect, GrColor color, bool canIgnoreRect,
@@ -628,6 +717,14 @@ void GrDrawTarget::drawIndexedInstances(GrPrimitiveType type,
return;
}
+ // Setup clip
+ GrClipMaskManager::ScissorState scissorState;
+ GrDrawState::AutoRestoreEffects are;
+ GrDrawState::AutoRestoreStencil ars;
+ if (!this->setupClip(devBounds, &are, &ars, &scissorState)) {
+ return;
+ }
+
DrawInfo info;
info.fPrimitiveType = type;
info.fStartIndex = 0;
@@ -654,7 +751,7 @@ void GrDrawTarget::drawIndexedInstances(GrPrimitiveType type,
info.fStartIndex,
info.fVertexCount,
info.fIndexCount)) {
- this->onDraw(info);
+ this->onDraw(info, scissorState);
}
info.fStartVertex += info.fVertexCount;
instanceCount -= info.fInstanceCount;
@@ -1141,3 +1238,15 @@ uint32_t GrDrawTargetCaps::CreateUniqueID() {
return id;
}
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+bool GrClipTarget::setupClip(const SkRect* devBounds,
+ GrDrawState::AutoRestoreEffects* are,
+ GrDrawState::AutoRestoreStencil* ars,
+ GrClipMaskManager::ScissorState* scissorState) {
+ return fClipMaskManager.setupClipping(this->getClip(),
+ devBounds,
+ are,
+ ars,
+ scissorState);
+}
« 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