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);
}