void Framebuffer::detachTexture(GLuint texture) { if (mColorbufferPointer.id() == texture && IsTextureTarget(mColorbufferType)) { mColorbufferType = GL_NONE; mColorbufferPointer.set(NULL); } if (mDepthbufferPointer.id() == texture && IsTextureTarget(mDepthbufferType)) { mDepthbufferType = GL_NONE; mDepthbufferPointer.set(NULL); } if (mStencilbufferPointer.id() == texture && IsTextureTarget(mStencilbufferType)) { mStencilbufferType = GL_NONE; mStencilbufferPointer.set(NULL); } }
void Framebuffer::detachTexture(GLuint texture) { if(mColorbufferPointer.name() == texture && IsTextureTarget(mColorbufferType)) { mColorbufferType = GL_NONE_OES; mColorbufferPointer = nullptr; } if(mDepthbufferPointer.name() == texture && IsTextureTarget(mDepthbufferType)) { mDepthbufferType = GL_NONE_OES; mDepthbufferPointer = nullptr; } if(mStencilbufferPointer.name() == texture && IsTextureTarget(mStencilbufferType)) { mStencilbufferType = GL_NONE_OES; mStencilbufferPointer = nullptr; } }
Error Display::createImage(gl::Context *context, EGLenum target, EGLClientBuffer buffer, const AttributeMap &attribs, Image **outImage) { ASSERT(isInitialized()); if (mImplementation->testDeviceLost()) { Error error = restoreLostDevice(); if (error.isError()) { return error; } } egl::ImageSibling *sibling = nullptr; if (IsTextureTarget(target)) { sibling = context->getTexture(egl_gl::EGLClientBufferToGLObjectHandle(buffer)); } else if (IsRenderbufferTarget(target)) { sibling = context->getRenderbuffer(egl_gl::EGLClientBufferToGLObjectHandle(buffer)); } else { UNREACHABLE(); } ASSERT(sibling != nullptr); rx::ImageImpl *imageImpl = mImplementation->createImage(target, sibling, attribs); ASSERT(imageImpl != nullptr); Error error = imageImpl->initialize(); if (error.isError()) { return error; } Image *image = new Image(imageImpl, target, sibling, attribs); ASSERT(outImage != nullptr); *outImage = image; // Add this image to the list of all images and hold a ref to it. image->addRef(); mImageSet.insert(image); return Error(EGL_SUCCESS); }
Renderbuffer *Framebuffer::lookupRenderbuffer(GLenum type, GLuint handle) const { Context *context = getContext(); Renderbuffer *buffer = nullptr; if(type == GL_NONE_OES) { buffer = nullptr; } else if(type == GL_RENDERBUFFER_OES) { buffer = context->getRenderbuffer(handle); } else if(IsTextureTarget(type)) { buffer = context->getTexture(handle)->getRenderbuffer(type); } else UNREACHABLE(type); return buffer; }
Image::Image(rx::ImageImpl *impl, EGLenum target, ImageSibling *buffer, const AttributeMap &attribs) : RefCountObject(0), mImplementation(impl), mInternalFormat(GL_NONE), mWidth(0), mHeight(0), mSamples(0), mSource(), mTargets() { ASSERT(mImplementation != nullptr); ASSERT(buffer != nullptr); mSource.set(buffer); mSource->addImageSource(this); if (IsTextureTarget(target)) { gl::Texture *texture = rx::GetAs<gl::Texture>(mSource.get()); GLenum textureTarget = egl_gl::EGLImageTargetToGLTextureTarget(target); size_t level = attribs.get(EGL_GL_TEXTURE_LEVEL_KHR, 0); mInternalFormat = texture->getInternalFormat(textureTarget, level); mWidth = texture->getWidth(textureTarget, level); mHeight = texture->getHeight(textureTarget, level); mSamples = 0; } else if (IsRenderbufferTarget(target)) { gl::Renderbuffer *renderbuffer = rx::GetAs<gl::Renderbuffer>(mSource.get()); mInternalFormat = renderbuffer->getInternalFormat(); mWidth = renderbuffer->getWidth(); mHeight = renderbuffer->getHeight(); mSamples = renderbuffer->getSamples(); } else { UNREACHABLE(); } }
Renderbuffer *Framebuffer::lookupRenderbuffer(GLenum type, GLuint handle) const { gl::Context *context = gl::getContext(); Renderbuffer *buffer = NULL; if (type == GL_NONE) { buffer = NULL; } else if (type == GL_RENDERBUFFER) { buffer = context->getRenderbuffer(handle); } else if (IsTextureTarget(type)) { buffer = context->getTexture(handle)->getColorbuffer(type); } else { UNREACHABLE(); } return buffer; }
GLenum Framebuffer::completeness() { int width = 0; int height = 0; int samples = -1; if (mColorbufferType != GL_NONE) { Colorbuffer *colorbuffer = getColorbuffer(); if (!colorbuffer) { return GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT; } if (colorbuffer->getWidth() == 0 || colorbuffer->getHeight() == 0) { return GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT; } if (IsTextureTarget(mColorbufferType)) { if (IsCompressed(colorbuffer->getFormat())) { return GL_FRAMEBUFFER_UNSUPPORTED; } } width = colorbuffer->getWidth(); height = colorbuffer->getHeight(); samples = colorbuffer->getSamples(); } else { return GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT; } DepthStencilbuffer *depthbuffer = NULL; DepthStencilbuffer *stencilbuffer = NULL; if (mDepthbufferType != GL_NONE) { depthbuffer = getDepthbuffer(); if (!depthbuffer) { return GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT; } if (depthbuffer->getWidth() == 0 || depthbuffer->getHeight() == 0) { return GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT; } if (width == 0) { width = depthbuffer->getWidth(); height = depthbuffer->getHeight(); } else if (width != depthbuffer->getWidth() || height != depthbuffer->getHeight()) { return GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS; } if (samples == -1) { samples = depthbuffer->getSamples(); } else if (samples != depthbuffer->getSamples()) { return GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_ANGLE; } if (IsTextureTarget(mDepthbufferType)) { if (IsCompressed(depthbuffer->getFormat())) { return GL_FRAMEBUFFER_UNSUPPORTED; } } } if (mStencilbufferType != GL_NONE) { stencilbuffer = getStencilbuffer(); if (!stencilbuffer) { return GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT; } if (stencilbuffer->getWidth() == 0 || stencilbuffer->getHeight() == 0) { return GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT; } if (width == 0) { width = stencilbuffer->getWidth(); height = stencilbuffer->getHeight(); } else if (width != stencilbuffer->getWidth() || height != stencilbuffer->getHeight()) { return GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS; } if (samples == -1) { samples = stencilbuffer->getSamples(); } else if (samples != stencilbuffer->getSamples()) { return GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_ANGLE; } if (IsTextureTarget(mStencilbufferType)) { if (IsCompressed(stencilbuffer->getFormat())) { return GL_FRAMEBUFFER_UNSUPPORTED; } } } if (mDepthbufferType == GL_RENDERBUFFER && mStencilbufferType == GL_RENDERBUFFER) { if (depthbuffer->getFormat() != GL_DEPTH24_STENCIL8_OES || stencilbuffer->getFormat() != GL_DEPTH24_STENCIL8_OES || depthbuffer->getSerial() != stencilbuffer->getSerial()) { return GL_FRAMEBUFFER_UNSUPPORTED; } } return GL_FRAMEBUFFER_COMPLETE; }
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; }