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
parent b707a3b7
...@@ -351,6 +351,18 @@ typedef void* GLeglImageOES; ...@@ -351,6 +351,18 @@ typedef void* GLeglImageOES;
#endif #endif
/*------------------------------------------------------------------------* /*------------------------------------------------------------------------*
* ANGLE extension tokens
*------------------------------------------------------------------------*/
/* GL_ANGLE_framebuffer_blit */
#ifndef GL_ANGLE_framebuffer_blit
#define GL_READ_FRAMEBUFFER_ANGLE 0x8CA8
#define GL_DRAW_FRAMEBUFFER_ANGLE 0x8CA9
#define GL_DRAW_FRAMEBUFFER_BINDING_ANGLE 0x8CA6 // alias GL_FRAMEBUFFER_BINDING
#define GL_READ_FRAMEBUFFER_BINDING_ANGLE 0x8CAA
#endif
/*------------------------------------------------------------------------*
* End of extension tokens, start of corresponding extension functions * End of extension tokens, start of corresponding extension functions
*------------------------------------------------------------------------*/ *------------------------------------------------------------------------*/
...@@ -766,6 +778,15 @@ typedef void (GL_APIENTRYP PFNGLSTARTTILINGQCOMPROC) (GLuint x, GLuint y, GLuint ...@@ -766,6 +778,15 @@ typedef void (GL_APIENTRYP PFNGLSTARTTILINGQCOMPROC) (GLuint x, GLuint y, GLuint
typedef void (GL_APIENTRYP PFNGLENDTILINGQCOMPROC) (GLbitfield preserveMask); typedef void (GL_APIENTRYP PFNGLENDTILINGQCOMPROC) (GLbitfield preserveMask);
#endif #endif
/*------------------------------------------------------------------------*
* ANGLE extension functions
*------------------------------------------------------------------------*/
/* GL_ANGLE_framebuffer_blit */
#ifndef GL_ANGLE_framebuffer_blit
#define GL_ANGLE_framebuffer_blit 1
#endif
#ifdef __cplusplus #ifdef __cplusplus
} }
#endif #endif
......
...@@ -131,7 +131,8 @@ Context::Context(const egl::Config *config, const gl::Context *shareContext) ...@@ -131,7 +131,8 @@ Context::Context(const egl::Config *config, const gl::Context *shareContext)
bindElementArrayBuffer(0); bindElementArrayBuffer(0);
bindTextureCubeMap(0); bindTextureCubeMap(0);
bindTexture2D(0); bindTexture2D(0);
bindFramebuffer(0); bindReadFramebuffer(0);
bindDrawFramebuffer(0);
bindRenderbuffer(0); bindRenderbuffer(0);
for (int type = 0; type < SAMPLER_TYPE_COUNT; type++) for (int type = 0; type < SAMPLER_TYPE_COUNT; type++)
...@@ -662,9 +663,14 @@ void Context::setActiveSampler(int active) ...@@ -662,9 +663,14 @@ void Context::setActiveSampler(int active)
mState.activeSampler = active; mState.activeSampler = active;
} }
GLuint Context::getFramebufferHandle() const GLuint Context::getReadFramebufferHandle() const
{ {
return mState.framebuffer; return mState.readFramebuffer;
}
GLuint Context::getDrawFramebufferHandle() const
{
return mState.drawFramebuffer;
} }
GLuint Context::getRenderbufferHandle() const GLuint Context::getRenderbufferHandle() const
...@@ -847,9 +853,14 @@ Renderbuffer *Context::getRenderbuffer(GLuint handle) ...@@ -847,9 +853,14 @@ Renderbuffer *Context::getRenderbuffer(GLuint handle)
return mResourceManager->getRenderbuffer(handle); return mResourceManager->getRenderbuffer(handle);
} }
Framebuffer *Context::getFramebuffer() Framebuffer *Context::getReadFramebuffer()
{ {
return getFramebuffer(mState.framebuffer); return getFramebuffer(mState.readFramebuffer);
}
Framebuffer *Context::getDrawFramebuffer()
{
return getFramebuffer(mState.drawFramebuffer);
} }
void Context::bindArrayBuffer(unsigned int buffer) void Context::bindArrayBuffer(unsigned int buffer)
...@@ -884,14 +895,24 @@ void Context::bindTextureCubeMap(GLuint texture) ...@@ -884,14 +895,24 @@ void Context::bindTextureCubeMap(GLuint texture)
mState.samplerTexture[SAMPLER_CUBE][mState.activeSampler].set(mState.textureCubeMap.get()); mState.samplerTexture[SAMPLER_CUBE][mState.activeSampler].set(mState.textureCubeMap.get());
} }
void Context::bindFramebuffer(GLuint framebuffer) void Context::bindReadFramebuffer(GLuint framebuffer)
{
if (!getFramebuffer(framebuffer))
{
mFramebufferMap[framebuffer] = new Framebuffer();
}
mState.readFramebuffer = framebuffer;
}
void Context::bindDrawFramebuffer(GLuint framebuffer)
{ {
if (!getFramebuffer(framebuffer)) if (!getFramebuffer(framebuffer))
{ {
mFramebufferMap[framebuffer] = new Framebuffer(); mFramebufferMap[framebuffer] = new Framebuffer();
} }
mState.framebuffer = framebuffer; mState.drawFramebuffer = framebuffer;
} }
void Context::bindRenderbuffer(GLuint renderbuffer) void Context::bindRenderbuffer(GLuint renderbuffer)
...@@ -1097,7 +1118,9 @@ bool Context::getIntegerv(GLenum pname, GLint *params) ...@@ -1097,7 +1118,9 @@ bool Context::getIntegerv(GLenum pname, GLint *params)
case GL_SHADER_BINARY_FORMATS: /* no shader binary formats are supported */ break; case GL_SHADER_BINARY_FORMATS: /* no shader binary formats are supported */ break;
case GL_ARRAY_BUFFER_BINDING: *params = mState.arrayBuffer.id(); break; case GL_ARRAY_BUFFER_BINDING: *params = mState.arrayBuffer.id(); break;
case GL_ELEMENT_ARRAY_BUFFER_BINDING: *params = mState.elementArrayBuffer.id(); break; case GL_ELEMENT_ARRAY_BUFFER_BINDING: *params = mState.elementArrayBuffer.id(); break;
case GL_FRAMEBUFFER_BINDING: *params = mState.framebuffer; break; //case GL_FRAMEBUFFER_BINDING: // now equivalent to GL_DRAW_FRAMEBUFFER_BINDING_ANGLE
case GL_DRAW_FRAMEBUFFER_BINDING_ANGLE: *params = mState.drawFramebuffer; break;
case GL_READ_FRAMEBUFFER_BINDING_ANGLE: *params = mState.readFramebuffer; break;
case GL_RENDERBUFFER_BINDING: *params = mState.renderbuffer.id(); break; case GL_RENDERBUFFER_BINDING: *params = mState.renderbuffer.id(); break;
case GL_CURRENT_PROGRAM: *params = mState.currentProgram; break; case GL_CURRENT_PROGRAM: *params = mState.currentProgram; break;
case GL_PACK_ALIGNMENT: *params = mState.packAlignment; break; case GL_PACK_ALIGNMENT: *params = mState.packAlignment; break;
...@@ -1159,7 +1182,7 @@ bool Context::getIntegerv(GLenum pname, GLint *params) ...@@ -1159,7 +1182,7 @@ bool Context::getIntegerv(GLenum pname, GLint *params)
case GL_BLUE_BITS: case GL_BLUE_BITS:
case GL_ALPHA_BITS: case GL_ALPHA_BITS:
{ {
gl::Framebuffer *framebuffer = getFramebuffer(); gl::Framebuffer *framebuffer = getDrawFramebuffer();
gl::Colorbuffer *colorbuffer = framebuffer->getColorbuffer(); gl::Colorbuffer *colorbuffer = framebuffer->getColorbuffer();
if (colorbuffer) if (colorbuffer)
...@@ -1180,7 +1203,7 @@ bool Context::getIntegerv(GLenum pname, GLint *params) ...@@ -1180,7 +1203,7 @@ bool Context::getIntegerv(GLenum pname, GLint *params)
break; break;
case GL_DEPTH_BITS: case GL_DEPTH_BITS:
{ {
gl::Framebuffer *framebuffer = getFramebuffer(); gl::Framebuffer *framebuffer = getDrawFramebuffer();
gl::DepthStencilbuffer *depthbuffer = framebuffer->getDepthbuffer(); gl::DepthStencilbuffer *depthbuffer = framebuffer->getDepthbuffer();
if (depthbuffer) if (depthbuffer)
...@@ -1195,7 +1218,7 @@ bool Context::getIntegerv(GLenum pname, GLint *params) ...@@ -1195,7 +1218,7 @@ bool Context::getIntegerv(GLenum pname, GLint *params)
break; break;
case GL_STENCIL_BITS: case GL_STENCIL_BITS:
{ {
gl::Framebuffer *framebuffer = getFramebuffer(); gl::Framebuffer *framebuffer = getDrawFramebuffer();
gl::DepthStencilbuffer *stencilbuffer = framebuffer->getStencilbuffer(); gl::DepthStencilbuffer *stencilbuffer = framebuffer->getStencilbuffer();
if (stencilbuffer) if (stencilbuffer)
...@@ -1392,7 +1415,7 @@ bool Context::applyRenderTarget(bool ignoreViewport) ...@@ -1392,7 +1415,7 @@ bool Context::applyRenderTarget(bool ignoreViewport)
{ {
IDirect3DDevice9 *device = getDevice(); IDirect3DDevice9 *device = getDevice();
Framebuffer *framebufferObject = getFramebuffer(); Framebuffer *framebufferObject = getDrawFramebuffer();
if (!framebufferObject || framebufferObject->completeness() != GL_FRAMEBUFFER_COMPLETE) if (!framebufferObject || framebufferObject->completeness() != GL_FRAMEBUFFER_COMPLETE)
{ {
...@@ -1530,7 +1553,7 @@ void Context::applyState(GLenum drawMode) ...@@ -1530,7 +1553,7 @@ void Context::applyState(GLenum drawMode)
GLint alwaysFront = !isTriangleMode(drawMode); GLint alwaysFront = !isTriangleMode(drawMode);
programObject->setUniform1iv(pointsOrLines, 1, &alwaysFront); programObject->setUniform1iv(pointsOrLines, 1, &alwaysFront);
Framebuffer *framebufferObject = getFramebuffer(); Framebuffer *framebufferObject = getDrawFramebuffer();
if (mCullStateDirty || mFrontFaceDirty) if (mCullStateDirty || mFrontFaceDirty)
{ {
...@@ -1610,7 +1633,7 @@ void Context::applyState(GLenum drawMode) ...@@ -1610,7 +1633,7 @@ void Context::applyState(GLenum drawMode)
if (mStencilStateDirty || mFrontFaceDirty) if (mStencilStateDirty || mFrontFaceDirty)
{ {
if (mState.stencilTest && hasStencil()) if (mState.stencilTest && framebufferObject->hasStencil())
{ {
device->SetRenderState(D3DRS_STENCILENABLE, TRUE); device->SetRenderState(D3DRS_STENCILENABLE, TRUE);
device->SetRenderState(D3DRS_TWOSIDEDSTENCILMODE, TRUE); device->SetRenderState(D3DRS_TWOSIDEDSTENCILMODE, TRUE);
...@@ -1628,8 +1651,7 @@ void Context::applyState(GLenum drawMode) ...@@ -1628,8 +1651,7 @@ void Context::applyState(GLenum drawMode)
} }
// get the maximum size of the stencil ref // get the maximum size of the stencil ref
gl::Framebuffer *framebuffer = getFramebuffer(); gl::DepthStencilbuffer *stencilbuffer = framebufferObject->getStencilbuffer();
gl::DepthStencilbuffer *stencilbuffer = framebuffer->getStencilbuffer();
GLuint maxStencil = (1 << stencilbuffer->getStencilSize()) - 1; GLuint maxStencil = (1 << stencilbuffer->getStencilSize()) - 1;
device->SetRenderState(mState.frontFace == GL_CCW ? D3DRS_STENCILWRITEMASK : D3DRS_CCW_STENCILWRITEMASK, mState.stencilWritemask); device->SetRenderState(mState.frontFace == GL_CCW ? D3DRS_STENCILWRITEMASK : D3DRS_CCW_STENCILWRITEMASK, mState.stencilWritemask);
...@@ -1681,7 +1703,7 @@ void Context::applyState(GLenum drawMode) ...@@ -1681,7 +1703,7 @@ void Context::applyState(GLenum drawMode)
{ {
if (mState.polygonOffsetFill) if (mState.polygonOffsetFill)
{ {
gl::DepthStencilbuffer *depthbuffer = getFramebuffer()->getDepthbuffer(); gl::DepthStencilbuffer *depthbuffer = framebufferObject->getDepthbuffer();
if (depthbuffer) if (depthbuffer)
{ {
device->SetRenderState(D3DRS_SLOPESCALEDEPTHBIAS, *((DWORD*)&mState.polygonOffsetFactor)); device->SetRenderState(D3DRS_SLOPESCALEDEPTHBIAS, *((DWORD*)&mState.polygonOffsetFactor));
...@@ -1876,7 +1898,7 @@ void Context::applyTextures() ...@@ -1876,7 +1898,7 @@ void Context::applyTextures()
void Context::readPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, void* pixels) void Context::readPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, void* pixels)
{ {
Framebuffer *framebuffer = getFramebuffer(); Framebuffer *framebuffer = getReadFramebuffer();
if (framebuffer->completeness() != GL_FRAMEBUFFER_COMPLETE) if (framebuffer->completeness() != GL_FRAMEBUFFER_COMPLETE)
{ {
...@@ -2110,7 +2132,7 @@ void Context::readPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum ...@@ -2110,7 +2132,7 @@ void Context::readPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum
void Context::clear(GLbitfield mask) void Context::clear(GLbitfield mask)
{ {
Framebuffer *framebufferObject = getFramebuffer(); Framebuffer *framebufferObject = getDrawFramebuffer();
if (!framebufferObject || framebufferObject->completeness() != GL_FRAMEBUFFER_COMPLETE) if (!framebufferObject || framebufferObject->completeness() != GL_FRAMEBUFFER_COMPLETE)
{ {
...@@ -2639,11 +2661,17 @@ void Context::detachTexture(GLuint texture) ...@@ -2639,11 +2661,17 @@ void Context::detachTexture(GLuint texture)
// as if FramebufferTexture2D had been called, with a texture of 0, for each attachment point to which this // as if FramebufferTexture2D had been called, with a texture of 0, for each attachment point to which this
// image was attached in the currently bound framebuffer. // image was attached in the currently bound framebuffer.
Framebuffer *framebuffer = getFramebuffer(); Framebuffer *readFramebuffer = getReadFramebuffer();
Framebuffer *drawFramebuffer = getDrawFramebuffer();
if (readFramebuffer)
{
readFramebuffer->detachTexture(texture);
}
if (framebuffer) if (drawFramebuffer && drawFramebuffer != readFramebuffer)
{ {
framebuffer->detachTexture(texture); drawFramebuffer->detachTexture(texture);
} }
} }
...@@ -2653,9 +2681,14 @@ void Context::detachFramebuffer(GLuint framebuffer) ...@@ -2653,9 +2681,14 @@ void Context::detachFramebuffer(GLuint framebuffer)
// If a framebuffer that is currently bound to the target FRAMEBUFFER is deleted, it is as though // If a framebuffer that is currently bound to the target FRAMEBUFFER is deleted, it is as though
// BindFramebuffer had been executed with the target of FRAMEBUFFER and framebuffer of zero. // BindFramebuffer had been executed with the target of FRAMEBUFFER and framebuffer of zero.
if (mState.framebuffer == framebuffer) if (mState.readFramebuffer == framebuffer)
{ {
bindFramebuffer(0); bindReadFramebuffer(0);
}
if (mState.drawFramebuffer == framebuffer)
{
bindDrawFramebuffer(0);
} }
} }
...@@ -2675,11 +2708,17 @@ void Context::detachRenderbuffer(GLuint renderbuffer) ...@@ -2675,11 +2708,17 @@ void Context::detachRenderbuffer(GLuint renderbuffer)
// then it is as if FramebufferRenderbuffer had been called, with a renderbuffer of 0, for each attachment // then it is as if FramebufferRenderbuffer had been called, with a renderbuffer of 0, for each attachment
// point to which this image was attached in the currently bound framebuffer. // point to which this image was attached in the currently bound framebuffer.
Framebuffer *framebuffer = getFramebuffer(); Framebuffer *readFramebuffer = getReadFramebuffer();
Framebuffer *drawFramebuffer = getDrawFramebuffer();
if (framebuffer) if (readFramebuffer)
{ {
framebuffer->detachRenderbuffer(renderbuffer); readFramebuffer->detachRenderbuffer(renderbuffer);
}
if (drawFramebuffer && drawFramebuffer != readFramebuffer)
{
drawFramebuffer->detachRenderbuffer(renderbuffer);
} }
} }
...@@ -2751,23 +2790,6 @@ bool Context::isTriangleMode(GLenum drawMode) ...@@ -2751,23 +2790,6 @@ bool Context::isTriangleMode(GLenum drawMode)
return false; return false;
} }
bool Context::hasStencil()
{
Framebuffer *framebufferObject = getFramebuffer();
if (framebufferObject && framebufferObject->getStencilbufferType() != GL_NONE)
{
DepthStencilbuffer *stencilbufferObject = framebufferObject->getStencilbuffer();
if (stencilbufferObject)
{
return stencilbufferObject->getStencilSize() > 0;
}
}
return false;
}
void Context::setVertexAttrib(GLuint index, const GLfloat *values) void Context::setVertexAttrib(GLuint index, const GLfloat *values)
{ {
ASSERT(index < gl::MAX_VERTEX_ATTRIBS); ASSERT(index < gl::MAX_VERTEX_ATTRIBS);
......
...@@ -181,7 +181,8 @@ struct State ...@@ -181,7 +181,8 @@ struct State
BindingPointer<Buffer> elementArrayBuffer; BindingPointer<Buffer> elementArrayBuffer;
BindingPointer<Texture> texture2D; BindingPointer<Texture> texture2D;
BindingPointer<Texture> textureCubeMap; BindingPointer<Texture> textureCubeMap;
GLuint framebuffer; GLuint readFramebuffer;
GLuint drawFramebuffer;
BindingPointer<Renderbuffer> renderbuffer; BindingPointer<Renderbuffer> renderbuffer;
GLuint currentProgram; GLuint currentProgram;
...@@ -273,7 +274,8 @@ class Context ...@@ -273,7 +274,8 @@ class Context
void setActiveSampler(int active); void setActiveSampler(int active);
GLuint getFramebufferHandle() const; GLuint getReadFramebufferHandle() const;
GLuint getDrawFramebufferHandle() const;
GLuint getRenderbufferHandle() const; GLuint getRenderbufferHandle() const;
GLuint getArrayBufferHandle() const; GLuint getArrayBufferHandle() const;
...@@ -314,7 +316,8 @@ class Context ...@@ -314,7 +316,8 @@ class Context
void bindElementArrayBuffer(GLuint buffer); void bindElementArrayBuffer(GLuint buffer);
void bindTexture2D(GLuint texture); void bindTexture2D(GLuint texture);
void bindTextureCubeMap(GLuint texture); void bindTextureCubeMap(GLuint texture);
void bindFramebuffer(GLuint framebuffer); void bindReadFramebuffer(GLuint framebuffer);
void bindDrawFramebuffer(GLuint framebuffer);
void bindRenderbuffer(GLuint renderbuffer); void bindRenderbuffer(GLuint renderbuffer);
void useProgram(GLuint program); void useProgram(GLuint program);
...@@ -337,7 +340,8 @@ class Context ...@@ -337,7 +340,8 @@ class Context
Texture2D *getTexture2D(); Texture2D *getTexture2D();
TextureCubeMap *getTextureCubeMap(); TextureCubeMap *getTextureCubeMap();
Texture *getSamplerTexture(unsigned int sampler, SamplerType type); Texture *getSamplerTexture(unsigned int sampler, SamplerType type);
Framebuffer *getFramebuffer(); Framebuffer *getReadFramebuffer();
Framebuffer *getDrawFramebuffer();
bool getFloatv(GLenum pname, GLfloat *params); bool getFloatv(GLenum pname, GLfloat *params);
bool getIntegerv(GLenum pname, GLint *params); bool getIntegerv(GLenum pname, GLint *params);
...@@ -390,7 +394,6 @@ class Context ...@@ -390,7 +394,6 @@ class Context
bool cullSkipsDraw(GLenum drawMode); bool cullSkipsDraw(GLenum drawMode);
bool isTriangleMode(GLenum drawMode); bool isTriangleMode(GLenum drawMode);
bool hasStencil();
const egl::Config *const mConfig; const egl::Config *const mConfig;
......
...@@ -224,6 +224,21 @@ GLuint Framebuffer::getStencilbufferHandle() ...@@ -224,6 +224,21 @@ GLuint Framebuffer::getStencilbufferHandle()
return mStencilbufferPointer.id(); return mStencilbufferPointer.id();
} }
bool Framebuffer::hasStencil()
{
if (mStencilbufferType != GL_NONE)
{
DepthStencilbuffer *stencilbufferObject = getStencilbuffer();
if (stencilbufferObject)
{
return stencilbufferObject->getStencilSize() > 0;
}
}
return false;
}
GLenum Framebuffer::completeness() GLenum Framebuffer::completeness()
{ {
int width = 0; int width = 0;
......
...@@ -57,6 +57,8 @@ class Framebuffer ...@@ -57,6 +57,8 @@ class Framebuffer
GLuint getDepthbufferHandle(); GLuint getDepthbufferHandle();
GLuint getStencilbufferHandle(); GLuint getStencilbufferHandle();
bool hasStencil();
virtual GLenum completeness(); virtual GLenum completeness();
protected: protected:
......
...@@ -180,7 +180,7 @@ void __stdcall glBindFramebuffer(GLenum target, GLuint framebuffer) ...@@ -180,7 +180,7 @@ void __stdcall glBindFramebuffer(GLenum target, GLuint framebuffer)
try try
{ {
if (target != GL_FRAMEBUFFER) if (target != GL_FRAMEBUFFER && target != GL_DRAW_FRAMEBUFFER_ANGLE && target != GL_READ_FRAMEBUFFER_ANGLE)
{ {
return error(GL_INVALID_ENUM); return error(GL_INVALID_ENUM);
} }
...@@ -189,7 +189,15 @@ void __stdcall glBindFramebuffer(GLenum target, GLuint framebuffer) ...@@ -189,7 +189,15 @@ void __stdcall glBindFramebuffer(GLenum target, GLuint framebuffer)
if (context) 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&) catch(std::bad_alloc&)
...@@ -559,7 +567,7 @@ GLenum __stdcall glCheckFramebufferStatus(GLenum target) ...@@ -559,7 +567,7 @@ GLenum __stdcall glCheckFramebufferStatus(GLenum target)
try 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); return error(GL_INVALID_ENUM, 0);
} }
...@@ -568,7 +576,15 @@ GLenum __stdcall glCheckFramebufferStatus(GLenum target) ...@@ -568,7 +576,15 @@ GLenum __stdcall glCheckFramebufferStatus(GLenum target)
if (context) 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(); return framebuffer->completeness();
} }
...@@ -848,7 +864,7 @@ void __stdcall glCopyTexImage2D(GLenum target, GLint level, GLenum internalforma ...@@ -848,7 +864,7 @@ void __stdcall glCopyTexImage2D(GLenum target, GLint level, GLenum internalforma
if (context) if (context)
{ {
gl::Framebuffer *framebuffer = context->getFramebuffer(); gl::Framebuffer *framebuffer = context->getReadFramebuffer();
if (framebuffer->completeness() != GL_FRAMEBUFFER_COMPLETE) if (framebuffer->completeness() != GL_FRAMEBUFFER_COMPLETE)
{ {
return error(GL_INVALID_FRAMEBUFFER_OPERATION); return error(GL_INVALID_FRAMEBUFFER_OPERATION);
...@@ -921,7 +937,7 @@ void __stdcall glCopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GL ...@@ -921,7 +937,7 @@ void __stdcall glCopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GL
if (context) if (context)
{ {
gl::Framebuffer *framebuffer = context->getFramebuffer(); gl::Framebuffer *framebuffer = context->getReadFramebuffer();
if (framebuffer->completeness() != GL_FRAMEBUFFER_COMPLETE) if (framebuffer->completeness() != GL_FRAMEBUFFER_COMPLETE)
{ {
return error(GL_INVALID_FRAMEBUFFER_OPERATION); return error(GL_INVALID_FRAMEBUFFER_OPERATION);
...@@ -1569,7 +1585,8 @@ void __stdcall glFramebufferRenderbuffer(GLenum target, GLenum attachment, GLenu ...@@ -1569,7 +1585,8 @@ void __stdcall glFramebufferRenderbuffer(GLenum target, GLenum attachment, GLenu
try 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); return error(GL_INVALID_ENUM);
} }
...@@ -1578,9 +1595,20 @@ void __stdcall glFramebufferRenderbuffer(GLenum target, GLenum attachment, GLenu ...@@ -1578,9 +1595,20 @@ void __stdcall glFramebufferRenderbuffer(GLenum target, GLenum attachment, GLenu
if (context) 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); return error(GL_INVALID_OPERATION);
} }
...@@ -1614,7 +1642,7 @@ void __stdcall glFramebufferTexture2D(GLenum target, GLenum attachment, GLenum t ...@@ -1614,7 +1642,7 @@ void __stdcall glFramebufferTexture2D(GLenum target, GLenum attachment, GLenum t
try try
{ {
if (target != GL_FRAMEBUFFER) if (target != GL_FRAMEBUFFER && target != GL_DRAW_FRAMEBUFFER_ANGLE && target != GL_READ_FRAMEBUFFER_ANGLE)
{ {
return error(GL_INVALID_ENUM); return error(GL_INVALID_ENUM);
} }
...@@ -1677,9 +1705,20 @@ void __stdcall glFramebufferTexture2D(GLenum target, GLenum attachment, GLenum t ...@@ -1677,9 +1705,20 @@ void __stdcall glFramebufferTexture2D(GLenum target, GLenum attachment, GLenum t
} }
} }
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); return error(GL_INVALID_OPERATION);
} }
...@@ -2235,14 +2274,29 @@ void __stdcall glGetFramebufferAttachmentParameteriv(GLenum target, GLenum attac ...@@ -2235,14 +2274,29 @@ void __stdcall glGetFramebufferAttachmentParameteriv(GLenum target, GLenum attac
if (context) if (context)
{ {
if (context->getFramebufferHandle() == 0) if (target != GL_FRAMEBUFFER && target != GL_DRAW_FRAMEBUFFER_ANGLE && target != GL_READ_FRAMEBUFFER_ANGLE)
{ {
return error(GL_INVALID_OPERATION); return error(GL_INVALID_ENUM);
} }
if (target != GL_FRAMEBUFFER) gl::Framebuffer *framebuffer = NULL;
if (target == GL_READ_FRAMEBUFFER_ANGLE)
{ {
return error(GL_INVALID_ENUM); 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; GLenum attachmentType;
...@@ -2250,16 +2304,16 @@ void __stdcall glGetFramebufferAttachmentParameteriv(GLenum target, GLenum attac ...@@ -2250,16 +2304,16 @@ void __stdcall glGetFramebufferAttachmentParameteriv(GLenum target, GLenum attac
switch (attachment) switch (attachment)
{ {
case GL_COLOR_ATTACHMENT0: case GL_COLOR_ATTACHMENT0:
attachmentType = context->getFramebuffer()->getColorbufferType(); attachmentType = framebuffer->getColorbufferType();
attachmentHandle = context->getFramebuffer()->getColorbufferHandle(); attachmentHandle = framebuffer->getColorbufferHandle();
break; break;
case GL_DEPTH_ATTACHMENT: case GL_DEPTH_ATTACHMENT:
attachmentType = context->getFramebuffer()->getDepthbufferType(); attachmentType = framebuffer->getDepthbufferType();
attachmentHandle = context->getFramebuffer()->getDepthbufferHandle(); attachmentHandle = framebuffer->getDepthbufferHandle();
break; break;
case GL_STENCIL_ATTACHMENT: case GL_STENCIL_ATTACHMENT:
attachmentType = context->getFramebuffer()->getStencilbufferType(); attachmentType = framebuffer->getStencilbufferType();
attachmentHandle = context->getFramebuffer()->getStencilbufferHandle(); attachmentHandle = framebuffer->getStencilbufferHandle();
break; break;
default: return error(GL_INVALID_ENUM); default: return error(GL_INVALID_ENUM);
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment