GL_API GLboolean GL_APIENTRY glIsFramebufferOES (GLuint framebuffer)
{
	if (framebuffer == 0 || !fglFramebufferObjects.isValid(framebuffer))
		return GL_FALSE;

	return GL_TRUE;
}
GL_API void GL_APIENTRY glFramebufferRenderbufferOES(GLenum target,
				GLenum attachment, GLenum renderbuffertarget,
				GLuint renderbuffer)
{
	if(target != GL_FRAMEBUFFER_OES) {
		setError(GL_INVALID_OPERATION);
		return;
	}

	FGLRenderbuffer *rb = NULL;
	if (renderbuffer != 0) {
		if (renderbuffertarget != GL_RENDERBUFFER_OES) {
			setError(GL_INVALID_OPERATION);
			return;
		}

		if(!fglRenderbufferObjects.isValid(renderbuffer)) {
			setError(GL_INVALID_OPERATION);
			return;
		}

		rb = fglRenderbufferObjects[renderbuffer];
		if(rb == NULL) {
			rb = new FGLRenderbuffer(renderbuffer);
			if (rb == NULL) {
				setError(GL_OUT_OF_MEMORY);
				return;
			}
			fglRenderbufferObjects[renderbuffer] = rb;
		}
	}

	FGLContext *ctx = getContext();

	if (!ctx->framebuffer.binding.isBound()) {
		setError(GL_INVALID_OPERATION);
		return;
	}

	FGLFramebuffer *fb = ctx->framebuffer.binding.get();

	FGLAttachmentIndex index;
	switch (attachment)
	{
	case GL_COLOR_ATTACHMENT0_OES:
		index = FGL_ATTACHMENT_COLOR;
		break;
	case GL_DEPTH_ATTACHMENT_OES:
		index = FGL_ATTACHMENT_DEPTH;
		break;
	case GL_STENCIL_ATTACHMENT_OES:
		index = FGL_ATTACHMENT_STENCIL;
		break;
	default:
		setError(GL_INVALID_ENUM);
		return;
	}

	fb->attach(index, rb);
}
GL_API GLboolean GL_APIENTRY glIsRenderbufferOES (GLuint renderbuffer)
{
	if (renderbuffer == 0 || !fglRenderbufferObjects.isValid(renderbuffer))
		return GL_FALSE;

	return GL_TRUE;
}
Example #4
0
GL_API void GL_APIENTRY glBindRenderbufferOES (GLenum target, GLuint renderbuffer)
{
	//FUNCTION_TRACER;
	if(target != GL_RENDERBUFFER_OES) {
		setError(GL_INVALID_ENUM);
		return;
	}

	if(renderbuffer == 0) {
		FGLContext *ctx = getContext();
		ctx->renderbuffer.unbind();
		return;
	}

	if(!fglRenderbufferObjects.isValid(renderbuffer)) {
		setError(GL_INVALID_VALUE);
		return;
	}

	FGLContext *ctx = getContext();

	FGLRenderBufferObject *obj = fglRenderbufferObjects[renderbuffer];
	if(obj == NULL) {
		obj = new FGLRenderBufferObject(renderbuffer);
		if (obj == NULL) {
			setError(GL_OUT_OF_MEMORY);
			return;
		}
		fglRenderbufferObjects[renderbuffer] = obj;
	}

	obj->bind(&ctx->renderbuffer);
}
GL_API void GL_APIENTRY glDeleteFramebuffersOES (GLsizei n, const GLuint* framebuffers)
{
	unsigned name;

	if(n <= 0)
		return;

	while(n--) {
		name = *framebuffers;
		framebuffers++;

		if(!fglFramebufferObjects.isValid(name)) {
			ALOGD("Tried to free invalid framebuffer %d", name);
			continue;
		}

		delete (fglFramebufferObjects[name]);
		fglFramebufferObjects.put(name);
	}
}
GL_API void GL_APIENTRY glDeleteRenderbuffersOES (GLsizei n, const GLuint* renderbuffers)
{
	unsigned name;

	if(n <= 0)
		return;

	do {
		name = *renderbuffers;
		renderbuffers++;

		if(!fglRenderbufferObjects.isValid(name)) {
			ALOGD("Tried to free invalid renderbuffer %d", name);
			continue;
		}

		delete (fglRenderbufferObjects[name]);
		fglRenderbufferObjects.put(name);
	} while (--n);
}
GL_API void GL_APIENTRY glBindFramebufferOES (GLenum target, GLuint framebuffer)
{
	FGLFramebufferObjectBinding *binding;

	FGLContext *ctx = getContext();

	switch (target) {
	case GL_FRAMEBUFFER_OES:
		binding = &ctx->framebuffer.binding;
		break;
	default:
		setError(GL_INVALID_ENUM);
		return;
	}

	if(framebuffer == 0) {
		binding->bind(0);
		return;
	}

	if(!fglFramebufferObjects.isValid(framebuffer)
	    && fglFramebufferObjects.get(framebuffer, ctx) < 0) {
		setError(GL_INVALID_VALUE);
		return;
	}

	FGLFramebuffer *fb = fglFramebufferObjects[framebuffer];
	if(fb == NULL) {
		fb = new FGLFramebuffer(framebuffer);
		if (fb == NULL) {
			setError(GL_OUT_OF_MEMORY);
			return;
		}
		fglFramebufferObjects[framebuffer] = fb;
	}

	binding->bind(&fb->object);
}
GL_API void GL_APIENTRY glBindRenderbufferOES (GLenum target, GLuint renderbuffer)
{
	FGLRenderbufferBinding *binding;

	FGLContext *ctx = getContext();

	switch (target) {
	case GL_RENDERBUFFER_OES:
		binding = &ctx->renderbuffer;
		break;
	default:
		setError(GL_INVALID_ENUM);
		return;
	}

	if(renderbuffer == 0) {
		binding->bind(0);
		return;
	}

	if(!fglRenderbufferObjects.isValid(renderbuffer)
	    && fglRenderbufferObjects.get(renderbuffer, ctx) < 0) {
		setError(GL_INVALID_VALUE);
		return;
	}

	FGLRenderbuffer *rb = fglRenderbufferObjects[renderbuffer];
	if(rb == NULL) {
		rb = new FGLRenderbuffer(renderbuffer);
		if (rb == NULL) {
			setError(GL_OUT_OF_MEMORY);
			return;
		}
		fglRenderbufferObjects[renderbuffer] = rb;
	}

	binding->bind(&rb->object);
}
GL_API void GL_APIENTRY glGenFramebuffersOES (GLsizei n, GLuint* framebuffers)
{
	if(n <= 0)
		return;

	int name;
	GLsizei i = n;
	GLuint *cur = framebuffers;
	FGLContext *ctx = getContext();

	do {
		name = fglFramebufferObjects.get(ctx);
		if(name < 0) {
			glDeleteFramebuffersOES (n - i, framebuffers);
			setError(GL_OUT_OF_MEMORY);
			return;
		}
		fglFramebufferObjects[name] = NULL;
		*cur = name;
		cur++;
	} while (--i);
}
GL_API void GL_APIENTRY glFramebufferTexture2DOES (GLenum target,
					GLenum attachment, GLenum textarget,
					GLuint texture, GLint level)
{
	if(target != GL_FRAMEBUFFER_OES) {
		setError(GL_INVALID_OPERATION);
		return;
	}

	FGLTexture *tex = NULL;
	if (texture != 0) {
		if (textarget != GL_TEXTURE_2D) {
			setError(GL_INVALID_OPERATION);
			return;
		}

		if (level != 0) {
			setError(GL_INVALID_VALUE);
			return;
		}

		if(!fglTextureObjects.isValid(texture)) {
			setError(GL_INVALID_OPERATION);
			return;
		}

		tex = fglTextureObjects[texture];
		if(tex == NULL) {
			tex = new FGLTexture(texture);
			if (tex == NULL) {
				setError(GL_OUT_OF_MEMORY);
				return;
			}
			fglTextureObjects[texture] = tex;
			tex->target = textarget;
		}
	}

	FGLContext *ctx = getContext();

	if (!ctx->framebuffer.binding.isBound()) {
		setError(GL_INVALID_OPERATION);
		return;
	}

	FGLFramebuffer *fb = ctx->framebuffer.binding.get();
	FGLAttachmentIndex index;
	switch (attachment)
	{
	case GL_COLOR_ATTACHMENT0_OES:
		index = FGL_ATTACHMENT_COLOR;
		break;
	case GL_DEPTH_ATTACHMENT_OES:
		index = FGL_ATTACHMENT_DEPTH;
		break;
	case GL_STENCIL_ATTACHMENT_OES:
		index = FGL_ATTACHMENT_STENCIL;
		break;
	default:
		setError(GL_INVALID_ENUM);
		return;
	}

	fb->attach(index, tex);
}