Remove easily-removable uses of setTexture(), instead creating a GrSingleTextureEffect -
where feasible, through convenience function on GrDrawState.
http://codereview.appspot.com/6425055/
git-svn-id: http://skia.googlecode.com/svn/trunk@4694 2bbb7eff-a529-9590-31e7-b0007b416f81
diff --git a/include/gpu/GrPaint.h b/include/gpu/GrPaint.h
index 4eb2f2d..f1dd202 100644
--- a/include/gpu/GrPaint.h
+++ b/include/gpu/GrPaint.h
@@ -51,6 +51,9 @@
GrTexture* getTexture(int i) const {
GrAssert((unsigned)i < kMaxTextures);
+ //if (this->getTextureSampler(i).getCustomStage()) {
+ //return this->getTextureSampler(i).getCustomStage()->texture(i);
+ //}
return fTextures[i];
}
@@ -81,6 +84,9 @@
GrTexture* getMask(int i) const {
GrAssert((unsigned)i < kMaxMasks);
+ //if (this->getMaskSampler(i).getCustomStage()) {
+ //return this->getMaskSampler(i).getCustomStage()->texture(i);
+ //}
return fMaskTextures[i];
}
diff --git a/src/gpu/GrClipMaskManager.cpp b/src/gpu/GrClipMaskManager.cpp
index ebeaefa..f313d68 100644
--- a/src/gpu/GrClipMaskManager.cpp
+++ b/src/gpu/GrClipMaskManager.cpp
@@ -41,7 +41,7 @@
GrSamplerState::kNearest_Filter,
mat);
- drawState->setTexture(maskStage, result);
+ drawState->createTextureEffect(maskStage, result);
}
bool path_needs_SW_renderer(GrContext* context,
@@ -431,11 +431,11 @@
GrMatrix sampleM;
sampleM.setIDiv(texture->width(), texture->height());
- drawState->setTexture(0, texture);
drawState->sampler(0)->reset(GrSamplerState::kClamp_WrapMode,
GrSamplerState::kNearest_Filter,
sampleM);
+ drawState->createTextureEffect(0, texture);
GrRect rect = GrRect::MakeWH(SkIntToScalar(target->width()),
SkIntToScalar(target->height()));
diff --git a/src/gpu/GrContext.cpp b/src/gpu/GrContext.cpp
index a78bdf7..8c6db5d 100644
--- a/src/gpu/GrContext.cpp
+++ b/src/gpu/GrContext.cpp
@@ -368,8 +368,7 @@
GrDrawTarget::kReset_ASRInit);
GrDrawState* drawState = fGpu->drawState();
drawState->setRenderTarget(texture->asRenderTarget());
- drawState->sampler(0)->setCustomStage(SkNEW_ARGS(GrSingleTextureEffect,
- (clampEntry.texture())))->unref();
+ drawState->createTextureEffect(0, clampEntry.texture());
GrSamplerState::Filter filter;
// if filtering is not desired then we want to ensure all
@@ -1405,7 +1404,7 @@
matrix.postIDiv(src->width(), src->height());
drawState->sampler(0)->reset(matrix);
drawState->sampler(0)->setRAndBSwap(swapRAndB);
- drawState->sampler(0)->setCustomStage(SkNEW_ARGS(GrSingleTextureEffect, (src)))->unref();
+ drawState->createTextureEffect(0, src);
GrRect rect;
rect.setXYWH(0, 0, SK_Scalar1 * width, SK_Scalar1 * height);
fGpu->drawSimpleRect(rect, NULL);
@@ -1445,7 +1444,7 @@
GrMatrix sampleM;
sampleM.setIDiv(src->width(), src->height());
drawState->sampler(0)->reset(sampleM);
- drawState->sampler(0)->setCustomStage(SkNEW_ARGS(GrSingleTextureEffect, (src)))->unref();
+ drawState->createTextureEffect(0, src);
SkRect rect = SkRect::MakeXYWH(0, 0,
SK_Scalar1 * src->width(),
SK_Scalar1 * src->height());
@@ -1544,7 +1543,7 @@
drawState->sampler(0)->reset(GrSamplerState::kClamp_WrapMode,
GrSamplerState::kNearest_Filter,
matrix);
- drawState->sampler(0)->setCustomStage(SkNEW_ARGS(GrSingleTextureEffect, (texture)))->unref();
+ drawState->createTextureEffect(0, texture);
drawState->sampler(0)->setRAndBSwap(swapRAndB);
static const GrVertexLayout layout = 0;
diff --git a/src/gpu/GrDrawState.h b/src/gpu/GrDrawState.h
index df70bb2..471ae1c 100644
--- a/src/gpu/GrDrawState.h
+++ b/src/gpu/GrDrawState.h
@@ -16,6 +16,7 @@
#include "GrStencil.h"
#include "GrTexture.h"
#include "GrRenderTarget.h"
+#include "effects/GrSingleTextureEffect.h"
#include "SkXfermode.h"
@@ -187,6 +188,8 @@
*
* @param texture The texture to set. Can be NULL though there is no
* advantage to settings a NULL texture if doing non-textured drawing
+ *
+ * @deprecated
*/
void setTexture(int stage, GrTexture* texture) {
GrAssert((unsigned)stage < kNumStages);
@@ -195,6 +198,17 @@
}
/**
+ * Creates a GrSingleTextureEffect.
+ *
+ * Replacement for setTexture.
+ */
+ void createTextureEffect(int stage, GrTexture* texture) {
+ GrAssert(!this->getSampler(stage).getCustomStage());
+ this->sampler(stage)->setCustomStage(
+ SkNEW_ARGS(GrSingleTextureEffect, (texture)))->unref();
+ }
+
+ /**
* Retrieves the currently set texture.
*
* @return The currently set texture. The return value will be NULL if no
diff --git a/src/gpu/GrSWMaskHelper.cpp b/src/gpu/GrSWMaskHelper.cpp
index 247a444..27d6760 100644
--- a/src/gpu/GrSWMaskHelper.cpp
+++ b/src/gpu/GrSWMaskHelper.cpp
@@ -212,8 +212,8 @@
kPathMaskStage = GrPaint::kTotalStages,
};
GrAssert(!drawState->isStageEnabled(kPathMaskStage));
- drawState->setTexture(kPathMaskStage, texture);
drawState->sampler(kPathMaskStage)->reset();
+ drawState->createTextureEffect(kPathMaskStage, texture);
GrScalar w = GrIntToScalar(rect.width());
GrScalar h = GrIntToScalar(rect.height());
GrRect maskRect = GrRect::MakeWH(w / texture->width(),
diff --git a/src/gpu/GrTextContext.cpp b/src/gpu/GrTextContext.cpp
index dc04fcd..1fb17b5 100644
--- a/src/gpu/GrTextContext.cpp
+++ b/src/gpu/GrTextContext.cpp
@@ -40,7 +40,7 @@
GrAssert(GrIsALIGN4(fCurrVertex));
GrAssert(fCurrTexture);
- drawState->setTexture(kGlyphMaskStage, fCurrTexture);
+ drawState->createTextureEffect(kGlyphMaskStage, fCurrTexture);
if (!GrPixelConfigIsAlphaOnly(fCurrTexture->config())) {
if (kOne_GrBlendCoeff != fPaint.fSrcBlendCoeff ||
diff --git a/src/gpu/SkGpuDevice.cpp b/src/gpu/SkGpuDevice.cpp
index 32d5883..1dc17fb 100644
--- a/src/gpu/SkGpuDevice.cpp
+++ b/src/gpu/SkGpuDevice.cpp
@@ -425,7 +425,13 @@
bool SkGpuDevice::bindDeviceAsTexture(GrPaint* paint) {
if (NULL != fTexture) {
+ // FIXME: cannot use GrSingleTextureEffect here: fails
+ // assert in line 1617: null != devTex; generalizing GrPaint::getTexture()
+ // to grab textures off of GrCustomStages breaks gms in various ways -
+ // particularly since table color filter requires multiple textures
paint->setTexture(kBitmapTextureIdx, fTexture);
+ //paint->textureSampler(kBitmapTextureIdx)->setCustomStage(
+ //SkNEW_ARGS(GrSingleTextureEffect, (fTexture)))->unref();
return true;
}
return false;
@@ -486,7 +492,7 @@
GrAssert(!constantColor);
} else {
grPaint->fColor = SkColor2GrColor(skPaint.getColor());
- grPaint->setTexture(kShaderTextureIdx, NULL);
+ GrAssert(NULL == grPaint->getTexture(kShaderTextureIdx));
}
SkColorFilter* colorFilter = skPaint.getColorFilter();
SkColor color;
@@ -616,9 +622,7 @@
} else {
sampler->setFilter(GrSamplerState::kNearest_Filter);
}
- // TODO - once we have a trivial GrCustomStage for texture drawing,
- // create that here & get rid of the paint's texture
- grPaint->setTexture(kShaderTextureIdx, texture);
+ sampler->setCustomStage(SkNEW_ARGS(GrSingleTextureEffect, (texture)))->unref();
break;
}
sampler->setWrapX(sk_tile_mode_to_grwrap(tileModes[0]));
@@ -904,7 +908,8 @@
pathTexture->height());
// Blend pathTexture over blurTexture.
context->setRenderTarget(blurTexture->asRenderTarget());
- paint.setTexture(0, pathTexture);
+ paint.textureSampler(0)->setCustomStage(SkNEW_ARGS
+ (GrSingleTextureEffect, (pathTexture)))->unref();
if (SkMaskFilter::kInner_BlurType == blurType) {
// inner: dst = dst * src
paint.fSrcBlendCoeff = kDC_GrBlendCoeff;
@@ -1409,7 +1414,8 @@
return;
}
- grPaint->setTexture(kBitmapTextureIdx, texture);
+ grPaint->textureSampler(kBitmapTextureIdx)->setCustomStage(SkNEW_ARGS
+ (GrSingleTextureEffect, (texture)))->unref();
GrRect dstRect = SkRect::MakeWH(GrIntToScalar(srcRect.width()),
GrIntToScalar(srcRect.height()));
@@ -1558,14 +1564,16 @@
GrTexture* texture;
sampler->reset();
SkAutoCachedTexture act(this, bitmap, sampler, &texture);
- grPaint.setTexture(kBitmapTextureIdx, texture);
+ grPaint.textureSampler(kBitmapTextureIdx)->setCustomStage(SkNEW_ARGS
+ (GrSingleTextureEffect, (texture)))->unref();
SkImageFilter* filter = paint.getImageFilter();
if (NULL != filter) {
GrTexture* filteredTexture = filter_texture(fContext, texture, filter,
GrRect::MakeWH(SkIntToScalar(w), SkIntToScalar(h)));
if (filteredTexture) {
- grPaint.setTexture(kBitmapTextureIdx, filteredTexture);
+ grPaint.textureSampler(kBitmapTextureIdx)->setCustomStage(SkNEW_ARGS
+ (GrSingleTextureEffect, (filteredTexture)))->unref();
texture = filteredTexture;
filteredTexture->unref();
}
@@ -1608,7 +1616,8 @@
GrTexture* filteredTexture = filter_texture(fContext, devTex, filter,
rect);
if (filteredTexture) {
- grPaint.setTexture(kBitmapTextureIdx, filteredTexture);
+ grPaint.textureSampler(kBitmapTextureIdx)->setCustomStage(SkNEW_ARGS
+ (GrSingleTextureEffect, (filteredTexture)))->unref();
devTex = filteredTexture;
filteredTexture->unref();
}