Attempt to simplify NPOT texture caps. Also fixes case where textures would unnecessarily be bloated to POT. Adds setting of sampler's filter setting in paint conversion.

git-svn-id: http://skia.googlecode.com/svn/trunk@751 2bbb7eff-a529-9590-31e7-b0007b416f81
diff --git a/gpu/src/GrContext.cpp b/gpu/src/GrContext.cpp
index bcccc4e..f966c2c 100644
--- a/gpu/src/GrContext.cpp
+++ b/gpu/src/GrContext.cpp
@@ -260,22 +260,21 @@
         return false;

     }

 

-    bool needsRepeat = sampler.getWrapX() != GrSamplerState::kClamp_WrapMode ||

-                       sampler.getWrapY() != GrSamplerState::kClamp_WrapMode;

+

     bool isPow2 = GrIsPow2(width) && GrIsPow2(height);

 

-    switch (fGpu->npotTextureSupport()) {

-        case GrGpu::kNone_NPOTTextureType:

-            return isPow2;

-        case GrGpu::kNoRepeat_NPOTTextureType:

-            return isPow2 || !needsRepeat;

-        case GrGpu::kNonRendertarget_NPOTTextureType:

-        case GrGpu::kFull_NPOTTextureType:

-            return true;

+    if (!isPow2) {

+        if (!fGpu->npotTextureSupport()) {

+            return false;

+        }

+

+        bool tiled = sampler.getWrapX() != GrSamplerState::kClamp_WrapMode ||

+                     sampler.getWrapY() != GrSamplerState::kClamp_WrapMode;

+        if (tiled && !fGpu->npotTextureTileSupport()) {

+            return false;

+        }

     }

-    // should never get here

-    GrAssert(!"Bad enum from fGpu->npotTextureSupport");

-    return false;

+    return true;

 }

 

 ////////////////////////////////////////////////////////////////////////////////

@@ -1141,10 +1140,15 @@
     uint32_t bits = 0;

     uint16_t width = key->width();

     uint16_t height = key->height();

-    if (fGpu->npotTextureSupport() < GrGpu::kNonRendertarget_NPOTTextureType) {

-        if ((sampler.getWrapX() != GrSamplerState::kClamp_WrapMode ||

-             sampler.getWrapY() != GrSamplerState::kClamp_WrapMode) &&

-            (!GrIsPow2(width) || !GrIsPow2(height))) {

+    

+

+    if (!fGpu->npotTextureTileSupport()) {

+        bool isPow2 = GrIsPow2(width) && GrIsPow2(height);

+

+        bool tiled = (sampler.getWrapX() != GrSamplerState::kClamp_WrapMode) ||

+                     (sampler.getWrapY() != GrSamplerState::kClamp_WrapMode);

+

+        if (tiled && !isPow2) {

             bits |= 1;

             bits |= sampler.isFilter() ? 2 : 0;

         }

diff --git a/gpu/src/GrGpu.cpp b/gpu/src/GrGpu.cpp
index 3624747..057a8c9 100644
--- a/gpu/src/GrGpu.cpp
+++ b/gpu/src/GrGpu.cpp
@@ -57,7 +57,6 @@
 extern void gr_run_unittests();
 
 GrGpu::GrGpu() : f8bitPaletteSupport(false),
-                 fNPOTTextureSupport(kNone_NPOTTextureType),
                  fQuadIndexBuffer(NULL),
                  fUnitSquareVertexBuffer(NULL) {
 #if GR_DEBUG
diff --git a/gpu/src/GrGpuGL.cpp b/gpu/src/GrGpuGL.cpp
index fb23152..3d86d1b 100644
--- a/gpu/src/GrGpuGL.cpp
+++ b/gpu/src/GrGpuGL.cpp
@@ -250,18 +250,20 @@
     }
 
 #if GR_SUPPORT_GLDESKTOP
-    fNPOTTextureSupport =
-        (major >= 2 || has_gl_extension("GL_ARB_texture_non_power_of_two")) ?
-            kFull_NPOTTextureType :
-            kNone_NPOTTextureType;
-#else
-    if (has_gl_extension("GL_OES_texture_npot")) {
-        fNPOTTextureSupport = kFull_NPOTTextureType;
-    } else if (major >= 2 ||
-               has_gl_extension("GL_APPLE_texture_2D_limited_npot")) {
-        fNPOTTextureSupport = kNoRepeat_NPOTTextureType;
+    if (major >= 2 || has_gl_extension("GL_ARB_texture_non_power_of_two")) {
+        fNPOTTextureTileSupport = true;
+        fNPOTTextureSupport = true;
     } else {
-        fNPOTTextureSupport = kNone_NPOTTextureType;
+        fNPOTTextureTileSupport = false;
+        fNPOTTextureSupport = false;
+    }
+#else
+    if (major >= 2) {
+        fNPOTTextureSupport = true;
+        fNPOTTextureTileSupport = has_gl_extension("GL_OES_texture_npot");
+    } else {
+        fNPOTTextureSupport = has_gl_extension("GL_APPLE_texture_2D_limited_npot");
+        fNPOTTextureTileSupport = false;
     }
 #endif
     ////////////////////////////////////////////////////////////////////////////
@@ -269,16 +271,16 @@
     // these a preprocess that generate some compile time constants.
 
     // sanity check to make sure we can at least create an FBO from a POT texture
-    if (fNPOTTextureSupport < kFull_NPOTTextureType) {
-        bool npotFBOSuccess = fbo_test(fExts, 128, 128);
-        if (gPrintStartupSpew) {
-            if (!npotFBOSuccess) {
-                GrPrintf("FBO Sanity Test: FAILED\n");
-            } else {
-                GrPrintf("FBO Sanity Test: PASSED\n");
-            }
+    
+    bool simpleFBOSuccess = fbo_test(fExts, 128, 128);
+    if (gPrintStartupSpew) {
+        if (!simpleFBOSuccess) {
+            GrPrintf("FBO Sanity Test: FAILED\n");
+        } else {
+            GrPrintf("FBO Sanity Test: PASSED\n");
         }
     }
+    GrAssert(simpleFBOSuccess);
 
     /* Experimentation has found that some GLs that support NPOT textures
        do not support FBOs with a NPOT texture. They report "unsupported" FBO
@@ -287,34 +289,26 @@
        texture. Presumably, the implementation bloats the renderbuffer
        internally to the next POT.
      */
-    if (fNPOTTextureSupport == kFull_NPOTTextureType) {
-        bool npotFBOSuccess = fbo_test(fExts, 200, 200);
-        if (!npotFBOSuccess) {
-            fNPOTTextureSupport = kNonRendertarget_NPOTTextureType;
-            if (gPrintStartupSpew) {
-                GrPrintf("NPOT Renderbuffer Test: FAILED\n");
+    bool fNPOTRenderTargetSupport = false;
+    if (fNPOTTextureSupport) {
+        fNPOTRenderTargetSupport = fbo_test(fExts, 200, 200);
+    }
+    
+    if (gPrintStartupSpew) {
+        if (fNPOTTextureSupport) {
+            GrPrintf("NPOT textures supported\n");
+            if (fNPOTTextureTileSupport) {
+                GrPrintf("NPOT texture tiling supported\n");
+            } else {
+                GrPrintf("NPOT texture tiling NOT supported\n");
+            }
+            if (fNPOTRenderTargetSupport) {
+                GrPrintf("NPOT render targets supported\n");
+            } else {
+                GrPrintf("NPOT render targets NOT supported\n");
             }
         } else {
-            if (gPrintStartupSpew) {
-                GrPrintf("NPOT Renderbuffer Test: PASSED\n");
-            }
-        }
-    }
-
-    if (gPrintStartupSpew) {
-        switch (fNPOTTextureSupport) {
-        case kNone_NPOTTextureType:
-            GrPrintf("NPOT Support: NONE\n");
-            break;
-        case kNoRepeat_NPOTTextureType:
-            GrPrintf("NPOT Support: NO REPEAT\n");
-            break;
-        case kNonRendertarget_NPOTTextureType:
-            GrPrintf("NPOT Support: NO FBOTEX\n");
-            break;
-        case kFull_NPOTTextureType:
-            GrPrintf("NPOT Support: FULL\n");
-            break;
+            GrPrintf("NPOT textures NOT supported\n");
         }
     }
 
@@ -329,8 +323,8 @@
     if (gPrintStartupSpew) {
         GrPrintf("Small height FBO texture experiments\n");
     }
-    for (GLuint i = 1; i <= 256;
-         (kFull_NPOTTextureType != fNPOTTextureSupport) ? i *= 2 : ++i) {
+
+    for (GLuint i = 1; i <= 256; fNPOTRenderTargetSupport ? ++i : i *= 2) {
         GLuint w = maxRenderSize;
         GLuint h = i;
         if (fbo_test(fExts, w, h)) {
@@ -351,8 +345,7 @@
         GrPrintf("Small width FBO texture experiments\n");
     }
     fMinRenderTargetWidth = GR_MAX_GLUINT;
-    for (GLuint i = 1; i <= 256;
-         (kFull_NPOTTextureType != fNPOTTextureSupport) ? i *= 2 : ++i) {
+    for (GLuint i = 1; i <= 256; fNPOTRenderTargetSupport ? i *= 2 : ++i) {
         GLuint w = i;
         GLuint h = maxRenderSize;
         if (fbo_test(fExts, w, h)) {
@@ -369,22 +362,7 @@
     }
     GrAssert(GR_INVAL_GLINT != fMinRenderTargetWidth);
 
-#if GR_IOS_BUILD
-    /*
-        The iPad seems to fail, at least sometimes, if the height is < 16,
-        so we pin the values here for now. A better fix might be to
-        conditionalize this based on known that its an iPad (or some other
-        check).
-     */
-    fMinRenderTargetWidth = GrMax<GLuint>(fMinRenderTargetWidth, 16);
-    fMinRenderTargetHeight = GrMax<GLuint>(fMinRenderTargetHeight, 16);
-#endif
-
     GR_GL_GetIntegerv(GL_MAX_TEXTURE_SIZE, &fMaxTextureDimension);
-
-#if GR_COLLECT_STATS
-    ++fStats.fRenderTargetChngCnt;
-#endif
 }
 
 GrGpuGL::~GrGpuGL() {
@@ -607,18 +585,19 @@
     }
 #endif
 
-    if (fNPOTTextureSupport < kNonRendertarget_NPOTTextureType ||
-        (fNPOTTextureSupport == kNonRendertarget_NPOTTextureType &&
-         renderTarget)) {
-        glDesc.fAllocWidth  = GrNextPow2(desc.fWidth);
-        glDesc.fAllocHeight = GrNextPow2(desc.fHeight);
-    }
-
     if (renderTarget) {
+        if (!this->npotRenderTargetSupport()) {
+            glDesc.fAllocWidth  = GrNextPow2(desc.fWidth);
+            glDesc.fAllocHeight = GrNextPow2(desc.fHeight);
+        }
+
         glDesc.fAllocWidth = GrMax<int>(fMinRenderTargetWidth,
                                         glDesc.fAllocWidth);
         glDesc.fAllocHeight = GrMax<int>(fMinRenderTargetHeight,
                                          glDesc.fAllocHeight);
+    } else if (!this->npotTextureSupport()) {
+        glDesc.fAllocWidth  = GrNextPow2(desc.fWidth);
+        glDesc.fAllocHeight = GrNextPow2(desc.fHeight);
     }
 
     GR_GL(BindTexture(GL_TEXTURE_2D, glDesc.fTextureID));