Add a helper to replace FBO attachment's getSerial.

Ideally we could store a render target serial in the render target
itself. For now, this helper function allows us to finally stop
exposing rx::RenderTarget from gl::Texture.

BUG=angle:732

Change-Id: I4ffc5e0af6f0542212ad4e74adced21ebbd89462
Reviewed-on: https://chromium-review.googlesource.com/217330
Reviewed-by: Shannon Woods <shannonwoods@chromium.org>
Tested-by: Jamie Madill <jmadill@chromium.org>
diff --git a/src/libGLESv2/Framebuffer.cpp b/src/libGLESv2/Framebuffer.cpp
index 4430e50..e82e34d 100644
--- a/src/libGLESv2/Framebuffer.cpp
+++ b/src/libGLESv2/Framebuffer.cpp
@@ -29,6 +29,7 @@
         gl::Texture *texture = attachment->getTexture();
         ASSERT(texture);
         TextureD3D *textureD3D = TextureD3D::makeTextureD3D(texture->getImplementation());
+
         return textureD3D->getRenderTarget(attachment->mipLevel(), attachment->layer());
     }
 
@@ -39,6 +40,24 @@
     return renderbuffer->getStorage()->getRenderTarget();
 }
 
+// Note: RenderTarget serials should ideally be in the RenderTargets themselves.
+unsigned int GetAttachmentSerial(gl::FramebufferAttachment *attachment)
+{
+    if (attachment->isTexture())
+    {
+        gl::Texture *texture = attachment->getTexture();
+        ASSERT(texture);
+        TextureD3D *textureD3D = TextureD3D::makeTextureD3D(texture->getImplementation());
+        return textureD3D->getRenderTargetSerial(attachment->mipLevel(), attachment->layer());
+    }
+
+    gl::Renderbuffer *renderbuffer = attachment->getRenderbuffer();
+    ASSERT(renderbuffer);
+
+    // TODO: cast to RenderbufferD3D
+    return renderbuffer->getStorage()->getSerial();
+}
+
 }
 
 namespace gl
diff --git a/src/libGLESv2/Framebuffer.h b/src/libGLESv2/Framebuffer.h
index 70998ff..cc12d22 100644
--- a/src/libGLESv2/Framebuffer.h
+++ b/src/libGLESv2/Framebuffer.h
@@ -119,6 +119,8 @@
 
 // TODO: place this in FramebufferD3D.h
 RenderTarget *GetAttachmentRenderTarget(gl::FramebufferAttachment *attachment);
+unsigned int GetAttachmentSerial(gl::FramebufferAttachment *attachment);
+
 }
 
 #endif   // LIBGLESV2_FRAMEBUFFER_H_
diff --git a/src/libGLESv2/FramebufferAttachment.cpp b/src/libGLESv2/FramebufferAttachment.cpp
index 007b846..7145e07 100644
--- a/src/libGLESv2/FramebufferAttachment.cpp
+++ b/src/libGLESv2/FramebufferAttachment.cpp
@@ -135,11 +135,6 @@
     return mIndex.layerIndex;
 }
 
-unsigned int TextureAttachment::getSerial() const
-{
-    return mTexture->getRenderTargetSerial(mIndex);
-}
-
 Texture *TextureAttachment::getTexture()
 {
     return mTexture.get();
@@ -190,11 +185,6 @@
     return mRenderbuffer->getStorage()->getSamples();
 }
 
-unsigned int RenderbufferAttachment::getSerial() const
-{
-    return mRenderbuffer->getStorage()->getSerial();
-}
-
 GLuint RenderbufferAttachment::id() const
 {
     return mRenderbuffer->id();
diff --git a/src/libGLESv2/FramebufferAttachment.h b/src/libGLESv2/FramebufferAttachment.h
index 90c50d0..8938540 100644
--- a/src/libGLESv2/FramebufferAttachment.h
+++ b/src/libGLESv2/FramebufferAttachment.h
@@ -62,8 +62,6 @@
     virtual GLenum getActualFormat() const = 0;
     virtual GLsizei getSamples() const = 0;
 
-    virtual unsigned int getSerial() const = 0;
-
     virtual GLuint id() const = 0;
     virtual GLenum type() const = 0;
     virtual GLint mipLevel() const = 0;
@@ -96,8 +94,6 @@
     virtual GLint mipLevel() const;
     virtual GLint layer() const;
 
-    virtual unsigned int getSerial() const;
-
     virtual Texture *getTexture();
     virtual Renderbuffer *getRenderbuffer();
 
@@ -121,8 +117,6 @@
     virtual GLenum getActualFormat() const;
     virtual GLsizei getSamples() const;
 
-    virtual unsigned int getSerial() const;
-
     virtual GLuint id() const;
     virtual GLenum type() const;
     virtual GLint mipLevel() const;
diff --git a/src/libGLESv2/Texture.cpp b/src/libGLESv2/Texture.cpp
index 528eb10..396dbb5 100644
--- a/src/libGLESv2/Texture.cpp
+++ b/src/libGLESv2/Texture.cpp
@@ -14,7 +14,6 @@
 #include "libGLESv2/formatutils.h"
 #include "libGLESv2/Renderbuffer.h"
 #include "libGLESv2/renderer/Image.h"
-#include "libGLESv2/renderer/RenderTarget.h"
 #include "libGLESv2/renderer/d3d/TextureStorage.h"
 
 #include "libEGL/Surface.h"
@@ -179,16 +178,6 @@
     return (getImplementation()->getLayerCount(0) > 0 ? getImplementation()->getImage(0, 0) : NULL);
 }
 
-rx::RenderTarget *Texture::getRenderTarget(const ImageIndex &index)
-{
-    return mTexture->getRenderTarget(index.mipIndex, index.layerIndex);
-}
-
-unsigned int Texture::getRenderTargetSerial(const ImageIndex &index)
-{
-    return mTexture->getRenderTargetSerial(index.mipIndex, index.layerIndex);
-}
-
 Texture2D::Texture2D(rx::TextureImpl *impl, GLuint id)
     : Texture(impl, id, GL_TEXTURE_2D)
 {
diff --git a/src/libGLESv2/Texture.h b/src/libGLESv2/Texture.h
index 13e4496..3838912 100644
--- a/src/libGLESv2/Texture.h
+++ b/src/libGLESv2/Texture.h
@@ -99,11 +99,6 @@
 
     const rx::Image *getBaseLevelImage() const;
 
-    // TODO: move these to TextureD3D
-    friend class TextureAttachment;
-    rx::RenderTarget *getRenderTarget(const ImageIndex &index);
-    unsigned int getRenderTargetSerial(const ImageIndex &index);
-
   private:
     DISALLOW_COPY_AND_ASSIGN(Texture);
 };
diff --git a/src/libGLESv2/renderer/TextureImpl.h b/src/libGLESv2/renderer/TextureImpl.h
index c34485a..9ac3ec1 100644
--- a/src/libGLESv2/renderer/TextureImpl.h
+++ b/src/libGLESv2/renderer/TextureImpl.h
@@ -29,7 +29,6 @@
 {
 
 class Image;
-class RenderTarget;
 class Renderer;
 class TextureStorageInterface;
 
@@ -58,9 +57,6 @@
 
     virtual void generateMipmaps() = 0;
 
-    virtual unsigned int getRenderTargetSerial(GLint level, GLint layer) = 0;
-    virtual RenderTarget *getRenderTarget(GLint level, GLint layer) = 0;
-
     virtual void bindTexImage(egl::Surface *surface) = 0;
     virtual void releaseTexImage() = 0;
 };
diff --git a/src/libGLESv2/renderer/d3d/TextureD3D.h b/src/libGLESv2/renderer/d3d/TextureD3D.h
index 7f21630..e8fbe84 100644
--- a/src/libGLESv2/renderer/d3d/TextureD3D.h
+++ b/src/libGLESv2/renderer/d3d/TextureD3D.h
@@ -24,6 +24,7 @@
 class Image;
 class ImageD3D;
 class Renderer;
+class RenderTarget;
 class TextureStorageInterface;
 class TextureStorageInterface2D;
 class TextureStorageInterfaceCube;
@@ -51,6 +52,9 @@
 
     bool isImmutable() const { return mImmutable; }
 
+    virtual RenderTarget *getRenderTarget(GLint level, GLint layer) = 0;
+    virtual unsigned int getRenderTargetSerial(GLint level, GLint layer) = 0;
+
   protected:
     void setImage(const gl::PixelUnpackState &unpack, GLenum type, const void *pixels, Image *image);
     bool subImage(GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth,
@@ -111,9 +115,8 @@
 
     virtual void generateMipmaps();
 
-    virtual unsigned int getRenderTargetSerial(GLint level, GLint layer);
-
     virtual RenderTarget *getRenderTarget(GLint level, GLint layer);
+    virtual unsigned int getRenderTargetSerial(GLint level, GLint layer);
 
   private:
     DISALLOW_COPY_AND_ASSIGN(TextureD3D_2D);
@@ -168,9 +171,8 @@
 
     virtual void generateMipmaps();
 
-    virtual unsigned int getRenderTargetSerial(GLint level, GLint layer);
-
     virtual RenderTarget *getRenderTarget(GLint level, GLint layer);
+    virtual unsigned int getRenderTargetSerial(GLint level, GLint layer);
 
   private:
     DISALLOW_COPY_AND_ASSIGN(TextureD3D_Cube);
@@ -225,10 +227,9 @@
 
     virtual void generateMipmaps();
 
-    virtual unsigned int getRenderTargetSerial(GLint level, GLint layer);
-
-    virtual RenderTarget *getRenderTarget(GLint level);
+    RenderTarget *getRenderTarget(GLint level);
     virtual RenderTarget *getRenderTarget(GLint level, GLint layer);
+    virtual unsigned int getRenderTargetSerial(GLint level, GLint layer);
 
   private:
     DISALLOW_COPY_AND_ASSIGN(TextureD3D_3D);
@@ -282,9 +283,8 @@
 
     virtual void generateMipmaps();
 
-    virtual unsigned int getRenderTargetSerial(GLint level, GLint layer);
-
     virtual RenderTarget *getRenderTarget(GLint level, GLint layer);
+    virtual unsigned int getRenderTargetSerial(GLint level, GLint layer);
 
   private:
     DISALLOW_COPY_AND_ASSIGN(TextureD3D_2DArray);
diff --git a/src/libGLESv2/renderer/d3d/d3d11/Renderer11.cpp b/src/libGLESv2/renderer/d3d/d3d11/Renderer11.cpp
index 10d6bbe..753a4ca 100644
--- a/src/libGLESv2/renderer/d3d/d3d11/Renderer11.cpp
+++ b/src/libGLESv2/renderer/d3d/d3d11/Renderer11.cpp
@@ -820,7 +820,7 @@
                 return false;
             }
 
-            renderTargetSerials[colorAttachment] = colorbuffer->getSerial();
+            renderTargetSerials[colorAttachment] = GetAttachmentSerial(colorbuffer);
 
             // Extract the render target dimensions and view
             RenderTarget11 *renderTarget = d3d11::GetAttachmentRenderTarget(colorbuffer);
@@ -850,18 +850,18 @@
         }
     }
 
-    // Get the depth stencil render buffer and serials
+    // Get the depth stencil render buffter and serials
     gl::FramebufferAttachment *depthStencil = framebuffer->getDepthbuffer();
     unsigned int depthbufferSerial = 0;
     unsigned int stencilbufferSerial = 0;
     if (depthStencil)
     {
-        depthbufferSerial = depthStencil->getSerial();
+        depthbufferSerial = GetAttachmentSerial(depthStencil);
     }
     else if (framebuffer->getStencilbuffer())
     {
         depthStencil = framebuffer->getStencilbuffer();
-        stencilbufferSerial = depthStencil->getSerial();
+        stencilbufferSerial = GetAttachmentSerial(depthStencil);
     }
 
     ID3D11DepthStencilView* framebufferDSV = NULL;
diff --git a/src/libGLESv2/renderer/d3d/d3d9/Renderer9.cpp b/src/libGLESv2/renderer/d3d/d3d9/Renderer9.cpp
index 4ae077d..cabec08 100644
--- a/src/libGLESv2/renderer/d3d/d3d9/Renderer9.cpp
+++ b/src/libGLESv2/renderer/d3d/d3d9/Renderer9.cpp
@@ -1150,7 +1150,7 @@
     }
 
     bool renderTargetChanged = false;
-    unsigned int renderTargetSerial = attachment->getSerial();
+    unsigned int renderTargetSerial = GetAttachmentSerial(attachment);
     if (renderTargetSerial != mAppliedRenderTargetSerial)
     {
         // Apply the render target on the device
@@ -1180,12 +1180,12 @@
     unsigned int stencilbufferSerial = 0;
     if (depthStencil)
     {
-        depthbufferSerial = depthStencil->getSerial();
+        depthbufferSerial = GetAttachmentSerial(depthStencil);
     }
     else if (framebuffer->getStencilbuffer())
     {
         depthStencil = framebuffer->getStencilbuffer();
-        stencilbufferSerial = depthStencil->getSerial();
+        stencilbufferSerial = GetAttachmentSerial(depthStencil);
     }
 
     if (depthbufferSerial != mAppliedDepthbufferSerial ||