aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/gpu/GrInOrderDrawBuffer.cpp
diff options
context:
space:
mode:
authorGravatar joshualitt <joshualitt@chromium.org>2014-10-29 08:48:18 -0700
committerGravatar Commit bot <commit-bot@chromium.org>2014-10-29 08:48:19 -0700
commit6db519c42471aaaa8a8e1a3ece314014481ab832 (patch)
treebd84bcbd97726ab60a4ecd2f205249f857a014b2 /src/gpu/GrInOrderDrawBuffer.cpp
parentcd048d18e0b81338c1a04b9749a00444597df394 (diff)
clear stencil clip on draw target
TBR= BUG=skia: Review URL: https://codereview.chromium.org/683673002
Diffstat (limited to 'src/gpu/GrInOrderDrawBuffer.cpp')
-rw-r--r--src/gpu/GrInOrderDrawBuffer.cpp35
1 files changed, 26 insertions, 9 deletions
diff --git a/src/gpu/GrInOrderDrawBuffer.cpp b/src/gpu/GrInOrderDrawBuffer.cpp
index 47fff6f90c..dcd09ddeb1 100644
--- a/src/gpu/GrInOrderDrawBuffer.cpp
+++ b/src/gpu/GrInOrderDrawBuffer.cpp
@@ -17,7 +17,7 @@
GrInOrderDrawBuffer::GrInOrderDrawBuffer(GrGpu* gpu,
GrVertexBufferAllocPool* vertexPool,
GrIndexBufferAllocPool* indexPool)
- : GrDrawTarget(gpu->getContext())
+ : INHERITED(gpu->getContext())
, fCmdBuffer(kCmdBufferInitialSizeInBytes)
, fLastState(NULL)
, fLastClip(NULL)
@@ -434,6 +434,19 @@ void GrInOrderDrawBuffer::clear(const SkIRect* rect, GrColor color,
this->recordTraceMarkersIfNecessary();
}
+void GrInOrderDrawBuffer::clearStencilClip(const SkIRect& rect,
+ bool insideClip,
+ GrRenderTarget* renderTarget) {
+ if (NULL == renderTarget) {
+ renderTarget = this->drawState()->getRenderTarget();
+ SkASSERT(renderTarget);
+ }
+ ClearStencilClip* clr = GrNEW_APPEND_TO_RECORDER(fCmdBuffer, ClearStencilClip, (renderTarget));
+ clr->fRect = rect;
+ clr->fInsideClip = insideClip;
+ this->recordTraceMarkersIfNecessary();
+}
+
void GrInOrderDrawBuffer::discard(GrRenderTarget* renderTarget) {
if (!this->caps()->discardRenderTargetSupport()) {
return;
@@ -523,7 +536,7 @@ void GrInOrderDrawBuffer::flush() {
++fDrawID;
}
-void GrInOrderDrawBuffer::Draw::execute(GrDrawTarget* gpu) {
+void GrInOrderDrawBuffer::Draw::execute(GrClipTarget* gpu) {
gpu->setVertexSourceToBuffer(this->vertexBuffer());
if (fInfo.isIndexed()) {
gpu->setIndexSourceToBuffer(this->indexBuffer());
@@ -531,30 +544,30 @@ void GrInOrderDrawBuffer::Draw::execute(GrDrawTarget* gpu) {
gpu->executeDraw(fInfo);
}
-void GrInOrderDrawBuffer::StencilPath::execute(GrDrawTarget* gpu) {
+void GrInOrderDrawBuffer::StencilPath::execute(GrClipTarget* gpu) {
gpu->stencilPath(this->path(), fFill);
}
-void GrInOrderDrawBuffer::DrawPath::execute(GrDrawTarget* gpu) {
+void GrInOrderDrawBuffer::DrawPath::execute(GrClipTarget* gpu) {
gpu->executeDrawPath(this->path(), fFill, fDstCopy.texture() ? &fDstCopy : NULL);
}
-void GrInOrderDrawBuffer::DrawPaths::execute(GrDrawTarget* gpu) {
+void GrInOrderDrawBuffer::DrawPaths::execute(GrClipTarget* gpu) {
gpu->executeDrawPaths(this->pathRange(), this->indices(), fCount, this->transforms(),
fTransformsType, fFill, fDstCopy.texture() ? &fDstCopy : NULL);
}
-void GrInOrderDrawBuffer::SetState::execute(GrDrawTarget* gpu) {
+void GrInOrderDrawBuffer::SetState::execute(GrClipTarget* gpu) {
gpu->setDrawState(&fState);
}
-void GrInOrderDrawBuffer::SetClip::execute(GrDrawTarget* gpu) {
+void GrInOrderDrawBuffer::SetClip::execute(GrClipTarget* gpu) {
// Our fClipData is referenced directly, so we must remain alive for the entire
// duration of the flush (after which the gpu's previous clip is restored).
gpu->setClip(&fClipData);
}
-void GrInOrderDrawBuffer::Clear::execute(GrDrawTarget* gpu) {
+void GrInOrderDrawBuffer::Clear::execute(GrClipTarget* gpu) {
if (GrColor_ILLEGAL == fColor) {
gpu->discard(this->renderTarget());
} else {
@@ -562,7 +575,11 @@ void GrInOrderDrawBuffer::Clear::execute(GrDrawTarget* gpu) {
}
}
-void GrInOrderDrawBuffer::CopySurface::execute(GrDrawTarget* gpu) {
+void GrInOrderDrawBuffer::ClearStencilClip::execute(GrClipTarget* gpu) {
+ gpu->clearStencilClip(fRect, fInsideClip, this->renderTarget());
+}
+
+void GrInOrderDrawBuffer::CopySurface::execute(GrClipTarget* gpu) {
gpu->copySurface(this->dst(), this->src(), fSrcRect, fDstPoint);
}