Implement GL_OES_packed_depth_stencil
TRAC #12336
Signed-off-by: Andrew Lewycky
Signed-off-by: Daniel Koch

Author:    Shannon Woods

git-svn-id: https://angleproject.googlecode.com/svn/trunk@358 736b8ea6-26fd-11df-bfd4-992fa37f6226
diff --git a/src/libGLESv2/Framebuffer.cpp b/src/libGLESv2/Framebuffer.cpp
index 1a3b01e..e4d6798 100644
--- a/src/libGLESv2/Framebuffer.cpp
+++ b/src/libGLESv2/Framebuffer.cpp
@@ -119,7 +119,7 @@
 unsigned int Framebuffer::getDepthbufferSerial()
 {
     gl::Context *context = gl::getContext();
-    Depthbuffer *depthbuffer = context->getDepthbuffer(mDepthbufferHandle);
+    DepthStencilbuffer *depthbuffer = context->getDepthbuffer(mDepthbufferHandle);
 
     if (depthbuffer)
     {
@@ -129,19 +129,6 @@
     return 0;
 }
 
-IDirect3DSurface9 *Framebuffer::getDepthStencil()
-{
-    gl::Context *context = gl::getContext();
-    Depthbuffer *depthbuffer = context->getDepthbuffer(mDepthbufferHandle);
-
-    if (depthbuffer)
-    {
-        return depthbuffer->getDepthStencil();
-    }
-
-    return NULL;
-}
-
 Colorbuffer *Framebuffer::getColorbuffer()
 {
     gl::Context *context = gl::getContext();
@@ -169,27 +156,33 @@
     return NULL;
 }
 
-Depthbuffer *Framebuffer::getDepthbuffer()
+DepthStencilbuffer *Framebuffer::getDepthbuffer()
 {
-    gl::Context *context = gl::getContext();
-    Depthbuffer *depthbuffer = context->getDepthbuffer(mDepthbufferHandle);
-
-    if (depthbuffer && depthbuffer->isDepthbuffer())
+    if (mDepthbufferType != GL_NONE)
     {
-        return depthbuffer;
+        gl::Context *context = gl::getContext();
+        DepthStencilbuffer *depthbuffer = context->getDepthbuffer(mDepthbufferHandle);
+
+        if (depthbuffer && depthbuffer->isDepthbuffer())
+        {
+            return depthbuffer;
+        }
     }
 
     return NULL;
 }
 
-Stencilbuffer *Framebuffer::getStencilbuffer()
+DepthStencilbuffer *Framebuffer::getStencilbuffer()
 {
-    gl::Context *context = gl::getContext();
-    Stencilbuffer *stencilbuffer = context->getStencilbuffer(mStencilbufferHandle);
-
-    if (stencilbuffer && stencilbuffer->isStencilbuffer())
+    if (mStencilbufferType != GL_NONE)
     {
-        return stencilbuffer;
+        gl::Context *context = gl::getContext();
+        DepthStencilbuffer *stencilbuffer = context->getStencilbuffer(mStencilbufferHandle);
+
+        if (stencilbuffer && stencilbuffer->isStencilbuffer())
+        {
+            return stencilbuffer;
+        }
     }
 
     return NULL;
@@ -250,9 +243,12 @@
         height = colorbuffer->getHeight();
     }
 
+    DepthStencilbuffer *depthbuffer = NULL;
+    DepthStencilbuffer *stencilbuffer = NULL;
+
     if (mDepthbufferType != GL_NONE)
     {
-        Depthbuffer *depthbuffer = context->getDepthbuffer(mDepthbufferHandle);
+        depthbuffer = context->getDepthbuffer(mDepthbufferHandle);
 
         if (!depthbuffer)
         {
@@ -277,7 +273,7 @@
 
     if (mStencilbufferType != GL_NONE)
     {
-        Stencilbuffer *stencilbuffer = context->getStencilbuffer(mStencilbufferHandle);
+        stencilbuffer = context->getStencilbuffer(mStencilbufferHandle);
 
         if (!stencilbuffer)
         {
@@ -300,6 +296,16 @@
         }
     }
 
+    if (mDepthbufferType == GL_RENDERBUFFER && mStencilbufferType == GL_RENDERBUFFER)
+    {
+        if (depthbuffer->getFormat() != GL_DEPTH24_STENCIL8_OES ||
+            stencilbuffer->getFormat() != GL_DEPTH24_STENCIL8_OES ||
+            depthbuffer->getSerial() != stencilbuffer->getSerial())
+        {
+            return GL_FRAMEBUFFER_UNSUPPORTED;
+        }
+    }
+
     return GL_FRAMEBUFFER_COMPLETE;
 }
 }