Make GrContext track the current matrix, render target, and clip directly rather than using GrDrawState.
R=robertphillips@google.com, jvanverth@google.com
Author: bsalomon@google.com
Review URL: https://chromiumcodereview.appspot.com/15821008
git-svn-id: http://skia.googlecode.com/svn/trunk@9297 2bbb7eff-a529-9590-31e7-b0007b416f81
diff --git a/src/gpu/GrContext.cpp b/src/gpu/GrContext.cpp
index 751d869..5f255a6 100644
--- a/src/gpu/GrContext.cpp
+++ b/src/gpu/GrContext.cpp
@@ -91,6 +91,7 @@
++THREAD_INSTANCE_COUNT;
fDrawState = NULL;
fGpu = NULL;
+ fClip = NULL;
fPathRendererChain = NULL;
fSoftwarePathRenderer = NULL;
fTextureCache = NULL;
@@ -100,6 +101,7 @@
fDrawBufferIBAllocPool = NULL;
fAARectRenderer = NULL;
fOvalRenderer = NULL;
+ fViewMatrix.reset();
}
bool GrContext::init(GrBackend backend, GrBackendContext backendContext) {
@@ -594,18 +596,6 @@
return true;
}
-////////////////////////////////////////////////////////////////////////////////
-
-const GrClipData* GrContext::getClip() const {
- return fGpu->getClip();
-}
-
-void GrContext::setClip(const GrClipData* clipData) {
- fGpu->setClip(clipData);
-
- fDrawState->setState(GrDrawState::kClip_StateBit,
- clipData && clipData->fClipStack && !clipData->fClipStack->isWideOpen());
-}
////////////////////////////////////////////////////////////////////////////////
@@ -630,7 +620,7 @@
// map the four corners and bound them with a new rect. This will not
// produce a correct result for some perspective matrices.
if (!this->getMatrix().hasPerspective()) {
- if (!fDrawState->getViewInverse(&inverse)) {
+ if (!fViewMatrix.invert(&inverse)) {
GrPrintf("Could not invert matrix\n");
return;
}
@@ -782,7 +772,7 @@
SkMatrix combinedMatrix;
bool useVertexCoverage;
bool needAA = paint.isAntiAlias() &&
- !this->getRenderTarget()->isMultisampled();
+ !target->getDrawState().getRenderTarget()->isMultisampled();
bool doAA = needAA && apply_aa_to_rect(target, rect, width, matrix,
&combinedMatrix, &devRect,
&useVertexCoverage);
@@ -966,7 +956,7 @@
GrDrawState::AutoStageDisable atr(fDrawState);
bool useAA = paint.isAntiAlias() &&
- !this->getRenderTarget()->isMultisampled() &&
+ !target->getDrawState().getRenderTarget()->isMultisampled() &&
!disable_coverage_aa_for_blend(target);
if (!fOvalRenderer->drawSimpleRRect(target, this, useAA, rect, stroke)) {
@@ -986,7 +976,7 @@
GrDrawState::AutoStageDisable atr(fDrawState);
bool useAA = paint.isAntiAlias() &&
- !this->getRenderTarget()->isMultisampled() &&
+ !target->getDrawState().getRenderTarget()->isMultisampled() &&
!disable_coverage_aa_for_blend(target);
if (!fOvalRenderer->drawOval(target, this, useAA, oval, stroke)) {
@@ -1142,7 +1132,9 @@
} else {
this->flushDrawBuffer();
}
+ // TODO: Remove this flag
if (kForceCurrentRenderTarget_FlushBit & flagsBitfield) {
+ fGpu->drawState()->setRenderTarget(this->getRenderTarget());
fGpu->forceRenderTargetFlush();
}
}
@@ -1256,7 +1248,7 @@
ASSERT_OWNED_RESOURCE(target);
if (NULL == target) {
- target = fDrawState->getRenderTarget();
+ target = fRenderTarget.get();
if (NULL == target) {
return false;
}
@@ -1444,7 +1436,7 @@
ASSERT_OWNED_RESOURCE(target);
if (NULL == target) {
- target = fDrawState->getRenderTarget();
+ target = fRenderTarget.get();
if (NULL == target) {
return false;
}
@@ -1562,24 +1554,35 @@
this->flushDrawBuffer();
fLastDrawWasBuffered = kNo_BufferedDraw;
}
+ ASSERT_OWNED_RESOURCE(fRenderTarget.get());
if (NULL != paint) {
GrAssert(fDrawState->stagesDisabled());
- fDrawState->setFromPaint(*paint);
+ fDrawState->setFromPaint(*paint, fViewMatrix, fRenderTarget.get());
#if GR_DEBUG_PARTIAL_COVERAGE_CHECK
if ((paint->hasMask() || 0xff != paint->fCoverage) &&
!fGpu->canApplyCoverage()) {
GrPrintf("Partial pixel coverage will be incorrectly blended.\n");
}
#endif
+ } else {
+ fDrawState->reset();
+ *fDrawState->viewMatrix() = fViewMatrix;
+ fDrawState->setRenderTarget(fRenderTarget.get());
}
+ GrDrawTarget* target;
if (kYes_BufferedDraw == buffered) {
- fDrawBuffer->setClip(fGpu->getClip());
fLastDrawWasBuffered = kYes_BufferedDraw;
- return fDrawBuffer;
+ target = fDrawBuffer;
} else {
GrAssert(kNo_BufferedDraw == buffered);
- return fGpu;
+ fLastDrawWasBuffered = kNo_BufferedDraw;
+ target = fGpu;
}
+ fDrawState->setState(GrDrawState::kClip_StateBit, NULL != fClip &&
+ !fClip->fClipStack->isWideOpen());
+ target->setClip(fClip);
+ GrAssert(fDrawState == target->drawState());
+ return target;
}
/*
@@ -1617,39 +1620,10 @@
////////////////////////////////////////////////////////////////////////////////
-void GrContext::setRenderTarget(GrRenderTarget* target) {
- ASSERT_OWNED_RESOURCE(target);
- fDrawState->setRenderTarget(target);
-}
-
-GrRenderTarget* GrContext::getRenderTarget() {
- return fDrawState->getRenderTarget();
-}
-
-const GrRenderTarget* GrContext::getRenderTarget() const {
- return fDrawState->getRenderTarget();
-}
-
bool GrContext::isConfigRenderable(GrPixelConfig config) const {
return fGpu->isConfigRenderable(config);
}
-const SkMatrix& GrContext::getMatrix() const {
- return fDrawState->getViewMatrix();
-}
-
-void GrContext::setMatrix(const SkMatrix& m) {
- fDrawState->setViewMatrix(m);
-}
-
-void GrContext::setIdentityMatrix() {
- fDrawState->viewMatrix()->reset();
-}
-
-void GrContext::concatMatrix(const SkMatrix& m) const {
- fDrawState->preConcatViewMatrix(m);
-}
-
static inline intptr_t setOrClear(intptr_t bits, int shift, intptr_t pred) {
intptr_t mask = 1 << shift;
if (pred) {