Don't discard serials of zero from the set of bound framebuffer serials.

A serial of zero is a valid texture serial but it was used by
RenderbufferStorage to denote a non-texture binding. Added a isTexture
method to Renderbuffers and RenderbufferStorage
has been updated to return -1 as the current texture serial to avoid
collisions.

BUG=angle:633

Change-Id: Ie27e4b185ac09b48b593ae0dea02aeff5950a44f
Reviewed-on: https://chromium-review.googlesource.com/200123
Reviewed-by: Nicolas Capens <nicolascapens@chromium.org>
Reviewed-by: Jamie Madill <jmadill@chromium.org>
Tested-by: Geoff Lang <geofflang@chromium.org>
diff --git a/src/libGLESv2/Context.cpp b/src/libGLESv2/Context.cpp
index 7242a11..a7bac12 100644
--- a/src/libGLESv2/Context.cpp
+++ b/src/libGLESv2/Context.cpp
@@ -3942,14 +3942,14 @@
     for (unsigned int i = 0; i < IMPLEMENTATION_MAX_DRAW_BUFFERS; i++)
     {
         Renderbuffer *renderBuffer = drawFramebuffer->getColorbuffer(i);
-        if (renderBuffer && renderBuffer->getTextureSerial() != 0)
+        if (renderBuffer && renderBuffer->isTexture())
         {
             (*outSerialArray)[serialCount++] = renderBuffer->getTextureSerial();
         }
     }
 
     Renderbuffer *depthStencilBuffer = drawFramebuffer->getDepthOrStencilbuffer();
-    if (depthStencilBuffer && depthStencilBuffer->getTextureSerial() != 0)
+    if (depthStencilBuffer && depthStencilBuffer->isTexture())
     {
         (*outSerialArray)[serialCount++] = depthStencilBuffer->getTextureSerial();
     }
diff --git a/src/libGLESv2/Renderbuffer.cpp b/src/libGLESv2/Renderbuffer.cpp
index 2e05f38..2851908 100644
--- a/src/libGLESv2/Renderbuffer.cpp
+++ b/src/libGLESv2/Renderbuffer.cpp
@@ -106,6 +106,11 @@
     return mTexture2D->getRenderTargetSerial(mLevel);
 }
 
+bool RenderbufferTexture2D::isTexture() const
+{
+    return true;
+}
+
 unsigned int RenderbufferTexture2D::getTextureSerial() const
 {
     return mTexture2D->getTextureSerial();
@@ -181,6 +186,11 @@
     return mTextureCubeMap->getRenderTargetSerial(mFaceTarget, mLevel);
 }
 
+bool RenderbufferTextureCubeMap::isTexture() const
+{
+    return true;
+}
+
 unsigned int RenderbufferTextureCubeMap::getTextureSerial() const
 {
     return mTextureCubeMap->getTextureSerial();
@@ -256,6 +266,11 @@
     return mTexture3D->getRenderTargetSerial(mLevel, mLayer);
 }
 
+bool RenderbufferTexture3DLayer::isTexture() const
+{
+    return true;
+}
+
 unsigned int RenderbufferTexture3DLayer::getTextureSerial() const
 {
     return mTexture3D->getTextureSerial();
@@ -329,6 +344,11 @@
     return mTexture2DArray->getRenderTargetSerial(mLevel, mLayer);
 }
 
+bool RenderbufferTexture2DArrayLayer::isTexture() const
+{
+    return true;
+}
+
 unsigned int RenderbufferTexture2DArrayLayer::getTextureSerial() const
 {
     return mTexture2DArray->getTextureSerial();
@@ -451,6 +471,11 @@
     return mInstance->getSerial();
 }
 
+bool Renderbuffer::isTexture() const
+{
+    return mInstance->isTexture();
+}
+
 unsigned int Renderbuffer::getTextureSerial() const
 {
     return mInstance->getTextureSerial();
@@ -529,6 +554,16 @@
     return firstSerial;
 }
 
+bool RenderbufferStorage::isTexture() const
+{
+    return false;
+}
+
+unsigned int RenderbufferStorage::getTextureSerial() const
+{
+    return -1;
+}
+
 Colorbuffer::Colorbuffer(rx::Renderer *renderer, rx::SwapChain *swapChain)
 {
     mRenderTarget = renderer->createRenderTarget(swapChain, false); 
diff --git a/src/libGLESv2/Renderbuffer.h b/src/libGLESv2/Renderbuffer.h
index 04263f3..0220638 100644
--- a/src/libGLESv2/Renderbuffer.h
+++ b/src/libGLESv2/Renderbuffer.h
@@ -58,6 +58,8 @@
     virtual GLsizei getSamples() const = 0;
 
     virtual unsigned int getSerial() const = 0;
+
+    virtual bool isTexture() const = 0;
     virtual unsigned int getTextureSerial() const = 0;
 
   private:
@@ -85,6 +87,8 @@
     virtual GLsizei getSamples() const;
 
     virtual unsigned int getSerial() const;
+
+    virtual bool isTexture() const;
     virtual unsigned int getTextureSerial() const;
 
   private:
@@ -115,6 +119,8 @@
     virtual GLsizei getSamples() const;
 
     virtual unsigned int getSerial() const;
+
+    virtual bool isTexture() const;
     virtual unsigned int getTextureSerial() const;
 
   private:
@@ -146,6 +152,8 @@
     virtual GLsizei getSamples() const;
 
     virtual unsigned int getSerial() const;
+
+    virtual bool isTexture() const;
     virtual unsigned int getTextureSerial() const;
 
 private:
@@ -177,6 +185,8 @@
     virtual GLsizei getSamples() const;
 
     virtual unsigned int getSerial() const;
+
+    virtual bool isTexture() const;
     virtual unsigned int getTextureSerial() const;
 
 private:
@@ -208,7 +218,9 @@
     virtual GLsizei getSamples() const;
 
     virtual unsigned int getSerial() const;
-    virtual unsigned int getTextureSerial() const { return 0; }
+
+    virtual bool isTexture() const;
+    virtual unsigned int getTextureSerial() const;
 
     static unsigned int issueSerials(GLuint count);
 
@@ -263,6 +275,8 @@
     GLsizei getSamples() const;
 
     unsigned int getSerial() const;
+
+    bool isTexture() const;
     unsigned int getTextureSerial() const;
 
     void setStorage(RenderbufferStorage *newStorage);