36
36
fbo->readFB = NULL;
37
37
fbo->drawFB = NULL;
38
38
fbo->renderbuffer = NULL;
39
fbo->framebuffers = crAllocHashtable();
40
fbo->renderbuffers = crAllocHashtable();
41
fbo->bResyncNeeded = GL_FALSE;
39
ctx->shared->bFBOResyncNeeded = GL_FALSE;
44
static void crStateFreeFBO(void *data)
42
void crStateFreeFBO(void *data)
46
44
CRFramebufferObject *pObj = (CRFramebufferObject *)data;
77
75
fbo->readFB = NULL;
78
76
fbo->drawFB = NULL;
79
77
fbo->renderbuffer = NULL;
81
crFreeHashtable(fbo->framebuffers, crStateFreeFBO);
82
crFreeHashtable(fbo->renderbuffers, crStateFreeRBO);
85
80
DECLEXPORT(void) STATE_APIENTRY
96
fbo->renderbuffer = (CRRenderbufferObject*) crHashtableSearch(fbo->renderbuffers, renderbuffer);
91
fbo->renderbuffer = (CRRenderbufferObject*) crHashtableSearch(g->shared->rbTable, renderbuffer);
97
92
if (!fbo->renderbuffer)
99
94
fbo->renderbuffer = (CRRenderbufferObject*) crCalloc(sizeof(CRRenderbufferObject));
101
96
fbo->renderbuffer->id = renderbuffer;
102
97
fbo->renderbuffer->hwid = renderbuffer;
103
98
fbo->renderbuffer->internalformat = GL_RGBA;
104
crHashtableAdd(fbo->renderbuffers, renderbuffer, fbo->renderbuffer);
99
crHashtableAdd(g->shared->rbTable, renderbuffer, fbo->renderbuffer);
107
102
else fbo->renderbuffer = NULL;
160
155
if (renderbuffers[i])
162
157
CRRenderbufferObject *rbo;
163
rbo = (CRRenderbufferObject*) crHashtableSearch(fbo->renderbuffers, renderbuffers[i]);
158
rbo = (CRRenderbufferObject*) crHashtableSearch(g->shared->rbTable, renderbuffers[i]);
166
161
if (fbo->renderbuffer==rbo)
172
167
crStateCheckFBOAttachments(fbo->readFB, renderbuffers[i], GL_READ_FRAMEBUFFER);
173
168
crStateCheckFBOAttachments(fbo->drawFB, renderbuffers[i], GL_DRAW_FRAMEBUFFER);
175
crHashtableDelete(fbo->renderbuffers, renderbuffers[i], crStateFreeRBO);
170
crHashtableDelete(g->shared->rbTable, renderbuffers[i], crStateFreeRBO);
293
pFBO = (CRFramebufferObject*) crHashtableSearch(fbo->framebuffers, framebuffer);
288
pFBO = (CRFramebufferObject*) crHashtableSearch(g->shared->fbTable, framebuffer);
296
291
pFBO = (CRFramebufferObject*) crCalloc(sizeof(CRFramebufferObject));
298
293
pFBO->id = framebuffer;
299
294
pFBO->hwid = framebuffer;
300
295
crStateInitFrameBuffer(pFBO);
301
crHashtableAdd(fbo->framebuffers, framebuffer, pFBO);
296
crHashtableAdd(g->shared->fbTable, framebuffer, pFBO);
557
rb = (CRRenderbufferObject*) crHashtableSearch(fbo->renderbuffers, renderbuffer);
552
rb = (CRRenderbufferObject*) crHashtableSearch(g->shared->rbTable, renderbuffer);
558
553
CRSTATE_FBO_CHECKERR(!rb, GL_INVALID_OPERATION, "rb doesn't exist");
638
633
tobj = (CRTextureObj *) crHashtableSearch(ctx->shared->textureTable, pAP->name);
636
CRASSERT(!tobj->id || tobj->hwid);
641
638
switch (tobj->target)
643
640
case GL_TEXTURE_1D:
644
diff_api.FramebufferTexture1DEXT(GL_FRAMEBUFFER_EXT, ap, tobj->target, pAP->name, pAP->level);
641
diff_api.FramebufferTexture1DEXT(GL_FRAMEBUFFER_EXT, ap, tobj->target, crStateGetTextureObjHWID(tobj), pAP->level);
646
643
case GL_TEXTURE_2D:
647
644
case GL_TEXTURE_RECTANGLE_ARB:
648
diff_api.FramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, ap, tobj->target, pAP->name, pAP->level);
645
diff_api.FramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, ap, tobj->target, crStateGetTextureObjHWID(tobj), pAP->level);
650
647
case GL_TEXTURE_CUBE_MAP_ARB:
651
diff_api.FramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, ap, pAP->face, pAP->name, pAP->level);
648
diff_api.FramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, ap, pAP->face, crStateGetTextureObjHWID(tobj), pAP->level);
653
650
case GL_TEXTURE_3D:
654
diff_api.FramebufferTexture3DEXT(GL_FRAMEBUFFER_EXT, ap, tobj->target, pAP->name, pAP->level, pAP->zoffset);
651
diff_api.FramebufferTexture3DEXT(GL_FRAMEBUFFER_EXT, ap, tobj->target, crStateGetTextureObjHWID(tobj), pAP->level, pAP->zoffset);
657
654
crWarning("Unexpected textarget %d", tobj->target);
665
662
case GL_RENDERBUFFER_EXT:
666
pRBO = (CRRenderbufferObject*) crHashtableSearch(ctx->framebufferobject.renderbuffers, pAP->name);
663
pRBO = (CRRenderbufferObject*) crHashtableSearch(ctx->shared->rbTable, pAP->name);
667
664
diff_api.FramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, ap, GL_RENDERBUFFER_EXT, pRBO->hwid);
695
692
DECLEXPORT(void) STATE_APIENTRY
696
693
crStateFramebufferObjectSwitch(CRContext *from, CRContext *to)
698
if (to->framebufferobject.bResyncNeeded)
695
if (to->shared->bFBOResyncNeeded)
700
to->framebufferobject.bResyncNeeded = GL_FALSE;
697
to->shared->bFBOResyncNeeded = GL_FALSE;
702
crHashtableWalk(to->framebufferobject.renderbuffers, crStateSyncRenderbuffersCB, NULL);
703
crHashtableWalk(to->framebufferobject.framebuffers, crStateSyncFramebuffersCB, to);
699
crHashtableWalk(to->shared->rbTable, crStateSyncRenderbuffersCB, NULL);
700
crHashtableWalk(to->shared->fbTable, crStateSyncFramebuffersCB, to);
705
702
if (to->framebufferobject.drawFB==to->framebufferobject.readFB)
750
747
DECLEXPORT(GLuint) STATE_APIENTRY crStateGetFramebufferHWID(GLuint id)
752
749
CRContext *g = GetCurrentContext();
753
CRFramebufferObject *pFBO = (CRFramebufferObject*) crHashtableSearch(g->framebufferobject.framebuffers, id);
750
CRFramebufferObject *pFBO = (CRFramebufferObject*) crHashtableSearch(g->shared->fbTable, id);
755
752
return pFBO ? pFBO->hwid : 0;
758
755
DECLEXPORT(GLuint) STATE_APIENTRY crStateGetRenderbufferHWID(GLuint id)
760
757
CRContext *g = GetCurrentContext();
761
CRRenderbufferObject *pRBO = (CRRenderbufferObject*) crHashtableSearch(g->framebufferobject.renderbuffers, id);
758
CRRenderbufferObject *pRBO = (CRRenderbufferObject*) crHashtableSearch(g->shared->rbTable, id);
763
760
return pRBO ? pRBO->hwid : 0;