void
WebGLFramebuffer::FramebufferRenderbuffer(GLenum target,
                                          GLenum attachment,
                                          GLenum rbtarget,
                                          WebGLRenderbuffer* wrb)
{
    MOZ_ASSERT(mContext->mBoundFramebuffer == this);

    if (!mContext->ValidateObjectAllowNull("framebufferRenderbuffer: renderbuffer", wrb))
        return;

    if (target != LOCAL_GL_FRAMEBUFFER)
        return mContext->ErrorInvalidEnumInfo("framebufferRenderbuffer: target", target);

    if (rbtarget != LOCAL_GL_RENDERBUFFER)
        return mContext->ErrorInvalidEnumInfo("framebufferRenderbuffer: renderbuffer target:", rbtarget);

    /* Get the requested attachment. If result is NULL, attachment is
     * invalid and an error is generated.
     *
     * Don't use GetAttachment(...) here because it opt builds it
     * returns mColorAttachment[0] for invalid attachment, which we
     * really don't want to mess with.
     */
    Attachment* a = GetAttachmentOrNull(attachment);
    if (!a)
        return; // Error generated internally to GetAttachmentOrNull.

    /* Invalidate cached framebuffer status and inform texture of it's
     * new attachment
     */
    mStatus = 0;
    // Detach current
    if (a->Texture())
        a->Texture()->DetachFrom(this, attachment);
    else if (a->Renderbuffer())
        a->Renderbuffer()->DetachFrom(this, attachment);

    // Attach new
    if (wrb)
        wrb->AttachTo(this, attachment);

    a->SetRenderbuffer(wrb);
}
Example #2
0
void
WebGLFramebuffer::FramebufferRenderbuffer(FBAttachment attachPoint,
                                          RBTarget rbtarget,
                                          WebGLRenderbuffer* rb)
{
    MOZ_ASSERT(mContext->mBoundDrawFramebuffer == this ||
               mContext->mBoundReadFramebuffer == this);

    if (!mContext->ValidateObjectAllowNull("framebufferRenderbuffer: renderbuffer",
                                           rb))
    {
        return;
    }

    /* Get the requested attachment. If result is NULL, attachment is invalid
     * and an error is generated.
     *
     * Don't use GetAttachment(...) here because it opt builds it returns
     * mColorAttachment[0] for invalid attachment, which we really don't want to
     * mess with.
     */
    Attachment* attachment = GetAttachmentOrNull(attachPoint);
    if (!attachment)
        return; // Error generated internally to GetAttachmentOrNull.

    // Invalidate cached framebuffer status and inform texture of its new
    // attachment.
    mStatus = 0;

    // Detach current:
    if (attachment->Texture())
        attachment->Texture()->DetachFrom(this, attachPoint);
    else if (attachment->Renderbuffer())
        attachment->Renderbuffer()->DetachFrom(this, attachPoint);

    // Attach new:
    if (rb)
        rb->AttachTo(this, attachPoint);

    attachment->SetRenderbuffer(rb);
}