Framebuffer now uses mip level and texture layer for binding textures.

TRAC #23470

Signed-off-by: Jamie Madill
Signed-off-by: Shannon Woods
Author: Geoff Lang
diff --git a/src/libGLESv2/Framebuffer.cpp b/src/libGLESv2/Framebuffer.cpp
index d89e062..25344d4 100644
--- a/src/libGLESv2/Framebuffer.cpp
+++ b/src/libGLESv2/Framebuffer.cpp
@@ -42,38 +42,88 @@
     mStencilbuffer.set(NULL, GL_NONE, 0, 0);
 }
 
-Renderbuffer *Framebuffer::lookupRenderbuffer(GLenum type, GLuint handle) const
+Renderbuffer *Framebuffer::lookupRenderbuffer(GLenum type, GLuint handle, GLint level, GLint layer) const
 {
     gl::Context *context = gl::getContext();
-    Renderbuffer *buffer = NULL;
 
-    if (type == GL_NONE)
+    switch (type)
     {
-        buffer = NULL;
-    }
-    else if (type == GL_RENDERBUFFER)
-    {
-        buffer = context->getRenderbuffer(handle);
-    }
-    else if (IsInternalTextureTarget(type))
-    {
-        buffer = context->getTexture(handle)->getRenderbuffer(type);
-    }
-    else
-    {
+      case GL_NONE:
+        return NULL;
+
+      case GL_RENDERBUFFER:
+        return context->getRenderbuffer(handle);
+
+      case GL_TEXTURE_2D:
+        {
+            Texture *texture = context->getTexture(handle);
+            if (texture && texture->getTarget() == GL_TEXTURE_2D)
+            {
+                return static_cast<Texture2D*>(texture)->getRenderbuffer(type);
+            }
+            else
+            {
+                return NULL;
+            }
+        }
+
+      case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
+      case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
+      case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
+      case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
+      case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
+      case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
+        {
+            Texture *texture = context->getTexture(handle);
+            if (texture && texture->getTarget() == GL_TEXTURE_CUBE_MAP)
+            {
+                return static_cast<TextureCubeMap*>(texture)->getRenderbuffer(type);
+            }
+            else
+            {
+                return NULL;
+            }
+        }
+
+      case GL_TEXTURE_3D:
+        {
+            Texture *texture = context->getTexture(handle);
+            if (texture && texture->getTarget() == GL_TEXTURE_3D)
+            {
+                return static_cast<Texture3D*>(texture)->getRenderbuffer(type);
+            }
+            else
+            {
+                return NULL;
+            }
+        }
+
+      case GL_TEXTURE_2D_ARRAY:
+        {
+            Texture *texture = context->getTexture(handle);
+            if (texture && texture->getTarget() == GL_TEXTURE_2D_ARRAY)
+            {
+                return static_cast<Texture2DArray*>(texture)->getRenderbuffer(type);
+            }
+            else
+            {
+                return NULL;
+            }
+        }
+
+      default:
         UNREACHABLE();
+        return NULL;
     }
-
-    return buffer;
 }
 
-void Framebuffer::setColorbuffer(unsigned int colorAttachment, GLenum type, GLuint colorbuffer)
+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);
+    Renderbuffer *renderBuffer = lookupRenderbuffer(type, colorbuffer, level, layer);
     if (renderBuffer)
     {
-        mColorbuffers[colorAttachment].set(renderBuffer, type, 0, 0);
+        mColorbuffers[colorAttachment].set(renderBuffer, type, level, layer);
     }
     else
     {
@@ -81,12 +131,12 @@
     }
 }
 
-void Framebuffer::setDepthbuffer(GLenum type, GLuint depthbuffer)
+void Framebuffer::setDepthbuffer(GLenum type, GLuint depthbuffer, GLint level, GLint layer)
 {
-    Renderbuffer *renderBuffer = lookupRenderbuffer(type, depthbuffer);
+    Renderbuffer *renderBuffer = lookupRenderbuffer(type, depthbuffer, level, layer);
     if (renderBuffer)
     {
-        mDepthbuffer.set(renderBuffer, type, 0, 0);
+        mDepthbuffer.set(renderBuffer, type, level, layer);
     }
     else
     {
@@ -94,12 +144,12 @@
     }
 }
 
-void Framebuffer::setStencilbuffer(GLenum type, GLuint stencilbuffer)
+void Framebuffer::setStencilbuffer(GLenum type, GLuint stencilbuffer, GLint level, GLint layer)
 {
-    Renderbuffer *renderBuffer = lookupRenderbuffer(type, stencilbuffer);
+    Renderbuffer *renderBuffer = lookupRenderbuffer(type, stencilbuffer, level, layer);
     if (renderBuffer)
     {
-        mStencilbuffer.set(renderBuffer, type, 0, 0);
+        mStencilbuffer.set(renderBuffer, type, level, layer);
     }
     else
     {
@@ -107,13 +157,13 @@
     }
 }
 
-void Framebuffer::setDepthStencilBuffer(GLenum type, GLuint depthStencilBuffer)
+void Framebuffer::setDepthStencilBuffer(GLenum type, GLuint depthStencilBuffer, GLint level, GLint layer)
 {
-    Renderbuffer *renderBuffer = lookupRenderbuffer(type, depthStencilBuffer);
+    Renderbuffer *renderBuffer = lookupRenderbuffer(type, depthStencilBuffer, level, layer);
     if (renderBuffer && renderBuffer->getDepthSize() > 0 && renderBuffer->getStencilSize() > 0)
     {
-        mDepthbuffer.set(renderBuffer, type, 0, 0);
-        mStencilbuffer.set(renderBuffer, type, 0, 0);
+        mDepthbuffer.set(renderBuffer, type, level, layer);
+        mStencilbuffer.set(renderBuffer, type, level, layer);
     }
     else
     {
@@ -126,7 +176,8 @@
 {
     for (unsigned int colorAttachment = 0; colorAttachment < IMPLEMENTATION_MAX_DRAW_BUFFERS; colorAttachment++)
     {
-        if (mColorbuffers[colorAttachment].id() == texture && IsInternalTextureTarget(mColorbuffers[colorAttachment].type()))
+        if (mColorbuffers[colorAttachment].id() == texture &&
+            IsInternalTextureTarget(mColorbuffers[colorAttachment].type()))
         {
             mColorbuffers[colorAttachment].set(NULL, GL_NONE, 0, 0);
         }