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; }
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); }