state_framebuffer.c revision 7f3bb583c97fd6f88c66f0047f1cd465afffefb4
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync * VBox OpenGL: EXT_framebuffer_object state tracking
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync * Copyright (C) 2009 Oracle Corporation
fcae7923a3c756b333f1e33eba002edf4448fb54vboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
fcae7923a3c756b333f1e33eba002edf4448fb54vboxsync * available from http://www.virtualbox.org. This file is free software;
fcae7923a3c756b333f1e33eba002edf4448fb54vboxsync * you can redistribute it and/or modify it under the terms of the GNU
fcae7923a3c756b333f1e33eba002edf4448fb54vboxsync * General Public License (GPL) as published by the Free Software
fcae7923a3c756b333f1e33eba002edf4448fb54vboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
fcae7923a3c756b333f1e33eba002edf4448fb54vboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
f001425d2b0a661d4cd1f7ea07b4e7454538c829vboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync#define CRSTATE_FBO_CHECKERR(expr, result, message) \
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync crStateError(__LINE__, __FILE__, result, message); \
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync CRFramebufferObjectState *fbo = &ctx->framebufferobject;
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync CRFramebufferObject *pObj = (CRFramebufferObject *)data;
691076bd437d5cd23673a24c5ba7d4cd77127354vboxsync CRRenderbufferObject *pObj = (CRRenderbufferObject *)data;
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync CRFramebufferObjectState *fbo = &ctx->framebufferobject;
1403063c7e0c0a072d59e323b66068b06278fb9avboxsynccrStateBindRenderbufferEXT(GLenum target, GLuint renderbuffer)
561b8d2b46fb10887829b7e4d7d29447817adbddvboxsync CRFramebufferObjectState *fbo = &g->framebufferobject;
fb4eaa62a6bbeb82a89703d833d39339783feb4avboxsync CRSTATE_FBO_CHECKERR(g->current.inBeginEnd, GL_INVALID_OPERATION, "called in begin/end");
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync CRSTATE_FBO_CHECKERR(target!=GL_RENDERBUFFER_EXT, GL_INVALID_ENUM, "invalid target");
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync fbo->renderbuffer = (CRRenderbufferObject*) crHashtableSearch(g->shared->rbTable, renderbuffer);
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync fbo->renderbuffer = (CRRenderbufferObject*) crCalloc(sizeof(CRRenderbufferObject));
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync CRSTATE_FBO_CHECKERR(!fbo->renderbuffer, GL_OUT_OF_MEMORY, "glBindRenderbufferEXT");
a2907076474e923411cc5046492a88787ba377fevboxsync crHashtableAdd(g->shared->rbTable, renderbuffer, fbo->renderbuffer);
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync CR_STATE_SHAREDOBJ_USAGE_SET(fbo->renderbuffer, g);
1403063c7e0c0a072d59e323b66068b06278fb9avboxsyncstatic void crStateCheckFBOAttachments(CRFramebufferObject *pFBO, GLuint rbo, GLenum target)
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync for (u=0; u<CR_MAX_COLOR_ATTACHMENTS; ++u)
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync if (ap->type==GL_RENDERBUFFER_EXT && ap->name==rbo)
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync crStateFramebufferRenderbufferEXT(target, u+GL_COLOR_ATTACHMENT0_EXT, 0, 0);
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync if (ap->type==GL_RENDERBUFFER_EXT && ap->name==rbo)
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync crStateFramebufferRenderbufferEXT(target, GL_DEPTH_ATTACHMENT_EXT, 0, 0);
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync if (ap->type==GL_RENDERBUFFER_EXT && ap->name==rbo)
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync crStateFramebufferRenderbufferEXT(target, GL_STENCIL_ATTACHMENT_EXT, 0, 0);
1403063c7e0c0a072d59e323b66068b06278fb9avboxsynccrStateDeleteRenderbuffersEXT(GLsizei n, const GLuint *renderbuffers)
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync CRFramebufferObjectState *fbo = &g->framebufferobject;
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync CRSTATE_FBO_CHECKERR(g->current.inBeginEnd, GL_INVALID_OPERATION, "called in begin/end");
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync CRSTATE_FBO_CHECKERR(n<0, GL_INVALID_OPERATION, "n<0");
f48c3167a0f99da174686b66dc4e666f38ecae46vboxsync for (i = 0; i < n; i++)
f48c3167a0f99da174686b66dc4e666f38ecae46vboxsync rbo = (CRRenderbufferObject*) crHashtableSearch(g->shared->rbTable, renderbuffers[i]);
f48c3167a0f99da174686b66dc4e666f38ecae46vboxsync /* check the attachments of current framebuffers */
f48c3167a0f99da174686b66dc4e666f38ecae46vboxsync crStateCheckFBOAttachments(fbo->readFB, renderbuffers[i], GL_READ_FRAMEBUFFER);
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync crStateCheckFBOAttachments(fbo->drawFB, renderbuffers[i], GL_DRAW_FRAMEBUFFER);
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync crHashtableDelete(g->shared->rbTable, renderbuffers[i], crStateFreeRBO);
1403063c7e0c0a072d59e323b66068b06278fb9avboxsynccrStateRenderbufferStorageEXT(GLenum target, GLenum internalformat, GLsizei width, GLsizei height)
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync CRFramebufferObjectState *fbo = &g->framebufferobject;
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync CRSTATE_FBO_CHECKERR(g->current.inBeginEnd, GL_INVALID_OPERATION, "called in begin/end");
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync CRSTATE_FBO_CHECKERR(target!=GL_RENDERBUFFER_EXT, GL_INVALID_ENUM, "invalid target");
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync CRSTATE_FBO_CHECKERR(!rb, GL_INVALID_OPERATION, "no bound renderbuffer");
1403063c7e0c0a072d59e323b66068b06278fb9avboxsynccrStateGetRenderbufferParameterivEXT(GLenum target, GLenum pname, GLint *params)
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync CRFramebufferObjectState *fbo = &g->framebufferobject;
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync CRSTATE_FBO_CHECKERR(g->current.inBeginEnd, GL_INVALID_OPERATION, "called in begin/end");
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync CRSTATE_FBO_CHECKERR(target!=GL_RENDERBUFFER_EXT, GL_INVALID_ENUM, "invalid target");
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync CRSTATE_FBO_CHECKERR(!rb, GL_INVALID_OPERATION, "no bound renderbuffer");
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync CRSTATE_FBO_CHECKERR(GL_TRUE, GL_INVALID_OPERATION, "unimplemented");
6479169ec893c18a646cec595e4e214492d180f0vboxsync CRSTATE_FBO_CHECKERR(GL_TRUE, GL_INVALID_ENUM, "invalid pname");
1403063c7e0c0a072d59e323b66068b06278fb9avboxsyncstatic void crStateInitFBOAttachmentPoint(CRFBOAttachmentPoint *fboap)
1403063c7e0c0a072d59e323b66068b06278fb9avboxsyncstatic void crStateInitFrameBuffer(CRFramebufferObject *fbo)
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync for (i=0; i<CR_MAX_COLOR_ATTACHMENTS; ++i)
6479169ec893c18a646cec595e4e214492d180f0vboxsyncstatic GLboolean crStateGetFBOAttachmentPoint(CRFramebufferObject *fb, GLenum attachment, CRFBOAttachmentPoint **ap)
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync if (attachment>=GL_COLOR_ATTACHMENT0_EXT && attachment<=GL_COLOR_ATTACHMENT15_EXT)
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync *ap = &fb->color[attachment-GL_COLOR_ATTACHMENT0_EXT];
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync else return GL_FALSE;
1403063c7e0c0a072d59e323b66068b06278fb9avboxsynccrStateBindFramebufferEXT(GLenum target, GLuint framebuffer)
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync CRFramebufferObjectState *fbo = &g->framebufferobject;
35473cad6d5d5b57348c66f0cfdd7d51d6071ee7vboxsync CRSTATE_FBO_CHECKERR(g->current.inBeginEnd, GL_INVALID_OPERATION, "called in begin/end");
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync CRSTATE_FBO_CHECKERR(((target!=GL_FRAMEBUFFER_EXT) && (target!=GL_READ_FRAMEBUFFER) && (target!=GL_DRAW_FRAMEBUFFER)),
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync pFBO = (CRFramebufferObject*) crHashtableSearch(g->shared->fbTable, framebuffer);
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync pFBO = (CRFramebufferObject*) crCalloc(sizeof(CRFramebufferObject));
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync CRSTATE_FBO_CHECKERR(!pFBO, GL_OUT_OF_MEMORY, "glBindFramebufferEXT");
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync crHashtableAdd(g->shared->fbTable, framebuffer, pFBO);
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync /* @todo: http://www.opengl.org/registry/specs/ARB/framebuffer_object.txt
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync * FBO status might change when binding a different FBO here...but I doubt it happens.
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync * So no status reset here until a proper check.
1403063c7e0c0a072d59e323b66068b06278fb9avboxsynccrStateDeleteFramebuffersEXT(GLsizei n, const GLuint *framebuffers)
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync CRFramebufferObjectState *fbo = &g->framebufferobject;
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync CRSTATE_FBO_CHECKERR(g->current.inBeginEnd, GL_INVALID_OPERATION, "called in begin/end");
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync CRSTATE_FBO_CHECKERR(n<0, GL_INVALID_OPERATION, "n<0");
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync for (i = 0; i < n; i++)
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync fb = (CRFramebufferObject*) crHashtableSearch(g->shared->fbTable, framebuffers[i]);
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync crHashtableDelete(g->shared->fbTable, framebuffers[i], crStateFreeFBO);
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync/*@todo: move this function somewhere else*/
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync/*return floor of base 2 log of x. log(0)==0*/
1403063c7e0c0a072d59e323b66068b06278fb9avboxsyncunsigned int crLog2Floor(unsigned int x)
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync x |= (x >> 1);
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync x |= (x >> 2);
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync x |= (x >> 4);
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync x |= (x >> 8);
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync x |= (x >> 16);
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync x += (x >> 8);
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync x += (x >> 16);
1403063c7e0c0a072d59e323b66068b06278fb9avboxsyncstatic void crStateFramebufferTextureCheck(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level,
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync GLboolean *failed, CRFBOAttachmentPoint **ap, CRTextureObj **tobj)
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync CRFramebufferObjectState *fbo = &g->framebufferobject;
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync CRSTATE_FBO_CHECKERR(g->current.inBeginEnd, GL_INVALID_OPERATION, "called in begin/end");
6479169ec893c18a646cec595e4e214492d180f0vboxsync CRSTATE_FBO_CHECKERR(((target!=GL_FRAMEBUFFER_EXT) && (target!=GL_READ_FRAMEBUFFER) && (target!=GL_DRAW_FRAMEBUFFER)),
6479169ec893c18a646cec595e4e214492d180f0vboxsync pFBO = GL_READ_FRAMEBUFFER==target ? fbo->readFB : fbo->drawFB;
09e4ff0eddf453bdf8d622df2b48cff510f7d01dvboxsync CRSTATE_FBO_CHECKERR(!pFBO, GL_INVALID_OPERATION, "no fbo bound");
09e4ff0eddf453bdf8d622df2b48cff510f7d01dvboxsync CRSTATE_FBO_CHECKERR(!crStateGetFBOAttachmentPoint(pFBO, attachment, ap), GL_INVALID_ENUM, "invalid attachment");
6479169ec893c18a646cec595e4e214492d180f0vboxsync maxtexsizelog2 = crLog2Floor(g->limits.maxCubeMapTextureSize);
6479169ec893c18a646cec595e4e214492d180f0vboxsync *tobj = crStateTextureGet(GL_TEXTURE_CUBE_MAP_ARB, texture);
6479169ec893c18a646cec595e4e214492d180f0vboxsync maxtexsizelog2 = crLog2Floor(g->limits.max3DTextureSize);
6479169ec893c18a646cec595e4e214492d180f0vboxsync maxtexsizelog2 = crLog2Floor(g->limits.maxTextureSize);
6479169ec893c18a646cec595e4e214492d180f0vboxsync CRSTATE_FBO_CHECKERR(GL_TRUE, GL_INVALID_OPERATION, "invalid textarget");
6479169ec893c18a646cec595e4e214492d180f0vboxsync CRSTATE_FBO_CHECKERR(!*tobj, GL_INVALID_OPERATION, "invalid textarget/texture combo");
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync CRSTATE_FBO_CHECKERR(level!=0, GL_INVALID_VALUE, "non zero mipmap level");
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync CRSTATE_FBO_CHECKERR(level<0, GL_INVALID_VALUE, "level<0");
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync CRSTATE_FBO_CHECKERR(level>maxtexsizelog2, GL_INVALID_VALUE, "level too big");
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync if ((*ap)->type!=GL_TEXTURE || (*ap)->name!=texture || (*ap)->level!=level)
1403063c7e0c0a072d59e323b66068b06278fb9avboxsynccrStateFramebufferTexture1DEXT(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level)
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync CRFramebufferObjectState *fbo = &g->framebufferobject;
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync crStateFramebufferTextureCheck(target, attachment, textarget, texture, level, &failed, &ap, &tobj);
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync if (failed) return;
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync CRSTATE_FBO_CHECKERR(textarget!=GL_TEXTURE_1D, GL_INVALID_OPERATION, "textarget");
1403063c7e0c0a072d59e323b66068b06278fb9avboxsynccrStateFramebufferTexture2DEXT(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level)
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync CRFramebufferObjectState *fbo = &g->framebufferobject;
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync crStateFramebufferTextureCheck(target, attachment, textarget, texture, level, &failed, &ap, &tobj);
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync if (failed) return;
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync CRSTATE_FBO_CHECKERR(GL_TEXTURE_1D==textarget || GL_TEXTURE_3D==textarget, GL_INVALID_OPERATION, "textarget");
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync if (textarget!=GL_TEXTURE_2D && textarget!=GL_TEXTURE_RECTANGLE_ARB)
1403063c7e0c0a072d59e323b66068b06278fb9avboxsynccrStateFramebufferTexture3DEXT(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset)
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync CRFramebufferObjectState *fbo = &g->framebufferobject;
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync crStateFramebufferTextureCheck(target, attachment, textarget, texture, level, &failed, &ap, &tobj);
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync if (failed) return;
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync CRSTATE_FBO_CHECKERR(zoffset>(g->limits.max3DTextureSize-1), GL_INVALID_VALUE, "zoffset too big");
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync CRSTATE_FBO_CHECKERR(textarget!=GL_TEXTURE_3D, GL_INVALID_OPERATION, "textarget");
1403063c7e0c0a072d59e323b66068b06278fb9avboxsynccrStateFramebufferRenderbufferEXT(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer)
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync CRFramebufferObjectState *fbo = &g->framebufferobject;
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync CRSTATE_FBO_CHECKERR(g->current.inBeginEnd, GL_INVALID_OPERATION, "called in begin/end");
1519f0483877fddc0a03ab7e3382124f889bb36avboxsync CRSTATE_FBO_CHECKERR(((target!=GL_FRAMEBUFFER_EXT) && (target!=GL_READ_FRAMEBUFFER) && (target!=GL_DRAW_FRAMEBUFFER)),
1519f0483877fddc0a03ab7e3382124f889bb36avboxsync pFBO = GL_READ_FRAMEBUFFER==target ? fbo->readFB : fbo->drawFB;
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync CRSTATE_FBO_CHECKERR(!pFBO, GL_INVALID_OPERATION, "no fbo bound");
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync CRSTATE_FBO_CHECKERR(!crStateGetFBOAttachmentPoint(pFBO, attachment, &ap), GL_INVALID_ENUM, "invalid attachment");
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync rb = (CRRenderbufferObject*) crHashtableSearch(g->shared->rbTable, renderbuffer);
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync CRSTATE_FBO_CHECKERR(!rb, GL_INVALID_OPERATION, "rb doesn't exist");
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync if (ap->type!=GL_RENDERBUFFER_EXT || ap->name!=renderbuffer)
1403063c7e0c0a072d59e323b66068b06278fb9avboxsynccrStateGetFramebufferAttachmentParameterivEXT(GLenum target, GLenum attachment, GLenum pname, GLint *params)
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync CRFramebufferObjectState *fbo = &g->framebufferobject;
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync CRSTATE_FBO_CHECKERR(g->current.inBeginEnd, GL_INVALID_OPERATION, "called in begin/end");
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync CRSTATE_FBO_CHECKERR(((target!=GL_FRAMEBUFFER_EXT) && (target!=GL_READ_FRAMEBUFFER) && (target!=GL_DRAW_FRAMEBUFFER)),
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync pFBO = GL_READ_FRAMEBUFFER==target ? fbo->readFB : fbo->drawFB;
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync CRSTATE_FBO_CHECKERR(!pFBO, GL_INVALID_OPERATION, "no fbo bound");
6479169ec893c18a646cec595e4e214492d180f0vboxsync CRSTATE_FBO_CHECKERR(!crStateGetFBOAttachmentPoint(pFBO, attachment, &ap), GL_INVALID_ENUM, "invalid attachment");
6479169ec893c18a646cec595e4e214492d180f0vboxsync CRSTATE_FBO_CHECKERR(ap->type!=GL_RENDERBUFFER_EXT && ap->type!=GL_TEXTURE, GL_INVALID_ENUM, "can't query object name when it's not bound")
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync CRSTATE_FBO_CHECKERR(ap->type!=GL_TEXTURE, GL_INVALID_ENUM, "not a texture");
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE_EXT:
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync CRSTATE_FBO_CHECKERR(ap->type!=GL_TEXTURE, GL_INVALID_ENUM, "not a texture");
1519f0483877fddc0a03ab7e3382124f889bb36avboxsync case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_3D_ZOFFSET_EXT:
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync CRSTATE_FBO_CHECKERR(ap->type!=GL_TEXTURE, GL_INVALID_ENUM, "not a texture");
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync CRSTATE_FBO_CHECKERR(GL_TRUE, GL_INVALID_ENUM, "invalid pname");
1403063c7e0c0a072d59e323b66068b06278fb9avboxsyncstatic void crStateSyncRenderbuffersCB(unsigned long key, void *data1, void *data2)
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync CRRenderbufferObject *pRBO = (CRRenderbufferObject*) data1;
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync diff_api.BindRenderbufferEXT(GL_RENDERBUFFER_EXT, pRBO->hwid);
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync diff_api.RenderbufferStorageEXT(GL_RENDERBUFFER_EXT, pRBO->internalformat, pRBO->width, pRBO->height);
1403063c7e0c0a072d59e323b66068b06278fb9avboxsyncstatic void crStateSyncAP(CRFBOAttachmentPoint *pAP, GLenum ap, CRContext *ctx)
6479169ec893c18a646cec595e4e214492d180f0vboxsync tobj = (CRTextureObj *) crHashtableSearch(ctx->shared->textureTable, pAP->name);
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync diff_api.FramebufferTexture1DEXT(GL_FRAMEBUFFER_EXT, ap, tobj->target, crStateGetTextureObjHWID(tobj), pAP->level);
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync diff_api.FramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, ap, tobj->target, crStateGetTextureObjHWID(tobj), pAP->level);
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync diff_api.FramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, ap, pAP->face, crStateGetTextureObjHWID(tobj), pAP->level);
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync diff_api.FramebufferTexture3DEXT(GL_FRAMEBUFFER_EXT, ap, tobj->target, crStateGetTextureObjHWID(tobj), pAP->level, pAP->zoffset);
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync crWarning("Unexpected textarget %d", tobj->target);
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync pRBO = (CRRenderbufferObject*) crHashtableSearch(ctx->shared->rbTable, pAP->name);
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync diff_api.FramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, ap, GL_RENDERBUFFER_EXT, pRBO->hwid);
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync /* Intentionally left blank */
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync default: crWarning("Invalid attachment point type %d (ap: %i)", pAP->type, ap);
72cc0d1a8b7c8406808a92eb0b9eb58bf6f8c3aavboxsyncstatic void crStateSyncFramebuffersCB(unsigned long key, void *data1, void *data2)
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync CRFramebufferObject *pFBO = (CRFramebufferObject*) data1;
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync diff_api.BindFramebufferEXT(GL_FRAMEBUFFER_EXT, pFBO->hwid);
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync for (i=0; i<CR_MAX_COLOR_ATTACHMENTS; ++i)
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync crStateSyncAP(&pFBO->color[i], GL_COLOR_ATTACHMENT0_EXT+i, ctx);
14a3a4c9d0c43ff4b0e32ee6e45e5c842527dc6dvboxsync crStateSyncAP(&pFBO->depth, GL_DEPTH_ATTACHMENT_EXT, ctx);
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync crStateSyncAP(&pFBO->stencil, GL_STENCIL_ATTACHMENT_EXT, ctx);
1403063c7e0c0a072d59e323b66068b06278fb9avboxsynccrStateFramebufferObjectSwitch(CRContext *from, CRContext *to)
f48c3167a0f99da174686b66dc4e666f38ecae46vboxsync crHashtableWalk(to->shared->rbTable, crStateSyncRenderbuffersCB, NULL);
f48c3167a0f99da174686b66dc4e666f38ecae46vboxsync crHashtableWalk(to->shared->fbTable, crStateSyncFramebuffersCB, to);
72cc0d1a8b7c8406808a92eb0b9eb58bf6f8c3aavboxsync if (to->framebufferobject.drawFB==to->framebufferobject.readFB)
f48c3167a0f99da174686b66dc4e666f38ecae46vboxsync diff_api.BindFramebufferEXT(GL_FRAMEBUFFER_EXT, to->framebufferobject.drawFB?
72cc0d1a8b7c8406808a92eb0b9eb58bf6f8c3aavboxsync diff_api.BindFramebufferEXT(GL_DRAW_FRAMEBUFFER, to->framebufferobject.drawFB?
72cc0d1a8b7c8406808a92eb0b9eb58bf6f8c3aavboxsync diff_api.BindFramebufferEXT(GL_READ_FRAMEBUFFER, to->framebufferobject.readFB?
72cc0d1a8b7c8406808a92eb0b9eb58bf6f8c3aavboxsync diff_api.BindRenderbufferEXT(GL_RENDERBUFFER_EXT, to->framebufferobject.renderbuffer?
72cc0d1a8b7c8406808a92eb0b9eb58bf6f8c3aavboxsync if (to->framebufferobject.drawFB!=from->framebufferobject.drawFB
72cc0d1a8b7c8406808a92eb0b9eb58bf6f8c3aavboxsync || to->framebufferobject.readFB!=from->framebufferobject.readFB)
72cc0d1a8b7c8406808a92eb0b9eb58bf6f8c3aavboxsync if (to->framebufferobject.drawFB==to->framebufferobject.readFB)
72cc0d1a8b7c8406808a92eb0b9eb58bf6f8c3aavboxsync diff_api.BindFramebufferEXT(GL_FRAMEBUFFER_EXT, to->framebufferobject.drawFB?
72cc0d1a8b7c8406808a92eb0b9eb58bf6f8c3aavboxsync diff_api.BindFramebufferEXT(GL_DRAW_FRAMEBUFFER, to->framebufferobject.drawFB?
72cc0d1a8b7c8406808a92eb0b9eb58bf6f8c3aavboxsync diff_api.BindFramebufferEXT(GL_READ_FRAMEBUFFER, to->framebufferobject.readFB?
72cc0d1a8b7c8406808a92eb0b9eb58bf6f8c3aavboxsync diff_api.DrawBuffer(to->framebufferobject.drawFB?to->framebufferobject.drawFB->drawbuffer[0]:to->buffer.drawBuffer);
72cc0d1a8b7c8406808a92eb0b9eb58bf6f8c3aavboxsync diff_api.ReadBuffer(to->framebufferobject.readFB?to->framebufferobject.readFB->readbuffer:to->buffer.readBuffer);
72cc0d1a8b7c8406808a92eb0b9eb58bf6f8c3aavboxsync if (to->framebufferobject.renderbuffer!=from->framebufferobject.renderbuffer)
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync diff_api.BindRenderbufferEXT(GL_RENDERBUFFER_EXT, to->framebufferobject.renderbuffer?
72cc0d1a8b7c8406808a92eb0b9eb58bf6f8c3aavboxsync diff_api.BindFramebufferEXT(GL_DRAW_FRAMEBUFFER, 0);
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync diff_api.BindFramebufferEXT(GL_READ_FRAMEBUFFER, 0);
72cc0d1a8b7c8406808a92eb0b9eb58bf6f8c3aavboxsync diff_api.BindRenderbufferEXT(GL_RENDERBUFFER_EXT, 0);
72cc0d1a8b7c8406808a92eb0b9eb58bf6f8c3aavboxsynccrStateFramebufferObjectReenableHW(CRContext *fromCtx, CRContext *toCtx)
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync if (fromCtx->framebufferobject.drawFB /* <- the FBO state was reset in crStateFramebufferObjectDisableHW */
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync && fromCtx->framebufferobject.drawFB == toCtx->framebufferobject.drawFB) /* .. and it was NOT restored properly in crStateFramebufferObjectSwitch */
72cc0d1a8b7c8406808a92eb0b9eb58bf6f8c3aavboxsync diff_api.BindFramebufferEXT(GL_DRAW_FRAMEBUFFER, toCtx->framebufferobject.drawFB->hwid);
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync if (fromCtx->framebufferobject.readFB /* <- the FBO state was reset in crStateFramebufferObjectDisableHW */
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync && fromCtx->framebufferobject.readFB == toCtx->framebufferobject.readFB) /* .. and it was NOT restored properly in crStateFramebufferObjectSwitch */
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync diff_api.BindFramebufferEXT(GL_READ_FRAMEBUFFER, toCtx->framebufferobject.readFB->hwid);
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync diff_api.DrawBuffer(toCtx->framebufferobject.drawFB?toCtx->framebufferobject.drawFB->drawbuffer[0]:toCtx->buffer.drawBuffer);
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync diff_api.ReadBuffer(toCtx->framebufferobject.readFB?toCtx->framebufferobject.readFB->readbuffer:toCtx->buffer.readBuffer);
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync if (fromCtx->framebufferobject.renderbuffer /* <- the FBO state was reset in crStateFramebufferObjectDisableHW */
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync && fromCtx->framebufferobject.renderbuffer==toCtx->framebufferobject.renderbuffer) /* .. and it was NOT restored properly in crStateFramebufferObjectSwitch */
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync diff_api.BindRenderbufferEXT(GL_RENDERBUFFER_EXT, toCtx->framebufferobject.renderbuffer->hwid);
1403063c7e0c0a072d59e323b66068b06278fb9avboxsyncDECLEXPORT(GLuint) STATE_APIENTRY crStateGetFramebufferHWID(GLuint id)
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync CRFramebufferObject *pFBO = (CRFramebufferObject*) crHashtableSearch(g->shared->fbTable, id);
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync crDebug("FB id(%d) hw(%d)", id, pFBO ? pFBO->hwid : 0);
1403063c7e0c0a072d59e323b66068b06278fb9avboxsyncDECLEXPORT(GLuint) STATE_APIENTRY crStateGetRenderbufferHWID(GLuint id)
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync CRRenderbufferObject *pRBO = (CRRenderbufferObject*) crHashtableSearch(g->shared->rbTable, id);
1403063c7e0c0a072d59e323b66068b06278fb9avboxsyncstatic void crStateCheckFBOHWIDCB(unsigned long key, void *data1, void *data2)
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync CRFramebufferObject *pFBO = (CRFramebufferObject *) data1;
6479169ec893c18a646cec595e4e214492d180f0vboxsync crCheckIDHWID_t *pParms = (crCheckIDHWID_t*) data2;
1403063c7e0c0a072d59e323b66068b06278fb9avboxsyncstatic void crStateCheckRBOHWIDCB(unsigned long key, void *data1, void *data2)
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync CRRenderbufferObject *pRBO = (CRRenderbufferObject *) data1;
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync crCheckIDHWID_t *pParms = (crCheckIDHWID_t*) data2;
6479169ec893c18a646cec595e4e214492d180f0vboxsyncDECLEXPORT(GLuint) STATE_APIENTRY crStateFBOHWIDtoID(GLuint hwid)
69132a0ec44f2ef9702c43e6c051cffb051d83a2vboxsync crHashtableWalk(g->shared->fbTable, crStateCheckFBOHWIDCB, &parms);
69132a0ec44f2ef9702c43e6c051cffb051d83a2vboxsyncDECLEXPORT(GLuint) STATE_APIENTRY crStateRBOHWIDtoID(GLuint hwid)
69132a0ec44f2ef9702c43e6c051cffb051d83a2vboxsync crHashtableWalk(g->shared->rbTable, crStateCheckRBOHWIDCB, &parms);
35473cad6d5d5b57348c66f0cfdd7d51d6071ee7vboxsyncDECLEXPORT(GLenum) STATE_APIENTRY crStateCheckFramebufferStatusEXT(GLenum target)
35473cad6d5d5b57348c66f0cfdd7d51d6071ee7vboxsync CRFramebufferObjectState *fbo = &g->framebufferobject;
f65dabff4474710524235022d328b737f174fc1dvboxsyncDECLEXPORT(GLenum) STATE_APIENTRY crStateSetFramebufferStatus(GLenum target, GLenum status)