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

Unified Diff: src/gpu/GrContext.cpp

Issue 683733005: GrContext no longer ever draws on Gpu (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: one more cleanup Created 6 years, 2 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 | « include/gpu/GrContext.h ('k') | src/gpu/GrInOrderDrawBuffer.cpp » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/gpu/GrContext.cpp
diff --git a/src/gpu/GrContext.cpp b/src/gpu/GrContext.cpp
index 98adf1d667df87ac278de9c3225e17f53fdccfcd..8444bd21cfbc01f347f528707c1cc5f0983781df 100755
--- a/src/gpu/GrContext.cpp
+++ b/src/gpu/GrContext.cpp
@@ -37,21 +37,12 @@
#include "SkDashPathPriv.h"
#include "SkConfig8888.h"
#include "SkGr.h"
-#include "SkRTConf.h"
#include "SkRRect.h"
#include "SkStrokeRec.h"
#include "SkTLazy.h"
#include "SkTLS.h"
#include "SkTraceEvent.h"
-// It can be useful to set this to false to test whether a bug is caused by using the
-// InOrderDrawBuffer, to compare performance of using/not using InOrderDrawBuffer, or to make
-// debugging simpler.
-SK_CONF_DECLARE(bool, c_Defer, "gpu.deferContext", true,
- "Defers rendering in GrContext via GrInOrderDrawBuffer.");
-
-#define BUFFERED_DRAW (c_Defer ? kYes_BufferedDraw : kNo_BufferedDraw)
-
#ifdef SK_DEBUG
// change this to a 1 to see notifications when partial coverage fails
#define GR_DEBUG_PARTIAL_COVERAGE_CHECK 0
@@ -144,8 +135,6 @@ bool GrContext::init(GrBackend backend, GrBackendContext backendContext) {
fLayerCache.reset(SkNEW_ARGS(GrLayerCache, (this)));
- fLastDrawWasBuffered = kNo_BufferedDraw;
-
fAARectRenderer = SkNEW_ARGS(GrAARectRenderer, (fGpu));
fOvalRenderer = SkNEW(GrOvalRenderer);
@@ -356,27 +345,38 @@ GrTexture* GrContext::createResizedTexture(const GrSurfaceDesc& desc,
GrTexture* texture = fGpu->createTexture(rtDesc, NULL, 0);
if (texture) {
- GrDrawTarget::AutoStateRestore asr(fGpu, GrDrawTarget::kReset_ASRInit);
- GrDrawState* drawState = fGpu->drawState();
- drawState->setRenderTarget(texture->asRenderTarget());
-
- // if filtering is not desired then we want to ensure all
- // texels in the resampled image are copies of texels from
- // the original.
- GrTextureParams params(SkShader::kClamp_TileMode, filter ? GrTextureParams::kBilerp_FilterMode :
- GrTextureParams::kNone_FilterMode);
- drawState->addColorTextureProcessor(clampedTexture, SkMatrix::I(), params);
-
- drawState->setVertexAttribs<gVertexAttribs>(SK_ARRAY_COUNT(gVertexAttribs),
- 2 * sizeof(SkPoint));
-
- GrDrawTarget::AutoReleaseGeometry arg(fGpu, 4, 0);
-
- if (arg.succeeded()) {
- SkPoint* verts = (SkPoint*) arg.vertices();
- verts[0].setIRectFan(0, 0, texture->width(), texture->height(), 2 * sizeof(SkPoint));
- verts[1].setIRectFan(0, 0, 1, 1, 2 * sizeof(SkPoint));
- fGpu->drawNonIndexed(kTriangleFan_GrPrimitiveType, 0, 4);
+ bool mustFlush = false;
+ {
+ GrDrawTarget::AutoStateRestore asr(fGpu, GrDrawTarget::kReset_ASRInit);
+ GrDrawState* drawState = fDrawBuffer->drawState();
+ drawState->setRenderTarget(texture->asRenderTarget());
+
+ // if filtering is not desired then we want to ensure all
+ // texels in the resampled image are copies of texels from
+ // the original.
+ GrTextureParams params(SkShader::kClamp_TileMode,
+ filter ? GrTextureParams::kBilerp_FilterMode :
+ GrTextureParams::kNone_FilterMode);
+ drawState->addColorTextureProcessor(clampedTexture, SkMatrix::I(), params);
+
+ drawState->setVertexAttribs<gVertexAttribs>(SK_ARRAY_COUNT(gVertexAttribs),
+ 2 * sizeof(SkPoint));
+
+ GrDrawTarget::AutoReleaseGeometry arg(fDrawBuffer, 4, 0);
+
+ if (arg.succeeded()) {
+ SkPoint* verts = (SkPoint*) arg.vertices();
+ verts[0].setIRectFan(0, 0, texture->width(), texture->height(),
+ 2 * sizeof(SkPoint));
+ verts[1].setIRectFan(0, 0, 1, 1, 2 * sizeof(SkPoint));
+ fDrawBuffer->drawNonIndexed(kTriangleFan_GrPrimitiveType, 0, 4);
+ mustFlush = true;
+ }
+ }
+
+ // The inorder draw buffer will buffer the draw, so we need to flush here
+ if (mustFlush) {
bsalomon 2014/10/31 17:35:17 I don't think we need this flush
+ fDrawBuffer->flush();
}
} else {
// TODO: Our CPU stretch doesn't filter. But we create separate
@@ -589,7 +589,7 @@ void GrContext::clear(const SkIRect* rect,
AutoRestoreEffects are;
AutoCheckFlush acf(this);
GR_CREATE_TRACE_MARKER_CONTEXT("GrContext::clear", this);
- GrDrawTarget* target = this->prepareToDraw(NULL, BUFFERED_DRAW, &are, &acf);
+ GrDrawTarget* target = this->prepareToDraw(NULL, &are, &acf);
if (NULL == target) {
return;
}
@@ -722,7 +722,7 @@ void GrContext::drawRect(const GrPaint& paint,
AutoRestoreEffects are;
AutoCheckFlush acf(this);
- GrDrawTarget* target = this->prepareToDraw(&paint, BUFFERED_DRAW, &are, &acf);
+ GrDrawTarget* target = this->prepareToDraw(&paint, &are, &acf);
if (NULL == target) {
return;
}
@@ -836,7 +836,7 @@ void GrContext::drawRectToRect(const GrPaint& paint,
const SkMatrix* localMatrix) {
AutoRestoreEffects are;
AutoCheckFlush acf(this);
- GrDrawTarget* target = this->prepareToDraw(&paint, BUFFERED_DRAW, &are, &acf);
+ GrDrawTarget* target = this->prepareToDraw(&paint, &are, &acf);
if (NULL == target) {
return;
}
@@ -902,7 +902,7 @@ void GrContext::drawVertices(const GrPaint& paint,
AutoCheckFlush acf(this);
GrDrawTarget::AutoReleaseGeometry geo; // must be inside AutoCheckFlush scope
- GrDrawTarget* target = this->prepareToDraw(&paint, BUFFERED_DRAW, &are, &acf);
+ GrDrawTarget* target = this->prepareToDraw(&paint, &are, &acf);
if (NULL == target) {
return;
}
@@ -966,7 +966,7 @@ void GrContext::drawRRect(const GrPaint& paint,
AutoRestoreEffects are;
AutoCheckFlush acf(this);
- GrDrawTarget* target = this->prepareToDraw(&paint, BUFFERED_DRAW, &are, &acf);
+ GrDrawTarget* target = this->prepareToDraw(&paint, &are, &acf);
if (NULL == target) {
return;
}
@@ -993,7 +993,7 @@ void GrContext::drawDRRect(const GrPaint& paint,
AutoRestoreEffects are;
AutoCheckFlush acf(this);
- GrDrawTarget* target = this->prepareToDraw(&paint, BUFFERED_DRAW, &are, &acf);
+ GrDrawTarget* target = this->prepareToDraw(&paint, &are, &acf);
GR_CREATE_TRACE_MARKER("GrContext::drawDRRect", target);
@@ -1026,7 +1026,7 @@ void GrContext::drawOval(const GrPaint& paint,
AutoRestoreEffects are;
AutoCheckFlush acf(this);
- GrDrawTarget* target = this->prepareToDraw(&paint, BUFFERED_DRAW, &are, &acf);
+ GrDrawTarget* target = this->prepareToDraw(&paint, &are, &acf);
if (NULL == target) {
return;
}
@@ -1114,7 +1114,7 @@ void GrContext::drawPath(const GrPaint& paint, const SkPath& path, const GrStrok
if (path.isLine(pts)) {
AutoRestoreEffects are;
AutoCheckFlush acf(this);
- GrDrawTarget* target = this->prepareToDraw(&paint, BUFFERED_DRAW, &are, &acf);
+ GrDrawTarget* target = this->prepareToDraw(&paint, &are, &acf);
if (NULL == target) {
return;
}
@@ -1151,7 +1151,7 @@ void GrContext::drawPath(const GrPaint& paint, const SkPath& path, const GrStrok
// OK.
AutoRestoreEffects are;
AutoCheckFlush acf(this);
- GrDrawTarget* target = this->prepareToDraw(&paint, BUFFERED_DRAW, &are, &acf);
+ GrDrawTarget* target = this->prepareToDraw(&paint, &are, &acf);
if (NULL == target) {
return;
}
@@ -1374,7 +1374,7 @@ bool GrContext::writeSurfacePixels(GrSurface* surface,
// drawing a rect to the render target.
// The bracket ensures we pop the stack if we wind up flushing below.
{
- GrDrawTarget* drawTarget = this->prepareToDraw(NULL, kYes_BufferedDraw, NULL, NULL);
+ GrDrawTarget* drawTarget = this->prepareToDraw(NULL, NULL, NULL);
GrDrawTarget::AutoGeometryAndStatePush agasp(drawTarget, GrDrawTarget::kReset_ASRInit,
&matrix);
GrDrawState* drawState = drawTarget->drawState();
@@ -1498,14 +1498,18 @@ bool GrContext::readRenderTargetPixels(GrRenderTarget* target,
// We protect the existing geometry here since it may not be
// clear to the caller that a draw operation (i.e., drawSimpleRect)
// can be invoked in this method
- GrDrawTarget::AutoGeometryAndStatePush agasp(fGpu, GrDrawTarget::kReset_ASRInit);
- GrDrawState* drawState = fGpu->drawState();
- SkASSERT(fp);
- drawState->addColorProcessor(fp);
-
- drawState->setRenderTarget(texture->asRenderTarget());
- SkRect rect = SkRect::MakeWH(SkIntToScalar(width), SkIntToScalar(height));
- fGpu->drawSimpleRect(rect);
+ {
+ GrDrawTarget::AutoGeometryAndStatePush agasp(fDrawBuffer,
+ GrDrawTarget::kReset_ASRInit);
+ GrDrawState* drawState = fDrawBuffer->drawState();
+ SkASSERT(fp);
+ drawState->addColorProcessor(fp);
+
+ drawState->setRenderTarget(texture->asRenderTarget());
+ SkRect rect = SkRect::MakeWH(SkIntToScalar(width), SkIntToScalar(height));
+ fDrawBuffer->drawSimpleRect(rect);
+ }
+ fDrawBuffer->flush();
// we want to read back from the scratch's origin
left = 0;
top = 0;
@@ -1556,7 +1560,7 @@ void GrContext::discardRenderTarget(GrRenderTarget* renderTarget) {
ASSERT_OWNED_RESOURCE(renderTarget);
AutoRestoreEffects are;
AutoCheckFlush acf(this);
- GrDrawTarget* target = this->prepareToDraw(NULL, BUFFERED_DRAW, &are, &acf);
+ GrDrawTarget* target = this->prepareToDraw(NULL, &are, &acf);
if (NULL == target) {
return;
}
@@ -1574,7 +1578,7 @@ void GrContext::copySurface(GrSurface* dst, GrSurface* src, const SkIRect& srcRe
// Since we're going to the draw target and not GPU, no need to check kNoFlush
// here.
- GrDrawTarget* target = this->prepareToDraw(NULL, BUFFERED_DRAW, NULL, NULL);
+ GrDrawTarget* target = this->prepareToDraw(NULL, NULL, NULL);
if (NULL == target) {
return;
}
@@ -1594,7 +1598,6 @@ void GrContext::flushSurfaceWrites(GrSurface* surface) {
////////////////////////////////////////////////////////////////////////////////
GrDrawTarget* GrContext::prepareToDraw(const GrPaint* paint,
- BufferedDraw buffered,
AutoRestoreEffects* are,
AutoCheckFlush* acf) {
// All users of this draw state should be freeing up all effects when they're done.
@@ -1606,10 +1609,6 @@ GrDrawTarget* GrContext::prepareToDraw(const GrPaint* paint,
return NULL;
}
- if (kNo_BufferedDraw == buffered && kYes_BufferedDraw == fLastDrawWasBuffered) {
- fDrawBuffer->flush();
- fLastDrawWasBuffered = kNo_BufferedDraw;
- }
ASSERT_OWNED_RESOURCE(fRenderTarget.get());
if (paint) {
SkASSERT(are);
@@ -1629,20 +1628,11 @@ GrDrawTarget* GrContext::prepareToDraw(const GrPaint* paint,
fDrawState->reset(fViewMatrix);
fDrawState->setRenderTarget(fRenderTarget.get());
}
- GrDrawTarget* target;
- if (kYes_BufferedDraw == buffered) {
- fLastDrawWasBuffered = kYes_BufferedDraw;
- target = fDrawBuffer;
- } else {
- SkASSERT(kNo_BufferedDraw == buffered);
- fLastDrawWasBuffered = kNo_BufferedDraw;
- target = fGpu;
- }
fDrawState->setState(GrDrawState::kClip_StateBit, fClip &&
!fClip->fClipStack->isWideOpen());
- target->setClip(fClip);
- SkASSERT(fDrawState == target->drawState());
- return target;
+ fDrawBuffer->setClip(fClip);
+ SkASSERT(fDrawState == fDrawBuffer->drawState());
+ return fDrawBuffer;
}
/*
@@ -1722,7 +1712,7 @@ void GrContext::setupDrawBuffer() {
}
GrDrawTarget* GrContext::getTextTarget() {
- return this->prepareToDraw(NULL, BUFFERED_DRAW, NULL, NULL);
+ return this->prepareToDraw(NULL, NULL, NULL);
}
const GrIndexBuffer* GrContext::getQuadIndexBuffer() const {
« no previous file with comments | « include/gpu/GrContext.h ('k') | src/gpu/GrInOrderDrawBuffer.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698