Remove easily-removable uses of setTexture(), instead creating a GrSingleTextureEffect -
authortomhudson@google.com <tomhudson@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81>
Fri, 20 Jul 2012 16:25:18 +0000 (16:25 +0000)
committertomhudson@google.com <tomhudson@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81>
Fri, 20 Jul 2012 16:25:18 +0000 (16:25 +0000)
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

include/gpu/GrPaint.h
src/gpu/GrClipMaskManager.cpp
src/gpu/GrContext.cpp
src/gpu/GrDrawState.h
src/gpu/GrSWMaskHelper.cpp
src/gpu/GrTextContext.cpp
src/gpu/SkGpuDevice.cpp

index 4eb2f2d750b25aab02f03b32caae5f52ccb3199d..f1dd2021a18a70c413d63f8514daf9a1e6444008 100644 (file)
@@ -51,6 +51,9 @@ public:
 
     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 @@ public:
 
     GrTexture* getMask(int i) const { 
         GrAssert((unsigned)i < kMaxMasks);
+        //if (this->getMaskSampler(i).getCustomStage()) {
+            //return this->getMaskSampler(i).getCustomStage()->texture(i);
+        //}
         return fMaskTextures[i]; 
     }
 
index ebeaefaa9d3871e7c14b3a8dfaad060c7323d06d..f313d68ccc04ea03ccb83c21b22c65a144f6625b 100644 (file)
@@ -41,7 +41,7 @@ void setup_drawstate_aaclip(GrGpu* gpu,
                                          GrSamplerState::kNearest_Filter,
                                          mat);
 
-    drawState->setTexture(maskStage, result);
+    drawState->createTextureEffect(maskStage, result);
 }
 
 bool path_needs_SW_renderer(GrContext* context,
@@ -431,11 +431,11 @@ void GrClipMaskManager::drawTexture(GrTexture* target,
 
     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()));
index a78bdf7becf1a2bfcdb144902263fd8d7bd6d40e..8c6db5d0e2ea75cc58e4d9ada8d0679bce4524ae 100644 (file)
@@ -368,8 +368,7 @@ GrContext::TextureCacheEntry GrContext::createAndLockTexture(
                                                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 @@ bool GrContext::internalReadRenderTargetPixels(GrRenderTarget* target,
         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 @@ void GrContext::copyTexture(GrTexture* src, GrRenderTarget* dst) {
     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 @@ void GrContext::internalWriteRenderTargetPixels(GrRenderTarget* target,
     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;
index df70bb25e7e56ac0655930ec730046deab2b352b..471ae1c59ff1e5e5dc731e1758a17bce7dbb4442 100644 (file)
@@ -16,6 +16,7 @@
 #include "GrStencil.h"
 #include "GrTexture.h"
 #include "GrRenderTarget.h"
+#include "effects/GrSingleTextureEffect.h"
 
 #include "SkXfermode.h"
 
@@ -187,6 +188,8 @@ public:
      *
      * @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);
@@ -194,6 +197,17 @@ public:
         GrSafeAssign(fTextures[stage], texture);
     }
 
+    /**
+     * 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.
      *
index 247a4443380b5df4cd4542a49b4a4af938c87964..27d6760e7bc74e9c80ea9e8ab1767f5c436dd717 100644 (file)
@@ -212,8 +212,8 @@ void GrSWMaskHelper::DrawToTargetWithPathMask(GrTexture* texture,
         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(),
index dc04fcd2799c3995451b47979e04d851fcc7c839..1fb17b56b36f9554dd47a2074d701ee5ee64cf52 100644 (file)
@@ -40,7 +40,7 @@ void GrTextContext::flushGlyphs() {
 
         GrAssert(GrIsALIGN4(fCurrVertex));
         GrAssert(fCurrTexture);
-        drawState->setTexture(kGlyphMaskStage, fCurrTexture);
+        drawState->createTextureEffect(kGlyphMaskStage, fCurrTexture);
 
         if (!GrPixelConfigIsAlphaOnly(fCurrTexture->config())) {
             if (kOne_GrBlendCoeff != fPaint.fSrcBlendCoeff ||
index 32d5883edd2de95be255af1a10bfa7ca809989cd..1dc17fb61095667a31aad8d85ebcd6c4c0f8d882 100644 (file)
@@ -425,7 +425,13 @@ SkGpuRenderTarget* SkGpuDevice::accessRenderTarget() {
 
 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 @@ inline bool skPaint2GrPaintNoShader(SkGpuDevice* dev,
         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 @@ inline bool skPaint2GrPaintShader(SkGpuDevice* dev,
             } 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 @@ bool drawWithGPUMaskFilter(GrContext* context, const SkPath& path,
                                                    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 @@ void SkGpuDevice::internalDrawBitmap(const SkDraw& draw,
         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 @@ void SkGpuDevice::drawSprite(const SkDraw& draw, const SkBitmap& bitmap,
     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 @@ void SkGpuDevice::drawDevice(const SkDraw& draw, SkDevice* device,
         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();
         }