Use immutable level count in gl::Texture.

Instead of storing a binary flag indicating if we've created
immutable storage, store a level count. This indicates if or if
not we've created immutable storage, as well as avoiding the
call to the native storage to return the level count.

BUG=angle:781

Change-Id: I08a6bd086d00ddf3255262a7711628be5212b4b7
Reviewed-on: https://chromium-review.googlesource.com/222921
Tested-by: Jamie Madill <jmadill@chromium.org>
Reviewed-by: Brandon Jones <bajones@chromium.org>
diff --git a/src/libGLESv2/Texture.cpp b/src/libGLESv2/Texture.cpp
index 624f6ee..3a70d57 100644
--- a/src/libGLESv2/Texture.cpp
+++ b/src/libGLESv2/Texture.cpp
@@ -51,7 +51,7 @@
     : RefCountObject(id),
       mTexture(impl),
       mUsage(GL_NONE),
-      mImmutable(false),
+      mImmutableLevelCount(0),
       mTarget(target)
 {
 }
@@ -162,12 +162,12 @@
 
 bool Texture::isImmutable() const
 {
-    return mImmutable;
+    return (mImmutableLevelCount > 0);
 }
 
 int Texture::immutableLevelCount()
 {
-    return (mImmutable ? getNativeTexture()->getLevelCount() : 0);
+    return mImmutableLevelCount;
 }
 
 int Texture::mipLevels() const
@@ -290,7 +290,7 @@
         return error;
     }
 
-    mImmutable = true;
+    mImmutableLevelCount = levels;
 
     return Error(GL_NO_ERROR);
 }
@@ -551,7 +551,7 @@
         return error;
     }
 
-    mImmutable = true;
+    mImmutableLevelCount = levels;
 
     return Error(GL_NO_ERROR);
 }
@@ -760,7 +760,7 @@
         return error;
     }
 
-    mImmutable = true;
+    mImmutableLevelCount = levels;
 
     return Error(GL_NO_ERROR);
 }
@@ -927,7 +927,7 @@
         return error;
     }
 
-    mImmutable = true;
+    mImmutableLevelCount = levels;
 
     return Error(GL_NO_ERROR);
 }
diff --git a/src/libGLESv2/Texture.h b/src/libGLESv2/Texture.h
index 4aa31a2..8aee2dc 100644
--- a/src/libGLESv2/Texture.h
+++ b/src/libGLESv2/Texture.h
@@ -77,7 +77,7 @@
     unsigned int getTextureSerial();
 
     bool isImmutable() const;
-    int immutableLevelCount();
+    GLsizei immutableLevelCount();
 
     rx::TextureImpl *getImplementation() { return mTexture; }
     const rx::TextureImpl *getImplementation() const { return mTexture; }
@@ -92,7 +92,7 @@
     SamplerState mSamplerState;
     GLenum mUsage;
 
-    bool mImmutable;
+    GLsizei mImmutableLevelCount;
 
     GLenum mTarget;
 
diff --git a/src/libGLESv2/libGLESv2.cpp b/src/libGLESv2/libGLESv2.cpp
index bd7774a..64503fc 100644
--- a/src/libGLESv2/libGLESv2.cpp
+++ b/src/libGLESv2/libGLESv2.cpp
@@ -3165,7 +3165,7 @@
                 context->recordError(gl::Error(GL_INVALID_ENUM));
                 return;
             }
-            *params = texture->immutableLevelCount();
+            *params = static_cast<GLint>(texture->immutableLevelCount());
             break;
           case GL_TEXTURE_USAGE_ANGLE:
             *params = texture->getUsage();