bindGenericUniformBuffer(0);\r
bindTransformFeedback(0);\r
\r
- mState.readFramebufferColorIndex = 0;\r
- for(int i = 0; i < MAX_COLOR_ATTACHMENTS; ++i)\r
- {\r
- mState.drawFramebufferColorIndices[i] = GL_NONE;\r
- }\r
-\r
mState.currentProgram = 0;\r
\r
mState.packAlignment = 4;\r
return mState.renderbuffer.name();\r
}\r
\r
-void Context::setReadFramebufferColorIndex(GLuint index)\r
+void Context::setFramebufferReadBuffer(GLuint buf)\r
{\r
- mState.readFramebufferColorIndex = index;\r
+ getReadFramebuffer()->setReadBuffer(buf);\r
}\r
\r
-void Context::setDrawFramebufferColorIndices(GLsizei n, const GLenum *bufs)\r
+void Context::setFramebufferDrawBuffers(GLsizei n, const GLenum *bufs)\r
{\r
+ Framebuffer* drawFramebuffer = getDrawFramebuffer();\r
for(int i = 0; i < n; ++i)\r
{\r
- mState.drawFramebufferColorIndices[i] = ((bufs[i] == GL_BACK) || (bufs[i] == GL_NONE)) ? bufs[i] : i;\r
+ drawFramebuffer->setDrawBuffer(i, bufs[i]);\r
}\r
}\r
\r
GLuint Context::getReadFramebufferColorIndex() const\r
{\r
- return mState.readFramebufferColorIndex;\r
+ GLenum buf = getReadFramebuffer()->getReadBuffer();\r
+ switch(buf)\r
+ {\r
+ case GL_BACK:\r
+ return 0;\r
+ case GL_NONE:\r
+ return GL_INVALID_INDEX;\r
+ default:\r
+ return buf - GL_COLOR_ATTACHMENT0;\r
+}\r
}\r
\r
GLuint Context::getArrayBufferName() const\r
}\r
break;\r
case GL_DRAW_BUFFER0: // symbolic constant, initial value is GL_BACK\r
- UNIMPLEMENTED();\r
- *params = GL_BACK;\r
- break;\r
case GL_DRAW_BUFFER1: // symbolic constant, initial value is GL_NONE\r
case GL_DRAW_BUFFER2:\r
case GL_DRAW_BUFFER3:\r
case GL_DRAW_BUFFER13:\r
case GL_DRAW_BUFFER14:\r
case GL_DRAW_BUFFER15:\r
- UNIMPLEMENTED();\r
- *params = GL_NONE;\r
+ *params = getDrawFramebuffer()->getDrawBuffer(pname - GL_DRAW_BUFFER0);\r
break;\r
case GL_MAJOR_VERSION: // integer, at least 3\r
if(clientVersion >= 3)\r
*params = 0;\r
break;\r
case GL_READ_BUFFER: // symbolic constant, initial value is GL_BACK\r
- UNIMPLEMENTED();\r
- *params = GL_BACK;\r
+ *params = getReadFramebuffer()->getReadBuffer();\r
break;\r
case GL_SAMPLER_BINDING: // GLint, default 0\r
*params = mState.sampler[mState.activeSampler].name();\r
\r
GLuint readFramebuffer;\r
GLuint drawFramebuffer;\r
- GLuint readFramebufferColorIndex;\r
- GLuint drawFramebufferColorIndices[MAX_COLOR_ATTACHMENTS];\r
gl::BindingPointer<Renderbuffer> renderbuffer;\r
GLuint currentProgram;\r
GLuint vertexArray;\r
GLuint getDrawFramebufferName() const;\r
GLuint getRenderbufferName() const;\r
\r
- void setReadFramebufferColorIndex(GLuint index);\r
- void setDrawFramebufferColorIndices(GLsizei n, const GLenum *bufs);\r
+ void setFramebufferReadBuffer(GLenum buf);\r
+ void setFramebufferDrawBuffers(GLsizei n, const GLenum *bufs);\r
GLuint getReadFramebufferColorIndex() const;\r
\r
GLuint getActiveQuery(GLenum target) const;\r
}
mDepthbufferType = GL_NONE;
mStencilbufferType = GL_NONE;
+
+ readBuffer = GL_BACK;
+ drawBuffer[0] = GL_BACK;
+ for(int i = 1; i < MAX_COLOR_ATTACHMENTS; ++i)
+ {
+ drawBuffer[i] = GL_NONE;
+ }
}
Framebuffer::~Framebuffer()
{
mColorbufferType[index] = (colorbuffer != 0) ? type : GL_NONE;
mColorbufferPointer[index] = lookupRenderbuffer(type, colorbuffer, level, layer);
+ drawBuffer[index] = (colorbuffer != 0) ? GL_COLOR_ATTACHMENT0 + index : GL_NONE;
+ if(index == 0)
+ {
+ readBuffer = drawBuffer[0];
+ }
}
void Framebuffer::setDepthbuffer(GLenum type, GLuint depthbuffer, GLint level, GLint layer)
mStencilbufferPointer = lookupRenderbuffer(type, stencilbuffer, level, layer);
}
+void Framebuffer::setReadBuffer(GLenum buf)
+{
+ readBuffer = buf;
+}
+
+void Framebuffer::setDrawBuffer(GLuint index, GLenum buf)
+{
+ drawBuffer[index] = buf;
+}
+
+GLenum Framebuffer::getReadBuffer() const
+{
+ return readBuffer;
+}
+
+GLenum Framebuffer::getDrawBuffer(GLuint index) const
+{
+ return drawBuffer[index];
+}
+
void Framebuffer::detachTexture(GLuint texture)
{
for(int i = 0; i < IMPLEMENTATION_MAX_COLOR_ATTACHMENTS; ++i)
void setDepthbuffer(GLenum type, GLuint depthbuffer, GLint level = 0, GLint layer = 0);\r
void setStencilbuffer(GLenum type, GLuint stencilbuffer, GLint level = 0, GLint layer = 0);\r
\r
+ void setReadBuffer(GLenum buf);\r
+ void setDrawBuffer(GLuint index, GLenum buf);\r
+ GLenum getReadBuffer() const;\r
+ GLenum getDrawBuffer(GLuint index) const;\r
+\r
void detachTexture(GLuint texture);\r
void detachRenderbuffer(GLuint renderbuffer);\r
\r
protected:\r
GLenum mColorbufferType[MAX_COLOR_ATTACHMENTS];\r
gl::BindingPointer<Renderbuffer> mColorbufferPointer[MAX_COLOR_ATTACHMENTS];\r
+ GLenum readBuffer;\r
+ GLenum drawBuffer[MAX_COLOR_ATTACHMENTS];\r
\r
GLenum mDepthbufferType;\r
gl::BindingPointer<Renderbuffer> mDepthbufferPointer;\r
{\r
return error(GL_INVALID_OPERATION);\r
}\r
- context->setReadFramebufferColorIndex(0);\r
+ context->setFramebufferReadBuffer(src);\r
break;\r
case GL_NONE:\r
- context->setReadFramebufferColorIndex(GL_INVALID_INDEX);\r
+ context->setFramebufferReadBuffer(src);\r
break;\r
case GL_COLOR_ATTACHMENT0:\r
case GL_COLOR_ATTACHMENT1:\r
{\r
return error(GL_INVALID_OPERATION);\r
}\r
- context->setReadFramebufferColorIndex(index);\r
+ context->setFramebufferReadBuffer(src);\r
}\r
break;\r
default:\r
}\r
}\r
\r
- context->setDrawFramebufferColorIndices(n, bufs);\r
+ context->setFramebufferDrawBuffers(n, bufs);\r
}\r
}\r
\r