VirtualBox

Changeset 31808 in vbox for trunk


Ignore:
Timestamp:
Aug 20, 2010 9:40:40 AM (15 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
65002
Message:

crOpenGL: resource sharing between contexts

Location:
trunk/src/VBox
Files:
33 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/GuestHost/OpenGL/include/chromium.h

    r27889 r31808  
    684684#define GL_REAL_RENDERER   0x8B25
    685685#define GL_REAL_EXTENSIONS 0x8B26
     686
     687/*Global resource ids sharing*/
     688#define GL_SHARE_CONTEXT_RESOURCES_CR 0x8B27
    686689#endif
    687690
  • trunk/src/VBox/GuestHost/OpenGL/include/cr_glstate.h

    r29930 r31808  
    9898    CRHashTable *textureTable;  /* all texture objects */
    9999    CRHashTable *dlistTable;    /* all display lists */
     100    CRHashTable *buffersTable;  /* vbo/pbo */
     101    CRHashTable *fbTable;       /* frame buffers */
     102    CRHashTable *rbTable;       /* render buffers */
     103
    100104    GLint refCount;
     105    GLint id;                   /*unique shared state id, it's not always matching some existing context id!*/
     106    GLint saveCount;
    101107} CRSharedState;
    102108
     
    196202#ifndef IN_GUEST
    197203DECLEXPORT(int32_t) crStateSaveContext(CRContext *pContext, PSSMHANDLE pSSM);
    198 DECLEXPORT(int32_t) crStateLoadContext(CRContext *pContext, PSSMHANDLE pSSM);
     204DECLEXPORT(int32_t) crStateLoadContext(CRContext *pContext, CRHashTable * pCtxTable, PSSMHANDLE pSSM);
     205DECLEXPORT(void)    crStateFreeShared(CRSharedState *s);
    199206#endif
    200207
     
    219226                   GLenum format, GLenum type, GLvoid *pixels );
    220227
     228DECLEXPORT(void) STATE_APIENTRY crStateShareContext(GLboolean value);
    221229#ifdef __cplusplus
    222230}
  • trunk/src/VBox/GuestHost/OpenGL/include/state/cr_bufferobject.h

    r27091 r31808  
    1010#include "cr_hash.h"
    1111#include "state/cr_statetypes.h"
     12#include "state/cr_statefuncs.h"
    1213
    1314#ifdef __cplusplus
     
    3031typedef struct {
    3132        GLuint refCount;
    32         GLuint name;
     33        GLuint id;
     34    GLuint hwid;
    3335        GLenum usage;
    3436        GLenum access;
     
    5153        CRBufferObject *nullBuffer;  /* name = 0 */
    5254
    53         CRHashTable *buffers;
    54 
    5555    GLboolean   bResyncNeeded;
    5656} CRBufferObjectState;
     
    5959DECLEXPORT(GLboolean) crStateIsBufferBound(GLenum target);
    6060
     61DECLEXPORT(GLuint) STATE_APIENTRY crStateBufferHWIDtoID(GLuint hwid);
     62DECLEXPORT(GLuint) STATE_APIENTRY crStateGetBufferHWID(GLuint id);
     63
    6164#ifdef __cplusplus
    6265}
  • trunk/src/VBox/GuestHost/OpenGL/include/state/cr_framebuffer.h

    r28800 r31808  
    6262    CRFramebufferObject     *readFB, *drawFB;
    6363    CRRenderbufferObject    *renderbuffer;
    64     CRHashTable             *framebuffers;
    65     CRHashTable             *renderbuffers;
    6664
    6765    /* Indicates that we have to resend FBO data to GPU on first glMakeCurrent call with owning context */
  • trunk/src/VBox/GuestHost/OpenGL/include/state/cr_texture.h

    r27091 r31808  
    6161typedef struct {
    6262    GLenum                 target;
    63     GLuint                 name;
     63    GLuint                 id;
     64    GLuint                 hwid;
    6465
    6566    /* The mipmap levels */
     
    237238DECLEXPORT(void) crStateDeleteTextureObject(CRTextureObj *tobj);
    238239
     240DECLEXPORT(GLuint) STATE_APIENTRY crStateTextureHWIDtoID(GLuint hwid);
     241DECLEXPORT(GLuint) STATE_APIENTRY crStateGetTextureHWID(GLuint id);
     242DECLEXPORT(GLuint) STATE_APIENTRY crStateGetTextureObjHWID(CRTextureObj *tobj);
    239243
    240244#ifdef __cplusplus
  • trunk/src/VBox/GuestHost/OpenGL/packer/pack_client.c

    r25541 r31808  
    662662    CRBufferObject *elementsBuffer = crStateGetCurrent()->bufferobject.elementsBuffer;
    663663    packet_length += sizeof(GLint);
    664     if (elementsBuffer && elementsBuffer->name)
     664    if (elementsBuffer && elementsBuffer->id)
    665665    {
    666666        /*@todo not sure it's possible, and not sure what to do*/
     
    709709    CRBufferObject *elementsBuffer = crStateGetCurrent()->bufferobject.elementsBuffer;
    710710    packet_length += sizeof(GLint);
    711     if (elementsBuffer && elementsBuffer->name)
     711    if (elementsBuffer && elementsBuffer->id)
    712712    {
    713713        /*@todo not sure it's possible, and not sure what to do*/
     
    10291029    if (cp->enabled)
    10301030    {
    1031         if (cp->buffer && cp->buffer->name)
     1031        if (cp->buffer && cp->buffer->id)
    10321032        {
    10331033            crWarning("crPackLockClientPointer called when there's VBO enabled!");
  • trunk/src/VBox/GuestHost/OpenGL/state_tracker/state.h

    r27889 r31808  
    4141
    4242void crStateBufferObjectDiff(CRBufferObjectBits *bb, CRbitvalue *bitID,
    43                                                                                                                 CRContext *fromCtx, CRContext *toCtx);
     43                            CRContext *fromCtx, CRContext *toCtx);
    4444
    4545void crStateBufferObjectSwitch(CRBufferObjectBits *bb, CRbitvalue *bitID,
    46                                                                                                                          CRContext *fromCtx, CRContext *toCtx);
    47 
     46                               CRContext *fromCtx, CRContext *toCtx);
    4847
    4948/* These would normally be in cr_client.h */
    5049
    5150void crStateClientDiff(CRClientBits *cb, CRbitvalue *bitID, CRContext *from, CRContext *to);
    52                                                                                        
    53 void crStateClientSwitch(CRClientBits *cb, CRbitvalue *bitID,   CRContext *from, CRContext *to);
     51                                           
     52void crStateClientSwitch(CRClientBits *cb, CRbitvalue *bitID,   CRContext *from, CRContext *to);
    5453
     54void crStateGetTextureObjectAndImage(CRContext *g, GLenum texTarget, GLint level,
     55                                     CRTextureObj **obj, CRTextureLevel **img);
    5556
    56 void
    57 crStateGetTextureObjectAndImage(CRContext *g, GLenum texTarget, GLint level,
    58                                                                                                                                 CRTextureObj **obj, CRTextureLevel **img);
    59 
     57void crStateFreeBufferObject(void *data);
     58void crStateFreeFBO(void *data);
     59void crStateFreeRBO(void *data);
    6060#endif
  • trunk/src/VBox/GuestHost/OpenGL/state_tracker/state_attrib.c

    r16223 r31808  
    8383
    8484static void
    85 copy_texobj(CRTextureObj *dest, const CRTextureObj *src, GLboolean copyName)
     85copy_texobj(CRTextureObj *dest, CRTextureObj *src, GLboolean copyName)
    8686{
    8787    if (copyName)
    88         dest->name = src->name;
     88    {
     89        dest->id = src->id;
     90        dest->hwid = crStateGetTextureObjHWID(src);
     91    }
     92
    8993    dest->borderColor = src->borderColor;
    9094    dest->wrapS = src->wrapS;
     
    10611065            copy_texunit(&g->texture.unit[i], &tState->unit[i]);
    10621066            /* first, restore the bindings! */
    1063             g->texture.unit[i].currentTexture1D = crStateTextureGet(GL_TEXTURE_1D, tState->unit[i].Saved1D.name);
     1067            g->texture.unit[i].currentTexture1D = crStateTextureGet(GL_TEXTURE_1D, tState->unit[i].Saved1D.id);
    10641068            copy_texobj(g->texture.unit[i].currentTexture1D, &tState->unit[i].Saved1D, GL_FALSE);
    1065             g->texture.unit[i].currentTexture2D = crStateTextureGet(GL_TEXTURE_2D, tState->unit[i].Saved2D.name);
     1069            g->texture.unit[i].currentTexture2D = crStateTextureGet(GL_TEXTURE_2D, tState->unit[i].Saved2D.id);
    10661070            copy_texobj(g->texture.unit[i].currentTexture2D, &tState->unit[i].Saved2D, GL_FALSE);
    10671071#ifdef CR_OPENGL_VERSION_1_2
    1068             g->texture.unit[i].currentTexture3D = crStateTextureGet(GL_TEXTURE_3D, tState->unit[i].Saved3D.name);
     1072            g->texture.unit[i].currentTexture3D = crStateTextureGet(GL_TEXTURE_3D, tState->unit[i].Saved3D.id);
    10691073            copy_texobj(g->texture.unit[i].currentTexture3D, &tState->unit[i].Saved3D, GL_FALSE);
    10701074#endif
    10711075#ifdef CR_ARB_texture_cube_map
    1072             g->texture.unit[i].currentTextureCubeMap = crStateTextureGet(GL_TEXTURE_CUBE_MAP_ARB, tState->unit[i].SavedCubeMap.name);
     1076            g->texture.unit[i].currentTextureCubeMap = crStateTextureGet(GL_TEXTURE_CUBE_MAP_ARB, tState->unit[i].SavedCubeMap.id);
    10731077            copy_texobj(g->texture.unit[i].currentTextureCubeMap, &tState->unit[i].SavedCubeMap, GL_FALSE);
    10741078#endif
    10751079#ifdef CR_NV_texture_rectangle
    1076             g->texture.unit[i].currentTextureRect = crStateTextureGet(GL_TEXTURE_CUBE_MAP_ARB, tState->unit[i].SavedRect.name);
     1080            g->texture.unit[i].currentTextureRect = crStateTextureGet(GL_TEXTURE_CUBE_MAP_ARB, tState->unit[i].SavedRect.id);
    10771081            copy_texobj(g->texture.unit[i].currentTextureRect, &tState->unit[i].SavedRect, GL_FALSE);
    10781082#endif
  • trunk/src/VBox/GuestHost/OpenGL/state_tracker/state_bufferobject.c

    r30028 r31808  
    1818    if (b) {
    1919        b->refCount = 1;
    20         b->name = name;
     20        b->id = name;
     21        b->hwid = name;
    2122        b->usage = GL_STATIC_DRAW_ARB;
    2223        b->access = GL_READ_WRITE_ARB;
     
    3435    {
    3536        case GL_ARRAY_BUFFER_ARB:
    36             return b->arrayBuffer->name!=0;
     37            return b->arrayBuffer->id!=0;
    3738        case GL_ELEMENT_ARRAY_BUFFER_ARB:
    38             return b->elementsBuffer->name!=0;
     39            return b->elementsBuffer->id!=0;
    3940#ifdef CR_ARB_pixel_buffer_object
    4041        case GL_PIXEL_PACK_BUFFER_ARB:
    41             return b->packBuffer->name!=0;
     42            return b->packBuffer->id!=0;
    4243        case GL_PIXEL_UNPACK_BUFFER_ARB:
    43             return b->unpackBuffer->name!=0;
     44            return b->unpackBuffer->id!=0;
    4445#endif
    4546        default:
     
    9798#endif
    9899
    99     b->buffers = crAllocHashtable();
    100 
    101100    b->bResyncNeeded = GL_FALSE;
    102101}
    103102
    104 
    105 static void crStateFreeBufferObject(void *data)
     103void crStateFreeBufferObject(void *data)
    106104{
    107105    CRBufferObject *pObj = (CRBufferObject *)data;
     
    111109    if (diff_api.DeleteBuffersARB)
    112110    {
    113         diff_api.DeleteBuffersARB(1, &pObj->name);
     111        diff_api.DeleteBuffersARB(1, &pObj->hwid);
    114112    }
    115113#endif
     
    121119{
    122120    CRBufferObjectState *b = &ctx->bufferobject;
    123     crFreeHashtable(b->buffers, crStateFreeBufferObject);
    124121    crFree(b->nullBuffer);
     122}
     123
     124static void crStateCheckBufferHWIDCB(unsigned long key, void *data1, void *data2)
     125{
     126    CRBufferObject *pObj = (CRBufferObject *) data1;
     127    crCheckIDHWID_t *pParms = (crCheckIDHWID_t*) data2;
     128    (void) key;
     129
     130    if (pObj->hwid==pParms->hwid)
     131        pParms->id = pObj->id;
     132}
     133
     134DECLEXPORT(GLuint) STATE_APIENTRY crStateBufferHWIDtoID(GLuint hwid)
     135{
     136    CRContext *g = GetCurrentContext();
     137    crCheckIDHWID_t parms;
     138
     139    parms.id = hwid;
     140    parms.hwid = hwid;
     141
     142    crHashtableWalk(g->shared->buffersTable, crStateCheckBufferHWIDCB, &parms);
     143    return parms.id;
     144}
     145
     146DECLEXPORT(GLuint) STATE_APIENTRY crStateGetBufferHWID(GLuint id)
     147{
     148    CRContext *g = GetCurrentContext();
     149    CRBufferObject *pObj = (CRBufferObject *) crHashtableSearch(g->shared->buffersTable, id);
     150
     151    return pObj ? pObj->hwid : 0;
    125152}
    126153
     
    153180    }
    154181    else {
    155         newObj = (CRBufferObject *) crHashtableSearch(b->buffers, buffer);
     182        newObj = (CRBufferObject *) crHashtableSearch(g->shared->buffersTable, buffer);
    156183        if (!newObj) {
    157184            newObj = AllocBufferObject(buffer);
     
    160187                return;
    161188            }
    162             crHashtableAdd( b->buffers, buffer, newObj );
     189            crHashtableAdd( g->shared->buffersTable, buffer, newObj );
    163190        }
    164191    }
     
    199226        /*we shouldn't reach this point*/
    200227        CRASSERT(false);
    201         crHashtableDelete(b->buffers, (unsigned long) oldObj->name, crStateFreeBufferObject);
     228        crHashtableDelete(g->shared->buffersTable, (unsigned long) oldObj->id, crStateFreeBufferObject);
    202229    }
    203230
     
    236263        if (buffers[i]) {
    237264            CRBufferObject *obj = (CRBufferObject *)
    238                 crHashtableSearch(b->buffers, buffers[i]);
     265                crHashtableSearch(g->shared->buffersTable, buffers[i]);
    239266            if (obj) {
    240267                if (obj == b->arrayBuffer)
     
    270297                /* @todo check bindings with the vertex arrays */
    271298
    272                 crHashtableDelete(b->buffers, buffers[i], crStateFreeBufferObject);
     299                crHashtableDelete(g->shared->buffersTable, buffers[i], crStateFreeBufferObject);
    273300            }
    274301        }
     
    298325    }
    299326
    300     start = crHashtableAllocKeys(b->buffers, n);
     327    start = crHashtableAllocKeys(g->shared->buffersTable, n);
    301328    if (start) {
    302329        GLint i;
     
    324351    }
    325352
    326     if (buffer && crHashtableSearch(b->buffers, buffer))
     353    if (buffer && crHashtableSearch(g->shared->buffersTable, buffer))
    327354        return GL_TRUE;
    328355    else
     
    379406    }
    380407
    381     if (obj->name == 0) {
     408    if (obj->id == 0) {
    382409        crStateError(__LINE__, __FILE__, GL_INVALID_OPERATION, "glBufferDataARB");
    383410        return;
     
    441468    }
    442469
    443     if (obj->name == 0) {
     470    if (obj->id == 0) {
    444471        crStateError(__LINE__, __FILE__, GL_INVALID_OPERATION,
    445472                                 "glBufferSubDataARB");
     
    495522    }
    496523
    497     if (obj->name == 0) {
     524    if (obj->id == 0) {
    498525        crStateError(__LINE__, __FILE__, GL_INVALID_OPERATION,
    499526                                 "glGetBufferSubDataARB");
     
    541568    }
    542569
    543     if (obj->name == 0) {
     570    if (obj->id == 0) {
    544571        crStateError(__LINE__, __FILE__, GL_INVALID_OPERATION, "glMapBufferARB");
    545572        return GL_FALSE;
     
    589616    }
    590617
    591     if (obj->name == 0) {
     618    if (obj->id == 0) {
    592619        crStateError(__LINE__, __FILE__, GL_INVALID_OPERATION, "glUnmapBufferARB");
    593620        return GL_FALSE;
     
    735762        if (from->arrayBuffer != to->arrayBuffer)
    736763        {
    737             GLuint bufferID = to->arrayBuffer ? to->arrayBuffer->name : 0;
     764            GLuint bufferID = to->arrayBuffer ? to->arrayBuffer->hwid : 0;
    738765            diff_api.BindBufferARB(GL_ARRAY_BUFFER_ARB, bufferID);
    739766            if (bSwitch)
     
    778805        if (from->elementsBuffer != to->elementsBuffer)
    779806        {
    780             GLuint bufferID = to->elementsBuffer ? to->elementsBuffer->name : 0;
     807            GLuint bufferID = to->elementsBuffer ? to->elementsBuffer->hwid : 0;
    781808            diff_api.BindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, bufferID);
    782809            if (bSwitch)
     
    822849        if (from->packBuffer != to->packBuffer)
    823850        {
    824             GLuint bufferID = to->packBuffer ? to->packBuffer->name : 0;
     851            GLuint bufferID = to->packBuffer ? to->packBuffer->hwid : 0;
    825852            diff_api.BindBufferARB(GL_PIXEL_PACK_BUFFER_ARB, bufferID);
    826853            if (bSwitch)
     
    865892        if (from->unpackBuffer != to->unpackBuffer)
    866893        {
    867             GLuint bufferID = to->unpackBuffer ? to->unpackBuffer->name : 0;
     894            GLuint bufferID = to->unpackBuffer ? to->unpackBuffer->hwid : 0;
    868895            diff_api.BindBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB, bufferID);
    869896            if (bSwitch)
     
    921948    CRBufferObject *pBufferObj = (CRBufferObject *) data1;
    922949    CRBufferObjectState *pState = (CRBufferObjectState *) data2;
     950
     951    if (pBufferObj->id && !pBufferObj->hwid)
     952    {
     953        diff_api.GenBuffersARB(1, &pBufferObj->hwid);
     954        CRASSERT(pBufferObj->hwid);
     955    }
    923956
    924957    if (pBufferObj->data)
     
    931964          hurt performance."
    932965         */
    933         diff_api.BindBufferARB(GL_ARRAY_BUFFER_ARB, pBufferObj->name);
     966        diff_api.BindBufferARB(GL_ARRAY_BUFFER_ARB, pBufferObj->hwid);
    934967        diff_api.BufferDataARB(GL_ARRAY_BUFFER_ARB, pBufferObj->size, pBufferObj->data, pBufferObj->usage);
    935968
     
    946979 */
    947980void crStateBufferObjectSwitch(CRBufferObjectBits *bb, CRbitvalue *bitID,
    948                                                              CRContext *fromCtx, CRContext *toCtx)
     981                               CRContext *fromCtx, CRContext *toCtx)
    949982{
    950983    const CRBufferObjectState *from = &(fromCtx->bufferobject);
     
    960993        GLboolean locked = toCtx->client.array.locked;
    961994
    962         crHashtableWalk(to->buffers, crStateBufferObjectSyncCB, to);
     995        crHashtableWalk(toCtx->shared->buffersTable, crStateBufferObjectSyncCB, to);
    963996        to->bResyncNeeded = GL_FALSE;
    964997
    965998        /*@todo, move to state_client.c*/
    966999        cp = &toCtx->client.array.v;
    967         if (cp->buffer->name || locked)
    968         {
    969             diff_api.BindBufferARB(GL_ARRAY_BUFFER_ARB, cp->buffer->name);
     1000        if (cp->buffer->id || locked)
     1001        {
     1002            diff_api.BindBufferARB(GL_ARRAY_BUFFER_ARB, cp->buffer->hwid);
    9701003            diff_api.VertexPointer(cp->size, cp->type, cp->stride, cp->p);
    9711004        }
    9721005
    9731006        cp = &toCtx->client.array.c;
    974         if (cp->buffer->name || locked)
    975         {
    976             diff_api.BindBufferARB(GL_ARRAY_BUFFER_ARB, cp->buffer->name);
     1007        if (cp->buffer->id || locked)
     1008        {
     1009            diff_api.BindBufferARB(GL_ARRAY_BUFFER_ARB, cp->buffer->hwid);
    9771010            diff_api.ColorPointer(cp->size, cp->type, cp->stride, cp->p);
    9781011        }
    9791012
    9801013        cp = &toCtx->client.array.f;
    981         if (cp->buffer->name || locked)
    982         {
    983             diff_api.BindBufferARB(GL_ARRAY_BUFFER_ARB, cp->buffer->name);
     1014        if (cp->buffer->id || locked)
     1015        {
     1016            diff_api.BindBufferARB(GL_ARRAY_BUFFER_ARB, cp->buffer->hwid);
    9841017            diff_api.FogCoordPointerEXT(cp->type, cp->stride, cp->p);
    9851018        }
    9861019
    9871020        cp = &toCtx->client.array.s;
    988         if (cp->buffer->name || locked)
    989         {
    990             diff_api.BindBufferARB(GL_ARRAY_BUFFER_ARB, cp->buffer->name);
     1021        if (cp->buffer->id || locked)
     1022        {
     1023            diff_api.BindBufferARB(GL_ARRAY_BUFFER_ARB, cp->buffer->hwid);
    9911024            diff_api.SecondaryColorPointerEXT(cp->size, cp->type, cp->stride, cp->p);
    9921025        }
    9931026
    9941027        cp = &toCtx->client.array.e;
    995         if (cp->buffer->name || locked)
    996         {
    997             diff_api.BindBufferARB(GL_ARRAY_BUFFER_ARB, cp->buffer->name);
     1028        if (cp->buffer->id || locked)
     1029        {
     1030            diff_api.BindBufferARB(GL_ARRAY_BUFFER_ARB, cp->buffer->hwid);
    9981031            diff_api.EdgeFlagPointer(cp->stride, cp->p);
    9991032        }
    10001033
    10011034        cp = &toCtx->client.array.i;
    1002         if (cp->buffer->name || locked)
    1003         {
    1004             diff_api.BindBufferARB(GL_ARRAY_BUFFER_ARB, cp->buffer->name);
     1035        if (cp->buffer->id || locked)
     1036        {
     1037            diff_api.BindBufferARB(GL_ARRAY_BUFFER_ARB, cp->buffer->hwid);
    10051038            diff_api.IndexPointer(cp->type, cp->stride, cp->p);
    10061039        }
    10071040
    10081041        cp = &toCtx->client.array.n;
    1009         if (cp->buffer->name || locked)
    1010         {
    1011             diff_api.BindBufferARB(GL_ARRAY_BUFFER_ARB, cp->buffer->name);
     1042        if (cp->buffer->id || locked)
     1043        {
     1044            diff_api.BindBufferARB(GL_ARRAY_BUFFER_ARB, cp->buffer->hwid);
    10121045            diff_api.NormalPointer(cp->type, cp->stride, cp->p);
    10131046        }
     
    10161049        {
    10171050            cp = &toCtx->client.array.t[i];
    1018             if (cp->buffer->name || locked)
     1051            if (cp->buffer->id || locked)
    10191052            {
    10201053                if (diff_api.ActiveTextureARB)
    10211054                    diff_api.ActiveTextureARB(i+GL_TEXTURE0_ARB);
    1022                 diff_api.BindBufferARB(GL_ARRAY_BUFFER_ARB, cp->buffer->name);
     1055                diff_api.BindBufferARB(GL_ARRAY_BUFFER_ARB, cp->buffer->hwid);
    10231056                diff_api.TexCoordPointer(cp->size, cp->type, cp->stride, cp->p);
    10241057            }
     
    10321065        {
    10331066            cp = &toCtx->client.array.a[i];
    1034             if (cp->buffer->name || locked)
     1067            if (cp->buffer->id || locked)
    10351068            {
    1036                 diff_api.BindBufferARB(GL_ARRAY_BUFFER_ARB, cp->buffer->name);
     1069                diff_api.BindBufferARB(GL_ARRAY_BUFFER_ARB, cp->buffer->hwid);
    10371070                diff_api.VertexAttribPointerARB(i, cp->size, cp->type, cp->normalized, cp->stride, cp->p);
    10381071            }
    10391072        }
    10401073#endif
    1041         diff_api.BindBufferARB(GL_ARRAY_BUFFER_ARB, to->arrayBuffer->name);
    1042         diff_api.BindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, to->elementsBuffer->name);
     1074        diff_api.BindBufferARB(GL_ARRAY_BUFFER_ARB, to->arrayBuffer->hwid);
     1075        diff_api.BindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, to->elementsBuffer->hwid);
    10431076#ifdef CR_ARB_pixel_buffer_object
    1044         diff_api.BindBufferARB(GL_PIXEL_PACK_BUFFER_ARB, to->packBuffer->name);
    1045         diff_api.BindBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB, to->unpackBuffer->name);
     1077        diff_api.BindBufferARB(GL_PIXEL_PACK_BUFFER_ARB, to->packBuffer->hwid);
     1078        diff_api.BindBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB, to->unpackBuffer->hwid);
    10461079#endif
    10471080    }
  • trunk/src/VBox/GuestHost/OpenGL/state_tracker/state_client.c

    r31486 r31808  
    15171517
    15181518/*Returns if the given clientpointer could be used on server side directly*/
    1519 #define CRSTATE_IS_SERVER_CP(cp) (!(cp).enabled || !(cp).p || ((cp).buffer && (cp).buffer->name) || ((cp).locked))
     1519#define CRSTATE_IS_SERVER_CP(cp) (!(cp).enabled || !(cp).p || ((cp).buffer && (cp).buffer->id) || ((cp).locked))
    15201520
    15211521static void crStateDumpClientPointer(CRClientPointer *cp, const char *name, int i)
     
    15241524  {
    15251525    crDebug("CP(%s): enabled:%d ptr:%p buffer:%p buffer.name:%i locked: %i %s",
    1526             name, cp->enabled, cp->p, cp->buffer, cp->buffer? cp->buffer->name:-1, (int)cp->locked,
     1526            name, cp->enabled, cp->p, cp->buffer, cp->buffer? cp->buffer->id:-1, (int)cp->locked,
    15271527            CRSTATE_IS_SERVER_CP(*cp) ? "":"!FAIL!");
    15281528  }
     
    15301530  {
    15311531    crDebug("CP(%s%i): enabled:%d ptr:%p buffer:%p buffer.name:%i locked: %i %s",
    1532             name, i, cp->enabled, cp->p, cp->buffer, cp->buffer? cp->buffer->name:-1, (int)cp->locked,
     1532            name, i, cp->enabled, cp->p, cp->buffer, cp->buffer? cp->buffer->id:-1, (int)cp->locked,
    15331533            CRSTATE_IS_SERVER_CP(*cp) ? "":"!FAIL!");
    15341534  }
     
    16121612    CRContext *g = GetCurrentContext();
    16131613    if (g->bufferobject.elementsBuffer &&
    1614             g->bufferobject.elementsBuffer->name > 0)
     1614            g->bufferobject.elementsBuffer->id > 0)
    16151615        return GL_TRUE;
    16161616    else
  • trunk/src/VBox/GuestHost/OpenGL/state_tracker/state_extensions_get.txt

    r27091 r31808  
    5656
    5757GLboolean GL_TEXTURE_CUBE_MAP_ARB GL_ARB_texture_cube_map g->texture.unit[g->texture.curTextureUnit].enabledCubeMap
    58 GLint GL_TEXTURE_BINDING_CUBE_MAP_ARB GL_ARB_texture_cube_map g->texture.unit[g->texture.curTextureUnit].currentTextureCubeMap->name
     58GLint GL_TEXTURE_BINDING_CUBE_MAP_ARB GL_ARB_texture_cube_map g->texture.unit[g->texture.curTextureUnit].currentTextureCubeMap->id
    5959GLint GL_MAX_CUBE_MAP_TEXTURE_SIZE_ARB GL_ARB_texture_cube_map g->limits.maxCubeMapTextureSize
    6060
    6161# GL_NV_texture_rectangle
    6262GLboolean GL_TEXTURE_RECTANGLE_NV GL_NV_texture_rectangle g->texture.unit[g->texture.curTextureUnit].enabledRect
    63 GLint GL_TEXTURE_BINDING_RECTANGLE_NV GL_NV_texture_rectangle g->texture.unit[g->texture.curTextureUnit].currentTextureRect->name
     63GLint GL_TEXTURE_BINDING_RECTANGLE_NV GL_NV_texture_rectangle g->texture.unit[g->texture.curTextureUnit].currentTextureRect->id
    6464GLint GL_MAX_RECTANGLE_TEXTURE_SIZE_NV GL_NV_texture_rectangle g->limits.maxRectTextureSize
    6565
     
    131131
    132132# GL_ARB_vertex_buffer_object
    133 GLuint GL_ARRAY_BUFFER_BINDING_ARB GL_ARB_vertex_buffer_object g->bufferobject.arrayBuffer->name
    134 GLuint GL_ELEMENT_ARRAY_BUFFER_BINDING_ARB GL_ARB_vertex_buffer_object g->bufferobject.elementsBuffer->name
     133GLuint GL_ARRAY_BUFFER_BINDING_ARB GL_ARB_vertex_buffer_object g->bufferobject.arrayBuffer->id
     134GLuint GL_ELEMENT_ARRAY_BUFFER_BINDING_ARB GL_ARB_vertex_buffer_object g->bufferobject.elementsBuffer->id
    135135
    136136# GL_ARB_pixel_buffer_object
    137 GLuint GL_PIXEL_PACK_BUFFER_BINDING_ARB GL_ARB_pixel_buffer_object g->bufferobject.packBuffer->name
    138 GLuint GL_PIXEL_UNPACK_BUFFER_BINDING_ARB GL_ARB_pixel_buffer_object g->bufferobject.unpackBuffer->name
     137GLuint GL_PIXEL_PACK_BUFFER_BINDING_ARB GL_ARB_pixel_buffer_object g->bufferobject.packBuffer->id
     138GLuint GL_PIXEL_UNPACK_BUFFER_BINDING_ARB GL_ARB_pixel_buffer_object g->bufferobject.unpackBuffer->id
  • trunk/src/VBox/GuestHost/OpenGL/state_tracker/state_framebuffer.c

    r28800 r31808  
    3737    fbo->drawFB = NULL;
    3838    fbo->renderbuffer = NULL;
    39     fbo->framebuffers = crAllocHashtable();
    40     fbo->renderbuffers = crAllocHashtable();
    4139    fbo->bResyncNeeded = GL_FALSE;
    4240}
    4341
    44 static void crStateFreeFBO(void *data)
     42void crStateFreeFBO(void *data)
    4543{
    4644    CRFramebufferObject *pObj = (CRFramebufferObject *)data;
     
    5654}
    5755
    58 static void crStateFreeRBO(void *data)
     56void crStateFreeRBO(void *data)
    5957{
    6058    CRRenderbufferObject *pObj = (CRRenderbufferObject *)data;
     
    7876    fbo->drawFB = NULL;
    7977    fbo->renderbuffer = NULL;
    80 
    81     crFreeHashtable(fbo->framebuffers, crStateFreeFBO);
    82     crFreeHashtable(fbo->renderbuffers, crStateFreeRBO);
    8378}
    8479
     
    9489    if (renderbuffer)
    9590    {
    96         fbo->renderbuffer = (CRRenderbufferObject*) crHashtableSearch(fbo->renderbuffers, renderbuffer);
     91        fbo->renderbuffer = (CRRenderbufferObject*) crHashtableSearch(g->shared->rbTable, renderbuffer);
    9792        if (!fbo->renderbuffer)
    9893        {
     
    10297            fbo->renderbuffer->hwid = renderbuffer;
    10398            fbo->renderbuffer->internalformat = GL_RGBA;
    104             crHashtableAdd(fbo->renderbuffers, renderbuffer, fbo->renderbuffer);
     99            crHashtableAdd(g->shared->rbTable, renderbuffer, fbo->renderbuffer);
    105100        }
    106101    }
     
    161156        {
    162157            CRRenderbufferObject *rbo;
    163             rbo = (CRRenderbufferObject*) crHashtableSearch(fbo->renderbuffers, renderbuffers[i]);
     158            rbo = (CRRenderbufferObject*) crHashtableSearch(g->shared->rbTable, renderbuffers[i]);
    164159            if (rbo)
    165160            {
     
    173168                crStateCheckFBOAttachments(fbo->drawFB, renderbuffers[i], GL_DRAW_FRAMEBUFFER);
    174169
    175                 crHashtableDelete(fbo->renderbuffers, renderbuffers[i], crStateFreeRBO);
     170                crHashtableDelete(g->shared->rbTable, renderbuffers[i], crStateFreeRBO);
    176171            }
    177172        }
     
    291286    if (framebuffer)
    292287    {
    293         pFBO = (CRFramebufferObject*) crHashtableSearch(fbo->framebuffers, framebuffer);
     288        pFBO = (CRFramebufferObject*) crHashtableSearch(g->shared->fbTable, framebuffer);
    294289        if (!pFBO)
    295290        {
     
    299294            pFBO->hwid = framebuffer;
    300295            crStateInitFrameBuffer(pFBO);
    301             crHashtableAdd(fbo->framebuffers, framebuffer, pFBO);
     296            crHashtableAdd(g->shared->fbTable, framebuffer, pFBO);
    302297        }
    303298    }
     
    338333        {
    339334            CRFramebufferObject *fb;
    340             fb = (CRFramebufferObject*) crHashtableSearch(fbo->framebuffers, framebuffers[i]);
     335            fb = (CRFramebufferObject*) crHashtableSearch(g->shared->fbTable, framebuffers[i]);
    341336            if (fb)
    342337            {
     
    349344                    fbo->drawFB = NULL;
    350345                }
    351                 crHashtableDelete(fbo->framebuffers, framebuffers[i], crStateFreeFBO);
     346                crHashtableDelete(g->shared->fbTable, framebuffers[i], crStateFreeFBO);
    352347            }
    353348        }
     
    555550    }
    556551
    557     rb = (CRRenderbufferObject*) crHashtableSearch(fbo->renderbuffers, renderbuffer);
     552    rb = (CRRenderbufferObject*) crHashtableSearch(g->shared->rbTable, renderbuffer);
    558553    CRSTATE_FBO_CHECKERR(!rb, GL_INVALID_OPERATION, "rb doesn't exist");
    559554
     
    639634            if (tobj)
    640635            {
     636                CRASSERT(!tobj->id || tobj->hwid);
     637
    641638                switch (tobj->target)
    642639                {
    643640                    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);
    645642                        break;
    646643                    case GL_TEXTURE_2D:
    647644                    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);
    649646                        break;
    650647                    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);
    652649                        break;
    653650                    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);
    655652                        break;
    656653                    default:
     
    664661            break;
    665662        case GL_RENDERBUFFER_EXT:
    666             pRBO = (CRRenderbufferObject*) crHashtableSearch(ctx->framebufferobject.renderbuffers, pAP->name);
     663            pRBO = (CRRenderbufferObject*) crHashtableSearch(ctx->shared->rbTable, pAP->name);
    667664            diff_api.FramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, ap, GL_RENDERBUFFER_EXT, pRBO->hwid);
    668665            break;
     
    700697        to->framebufferobject.bResyncNeeded = GL_FALSE;
    701698
    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);
    704701
    705702        if (to->framebufferobject.drawFB==to->framebufferobject.readFB)
     
    751748{
    752749    CRContext *g = GetCurrentContext();
    753     CRFramebufferObject *pFBO = (CRFramebufferObject*) crHashtableSearch(g->framebufferobject.framebuffers, id);
     750    CRFramebufferObject *pFBO = (CRFramebufferObject*) crHashtableSearch(g->shared->fbTable, id);
    754751
    755752    return pFBO ? pFBO->hwid : 0;
     
    759756{
    760757    CRContext *g = GetCurrentContext();
    761     CRRenderbufferObject *pRBO = (CRRenderbufferObject*) crHashtableSearch(g->framebufferobject.renderbuffers, id);
     758    CRRenderbufferObject *pRBO = (CRRenderbufferObject*) crHashtableSearch(g->shared->rbTable, id);
    762759
    763760    return pRBO ? pRBO->hwid : 0;
     
    792789    parms.hwid = hwid;
    793790
    794     crHashtableWalk(g->framebufferobject.framebuffers, crStateCheckFBOHWIDCB, &parms);
     791    crHashtableWalk(g->shared->fbTable, crStateCheckFBOHWIDCB, &parms);
    795792    return parms.id;
    796793}
     
    804801    parms.hwid = hwid;
    805802
    806     crHashtableWalk(g->framebufferobject.renderbuffers, crStateCheckRBOHWIDCB, &parms);
     803    crHashtableWalk(g->shared->rbTable, crStateCheckRBOHWIDCB, &parms);
    807804    return parms.id;
    808805}
  • trunk/src/VBox/GuestHost/OpenGL/state_tracker/state_get.txt

    r23694 r31808  
    171171GLenum    GL_PERSPECTIVE_CORRECTION_HINT  g->hint.perspectiveCorrection
    172172
    173 GLint     GL_TEXTURE_BINDING_1D g->texture.unit[g->texture.curTextureUnit].currentTexture1D->name
    174 GLint     GL_TEXTURE_BINDING_2D g->texture.unit[g->texture.curTextureUnit].currentTexture2D->name
    175 GLint     GL_TEXTURE_BINDING_3D g->texture.unit[g->texture.curTextureUnit].currentTexture3D->name
     173GLint     GL_TEXTURE_BINDING_1D g->texture.unit[g->texture.curTextureUnit].currentTexture1D->id
     174GLint     GL_TEXTURE_BINDING_2D g->texture.unit[g->texture.curTextureUnit].currentTexture2D->id
     175GLint     GL_TEXTURE_BINDING_3D g->texture.unit[g->texture.curTextureUnit].currentTexture3D->id
    176176GLenum    GL_TEXTURE_ENV_MODE   g->texture.unit[g->texture.curTextureUnit].envMode
    177177
  • trunk/src/VBox/GuestHost/OpenGL/state_tracker/state_init.c

    r30440 r31808  
    1919GLboolean g_availableContexts[CR_MAX_CONTEXTS];
    2020
     21static CRSharedState *gSharedState=NULL;
     22
    2123static CRContext *defaultContext = NULL;
    2224
     
    3436        s->textureTable = crAllocHashtable();
    3537        s->dlistTable = crAllocHashtable();
     38        s->buffersTable = crAllocHashtable();
     39        s->fbTable = crAllocHashtable();
     40        s->rbTable = crAllocHashtable();
    3641        s->refCount = 1; /* refcount is number of contexts using this state */
     42        s->saveCount = 0;
    3743    }
    3844    return s;
     
    4854{
    4955#ifndef IN_GUEST
    50     diff_api.DeleteTextures(1, &((CRTextureObj *)texObj)->name);
     56    diff_api.DeleteTextures(1, &((CRTextureObj *)texObj)->hwid);
    5157#endif
    5258    crStateDeleteTextureObject((CRTextureObj *) texObj);
    5359}
    54 
    5560
    5661/**
    5762 * Decrement shared state's refcount and delete when it hits zero.
    5863 */
    59 static void
     64DECLEXPORT(void)
    6065crStateFreeShared(CRSharedState *s)
    6166{
    6267    s->refCount--;
    6368    if (s->refCount <= 0) {
     69        if (s==gSharedState)
     70        {
     71            gSharedState = NULL;
     72        }
    6473        crFreeHashtable(s->textureTable, DeleteTextureCallback);
    6574        crFreeHashtable(s->dlistTable, crFree); /* call crFree for each entry */
     75        crFreeHashtable(s->buffersTable, crStateFreeBufferObject);
     76        crFreeHashtable(s->fbTable, crStateFreeFBO);
     77        crFreeHashtable(s->rbTable, crStateFreeRBO);
    6678        crFree(s);
    6779    }
    6880}
    6981
     82DECLEXPORT(void) STATE_APIENTRY
     83crStateShareContext(GLboolean value)
     84{
     85    CRContext *pCtx = GetCurrentContext();
     86    CRASSERT(pCtx && pCtx->shared);
     87
     88    if (value)
     89    {
     90        if (pCtx->shared == gSharedState)
     91        {
     92            return;
     93        }
     94
     95        crDebug("Context(%i) shared", pCtx->id);
     96
     97        if (!gSharedState)
     98        {
     99            gSharedState = pCtx->shared;
     100        }
     101        else
     102        {
     103            crStateFreeShared(pCtx->shared);
     104            pCtx->shared = gSharedState;
     105            gSharedState->refCount++;
     106        }
     107    }
     108    else
     109    {
     110        if (pCtx->shared != gSharedState)
     111        {
     112            return;
     113        }
     114
     115        crDebug("Context(%i) unshared", pCtx->id);
     116
     117        if (gSharedState->refCount==1)
     118        {
     119            gSharedState = NULL;
     120        }
     121        else
     122        {
     123            pCtx->shared = crStateAllocShared();
     124            pCtx->shared->id = pCtx->id;
     125            crStateFreeShared(gSharedState);
     126        }
     127    }
     128}
    70129
    71130/*
     
    101160    else {
    102161        ctx->shared = crStateAllocShared();
     162        ctx->shared->id = ctx->id;
    103163    }
    104164
     
    179239    }
    180240
     241/*
     242    if (ctx->id>0)
     243    {
     244        crStateShareContext(GL_TRUE);
     245    }
     246*/
     247
    181248    return ctx;
    182249}
  • trunk/src/VBox/GuestHost/OpenGL/state_tracker/state_snapshot.c

    r28800 r31808  
    6969    CRASSERT(pTexture && pSSM);
    7070
    71     crDebug("crStateSaveTextureObjData %u. START", pTexture->name);
     71    crDebug("crStateSaveTextureObjData %u. START", pTexture->id);
    7272
    7373    for (face = 0; face < 6; face++) {
     
    9898                if (!bound)
    9999                {
    100                     diff_api.BindTexture(pTexture->target, pTexture->name);
     100                    diff_api.BindTexture(pTexture->target, pTexture->hwid);
    101101                    bound = GL_TRUE;
    102102                }
     
    164164    }
    165165
    166     crDebug("crStateSaveTextureObjData %u. END", pTexture->name);
     166    crDebug("crStateSaveTextureObjData %u. END", pTexture->id);
    167167
    168168    return VINF_SUCCESS;
     
    251251     */
    252252    if (pTexture)
    253         return SSMR3PutU32(pSSM, pTexture->name);
     253        return SSMR3PutU32(pSSM, pTexture->id);
    254254    else
    255255        return VINF_SUCCESS;
     
    488488        CRASSERT(rc == VINF_SUCCESS);
    489489    }
    490     else if (pBufferObj->name!=0 && pBufferObj->size>0)
    491     {
    492         diff_api.BindBufferARB(GL_ARRAY_BUFFER_ARB, pBufferObj->name);
     490    else if (pBufferObj->id!=0 && pBufferObj->size>0)
     491    {
     492        diff_api.BindBufferARB(GL_ARRAY_BUFFER_ARB, pBufferObj->hwid);
    493493        pBufferObj->pointer = diff_api.MapBufferARB(GL_ARRAY_BUFFER_ARB, GL_READ_ONLY_ARB);
    494494        rc = SSMR3PutMem(pSSM, &pBufferObj->pointer, sizeof(pBufferObj->pointer));
     
    856856    cp = crStateGetClientPointerByIndex(index, pArrays);
    857857
    858     rc = SSMR3PutU32(pSSM, cp->buffer->name);
     858    rc = SSMR3PutU32(pSSM, cp->buffer->id);
    859859    AssertRCReturn(rc, rc);
    860860
     
    881881    rc = SSMR3GetU32(pSSM, &ui);
    882882    AssertRCReturn(rc, rc);
    883     cp->buffer = ui==0 ? pContext->bufferobject.nullBuffer : crHashtableSearch(pContext->bufferobject.buffers, ui);
     883    cp->buffer = ui==0 ? pContext->bufferobject.nullBuffer : crHashtableSearch(pContext->shared->buffersTable, ui);
    884884
    885885#ifdef CR_EXT_compiled_vertex_array
     
    10111011    int32_t rc, i;
    10121012    uint32_t ui32, j;
     1013    GLboolean bSaveShared = GL_TRUE;
    10131014
    10141015    CRASSERT(pContext && pSSM);
     
    10221023    if (crHashtableNumElements(pContext->program.programHash)>0)
    10231024        crDebug("Saving state with %d programs", crHashtableNumElements(pContext->program.programHash));
     1025
     1026    rc = SSMR3PutS32(pSSM, pContext->shared->id);
     1027    if (pContext->shared->refCount>1)
     1028    {
     1029        bSaveShared = pContext->shared->saveCount==0;
     1030
     1031        ++pContext->shared->saveCount;
     1032        if (pContext->shared->saveCount == pContext->shared->refCount)
     1033        {
     1034            pContext->shared->saveCount=0;
     1035        }
     1036    }
    10241037
    10251038    /* Save transform state */
     
    10711084
    10721085    /* Save shared textures */
    1073     CRASSERT(pContext->shared && pContext->shared->textureTable);
    1074     ui32 = crHashtableNumElements(pContext->shared->textureTable);
    1075     rc = SSMR3PutU32(pSSM, ui32);
    1076     AssertRCReturn(rc, rc);
    1077     crHashtableWalk(pContext->shared->textureTable, crStateSaveSharedTextureCB, pSSM);
     1086    if (bSaveShared)
     1087    {
     1088        CRASSERT(pContext->shared && pContext->shared->textureTable);
     1089        ui32 = crHashtableNumElements(pContext->shared->textureTable);
     1090        rc = SSMR3PutU32(pSSM, ui32);
     1091        AssertRCReturn(rc, rc);
     1092        crHashtableWalk(pContext->shared->textureTable, crStateSaveSharedTextureCB, pSSM);
    10781093
    10791094#ifdef CR_STATE_NO_TEXTURE_IMAGE_STORE
    1080     /* Restore previous texture bindings via diff_api */
    1081     if (ui32)
    1082     {
    1083         CRTextureUnit *pTexUnit;
    1084 
    1085         pTexUnit = &pContext->texture.unit[pContext->texture.curTextureUnit];
    1086 
    1087         diff_api.BindTexture(GL_TEXTURE_1D, pTexUnit->currentTexture1D->name);
    1088         diff_api.BindTexture(GL_TEXTURE_2D, pTexUnit->currentTexture2D->name);
    1089         diff_api.BindTexture(GL_TEXTURE_3D, pTexUnit->currentTexture3D->name);
     1095        /* Restore previous texture bindings via diff_api */
     1096        if (ui32)
     1097        {
     1098            CRTextureUnit *pTexUnit;
     1099
     1100            pTexUnit = &pContext->texture.unit[pContext->texture.curTextureUnit];
     1101
     1102            diff_api.BindTexture(GL_TEXTURE_1D, pTexUnit->currentTexture1D->hwid);
     1103            diff_api.BindTexture(GL_TEXTURE_2D, pTexUnit->currentTexture2D->hwid);
     1104            diff_api.BindTexture(GL_TEXTURE_3D, pTexUnit->currentTexture3D->hwid);
    10901105#ifdef CR_ARB_texture_cube_map
    1091         diff_api.BindTexture(GL_TEXTURE_CUBE_MAP_ARB, pTexUnit->currentTextureCubeMap->name);
     1106            diff_api.BindTexture(GL_TEXTURE_CUBE_MAP_ARB, pTexUnit->currentTextureCubeMap->hwid);
    10921107#endif
    10931108#ifdef CR_NV_texture_rectangle
    1094         diff_api.BindTexture(GL_TEXTURE_RECTANGLE_NV, pTexUnit->currentTextureRect->name);
    1095 #endif
    1096     }
    1097 #endif
     1109            diff_api.BindTexture(GL_TEXTURE_RECTANGLE_NV, pTexUnit->currentTextureRect->hwid);
     1110#endif
     1111        }
     1112#endif
     1113    }
    10981114
    10991115    /* Save current texture pointers */
     
    11681184#ifdef CR_ARB_vertex_buffer_object
    11691185    /* Save buffer objects */
    1170     ui32 = crHashtableNumElements(pContext->bufferobject.buffers);
     1186    ui32 = bSaveShared? crHashtableNumElements(pContext->shared->buffersTable):0;
    11711187    rc = SSMR3PutU32(pSSM, ui32);
    11721188    AssertRCReturn(rc, rc);
     1189
    11731190    /* Save default one*/
    11741191    crStateSaveBufferObjectCB(0, pContext->bufferobject.nullBuffer, pSSM);
    1175     /* Save all the rest */
    1176     crHashtableWalk(pContext->bufferobject.buffers, crStateSaveBufferObjectCB, pSSM);
     1192
     1193    if (bSaveShared)
     1194    {
     1195        /* Save all the rest */
     1196        crHashtableWalk(pContext->shared->buffersTable, crStateSaveBufferObjectCB, pSSM);
     1197    }
     1198
    11771199    /* Restore binding */
    1178     diff_api.BindBufferARB(GL_ARRAY_BUFFER_ARB, pContext->bufferobject.arrayBuffer->name);
     1200    diff_api.BindBufferARB(GL_ARRAY_BUFFER_ARB, pContext->bufferobject.arrayBuffer->hwid);
     1201
    11791202    /* Save pointers */
    1180     rc = SSMR3PutU32(pSSM, pContext->bufferobject.arrayBuffer->name);
    1181     AssertRCReturn(rc, rc);
    1182     rc = SSMR3PutU32(pSSM, pContext->bufferobject.elementsBuffer->name);
     1203    rc = SSMR3PutU32(pSSM, pContext->bufferobject.arrayBuffer->id);
     1204    AssertRCReturn(rc, rc);
     1205    rc = SSMR3PutU32(pSSM, pContext->bufferobject.elementsBuffer->id);
    11831206    AssertRCReturn(rc, rc);
    11841207#ifdef CR_ARB_pixel_buffer_object
    1185     rc = SSMR3PutU32(pSSM, pContext->bufferobject.packBuffer->name);
    1186     AssertRCReturn(rc, rc);
    1187     rc = SSMR3PutU32(pSSM, pContext->bufferobject.unpackBuffer->name);
     1208    rc = SSMR3PutU32(pSSM, pContext->bufferobject.packBuffer->id);
     1209    AssertRCReturn(rc, rc);
     1210    rc = SSMR3PutU32(pSSM, pContext->bufferobject.unpackBuffer->id);
    11881211    AssertRCReturn(rc, rc);
    11891212#endif
     
    12261249#ifdef CR_EXT_framebuffer_object
    12271250    /* Save FBOs */
    1228     ui32 = crHashtableNumElements(pContext->framebufferobject.framebuffers);
    1229     rc = SSMR3PutU32(pSSM, ui32);
    1230     AssertRCReturn(rc, rc);
    1231     crHashtableWalk(pContext->framebufferobject.framebuffers, crStateSaveFramebuffersCB, pSSM);
    1232     ui32 = crHashtableNumElements(pContext->framebufferobject.renderbuffers);
    1233     rc = SSMR3PutU32(pSSM, ui32);
    1234     AssertRCReturn(rc, rc);
    1235     crHashtableWalk(pContext->framebufferobject.renderbuffers, crStateSaveRenderbuffersCB, pSSM);
     1251    if (bSaveShared)
     1252    {
     1253        ui32 = crHashtableNumElements(pContext->shared->fbTable);
     1254        rc = SSMR3PutU32(pSSM, ui32);
     1255        AssertRCReturn(rc, rc);
     1256        crHashtableWalk(pContext->shared->fbTable, crStateSaveFramebuffersCB, pSSM);
     1257        ui32 = crHashtableNumElements(pContext->shared->rbTable);
     1258        rc = SSMR3PutU32(pSSM, ui32);
     1259        AssertRCReturn(rc, rc);
     1260        crHashtableWalk(pContext->shared->rbTable, crStateSaveRenderbuffersCB, pSSM);
     1261    }
    12361262    rc = SSMR3PutU32(pSSM, pContext->framebufferobject.drawFB?pContext->framebufferobject.drawFB->id:0);
    12371263    AssertRCReturn(rc, rc);
     
    12991325}
    13001326
     1327typedef struct _crFindSharedCtxParms {
     1328    CRContext *pSrcCtx, *pDstCtx;
     1329} crFindSharedCtxParms_t;
     1330
     1331static void crStateFindSharedCB(unsigned long key, void *data1, void *data2)
     1332{
     1333    CRContext *pContext = (CRContext *) data1;
     1334    crFindSharedCtxParms_t *pParms = (crFindSharedCtxParms_t *) data2;
     1335    (void) key;
     1336
     1337    if (pContext!=pParms->pSrcCtx && pContext->shared->id==pParms->pSrcCtx->shared->id)
     1338    {
     1339        pParms->pDstCtx->shared = pContext->shared;
     1340    }
     1341}
     1342
    13011343#define SLC_COPYPTR(ptr) pTmpContext->ptr = pContext->ptr
    13021344#define SLC_ASSSERT_NULL_PTR(ptr) CRASSERT(!pContext->ptr)
    13031345
    1304 int32_t crStateLoadContext(CRContext *pContext, PSSMHANDLE pSSM)
     1346int32_t crStateLoadContext(CRContext *pContext, CRHashTable * pCtxTable, PSSMHANDLE pSSM)
    13051347{
    13061348    CRContext* pTmpContext;
     
    13081350    uint32_t uiNumElems, ui, k;
    13091351    unsigned long key;
     1352    GLboolean bLoadShared = GL_TRUE;
    13101353
    13111354    CRASSERT(pContext && pSSM);
     
    13191362    AssertRCReturn(rc, rc);
    13201363
    1321     SLC_COPYPTR(shared);
     1364    /* Deal with shared state */
     1365    {
     1366        crFindSharedCtxParms_t parms;
     1367
     1368        rc = SSMR3GetS32(pSSM, &pContext->shared->id);
     1369        AssertRCReturn(rc, rc);
     1370
     1371        pTmpContext->shared = NULL;
     1372        parms.pSrcCtx = pContext;
     1373        parms.pDstCtx = pTmpContext;
     1374        crHashtableWalk(pCtxTable, crStateFindSharedCB, &parms);
     1375
     1376        if (pTmpContext->shared)
     1377        {
     1378            CRASSERT(pContext->shared->refCount==1 && pTmpContext->shared->refCount>1);
     1379            bLoadShared = GL_FALSE;
     1380            crStateFreeShared(pContext->shared);
     1381            pContext->shared = NULL;
     1382        }
     1383        else
     1384        {
     1385            SLC_COPYPTR(shared);
     1386        }
     1387    }
     1388
    13221389    SLC_COPYPTR(flush_func);
    13231390    SLC_COPYPTR(flush_arg);
     
    13411408
    13421409#ifdef CR_ARB_vertex_buffer_object
    1343     SLC_COPYPTR(bufferobject.buffers);
    13441410    SLC_COPYPTR(bufferobject.nullBuffer);
    13451411#endif
     
    14491515    }
    14501516
    1451 #ifdef CR_EXT_framebuffer_object
    1452     SLC_COPYPTR(framebufferobject.framebuffers);
    1453     SLC_COPYPTR(framebufferobject.renderbuffers);
    1454 #endif
    1455 
    14561517#ifdef CR_OPENGL_VERSION_2_0
    14571518    SLC_COPYPTR(glsl.shaders);
     
    15161577#endif
    15171578
    1518     /* Load shared textures */
    1519     CRASSERT(pContext->shared && pContext->shared->textureTable);
    1520     rc = SSMR3GetU32(pSSM, &uiNumElems);
    1521     AssertRCReturn(rc, rc);
    1522     for (ui=0; ui<uiNumElems; ++ui)
    1523     {
    1524         CRTextureObj *pTexture;
    1525 
    1526         rc = SSMR3GetMem(pSSM, &key, sizeof(key));
    1527         AssertRCReturn(rc, rc);
    1528 
    1529         pTexture = (CRTextureObj *) crCalloc(sizeof(CRTextureObj));
    1530         if (!pTexture) return VERR_NO_MEMORY;
    1531 
    1532         rc = SSMR3GetMem(pSSM, pTexture, sizeof(*pTexture));
    1533         AssertRCReturn(rc, rc);
    1534 
    1535         /*allocate actual memory*/
    1536         for (i=0; i<6; ++i) {
    1537             pTexture->level[i] = (CRTextureLevel *) crCalloc(sizeof(CRTextureLevel) * CR_MAX_MIPMAP_LEVELS);
    1538             if (!pTexture->level[i]) return VERR_NO_MEMORY;
    1539         }
    1540 
    1541         rc = crStateLoadTextureObjData(pTexture, pSSM);
    1542         AssertRCReturn(rc, rc);
    1543 
    1544         crHashtableAdd(pContext->shared->textureTable, key, pTexture);
     1579    if (bLoadShared)
     1580    {
     1581        /* Load shared textures */
     1582        CRASSERT(pContext->shared && pContext->shared->textureTable);
     1583        rc = SSMR3GetU32(pSSM, &uiNumElems);
     1584        AssertRCReturn(rc, rc);
     1585        for (ui=0; ui<uiNumElems; ++ui)
     1586        {
     1587            CRTextureObj *pTexture;
     1588
     1589            rc = SSMR3GetMem(pSSM, &key, sizeof(key));
     1590            AssertRCReturn(rc, rc);
     1591
     1592            pTexture = (CRTextureObj *) crCalloc(sizeof(CRTextureObj));
     1593            if (!pTexture) return VERR_NO_MEMORY;
     1594
     1595            rc = SSMR3GetMem(pSSM, pTexture, sizeof(*pTexture));
     1596            AssertRCReturn(rc, rc);
     1597
     1598            pTexture->hwid = 0;
     1599
     1600            /*allocate actual memory*/
     1601            for (i=0; i<6; ++i) {
     1602                pTexture->level[i] = (CRTextureLevel *) crCalloc(sizeof(CRTextureLevel) * CR_MAX_MIPMAP_LEVELS);
     1603                if (!pTexture->level[i]) return VERR_NO_MEMORY;
     1604            }
     1605
     1606            rc = crStateLoadTextureObjData(pTexture, pSSM);
     1607            AssertRCReturn(rc, rc);
     1608
     1609            crHashtableAdd(pContext->shared->textureTable, key, pTexture);
     1610        }
    15451611    }
    15461612
     
    16411707        AssertRCReturn(rc, rc);
    16421708
     1709        pBufferObj->hwid = 0;
     1710
    16431711        if (pBufferObj->data)
    16441712        {
     
    16481716            AssertRCReturn(rc, rc);
    16491717        }
    1650         else if (pBufferObj->name!=0 && pBufferObj->size>0)
     1718        else if (pBufferObj->id!=0 && pBufferObj->size>0)
    16511719        {
    16521720            rc = SSMR3GetMem(pSSM, &pBufferObj->data, sizeof(pBufferObj->data));
     
    16631731
    16641732        if (key!=0)
    1665             crHashtableAdd(pContext->bufferobject.buffers, key, pBufferObj);       
     1733            crHashtableAdd(pContext->shared->buffersTable, key, pBufferObj);       
    16661734    }
    16671735    /* Load pointers */
    1668 #define CRS_GET_BO(name) (((name)==0) ? (pContext->bufferobject.nullBuffer) : crHashtableSearch(pContext->bufferobject.buffers, name))
     1736#define CRS_GET_BO(name) (((name)==0) ? (pContext->bufferobject.nullBuffer) : crHashtableSearch(pContext->shared->buffersTable, name))
    16691737    rc = SSMR3GetU32(pSSM, &ui);
    16701738    AssertRCReturn(rc, rc);
     
    17351803#ifdef CR_EXT_framebuffer_object
    17361804    /* Load FBOs */
    1737     rc = SSMR3GetU32(pSSM, &uiNumElems);
    1738     AssertRCReturn(rc, rc);
    1739     for (ui=0; ui<uiNumElems; ++ui)
    1740     {
    1741         CRFramebufferObject *pFBO;
    1742         pFBO = crAlloc(sizeof(*pFBO));
    1743         if (!pFBO) return VERR_NO_MEMORY;
    1744 
    1745         rc = SSMR3GetMem(pSSM, &key, sizeof(key));
    1746         AssertRCReturn(rc, rc);
    1747 
    1748         rc = SSMR3GetMem(pSSM, pFBO, sizeof(*pFBO));
    1749         AssertRCReturn(rc, rc);
    1750 
    1751         crHashtableAdd(pContext->framebufferobject.framebuffers, key, pFBO);
    1752     }
    1753 
    1754     rc = SSMR3GetU32(pSSM, &uiNumElems);
    1755     AssertRCReturn(rc, rc);
    1756     for (ui=0; ui<uiNumElems; ++ui)
    1757     {
    1758         CRRenderbufferObject *pRBO;
    1759         pRBO = crAlloc(sizeof(*pRBO));
    1760         if (!pRBO) return VERR_NO_MEMORY;
    1761 
    1762         rc = SSMR3GetMem(pSSM, &key, sizeof(key));
    1763         AssertRCReturn(rc, rc);
    1764 
    1765         rc = SSMR3GetMem(pSSM, pRBO, sizeof(*pRBO));
    1766         AssertRCReturn(rc, rc);
    1767 
    1768         crHashtableAdd(pContext->framebufferobject.renderbuffers, key, pRBO);
     1805    if (bLoadShared)
     1806    {
     1807        rc = SSMR3GetU32(pSSM, &uiNumElems);
     1808        AssertRCReturn(rc, rc);
     1809        for (ui=0; ui<uiNumElems; ++ui)
     1810        {
     1811            CRFramebufferObject *pFBO;
     1812            pFBO = crAlloc(sizeof(*pFBO));
     1813            if (!pFBO) return VERR_NO_MEMORY;
     1814
     1815            rc = SSMR3GetMem(pSSM, &key, sizeof(key));
     1816            AssertRCReturn(rc, rc);
     1817
     1818            rc = SSMR3GetMem(pSSM, pFBO, sizeof(*pFBO));
     1819            AssertRCReturn(rc, rc);
     1820
     1821            crHashtableAdd(pContext->shared->fbTable, key, pFBO);
     1822        }
     1823
     1824        rc = SSMR3GetU32(pSSM, &uiNumElems);
     1825        AssertRCReturn(rc, rc);
     1826        for (ui=0; ui<uiNumElems; ++ui)
     1827        {
     1828            CRRenderbufferObject *pRBO;
     1829            pRBO = crAlloc(sizeof(*pRBO));
     1830            if (!pRBO) return VERR_NO_MEMORY;
     1831
     1832            rc = SSMR3GetMem(pSSM, &key, sizeof(key));
     1833            AssertRCReturn(rc, rc);
     1834
     1835            rc = SSMR3GetMem(pSSM, pRBO, sizeof(*pRBO));
     1836            AssertRCReturn(rc, rc);
     1837
     1838            crHashtableAdd(pContext->shared->rbTable, key, pRBO);
     1839        }
    17691840    }
    17701841
     
    17721843    AssertRCReturn(rc, rc);
    17731844    pContext->framebufferobject.drawFB = ui==0 ? NULL
    1774                                                : crHashtableSearch(pContext->framebufferobject.framebuffers, ui);
     1845                                               : crHashtableSearch(pContext->shared->fbTable, ui);
    17751846
    17761847    rc = SSMR3GetU32(pSSM, &ui);
    17771848    AssertRCReturn(rc, rc);
    17781849    pContext->framebufferobject.readFB = ui==0 ? NULL
    1779                                                : crHashtableSearch(pContext->framebufferobject.framebuffers, ui);
     1850                                               : crHashtableSearch(pContext->shared->fbTable, ui);
    17801851
    17811852    rc = SSMR3GetU32(pSSM, &ui);
    17821853    AssertRCReturn(rc, rc);
    17831854    pContext->framebufferobject.renderbuffer = ui==0 ? NULL
    1784                                                      : crHashtableSearch(pContext->framebufferobject.renderbuffers, ui);
     1855                                                     : crHashtableSearch(pContext->shared->rbTable, ui);
    17851856
    17861857    /* Mark FBOs/RBOs for resending to GPU */
  • trunk/src/VBox/GuestHost/OpenGL/state_tracker/state_texdiff.c

    r16969 r31808  
    185185                activeUnit = i;
    186186            }
    187             if (from->unit[i].currentTexture1D->name != to->unit[i].currentTexture1D->name)
    188             {
    189                 diff_api.BindTexture(GL_TEXTURE_1D, to->unit[i].currentTexture1D->name);
     187            if (from->unit[i].currentTexture1D->id != to->unit[i].currentTexture1D->id)
     188            {
     189                diff_api.BindTexture(GL_TEXTURE_1D, crStateGetTextureObjHWID(to->unit[i].currentTexture1D));
    190190                FILLDIRTY(tb->current[i]);
    191191                FILLDIRTY(tb->dirty);
    192192            }
    193             if (from->unit[i].currentTexture2D->name != to->unit[i].currentTexture2D->name)
    194             {
    195                 diff_api.BindTexture(GL_TEXTURE_2D, to->unit[i].currentTexture2D->name);
     193            if (from->unit[i].currentTexture2D->id != to->unit[i].currentTexture2D->id)
     194            {
     195                diff_api.BindTexture(GL_TEXTURE_2D, crStateGetTextureObjHWID(to->unit[i].currentTexture2D));
    196196                FILLDIRTY(tb->current[i]);
    197197                FILLDIRTY(tb->dirty);
    198198            }
    199199#ifdef CR_OPENGL_VERSION_1_2
    200             if (from->unit[i].currentTexture3D->name != to->unit[i].currentTexture3D->name) {
    201                 diff_api.BindTexture(GL_TEXTURE_3D, to->unit[i].currentTexture3D->name);
     200            if (from->unit[i].currentTexture3D->id != to->unit[i].currentTexture3D->id) {
     201                diff_api.BindTexture(GL_TEXTURE_3D, crStateGetTextureObjHWID(to->unit[i].currentTexture3D));
    202202                FILLDIRTY(tb->current[i]);
    203203                FILLDIRTY(tb->dirty);
     
    206206#ifdef CR_ARB_texture_cube_map
    207207            if (fromCtx->extensions.ARB_texture_cube_map &&
    208                 from->unit[i].currentTextureCubeMap->name != to->unit[i].currentTextureCubeMap->name) {
    209                 diff_api.BindTexture(GL_TEXTURE_CUBE_MAP_ARB, to->unit[i].currentTextureCubeMap->name);
     208                from->unit[i].currentTextureCubeMap->id != to->unit[i].currentTextureCubeMap->id) {
     209                diff_api.BindTexture(GL_TEXTURE_CUBE_MAP_ARB, crStateGetTextureObjHWID(to->unit[i].currentTextureCubeMap));
    210210                FILLDIRTY(tb->current[i]);
    211211                FILLDIRTY(tb->dirty);
     
    214214#ifdef CR_NV_texture_rectangle
    215215            if (fromCtx->extensions.NV_texture_rectangle &&
    216                 from->unit[i].currentTextureRect->name != to->unit[i].currentTextureRect->name) {
    217                 diff_api.BindTexture(GL_TEXTURE_RECTANGLE_NV, to->unit[i].currentTextureRect->name);
     216                from->unit[i].currentTextureRect->id != to->unit[i].currentTextureRect->id) {
     217                diff_api.BindTexture(GL_TEXTURE_RECTANGLE_NV, crStateGetTextureObjHWID(to->unit[i].currentTextureRect));
    218218                FILLDIRTY(tb->current[i]);
    219219                FILLDIRTY(tb->dirty);
     
    616616#endif
    617617
    618     diff_api.BindTexture( tobj->target, tobj->name );
     618    diff_api.BindTexture(tobj->target, crStateGetTextureObjHWID(tobj));
    619619
    620620    if (alwaysDirty || CHECKDIRTY(tobj->paramsBit[u], bitID))
     
    13041304                if (*fromBinding != tobj)
    13051305                {
    1306                     diff_api.BindTexture(tobj->target, tobj->name);
     1306                    diff_api.BindTexture(tobj->target, crStateGetTextureObjHWID(tobj));
    13071307                    *fromBinding = tobj;
    13081308                }
     
    13891389    /* save current texture bindings */
    13901390    origUnit = g->texture.curTextureUnit;
    1391     orig1D = g->texture.unit[0].currentTexture1D->name;
    1392     orig2D = g->texture.unit[0].currentTexture2D->name;
    1393     orig3D = g->texture.unit[0].currentTexture3D->name;
     1391    orig1D = crStateGetTextureObjHWID(g->texture.unit[0].currentTexture1D);
     1392    orig2D = crStateGetTextureObjHWID(g->texture.unit[0].currentTexture2D);
     1393    orig3D = crStateGetTextureObjHWID(g->texture.unit[0].currentTexture3D);
    13941394#ifdef CR_ARB_texture_cube_map
    1395     origCube = g->texture.unit[0].currentTextureCubeMap->name;
     1395    origCube = crStateGetTextureObjHWID(g->texture.unit[0].currentTextureCubeMap);
    13961396#endif
    13971397#ifdef CR_NV_texture_rectangle
    1398     origRect = g->texture.unit[0].currentTextureRect->name;
     1398    origRect = crStateGetTextureObjHWID(g->texture.unit[0].currentTextureRect);
    13991399#endif
    14001400
  • trunk/src/VBox/GuestHost/OpenGL/state_tracker/state_texture.c

    r31781 r31808  
    172172void
    173173crStateTextureInitTextureObj(CRContext *ctx, CRTextureObj *tobj,
    174                                                          GLuint name, GLenum target)
     174                             GLuint name, GLenum target)
    175175{
    176176    const CRTextureState *t = &(ctx->texture);
     
    194194#endif
    195195    tobj->target        = target;
    196     tobj->name          = name;
     196    tobj->id            = name;
     197    tobj->hwid          = 0;
     198
     199#ifndef IN_GUEST
     200    crStateGetTextureObjHWID(tobj);
     201#endif
    197202
    198203    CRASSERT(t->maxLevel);
     
    31473152    return tobj != NULL;
    31483153}
     3154
     3155static void crStateCheckTextureHWIDCB(unsigned long key, void *data1, void *data2)
     3156{
     3157    CRTextureObj *pTex = (CRTextureObj *) data1;
     3158    crCheckIDHWID_t *pParms = (crCheckIDHWID_t*) data2;
     3159    (void) key;
     3160
     3161    if (crStateGetTextureObjHWID(pTex)==pParms->hwid)
     3162        pParms->id = pTex->id;
     3163}
     3164
     3165DECLEXPORT(GLuint) STATE_APIENTRY crStateTextureHWIDtoID(GLuint hwid)
     3166{
     3167    CRContext *g = GetCurrentContext();
     3168    crCheckIDHWID_t parms;
     3169
     3170    parms.id = hwid;
     3171    parms.hwid = hwid;
     3172
     3173    crHashtableWalk(g->shared->textureTable, crStateCheckTextureHWIDCB, &parms);
     3174    return parms.id;
     3175}
     3176
     3177DECLEXPORT(GLuint) STATE_APIENTRY crStateGetTextureHWID(GLuint id)
     3178{
     3179    CRContext *g = GetCurrentContext();
     3180    CRTextureObj *tobj = GET_TOBJ(tobj, g, id);
     3181
     3182    return tobj ? crStateGetTextureObjHWID(tobj) : 0;
     3183}
     3184
     3185DECLEXPORT(GLuint) STATE_APIENTRY crStateGetTextureObjHWID(CRTextureObj *tobj)
     3186{
     3187    CRASSERT(tobj);
     3188
     3189#ifndef IN_GUEST
     3190    if (tobj->id && !tobj->hwid)
     3191    {
     3192        CRASSERT(diff_api.GenTextures);
     3193        diff_api.GenTextures(1, &tobj->hwid);
     3194        CRASSERT(tobj->hwid);
     3195    }
     3196#endif
     3197
     3198    return tobj->hwid;
     3199}
  • trunk/src/VBox/GuestHost/OpenGL/util/hash.c

    r21668 r31808  
    417417    crUnlockMutex(&h->mutex);
    418418#endif
    419     for ( i = 0; i < range; i++)
    420         crHashtableAdd( h, i + res , NULL );
    421419    return res;
    422420}
  • trunk/src/VBox/HostServices/SharedOpenGL/crserver/crservice.cpp

    r31698 r31808  
    6565
    6666static const char* gszVBoxOGLSSMMagic = "***OpenGL state data***";
    67 #define SHCROGL_SSM_VERSION 19
     67#define SHCROGL_SSM_VERSION 20
    6868
    6969static DECLCALLBACK(int) svcUnload (void *)
  • trunk/src/VBox/HostServices/SharedOpenGL/crserverlib/get_components.py

    r20916 r31808  
    104104        'GL_BUFFER_ACCESS_ARB': (1, 'CR_ARB_vertex_buffer_object'),
    105105        'GL_BUFFER_MAPPED_ARB': (1, 'CR_ARB_vertex_buffer_object'),
    106         'GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING': (4, 'CR_ARB_vertex_buffer_object'),
     106        'GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING_ARB': (1, 'CR_ARB_vertex_buffer_object'),
    107107        'GL_QUERY_COUNTER_BITS_ARB': (1, 'CR_ARB_occlusion_query'),
    108108        'GL_QUERY_RESULT_AVAILABLE_ARB': (1, 'CR_ARB_occlusion_query'),
  • trunk/src/VBox/HostServices/SharedOpenGL/crserverlib/server.h

    r27889 r31808  
    8787GLint crServerSPUWindowID(GLint serverWindow);
    8888
    89 GLuint crServerTranslateTextureID(GLuint id);
    9089GLuint crServerTranslateProgramID(GLuint id);
    9190
  • trunk/src/VBox/HostServices/SharedOpenGL/crserverlib/server_bufferobject.c

    r22155 r31808  
    5959        }
    6060}
     61
     62void SERVER_DISPATCH_APIENTRY
     63crServerDispatchBindBufferARB(GLenum target, GLuint buffer)
     64{
     65    crStateBindBufferARB(target, buffer);
     66    cr_server.head_spu->dispatch_table.BindBufferARB(target, crStateGetBufferHWID(buffer));
     67}
     68
     69GLboolean SERVER_DISPATCH_APIENTRY
     70crServerDispatchIsBufferARB(GLuint buffer)
     71{
     72    GLboolean retval;
     73    retval = cr_server.head_spu->dispatch_table.IsBufferARB(crStateGetBufferHWID(buffer));
     74    crServerReturnValue( &retval, sizeof(retval) );
     75    return retval; /* WILL PROBABLY BE IGNORED */
     76}
  • trunk/src/VBox/HostServices/SharedOpenGL/crserverlib/server_framebuffer.c

    r28800 r31808  
    4646void SERVER_DISPATCH_APIENTRY crServerDispatchFramebufferTexture1DEXT(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level)
    4747{
    48     if (texture)
    49     {
    50         texture = crServerTranslateTextureID(texture);
    51     }
    52 
    5348    crStateFramebufferTexture1DEXT(target, attachment, textarget, texture, level);
    54     cr_server.head_spu->dispatch_table.FramebufferTexture1DEXT(target, attachment, textarget, texture, level);
     49    cr_server.head_spu->dispatch_table.FramebufferTexture1DEXT(target, attachment, textarget, crStateGetTextureHWID(texture), level);
    5550}
    5651
    5752void SERVER_DISPATCH_APIENTRY crServerDispatchFramebufferTexture2DEXT(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level)
    5853{
    59     if (texture)
    60     {
    61         texture = crServerTranslateTextureID(texture);
    62     }
    63 
    6454    crStateFramebufferTexture2DEXT(target, attachment, textarget, texture, level);
    65     cr_server.head_spu->dispatch_table.FramebufferTexture2DEXT(target, attachment, textarget, texture, level);
     55    cr_server.head_spu->dispatch_table.FramebufferTexture2DEXT(target, attachment, textarget, crStateGetTextureHWID(texture), level);
    6656}
    6757
    6858void SERVER_DISPATCH_APIENTRY crServerDispatchFramebufferTexture3DEXT(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset)
    6959{
    70     if (texture)
    71     {
    72         texture = crServerTranslateTextureID(texture);
    73     }
    74 
    7560    crStateFramebufferTexture3DEXT(target, attachment, textarget, texture, level, zoffset);
    76     cr_server.head_spu->dispatch_table.FramebufferTexture3DEXT(target, attachment, textarget, texture, level, zoffset);
     61    cr_server.head_spu->dispatch_table.FramebufferTexture3DEXT(target, attachment, textarget, crStateGetTextureHWID(texture), level, zoffset);
    7762}
    7863
     
    121106        crStateGetFramebufferAttachmentParameterivEXT(target, attachment, pname, local_params);
    122107
    123     if (GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME_EXT==pname)
    124     {
    125         GLint type;
    126         crStateGetFramebufferAttachmentParameterivEXT(target, attachment, GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE_EXT, &type);
    127         if (GL_TEXTURE==type)
    128         {
    129             /*todo, add reverse of crServerTranslateTextureID*/
    130             if (!cr_server.sharedTextureObjects && local_params[0])
    131             {
    132                 int client = cr_server.curClient->number;
    133                 local_params[0] = local_params[0] - client * 100000;
    134             }
    135         }
    136     }
    137 
    138108        crServerReturnValue(&(local_params[0]), 1*sizeof(GLint));
    139109}
     110
     111GLboolean SERVER_DISPATCH_APIENTRY crServerDispatchIsFramebufferEXT( GLuint framebuffer )
     112{
     113    GLboolean retval;
     114    retval = cr_server.head_spu->dispatch_table.IsFramebufferEXT(crStateGetFramebufferHWID(framebuffer));
     115    crServerReturnValue( &retval, sizeof(retval) );
     116    return retval; /* WILL PROBABLY BE IGNORED */
     117}
     118
     119GLboolean SERVER_DISPATCH_APIENTRY crServerDispatchIsRenderbufferEXT( GLuint renderbuffer )
     120{
     121    GLboolean retval;
     122    retval = cr_server.head_spu->dispatch_table.IsRenderbufferEXT(crStateGetRenderbufferHWID(renderbuffer));
     123    crServerReturnValue( &retval, sizeof(retval) );
     124    return retval; /* WILL PROBABLY BE IGNORED */
     125}
  • trunk/src/VBox/HostServices/SharedOpenGL/crserverlib/server_gentextures.c

    r25154 r31808  
    1414void SERVER_DISPATCH_APIENTRY crServerDispatchGenTextures( GLsizei n, GLuint *textures )
    1515{
    16     GLsizei i;
    17     GLuint *local_textures = (GLuint *) crAlloc( n*sizeof( *local_textures) );
     16    GLuint *local_textures = (GLuint *) crAlloc(n*sizeof(*local_textures));
    1817    (void) textures;
    19     cr_server.head_spu->dispatch_table.GenTextures( n, local_textures );
    2018
    21     /* This is somewhat hacky.
    22      * We have to make sure we're going to generate unique texture IDs.
    23      * That wasn't the case before snapshot loading, because we could just rely on host video drivers.
    24      * Now we could have a set of loaded texture IDs which aren't already reserved in the host driver.
    25      * Note: It seems, that it's easy to reserve ATI/NVidia IDs, by simply calling glGenTextures
    26      * with n==number of loaded textures. But it's really implementation dependant. So can't rely that it'll not change.
    27      */
    28     for (i=0; i<n; ++i)
    29     {
    30         /* translate the ID as it'd be done in glBindTexture call */
    31         GLuint tID = crServerTranslateTextureID(local_textures[i]);
    32         /* check if we have a texture with same ID loaded from snapshot */
    33         while (crStateIsTexture(tID))
    34         {
    35             /* request new ID */
    36             cr_server.head_spu->dispatch_table.GenTextures(1, &tID);
    37             local_textures[i] = tID;
    38             tID = crServerTranslateTextureID(tID);
    39         }
    40     }
     19    crStateGenTextures(n, local_textures);
    4120
    42     crServerReturnValue( local_textures, n*sizeof( *local_textures ) );
     21    crServerReturnValue(local_textures, n*sizeof(*local_textures));
    4322    crFree( local_textures );
    4423}
    45 
    4624
    4725void SERVER_DISPATCH_APIENTRY crServerDispatchGenProgramsNV( GLsizei n, GLuint * ids )
  • trunk/src/VBox/HostServices/SharedOpenGL/crserverlib/server_get.py

    r22155 r31808  
    100100];
    101101
     102convert_bufferid = [
     103    'GetVertexAttribdvARB',
     104    'GetVertexAttribdvNV',
     105    'GetVertexAttribfvARB',
     106    'GetVertexAttribfvNV',
     107    'GetVertexAttribivARB',
     108    'GetVertexAttribivNV'
     109];
     110
    102111from get_components import *;
    103112
     
    125134
    126135        print '\tcr_server.head_spu->dispatch_table.%s( %s );' % ( func_name, apiutil.MakeCallString(params) )
     136
     137        if func_name in convert_bufferid:
     138            print '\tif (pname==GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING_ARB){'
     139            print '\t\tlocal_params[0]=(%s)crStateBufferHWIDtoID((GLint)local_params[0]);' % (local_argtype);
     140            print '\t}'
     141
    127142        if func_name in no_pnames:
    128143            print '\tcrServerReturnValue( &(%s[0]), %d*sizeof(%s) );' % (local_argname, max_components[func_name], local_argtype );
  • trunk/src/VBox/HostServices/SharedOpenGL/crserverlib/server_glsl.c

    r28800 r31808  
    104104}
    105105
     106GLint SERVER_DISPATCH_APIENTRY crServerDispatchGetAttribLocation( GLuint program, const char * name )
     107{
     108    GLint retval;
     109    retval = cr_server.head_spu->dispatch_table.GetAttribLocation(crStateGetProgramHWID(program), name );
     110    crServerReturnValue( &retval, sizeof(retval) );
     111    return retval; /* WILL PROBABLY BE IGNORED */
     112}
     113
     114GLhandleARB SERVER_DISPATCH_APIENTRY crServerDispatchGetHandleARB( GLenum pname )
     115{
     116    GLhandleARB retval;
     117    retval = cr_server.head_spu->dispatch_table.GetHandleARB(pname);
     118    if (pname==GL_PROGRAM_OBJECT_ARB)
     119    {
     120        retval = crStateGLSLProgramHWIDtoID(retval);
     121    }
     122    crServerReturnValue( &retval, sizeof(retval) );
     123    return retval; /* WILL PROBABLY BE IGNORED */
     124}
     125
     126GLint SERVER_DISPATCH_APIENTRY crServerDispatchGetUniformLocation(GLuint program, const char * name)
     127{
     128    GLint retval;
     129    retval = cr_server.head_spu->dispatch_table.GetUniformLocation(crStateGetProgramHWID(program), name);
     130    crServerReturnValue( &retval, sizeof(retval) );
     131    return retval; /* WILL PROBABLY BE IGNORED */
     132}
     133
    106134#endif /* #ifdef CR_OPENGL_VERSION_2_0 */
  • trunk/src/VBox/HostServices/SharedOpenGL/crserverlib/server_lists.c

    r27889 r31808  
    4141{
    4242    if (!cr_server.sharedDisplayLists) {
    43         int client = cr_server.curClient->number;
    44         return id + client * 100000;
    45     }
    46     return id;
    47 }
    48 
    49 
    50 GLuint crServerTranslateTextureID( GLuint id )
    51 {
    52     if (!cr_server.sharedTextureObjects && id) {
    5343        int client = cr_server.curClient->number;
    5444        return id + client * 100000;
     
    248238void SERVER_DISPATCH_APIENTRY crServerDispatchBindTexture( GLenum target, GLuint texture )
    249239{
    250     texture = crServerTranslateTextureID( texture );
    251240    crStateBindTexture( target, texture );
    252     cr_server.head_spu->dispatch_table.BindTexture( target, texture );
    253 }
    254 
     241    cr_server.head_spu->dispatch_table.BindTexture(target, crStateGetTextureHWID(texture));
     242}
    255243
    256244void SERVER_DISPATCH_APIENTRY crServerDispatchDeleteTextures( GLsizei n, const GLuint *textures)
    257245{
    258     if (!cr_server.sharedTextureObjects) {
    259         GLuint *newTextures = (GLuint *) crAlloc(n * sizeof(GLuint));
    260         GLint i;
    261         if (!newTextures) {
    262             crError("crServerDispatchDeleteTextures: out of memory");
    263             return;
    264         }
    265         for (i = 0; i < n; i++) {
    266             newTextures[i] = crServerTranslateTextureID( textures[i] );
    267         }
    268         crStateDeleteTextures( n, newTextures );
    269         cr_server.head_spu->dispatch_table.DeleteTextures( n, newTextures );
    270         crFree(newTextures);
    271     }
    272     else {
    273         crStateDeleteTextures( n, textures );
    274         cr_server.head_spu->dispatch_table.DeleteTextures( n, textures );
    275     }
     246    GLuint *newTextures = (GLuint *) crAlloc(n * sizeof(GLuint));
     247    GLint i;
     248
     249    if (!newTextures)
     250    {
     251        crError("crServerDispatchDeleteTextures: out of memory");
     252        return;
     253    }
     254
     255    for (i = 0; i < n; i++)
     256    {
     257        newTextures[i] = crStateGetTextureHWID(textures[i]);
     258    }
     259
     260    crStateDeleteTextures(n, textures);
     261    cr_server.head_spu->dispatch_table.DeleteTextures(n, newTextures);
     262    crFree(newTextures);
    276263}
    277264
    278265void SERVER_DISPATCH_APIENTRY crServerDispatchPrioritizeTextures( GLsizei n, const GLuint * textures, const GLclampf * priorities )
    279266{
    280     if (!cr_server.sharedTextureObjects)
     267    GLuint *newTextures = (GLuint *) crAlloc(n * sizeof(GLuint));
     268    GLint i;
     269
     270    if (!newTextures)
    281271    {
    282         GLuint *newTextures = (GLuint *) crAlloc(n * sizeof(GLuint));
    283         GLint i;
    284         if (!newTextures) {
    285             crError("crServerDispatchDeleteTextures: out of memory");
    286             return;
    287         }
    288         for (i = 0; i < n; i++) {
    289             newTextures[i] = crServerTranslateTextureID( textures[i] );
    290         }
    291         crStatePrioritizeTextures(n, newTextures, priorities);
    292         cr_server.head_spu->dispatch_table.PrioritizeTextures(n, newTextures, priorities);
    293         crFree(newTextures);
    294     }
    295     else
     272        crError("crServerDispatchDeleteTextures: out of memory");
     273        return;
     274    }
     275
     276    for (i = 0; i < n; i++)
    296277    {
    297         crStatePrioritizeTextures(n, textures, priorities);
    298         cr_server.head_spu->dispatch_table.PrioritizeTextures(n, textures, priorities);
    299     }
     278        newTextures[i] = crStateGetTextureHWID(textures[i]);
     279    }
     280
     281    crStatePrioritizeTextures(n, textures, priorities);
     282    cr_server.head_spu->dispatch_table.PrioritizeTextures(n, newTextures, priorities);
     283    crFree(newTextures);
    300284}
    301285
     
    320304{
    321305    GLboolean retval;
    322     texture = crServerTranslateTextureID( texture );
    323     retval = cr_server.head_spu->dispatch_table.IsTexture( texture );
     306    retval = cr_server.head_spu->dispatch_table.IsTexture(crStateGetTextureHWID(texture));
    324307    crServerReturnValue( &retval, sizeof(retval) );
    325308    return retval; /* WILL PROBABLY BE IGNORED */
     
    330313{
    331314    GLboolean retval;
    332     program = crServerTranslateTextureID(program);
     315    program = crServerTranslateProgramID(program);
    333316    retval = cr_server.head_spu->dispatch_table.IsProgramARB( program );
    334317    crServerReturnValue( &retval, sizeof(retval) );
     
    349332        GLuint *textures2 = (GLuint *) crAlloc(n * sizeof(GLuint));
    350333        for (i = 0; i < n; i++)
    351             textures2[i] = crServerTranslateTextureID(textures[i]);
     334            textures2[i] = crStateGetTextureHWID(textures[i]);
    352335        retval = cr_server.head_spu->dispatch_table.AreTexturesResident(n, textures2, res);
    353336        crFree(textures2);
    354     }
    355     else {
    356         retval = cr_server.head_spu->dispatch_table.AreTexturesResident(n, textures, res);
    357337    }
    358338    crServerReturnValue(res, n * sizeof(GLboolean));
  • trunk/src/VBox/HostServices/SharedOpenGL/crserverlib/server_main.c

    r30440 r31808  
    793793        char psz[200];
    794794        GLint ctxID;
     795        CRContext* pContext;
    795796
    796797        rc = SSMR3GetMem(pSSM, &key, sizeof(key));
     
    808809        ctxID = crServerDispatchCreateContextEx(createInfo.pszDpyName, createInfo.visualBits, 0, key, createInfo.internalID);
    809810        CRASSERT((int64_t)ctxID == (int64_t)key);
     811
     812        pContext = (CRContext*) crHashtableSearch(cr_server.contextTable, key);
     813        CRASSERT(pContext);
     814        pContext->shared->id=-1;
    810815    }
    811816
     
    821826        CRASSERT(pContext);
    822827
    823         rc = crStateLoadContext(pContext, pSSM);
     828        rc = crStateLoadContext(pContext, cr_server.contextTable, pSSM);
    824829        AssertRCReturn(rc, rc);
    825830    }
  • trunk/src/VBox/HostServices/SharedOpenGL/crserverlib/server_misc.c

    r27889 r31808  
    216216{
    217217  switch (target) {
     218    case GL_SHARE_CONTEXT_RESOURCES_CR:
     219        crStateShareContext(value);
     220        break;
    218221    case GL_SHARED_DISPLAY_LISTS_CR:
    219222        cr_server.sharedDisplayLists = value;
  • trunk/src/VBox/HostServices/SharedOpenGL/crserverlib/server_muralfbo.c

    r28800 r31808  
    229229
    230230    /*Restore gl state*/
    231     uid = ctx->texture.unit[ctx->texture.curTextureUnit].currentTexture2D->name;
     231    uid = ctx->texture.unit[ctx->texture.curTextureUnit].currentTexture2D->hwid;
    232232    cr_server.head_spu->dispatch_table.BindTexture(GL_TEXTURE_2D, uid);
    233233
     
    330330    cr_server.head_spu->dispatch_table.BindTexture(GL_TEXTURE_2D, mural->idColorTex);
    331331    cr_server.head_spu->dispatch_table.GetTexImage(GL_TEXTURE_2D, 0, GL_BGRA, GL_UNSIGNED_BYTE, pixels);
    332     uid = ctx->texture.unit[ctx->texture.curTextureUnit].currentTexture2D->name;
     332    uid = ctx->texture.unit[ctx->texture.curTextureUnit].currentTexture2D->hwid;
    333333    cr_server.head_spu->dispatch_table.BindTexture(GL_TEXTURE_2D, uid);
    334334
  • trunk/src/VBox/HostServices/SharedOpenGL/crserverlib/server_simpleget.py

    r27889 r31808  
    6161        CRASSERT(tablesize/sizeof(%s)==1);
    6262        texid = (GLuint) *get_values;
    63         if (texid)
    64         {
    65             *get_values = (%s) (texid - cr_server.curClient->number * 100000);
    66         }
     63        *get_values = (%s) crStateTextureHWIDtoID(texid);
    6764    }
    6865    else if (GL_CURRENT_PROGRAM==pname)
     
    9390        *get_values = (%s) crStateRBOHWIDtoID(rbid);
    9491    }
    95     """ % (types[index], types[index], types[index], types[index], types[index], types[index], types[index], types[index])
     92    else if (GL_ARRAY_BUFFER_BINDING_ARB==pname
     93             || GL_ELEMENT_ARRAY_BUFFER_BINDING_ARB==pname
     94             || GL_VERTEX_ARRAY_BUFFER_BINDING_ARB==pname
     95             || GL_NORMAL_ARRAY_BUFFER_BINDING_ARB==pname
     96             || GL_COLOR_ARRAY_BUFFER_BINDING_ARB==pname
     97             || GL_INDEX_ARRAY_BUFFER_BINDING_ARB==pname
     98             || GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING_ARB==pname
     99             || GL_EDGE_FLAG_ARRAY_BUFFER_BINDING_ARB==pname
     100             || GL_SECONDARY_COLOR_ARRAY_BUFFER_BINDING_ARB==pname
     101             || GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING_ARB==pname
     102             || GL_WEIGHT_ARRAY_BUFFER_BINDING_ARB==pname)
     103    {
     104        GLuint bufid;
     105        CRASSERT(tablesize/sizeof(%s)==1);
     106        bufid = (GLuint) *get_values;
     107        *get_values = (%s) crStateBufferHWIDtoID(bufid);
     108    }
     109    """ % (types[index], types[index], types[index], types[index], types[index], types[index], types[index], types[index], types[index], types[index])
    96110    print '\tcrServerReturnValue( get_values, tablesize );'
    97111    print '\tcrFree(get_values);'
  • trunk/src/VBox/HostServices/SharedOpenGL/crserverlib/server_special

    r29856 r31808  
    235235TexImage2D
    236236TexImage3D
     237BindBufferARB
     238IsBufferARB
     239IsFramebufferEXT
     240IsRenderbufferEXT
     241GetAttribLocation
     242GetHandleARB
     243GetUniformLocation
  • trunk/src/VBox/HostServices/SharedOpenGL/unpacker/unpack_arrays.c

    r22284 r31808  
    230230        offset += sizeof(int);
    231231        cp = crStateGetClientPointerByIndex(index, &c->array);
    232         CRASSERT(cp && cp->enabled && (!cp->buffer || !cp->buffer->name));
     232        CRASSERT(cp && cp->enabled && (!cp->buffer || !cp->buffer->id));
    233233        data = crAlloc((first+count)*cp->bytesPerIndex);
    234234        crMemcpy(data+first*cp->bytesPerIndex, DATA_POINTER(offset, GLvoid), count*cp->bytesPerIndex);
Note: See TracChangeset for help on using the changeset viewer.

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