bool Texture2D::isDepth(GLenum target, GLint level) const { return IsDepthTexture(getFormat(target, level)); }
GLenum Framebuffer::completeness(int &width, int &height, int &samples) { width = -1; height = -1; samples = -1; if(mColorbufferType != GL_NONE_OES) { Renderbuffer *colorbuffer = getColorbuffer(); if(!colorbuffer) { return GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT_OES; } if(colorbuffer->getWidth() == 0 || colorbuffer->getHeight() == 0) { return GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT_OES; } if(mColorbufferType == GL_RENDERBUFFER_OES) { if(!IsColorRenderable(colorbuffer->getFormat())) { return GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT_OES; } } else if(IsTextureTarget(mColorbufferType)) { GLenum format = colorbuffer->getFormat(); if(!IsColorRenderable(format)) { return GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT_OES; } if(IsDepthTexture(format) || IsStencilTexture(format)) { return GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT_OES; } } else { UNREACHABLE(mColorbufferType); return GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT_OES; } width = colorbuffer->getWidth(); height = colorbuffer->getHeight(); samples = colorbuffer->getSamples(); } Renderbuffer *depthbuffer = nullptr; Renderbuffer *stencilbuffer = nullptr; if(mDepthbufferType != GL_NONE_OES) { depthbuffer = getDepthbuffer(); if(!depthbuffer) { return GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT_OES; } if(depthbuffer->getWidth() == 0 || depthbuffer->getHeight() == 0) { return GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT_OES; } if(mDepthbufferType == GL_RENDERBUFFER_OES) { if(!es1::IsDepthRenderable(depthbuffer->getFormat())) { return GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT_OES; } } else if(IsTextureTarget(mDepthbufferType)) { if(!es1::IsDepthTexture(depthbuffer->getFormat())) { return GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT_OES; } } else { UNREACHABLE(mDepthbufferType); return GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT_OES; } if(width == -1 || height == -1) { width = depthbuffer->getWidth(); height = depthbuffer->getHeight(); samples = depthbuffer->getSamples(); } else if(width != depthbuffer->getWidth() || height != depthbuffer->getHeight()) { return GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS_OES; } else if(samples != depthbuffer->getSamples()) { UNREACHABLE(0); } } if(mStencilbufferType != GL_NONE_OES) { stencilbuffer = getStencilbuffer(); if(!stencilbuffer) { return GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT_OES; } if(stencilbuffer->getWidth() == 0 || stencilbuffer->getHeight() == 0) { return GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT_OES; } if(mStencilbufferType == GL_RENDERBUFFER_OES) { if(!es1::IsStencilRenderable(stencilbuffer->getFormat())) { return GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT_OES; } } else if(IsTextureTarget(mStencilbufferType)) { GLenum internalformat = stencilbuffer->getFormat(); if(!es1::IsStencilTexture(internalformat)) { return GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT_OES; } } else { UNREACHABLE(mStencilbufferType); return GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT_OES; } if(width == -1 || height == -1) { width = stencilbuffer->getWidth(); height = stencilbuffer->getHeight(); samples = stencilbuffer->getSamples(); } else if(width != stencilbuffer->getWidth() || height != stencilbuffer->getHeight()) { return GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS_OES; } else if(samples != stencilbuffer->getSamples()) { UNREACHABLE(0); return GL_FRAMEBUFFER_UNSUPPORTED_OES; // GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_OES; } } // We need to have at least one attachment to be complete if(width == -1 || height == -1) { return GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT_OES; } return GL_FRAMEBUFFER_COMPLETE_OES; }