VirtualBox

Ignore:
Timestamp:
Apr 12, 2010 11:50:37 AM (15 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
59935
Message:

crOpenGL: more multi screen support

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/HostServices/SharedOpenGL/crserverlib/server_muralfbo.c

    r27892 r28197  
    258258}
    259259
     260#define MIN(a, b) ((a) < (b) ? (a) : (b))
     261#define MAX(a, b) ((a) > (b) ? (a) : (b))
     262
     263static GLboolean crServerIntersectScreen(CRMuralInfo *mural, int sId, CRrecti *rect)
     264{
     265    rect->x1 = MAX(mural->gX, cr_server.screen[sId].x);
     266    rect->x2 = MIN(mural->gX+(int)mural->fboWidth, cr_server.screen[sId].x+(int)cr_server.screen[sId].w);
     267    rect->y1 = MAX(mural->gY, cr_server.screen[sId].y);
     268    rect->y2 = MIN(mural->gY+(int)mural->fboHeight, cr_server.screen[sId].y+(int)cr_server.screen[sId].h);
     269
     270    return (rect->x2>rect->x1) && (rect->y2>rect->y1);
     271}
     272
    260273void crServerPresentFBO(CRMuralInfo *mural)
    261274{
    262     char *pixels;
     275    char *pixels, *tmppixels, *pSrc, *pDst;
    263276    GLuint uid;
     277    int i, j, rowsize, rowstride, height;
     278    CRrecti rect;
    264279    CRContext *ctx = crStateGetCurrent();
    265280
     
    274289
    275290    cr_server.head_spu->dispatch_table.BindTexture(GL_TEXTURE_2D, mural->idColorTex);
    276     cr_server.head_spu->dispatch_table.GetTexImage(GL_TEXTURE_2D, 0, GL_RGBA, GL_UNSIGNED_BYTE, pixels);
     291    cr_server.head_spu->dispatch_table.GetTexImage(GL_TEXTURE_2D, 0, GL_BGRA, GL_UNSIGNED_BYTE, pixels);
    277292    uid = ctx->texture.unit[ctx->texture.curTextureUnit].currentTexture2D->name;
    278293    cr_server.head_spu->dispatch_table.BindTexture(GL_TEXTURE_2D, uid);
    279294
    280     /*@todo render parts on the different screens*/
    281     cr_server.pfnPresentFBO(pixels, mural->screenId, 0, 0, mural->fboWidth, mural->fboHeight);
    282 
     295    for (i=0; i<cr_server.screenCount; ++i)
     296    {
     297        if (crServerIntersectScreen(mural, i, &rect))
     298        {
     299            rowsize = 4*RT_ALIGN_Z(rect.x2-rect.x1, 4);
     300            tmppixels = crAlloc(rowsize*(rect.y2-rect.y1));
     301            if (!tmppixels)
     302            {
     303                crWarning("Out of memory in crServerPresentFBO");
     304                crFree(pixels);
     305                return;
     306            }
     307            rowstride = 4*mural->fboWidth;
     308            height = rect.y2-rect.y1;
     309
     310            pSrc = pixels + 4*(rect.x1-mural->gX) + rowstride*(rect.y2-mural->gY-1);
     311            pDst = tmppixels;
     312
     313            for (j=0; j<height; ++j)
     314            {
     315                crMemcpy(pDst, pSrc, rowsize);
     316
     317                pSrc -= rowstride;
     318                pDst += rowsize;
     319            }
     320
     321            cr_server.pfnPresentFBO(tmppixels, i, rect.x1, rect.y1, rect.x2-rect.x1, height);
     322
     323            crFree(tmppixels);
     324        }
     325    }
    283326    crFree(pixels);
    284327}
Note: See TracChangeset for help on using the changeset viewer.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette