~ubuntu-branches/ubuntu/raring/virtualbox-ose/raring

« back to all changes in this revision

Viewing changes to src/VBox/GuestHost/OpenGL/state_tracker/state_framebuffer.c

  • Committer: Bazaar Package Importer
  • Author(s): Felix Geyer
  • Date: 2011-01-30 23:27:25 UTC
  • mfrom: (0.3.12 upstream)
  • Revision ID: james.westby@ubuntu.com-20110130232725-2ouajjd2ggdet0zd
Tags: 4.0.2-dfsg-1ubuntu1
* Merge from Debian unstable, remaining changes:
  - Add Apport hook.
    - debian/virtualbox-ose.files/source_virtualbox-ose.py
    - debian/virtualbox-ose.install
  - Drop *-source packages.
* Drop ubuntu-01-fix-build-gcc45.patch, fixed upstream.
* Drop ubuntu-02-as-needed.patch, added to the Debian package.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
/* $Id: state_framebuffer.c $ */
 
1
/* $Id: state_framebuffer.c 34107 2010-11-16 11:37:51Z vboxsync $ */
2
2
 
3
3
/** @file
4
4
 * VBox OpenGL: EXT_framebuffer_object state tracking
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;
42
40
}
43
41
 
44
 
static void crStateFreeFBO(void *data)
 
42
void crStateFreeFBO(void *data)
45
43
{
46
44
    CRFramebufferObject *pObj = (CRFramebufferObject *)data;
47
45
 
55
53
    crFree(pObj);
56
54
}
57
55
 
58
 
static void crStateFreeRBO(void *data)
 
56
void crStateFreeRBO(void *data)
59
57
{
60
58
    CRRenderbufferObject *pObj = (CRRenderbufferObject *)data;
61
59
 
77
75
    fbo->readFB = NULL;
78
76
    fbo->drawFB = NULL;
79
77
    fbo->renderbuffer = NULL;
80
 
 
81
 
    crFreeHashtable(fbo->framebuffers, crStateFreeFBO);
82
 
    crFreeHashtable(fbo->renderbuffers, crStateFreeRBO);
83
78
}
84
79
 
85
80
DECLEXPORT(void) STATE_APIENTRY
93
88
 
94
89
    if (renderbuffer)
95
90
    {
96
 
        fbo->renderbuffer = (CRRenderbufferObject*) crHashtableSearch(fbo->renderbuffers, renderbuffer);
 
91
        fbo->renderbuffer = (CRRenderbufferObject*) crHashtableSearch(g->shared->rbTable, renderbuffer);
97
92
        if (!fbo->renderbuffer)
98
93
        {
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);
105
100
        }
106
101
    }
107
102
    else fbo->renderbuffer = NULL;
160
155
        if (renderbuffers[i])
161
156
        {
162
157
            CRRenderbufferObject *rbo;
163
 
            rbo = (CRRenderbufferObject*) crHashtableSearch(fbo->renderbuffers, renderbuffers[i]);
 
158
            rbo = (CRRenderbufferObject*) crHashtableSearch(g->shared->rbTable, renderbuffers[i]);
164
159
            if (rbo)
165
160
            {
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);
174
169
 
175
 
                crHashtableDelete(fbo->renderbuffers, renderbuffers[i], crStateFreeRBO);
 
170
                crHashtableDelete(g->shared->rbTable, renderbuffers[i], crStateFreeRBO);
176
171
            }
177
172
        }
178
173
    }
290
285
 
291
286
    if (framebuffer)
292
287
    {
293
 
        pFBO = (CRFramebufferObject*) crHashtableSearch(fbo->framebuffers, framebuffer);
 
288
        pFBO = (CRFramebufferObject*) crHashtableSearch(g->shared->fbTable, framebuffer);
294
289
        if (!pFBO)
295
290
        {
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);
302
297
        }
303
298
    }
304
299
 
337
332
        if (framebuffers[i])
338
333
        {
339
334
            CRFramebufferObject *fb;
340
 
            fb = (CRFramebufferObject*) crHashtableSearch(fbo->framebuffers, framebuffers[i]);
 
335
            fb = (CRFramebufferObject*) crHashtableSearch(g->shared->fbTable, framebuffers[i]);
341
336
            if (fb)
342
337
            {
343
338
                if (fbo->readFB==fb)
348
343
                {
349
344
                    fbo->drawFB = NULL;
350
345
                }
351
 
                crHashtableDelete(fbo->framebuffers, framebuffers[i], crStateFreeFBO);
 
346
                crHashtableDelete(g->shared->fbTable, framebuffers[i], crStateFreeFBO);
352
347
            }
353
348
        }
354
349
    }
554
549
        return;
555
550
    }
556
551
 
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");
559
554
 
560
555
#ifdef IN_GUEST
638
633
            tobj = (CRTextureObj *) crHashtableSearch(ctx->shared->textureTable, pAP->name);
639
634
            if (tobj)
640
635
            {
 
636
                CRASSERT(!tobj->id || tobj->hwid);
 
637
 
641
638
                switch (tobj->target)
642
639
                {
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);
645
642
                        break;
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);
649
646
                        break;
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);
652
649
                        break;
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);
655
652
                        break;
656
653
                    default:
657
654
                        crWarning("Unexpected textarget %d", tobj->target);
663
660
            }
664
661
            break;
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);
668
665
            break;
669
666
        case GL_NONE:
695
692
DECLEXPORT(void) STATE_APIENTRY
696
693
crStateFramebufferObjectSwitch(CRContext *from, CRContext *to)
697
694
{
698
 
    if (to->framebufferobject.bResyncNeeded)
 
695
    if (to->shared->bFBOResyncNeeded)
699
696
    {
700
 
        to->framebufferobject.bResyncNeeded = GL_FALSE;
 
697
        to->shared->bFBOResyncNeeded = GL_FALSE;
701
698
 
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);
704
701
 
705
702
        if (to->framebufferobject.drawFB==to->framebufferobject.readFB)
706
703
        {
750
747
DECLEXPORT(GLuint) STATE_APIENTRY crStateGetFramebufferHWID(GLuint id)
751
748
{
752
749
    CRContext *g = GetCurrentContext();
753
 
    CRFramebufferObject *pFBO = (CRFramebufferObject*) crHashtableSearch(g->framebufferobject.framebuffers, id);
 
750
    CRFramebufferObject *pFBO = (CRFramebufferObject*) crHashtableSearch(g->shared->fbTable, id);
754
751
 
755
752
    return pFBO ? pFBO->hwid : 0;
756
753
}
758
755
DECLEXPORT(GLuint) STATE_APIENTRY crStateGetRenderbufferHWID(GLuint id)
759
756
{
760
757
    CRContext *g = GetCurrentContext();
761
 
    CRRenderbufferObject *pRBO = (CRRenderbufferObject*) crHashtableSearch(g->framebufferobject.renderbuffers, id);
 
758
    CRRenderbufferObject *pRBO = (CRRenderbufferObject*) crHashtableSearch(g->shared->rbTable, id);
762
759
 
763
760
    return pRBO ? pRBO->hwid : 0;
764
761
}
791
788
    parms.id = hwid;
792
789
    parms.hwid = hwid;
793
790
 
794
 
    crHashtableWalk(g->framebufferobject.framebuffers, crStateCheckFBOHWIDCB, &parms);
 
791
    crHashtableWalk(g->shared->fbTable, crStateCheckFBOHWIDCB, &parms);
795
792
    return parms.id;
796
793
}
797
794
 
803
800
    parms.id = hwid;
804
801
    parms.hwid = hwid;
805
802
 
806
 
    crHashtableWalk(g->framebufferobject.renderbuffers, crStateCheckRBOHWIDCB, &parms);
 
803
    crHashtableWalk(g->shared->rbTable, crStateCheckRBOHWIDCB, &parms);
807
804
    return parms.id;
808
805
}
809
806