Creates separate bind points for read & write framebuffers.
TRAC #12712
Signed-off-by: Nicolas Capens
Signed-off-by: Daniel Koch

Author:    Shannon Woods

git-svn-id: https://angleproject.googlecode.com/svn/trunk@387 736b8ea6-26fd-11df-bfd4-992fa37f6226
diff --git a/src/libGLESv2/libGLESv2.cpp b/src/libGLESv2/libGLESv2.cpp
index 795f4b9..5fddf6f 100644
--- a/src/libGLESv2/libGLESv2.cpp
+++ b/src/libGLESv2/libGLESv2.cpp
@@ -180,7 +180,7 @@
 
     try
     {
-        if (target != GL_FRAMEBUFFER)
+        if (target != GL_FRAMEBUFFER && target != GL_DRAW_FRAMEBUFFER_ANGLE && target != GL_READ_FRAMEBUFFER_ANGLE)
         {
             return error(GL_INVALID_ENUM);
         }
@@ -189,7 +189,15 @@
 
         if (context)
         {
-            context->bindFramebuffer(framebuffer);
+            if (target == GL_READ_FRAMEBUFFER_ANGLE || target == GL_FRAMEBUFFER)
+            {
+                context->bindReadFramebuffer(framebuffer);
+            }
+            
+            if (target == GL_DRAW_FRAMEBUFFER_ANGLE || target == GL_FRAMEBUFFER)
+            {
+                context->bindDrawFramebuffer(framebuffer);
+            }
         }
     }
     catch(std::bad_alloc&)
@@ -559,7 +567,7 @@
 
     try
     {
-        if (target != GL_FRAMEBUFFER)
+        if (target != GL_FRAMEBUFFER && target != GL_DRAW_FRAMEBUFFER_ANGLE && target != GL_READ_FRAMEBUFFER_ANGLE)
         {
             return error(GL_INVALID_ENUM, 0);
         }
@@ -568,7 +576,15 @@
 
         if (context)
         {
-            gl::Framebuffer *framebuffer = context->getFramebuffer();
+            gl::Framebuffer *framebuffer = NULL;
+            if (target == GL_READ_FRAMEBUFFER_ANGLE)
+            {
+                framebuffer = context->getReadFramebuffer();
+            }
+            else
+            {
+                framebuffer = context->getDrawFramebuffer();
+            }
 
             return framebuffer->completeness();
         }
@@ -848,7 +864,7 @@
 
         if (context)
         {
-            gl::Framebuffer *framebuffer = context->getFramebuffer();
+            gl::Framebuffer *framebuffer = context->getReadFramebuffer();
             if (framebuffer->completeness() != GL_FRAMEBUFFER_COMPLETE)
             {
                 return error(GL_INVALID_FRAMEBUFFER_OPERATION);
@@ -921,7 +937,7 @@
 
         if (context)
         {
-            gl::Framebuffer *framebuffer = context->getFramebuffer();
+            gl::Framebuffer *framebuffer = context->getReadFramebuffer();
             if (framebuffer->completeness() != GL_FRAMEBUFFER_COMPLETE)
             {
                 return error(GL_INVALID_FRAMEBUFFER_OPERATION);
@@ -1569,7 +1585,8 @@
 
     try
     {
-        if (target != GL_FRAMEBUFFER || renderbuffertarget != GL_RENDERBUFFER)
+        if ((target != GL_FRAMEBUFFER && target != GL_DRAW_FRAMEBUFFER_ANGLE && target != GL_READ_FRAMEBUFFER_ANGLE)
+            || renderbuffertarget != GL_RENDERBUFFER)
         {
             return error(GL_INVALID_ENUM);
         }
@@ -1578,9 +1595,20 @@
 
         if (context)
         {
-            gl::Framebuffer *framebuffer = context->getFramebuffer();
+            gl::Framebuffer *framebuffer = NULL;
+            GLuint framebufferHandle = 0;
+            if (target == GL_READ_FRAMEBUFFER_ANGLE)
+            {
+                framebuffer = context->getReadFramebuffer();
+                framebufferHandle = context->getReadFramebufferHandle();
+            }
+            else 
+            {
+                framebuffer = context->getDrawFramebuffer();
+                framebufferHandle = context->getDrawFramebufferHandle();
+            }
 
-            if (context->getFramebufferHandle() == 0 || !framebuffer)
+            if (framebufferHandle == 0 || !framebuffer)
             {
                 return error(GL_INVALID_OPERATION);
             }
@@ -1614,7 +1642,7 @@
 
     try
     {
-        if (target != GL_FRAMEBUFFER)
+        if (target != GL_FRAMEBUFFER && target != GL_DRAW_FRAMEBUFFER_ANGLE && target != GL_READ_FRAMEBUFFER_ANGLE)
         {
             return error(GL_INVALID_ENUM);
         }
@@ -1677,9 +1705,20 @@
                 }
             }
 
-            gl::Framebuffer *framebuffer = context->getFramebuffer();
+            gl::Framebuffer *framebuffer = NULL;
+            GLuint framebufferHandle = 0;
+            if (target == GL_READ_FRAMEBUFFER_ANGLE)
+            {
+                framebuffer = context->getReadFramebuffer();
+                framebufferHandle = context->getReadFramebufferHandle();
+            }
+            else
+            {
+                framebuffer = context->getDrawFramebuffer();
+                framebufferHandle = context->getDrawFramebufferHandle();
+            }
 
-            if (context->getFramebufferHandle() == 0 || !framebuffer)
+            if (framebufferHandle == 0 || !framebuffer)
             {
                 return error(GL_INVALID_OPERATION);
             }
@@ -2235,31 +2274,46 @@
 
         if (context)
         {
-            if (context->getFramebufferHandle() == 0)
-            {
-                return error(GL_INVALID_OPERATION);
-            }
-
-            if (target != GL_FRAMEBUFFER)
+            if (target != GL_FRAMEBUFFER && target != GL_DRAW_FRAMEBUFFER_ANGLE && target != GL_READ_FRAMEBUFFER_ANGLE)
             {
                 return error(GL_INVALID_ENUM);
             }
 
+            gl::Framebuffer *framebuffer = NULL;
+            if (target == GL_READ_FRAMEBUFFER_ANGLE)
+            {
+                if(context->getReadFramebufferHandle() == 0)
+                {
+                    return error(GL_INVALID_OPERATION);
+                }
+
+                framebuffer = context->getReadFramebuffer();
+            }
+            else 
+            {
+                if (context->getDrawFramebufferHandle() == 0)
+                {
+                    return error(GL_INVALID_OPERATION);
+                }
+
+                framebuffer = context->getDrawFramebuffer();
+            }
+
             GLenum attachmentType;
             GLuint attachmentHandle;
             switch (attachment)
             {
               case GL_COLOR_ATTACHMENT0:    
-                attachmentType = context->getFramebuffer()->getColorbufferType();
-                attachmentHandle = context->getFramebuffer()->getColorbufferHandle(); 
+                attachmentType = framebuffer->getColorbufferType();
+                attachmentHandle = framebuffer->getColorbufferHandle(); 
                 break;
               case GL_DEPTH_ATTACHMENT:     
-                attachmentType = context->getFramebuffer()->getDepthbufferType();
-                attachmentHandle = context->getFramebuffer()->getDepthbufferHandle();
+                attachmentType = framebuffer->getDepthbufferType();
+                attachmentHandle = framebuffer->getDepthbufferHandle();
                 break;
               case GL_STENCIL_ATTACHMENT:   
-                attachmentType = context->getFramebuffer()->getStencilbufferType();
-                attachmentHandle = context->getFramebuffer()->getStencilbufferHandle();
+                attachmentType = framebuffer->getStencilbufferType();
+                attachmentHandle = framebuffer->getStencilbufferHandle();
                 break;
               default: return error(GL_INVALID_ENUM);
             }