summaryrefslogtreecommitdiffstats
path: root/Source/ThirdParty/ANGLE/src/libGLESv2/Framebuffer.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Source/ThirdParty/ANGLE/src/libGLESv2/Framebuffer.cpp')
-rw-r--r--Source/ThirdParty/ANGLE/src/libGLESv2/Framebuffer.cpp54
1 files changed, 35 insertions, 19 deletions
diff --git a/Source/ThirdParty/ANGLE/src/libGLESv2/Framebuffer.cpp b/Source/ThirdParty/ANGLE/src/libGLESv2/Framebuffer.cpp
index 5c4bc99..5fe01e0 100644
--- a/Source/ThirdParty/ANGLE/src/libGLESv2/Framebuffer.cpp
+++ b/Source/ThirdParty/ANGLE/src/libGLESv2/Framebuffer.cpp
@@ -305,13 +305,32 @@ GLenum Framebuffer::completeness()
return GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT;
}
- if (IsTextureTarget(mColorbufferType))
+ if (mColorbufferType == GL_RENDERBUFFER)
+ {
+ if (!gl::IsColorRenderable(colorbuffer->getFormat()))
+ {
+ return GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT;
+ }
+ }
+ else if (IsTextureTarget(mColorbufferType))
{
if (IsCompressed(colorbuffer->getFormat()))
{
return GL_FRAMEBUFFER_UNSUPPORTED;
}
+
+ if (colorbuffer->isFloatingPoint() && (!getContext()->supportsFloatRenderableTextures() ||
+ !getContext()->supportsHalfFloatRenderableTextures()))
+ {
+ return GL_FRAMEBUFFER_UNSUPPORTED;
+ }
+
+ if (colorbuffer->getFormat() == GL_LUMINANCE || colorbuffer->getFormat() == GL_LUMINANCE_ALPHA)
+ {
+ return GL_FRAMEBUFFER_UNSUPPORTED;
+ }
}
+ else UNREACHABLE();
width = colorbuffer->getWidth();
height = colorbuffer->getHeight();
@@ -327,6 +346,11 @@ GLenum Framebuffer::completeness()
if (mDepthbufferType != GL_NONE)
{
+ if (mDepthbufferType != GL_RENDERBUFFER)
+ {
+ return GL_FRAMEBUFFER_UNSUPPORTED; // Requires GL_OES_depth_texture
+ }
+
depthbuffer = getDepthbuffer();
if (!depthbuffer)
@@ -357,18 +381,15 @@ GLenum Framebuffer::completeness()
{
return GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_ANGLE;
}
-
- if (IsTextureTarget(mDepthbufferType))
- {
- if (IsCompressed(depthbuffer->getFormat()))
- {
- return GL_FRAMEBUFFER_UNSUPPORTED;
- }
- }
}
if (mStencilbufferType != GL_NONE)
{
+ if (mStencilbufferType != GL_RENDERBUFFER)
+ {
+ return GL_FRAMEBUFFER_UNSUPPORTED;
+ }
+
stencilbuffer = getStencilbuffer();
if (!stencilbuffer)
@@ -399,14 +420,6 @@ GLenum Framebuffer::completeness()
{
return GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_ANGLE;
}
-
- if (IsTextureTarget(mStencilbufferType))
- {
- if (IsCompressed(stencilbuffer->getFormat()))
- {
- return GL_FRAMEBUFFER_UNSUPPORTED;
- }
- }
}
if (mDepthbufferType == GL_RENDERBUFFER && mStencilbufferType == GL_RENDERBUFFER)
@@ -425,8 +438,8 @@ GLenum Framebuffer::completeness()
DefaultFramebuffer::DefaultFramebuffer(Colorbuffer *color, DepthStencilbuffer *depthStencil)
{
mColorbufferType = GL_RENDERBUFFER;
- mDepthbufferType = GL_RENDERBUFFER;
- mStencilbufferType = GL_RENDERBUFFER;
+ mDepthbufferType = (depthStencil->getDepthSize() != 0) ? GL_RENDERBUFFER : GL_NONE;
+ mStencilbufferType = (depthStencil->getStencilSize() != 0) ? GL_RENDERBUFFER : GL_NONE;
mColorbufferPointer.set(new Renderbuffer(0, color));
@@ -449,6 +462,9 @@ int Framebuffer::getSamples()
GLenum DefaultFramebuffer::completeness()
{
+ // The default framebuffer should always be complete
+ ASSERT(Framebuffer::completeness() == GL_FRAMEBUFFER_COMPLETE);
+
return GL_FRAMEBUFFER_COMPLETE;
}