VirtualBox

Ignore:
Timestamp:
Aug 28, 2012 3:35:26 PM (13 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
80386
Message:

crOpenGL: program/shader objects fixes for proper saved state handling

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/GuestHost/OpenGL/state_tracker/state_glsl.c

    r41928 r43051  
    200200{
    201201    CRGLSLShader *pShader = crStateGetShaderObj(id);
     202#ifdef IN_GUEST
     203    CRASSERT(!pShader || pShader->hwid == id);
     204#endif
    202205    return pShader ? pShader->hwid : 0;
    203206}
     
    206209{
    207210    CRGLSLProgram *pProgram = crStateGetProgramObj(id);
     211#ifdef IN_GUEST
    208212    CRASSERT(!pProgram || pProgram->hwid == id);
     213#endif
    209214    return pProgram ? pProgram->hwid : 0;
    210215}
     
    254259}
    255260
    256 DECLEXPORT(void) STATE_APIENTRY crStateCreateShader(GLuint id, GLenum type)
     261DECLEXPORT(GLuint) STATE_APIENTRY crStateCreateShader(GLuint hwid, GLenum type)
    257262{
    258263    CRGLSLShader *pShader;
    259264    CRContext *g = GetCurrentContext();
    260 
    261     CRASSERT(!crStateGetShaderObj(id));
     265    GLuint stateId = hwid;
     266
     267#ifdef IN_GUEST
     268    CRASSERT(!crStateGetShaderObj(stateId));
     269#else
     270    /* the id may not necesserily be hwid after save state restoration */
     271    while ((pShader = crStateGetShaderObj(stateId)) != NULL)
     272    {
     273        GLuint newStateId = stateId + 7;
     274        crDebug("Shader object %d already exists, generating a new one, %d", stateId, newStateId);
     275        stateId = newStateId;
     276    }
     277#endif
    262278
    263279    pShader = (CRGLSLShader *) crAlloc(sizeof(*pShader));
     
    268284    }
    269285
    270     pShader->id = id;
    271     pShader->hwid = id;
     286    pShader->id = stateId;
     287    pShader->hwid = hwid;
    272288    pShader->type = type;
    273289    pShader->source = NULL;
     
    276292    pShader->refCount = 0;
    277293
    278     crHashtableAdd(g->glsl.shaders, id, pShader);
    279 }
    280 
    281 DECLEXPORT(void) STATE_APIENTRY crStateCreateProgram(GLuint id)
     294    crHashtableAdd(g->glsl.shaders, stateId, pShader);
     295
     296    return stateId;
     297}
     298
     299DECLEXPORT(GLuint) STATE_APIENTRY crStateCreateProgram(GLuint hwid)
    282300{
    283301    CRGLSLProgram *pProgram;
    284302    CRContext *g = GetCurrentContext();
    285 
    286     pProgram = crStateGetProgramObj(id);
     303    GLuint stateId = hwid;
     304
     305#ifdef IN_GUEST
     306    pProgram = crStateGetProgramObj(stateId);
    287307    if (pProgram)
    288308    {
    289         crWarning("Program object %d already exists!", id);
    290         crStateDeleteProgram(id);
    291         CRASSERT(!crStateGetProgramObj(id));
    292     }
     309        crWarning("Program object %d already exists!", stateId);
     310        crStateDeleteProgram(stateId);
     311        CRASSERT(!crStateGetProgramObj(stateId));
     312    }
     313#else
     314    /* the id may not necesserily be hwid after save state restoration */
     315    while ((pProgram = crStateGetProgramObj(stateId)) != NULL)
     316    {
     317        GLuint newStateId = stateId + 7;
     318        crDebug("Program object %d already exists, generating a new one, %d", stateId, newStateId);
     319        stateId = newStateId;
     320    }
     321#endif
    293322
    294323    pProgram = (CRGLSLProgram *) crAlloc(sizeof(*pProgram));
     
    299328    }
    300329
    301     pProgram->id = id;
    302     pProgram->hwid = id;
     330    pProgram->id = stateId;
     331    pProgram->hwid = hwid;
    303332    pProgram->validated = GL_FALSE;
    304333    pProgram->linked = GL_FALSE;
     
    318347#endif
    319348
    320     crHashtableAdd(g->glsl.programs, id, pProgram);
     349    crHashtableAdd(g->glsl.programs, stateId, pProgram);
     350
     351    return stateId;
    321352}
    322353
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