diff --git a/include/gpu/GrGLInterface.h b/include/gpu/GrGLInterface.h
index f37f49c..e0925bd 100644
--- a/include/gpu/GrGLInterface.h
+++ b/include/gpu/GrGLInterface.h
@@ -278,16 +278,6 @@
     // exported:  GLES{1|2} or Desktop.
     GrGLBinding fBindingsExported;
 
-    /// Does this GL support NPOT textures on FBOs?
-    /// boolean value, or kProbe_GrGLCapability to probe (slowly) at context creation.
-    int fNPOTRenderTargetSupport;
-
-    /// Some GL implementations (PowerVR SGX devices like the iPhone 4)
-    /// have restrictions on the size of small render targets.
-    /// kProbe_GrGLCapability to probe (slowly) at context creation.
-    int fMinRenderTargetHeight;
-    int fMinRenderTargetWidth;
-
     GrGLActiveTextureProc fActiveTexture;
     GrGLAttachShaderProc fAttachShader;
     GrGLBeginQueryProc fBeginQuery;
diff --git a/include/gpu/GrRenderTarget.h b/include/gpu/GrRenderTarget.h
index dd7a371..1b11aee 100644
--- a/include/gpu/GrRenderTarget.h
+++ b/include/gpu/GrRenderTarget.h
@@ -44,20 +44,6 @@
     int height() const { return fHeight; }
 
     /**
-     * Retrieves the allocated width. It may differ from width for
-     * NPOT or min-RT size reasons.
-     * @return allocated width in pixels
-     */
-    int allocatedWidth() const { return fAllocatedWidth; }
-
-    /**
-     * Retrieves the allocated height. It may differ from height for
-     * NPOT or min-RT size reasons.
-     * @return allocated height in pixels
-     */
-    int allocatedHeight() const { return fAllocatedHeight; }
-
-    /**
      * @return the pixel config. Can be kUnknown_GrPixelConfig
      * if client asked us to render to a target that has a pixel
      * config that isn't equivalent with one of our configs.
@@ -165,8 +151,6 @@
                    GrTexture* texture,
                    int width,
                    int height,
-                   int allocatedWidth,
-                   int allocatedHeight,
                    GrPixelConfig config,
                    int sampleCnt)
         : INHERITED(gpu)
@@ -174,8 +158,6 @@
         , fTexture(texture)
         , fWidth(width)
         , fHeight(height)
-        , fAllocatedWidth(allocatedWidth)
-        , fAllocatedHeight(allocatedHeight)
         , fConfig(config)
         , fSampleCnt(sampleCnt) {
         fResolveRect.setLargestInverted();
@@ -197,8 +179,6 @@
     GrTexture*        fTexture; // not ref'ed
     int               fWidth;
     int               fHeight;
-    int               fAllocatedWidth;
-    int               fAllocatedHeight;
     GrPixelConfig     fConfig;
     int               fSampleCnt;
     GrIRect           fResolveRect;
diff --git a/include/gpu/GrTexture.h b/include/gpu/GrTexture.h
index 5a86b08..0192688 100644
--- a/include/gpu/GrTexture.h
+++ b/include/gpu/GrTexture.h
@@ -33,20 +33,6 @@
     int height() const { return fHeight; }
 
     /**
-     * Retrieves the allocated width. It may differ from width for
-     * NPOT or min-RT size reasons.
-     * @return allocated width in texels
-     */
-    int allocatedWidth() const { return fAllocatedWidth; }
-
-    /**
-     * Retrieves the allocated height. It may differ from height for
-     * NPOT or min-RT size reasons.
-     * @return allocated height in texels
-     */
-    int allocatedHeight() const { return fAllocatedHeight; }
-
-    /**
      * Convert from texels to normalized texture coords for POT textures
      * only.
      */
@@ -64,9 +50,7 @@
      *  Approximate number of bytes used by the texture
      */
     virtual size_t sizeInBytes() const {
-        return (size_t) fAllocatedWidth *
-                        fAllocatedHeight *
-                        GrBytesPerPixel(fConfig);
+        return (size_t) fWidth * fHeight * GrBytesPerPixel(fConfig);
     }
 
     /**
@@ -141,15 +125,11 @@
     GrTexture(GrGpu* gpu,
               int width,
               int height,
-              int allocatedWidth,
-              int allocatedHeight,
               GrPixelConfig config)
     : INHERITED(gpu)
     , fRenderTarget(NULL)
     , fWidth(width)
     , fHeight(height)
-    , fAllocatedWidth(allocatedWidth)
-    , fAllocatedHeight(allocatedHeight)
     , fConfig(config) {
         // only make sense if alloc size is pow2
         fShiftFixedX = 31 - Gr_clz(fWidth);
@@ -166,8 +146,6 @@
 private:
     int fWidth;
     int fHeight;
-    int fAllocatedWidth;
-    int fAllocatedHeight;
 
     // these two shift a fixed-point value into normalized coordinates
     // for this texture if the texture is power of two sized.
diff --git a/src/gpu/GrContext.cpp b/src/gpu/GrContext.cpp
index ca01192..47a2a6b 100644
--- a/src/gpu/GrContext.cpp
+++ b/src/gpu/GrContext.cpp
@@ -331,12 +331,8 @@
         rtDesc.fFlags =  rtDesc.fFlags |
                          kRenderTarget_GrTextureFlagBit |
                          kNoStencil_GrTextureFlagBit;
-        rtDesc.fWidth  =
-            GrNextPow2(GrMax<int>(desc.fWidth,
-                                  fGpu->getCaps().fMinRenderTargetWidth));
-        rtDesc.fHeight =
-            GrNextPow2(GrMax<int>(desc.fHeight,
-                                  fGpu->getCaps().fMinRenderTargetHeight));
+        rtDesc.fWidth  = GrNextPow2(GrMax(desc.fWidth, 64));
+        rtDesc.fHeight = GrNextPow2(GrMax(desc.fHeight, 64));
 
         GrTexture* texture = fGpu->createTexture(rtDesc, NULL, 0);
 
@@ -576,10 +572,6 @@
     bool isPow2 = GrIsPow2(width) && GrIsPow2(height);
 
     if (!isPow2) {
-        if (!caps.fNPOTTextureSupport) {
-            return false;
-        }
-
         bool tiled = sampler.getWrapX() != GrSamplerState::kClamp_WrapMode ||
                      sampler.getWrapY() != GrSamplerState::kClamp_WrapMode;
         if (tiled && !caps.fNPOTTextureTileSupport) {
@@ -2005,7 +1997,7 @@
                             const SkRect& rect,
                             const float* kernel,
                             int kernelWidth) {
-    float imageIncrement[2] = {1.0f / texture->allocatedWidth(), 0.0f};
+    float imageIncrement[2] = {1.0f / texture->width(), 0.0f};
     convolve(texture, rect, imageIncrement, kernel, kernelWidth);
 }
 
@@ -2013,7 +2005,7 @@
                             const SkRect& rect,
                             const float* kernel,
                             int kernelWidth) {
-    float imageIncrement[2] = {0.0f, 1.0f / texture->allocatedHeight()};
+    float imageIncrement[2] = {0.0f, 1.0f / texture->height()};
     convolve(texture, rect, imageIncrement, kernel, kernelWidth);
 }
 
diff --git a/src/gpu/GrDrawTarget.cpp b/src/gpu/GrDrawTarget.cpp
index 3d9195c..20098fc 100644
--- a/src/gpu/GrDrawTarget.cpp
+++ b/src/gpu/GrDrawTarget.cpp
@@ -1267,9 +1267,7 @@
 void GrDrawTarget::Caps::print() const {
     static const char* gNY[] = {"NO", "YES"};
     GrPrintf("8 Bit Palette Support       : %s\n", gNY[f8BitPaletteSupport]);
-    GrPrintf("NPOT Texture Support        : %s\n", gNY[fNPOTTextureSupport]);
     GrPrintf("NPOT Texture Tile Support   : %s\n", gNY[fNPOTTextureTileSupport]);
-    GrPrintf("NPOT Render Target Support  : %s\n", gNY[fNPOTRenderTargetSupport]);
     GrPrintf("Two Sided Stencil Support   : %s\n", gNY[fTwoSidedStencilSupport]);
     GrPrintf("Stencil Wrap Ops  Support   : %s\n", gNY[fStencilWrapOpsSupport]);
     GrPrintf("HW AA Lines Support         : %s\n", gNY[fHWAALineSupport]);
@@ -1279,8 +1277,6 @@
     GrPrintf("FSAA Support                : %s\n", gNY[fFSAASupport]);
     GrPrintf("Dual Source Blending Support: %s\n", gNY[fDualSourceBlendingSupport]);
     GrPrintf("Buffer Lock Support         : %s\n", gNY[fBufferLockSupport]);
-    GrPrintf("Min Render Target Width     : %d\n", fMinRenderTargetWidth);
-    GrPrintf("Min Render Target Height    : %d\n", fMinRenderTargetHeight);
     GrPrintf("Max Texture Size            : %d\n", fMaxTextureSize);
     GrPrintf("Max Render Target Size      : %d\n", fMaxRenderTargetSize);
 }
diff --git a/src/gpu/GrDrawTarget.h b/src/gpu/GrDrawTarget.h
index 339399a..22cbbdb 100644
--- a/src/gpu/GrDrawTarget.h
+++ b/src/gpu/GrDrawTarget.h
@@ -42,9 +42,7 @@
         }
         void print() const;
         bool f8BitPaletteSupport        : 1;
-        bool fNPOTTextureSupport        : 1;
         bool fNPOTTextureTileSupport    : 1;
-        bool fNPOTRenderTargetSupport   : 1;
         bool fTwoSidedStencilSupport    : 1;
         bool fStencilWrapOpsSupport     : 1;
         bool fHWAALineSupport           : 1;
@@ -55,8 +53,6 @@
         bool fDualSourceBlendingSupport : 1;
         bool fBufferLockSupport         : 1;
         bool fSupportPerVertexCoverage  : 1;
-        int fMinRenderTargetWidth;
-        int fMinRenderTargetHeight;
         int fMaxRenderTargetSize;
         int fMaxTextureSize;
     };
diff --git a/src/gpu/GrGLInterface.cpp b/src/gpu/GrGLInterface.cpp
index f2756a6..d46aaa7 100644
--- a/src/gpu/GrGLInterface.cpp
+++ b/src/gpu/GrGLInterface.cpp
@@ -104,9 +104,6 @@
 
 GrGLInterface::GrGLInterface() {
     fBindingsExported = (GrGLBinding)0;
-    fNPOTRenderTargetSupport = kProbe_GrGLCapability;
-    fMinRenderTargetHeight = kProbe_GrGLCapability;
-    fMinRenderTargetWidth = kProbe_GrGLCapability;
 
     fActiveTexture = NULL;
     fAttachShader = NULL;
diff --git a/src/gpu/GrGLRenderTarget.cpp b/src/gpu/GrGLRenderTarget.cpp
index 290ae2e..c98914a 100644
--- a/src/gpu/GrGLRenderTarget.cpp
+++ b/src/gpu/GrGLRenderTarget.cpp
@@ -36,8 +36,6 @@
                 texture,
                 viewport.fWidth,
                 viewport.fHeight,
-                texture->allocatedWidth(),
-                texture->allocatedHeight(),
                 desc.fConfig,
                 desc.fSampleCnt) {
     GrAssert(NULL != texID);
@@ -45,6 +43,11 @@
     // FBO 0 can't also be a texture, right?
     GrAssert(0 != desc.fRTFBOID);
     GrAssert(0 != desc.fTexFBOID);
+
+    // we assume this is true, TODO: get rid of viewport as a param.
+    GrAssert(viewport.fWidth == texture->width());
+    GrAssert(viewport.fHeight == texture->height());
+
     this->init(desc, viewport, texID);
 }
 
@@ -55,8 +58,6 @@
                 NULL,
                 viewport.fWidth,
                 viewport.fHeight,
-                viewport.fWidth,   // don't really need separate alloc w/h for
-                viewport.fHeight,  // non-texture RTs, repeat viewport values
                 desc.fConfig,
                 desc.fSampleCnt) {
     this->init(desc, viewport, NULL);
diff --git a/src/gpu/GrGLTexture.cpp b/src/gpu/GrGLTexture.cpp
index 06efb8a..6e93b6c 100644
--- a/src/gpu/GrGLTexture.cpp
+++ b/src/gpu/GrGLTexture.cpp
@@ -38,18 +38,14 @@
     fUploadFormat       = textureDesc.fUploadFormat;
     fUploadType         = textureDesc.fUploadType;
     fOrientation        = textureDesc.fOrientation;
-    fScaleX             = GrIntToScalar(textureDesc.fContentWidth) /
-                            textureDesc.fAllocWidth;
-    fScaleY             = GrIntToScalar(textureDesc.fContentHeight) /
-                            textureDesc.fAllocHeight;
 
     if (NULL != rtDesc) {
         // we render to the top left
         GrGLIRect vp;
         vp.fLeft   = 0;
-        vp.fWidth  = textureDesc.fContentWidth;
-        vp.fHeight = textureDesc.fContentHeight;
-        vp.fBottom = textureDesc.fAllocHeight - textureDesc.fContentHeight;
+        vp.fWidth  = textureDesc.fWidth;
+        vp.fBottom = 0;
+        vp.fHeight = textureDesc.fHeight;
 
         fRenderTarget = new GrGLRenderTarget(gpu, *rtDesc, vp, fTexIDObj, this);
     }
@@ -58,10 +54,8 @@
 GrGLTexture::GrGLTexture(GrGpuGL* gpu,
                          const Desc& textureDesc) 
     : INHERITED(gpu,
-                textureDesc.fContentWidth,
-                textureDesc.fContentHeight,
-                textureDesc.fAllocWidth,
-                textureDesc.fAllocHeight,
+                textureDesc.fWidth,
+                textureDesc.fHeight,
                 textureDesc.fConfig) {
     this->init(gpu, textureDesc, NULL);
 }
@@ -70,10 +64,8 @@
                          const Desc& textureDesc,
                          const GrGLRenderTarget::Desc& rtDesc)
     : INHERITED(gpu,
-                textureDesc.fContentWidth,
-                textureDesc.fContentHeight,
-                textureDesc.fAllocWidth,
-                textureDesc.fAllocHeight,
+                textureDesc.fWidth,
+                textureDesc.fHeight,
                 textureDesc.fConfig) {
     this->init(gpu, textureDesc, &rtDesc);
 }
diff --git a/src/gpu/GrGLTexture.h b/src/gpu/GrGLTexture.h
index ce30e11..cedac5a 100644
--- a/src/gpu/GrGLTexture.h
+++ b/src/gpu/GrGLTexture.h
@@ -60,10 +60,8 @@
     };
 
     struct Desc {
-        int             fContentWidth;
-        int             fContentHeight;
-        int             fAllocWidth;
-        int             fAllocHeight;
+        int             fWidth;
+        int             fHeight;
         GrPixelConfig   fConfig;
         GrGLuint        fTextureID;
         bool            fOwnsID;
@@ -108,16 +106,6 @@
     GrGLenum uploadFormat() const { return fUploadFormat; }
     GrGLenum uploadType() const { return fUploadType; }
 
-    /**
-     * @return width() / allocWidth()
-     */
-    GrScalar contentScaleX() const { return fScaleX; }
-
-    /**
-     * @return height() / allocHeight()
-     */
-    GrScalar contentScaleY() const { return fScaleY; }
-
     // Ganesh assumes texture coordinates have their origin
     // in the top-left corner of the image. OpenGL, however,
     // has the origin in the lower-left corner. For content that
@@ -142,9 +130,6 @@
     GrGLTexID*                      fTexIDObj;
     GrGLenum                        fUploadFormat;
     GrGLenum                        fUploadType;
-    // precomputed content / alloc ratios
-    GrScalar                        fScaleX;
-    GrScalar                        fScaleY;
     Orientation                     fOrientation;
 
     void init(GrGpuGL* gpu,
diff --git a/src/gpu/GrGpu.cpp b/src/gpu/GrGpu.cpp
index 1baf42e..1e6b420 100644
--- a/src/gpu/GrGpu.cpp
+++ b/src/gpu/GrGpu.cpp
@@ -161,8 +161,8 @@
 bool GrGpu::attachStencilBufferToRenderTarget(GrRenderTarget* rt) {
     GrAssert(NULL == rt->getStencilBuffer());
     GrStencilBuffer* sb = 
-        this->getContext()->findStencilBuffer(rt->allocatedWidth(),
-                                              rt->allocatedHeight(),
+        this->getContext()->findStencilBuffer(rt->width(),
+                                              rt->height(),
                                               rt->numSamples());
     if (NULL != sb) {
         rt->setStencilBuffer(sb);
@@ -172,8 +172,8 @@
         }
         return attached;
     }
-    if (this->createStencilBufferForRenderTarget(rt, rt->allocatedWidth(),
-                                                 rt->allocatedHeight())) {
+    if (this->createStencilBufferForRenderTarget(rt,
+                                                 rt->width(), rt->height())) {
         rt->getStencilBuffer()->ref();
         rt->getStencilBuffer()->transferToCacheAndLock();
 
diff --git a/src/gpu/GrGpuGL.cpp b/src/gpu/GrGpuGL.cpp
index cd9de91..86a95a9 100644
--- a/src/gpu/GrGpuGL.cpp
+++ b/src/gpu/GrGpuGL.cpp
@@ -104,20 +104,6 @@
                                   GrMatrix* matrix) {
     GrAssert(NULL != texture);
     GrAssert(NULL != matrix);
-    if (GR_Scalar1 != texture->contentScaleX() ||
-        GR_Scalar1 != texture->contentScaleY()) {
-        if (GrSamplerState::kRadial_SampleMode == mode) {
-            GrMatrix scale;
-            scale.setScale(texture->contentScaleX(), texture->contentScaleX());
-            matrix->postConcat(scale);
-        } else if (GrSamplerState::kNormal_SampleMode == mode) {
-            GrMatrix scale;
-            scale.setScale(texture->contentScaleX(), texture->contentScaleY());
-            matrix->postConcat(scale);
-        } else {
-            GrPrintf("We haven't handled NPOT adjustment for other sample modes!");
-        }
-    }
     GrGLTexture::Orientation orientation = texture->orientation();
     if (GrGLTexture::kBottomUp_Orientation == orientation) {
         GrMatrix invY;
@@ -136,10 +122,6 @@
     if (!sampler.getMatrix().isIdentity()) {
         return false;
     }
-    if (GR_Scalar1 != texture->contentScaleX() ||
-        GR_Scalar1 != texture->contentScaleY()) {
-        return false;
-    }
     GrGLTexture::Orientation orientation = texture->orientation();
     if (GrGLTexture::kBottomUp_Orientation == orientation) {
         return false;
@@ -182,81 +164,6 @@
     return status == GR_GL_FRAMEBUFFER_COMPLETE;
 }
 
-static bool probe_for_npot_render_target_support(const GrGLInterface* gl,
-                                                 bool hasNPOTTextureSupport) {
-
-    /* Experimentation has found that some GLs that support NPOT textures
-       do not support FBOs with a NPOT texture. They report "unsupported" FBO
-       status. I don't know how to explicitly query for this. Do an
-       experiment. Note they may support NPOT with a renderbuffer but not a
-       texture. Presumably, the implementation bloats the renderbuffer
-       internally to the next POT.
-     */
-    if (hasNPOTTextureSupport) {
-        return fbo_test(gl, 200, 200);
-    }
-    return false;
-}
-
-static int probe_for_min_render_target_height(const GrGLInterface* gl,
-                                              bool hasNPOTRenderTargetSupport,
-                                              int maxRenderTargetSize) {
-    /* The iPhone 4 has a restriction that for an FBO with texture color
-       attachment with height <= 8 then the width must be <= height. Here
-       we look for such a limitation.
-     */
-    if (gPrintStartupSpew) {
-        GrPrintf("Small height FBO texture experiments\n");
-    }
-    int minRenderTargetHeight = GR_INVAL_GLINT;
-    for (GrGLuint i = 1; i <= 256; hasNPOTRenderTargetSupport ? ++i : i *= 2) {
-        GrGLuint w = maxRenderTargetSize;
-        GrGLuint h = i;
-        if (fbo_test(gl, w, h)) {
-            if (gPrintStartupSpew) {
-                GrPrintf("\t[%d, %d]: PASSED\n", w, h);
-            }
-            minRenderTargetHeight = i;
-            break;
-        } else {
-            if (gPrintStartupSpew) {
-                GrPrintf("\t[%d, %d]: FAILED\n", w, h);
-            }
-        }
-    }
-    GrAssert(GR_INVAL_GLINT != minRenderTargetHeight);
-
-    return minRenderTargetHeight;
-}
-
-static int probe_for_min_render_target_width(const GrGLInterface* gl,
-                                             bool hasNPOTRenderTargetSupport,
-                                             int maxRenderTargetSize) {
-
-    if (gPrintStartupSpew) {
-        GrPrintf("Small width FBO texture experiments\n");
-    }
-    int minRenderTargetWidth = GR_INVAL_GLINT;
-    for (GrGLuint i = 1; i <= 256; hasNPOTRenderTargetSupport ? i *= 2 : ++i) {
-        GrGLuint w = i;
-        GrGLuint h = maxRenderTargetSize;
-        if (fbo_test(gl, w, h)) {
-            if (gPrintStartupSpew) {
-                GrPrintf("\t[%d, %d]: PASSED\n", w, h);
-            }
-            minRenderTargetWidth = i;
-            break;
-        } else {
-            if (gPrintStartupSpew) {
-                GrPrintf("\t[%d, %d]: FAILED\n", w, h);
-            }
-        }
-    }
-    GrAssert(GR_INVAL_GLINT != minRenderTargetWidth);
-
-    return minRenderTargetWidth;
-}
-
 GrGpuGL::GrGpuGL(const GrGLInterface* gl, GrGLBinding glBinding) {
 
     fPrintedCaps = false;
@@ -416,14 +323,11 @@
         if (fGLVersion >= GR_GL_VER(2,0) || 
             this->hasExtension("GL_ARB_texture_non_power_of_two")) {
             fCaps.fNPOTTextureTileSupport = true;
-            fCaps.fNPOTTextureSupport = true;
         } else {
             fCaps.fNPOTTextureTileSupport = false;
-            fCaps.fNPOTTextureSupport = false;
         }
     } else {
         // Unextended ES2 supports NPOT textures with clamp_to_edge and non-mip filters only
-        fCaps.fNPOTTextureSupport = true;
         fCaps.fNPOTTextureTileSupport = this->hasExtension("GL_OES_texture_npot");
     }
 
@@ -434,35 +338,12 @@
     // TODO: Make these a preprocess that generate some compile time constants.
     // TODO: probe once at startup, rather than once per context creation.
 
-    int expectNPOTTargets = fGL->fNPOTRenderTargetSupport;
-    if (expectNPOTTargets == kProbe_GrGLCapability) {
-        fCaps.fNPOTRenderTargetSupport =
-            probe_for_npot_render_target_support(fGL, fCaps.fNPOTTextureSupport);
-    } else {
-        GrAssert(expectNPOTTargets == 0 || expectNPOTTargets == 1);
-        fCaps.fNPOTRenderTargetSupport = (0 != expectNPOTTargets);
-    }
-
     GR_GL_GetIntegerv(fGL, GR_GL_MAX_TEXTURE_SIZE, &fCaps.fMaxTextureSize);
     GR_GL_GetIntegerv(fGL, GR_GL_MAX_RENDERBUFFER_SIZE, &fCaps.fMaxRenderTargetSize);
     // Our render targets are always created with textures as the color
     // attachment, hence this min:
     fCaps.fMaxRenderTargetSize = GrMin(fCaps.fMaxTextureSize, fCaps.fMaxRenderTargetSize);
 
-    fCaps.fMinRenderTargetHeight = fGL->fMinRenderTargetHeight;
-    if (fCaps.fMinRenderTargetHeight == kProbe_GrGLCapability) {
-        fCaps.fMinRenderTargetHeight =
-            probe_for_min_render_target_height(fGL, fCaps.fNPOTRenderTargetSupport,
-                                               fCaps.fMaxRenderTargetSize);
-    }
-
-    fCaps.fMinRenderTargetWidth = fGL->fMinRenderTargetWidth;
-    if (fCaps.fMinRenderTargetWidth == kProbe_GrGLCapability) {
-        fCaps.fMinRenderTargetWidth =
-            probe_for_min_render_target_width(fGL, fCaps.fNPOTRenderTargetSupport,
-                                              fCaps.fMaxRenderTargetSize);
-    }
-
     this->initFSAASupport();
     this->initStencilFormats();
 }
@@ -649,8 +530,8 @@
         return NULL;
     }
     
-    glTexDesc.fContentWidth = glTexDesc.fAllocWidth = desc.fWidth;
-    glTexDesc.fContentHeight = glTexDesc.fAllocHeight = desc.fHeight;
+    glTexDesc.fWidth = desc.fWidth;
+    glTexDesc.fHeight = desc.fHeight;
     glTexDesc.fConfig = desc.fConfig;
     glTexDesc.fTextureID = static_cast<GrGLuint>(desc.fTextureHandle);
     glTexDesc.fOwnsID = false;
@@ -665,8 +546,8 @@
         glRTDesc.fOwnIDs = true;
         glRTDesc.fConfig = desc.fConfig;
         glRTDesc.fSampleCnt = desc.fSampleCnt;
-        if (!this->createRenderTargetObjects(glTexDesc.fAllocWidth,
-                                             glTexDesc.fAllocHeight,
+        if (!this->createRenderTargetObjects(glTexDesc.fWidth,
+                                             glTexDesc.fHeight,
                                              glTexDesc.fTextureID,
                                              &glRTDesc)) {
             return NULL;
@@ -763,8 +644,8 @@
                          &texDesc.fUploadType)) {
             return NULL;
         }
-        texDesc.fAllocWidth  = texDesc.fContentWidth  = desc.fWidth;
-        texDesc.fAllocHeight = texDesc.fContentHeight = desc.fHeight;
+        texDesc.fWidth  = desc.fWidth;
+        texDesc.fHeight = desc.fHeight;
 
         texDesc.fConfig             = desc.fConfig;
         texDesc.fOrientation        = GrGLTexture::kBottomUp_Orientation;
@@ -801,7 +682,7 @@
     // we assume the texture is bound
 
     size_t bpp = GrBytesPerPixel(desc.fConfig);
-    size_t trimRowBytes = desc.fContentWidth * bpp;
+    size_t trimRowBytes = desc.fWidth * bpp;
 
     if (!rowBytes) {
         rowBytes = trimRowBytes;
@@ -825,13 +706,13 @@
     } else {
         if (data && (trimRowBytes != rowBytes || flipY)) {
             // copy the data into our new storage, skipping the trailing bytes
-            size_t trimSize = desc.fContentHeight * trimRowBytes;
+            size_t trimSize = desc.fHeight * trimRowBytes;
             const char* src = (const char*)data;
             if (flipY) {
-                src += (desc.fContentHeight - 1) * rowBytes;
+                src += (desc.fHeight - 1) * rowBytes;
             }
             char* dst = (char*)tempStorage.reset(trimSize);
-            for (int y = 0; y < desc.fContentHeight; y++) {
+            for (int y = 0; y < desc.fHeight; y++) {
                 memcpy(dst, src, trimRowBytes);
                 if (flipY) {
                     src -= rowBytes;
@@ -850,87 +731,20 @@
     if (kIndex_8_GrPixelConfig == desc.fConfig &&
         this->getCaps().f8BitPaletteSupport) {
         // ES only supports CompressedTexImage2D, not CompressedTexSubimage2D
-        GrAssert(desc.fContentWidth == desc.fAllocWidth);
-        GrAssert(desc.fContentHeight == desc.fAllocHeight);
-        GrGLsizei imageSize = desc.fAllocWidth * desc.fAllocHeight +
+        GrGLsizei imageSize = desc.fWidth * desc.fHeight +
                               kGrColorTableSize;
         GL_CALL(CompressedTexImage2D(GR_GL_TEXTURE_2D, 0, desc.fUploadFormat,
-                                     desc.fAllocWidth, desc.fAllocHeight,
+                                     desc.fWidth, desc.fHeight,
                                      0, imageSize, data));
         if (this->glCaps().fUnpackRowLengthSupport) {
             GL_CALL(PixelStorei(GR_GL_UNPACK_ROW_LENGTH, 0));
         }
     } else {
-        if (NULL != data && (desc.fAllocWidth != desc.fContentWidth ||
-                                desc.fAllocHeight != desc.fContentHeight)) {
-            GL_CALL(TexImage2D(GR_GL_TEXTURE_2D, 0, internalFormat,
-                               desc.fAllocWidth, desc.fAllocHeight,
-                               0, desc.fUploadFormat, desc.fUploadType, NULL));
-            GL_CALL(TexSubImage2D(GR_GL_TEXTURE_2D, 0, 0, 0, desc.fContentWidth,
-                                  desc.fContentHeight, desc.fUploadFormat,
-                                  desc.fUploadType, data));
-            if (this->glCaps().fUnpackRowLengthSupport) {
-                GL_CALL(PixelStorei(GR_GL_UNPACK_ROW_LENGTH, 0));
-            }
-
-            int extraW = desc.fAllocWidth  - desc.fContentWidth;
-            int extraH = desc.fAllocHeight - desc.fContentHeight;
-            int maxTexels = extraW * extraH;
-            maxTexels = GrMax(extraW * desc.fContentHeight, maxTexels);
-            maxTexels = GrMax(desc.fContentWidth * extraH, maxTexels);
-
-            SkAutoSMalloc<128*128> texels(bpp * maxTexels);
-
-            if (extraH) {
-                uint8_t* lastRowStart = (uint8_t*) data +
-                                        (desc.fContentHeight - 1) * rowBytes;
-                uint8_t* extraRowStart = (uint8_t*)texels.get();
-
-                for (int i = 0; i < extraH; ++i) {
-                    memcpy(extraRowStart, lastRowStart, trimRowBytes);
-                    extraRowStart += trimRowBytes;
-                }
-                GL_CALL(TexSubImage2D(GR_GL_TEXTURE_2D, 0, 0,
-                                      desc.fContentHeight, desc.fContentWidth,
-                                      extraH, desc.fUploadFormat,
-                                      desc.fUploadType, texels.get()));
-            }
-            if (extraW) {
-                uint8_t* edgeTexel = (uint8_t*)data + trimRowBytes - bpp;
-                uint8_t* extraTexel = (uint8_t*)texels.get();
-                for (int j = 0; j < desc.fContentHeight; ++j) {
-                    for (int i = 0; i < extraW; ++i) {
-                        memcpy(extraTexel, edgeTexel, bpp);
-                        extraTexel += bpp;
-                    }
-                    edgeTexel += rowBytes;
-                }
-                GL_CALL(TexSubImage2D(GR_GL_TEXTURE_2D, 0, desc.fContentWidth,
-                                      0, extraW, desc.fContentHeight,
-                                      desc.fUploadFormat, desc.fUploadType,
-                                      texels.get()));
-            }
-            if (extraW && extraH) {
-                uint8_t* cornerTexel = (uint8_t*)data + 
-                                       desc.fContentHeight * rowBytes - bpp;
-                uint8_t* extraTexel = (uint8_t*)texels.get();
-                for (int i = 0; i < extraW*extraH; ++i) {
-                    memcpy(extraTexel, cornerTexel, bpp);
-                    extraTexel += bpp;
-                }
-                GL_CALL(TexSubImage2D(GR_GL_TEXTURE_2D, 0, desc.fContentWidth,
-                                      desc.fContentHeight, extraW, extraH, 
-                                      desc.fUploadFormat, desc.fUploadType,
-                                      texels.get()));
-            }
-
-        } else {
-            GL_CALL(TexImage2D(GR_GL_TEXTURE_2D, 0, internalFormat,
-                               desc.fAllocWidth, desc.fAllocHeight, 0,
-                               desc.fUploadFormat, desc.fUploadType, data));
-            if (this->glCaps().fUnpackRowLengthSupport) {
-                GL_CALL(PixelStorei(GR_GL_UNPACK_ROW_LENGTH, 0));
-            }
+        GL_CALL(TexImage2D(GR_GL_TEXTURE_2D, 0, internalFormat,
+                            desc.fWidth, desc.fHeight, 0,
+                            desc.fUploadFormat, desc.fUploadType, data));
+        if (this->glCaps().fUnpackRowLengthSupport) {
+            GL_CALL(PixelStorei(GR_GL_UNPACK_ROW_LENGTH, 0));
         }
     }
 }
@@ -1044,10 +858,8 @@
     GrGLRenderTarget::Desc  glRTDesc;
     GrGLenum internalFormat;
 
-    glTexDesc.fContentWidth  = desc.fWidth;
-    glTexDesc.fContentHeight = desc.fHeight;
-    glTexDesc.fAllocWidth    = desc.fWidth;
-    glTexDesc.fAllocHeight   = desc.fHeight;
+    glTexDesc.fWidth  = desc.fWidth;
+    glTexDesc.fHeight = desc.fHeight;
     glTexDesc.fConfig        = desc.fConfig;
     glTexDesc.fOwnsID        = true;
 
@@ -1081,24 +893,8 @@
     }
 
     if (renderTarget) {
-        if (!caps.fNPOTRenderTargetSupport) {
-            glTexDesc.fAllocWidth  = GrNextPow2(desc.fWidth);
-            glTexDesc.fAllocHeight = GrNextPow2(desc.fHeight);
-        }
-
-        glTexDesc.fAllocWidth = GrMax(caps.fMinRenderTargetWidth,
-                                      glTexDesc.fAllocWidth);
-        glTexDesc.fAllocHeight = GrMax(caps.fMinRenderTargetHeight,
-                                       glTexDesc.fAllocHeight);
-        if (glTexDesc.fAllocWidth > caps.fMaxRenderTargetSize ||
-            glTexDesc.fAllocHeight > caps.fMaxRenderTargetSize) {
-            return return_null_texture();
-        }
-    } else if (!caps.fNPOTTextureSupport) {
-        glTexDesc.fAllocWidth  = GrNextPow2(desc.fWidth);
-        glTexDesc.fAllocHeight = GrNextPow2(desc.fHeight);
-        if (glTexDesc.fAllocWidth > caps.fMaxTextureSize ||
-            glTexDesc.fAllocHeight > caps.fMaxTextureSize) {
+        if (glTexDesc.fWidth > caps.fMaxRenderTargetSize ||
+            glTexDesc.fHeight > caps.fMaxRenderTargetSize) {
             return return_null_texture();
         }
     }
@@ -1139,8 +935,8 @@
 #if GR_COLLECT_STATS
         ++fStats.fRenderTargetCreateCnt;
 #endif
-        if (!this->createRenderTargetObjects(glTexDesc.fAllocWidth,
-                                             glTexDesc.fAllocHeight,
+        if (!this->createRenderTargetObjects(glTexDesc.fWidth,
+                                             glTexDesc.fHeight,
                                              glTexDesc.fTextureID,
                                              &glRTDesc)) {
             GL_CALL(DeleteTextures(1, &glTexDesc.fTextureID));
@@ -1187,8 +983,8 @@
     // All internally created RTs are also textures. We don't create
     // SBs for a client's standalone RT (that is RT that isnt also a texture).
     GrAssert(rt->asTexture());
-    GrAssert(width >= rt->allocatedWidth());
-    GrAssert(height >= rt->allocatedHeight());
+    GrAssert(width >= rt->width());
+    GrAssert(height >= rt->height());
 
     int samples = rt->numSamples();
     GrGLuint sbID;
diff --git a/src/gpu/GrGpuGL.h b/src/gpu/GrGpuGL.h
index b5b5b15..c1b17ee 100644
--- a/src/gpu/GrGpuGL.h
+++ b/src/gpu/GrGpuGL.h
@@ -218,7 +218,7 @@
         return GrGLHasExtensionFromString(ext, fExtensionString.c_str());
     }
 
-    // adjusts texture matrix to account for orientation, size, and npotness
+    // adjusts texture matrix to account for orientation
     static void AdjustTextureMatrix(const GrGLTexture* texture,
                                     GrSamplerState::SampleMode mode,
                                     GrMatrix* matrix);
diff --git a/src/gpu/GrGpuGLShaders.cpp b/src/gpu/GrGpuGLShaders.cpp
index ae5b172..5ae6d65 100644
--- a/src/gpu/GrGpuGLShaders.cpp
+++ b/src/gpu/GrGpuGLShaders.cpp
@@ -475,11 +475,6 @@
                 SkTSwap(values[1], values[3]);
             }
 
-            values[0] *= SkScalarToFloat(texture->contentScaleX());
-            values[2] *= SkScalarToFloat(texture->contentScaleX());
-            values[1] *= SkScalarToFloat(texture->contentScaleY());
-            values[3] *= SkScalarToFloat(texture->contentScaleY());
-
             GL_CALL(Uniform4fv(uni, 1, values));
         }
     }
@@ -581,12 +576,14 @@
     const int& uni = fProgramData->fUniLocations.fStages[s].fNormalizedTexelSizeUni;
     if (GrGLProgram::kUnusedUniform != uni) {
         GrGLTexture* texture = (GrGLTexture*) fCurrDrawState.fTextures[s];
-        if (texture->allocatedWidth() != fProgramData->fTextureWidth[s] ||
-            texture->allocatedHeight() != fProgramData->fTextureWidth[s]) {
+        if (texture->width() != fProgramData->fTextureWidth[s] ||
+            texture->height() != fProgramData->fTextureHeight[s]) {
 
-            float texelSize[] = {1.f / texture->allocatedWidth(),
-                                 1.f / texture->allocatedHeight()};
+            float texelSize[] = {1.f / texture->width(),
+                                 1.f / texture->height()};
             GL_CALL(Uniform2fv(uni, 1, texelSize));
+            fProgramData->fTextureWidth[s] = texture->width();
+            fProgramData->fTextureHeight[s] = texture->height();
         }
     }
 }
diff --git a/src/gpu/GrRenderTarget.cpp b/src/gpu/GrRenderTarget.cpp
index a5f1216..7a53c0b 100644
--- a/src/gpu/GrRenderTarget.cpp
+++ b/src/gpu/GrRenderTarget.cpp
@@ -31,8 +31,8 @@
     } else {
         colorBits = GrBytesPerPixel(fConfig);
     }
-    uint64_t size = fAllocatedWidth;
-    size *= fAllocatedHeight;
+    uint64_t size = fWidth;
+    size *= fHeight;
     size *= colorBits;
     size *= GrMax(1,fSampleCnt);
     return (size_t)(size / 8);
diff --git a/src/gpu/ios/GrGLDefaultInterface_iOS.cpp b/src/gpu/ios/GrGLDefaultInterface_iOS.cpp
index 9bc80f0..0060c21 100644
--- a/src/gpu/ios/GrGLDefaultInterface_iOS.cpp
+++ b/src/gpu/ios/GrGLDefaultInterface_iOS.cpp
@@ -18,9 +18,6 @@
         GrGLInteface* interface = new GrGLInterface;
         glInterface.reset(interface);
 
-        interface->fNPOTRenderTargetSupport = kProbe_GrGLCapability;
-        interface->fMinRenderTargetHeight = kProbe_GrGLCapability;
-        interface->fMinRenderTargetWidth = kProbe_GrGLCapability;
         interface->fActiveTexture = glActiveTexture;
         interface->fAttachShader = glAttachShader;
         interface->fBindAttribLocation = glBindAttribLocation;
diff --git a/src/gpu/mesa/GrGLCreateMesaInterface.cpp b/src/gpu/mesa/GrGLCreateMesaInterface.cpp
index f289bcb..596431c 100644
--- a/src/gpu/mesa/GrGLCreateMesaInterface.cpp
+++ b/src/gpu/mesa/GrGLCreateMesaInterface.cpp
@@ -32,9 +32,6 @@
             return NULL;
         }
         GrGLInterface* interface = new GrGLInterface();
-        interface->fNPOTRenderTargetSupport = kProbe_GrGLCapability;
-        interface->fMinRenderTargetHeight = kProbe_GrGLCapability;
-        interface->fMinRenderTargetWidth = kProbe_GrGLCapability;
 
         GR_GL_GET_PROC(ActiveTexture);
         GR_GL_GET_PROC(BeginQuery);
diff --git a/src/gpu/unix/GrGLCreateNativeInterface_unix.cpp b/src/gpu/unix/GrGLCreateNativeInterface_unix.cpp
index 2fc81a6..000d667 100644
--- a/src/gpu/unix/GrGLCreateNativeInterface_unix.cpp
+++ b/src/gpu/unix/GrGLCreateNativeInterface_unix.cpp
@@ -32,10 +32,6 @@
 
         GrGLInterface* interface = new GrGLInterface();
 
-        interface->fNPOTRenderTargetSupport = kProbe_GrGLCapability;
-        interface->fMinRenderTargetHeight = kProbe_GrGLCapability;
-        interface->fMinRenderTargetWidth = kProbe_GrGLCapability;
-
         interface->fActiveTexture = glActiveTexture;
         GR_GL_GET_PROC(AttachShader);
         GR_GL_GET_PROC(BindAttribLocation);
diff --git a/src/gpu/win/GrGLCreateNativeInterface_win.cpp b/src/gpu/win/GrGLCreateNativeInterface_win.cpp
index b5ccc35..c67618c 100644
--- a/src/gpu/win/GrGLCreateNativeInterface_win.cpp
+++ b/src/gpu/win/GrGLCreateNativeInterface_win.cpp
@@ -37,10 +37,6 @@
         }
         GrGLInterface* interface = new GrGLInterface();
 
-        interface->fNPOTRenderTargetSupport = kProbe_GrGLCapability;
-        interface->fMinRenderTargetHeight = kProbe_GrGLCapability;
-        interface->fMinRenderTargetWidth = kProbe_GrGLCapability;
-
         // Functions that are part of GL 1.1 will return NULL in
         // wglGetProcAddress
         interface->fBindTexture = glBindTexture;
