Rename Renderbuffer to FramebufferAttachment.

Part of the refactoring effort to clean up our classes for FBO
attachments and Renderbuffers.

BUG=angle:660

Change-Id: Id23df904f56499568159611b66c8922b9dce6a3d
Reviewed-on: https://chromium-review.googlesource.com/201832
Reviewed-by: Shannon Woods <shannonwoods@chromium.org>
Tested-by: Jamie Madill <jmadill@chromium.org>
diff --git a/src/libGLESv2/Context.cpp b/src/libGLESv2/Context.cpp
index 79b47c8..879a560 100644
--- a/src/libGLESv2/Context.cpp
+++ b/src/libGLESv2/Context.cpp
@@ -1105,7 +1105,7 @@
     return mResourceManager->getTexture(handle);
 }
 
-Renderbuffer *Context::getRenderbuffer(GLuint handle)
+FramebufferAttachment *Context::getRenderbuffer(GLuint handle)
 {
     return mResourceManager->getRenderbuffer(handle);
 }
@@ -1440,7 +1440,7 @@
         return;
     }
 
-    Renderbuffer *renderbufferObject = mState.renderbuffer.get();
+    FramebufferAttachment *renderbufferObject = mState.renderbuffer.get();
     renderbufferObject->setStorage(renderbuffer);
 }
 
@@ -1884,7 +1884,7 @@
       case GL_ALPHA_BITS:
         {
             gl::Framebuffer *framebuffer = getDrawFramebuffer();
-            gl::Renderbuffer *colorbuffer = framebuffer->getFirstColorbuffer();
+            gl::FramebufferAttachment *colorbuffer = framebuffer->getFirstColorbuffer();
 
             if (colorbuffer)
             {
@@ -1905,7 +1905,7 @@
       case GL_DEPTH_BITS:
         {
             gl::Framebuffer *framebuffer = getDrawFramebuffer();
-            gl::Renderbuffer *depthbuffer = framebuffer->getDepthbuffer();
+            gl::FramebufferAttachment *depthbuffer = framebuffer->getDepthbuffer();
 
             if (depthbuffer)
             {
@@ -1920,7 +1920,7 @@
       case GL_STENCIL_BITS:
         {
             gl::Framebuffer *framebuffer = getDrawFramebuffer();
-            gl::Renderbuffer *stencilbuffer = framebuffer->getStencilbuffer();
+            gl::FramebufferAttachment *stencilbuffer = framebuffer->getStencilbuffer();
 
             if (stencilbuffer)
             {
@@ -3348,12 +3348,12 @@
     Framebuffer *framebuffer = getReadFramebuffer();
     ASSERT(framebuffer && framebuffer->completeness() == GL_FRAMEBUFFER_COMPLETE);
 
-    Renderbuffer *renderbuffer = framebuffer->getReadColorbuffer();
-    ASSERT(renderbuffer);
+    FramebufferAttachment *attachment = framebuffer->getReadColorbuffer();
+    ASSERT(attachment);
 
-    *internalFormat = renderbuffer->getActualFormat();
-    *format = gl::GetFormat(renderbuffer->getActualFormat(), mClientVersion);
-    *type = gl::GetType(renderbuffer->getActualFormat(), mClientVersion);
+    *internalFormat = attachment->getActualFormat();
+    *format = gl::GetFormat(attachment->getActualFormat(), mClientVersion);
+    *type = gl::GetType(attachment->getActualFormat(), mClientVersion);
 }
 
 void Context::detachBuffer(GLuint buffer)
@@ -3393,7 +3393,7 @@
 
     // [OpenGL ES 2.0.24] section 4.4 page 112:
     // If a texture object is deleted while its image is attached to the currently bound framebuffer, then it is
-    // as if FramebufferTexture2D had been called, with a texture of 0, for each attachment point to which this
+    // as if Texture2DAttachment had been called, with a texture of 0, for each attachment point to which this
     // image was attached in the currently bound framebuffer.
 
     Framebuffer *readFramebuffer = getReadFramebuffer();
@@ -3883,17 +3883,17 @@
     Framebuffer *drawFramebuffer = getDrawFramebuffer();
     for (unsigned int i = 0; i < IMPLEMENTATION_MAX_DRAW_BUFFERS; i++)
     {
-        Renderbuffer *renderBuffer = drawFramebuffer->getColorbuffer(i);
-        if (renderBuffer && renderBuffer->isTexture())
+        FramebufferAttachment *attachment = drawFramebuffer->getColorbuffer(i);
+        if (attachment && attachment->isTexture())
         {
-            (*outSerialArray)[serialCount++] = renderBuffer->getTextureSerial();
+            (*outSerialArray)[serialCount++] = attachment->getTextureSerial();
         }
     }
 
-    Renderbuffer *depthStencilBuffer = drawFramebuffer->getDepthOrStencilbuffer();
-    if (depthStencilBuffer && depthStencilBuffer->isTexture())
+    FramebufferAttachment *depthStencilAttachment = drawFramebuffer->getDepthOrStencilbuffer();
+    if (depthStencilAttachment && depthStencilAttachment->isTexture())
     {
-        (*outSerialArray)[serialCount++] = depthStencilBuffer->getTextureSerial();
+        (*outSerialArray)[serialCount++] = depthStencilAttachment->getTextureSerial();
     }
 
     std::sort(outSerialArray->begin(), outSerialArray->begin() + serialCount);
@@ -3958,43 +3958,43 @@
 
             if (attachments[i] >= GL_COLOR_ATTACHMENT0 && attachments[i] <= GL_COLOR_ATTACHMENT15)
             {
-                gl::Renderbuffer *renderBuffer = frameBuffer->getColorbuffer(attachments[i] - GL_COLOR_ATTACHMENT0);
-                if (renderBuffer)
+                gl::FramebufferAttachment *attachment = frameBuffer->getColorbuffer(attachments[i] - GL_COLOR_ATTACHMENT0);
+                if (attachment)
                 {
-                    renderTarget = renderBuffer->getRenderTarget();
+                    renderTarget = attachment->getRenderTarget();
                 }
             }
             else if (attachments[i] == GL_COLOR)
             {
-                 gl::Renderbuffer *renderBuffer = frameBuffer->getColorbuffer(0);
-                 if (renderBuffer)
+                 gl::FramebufferAttachment *attachment = frameBuffer->getColorbuffer(0);
+                 if (attachment)
                  {
-                     renderTarget = renderBuffer->getRenderTarget();
+                     renderTarget = attachment->getRenderTarget();
                  }
             }
             else
             {
-                gl::Renderbuffer *renderBuffer = NULL;
+                gl::FramebufferAttachment *attachment = NULL;
                 switch (attachments[i])
                 {
                   case GL_DEPTH_ATTACHMENT:
                   case GL_DEPTH:
-                    renderBuffer = frameBuffer->getDepthbuffer();
+                    attachment = frameBuffer->getDepthbuffer();
                     break;
                   case GL_STENCIL_ATTACHMENT:
                   case GL_STENCIL:
-                    renderBuffer = frameBuffer->getStencilbuffer();
+                    attachment = frameBuffer->getStencilbuffer();
                     break;
                   case GL_DEPTH_STENCIL_ATTACHMENT:
-                    renderBuffer = frameBuffer->getDepthOrStencilbuffer();
+                    attachment = frameBuffer->getDepthOrStencilbuffer();
                     break;
                   default:
                     UNREACHABLE();
                 }
 
-                if (renderBuffer)
+                if (attachment)
                 {
-                    renderTarget = renderBuffer->getDepthStencil();
+                    renderTarget = attachment->getDepthStencil();
                 }
             }
 
diff --git a/src/libGLESv2/Context.h b/src/libGLESv2/Context.h
index b3c8a3f..ab79004 100644
--- a/src/libGLESv2/Context.h
+++ b/src/libGLESv2/Context.h
@@ -50,7 +50,7 @@
 class Texture3D;
 class Texture2DArray;
 class Framebuffer;
-class Renderbuffer;
+class FramebufferAttachment;
 class RenderbufferStorage;
 class Colorbuffer;
 class Depthbuffer;
@@ -100,7 +100,7 @@
     BindingPointer<Buffer> arrayBuffer;
     GLuint readFramebuffer;
     GLuint drawFramebuffer;
-    BindingPointer<Renderbuffer> renderbuffer;
+    BindingPointer<FramebufferAttachment> renderbuffer;
     GLuint currentProgram;
 
     VertexAttribCurrentValueData vertexAttribCurrentValues[MAX_VERTEX_ATTRIBS]; // From glVertexAttrib
@@ -331,7 +331,7 @@
     Program *getProgram(GLuint handle) const;
     Texture *getTexture(GLuint handle);
     Framebuffer *getFramebuffer(GLuint handle) const;
-    Renderbuffer *getRenderbuffer(GLuint handle);
+    FramebufferAttachment *getRenderbuffer(GLuint handle);
     VertexArray *getVertexArray(GLuint handle) const;
     Sampler *getSampler(GLuint handle) const;
     Query *getQuery(GLuint handle, bool create, GLenum type);
diff --git a/src/libGLESv2/Framebuffer.cpp b/src/libGLESv2/Framebuffer.cpp
index 97d37d0..b78419f 100644
--- a/src/libGLESv2/Framebuffer.cpp
+++ b/src/libGLESv2/Framebuffer.cpp
@@ -42,7 +42,7 @@
     mStencilbuffer.set(NULL, GL_NONE, 0, 0);
 }
 
-Renderbuffer *Framebuffer::lookupRenderbuffer(GLenum type, GLuint handle, GLint level, GLint layer) const
+FramebufferAttachment *Framebuffer::lookupAttachment(GLenum type, GLuint handle, GLint level, GLint layer) const
 {
     gl::Context *context = gl::getContext();
 
@@ -59,7 +59,7 @@
             Texture *texture = context->getTexture(handle);
             if (texture && texture->getTarget() == GL_TEXTURE_2D)
             {
-                return static_cast<Texture2D*>(texture)->getRenderbuffer(level);
+                return static_cast<Texture2D*>(texture)->getAttachment(level);
             }
             else
             {
@@ -77,7 +77,7 @@
             Texture *texture = context->getTexture(handle);
             if (texture && texture->getTarget() == GL_TEXTURE_CUBE_MAP)
             {
-                return static_cast<TextureCubeMap*>(texture)->getRenderbuffer(type, level);
+                return static_cast<TextureCubeMap*>(texture)->getAttachment(type, level);
             }
             else
             {
@@ -90,7 +90,7 @@
             Texture *texture = context->getTexture(handle);
             if (texture && texture->getTarget() == GL_TEXTURE_3D)
             {
-                return static_cast<Texture3D*>(texture)->getRenderbuffer(level, layer);
+                return static_cast<Texture3D*>(texture)->getAttachment(level, layer);
             }
             else
             {
@@ -103,7 +103,7 @@
             Texture *texture = context->getTexture(handle);
             if (texture && texture->getTarget() == GL_TEXTURE_2D_ARRAY)
             {
-                return static_cast<Texture2DArray*>(texture)->getRenderbuffer(level, layer);
+                return static_cast<Texture2DArray*>(texture)->getAttachment(level, layer);
             }
             else
             {
@@ -120,10 +120,10 @@
 void Framebuffer::setColorbuffer(unsigned int colorAttachment, GLenum type, GLuint colorbuffer, GLint level, GLint layer)
 {
     ASSERT(colorAttachment < IMPLEMENTATION_MAX_DRAW_BUFFERS);
-    Renderbuffer *renderBuffer = lookupRenderbuffer(type, colorbuffer, level, layer);
-    if (renderBuffer)
+    FramebufferAttachment *attachment = lookupAttachment(type, colorbuffer, level, layer);
+    if (attachment)
     {
-        mColorbuffers[colorAttachment].set(renderBuffer, type, level, layer);
+        mColorbuffers[colorAttachment].set(attachment, type, level, layer);
     }
     else
     {
@@ -133,10 +133,10 @@
 
 void Framebuffer::setDepthbuffer(GLenum type, GLuint depthbuffer, GLint level, GLint layer)
 {
-    Renderbuffer *renderBuffer = lookupRenderbuffer(type, depthbuffer, level, layer);
-    if (renderBuffer)
+    FramebufferAttachment *attachment = lookupAttachment(type, depthbuffer, level, layer);
+    if (attachment)
     {
-        mDepthbuffer.set(renderBuffer, type, level, layer);
+        mDepthbuffer.set(attachment, type, level, layer);
     }
     else
     {
@@ -146,10 +146,10 @@
 
 void Framebuffer::setStencilbuffer(GLenum type, GLuint stencilbuffer, GLint level, GLint layer)
 {
-    Renderbuffer *renderBuffer = lookupRenderbuffer(type, stencilbuffer, level, layer);
-    if (renderBuffer)
+    FramebufferAttachment *attachment = lookupAttachment(type, stencilbuffer, level, layer);
+    if (attachment)
     {
-        mStencilbuffer.set(renderBuffer, type, level, layer);
+        mStencilbuffer.set(attachment, type, level, layer);
     }
     else
     {
@@ -159,11 +159,11 @@
 
 void Framebuffer::setDepthStencilBuffer(GLenum type, GLuint depthStencilBuffer, GLint level, GLint layer)
 {
-    Renderbuffer *renderBuffer = lookupRenderbuffer(type, depthStencilBuffer, level, layer);
-    if (renderBuffer && renderBuffer->getDepthSize() > 0 && renderBuffer->getStencilSize() > 0)
+    FramebufferAttachment *attachment = lookupAttachment(type, depthStencilBuffer, level, layer);
+    if (attachment && attachment->getDepthSize() > 0 && attachment->getStencilSize() > 0)
     {
-        mDepthbuffer.set(renderBuffer, type, level, layer);
-        mStencilbuffer.set(renderBuffer, type, level, layer);
+        mDepthbuffer.set(attachment, type, level, layer);
+        mStencilbuffer.set(attachment, type, level, layer);
     }
     else
     {
@@ -219,7 +219,7 @@
 {
     ASSERT(colorAttachment < IMPLEMENTATION_MAX_DRAW_BUFFERS);
 
-    Renderbuffer *colorbuffer = mColorbuffers[colorAttachment].get();
+    FramebufferAttachment *colorbuffer = mColorbuffers[colorAttachment].get();
 
     if (colorbuffer)
     {
@@ -231,7 +231,7 @@
 
 unsigned int Framebuffer::getDepthbufferSerial() const
 {
-    Renderbuffer *depthbuffer = mDepthbuffer.get();
+    FramebufferAttachment *depthbuffer = mDepthbuffer.get();
 
     if (depthbuffer)
     {
@@ -243,7 +243,7 @@
 
 unsigned int Framebuffer::getStencilbufferSerial() const
 {
-    Renderbuffer *stencilbuffer = mStencilbuffer.get();
+    FramebufferAttachment *stencilbuffer = mStencilbuffer.get();
 
     if (stencilbuffer)
     {
@@ -253,30 +253,30 @@
     return 0;
 }
 
-Renderbuffer *Framebuffer::getColorbuffer(unsigned int colorAttachment) const
+FramebufferAttachment *Framebuffer::getColorbuffer(unsigned int colorAttachment) const
 {
     ASSERT(colorAttachment < IMPLEMENTATION_MAX_DRAW_BUFFERS);
     return mColorbuffers[colorAttachment].get();
 }
 
-Renderbuffer *Framebuffer::getDepthbuffer() const
+FramebufferAttachment *Framebuffer::getDepthbuffer() const
 {
     return mDepthbuffer.get();
 }
 
-Renderbuffer *Framebuffer::getStencilbuffer() const
+FramebufferAttachment *Framebuffer::getStencilbuffer() const
 {
     return mStencilbuffer.get();
 }
 
-Renderbuffer *Framebuffer::getDepthStencilBuffer() const
+FramebufferAttachment *Framebuffer::getDepthStencilBuffer() const
 {
     return (mDepthbuffer.id() == mStencilbuffer.id()) ? mDepthbuffer.get() : NULL;
 }
 
-Renderbuffer *Framebuffer::getDepthOrStencilbuffer() const
+FramebufferAttachment *Framebuffer::getDepthOrStencilbuffer() const
 {
-    Renderbuffer *depthstencilbuffer = mDepthbuffer.get();
+    FramebufferAttachment *depthstencilbuffer = mDepthbuffer.get();
     
     if (!depthstencilbuffer)
     {
@@ -286,7 +286,7 @@
     return depthstencilbuffer;
 }
 
-Renderbuffer *Framebuffer::getReadColorbuffer() const
+FramebufferAttachment *Framebuffer::getReadColorbuffer() const
 {
     // Will require more logic if glReadBuffers is supported
     return mColorbuffers[0].get();
@@ -298,7 +298,7 @@
     return mColorbuffers[0].type();
 }
 
-Renderbuffer *Framebuffer::getFirstColorbuffer() const
+FramebufferAttachment *Framebuffer::getFirstColorbuffer() const
 {
     for (unsigned int colorAttachment = 0; colorAttachment < IMPLEMENTATION_MAX_DRAW_BUFFERS; colorAttachment++)
     {
@@ -427,7 +427,7 @@
 {
     if (mStencilbuffer.type() != GL_NONE)
     {
-        const Renderbuffer *stencilbufferObject = getStencilbuffer();
+        const FramebufferAttachment *stencilbufferObject = getStencilbuffer();
 
         if (stencilbufferObject)
         {
@@ -464,7 +464,7 @@
     {
         if (mColorbuffers[colorAttachment].type() != GL_NONE)
         {
-            const Renderbuffer *colorbuffer = getColorbuffer(colorAttachment);
+            const FramebufferAttachment *colorbuffer = getColorbuffer(colorAttachment);
 
             if (!colorbuffer)
             {
@@ -549,8 +549,8 @@
         }
     }
 
-    const Renderbuffer *depthbuffer = NULL;
-    const Renderbuffer *stencilbuffer = NULL;
+    const FramebufferAttachment *depthbuffer = NULL;
+    const FramebufferAttachment *stencilbuffer = NULL;
 
     if (mDepthbuffer.type() != GL_NONE)
     {
@@ -690,9 +690,9 @@
 DefaultFramebuffer::DefaultFramebuffer(rx::Renderer *renderer, Colorbuffer *colorbuffer, DepthStencilbuffer *depthStencil)
     : Framebuffer(renderer)
 {
-    mColorbuffers[0].set(new Renderbuffer(mRenderer, 0, colorbuffer), GL_RENDERBUFFER, 0, 0);
+    mColorbuffers[0].set(new FramebufferAttachment(mRenderer, 0, colorbuffer), GL_RENDERBUFFER, 0, 0);
 
-    Renderbuffer *depthStencilRenderbuffer = new Renderbuffer(mRenderer, 0, depthStencil);
+    FramebufferAttachment *depthStencilRenderbuffer = new FramebufferAttachment(mRenderer, 0, depthStencil);
     mDepthbuffer.set(depthStencilRenderbuffer, (depthStencilRenderbuffer->getDepthSize() != 0) ? GL_RENDERBUFFER : GL_NONE, 0, 0);
     mStencilbuffer.set(depthStencilRenderbuffer, (depthStencilRenderbuffer->getStencilSize() != 0) ? GL_RENDERBUFFER : GL_NONE, 0, 0);
 
diff --git a/src/libGLESv2/Framebuffer.h b/src/libGLESv2/Framebuffer.h
index c0d8ee8..1a5e2b6 100644
--- a/src/libGLESv2/Framebuffer.h
+++ b/src/libGLESv2/Framebuffer.h
@@ -21,7 +21,7 @@
 
 namespace gl
 {
-class Renderbuffer;
+class FramebufferAttachment;
 class Colorbuffer;
 class Depthbuffer;
 class Stencilbuffer;
@@ -46,14 +46,14 @@
     unsigned int getDepthbufferSerial() const;
     unsigned int getStencilbufferSerial() const;
 
-    Renderbuffer *getColorbuffer(unsigned int colorAttachment) const;
-    Renderbuffer *getDepthbuffer() const;
-    Renderbuffer *getStencilbuffer() const;
-    Renderbuffer *getDepthStencilBuffer() const;
-    Renderbuffer *getDepthOrStencilbuffer() const;
-    Renderbuffer *getReadColorbuffer() const;
+    FramebufferAttachment *getColorbuffer(unsigned int colorAttachment) const;
+    FramebufferAttachment *getDepthbuffer() const;
+    FramebufferAttachment *getStencilbuffer() const;
+    FramebufferAttachment *getDepthStencilBuffer() const;
+    FramebufferAttachment *getDepthOrStencilbuffer() const;
+    FramebufferAttachment *getReadColorbuffer() const;
     GLenum getReadColorbufferType() const;
-    Renderbuffer *getFirstColorbuffer() const;
+    FramebufferAttachment *getFirstColorbuffer() const;
 
     GLenum getColorbufferType(unsigned int colorAttachment) const;
     GLenum getDepthbufferType() const;
@@ -87,19 +87,19 @@
     virtual GLenum completeness() const;
 
   protected:
-    FramebufferTextureBindingPointer<Renderbuffer> mColorbuffers[IMPLEMENTATION_MAX_DRAW_BUFFERS];
+    FramebufferTextureBindingPointer<FramebufferAttachment> mColorbuffers[IMPLEMENTATION_MAX_DRAW_BUFFERS];
     GLenum mDrawBufferStates[IMPLEMENTATION_MAX_DRAW_BUFFERS];
     GLenum mReadBufferState;
 
-    FramebufferTextureBindingPointer<Renderbuffer> mDepthbuffer;
-    FramebufferTextureBindingPointer<Renderbuffer> mStencilbuffer;
+    FramebufferTextureBindingPointer<FramebufferAttachment> mDepthbuffer;
+    FramebufferTextureBindingPointer<FramebufferAttachment> mStencilbuffer;
 
     rx::Renderer *mRenderer;
 
   private:
     DISALLOW_COPY_AND_ASSIGN(Framebuffer);
 
-    Renderbuffer *lookupRenderbuffer(GLenum type, GLuint handle, GLint level, GLint layer) const;
+    FramebufferAttachment *lookupAttachment(GLenum type, GLuint handle, GLint level, GLint layer) const;
 };
 
 class DefaultFramebuffer : public Framebuffer
diff --git a/src/libGLESv2/Renderbuffer.cpp b/src/libGLESv2/Renderbuffer.cpp
index 2851908..ce822ec 100644
--- a/src/libGLESv2/Renderbuffer.cpp
+++ b/src/libGLESv2/Renderbuffer.cpp
@@ -22,341 +22,341 @@
 {
 unsigned int RenderbufferStorage::mCurrentSerial = 1;
 
-RenderbufferInterface::RenderbufferInterface()
+FramebufferAttachmentInterface::FramebufferAttachmentInterface()
 {
 }
 
-// The default case for classes inherited from RenderbufferInterface is not to
-// need to do anything upon the reference count to the parent Renderbuffer incrementing
+// The default case for classes inherited from FramebufferAttachmentInterface is not to
+// need to do anything upon the reference count to the parent FramebufferAttachment incrementing
 // or decrementing. 
-void RenderbufferInterface::addProxyRef(const Renderbuffer *proxy)
+void FramebufferAttachmentInterface::addProxyRef(const FramebufferAttachment *proxy)
 {
 }
 
-void RenderbufferInterface::releaseProxy(const Renderbuffer *proxy)
+void FramebufferAttachmentInterface::releaseProxy(const FramebufferAttachment *proxy)
 {
 }
 
-///// RenderbufferTexture2D Implementation ////////
+///// Texture2DAttachment Implementation ////////
 
-RenderbufferTexture2D::RenderbufferTexture2D(Texture2D *texture, GLint level) : mLevel(level)
+Texture2DAttachment::Texture2DAttachment(Texture2D *texture, GLint level) : mLevel(level)
 {
     mTexture2D.set(texture);
 }
 
-RenderbufferTexture2D::~RenderbufferTexture2D()
+Texture2DAttachment::~Texture2DAttachment()
 {
     mTexture2D.set(NULL);
 }
 
 // Textures need to maintain their own reference count for references via
 // Renderbuffers acting as proxies. Here, we notify the texture of a reference.
-void RenderbufferTexture2D::addProxyRef(const Renderbuffer *proxy)
+void Texture2DAttachment::addProxyRef(const FramebufferAttachment *proxy)
 {
     mTexture2D->addProxyRef(proxy);
 }
 
-void RenderbufferTexture2D::releaseProxy(const Renderbuffer *proxy)
+void Texture2DAttachment::releaseProxy(const FramebufferAttachment *proxy)
 {
     mTexture2D->releaseProxy(proxy);
 }
 
-rx::RenderTarget *RenderbufferTexture2D::getRenderTarget()
+rx::RenderTarget *Texture2DAttachment::getRenderTarget()
 {
     return mTexture2D->getRenderTarget(mLevel);
 }
 
-rx::RenderTarget *RenderbufferTexture2D::getDepthStencil()
+rx::RenderTarget *Texture2DAttachment::getDepthStencil()
 {
     return mTexture2D->getDepthSencil(mLevel);
 }
 
-rx::TextureStorage *RenderbufferTexture2D::getTextureStorage()
+rx::TextureStorage *Texture2DAttachment::getTextureStorage()
 {
     return mTexture2D->getNativeTexture()->getStorageInstance();
 }
 
-GLsizei RenderbufferTexture2D::getWidth() const
+GLsizei Texture2DAttachment::getWidth() const
 {
     return mTexture2D->getWidth(mLevel);
 }
 
-GLsizei RenderbufferTexture2D::getHeight() const
+GLsizei Texture2DAttachment::getHeight() const
 {
     return mTexture2D->getHeight(mLevel);
 }
 
-GLenum RenderbufferTexture2D::getInternalFormat() const
+GLenum Texture2DAttachment::getInternalFormat() const
 {
     return mTexture2D->getInternalFormat(mLevel);
 }
 
-GLenum RenderbufferTexture2D::getActualFormat() const
+GLenum Texture2DAttachment::getActualFormat() const
 {
     return mTexture2D->getActualFormat(mLevel);
 }
 
-GLsizei RenderbufferTexture2D::getSamples() const
+GLsizei Texture2DAttachment::getSamples() const
 {
     return 0;
 }
 
-unsigned int RenderbufferTexture2D::getSerial() const
+unsigned int Texture2DAttachment::getSerial() const
 {
     return mTexture2D->getRenderTargetSerial(mLevel);
 }
 
-bool RenderbufferTexture2D::isTexture() const
+bool Texture2DAttachment::isTexture() const
 {
     return true;
 }
 
-unsigned int RenderbufferTexture2D::getTextureSerial() const
+unsigned int Texture2DAttachment::getTextureSerial() const
 {
     return mTexture2D->getTextureSerial();
 }
 
-///// RenderbufferTextureCubeMap Implementation ////////
+///// TextureCubeMapAttachment Implementation ////////
 
-RenderbufferTextureCubeMap::RenderbufferTextureCubeMap(TextureCubeMap *texture, GLenum faceTarget, GLint level)
+TextureCubeMapAttachment::TextureCubeMapAttachment(TextureCubeMap *texture, GLenum faceTarget, GLint level)
     : mFaceTarget(faceTarget), mLevel(level)
 {
     mTextureCubeMap.set(texture);
 }
 
-RenderbufferTextureCubeMap::~RenderbufferTextureCubeMap()
+TextureCubeMapAttachment::~TextureCubeMapAttachment()
 {
     mTextureCubeMap.set(NULL);
 }
 
 // Textures need to maintain their own reference count for references via
 // Renderbuffers acting as proxies. Here, we notify the texture of a reference.
-void RenderbufferTextureCubeMap::addProxyRef(const Renderbuffer *proxy)
+void TextureCubeMapAttachment::addProxyRef(const FramebufferAttachment *proxy)
 {
     mTextureCubeMap->addProxyRef(proxy);
 }
 
-void RenderbufferTextureCubeMap::releaseProxy(const Renderbuffer *proxy)
+void TextureCubeMapAttachment::releaseProxy(const FramebufferAttachment *proxy)
 {
     mTextureCubeMap->releaseProxy(proxy);
 }
 
-rx::RenderTarget *RenderbufferTextureCubeMap::getRenderTarget()
+rx::RenderTarget *TextureCubeMapAttachment::getRenderTarget()
 {
     return mTextureCubeMap->getRenderTarget(mFaceTarget, mLevel);
 }
 
-rx::RenderTarget *RenderbufferTextureCubeMap::getDepthStencil()
+rx::RenderTarget *TextureCubeMapAttachment::getDepthStencil()
 {
     return mTextureCubeMap->getDepthStencil(mFaceTarget, mLevel);
 }
 
-rx::TextureStorage *RenderbufferTextureCubeMap::getTextureStorage()
+rx::TextureStorage *TextureCubeMapAttachment::getTextureStorage()
 {
     return mTextureCubeMap->getNativeTexture()->getStorageInstance();
 }
 
-GLsizei RenderbufferTextureCubeMap::getWidth() const
+GLsizei TextureCubeMapAttachment::getWidth() const
 {
     return mTextureCubeMap->getWidth(mFaceTarget, mLevel);
 }
 
-GLsizei RenderbufferTextureCubeMap::getHeight() const
+GLsizei TextureCubeMapAttachment::getHeight() const
 {
     return mTextureCubeMap->getHeight(mFaceTarget, mLevel);
 }
 
-GLenum RenderbufferTextureCubeMap::getInternalFormat() const
+GLenum TextureCubeMapAttachment::getInternalFormat() const
 {
     return mTextureCubeMap->getInternalFormat(mFaceTarget, mLevel);
 }
 
-GLenum RenderbufferTextureCubeMap::getActualFormat() const
+GLenum TextureCubeMapAttachment::getActualFormat() const
 {
     return mTextureCubeMap->getActualFormat(mFaceTarget, mLevel);
 }
 
-GLsizei RenderbufferTextureCubeMap::getSamples() const
+GLsizei TextureCubeMapAttachment::getSamples() const
 {
     return 0;
 }
 
-unsigned int RenderbufferTextureCubeMap::getSerial() const
+unsigned int TextureCubeMapAttachment::getSerial() const
 {
     return mTextureCubeMap->getRenderTargetSerial(mFaceTarget, mLevel);
 }
 
-bool RenderbufferTextureCubeMap::isTexture() const
+bool TextureCubeMapAttachment::isTexture() const
 {
     return true;
 }
 
-unsigned int RenderbufferTextureCubeMap::getTextureSerial() const
+unsigned int TextureCubeMapAttachment::getTextureSerial() const
 {
     return mTextureCubeMap->getTextureSerial();
 }
 
-///// RenderbufferTexture3DLayer Implementation ////////
+///// Texture3DAttachment Implementation ////////
 
-RenderbufferTexture3DLayer::RenderbufferTexture3DLayer(Texture3D *texture, GLint level, GLint layer)
+Texture3DAttachment::Texture3DAttachment(Texture3D *texture, GLint level, GLint layer)
     : mLevel(level), mLayer(layer)
 {
     mTexture3D.set(texture);
 }
 
-RenderbufferTexture3DLayer::~RenderbufferTexture3DLayer()
+Texture3DAttachment::~Texture3DAttachment()
 {
     mTexture3D.set(NULL);
 }
 
 // Textures need to maintain their own reference count for references via
 // Renderbuffers acting as proxies. Here, we notify the texture of a reference.
-void RenderbufferTexture3DLayer::addProxyRef(const Renderbuffer *proxy)
+void Texture3DAttachment::addProxyRef(const FramebufferAttachment *proxy)
 {
     mTexture3D->addProxyRef(proxy);
 }
 
-void RenderbufferTexture3DLayer::releaseProxy(const Renderbuffer *proxy)
+void Texture3DAttachment::releaseProxy(const FramebufferAttachment *proxy)
 {
     mTexture3D->releaseProxy(proxy);
 }
 
-rx::RenderTarget *RenderbufferTexture3DLayer::getRenderTarget()
+rx::RenderTarget *Texture3DAttachment::getRenderTarget()
 {
     return mTexture3D->getRenderTarget(mLevel, mLayer);
 }
 
-rx::RenderTarget *RenderbufferTexture3DLayer::getDepthStencil()
+rx::RenderTarget *Texture3DAttachment::getDepthStencil()
 {
     return mTexture3D->getDepthStencil(mLevel, mLayer);
 }
 
-rx::TextureStorage *RenderbufferTexture3DLayer::getTextureStorage()
+rx::TextureStorage *Texture3DAttachment::getTextureStorage()
 {
     return mTexture3D->getNativeTexture()->getStorageInstance();
 }
 
-GLsizei RenderbufferTexture3DLayer::getWidth() const
+GLsizei Texture3DAttachment::getWidth() const
 {
     return mTexture3D->getWidth(mLevel);
 }
 
-GLsizei RenderbufferTexture3DLayer::getHeight() const
+GLsizei Texture3DAttachment::getHeight() const
 {
     return mTexture3D->getHeight(mLevel);
 }
 
-GLenum RenderbufferTexture3DLayer::getInternalFormat() const
+GLenum Texture3DAttachment::getInternalFormat() const
 {
     return mTexture3D->getInternalFormat(mLevel);
 }
 
-GLenum RenderbufferTexture3DLayer::getActualFormat() const
+GLenum Texture3DAttachment::getActualFormat() const
 {
     return mTexture3D->getActualFormat(mLevel);
 }
 
-GLsizei RenderbufferTexture3DLayer::getSamples() const
+GLsizei Texture3DAttachment::getSamples() const
 {
     return 0;
 }
 
-unsigned int RenderbufferTexture3DLayer::getSerial() const
+unsigned int Texture3DAttachment::getSerial() const
 {
     return mTexture3D->getRenderTargetSerial(mLevel, mLayer);
 }
 
-bool RenderbufferTexture3DLayer::isTexture() const
+bool Texture3DAttachment::isTexture() const
 {
     return true;
 }
 
-unsigned int RenderbufferTexture3DLayer::getTextureSerial() const
+unsigned int Texture3DAttachment::getTextureSerial() const
 {
     return mTexture3D->getTextureSerial();
 }
 
-////// RenderbufferTexture2DArrayLayer Implementation //////
+////// Texture2DArrayAttachment Implementation //////
 
-RenderbufferTexture2DArrayLayer::RenderbufferTexture2DArrayLayer(Texture2DArray *texture, GLint level, GLint layer)
+Texture2DArrayAttachment::Texture2DArrayAttachment(Texture2DArray *texture, GLint level, GLint layer)
     : mLevel(level), mLayer(layer)
 {
     mTexture2DArray.set(texture);
 }
 
-RenderbufferTexture2DArrayLayer::~RenderbufferTexture2DArrayLayer()
+Texture2DArrayAttachment::~Texture2DArrayAttachment()
 {
     mTexture2DArray.set(NULL);
 }
 
-void RenderbufferTexture2DArrayLayer::addProxyRef(const Renderbuffer *proxy)
+void Texture2DArrayAttachment::addProxyRef(const FramebufferAttachment *proxy)
 {
     mTexture2DArray->addProxyRef(proxy);
 }
 
-void RenderbufferTexture2DArrayLayer::releaseProxy(const Renderbuffer *proxy)
+void Texture2DArrayAttachment::releaseProxy(const FramebufferAttachment *proxy)
 {
     mTexture2DArray->releaseProxy(proxy);
 }
 
-rx::RenderTarget *RenderbufferTexture2DArrayLayer::getRenderTarget()
+rx::RenderTarget *Texture2DArrayAttachment::getRenderTarget()
 {
     return mTexture2DArray->getRenderTarget(mLevel, mLayer);
 }
 
-rx::RenderTarget *RenderbufferTexture2DArrayLayer::getDepthStencil()
+rx::RenderTarget *Texture2DArrayAttachment::getDepthStencil()
 {
     return mTexture2DArray->getDepthStencil(mLevel, mLayer);
 }
 
-rx::TextureStorage *RenderbufferTexture2DArrayLayer::getTextureStorage()
+rx::TextureStorage *Texture2DArrayAttachment::getTextureStorage()
 {
     return mTexture2DArray->getNativeTexture()->getStorageInstance();
 }
 
-GLsizei RenderbufferTexture2DArrayLayer::getWidth() const
+GLsizei Texture2DArrayAttachment::getWidth() const
 {
     return mTexture2DArray->getWidth(mLevel);
 }
 
-GLsizei RenderbufferTexture2DArrayLayer::getHeight() const
+GLsizei Texture2DArrayAttachment::getHeight() const
 {
     return mTexture2DArray->getHeight(mLevel);
 }
 
-GLenum RenderbufferTexture2DArrayLayer::getInternalFormat() const
+GLenum Texture2DArrayAttachment::getInternalFormat() const
 {
     return mTexture2DArray->getInternalFormat(mLevel);
 }
 
-GLenum RenderbufferTexture2DArrayLayer::getActualFormat() const
+GLenum Texture2DArrayAttachment::getActualFormat() const
 {
     return mTexture2DArray->getActualFormat(mLevel);
 }
 
-GLsizei RenderbufferTexture2DArrayLayer::getSamples() const
+GLsizei Texture2DArrayAttachment::getSamples() const
 {
     return 0;
 }
 
-unsigned int RenderbufferTexture2DArrayLayer::getSerial() const
+unsigned int Texture2DArrayAttachment::getSerial() const
 {
     return mTexture2DArray->getRenderTargetSerial(mLevel, mLayer);
 }
 
-bool RenderbufferTexture2DArrayLayer::isTexture() const
+bool Texture2DArrayAttachment::isTexture() const
 {
     return true;
 }
 
-unsigned int RenderbufferTexture2DArrayLayer::getTextureSerial() const
+unsigned int Texture2DArrayAttachment::getTextureSerial() const
 {
     return mTexture2DArray->getTextureSerial();
 }
 
-////// Renderbuffer Implementation //////
+////// FramebufferAttachment Implementation //////
 
-Renderbuffer::Renderbuffer(rx::Renderer *renderer, GLuint id, RenderbufferInterface *instance) : RefCountObject(id)
+FramebufferAttachment::FramebufferAttachment(rx::Renderer *renderer, GLuint id, FramebufferAttachmentInterface *instance) : RefCountObject(id)
 {
     ASSERT(instance != NULL);
     mInstance = instance;
@@ -365,123 +365,123 @@
     mRenderer = renderer;
 }
 
-Renderbuffer::~Renderbuffer()
+FramebufferAttachment::~FramebufferAttachment()
 {
     delete mInstance;
 }
 
-// The RenderbufferInterface contained in this Renderbuffer may need to maintain
+// The FramebufferAttachmentInterface contained in this FramebufferAttachment may need to maintain
 // its own reference count, so we pass it on here.
-void Renderbuffer::addRef() const
+void FramebufferAttachment::addRef() const
 {
     mInstance->addProxyRef(this);
 
     RefCountObject::addRef();
 }
 
-void Renderbuffer::release() const
+void FramebufferAttachment::release() const
 {
     mInstance->releaseProxy(this);
 
     RefCountObject::release();
 }
 
-rx::RenderTarget *Renderbuffer::getRenderTarget()
+rx::RenderTarget *FramebufferAttachment::getRenderTarget()
 {
     return mInstance->getRenderTarget();
 }
 
-rx::RenderTarget *Renderbuffer::getDepthStencil()
+rx::RenderTarget *FramebufferAttachment::getDepthStencil()
 {
     return mInstance->getDepthStencil();
 }
 
-rx::TextureStorage *Renderbuffer::getTextureStorage()
+rx::TextureStorage *FramebufferAttachment::getTextureStorage()
 {
     return mInstance->getTextureStorage();
 }
 
-GLsizei Renderbuffer::getWidth() const
+GLsizei FramebufferAttachment::getWidth() const
 {
     return mInstance->getWidth();
 }
 
-GLsizei Renderbuffer::getHeight() const
+GLsizei FramebufferAttachment::getHeight() const
 {
     return mInstance->getHeight();
 }
 
-GLenum Renderbuffer::getInternalFormat() const
+GLenum FramebufferAttachment::getInternalFormat() const
 {
     return mInstance->getInternalFormat();
 }
 
-GLenum Renderbuffer::getActualFormat() const
+GLenum FramebufferAttachment::getActualFormat() const
 {
     return mInstance->getActualFormat();
 }
 
-GLuint Renderbuffer::getRedSize() const
+GLuint FramebufferAttachment::getRedSize() const
 {
     return gl::GetRedBits(getActualFormat(), mRenderer->getCurrentClientVersion());
 }
 
-GLuint Renderbuffer::getGreenSize() const
+GLuint FramebufferAttachment::getGreenSize() const
 {
     return gl::GetGreenBits(getActualFormat(), mRenderer->getCurrentClientVersion());
 }
 
-GLuint Renderbuffer::getBlueSize() const
+GLuint FramebufferAttachment::getBlueSize() const
 {
     return gl::GetBlueBits(getActualFormat(), mRenderer->getCurrentClientVersion());
 }
 
-GLuint Renderbuffer::getAlphaSize() const
+GLuint FramebufferAttachment::getAlphaSize() const
 {
     return gl::GetAlphaBits(getActualFormat(), mRenderer->getCurrentClientVersion());
 }
 
-GLuint Renderbuffer::getDepthSize() const
+GLuint FramebufferAttachment::getDepthSize() const
 {
     return gl::GetDepthBits(getActualFormat(), mRenderer->getCurrentClientVersion());
 }
 
-GLuint Renderbuffer::getStencilSize() const
+GLuint FramebufferAttachment::getStencilSize() const
 {
     return gl::GetStencilBits(getActualFormat(), mRenderer->getCurrentClientVersion());
 }
 
-GLenum Renderbuffer::getComponentType() const
+GLenum FramebufferAttachment::getComponentType() const
 {
     return gl::GetComponentType(getActualFormat(), mRenderer->getCurrentClientVersion());
 }
 
-GLenum Renderbuffer::getColorEncoding() const
+GLenum FramebufferAttachment::getColorEncoding() const
 {
     return gl::GetColorEncoding(getActualFormat(), mRenderer->getCurrentClientVersion());
 }
 
-GLsizei Renderbuffer::getSamples() const
+GLsizei FramebufferAttachment::getSamples() const
 {
     return mInstance->getSamples();
 }
 
-unsigned int Renderbuffer::getSerial() const
+unsigned int FramebufferAttachment::getSerial() const
 {
     return mInstance->getSerial();
 }
 
-bool Renderbuffer::isTexture() const
+bool FramebufferAttachment::isTexture() const
 {
     return mInstance->isTexture();
 }
 
-unsigned int Renderbuffer::getTextureSerial() const
+unsigned int FramebufferAttachment::getTextureSerial() const
 {
     return mInstance->getTextureSerial();
 }
 
-void Renderbuffer::setStorage(RenderbufferStorage *newStorage)
+void FramebufferAttachment::setStorage(RenderbufferStorage *newStorage)
 {
     ASSERT(newStorage != NULL);
 
diff --git a/src/libGLESv2/Renderbuffer.h b/src/libGLESv2/Renderbuffer.h
index 969232b..820175d 100644
--- a/src/libGLESv2/Renderbuffer.h
+++ b/src/libGLESv2/Renderbuffer.h
@@ -32,19 +32,19 @@
 class TextureCubeMap;
 class Texture3D;
 class Texture2DArray;
-class Renderbuffer;
+class FramebufferAttachment;
 class Colorbuffer;
 class DepthStencilbuffer;
 
-class RenderbufferInterface
+class FramebufferAttachmentInterface
 {
   public:
-    RenderbufferInterface();
+    FramebufferAttachmentInterface();
 
-    virtual ~RenderbufferInterface() {};
+    virtual ~FramebufferAttachmentInterface() {};
 
-    virtual void addProxyRef(const Renderbuffer *proxy);
-    virtual void releaseProxy(const Renderbuffer *proxy);
+    virtual void addProxyRef(const FramebufferAttachment *proxy);
+    virtual void releaseProxy(const FramebufferAttachment *proxy);
 
     virtual rx::RenderTarget *getRenderTarget() = 0;
     virtual rx::RenderTarget *getDepthStencil() = 0;
@@ -62,18 +62,18 @@
     virtual unsigned int getTextureSerial() const = 0;
 
   private:
-    DISALLOW_COPY_AND_ASSIGN(RenderbufferInterface);
+    DISALLOW_COPY_AND_ASSIGN(FramebufferAttachmentInterface);
 };
 
-class RenderbufferTexture2D : public RenderbufferInterface
+class Texture2DAttachment : public FramebufferAttachmentInterface
 {
   public:
-    RenderbufferTexture2D(Texture2D *texture, GLint level);
+    Texture2DAttachment(Texture2D *texture, GLint level);
 
-    virtual ~RenderbufferTexture2D();
+    virtual ~Texture2DAttachment();
 
-    void addProxyRef(const Renderbuffer *proxy);
-    void releaseProxy(const Renderbuffer *proxy);
+    void addProxyRef(const FramebufferAttachment *proxy);
+    void releaseProxy(const FramebufferAttachment *proxy);
 
     rx::RenderTarget *getRenderTarget();
     rx::RenderTarget *getDepthStencil();
@@ -91,21 +91,21 @@
     virtual unsigned int getTextureSerial() const;
 
   private:
-    DISALLOW_COPY_AND_ASSIGN(RenderbufferTexture2D);
+    DISALLOW_COPY_AND_ASSIGN(Texture2DAttachment);
 
     BindingPointer <Texture2D> mTexture2D;
     const GLint mLevel;
 };
 
-class RenderbufferTextureCubeMap : public RenderbufferInterface
+class TextureCubeMapAttachment : public FramebufferAttachmentInterface
 {
   public:
-    RenderbufferTextureCubeMap(TextureCubeMap *texture, GLenum faceTarget, GLint level);
+    TextureCubeMapAttachment(TextureCubeMap *texture, GLenum faceTarget, GLint level);
 
-    virtual ~RenderbufferTextureCubeMap();
+    virtual ~TextureCubeMapAttachment();
 
-    void addProxyRef(const Renderbuffer *proxy);
-    void releaseProxy(const Renderbuffer *proxy);
+    void addProxyRef(const FramebufferAttachment *proxy);
+    void releaseProxy(const FramebufferAttachment *proxy);
 
     rx::RenderTarget *getRenderTarget();
     rx::RenderTarget *getDepthStencil();
@@ -123,22 +123,22 @@
     virtual unsigned int getTextureSerial() const;
 
   private:
-    DISALLOW_COPY_AND_ASSIGN(RenderbufferTextureCubeMap);
+    DISALLOW_COPY_AND_ASSIGN(TextureCubeMapAttachment);
 
     BindingPointer <TextureCubeMap> mTextureCubeMap;
     const GLint mLevel;
     const GLenum mFaceTarget;
 };
 
-class RenderbufferTexture3DLayer : public RenderbufferInterface
+class Texture3DAttachment : public FramebufferAttachmentInterface
 {
 public:
-    RenderbufferTexture3DLayer(Texture3D *texture, GLint level, GLint layer);
+    Texture3DAttachment(Texture3D *texture, GLint level, GLint layer);
 
-    virtual ~RenderbufferTexture3DLayer();
+    virtual ~Texture3DAttachment();
 
-    void addProxyRef(const Renderbuffer *proxy);
-    void releaseProxy(const Renderbuffer *proxy);
+    void addProxyRef(const FramebufferAttachment *proxy);
+    void releaseProxy(const FramebufferAttachment *proxy);
 
     rx::RenderTarget *getRenderTarget();
     rx::RenderTarget *getDepthStencil();
@@ -156,22 +156,22 @@
     virtual unsigned int getTextureSerial() const;
 
 private:
-    DISALLOW_COPY_AND_ASSIGN(RenderbufferTexture3DLayer);
+    DISALLOW_COPY_AND_ASSIGN(Texture3DAttachment);
 
     BindingPointer<Texture3D> mTexture3D;
     const GLint mLevel;
     const GLint mLayer;
 };
 
-class RenderbufferTexture2DArrayLayer : public RenderbufferInterface
+class Texture2DArrayAttachment : public FramebufferAttachmentInterface
 {
 public:
-    RenderbufferTexture2DArrayLayer(Texture2DArray *texture, GLint level, GLint layer);
+    Texture2DArrayAttachment(Texture2DArray *texture, GLint level, GLint layer);
 
-    virtual ~RenderbufferTexture2DArrayLayer();
+    virtual ~Texture2DArrayAttachment();
 
-    void addProxyRef(const Renderbuffer *proxy);
-    void releaseProxy(const Renderbuffer *proxy);
+    void addProxyRef(const FramebufferAttachment *proxy);
+    void releaseProxy(const FramebufferAttachment *proxy);
 
     rx::RenderTarget *getRenderTarget();
     rx::RenderTarget *getDepthStencil();
@@ -189,7 +189,7 @@
     virtual unsigned int getTextureSerial() const;
 
 private:
-    DISALLOW_COPY_AND_ASSIGN(RenderbufferTexture2DArrayLayer);
+    DISALLOW_COPY_AND_ASSIGN(Texture2DArrayAttachment);
 
     BindingPointer<Texture2DArray> mTexture2DArray;
     const GLint mLevel;
@@ -199,7 +199,7 @@
 // A class derived from RenderbufferStorage is created whenever glRenderbufferStorage
 // is called. The specific concrete type depends on whether the internal format is
 // colour depth, stencil or packed depth/stencil.
-class RenderbufferStorage : public RenderbufferInterface
+class RenderbufferStorage : public FramebufferAttachmentInterface
 {
   public:
     RenderbufferStorage();
@@ -238,20 +238,20 @@
     static unsigned int mCurrentSerial;
 };
 
-// Renderbuffer implements the GL renderbuffer object.
-// It's only a proxy for a RenderbufferInterface instance; the internal object
+// FramebufferAttachment implements the GL renderbuffer object.
+// It's only a proxy for a FramebufferAttachmentInterface instance; the internal object
 // can change whenever glRenderbufferStorage is called.
-class Renderbuffer : public RefCountObject
+class FramebufferAttachment : public RefCountObject
 {
   public:
-    Renderbuffer(rx::Renderer *renderer, GLuint id, RenderbufferInterface *storage);
+    FramebufferAttachment(rx::Renderer *renderer, GLuint id, FramebufferAttachmentInterface *storage);
 
-    virtual ~Renderbuffer();
+    virtual ~FramebufferAttachment();
 
     // These functions from RefCountObject are overloaded here because
     // Textures need to maintain their own count of references to them via
     // Renderbuffers/RenderbufferTextures. These functions invoke those
-    // reference counting functions on the RenderbufferInterface.
+    // reference counting functions on the FramebufferAttachmentInterface.
     void addRef() const;
     void release() const;
 
@@ -281,10 +281,10 @@
     void setStorage(RenderbufferStorage *newStorage);
 
   private:
-    DISALLOW_COPY_AND_ASSIGN(Renderbuffer);
+    DISALLOW_COPY_AND_ASSIGN(FramebufferAttachment);
 
     rx::Renderer const *mRenderer;
-    RenderbufferInterface *mInstance;
+    FramebufferAttachmentInterface *mInstance;
 };
 
 class Colorbuffer : public RenderbufferStorage
diff --git a/src/libGLESv2/RenderbufferProxySet.cpp b/src/libGLESv2/RenderbufferProxySet.cpp
index 009c7a6..f4fbe51 100644
--- a/src/libGLESv2/RenderbufferProxySet.cpp
+++ b/src/libGLESv2/RenderbufferProxySet.cpp
@@ -14,7 +14,7 @@
 namespace gl
 {
 
-void RenderbufferProxySet::addRef(const Renderbuffer *proxy)
+void RenderbufferProxySet::addRef(const FramebufferAttachment *proxy)
 {
     RefCountMap::iterator i = mRefCountMap.find(proxy);
     if (i != mRefCountMap.end())
@@ -23,7 +23,7 @@
     }
 }
 
-void RenderbufferProxySet::release(const Renderbuffer *proxy)
+void RenderbufferProxySet::release(const FramebufferAttachment *proxy)
 {
     RefCountMap::iterator i = mRefCountMap.find(proxy);
     if (i != mRefCountMap.end())
@@ -35,7 +35,7 @@
 
         if (i->second == 0)
         {
-            // Clear the buffer map of references to this Renderbuffer
+            // Clear the buffer map of references to this FramebufferAttachment
             BufferMap::iterator j = mBufferMap.begin();
             while (j != mBufferMap.end())
             {
@@ -54,7 +54,7 @@
     }
 }
 
-void RenderbufferProxySet::add(unsigned int mipLevel, unsigned int layer, Renderbuffer *renderBuffer)
+void RenderbufferProxySet::add(unsigned int mipLevel, unsigned int layer, FramebufferAttachment *renderBuffer)
 {
     if (mRefCountMap.find(renderBuffer) == mRefCountMap.end())
     {
@@ -70,7 +70,7 @@
     }
 }
 
-Renderbuffer *RenderbufferProxySet::get(unsigned int mipLevel, unsigned int layer) const
+FramebufferAttachment *RenderbufferProxySet::get(unsigned int mipLevel, unsigned int layer) const
 {
     RenderbufferKey key;
     key.mipLevel = mipLevel;
diff --git a/src/libGLESv2/RenderbufferProxySet.h b/src/libGLESv2/RenderbufferProxySet.h
index ae5bf94..f151151 100644
--- a/src/libGLESv2/RenderbufferProxySet.h
+++ b/src/libGLESv2/RenderbufferProxySet.h
@@ -14,16 +14,16 @@
 
 namespace gl
 {
-class Renderbuffer;
+class FramebufferAttachment;
 
 class RenderbufferProxySet
 {
   public:
-    void addRef(const Renderbuffer *proxy);
-    void release(const Renderbuffer *proxy);
+    void addRef(const FramebufferAttachment *proxy);
+    void release(const FramebufferAttachment *proxy);
 
-    void add(unsigned int mipLevel, unsigned int layer, Renderbuffer *renderBuffer);
-    Renderbuffer *get(unsigned int mipLevel, unsigned int layer) const;
+    void add(unsigned int mipLevel, unsigned int layer, FramebufferAttachment *renderBuffer);
+    FramebufferAttachment *get(unsigned int mipLevel, unsigned int layer) const;
 
   private:
     struct RenderbufferKey
@@ -34,10 +34,10 @@
         bool operator<(const RenderbufferKey &other) const;
     };
 
-    typedef std::map<RenderbufferKey, Renderbuffer*> BufferMap;
+    typedef std::map<RenderbufferKey, FramebufferAttachment*> BufferMap;
     BufferMap mBufferMap;
 
-    typedef std::map<const Renderbuffer*, unsigned int> RefCountMap;
+    typedef std::map<const FramebufferAttachment*, unsigned int> RefCountMap;
     RefCountMap mRefCountMap;
 };
 
diff --git a/src/libGLESv2/ResourceManager.cpp b/src/libGLESv2/ResourceManager.cpp
index 97c28cb..cf0812d 100644
--- a/src/libGLESv2/ResourceManager.cpp
+++ b/src/libGLESv2/ResourceManager.cpp
@@ -311,7 +311,7 @@
     }
 }
 
-Renderbuffer *ResourceManager::getRenderbuffer(unsigned int handle)
+FramebufferAttachment *ResourceManager::getRenderbuffer(unsigned int handle)
 {
     RenderbufferMap::iterator renderbuffer = mRenderbufferMap.find(handle);
 
@@ -353,7 +353,7 @@
     }
 }
 
-void ResourceManager::setRenderbuffer(GLuint handle, Renderbuffer *buffer)
+void ResourceManager::setRenderbuffer(GLuint handle, FramebufferAttachment *buffer)
 {
     mRenderbufferMap[handle] = buffer;
 }
@@ -405,7 +405,7 @@
 {
     if (renderbuffer != 0 && !getRenderbuffer(renderbuffer))
     {
-        Renderbuffer *renderbufferObject = new Renderbuffer(mRenderer, renderbuffer, new Colorbuffer(mRenderer, 0, 0, GL_RGBA4, 0));
+        FramebufferAttachment *renderbufferObject = new FramebufferAttachment(mRenderer, renderbuffer, new Colorbuffer(mRenderer, 0, 0, GL_RGBA4, 0));
         mRenderbufferMap[renderbuffer] = renderbufferObject;
         renderbufferObject->addRef();
     }
diff --git a/src/libGLESv2/ResourceManager.h b/src/libGLESv2/ResourceManager.h
index 85e6b4b..a08a6aa 100644
--- a/src/libGLESv2/ResourceManager.h
+++ b/src/libGLESv2/ResourceManager.h
@@ -30,7 +30,7 @@
 class Shader;
 class Program;
 class Texture;
-class Renderbuffer;
+class FramebufferAttachment;
 class Sampler;
 class FenceSync;
 
@@ -63,11 +63,11 @@
     Shader *getShader(GLuint handle);
     Program *getProgram(GLuint handle);
     Texture *getTexture(GLuint handle);
-    Renderbuffer *getRenderbuffer(GLuint handle);
+    FramebufferAttachment *getRenderbuffer(GLuint handle);
     Sampler *getSampler(GLuint handle);
     FenceSync *getFenceSync(GLuint handle);
     
-    void setRenderbuffer(GLuint handle, Renderbuffer *renderbuffer);
+    void setRenderbuffer(GLuint handle, FramebufferAttachment *renderbuffer);
 
     void checkBufferAllocation(unsigned int buffer);
     void checkTextureAllocation(GLuint texture, TextureType type);
@@ -97,7 +97,7 @@
     TextureMap mTextureMap;
     HandleAllocator mTextureHandleAllocator;
 
-    typedef std::unordered_map<GLuint, Renderbuffer*> RenderbufferMap;
+    typedef std::unordered_map<GLuint, FramebufferAttachment*> RenderbufferMap;
     RenderbufferMap mRenderbufferMap;
     HandleAllocator mRenderbufferHandleAllocator;
 
diff --git a/src/libGLESv2/Texture.cpp b/src/libGLESv2/Texture.cpp
index 52348cb..baa5bc6 100644
--- a/src/libGLESv2/Texture.cpp
+++ b/src/libGLESv2/Texture.cpp
@@ -87,12 +87,12 @@
     return mTarget;
 }
 
-void Texture::addProxyRef(const Renderbuffer *proxy)
+void Texture::addProxyRef(const FramebufferAttachment *proxy)
 {
     mRenderbufferProxies.addRef(proxy);
 }
 
-void Texture::releaseProxy(const Renderbuffer *proxy)
+void Texture::releaseProxy(const FramebufferAttachment *proxy)
 {
     mRenderbufferProxies.release(proxy);
 }
@@ -1027,16 +1027,16 @@
     return mTexStorage;
 }
 
-Renderbuffer *Texture2D::getRenderbuffer(GLint level)
+FramebufferAttachment *Texture2D::getAttachment(GLint level)
 {
-    Renderbuffer *renderBuffer = mRenderbufferProxies.get(level, 0);
-    if (!renderBuffer)
+    FramebufferAttachment *attachment = mRenderbufferProxies.get(level, 0);
+    if (!attachment)
     {
-        renderBuffer = new Renderbuffer(mRenderer, id(), new RenderbufferTexture2D(this, level));
-        mRenderbufferProxies.add(level, 0, renderBuffer);
+        attachment = new FramebufferAttachment(mRenderer, id(), new Texture2DAttachment(this, level));
+        mRenderbufferProxies.add(level, 0, attachment);
     }
 
-    return renderBuffer;
+    return attachment;
 }
 
 unsigned int Texture2D::getRenderTargetSerial(GLint level)
@@ -1662,19 +1662,19 @@
     return mTexStorage;
 }
 
-Renderbuffer *TextureCubeMap::getRenderbuffer(GLenum target, GLint level)
+FramebufferAttachment *TextureCubeMap::getAttachment(GLenum target, GLint level)
 {
     ASSERT(!IsCubemapTextureTarget(target));
     int faceIndex = targetToIndex(target);
 
-    Renderbuffer *renderBuffer = mRenderbufferProxies.get(level, faceIndex);
-    if (!renderBuffer)
+    FramebufferAttachment *attachment = mRenderbufferProxies.get(level, faceIndex);
+    if (!attachment)
     {
-        renderBuffer = new Renderbuffer(mRenderer, id(), new RenderbufferTextureCubeMap(this, target, level));
-        mRenderbufferProxies.add(level, faceIndex, renderBuffer);
+        attachment = new FramebufferAttachment(mRenderer, id(), new TextureCubeMapAttachment(this, target, level));
+        mRenderbufferProxies.add(level, faceIndex, attachment);
     }
 
-    return renderBuffer;
+    return attachment;
 }
 
 unsigned int TextureCubeMap::getRenderTargetSerial(GLenum target, GLint level)
@@ -2042,16 +2042,16 @@
     return true;
 }
 
-Renderbuffer *Texture3D::getRenderbuffer(GLint level, GLint layer)
+FramebufferAttachment *Texture3D::getAttachment(GLint level, GLint layer)
 {
-    Renderbuffer *renderBuffer = mRenderbufferProxies.get(level, layer);
-    if (!renderBuffer)
+    FramebufferAttachment *attachment = mRenderbufferProxies.get(level, layer);
+    if (!attachment)
     {
-        renderBuffer = new Renderbuffer(mRenderer, id(), new RenderbufferTexture3DLayer(this, level, layer));
-        mRenderbufferProxies.add(level, 0, renderBuffer);
+        attachment = new FramebufferAttachment(mRenderer, id(), new Texture3DAttachment(this, level, layer));
+        mRenderbufferProxies.add(level, 0, attachment);
     }
 
-    return renderBuffer;
+    return attachment;
 }
 
 unsigned int Texture3D::getRenderTargetSerial(GLint level, GLint layer)
@@ -2593,16 +2593,16 @@
     return true;
 }
 
-Renderbuffer *Texture2DArray::getRenderbuffer(GLint level, GLint layer)
+FramebufferAttachment *Texture2DArray::getAttachment(GLint level, GLint layer)
 {
-    Renderbuffer *renderBuffer = mRenderbufferProxies.get(level, layer);
-    if (!renderBuffer)
+    FramebufferAttachment *attachment = mRenderbufferProxies.get(level, layer);
+    if (!attachment)
     {
-        renderBuffer = new Renderbuffer(mRenderer, id(), new RenderbufferTexture2DArrayLayer(this, level, layer));
-        mRenderbufferProxies.add(level, 0, renderBuffer);
+        attachment = new FramebufferAttachment(mRenderer, id(), new Texture2DArrayAttachment(this, level, layer));
+        mRenderbufferProxies.add(level, 0, attachment);
     }
 
-    return renderBuffer;
+    return attachment;
 }
 
 unsigned int Texture2DArray::getRenderTargetSerial(GLint level, GLint layer)
diff --git a/src/libGLESv2/Texture.h b/src/libGLESv2/Texture.h
index a44a701..84ca289 100644
--- a/src/libGLESv2/Texture.h
+++ b/src/libGLESv2/Texture.h
@@ -41,7 +41,7 @@
 namespace gl
 {
 class Framebuffer;
-class Renderbuffer;
+class FramebufferAttachment;
 
 enum
 {
@@ -65,8 +65,8 @@
 
     virtual ~Texture();
 
-    void addProxyRef(const Renderbuffer *proxy);
-    void releaseProxy(const Renderbuffer *proxy);
+    void addProxyRef(const FramebufferAttachment *proxy);
+    void releaseProxy(const FramebufferAttachment *proxy);
 
     GLenum getTarget() const;
 
@@ -161,7 +161,7 @@
     // because, as the renderbuffer acting as proxy will maintain a binding pointer
     // back to this texture, there would be a circular reference if we used a binding
     // pointer here. This reference count will cause the pointer to be set to NULL if
-    // the count drops to zero, but will not cause deletion of the Renderbuffer.
+    // the count drops to zero, but will not cause deletion of the FramebufferAttachment.
     RenderbufferProxySet mRenderbufferProxies;
 
   private:
@@ -199,11 +199,11 @@
 
     virtual void generateMipmaps();
 
-    Renderbuffer *getRenderbuffer(GLint level);
+    FramebufferAttachment *getAttachment(GLint level);
     unsigned int getRenderTargetSerial(GLint level);
 
   protected:
-    friend class RenderbufferTexture2D;
+    friend class Texture2DAttachment;
     rx::RenderTarget *getRenderTarget(GLint level);
     rx::RenderTarget *getDepthSencil(GLint level);
 
@@ -267,13 +267,13 @@
 
     virtual void generateMipmaps();
 
-    Renderbuffer *getRenderbuffer(GLenum target, GLint level);
+    FramebufferAttachment *getAttachment(GLenum target, GLint level);
     unsigned int getRenderTargetSerial(GLenum target, GLint level);
 
     static int targetToIndex(GLenum target);
 
   protected:
-    friend class RenderbufferTextureCubeMap;
+    friend class TextureCubeMapAttachment;
     rx::RenderTarget *getRenderTarget(GLenum target, GLint level);
     rx::RenderTarget *getDepthStencil(GLenum target, GLint level);
 
@@ -330,11 +330,11 @@
     virtual bool isSamplerComplete(const SamplerState &samplerState) const;
     virtual bool isMipmapComplete() const;
 
-    Renderbuffer *getRenderbuffer(GLint level, GLint layer);
+    FramebufferAttachment *getAttachment(GLint level, GLint layer);
     unsigned int getRenderTargetSerial(GLint level, GLint layer);
 
   protected:
-    friend class RenderbufferTexture3DLayer;
+    friend class Texture3DAttachment;
     rx::RenderTarget *getRenderTarget(GLint level);
     rx::RenderTarget *getRenderTarget(GLint level, GLint layer);
     rx::RenderTarget *getDepthStencil(GLint level, GLint layer);
@@ -391,11 +391,11 @@
     virtual bool isSamplerComplete(const SamplerState &samplerState) const;
     virtual bool isMipmapComplete() const;
 
-    Renderbuffer *getRenderbuffer(GLint level, GLint layer);
+    FramebufferAttachment *getAttachment(GLint level, GLint layer);
     unsigned int getRenderTargetSerial(GLint level, GLint layer);
 
   protected:
-    friend class RenderbufferTexture2DArrayLayer;
+    friend class Texture2DArrayAttachment;
     rx::RenderTarget *getRenderTarget(GLint level, GLint layer);
     rx::RenderTarget *getDepthStencil(GLint level, GLint layer);
 
diff --git a/src/libGLESv2/libGLESv2.cpp b/src/libGLESv2/libGLESv2.cpp
index 0645250..bf3cd0f 100644
--- a/src/libGLESv2/libGLESv2.cpp
+++ b/src/libGLESv2/libGLESv2.cpp
@@ -2692,11 +2692,11 @@
             GLuint attachmentHandle;
             GLuint attachmentLevel;
             GLuint attachmentLayer;
-            gl::Renderbuffer *renderbuffer;
+            gl::FramebufferAttachment *attachmentObject;
 
-            if(framebufferHandle == 0)
+            if (framebufferHandle == 0)
             {
-                if(context->getClientVersion() < 3)
+                if (context->getClientVersion() < 3)
                 {
                     return gl::error(GL_INVALID_OPERATION);
                 }
@@ -2708,21 +2708,21 @@
                     attachmentHandle = framebuffer->getColorbufferHandle(0);
                     attachmentLevel = framebuffer->getColorbufferMipLevel(0);
                     attachmentLayer = framebuffer->getColorbufferLayer(0);
-                    renderbuffer = framebuffer->getColorbuffer(0);
+                    attachmentObject = framebuffer->getColorbuffer(0);
                     break;
                   case GL_DEPTH:
                     attachmentType = framebuffer->getDepthbufferType();
                     attachmentHandle = framebuffer->getDepthbufferHandle();
                     attachmentLevel = framebuffer->getDepthbufferMipLevel();
                     attachmentLayer = framebuffer->getDepthbufferLayer();
-                    renderbuffer = framebuffer->getDepthbuffer();
+                    attachmentObject = framebuffer->getDepthbuffer();
                     break;
                   case GL_STENCIL:
                     attachmentType = framebuffer->getStencilbufferType();
                     attachmentHandle = framebuffer->getStencilbufferHandle();
                     attachmentLevel = framebuffer->getStencilbufferMipLevel();
                     attachmentLayer = framebuffer->getStencilbufferLayer();
-                    renderbuffer = framebuffer->getStencilbuffer();
+                    attachmentObject = framebuffer->getStencilbuffer();
                     break;
                   default:
                     return gl::error(GL_INVALID_OPERATION);
@@ -2737,7 +2737,7 @@
                     attachmentHandle = framebuffer->getColorbufferHandle(colorAttachment);
                     attachmentLevel = framebuffer->getColorbufferMipLevel(colorAttachment);
                     attachmentLayer = framebuffer->getColorbufferLayer(colorAttachment);
-                    renderbuffer = framebuffer->getColorbuffer(colorAttachment);
+                    attachmentObject = framebuffer->getColorbuffer(colorAttachment);
                 }
                 else
                 {
@@ -2748,14 +2748,14 @@
                         attachmentHandle = framebuffer->getDepthbufferHandle();
                         attachmentLevel = framebuffer->getDepthbufferMipLevel();
                         attachmentLayer = framebuffer->getDepthbufferLayer();
-                        renderbuffer = framebuffer->getDepthbuffer();
+                        attachmentObject = framebuffer->getDepthbuffer();
                         break;
                       case GL_STENCIL_ATTACHMENT:
                         attachmentType = framebuffer->getStencilbufferType();
                         attachmentHandle = framebuffer->getStencilbufferHandle();
                         attachmentLevel = framebuffer->getStencilbufferMipLevel();
                         attachmentLayer = framebuffer->getStencilbufferLayer();
-                        renderbuffer = framebuffer->getStencilbuffer();
+                        attachmentObject = framebuffer->getStencilbuffer();
                         break;
                       case GL_DEPTH_STENCIL_ATTACHMENT:
                         if (framebuffer->getDepthbufferHandle() != framebuffer->getStencilbufferHandle())
@@ -2766,7 +2766,7 @@
                         attachmentHandle = framebuffer->getDepthStencilbufferHandle();
                         attachmentLevel = framebuffer->getDepthStencilbufferMipLevel();
                         attachmentLayer = framebuffer->getDepthStencilbufferLayer();
-                        renderbuffer = framebuffer->getDepthStencilBuffer();
+                        attachmentObject = framebuffer->getDepthStencilBuffer();
                         break;
                       default:
                         return gl::error(GL_INVALID_OPERATION);
@@ -2831,7 +2831,7 @@
             {
                 ASSERT(attachmentObjectType == GL_RENDERBUFFER || attachmentObjectType == GL_TEXTURE ||
                        attachmentObjectType == GL_FRAMEBUFFER_DEFAULT);
-                ASSERT(renderbuffer != NULL);
+                ASSERT(attachmentObject != NULL);
 
                 switch (pname)
                 {
@@ -2864,27 +2864,27 @@
                     break;
 
                   case GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE:
-                    *params = renderbuffer->getRedSize();
+                    *params = attachmentObject->getRedSize();
                     break;
 
                   case GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE:
-                    *params = renderbuffer->getGreenSize();
+                    *params = attachmentObject->getGreenSize();
                     break;
 
                   case GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE:
-                    *params = renderbuffer->getBlueSize();
+                    *params = attachmentObject->getBlueSize();
                     break;
 
                   case GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE:
-                    *params = renderbuffer->getAlphaSize();
+                    *params = attachmentObject->getAlphaSize();
                     break;
 
                   case GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE:
-                    *params = renderbuffer->getDepthSize();
+                    *params = attachmentObject->getDepthSize();
                     break;
 
                   case GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE:
-                    *params = renderbuffer->getStencilSize();
+                    *params = attachmentObject->getStencilSize();
                     break;
 
                   case GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE:
@@ -2892,11 +2892,11 @@
                     {
                         gl::error(GL_INVALID_OPERATION);
                     }
-                    *params = renderbuffer->getComponentType();
+                    *params = attachmentObject->getComponentType();
                     break;
 
                   case GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING:
-                    *params = renderbuffer->getColorEncoding();
+                    *params = attachmentObject->getColorEncoding();
                     break;
 
                   case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER:
@@ -3188,23 +3188,23 @@
                 return gl::error(GL_INVALID_OPERATION);
             }
 
-            gl::Renderbuffer *renderbuffer = context->getRenderbuffer(context->getRenderbufferHandle());
+            gl::FramebufferAttachment *attachment = context->getRenderbuffer(context->getRenderbufferHandle());
 
             switch (pname)
             {
-              case GL_RENDERBUFFER_WIDTH:           *params = renderbuffer->getWidth();          break;
-              case GL_RENDERBUFFER_HEIGHT:          *params = renderbuffer->getHeight();         break;
-              case GL_RENDERBUFFER_INTERNAL_FORMAT: *params = renderbuffer->getInternalFormat(); break;
-              case GL_RENDERBUFFER_RED_SIZE:        *params = renderbuffer->getRedSize();        break;
-              case GL_RENDERBUFFER_GREEN_SIZE:      *params = renderbuffer->getGreenSize();      break;
-              case GL_RENDERBUFFER_BLUE_SIZE:       *params = renderbuffer->getBlueSize();       break;
-              case GL_RENDERBUFFER_ALPHA_SIZE:      *params = renderbuffer->getAlphaSize();      break;
-              case GL_RENDERBUFFER_DEPTH_SIZE:      *params = renderbuffer->getDepthSize();      break;
-              case GL_RENDERBUFFER_STENCIL_SIZE:    *params = renderbuffer->getStencilSize();    break;
+              case GL_RENDERBUFFER_WIDTH:           *params = attachment->getWidth();          break;
+              case GL_RENDERBUFFER_HEIGHT:          *params = attachment->getHeight();         break;
+              case GL_RENDERBUFFER_INTERNAL_FORMAT: *params = attachment->getInternalFormat(); break;
+              case GL_RENDERBUFFER_RED_SIZE:        *params = attachment->getRedSize();        break;
+              case GL_RENDERBUFFER_GREEN_SIZE:      *params = attachment->getGreenSize();      break;
+              case GL_RENDERBUFFER_BLUE_SIZE:       *params = attachment->getBlueSize();       break;
+              case GL_RENDERBUFFER_ALPHA_SIZE:      *params = attachment->getAlphaSize();      break;
+              case GL_RENDERBUFFER_DEPTH_SIZE:      *params = attachment->getDepthSize();      break;
+              case GL_RENDERBUFFER_STENCIL_SIZE:    *params = attachment->getStencilSize();    break;
               case GL_RENDERBUFFER_SAMPLES_ANGLE:
                 if (context->getMaxSupportedSamples() != 0)
                 {
-                    *params = renderbuffer->getSamples();
+                    *params = attachment->getSamples();
                 }
                 else
                 {
@@ -4237,7 +4237,7 @@
 
         if (context && renderbuffer)
         {
-            gl::Renderbuffer *renderbufferObject = context->getRenderbuffer(renderbuffer);
+            gl::FramebufferAttachment *renderbufferObject = context->getRenderbuffer(renderbuffer);
 
             if (renderbufferObject)
             {
diff --git a/src/libGLESv2/renderer/d3d11/Clear11.cpp b/src/libGLESv2/renderer/d3d11/Clear11.cpp
index c02cd9e..bb73241 100644
--- a/src/libGLESv2/renderer/d3d11/Clear11.cpp
+++ b/src/libGLESv2/renderer/d3d11/Clear11.cpp
@@ -169,16 +169,16 @@
     gl::Extents framebufferSize;
     if (frameBuffer->getFirstColorbuffer() != NULL)
     {
-        gl::Renderbuffer *renderBuffer = frameBuffer->getFirstColorbuffer();
-        framebufferSize.width = renderBuffer->getWidth();
-        framebufferSize.height = renderBuffer->getHeight();
+        gl::FramebufferAttachment *attachment = frameBuffer->getFirstColorbuffer();
+        framebufferSize.width = attachment->getWidth();
+        framebufferSize.height = attachment->getHeight();
         framebufferSize.depth = 1;
     }
     else if (frameBuffer->getDepthOrStencilbuffer() != NULL)
     {
-        gl::Renderbuffer *renderBuffer = frameBuffer->getDepthOrStencilbuffer();
-        framebufferSize.width = renderBuffer->getWidth();
-        framebufferSize.height = renderBuffer->getHeight();
+        gl::FramebufferAttachment *attachment = frameBuffer->getDepthOrStencilbuffer();
+        framebufferSize.width = attachment->getWidth();
+        framebufferSize.height = attachment->getHeight();
         framebufferSize.depth = 1;
     }
     else
@@ -211,18 +211,18 @@
     {
         if (clearParams.clearColor[colorAttachment] && frameBuffer->isEnabledColorAttachment(colorAttachment))
         {
-            gl::Renderbuffer *renderbuffer = frameBuffer->getColorbuffer(colorAttachment);
-            if (renderbuffer)
+            gl::FramebufferAttachment *attachment = frameBuffer->getColorbuffer(colorAttachment);
+            if (attachment)
             {
-                RenderTarget11 *renderTarget = RenderTarget11::makeRenderTarget11(renderbuffer->getRenderTarget());
+                RenderTarget11 *renderTarget = RenderTarget11::makeRenderTarget11(attachment->getRenderTarget());
                 if (!renderTarget)
                 {
                     ERR("Render target pointer unexpectedly null.");
                     return;
                 }
 
-                GLenum internalFormat = renderbuffer->getInternalFormat();
-                GLenum actualFormat = renderbuffer->getActualFormat();
+                GLenum internalFormat = attachment->getInternalFormat();
+                GLenum actualFormat = attachment->getActualFormat();
                 GLenum componentType = gl::GetComponentType(internalFormat, clientVersion);
                 if (clearParams.colorClearType == GL_FLOAT &&
                     !(componentType == GL_FLOAT || componentType == GL_UNSIGNED_NORMALIZED || componentType == GL_SIGNED_NORMALIZED))
@@ -287,17 +287,17 @@
 
     if (clearParams.clearDepth || clearParams.clearStencil)
     {
-        gl::Renderbuffer *renderbuffer = frameBuffer->getDepthOrStencilbuffer();
-        if (renderbuffer)
+        gl::FramebufferAttachment *attachment = frameBuffer->getDepthOrStencilbuffer();
+        if (attachment)
         {
-            RenderTarget11 *renderTarget = RenderTarget11::makeRenderTarget11(renderbuffer->getDepthStencil());
+            RenderTarget11 *renderTarget = RenderTarget11::makeRenderTarget11(attachment->getDepthStencil());
             if (!renderTarget)
             {
                 ERR("Depth stencil render target pointer unexpectedly null.");
                 return;
             }
 
-            GLenum actualFormat = renderbuffer->getActualFormat();
+            GLenum actualFormat = attachment->getActualFormat();
 
             unsigned int stencilUnmasked = frameBuffer->hasStencil() ? (1 << gl::GetStencilBits(actualFormat, clientVersion)) - 1 : 0;
             bool needMaskedStencilClear = clearParams.clearStencil && (clearParams.stencilWriteMask & stencilUnmasked) != stencilUnmasked;
diff --git a/src/libGLESv2/renderer/d3d11/Image11.cpp b/src/libGLESv2/renderer/d3d11/Image11.cpp
index 85484f9..aa9260d 100644
--- a/src/libGLESv2/renderer/d3d11/Image11.cpp
+++ b/src/libGLESv2/renderer/d3d11/Image11.cpp
@@ -213,7 +213,7 @@
 
 void Image11::copy(GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height, gl::Framebuffer *source)
 {
-    gl::Renderbuffer *colorbuffer = source->getReadColorbuffer();
+    gl::FramebufferAttachment *colorbuffer = source->getReadColorbuffer();
 
     if (colorbuffer && colorbuffer->getActualFormat() == mActualFormat)
     {
diff --git a/src/libGLESv2/renderer/d3d11/RenderStateCache.cpp b/src/libGLESv2/renderer/d3d11/RenderStateCache.cpp
index d0bfd6c..b58569a 100644
--- a/src/libGLESv2/renderer/d3d11/RenderStateCache.cpp
+++ b/src/libGLESv2/renderer/d3d11/RenderStateCache.cpp
@@ -93,18 +93,18 @@
     key.blendState = blendState;
     for (unsigned int i = 0; i < D3D11_SIMULTANEOUS_RENDER_TARGET_COUNT; i++)
     {
-        gl::Renderbuffer *renderBuffer = framebuffer->getColorbuffer(i);
-        if (renderBuffer)
+        gl::FramebufferAttachment *attachment = framebuffer->getColorbuffer(i);
+        if (attachment)
         {
             if (i > 0)
             {
                 mrt = true;
             }
 
-            key.rtChannels[i][0] = renderBuffer->getRedSize()   > 0;
-            key.rtChannels[i][1] = renderBuffer->getGreenSize() > 0;
-            key.rtChannels[i][2] = renderBuffer->getBlueSize()  > 0;
-            key.rtChannels[i][3] = renderBuffer->getAlphaSize() > 0;
+            key.rtChannels[i][0] = attachment->getRedSize()   > 0;
+            key.rtChannels[i][1] = attachment->getGreenSize() > 0;
+            key.rtChannels[i][2] = attachment->getBlueSize()  > 0;
+            key.rtChannels[i][3] = attachment->getAlphaSize() > 0;
         }
         else
         {
diff --git a/src/libGLESv2/renderer/d3d11/Renderer11.cpp b/src/libGLESv2/renderer/d3d11/Renderer11.cpp
index 143799a..c0ad111 100644
--- a/src/libGLESv2/renderer/d3d11/Renderer11.cpp
+++ b/src/libGLESv2/renderer/d3d11/Renderer11.cpp
@@ -979,7 +979,7 @@
             // the draw buffer must be either "none", "back" for the default buffer or the same index as this color (in order)
             ASSERT(drawBufferState == GL_BACK || drawBufferState == (GL_COLOR_ATTACHMENT0_EXT + colorAttachment));
 
-            gl::Renderbuffer *colorbuffer = framebuffer->getColorbuffer(colorAttachment);
+            gl::FramebufferAttachment *colorbuffer = framebuffer->getColorbuffer(colorAttachment);
 
             if (!colorbuffer)
             {
@@ -1026,7 +1026,7 @@
     }
 
     // Get the depth stencil render buffer and serials
-    gl::Renderbuffer *depthStencil = NULL;
+    gl::FramebufferAttachment *depthStencil = NULL;
     unsigned int depthbufferSerial = 0;
     unsigned int stencilbufferSerial = 0;
     if (framebuffer->getDepthbufferType() != GL_NONE)
@@ -2634,7 +2634,7 @@
 bool Renderer11::copyImage(gl::Framebuffer *framebuffer, const gl::Rectangle &sourceRect, GLenum destFormat,
                            GLint xoffset, GLint yoffset, TextureStorageInterface2D *storage, GLint level)
 {
-    gl::Renderbuffer *colorbuffer = framebuffer->getReadColorbuffer();
+    gl::FramebufferAttachment *colorbuffer = framebuffer->getReadColorbuffer();
     if (!colorbuffer)
     {
         ERR("Failed to retrieve the color buffer from the frame buffer.");
@@ -2695,7 +2695,7 @@
 bool Renderer11::copyImage(gl::Framebuffer *framebuffer, const gl::Rectangle &sourceRect, GLenum destFormat,
                            GLint xoffset, GLint yoffset, TextureStorageInterfaceCube *storage, GLenum target, GLint level)
 {
-    gl::Renderbuffer *colorbuffer = framebuffer->getReadColorbuffer();
+    gl::FramebufferAttachment *colorbuffer = framebuffer->getReadColorbuffer();
     if (!colorbuffer)
     {
         ERR("Failed to retrieve the color buffer from the frame buffer.");
@@ -2756,7 +2756,7 @@
 bool Renderer11::copyImage(gl::Framebuffer *framebuffer, const gl::Rectangle &sourceRect, GLenum destFormat,
                            GLint xoffset, GLint yoffset, GLint zOffset, TextureStorageInterface3D *storage, GLint level)
 {
-    gl::Renderbuffer *colorbuffer = framebuffer->getReadColorbuffer();
+    gl::FramebufferAttachment *colorbuffer = framebuffer->getReadColorbuffer();
     if (!colorbuffer)
     {
         ERR("Failed to retrieve the color buffer from the frame buffer.");
@@ -2817,7 +2817,7 @@
 bool Renderer11::copyImage(gl::Framebuffer *framebuffer, const gl::Rectangle &sourceRect, GLenum destFormat,
                            GLint xoffset, GLint yoffset, GLint zOffset, TextureStorageInterface2DArray *storage, GLint level)
 {
-    gl::Renderbuffer *colorbuffer = framebuffer->getReadColorbuffer();
+    gl::FramebufferAttachment *colorbuffer = framebuffer->getReadColorbuffer();
     if (!colorbuffer)
     {
         ERR("Failed to retrieve the color buffer from the frame buffer.");
@@ -3169,7 +3169,7 @@
     return mPixelTransfer->copyBufferToTexture(unpack, offset, destRenderTarget, destinationFormat, sourcePixelsType, destArea);
 }
 
-bool Renderer11::getRenderTargetResource(gl::Renderbuffer *colorbuffer, unsigned int *subresourceIndex, ID3D11Texture2D **resource)
+bool Renderer11::getRenderTargetResource(gl::FramebufferAttachment *colorbuffer, unsigned int *subresourceIndex, ID3D11Texture2D **resource)
 {
     ASSERT(colorbuffer != NULL);
 
@@ -3210,7 +3210,7 @@
 {
     if (blitRenderTarget)
     {
-        gl::Renderbuffer *readBuffer = readTarget->getReadColorbuffer();
+        gl::FramebufferAttachment *readBuffer = readTarget->getReadColorbuffer();
 
         if (!readBuffer)
         {
@@ -3224,7 +3224,7 @@
         {
             if (drawTarget->isEnabledColorAttachment(colorAttachment))
             {
-                gl::Renderbuffer *drawBuffer = drawTarget->getColorbuffer(colorAttachment);
+                gl::FramebufferAttachment *drawBuffer = drawTarget->getColorbuffer(colorAttachment);
 
                 if (!drawBuffer)
                 {
@@ -3245,8 +3245,8 @@
 
     if (blitDepth || blitStencil)
     {
-        gl::Renderbuffer *readBuffer = readTarget->getDepthOrStencilbuffer();
-        gl::Renderbuffer *drawBuffer = drawTarget->getDepthOrStencilbuffer();
+        gl::FramebufferAttachment *readBuffer = readTarget->getDepthOrStencilbuffer();
+        gl::FramebufferAttachment *drawBuffer = drawTarget->getDepthOrStencilbuffer();
 
         if (!readBuffer)
         {
@@ -3281,7 +3281,7 @@
     ID3D11Texture2D *colorBufferTexture = NULL;
     unsigned int subresourceIndex = 0;
 
-    gl::Renderbuffer *colorbuffer = framebuffer->getReadColorbuffer();
+    gl::FramebufferAttachment *colorbuffer = framebuffer->getReadColorbuffer();
 
     if (colorbuffer && getRenderTargetResource(colorbuffer, &subresourceIndex, &colorBufferTexture))
     {
@@ -3749,9 +3749,10 @@
     }
 }
 
-void Renderer11::invalidateRenderbufferSwizzles(gl::Renderbuffer *renderBuffer, int mipLevel)
+void Renderer11::invalidateFBOAttachmentSwizzles(gl::FramebufferAttachment *attachment, int mipLevel)
 {
-    TextureStorage *texStorage = renderBuffer->getTextureStorage();
+    ASSERT(attachment->isTexture());
+    TextureStorage *texStorage = attachment->getTextureStorage();
     if (texStorage)
     {
         TextureStorage11 *texStorage11 = TextureStorage11::makeTextureStorage11(texStorage);
@@ -3769,23 +3770,23 @@
 {
     for (unsigned int colorAttachment = 0; colorAttachment < gl::IMPLEMENTATION_MAX_DRAW_BUFFERS; colorAttachment++)
     {
-        gl::Renderbuffer *colorbuffer = framebuffer->getColorbuffer(colorAttachment);
-        if (colorbuffer)
+        gl::FramebufferAttachment *attachment = framebuffer->getColorbuffer(colorAttachment);
+        if (attachment && attachment->isTexture())
         {
-            invalidateRenderbufferSwizzles(colorbuffer, framebuffer->getColorbufferMipLevel(colorAttachment));
+            invalidateFBOAttachmentSwizzles(attachment, framebuffer->getColorbufferMipLevel(colorAttachment));
         }
     }
 
-    gl::Renderbuffer *depthBuffer = framebuffer->getDepthbuffer();
-    if (depthBuffer)
+    gl::FramebufferAttachment *depthAttachment = framebuffer->getDepthbuffer();
+    if (depthAttachment && depthAttachment->isTexture())
     {
-        invalidateRenderbufferSwizzles(depthBuffer, framebuffer->getDepthbufferMipLevel());
+        invalidateFBOAttachmentSwizzles(depthAttachment, framebuffer->getDepthbufferMipLevel());
     }
 
-    gl::Renderbuffer *stencilBuffer = framebuffer->getStencilbuffer();
-    if (stencilBuffer)
+    gl::FramebufferAttachment *stencilAttachment = framebuffer->getStencilbuffer();
+    if (stencilAttachment && stencilAttachment->isTexture())
     {
-        invalidateRenderbufferSwizzles(stencilBuffer, framebuffer->getStencilbufferMipLevel());
+        invalidateFBOAttachmentSwizzles(stencilAttachment, framebuffer->getStencilbufferMipLevel());
     }
 }
 
diff --git a/src/libGLESv2/renderer/d3d11/Renderer11.h b/src/libGLESv2/renderer/d3d11/Renderer11.h
index 3e6a54a..bbd0de4 100644
--- a/src/libGLESv2/renderer/d3d11/Renderer11.h
+++ b/src/libGLESv2/renderer/d3d11/Renderer11.h
@@ -21,7 +21,7 @@
 
 namespace gl
 {
-class Renderbuffer;
+class FramebufferAttachment;
 }
 
 namespace rx
@@ -229,7 +229,7 @@
     virtual bool fastCopyBufferToTexture(const gl::PixelUnpackState &unpack, unsigned int offset, RenderTarget *destRenderTarget,
                                          GLenum destinationFormat, GLenum sourcePixelsType, const gl::Box &destArea);
 
-    bool getRenderTargetResource(gl::Renderbuffer *colorbuffer, unsigned int *subresourceIndex, ID3D11Texture2D **resource);
+    bool getRenderTargetResource(gl::FramebufferAttachment *colorbuffer, unsigned int *subresourceIndex, ID3D11Texture2D **resource);
     void unapplyRenderTargets();
     void setOneTimeRenderTarget(ID3D11RenderTargetView *renderTargetView);
     void packPixels(ID3D11Texture2D *readTexture, const PackPixelsParams &params, void *pixelsOut);
@@ -255,7 +255,7 @@
                               bool colorBlit, bool depthBlit, bool stencilBlit);
     ID3D11Texture2D *resolveMultisampledTexture(ID3D11Texture2D *source, unsigned int subresource);
 
-    static void invalidateRenderbufferSwizzles(gl::Renderbuffer *renderBuffer, int mipLevel);
+    static void invalidateFBOAttachmentSwizzles(gl::FramebufferAttachment *attachment, int mipLevel);
     static void invalidateFramebufferSwizzles(gl::Framebuffer *framebuffer);
 
     HMODULE mD3d11Module;
diff --git a/src/libGLESv2/renderer/d3d9/Blit9.cpp b/src/libGLESv2/renderer/d3d9/Blit9.cpp
index a8485bd..80a4375 100644
--- a/src/libGLESv2/renderer/d3d9/Blit9.cpp
+++ b/src/libGLESv2/renderer/d3d9/Blit9.cpp
@@ -213,7 +213,7 @@
 {
     RenderTarget9 *renderTarget = NULL;
     IDirect3DSurface9 *source = NULL;
-    gl::Renderbuffer *colorbuffer = framebuffer->getColorbuffer(0);
+    gl::FramebufferAttachment *colorbuffer = framebuffer->getColorbuffer(0);
 
     if (colorbuffer)
     {
@@ -249,7 +249,7 @@
 {
     RenderTarget9 *renderTarget = NULL;
     IDirect3DSurface9 *source = NULL;
-    gl::Renderbuffer *colorbuffer = framebuffer->getColorbuffer(0);
+    gl::FramebufferAttachment *colorbuffer = framebuffer->getColorbuffer(0);
 
     if (colorbuffer)
     {
diff --git a/src/libGLESv2/renderer/d3d9/Image9.cpp b/src/libGLESv2/renderer/d3d9/Image9.cpp
index 7ddf957..001858e 100644
--- a/src/libGLESv2/renderer/d3d9/Image9.cpp
+++ b/src/libGLESv2/renderer/d3d9/Image9.cpp
@@ -452,7 +452,7 @@
 
     RenderTarget9 *renderTarget = NULL;
     IDirect3DSurface9 *surface = NULL;
-    gl::Renderbuffer *colorbuffer = source->getColorbuffer(0);
+    gl::FramebufferAttachment *colorbuffer = source->getColorbuffer(0);
 
     if (colorbuffer)
     {
diff --git a/src/libGLESv2/renderer/d3d9/Renderer9.cpp b/src/libGLESv2/renderer/d3d9/Renderer9.cpp
index 76fdfdc..7d6dd7a 100644
--- a/src/libGLESv2/renderer/d3d9/Renderer9.cpp
+++ b/src/libGLESv2/renderer/d3d9/Renderer9.cpp
@@ -930,8 +930,8 @@
             FIXME("Sample alpha to coverage is unimplemented.");
         }
 
-        gl::Renderbuffer *renderBuffer = framebuffer->getFirstColorbuffer();
-        GLenum internalFormat = renderBuffer ? renderBuffer->getInternalFormat() : GL_NONE;
+        gl::FramebufferAttachment *attachment = framebuffer->getFirstColorbuffer();
+        GLenum internalFormat = attachment ? attachment->getInternalFormat() : GL_NONE;
         GLuint clientVersion = getCurrentClientVersion();
 
         // Set the color mask
@@ -1225,7 +1225,7 @@
 }
 
 
-gl::Renderbuffer *Renderer9::getNullColorbuffer(gl::Renderbuffer *depthbuffer)
+gl::FramebufferAttachment *Renderer9::getNullColorbuffer(gl::FramebufferAttachment *depthbuffer)
 {
     if (!depthbuffer)
     {
@@ -1248,7 +1248,7 @@
         }
     }
 
-    gl::Renderbuffer *nullbuffer = new gl::Renderbuffer(this, 0, new gl::Colorbuffer(this, width, height, GL_NONE, 0));
+    gl::FramebufferAttachment *nullbuffer = new gl::FramebufferAttachment(this, 0, new gl::Colorbuffer(this, width, height, GL_NONE, 0));
 
     // add nullbuffer to the cache
     NullColorbufferCacheEntry *oldest = &mNullColorbufferCache[0];
@@ -1273,7 +1273,7 @@
 {
     // if there is no color attachment we must synthesize a NULL colorattachment
     // to keep the D3D runtime happy.  This should only be possible if depth texturing.
-    gl::Renderbuffer *renderbufferObject = NULL;
+    gl::FramebufferAttachment *renderbufferObject = NULL;
     if (framebuffer->getColorbufferType(0) != GL_NONE)
     {
         renderbufferObject = framebuffer->getColorbuffer(0);
@@ -1314,7 +1314,7 @@
         renderTargetChanged = true;
     }
 
-    gl::Renderbuffer *depthStencil = NULL;
+    gl::FramebufferAttachment *depthStencil = NULL;
     unsigned int depthbufferSerial = 0;
     unsigned int stencilbufferSerial = 0;
     if (framebuffer->getDepthbufferType() != GL_NONE)
@@ -1902,9 +1902,9 @@
     D3DCOLOR color = D3DCOLOR_ARGB(255, 0, 0, 0);
     if (clearColor)
     {
-        gl::Renderbuffer *renderbuffer = frameBuffer->getFirstColorbuffer();
-        GLenum internalFormat = renderbuffer->getInternalFormat();
-        GLenum actualFormat = renderbuffer->getActualFormat();
+        gl::FramebufferAttachment *attachment = frameBuffer->getFirstColorbuffer();
+        GLenum internalFormat = attachment->getInternalFormat();
+        GLenum actualFormat = attachment->getActualFormat();
 
         GLuint clientVersion = getCurrentClientVersion();
         GLuint internalRedBits = gl::GetRedBits(internalFormat, clientVersion);
@@ -2935,8 +2935,8 @@
 
     if (blitRenderTarget)
     {
-        gl::Renderbuffer *readBuffer = readFramebuffer->getColorbuffer(0);
-        gl::Renderbuffer *drawBuffer = drawFramebuffer->getColorbuffer(0);
+        gl::FramebufferAttachment *readBuffer = readFramebuffer->getColorbuffer(0);
+        gl::FramebufferAttachment *drawBuffer = drawFramebuffer->getColorbuffer(0);
         RenderTarget9 *readRenderTarget = NULL;
         RenderTarget9 *drawRenderTarget = NULL;
         IDirect3DSurface9* readSurface = NULL;
@@ -3064,8 +3064,8 @@
 
     if (blitDepth || blitStencil)
     {
-        gl::Renderbuffer *readBuffer = readFramebuffer->getDepthOrStencilbuffer();
-        gl::Renderbuffer *drawBuffer = drawFramebuffer->getDepthOrStencilbuffer();
+        gl::FramebufferAttachment *readBuffer = readFramebuffer->getDepthOrStencilbuffer();
+        gl::FramebufferAttachment *drawBuffer = drawFramebuffer->getDepthOrStencilbuffer();
         RenderTarget9 *readDepthStencil = NULL;
         RenderTarget9 *drawDepthStencil = NULL;
         IDirect3DSurface9* readSurface = NULL;
@@ -3117,7 +3117,7 @@
 
     RenderTarget9 *renderTarget = NULL;
     IDirect3DSurface9 *surface = NULL;
-    gl::Renderbuffer *colorbuffer = framebuffer->getColorbuffer(0);
+    gl::FramebufferAttachment *colorbuffer = framebuffer->getColorbuffer(0);
 
     if (colorbuffer)
     {
diff --git a/src/libGLESv2/renderer/d3d9/Renderer9.h b/src/libGLESv2/renderer/d3d9/Renderer9.h
index 8f723e3..d3ea314 100644
--- a/src/libGLESv2/renderer/d3d9/Renderer9.h
+++ b/src/libGLESv2/renderer/d3d9/Renderer9.h
@@ -19,7 +19,7 @@
 
 namespace gl
 {
-class Renderbuffer;
+class FramebufferAttachment;
 }
 
 namespace rx
@@ -249,7 +249,7 @@
     void drawIndexedPoints(GLsizei count, GLenum type, const GLvoid *indices, int minIndex, gl::Buffer *elementArrayBuffer);
 
     bool copyToRenderTarget(IDirect3DSurface9 *dest, IDirect3DSurface9 *source, bool fromManaged);
-    gl::Renderbuffer *getNullColorbuffer(gl::Renderbuffer *depthbuffer);
+    gl::FramebufferAttachment *getNullColorbuffer(gl::FramebufferAttachment *depthbuffer);
 
     D3DPOOL getBufferPool(DWORD usage) const;
 
@@ -401,7 +401,7 @@
         UINT lruCount;
         int width;
         int height;
-        gl::Renderbuffer *buffer;
+        gl::FramebufferAttachment *buffer;
     } mNullColorbufferCache[NUM_NULL_COLORBUFFER_CACHE_ENTRIES];
     UINT mMaxNullColorbufferLRU;
 
diff --git a/src/libGLESv2/validationES.cpp b/src/libGLESv2/validationES.cpp
index 86d518d7..e44a0f7 100644
--- a/src/libGLESv2/validationES.cpp
+++ b/src/libGLESv2/validationES.cpp
@@ -375,7 +375,7 @@
     return true;
 }
 
-static bool IsPartialBlit(gl::Context *context, gl::Renderbuffer *readBuffer, gl::Renderbuffer *writeBuffer,
+static bool IsPartialBlit(gl::Context *context, gl::FramebufferAttachment *readBuffer, gl::FramebufferAttachment *writeBuffer,
                           GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1,
                           GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1)
 {
@@ -472,8 +472,8 @@
 
     if (mask & GL_COLOR_BUFFER_BIT)
     {
-        gl::Renderbuffer *readColorBuffer = readFramebuffer->getReadColorbuffer();
-        gl::Renderbuffer *drawColorBuffer = drawFramebuffer->getFirstColorbuffer();
+        gl::FramebufferAttachment *readColorBuffer = readFramebuffer->getReadColorbuffer();
+        gl::FramebufferAttachment *drawColorBuffer = drawFramebuffer->getFirstColorbuffer();
 
         if (readColorBuffer && drawColorBuffer)
         {
@@ -555,8 +555,8 @@
 
     if (mask & GL_DEPTH_BUFFER_BIT)
     {
-        gl::Renderbuffer *readDepthBuffer = readFramebuffer->getDepthbuffer();
-        gl::Renderbuffer *drawDepthBuffer = drawFramebuffer->getDepthbuffer();
+        gl::FramebufferAttachment *readDepthBuffer = readFramebuffer->getDepthbuffer();
+        gl::FramebufferAttachment *drawDepthBuffer = drawFramebuffer->getDepthbuffer();
 
         if (readDepthBuffer && drawDepthBuffer)
         {
@@ -589,8 +589,8 @@
 
     if (mask & GL_STENCIL_BUFFER_BIT)
     {
-        gl::Renderbuffer *readStencilBuffer = readFramebuffer->getStencilbuffer();
-        gl::Renderbuffer *drawStencilBuffer = drawFramebuffer->getStencilbuffer();
+        gl::FramebufferAttachment *readStencilBuffer = readFramebuffer->getStencilbuffer();
+        gl::FramebufferAttachment *drawStencilBuffer = drawFramebuffer->getStencilbuffer();
 
         if (readStencilBuffer && drawStencilBuffer)
         {
@@ -1078,8 +1078,8 @@
                 return gl::error(GL_INVALID_OPERATION, false);
             }
 
-            Renderbuffer *renderbuffer = framebuffer->getReadColorbuffer();
-            if (!renderbuffer)
+            FramebufferAttachment *attachment = framebuffer->getReadColorbuffer();
+            if (!attachment)
             {
                 return gl::error(GL_INVALID_OPERATION, false);
             }
diff --git a/src/libGLESv2/validationES3.cpp b/src/libGLESv2/validationES3.cpp
index 555c5e3..a45a5a3 100644
--- a/src/libGLESv2/validationES3.cpp
+++ b/src/libGLESv2/validationES3.cpp
@@ -316,7 +316,18 @@
     }
 
     gl::Framebuffer *framebuffer = context->getReadFramebuffer();
-    gl::Renderbuffer *source = framebuffer->getReadColorbuffer();
+
+    if (framebuffer->completeness() != GL_FRAMEBUFFER_COMPLETE)
+    {
+        return gl::error(GL_INVALID_FRAMEBUFFER_OPERATION, false);
+    }
+
+    if (context->getReadFramebufferHandle() != 0 && framebuffer->getSamples() != 0)
+    {
+        return gl::error(GL_INVALID_OPERATION, false);
+    }
+
+    gl::FramebufferAttachment *source = framebuffer->getReadColorbuffer();
     GLenum colorbufferInternalFormat = source->getInternalFormat();
 
     if (isSubImage)