state_snapshot.c revision 0bebd3a2671042901f1fcceff14f8c58dd397478
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * VBox Context state saving/loading used by VM snapshot
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * Copyright (C) 2008 Sun Microsystems, Inc.
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * available from http://www.virtualbox.org. This file is free software;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * you can redistribute it and/or modify it under the terms of the GNU
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * General Public License (GPL) as published by the Free Software
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * Clara, CA 95054 USA or visit http://www.sun.com if you need
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * additional information or have any questions.
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * We have two ways of saving/loading states.
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * First which is being used atm, just pure saving/loading of structures.
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * The drawback is we have to deal with all the pointers around those structures,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * we'd have to update this code if we'd change state tracking.
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * On the bright side it's fast, though it's not really needed as it's not that often operation.
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * It could also worth to split those functions into appropriate parts,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * similar to the way context creation is being done.
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * Second way would be to implement full dispatch api table and substitute diff_api during saving/loading.
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * Then if we implement that api in a similar way to packer/unpacker with a change to store/load
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * via provided pSSM handle instead of pack buffer,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * saving state could be done by simple diffing against empty "dummy" context.
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * Restoring state in such case would look like unpacking commands from pSSM instead of network buffer.
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * This would be slower (who cares) but most likely will not require any code changes to support in future.
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * We will reduce amount of saved data as we'd save only changed state parts, but I doubt it'd be that much.
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * It could be done for the first way as well, but requires tons of bit checks.
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync/*@todo move with the one from state_texture.c to some header*/
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncstatic int32_t crStateAllocAndSSMR3GetMem(PSSMHANDLE pSSM, void **pBuffer, size_t cbBuffer)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncstatic int32_t crStateSaveTextureObjData(CRTextureObj *pTexture, PSSMHANDLE pSSM)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /*@todo, check if safe to go till MAX_MIPMAP_LEVELS intead of TextureState->maxLevel*/
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync for (i = 0; i < MAX_MIPMAP_LEVELS; i++) {
0bebd3a2671042901f1fcceff14f8c58dd397478vboxsync /* Note, this is not a bug.
0bebd3a2671042901f1fcceff14f8c58dd397478vboxsync * Even with CR_STATE_NO_TEXTURE_IMAGE_STORE defined, it's possible that ptl->img!=NULL.
0bebd3a2671042901f1fcceff14f8c58dd397478vboxsync * For ex. we're saving snapshot right after it was loaded
0bebd3a2671042901f1fcceff14f8c58dd397478vboxsync * and some context hasn't been used by the guest application yet
0bebd3a2671042901f1fcceff14f8c58dd397478vboxsync * (pContext->texture.bResyncNeeded==GL_TRUE).
0bebd3a2671042901f1fcceff14f8c58dd397478vboxsync diff_api.BindTexture(pTexture->target, pTexture->name);
0bebd3a2671042901f1fcceff14f8c58dd397478vboxsync diff_api.GetTexImage(pTexture->target, i, ptl->format, ptl->type, pImg);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncstatic int32_t crStateLoadTextureObjData(CRTextureObj *pTexture, PSSMHANDLE pSSM)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync for (i = 0; i < MAX_MIPMAP_LEVELS; i++) {
0bebd3a2671042901f1fcceff14f8c58dd397478vboxsync /* Same story as in crStateSaveTextureObjData */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crStateTextureInitTextureFormat(ptl, ptl->internalFormat);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync //FILLDIRTY(ptl->dirty);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncstatic void crStateSaveSharedTextureCB(unsigned long key, void *data1, void *data2)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync rc = SSMR3PutMem(pSSM, pTexture, sizeof(*pTexture));
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncstatic int32_t crStateSaveMatrixStack(CRMatrixStack *pStack, PSSMHANDLE pSSM)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync return SSMR3PutMem(pSSM, pStack->stack, sizeof(CRmatrix) * pStack->maxDepth);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncstatic int32_t crStateLoadMatrixStack(CRMatrixStack *pStack, PSSMHANDLE pSSM)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync rc = SSMR3GetMem(pSSM, pStack->stack, sizeof(CRmatrix) * pStack->maxDepth);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* fixup stack top pointer */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncstatic int32_t crStateSaveTextureObjPtr(CRTextureObj *pTexture, PSSMHANDLE pSSM)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* Current texture pointer can't be NULL for real texture unit states,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * but it could be NULL for unused attribute stack depths.
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncstatic int32_t crStateLoadTextureObjPtr(CRTextureObj **pTexture, CRContext *pContext, GLenum target, PSSMHANDLE pSSM)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* We're loading attrib stack with unused state */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync *pTexture = (CRTextureObj *) crHashtableSearch(pContext->shared->textureTable, texName);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crError("LoadTextureObjPtr: Unknown texture target %d", target);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncstatic int32_t crStateSaveTexUnitCurrentTexturePtrs(CRTextureUnit *pTexUnit, PSSMHANDLE pSSM)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync rc = crStateSaveTextureObjPtr(pTexUnit->currentTexture1D, pSSM);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync rc = crStateSaveTextureObjPtr(pTexUnit->currentTexture2D, pSSM);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync rc = crStateSaveTextureObjPtr(pTexUnit->currentTexture3D, pSSM);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync rc = crStateSaveTextureObjPtr(pTexUnit->currentTextureCubeMap, pSSM);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync rc = crStateSaveTextureObjPtr(pTexUnit->currentTextureRect, pSSM);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncstatic int32_t crStateLoadTexUnitCurrentTexturePtrs(CRTextureUnit *pTexUnit, CRContext *pContext, PSSMHANDLE pSSM)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync rc = crStateLoadTextureObjPtr(&pTexUnit->currentTexture1D, pContext, GL_TEXTURE_1D, pSSM);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync rc = crStateLoadTextureObjPtr(&pTexUnit->currentTexture2D, pContext, GL_TEXTURE_1D, pSSM);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync rc = crStateLoadTextureObjPtr(&pTexUnit->currentTexture3D, pContext, GL_TEXTURE_2D, pSSM);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync rc = crStateLoadTextureObjPtr(&pTexUnit->currentTextureCubeMap, pContext, GL_TEXTURE_CUBE_MAP_ARB, pSSM);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync rc = crStateLoadTextureObjPtr(&pTexUnit->currentTextureRect, pContext, GL_TEXTURE_RECTANGLE_NV, pSSM);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncstatic int32_t crSateSaveEvalCoeffs1D(CREvaluator1D *pEval, PSSMHANDLE pSSM)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync for (i=0; i<GLEVAL_TOT; ++i)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync rc = SSMR3PutMem(pSSM, pEval[i].coeff, pEval[i].order * gleval_sizes[i] * sizeof(GLfloat));
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncstatic int32_t crSateSaveEvalCoeffs2D(CREvaluator2D *pEval, PSSMHANDLE pSSM)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync for (i=0; i<GLEVAL_TOT; ++i)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync rc = SSMR3PutMem(pSSM, pEval[i].coeff, pEval[i].uorder * pEval[i].vorder * gleval_sizes[i] * sizeof(GLfloat));
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncstatic int32_t crSateLoadEvalCoeffs1D(CREvaluator1D *pEval, GLboolean bReallocMem, PSSMHANDLE pSSM)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync for (i=0; i<GLEVAL_TOT; ++i)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync size = pEval[i].order * gleval_sizes[i] * sizeof(GLfloat);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncstatic int32_t crSateLoadEvalCoeffs2D(CREvaluator2D *pEval, GLboolean bReallocMem, PSSMHANDLE pSSM)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync for (i=0; i<GLEVAL_TOT; ++i)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync size = pEval[i].uorder * pEval[i].vorder * gleval_sizes[i] * sizeof(GLfloat);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncstatic void crStateCopyEvalPtrs1D(CREvaluator1D *pDst, CREvaluator1D *pSrc)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync for (i=0; i<GLEVAL_TOT; ++i)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync pDst[GL_MAP1_VERTEX_3-GL_MAP1_COLOR_4].coeff = pSrc[GL_MAP1_VERTEX_3-GL_MAP1_COLOR_4].coeff;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync pDst[GL_MAP1_VERTEX_4-GL_MAP1_COLOR_4].coeff = pSrc[GL_MAP1_VERTEX_4-GL_MAP1_COLOR_4].coeff;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync pDst[GL_MAP1_INDEX-GL_MAP1_COLOR_4].coeff = pSrc[GL_MAP1_INDEX-GL_MAP1_COLOR_4].coeff;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync pDst[GL_MAP1_COLOR_4-GL_MAP1_COLOR_4].coeff = pSrc[GL_MAP1_COLOR_4-GL_MAP1_COLOR_4].coeff;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync pDst[GL_MAP1_NORMAL-GL_MAP1_COLOR_4].coeff = pSrc[GL_MAP1_NORMAL-GL_MAP1_COLOR_4].coeff;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync pDst[GL_MAP1_TEXTURE_COORD_1-GL_MAP1_COLOR_4].coeff = pSrc[GL_MAP1_TEXTURE_COORD_1-GL_MAP1_COLOR_4].coeff;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync pDst[GL_MAP1_TEXTURE_COORD_2-GL_MAP1_COLOR_4].coeff = pSrc[GL_MAP1_TEXTURE_COORD_2-GL_MAP1_COLOR_4].coeff;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync pDst[GL_MAP1_TEXTURE_COORD_3-GL_MAP1_COLOR_4].coeff = pSrc[GL_MAP1_TEXTURE_COORD_3-GL_MAP1_COLOR_4].coeff;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync pDst[GL_MAP1_TEXTURE_COORD_4-GL_MAP1_COLOR_4].coeff = pSrc[GL_MAP1_TEXTURE_COORD_4-GL_MAP1_COLOR_4].coeff;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncstatic void crStateCopyEvalPtrs2D(CREvaluator2D *pDst, CREvaluator2D *pSrc)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync for (i=0; i<GLEVAL_TOT; ++i)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync pDst[GL_MAP2_VERTEX_3-GL_MAP2_COLOR_4].coeff = pSrc[GL_MAP2_VERTEX_3-GL_MAP2_COLOR_4].coeff;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync pDst[GL_MAP2_VERTEX_4-GL_MAP2_COLOR_4].coeff = pSrc[GL_MAP2_VERTEX_4-GL_MAP2_COLOR_4].coeff;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync pDst[GL_MAP2_INDEX-GL_MAP2_COLOR_4].coeff = pSrc[GL_MAP2_INDEX-GL_MAP2_COLOR_4].coeff;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync pDst[GL_MAP2_COLOR_4-GL_MAP2_COLOR_4].coeff = pSrc[GL_MAP2_COLOR_4-GL_MAP2_COLOR_4].coeff;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync pDst[GL_MAP2_NORMAL-GL_MAP2_COLOR_4].coeff = pSrc[GL_MAP2_NORMAL-GL_MAP2_COLOR_4].coeff;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync pDst[GL_MAP2_TEXTURE_COORD_1-GL_MAP2_COLOR_4].coeff = pSrc[GL_MAP2_TEXTURE_COORD_1-GL_MAP2_COLOR_4].coeff;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync pDst[GL_MAP2_TEXTURE_COORD_2-GL_MAP2_COLOR_4].coeff = pSrc[GL_MAP2_TEXTURE_COORD_2-GL_MAP2_COLOR_4].coeff;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync pDst[GL_MAP2_TEXTURE_COORD_3-GL_MAP2_COLOR_4].coeff = pSrc[GL_MAP2_TEXTURE_COORD_3-GL_MAP2_COLOR_4].coeff;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync pDst[GL_MAP2_TEXTURE_COORD_4-GL_MAP2_COLOR_4].coeff = pSrc[GL_MAP2_TEXTURE_COORD_4-GL_MAP2_COLOR_4].coeff;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncstatic void crStateSaveBufferObjectCB(unsigned long key, void *data1, void *data2)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRBufferObject *pBufferObj = (CRBufferObject *) data1;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync rc = SSMR3PutMem(pSSM, pBufferObj, sizeof(*pBufferObj));
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync rc = SSMR3PutMem(pSSM, pBufferObj->data, pBufferObj->size);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncstatic void crStateSaveProgramCB(unsigned long key, void *data1, void *data2)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync rc = SSMR3PutMem(pSSM, pProgram, sizeof(*pProgram));
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync rc = SSMR3PutMem(pSSM, pProgram->string, pProgram->length);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync for (pSymbol = pProgram->symbolTable; pSymbol; pSymbol=pSymbol->next)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync rc = SSMR3PutMem(pSSM, pSymbol->name, pSymbol->cbName);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncstatic int32_t crStateLoadProgram(CRProgram **ppProgram, PSSMHANDLE pSSM)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync unsigned long key;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* we're loading default vertex or pixel program*/
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync *ppProgram = (CRProgram*) crAlloc(sizeof(CRProgram));
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync rc = SSMR3GetMem(pSSM, *ppProgram, sizeof(**ppProgram));
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync (*ppProgram)->string = crAlloc((*ppProgram)->length);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync rc = SSMR3GetMem(pSSM, (void*) (*ppProgram)->string, (*ppProgram)->length);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync for (ppSymbol = &(*ppProgram)->symbolTable; *ppSymbol; ppSymbol=&(*ppSymbol)->next)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync rc = SSMR3GetMem(pSSM, *ppSymbol, sizeof(**ppSymbol));
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync rc = SSMR3GetMem(pSSM, (void*) (*ppSymbol)->name, (*ppSymbol)->cbName);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncint32_t crStateSaveContext(CRContext *pContext, PSSMHANDLE pSSM)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync rc = SSMR3PutMem(pSSM, pContext, sizeof(*pContext));
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (crHashtableNumElements(pContext->shared->dlistTable)>0)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crWarning("Saving state with %d display lists, unsupported", crHashtableNumElements(pContext->shared->dlistTable));
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (crHashtableNumElements(pContext->program.programHash)>0)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crDebug("Saving state with %d programs", crHashtableNumElements(pContext->program.programHash));
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* Save transform state */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync rc = SSMR3PutMem(pSSM, pContext->transform.clipPlane, sizeof(GLvectord)*CR_MAX_CLIP_PLANES);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync rc = SSMR3PutMem(pSSM, pContext->transform.clip, sizeof(GLboolean)*CR_MAX_CLIP_PLANES);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync rc = crStateSaveMatrixStack(&pContext->transform.modelViewStack, pSSM);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync rc = crStateSaveMatrixStack(&pContext->transform.projectionStack, pSSM);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync rc = crStateSaveMatrixStack(&pContext->transform.colorStack, pSSM);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync for (i = 0 ; i < CR_MAX_TEXTURE_UNITS ; i++)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync rc = crStateSaveMatrixStack(&pContext->transform.textureStack[i], pSSM);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync for (i = 0 ; i < CR_MAX_PROGRAM_MATRICES ; i++)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync rc = crStateSaveMatrixStack(&pContext->transform.programStack[i], pSSM);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* Save textures */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync rc = crStateSaveTextureObjData(&pContext->texture.base1D, pSSM);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync rc = crStateSaveTextureObjData(&pContext->texture.base2D, pSSM);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync rc = crStateSaveTextureObjData(&pContext->texture.base3D, pSSM);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync rc = crStateSaveTextureObjData(&pContext->texture.proxy1D, pSSM);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync rc = crStateSaveTextureObjData(&pContext->texture.proxy2D, pSSM);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync rc = crStateSaveTextureObjData(&pContext->texture.proxy3D, pSSM);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync rc = crStateSaveTextureObjData(&pContext->texture.baseCubeMap, pSSM);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync rc = crStateSaveTextureObjData(&pContext->texture.proxyCubeMap, pSSM);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync rc = crStateSaveTextureObjData(&pContext->texture.baseRect, pSSM);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync rc = crStateSaveTextureObjData(&pContext->texture.proxyRect, pSSM);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* Save shared textures */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRASSERT(pContext->shared && pContext->shared->textureTable);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync ui32 = crHashtableNumElements(pContext->shared->textureTable);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crHashtableWalk(pContext->shared->textureTable, crStateSaveSharedTextureCB, pSSM);
0bebd3a2671042901f1fcceff14f8c58dd397478vboxsync /* Restore previous texture bindings via diff_api */
0bebd3a2671042901f1fcceff14f8c58dd397478vboxsync pTexUnit = &pContext->texture.unit[pContext->texture.curTextureUnit];
0bebd3a2671042901f1fcceff14f8c58dd397478vboxsync diff_api.BindTexture(GL_TEXTURE_1D, pTexUnit->currentTexture1D->name);
0bebd3a2671042901f1fcceff14f8c58dd397478vboxsync diff_api.BindTexture(GL_TEXTURE_2D, pTexUnit->currentTexture2D->name);
0bebd3a2671042901f1fcceff14f8c58dd397478vboxsync diff_api.BindTexture(GL_TEXTURE_3D, pTexUnit->currentTexture3D->name);
0bebd3a2671042901f1fcceff14f8c58dd397478vboxsync diff_api.BindTexture(GL_TEXTURE_CUBE_MAP_ARB, pTexUnit->currentTextureCubeMap->name);
0bebd3a2671042901f1fcceff14f8c58dd397478vboxsync diff_api.BindTexture(GL_TEXTURE_RECTANGLE_NV, pTexUnit->currentTextureRect->name);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* Save current texture pointers */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync for (i=0; i<CR_MAX_TEXTURE_UNITS; ++i)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync rc = crStateSaveTexUnitCurrentTexturePtrs(&pContext->texture.unit[i], pSSM);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* Save lights */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync rc = SSMR3PutMem(pSSM, pContext->lighting.light, CR_MAX_LIGHTS * sizeof(*pContext->lighting.light));
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* Save attrib stack*/
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /*@todo could go up to used stack depth here?*/
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync for ( i = 0 ; i < CR_MAX_ATTRIB_STACK_DEPTH ; i++)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync rc = SSMR3PutMem(pSSM, pContext->attrib.enableStack[i].clip,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync rc = SSMR3PutMem(pSSM, pContext->attrib.enableStack[i].light,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync rc = SSMR3PutMem(pSSM, pContext->attrib.lightingStack[i].light,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync rc = crStateSaveTexUnitCurrentTexturePtrs(&pContext->attrib.textureStack[i].unit[j], pSSM);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync rc = SSMR3PutMem(pSSM, pContext->attrib.transformStack[i].clip,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync rc = SSMR3PutMem(pSSM, pContext->attrib.transformStack[i].clipPlane,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync rc = crSateSaveEvalCoeffs1D(pContext->attrib.evalStack[i].eval1D, pSSM);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync rc = crSateSaveEvalCoeffs2D(pContext->attrib.evalStack[i].eval2D, pSSM);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* Save evaluator coeffs */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync rc = crSateSaveEvalCoeffs1D(pContext->eval.eval1D, pSSM);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync rc = crSateSaveEvalCoeffs2D(pContext->eval.eval2D, pSSM);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* Save buffer objects */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync ui32 = crHashtableNumElements(pContext->bufferobject.buffers);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* Save default one*/
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crStateSaveBufferObjectCB(0, pContext->bufferobject.nullBuffer, pSSM);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* Save all the rest */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crHashtableWalk(pContext->bufferobject.buffers, crStateSaveBufferObjectCB, pSSM);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* Save pointers */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync rc = SSMR3PutU32(pSSM, pContext->bufferobject.arrayBuffer->name);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync rc = SSMR3PutU32(pSSM, pContext->bufferobject.elementsBuffer->name);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* Save pixel/vertex programs */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync ui32 = crHashtableNumElements(pContext->program.programHash);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* Save defauls programs */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crStateSaveProgramCB(0, pContext->program.defaultVertexProgram, pSSM);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crStateSaveProgramCB(0, pContext->program.defaultFragmentProgram, pSSM);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* Save all the rest */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crHashtableWalk(pContext->program.programHash, crStateSaveProgramCB, pSSM);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* Save Pointers */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync rc = SSMR3PutU32(pSSM, pContext->program.currentVertexProgram->id);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync rc = SSMR3PutU32(pSSM, pContext->program.currentFragmentProgram->id);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* This one is unused it seems*/
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#define SLC_COPYPTR(ptr) pTmpContext->ptr = pContext->ptr
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#define SLC_ASSSERT_NULL_PTR(ptr) CRASSERT(!pContext->ptr)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncint32_t crStateLoadContext(CRContext *pContext, PSSMHANDLE pSSM)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync unsigned long key;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* This one is rather big for stack allocation and causes macs to crash */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync pTmpContext = (CRContext*)crAlloc(sizeof(*pTmpContext));
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync rc = SSMR3GetMem(pSSM, pTmpContext, sizeof(*pTmpContext));
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* We're supposed to be loading into an empty context, so those pointers should be NULL */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync for ( i = 0 ; i < CR_MAX_ATTRIB_STACK_DEPTH ; i++)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync SLC_ASSSERT_NULL_PTR(attrib.lightingStack[i].light);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync SLC_ASSSERT_NULL_PTR(attrib.transformStack[i].clip);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync SLC_ASSSERT_NULL_PTR(attrib.transformStack[i].clipPlane);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync for (j=0; j<GLEVAL_TOT; ++j)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync SLC_ASSSERT_NULL_PTR(attrib.evalStack[i].eval1D[j].coeff);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync SLC_ASSSERT_NULL_PTR(attrib.evalStack[i].eval2D[j].coeff);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync for (i = 0 ; i < CR_MAX_TEXTURE_UNITS ; i++)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync for (i = 0 ; i < CR_MAX_TEXTURE_UNITS ; i++)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync for (i = 0; i < CR_MAX_VERTEX_ATTRIBS; i++) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#endif /*CR_ARB_vertex_buffer_object2*/
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /*@todo CR_NV_vertex_program*/
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crStateCopyEvalPtrs1D(pTmpContext->eval.eval1D, pContext->eval.eval1D);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crStateCopyEvalPtrs2D(pTmpContext->eval.eval2D, pContext->eval.eval2D);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /*This one could be tricky if we're loading snapshot on host with different GPU*/
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* Texture pointers */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync for (i=0; i<6; ++i)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* Load transform state */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* Don't have to worry about pContext->transform.current as it'd be set in crStateSetCurrent call */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /*SLC_COPYPTR(transform.currentStack);*/
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync for (i = 0 ; i < CR_MAX_TEXTURE_UNITS ; i++)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync for (i = 0 ; i < CR_MAX_PROGRAM_MATRICES ; i++)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* Have to preserve original context id */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* Copy ordinary state to real context */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crMemcpy(pContext, pTmpContext, sizeof(*pTmpContext));
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* Now deal with pointers */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* Load transform state */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync rc = SSMR3GetMem(pSSM, pContext->transform.clipPlane, sizeof(GLvectord)*CR_MAX_CLIP_PLANES);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync rc = SSMR3GetMem(pSSM, pContext->transform.clip, sizeof(GLboolean)*CR_MAX_CLIP_PLANES);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync rc = crStateLoadMatrixStack(&pContext->transform.modelViewStack, pSSM);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync rc = crStateLoadMatrixStack(&pContext->transform.projectionStack, pSSM);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync rc = crStateLoadMatrixStack(&pContext->transform.colorStack, pSSM);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync for (i = 0 ; i < CR_MAX_TEXTURE_UNITS ; i++)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync rc = crStateLoadMatrixStack(&pContext->transform.textureStack[i], pSSM);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync for (i = 0 ; i < CR_MAX_PROGRAM_MATRICES ; i++)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync rc = crStateLoadMatrixStack(&pContext->transform.programStack[i], pSSM);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* Load Textures */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync rc = crStateLoadTextureObjData(&pContext->texture.base1D, pSSM);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync rc = crStateLoadTextureObjData(&pContext->texture.base2D, pSSM);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync rc = crStateLoadTextureObjData(&pContext->texture.base3D, pSSM);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync rc = crStateLoadTextureObjData(&pContext->texture.proxy1D, pSSM);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync rc = crStateLoadTextureObjData(&pContext->texture.proxy2D, pSSM);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync rc = crStateLoadTextureObjData(&pContext->texture.proxy3D, pSSM);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync rc = crStateLoadTextureObjData(&pContext->texture.baseCubeMap, pSSM);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync rc = crStateLoadTextureObjData(&pContext->texture.proxyCubeMap, pSSM);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync rc = crStateLoadTextureObjData(&pContext->texture.baseRect, pSSM);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync rc = crStateLoadTextureObjData(&pContext->texture.proxyRect, pSSM);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* Load shared textures */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRASSERT(pContext->shared && pContext->shared->textureTable);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync pTexture = (CRTextureObj *) crCalloc(sizeof(CRTextureObj));
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync rc = SSMR3GetMem(pSSM, pTexture, sizeof(*pTexture));
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync //DIRTY(pTexture->dirty, pContext->neg_bitid);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync //DIRTY(pTexture->imageBit, pContext->neg_bitid);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /*allocate actual memory*/
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync for (i=0; i<6; ++i) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync pTexture->level[i] = (CRTextureLevel *) crCalloc(sizeof(CRTextureLevel) * MAX_MIPMAP_LEVELS);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crHashtableAdd(pContext->shared->textureTable, key, pTexture);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* Load current texture pointers */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync for (i=0; i<CR_MAX_TEXTURE_UNITS; ++i)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync rc = crStateLoadTexUnitCurrentTexturePtrs(&pContext->texture.unit[i], pContext, pSSM);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync //FILLDIRTY(GetCurrentBits()->texture.dirty);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* Mark textures for resending to GPU */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* Load lights */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync rc = SSMR3GetMem(pSSM, pContext->lighting.light, CR_MAX_LIGHTS * sizeof(*pContext->lighting.light));
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* Load attrib stack*/
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync for ( i = 0 ; i < CR_MAX_ATTRIB_STACK_DEPTH ; i++)
885ac2b8c00cb7f4878e9108f40e1a43ff756e35vboxsync rc = crStateAllocAndSSMR3GetMem(pSSM, (void**)&pContext->attrib.enableStack[i].clip,
885ac2b8c00cb7f4878e9108f40e1a43ff756e35vboxsync rc = crStateAllocAndSSMR3GetMem(pSSM, (void**)&pContext->attrib.enableStack[i].light,
885ac2b8c00cb7f4878e9108f40e1a43ff756e35vboxsync rc = crStateAllocAndSSMR3GetMem(pSSM, (void**)&pContext->attrib.lightingStack[i].light,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync rc = crStateLoadTexUnitCurrentTexturePtrs(&pContext->attrib.textureStack[i].unit[k], pContext, pSSM);
885ac2b8c00cb7f4878e9108f40e1a43ff756e35vboxsync rc = crStateAllocAndSSMR3GetMem(pSSM, (void*)&pContext->attrib.transformStack[i].clip,
885ac2b8c00cb7f4878e9108f40e1a43ff756e35vboxsync rc = crStateAllocAndSSMR3GetMem(pSSM, (void**)&pContext->attrib.transformStack[i].clipPlane,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync rc = crSateLoadEvalCoeffs1D(pContext->attrib.evalStack[i].eval1D, GL_TRUE, pSSM);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync rc = crSateLoadEvalCoeffs2D(pContext->attrib.evalStack[i].eval2D, GL_TRUE, pSSM);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* Load evaluator coeffs */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync rc = crSateLoadEvalCoeffs1D(pContext->eval.eval1D, GL_FALSE, pSSM);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync rc = crSateLoadEvalCoeffs2D(pContext->eval.eval2D, GL_FALSE, pSSM);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* Load buffer objects */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync for (ui=0; ui<=uiNumElems; ++ui) /*ui<=uiNumElems to load nullBuffer in same loop*/
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* default one should be already allocated */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync pBufferObj = (CRBufferObject *) crCalloc(sizeof(*pBufferObj));
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync rc = SSMR3GetMem(pSSM, pBufferObj, sizeof(*pBufferObj));
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync rc = SSMR3GetMem(pSSM, pBufferObj->data, pBufferObj->size);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync //DIRTY(pBufferObj->dirty, pContext->neg_bitid);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync //pBufferObj->dirtyStart = 0;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync //pBufferObj->dirtyLength = pBufferObj->size;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crHashtableAdd(pContext->bufferobject.buffers, key, pBufferObj);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync //FILLDIRTY(GetCurrentBits()->bufferobject.dirty);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* Load pointers */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync pContext->bufferobject.arrayBuffer = ui==0 ? pContext->bufferobject.nullBuffer
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync : crHashtableSearch(pContext->bufferobject.buffers, ui);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync pContext->bufferobject.elementsBuffer = ui==0 ? pContext->bufferobject.nullBuffer
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync : crHashtableSearch(pContext->bufferobject.buffers, ui);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* Load pixel/vertex programs */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* Load defauls programs */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync rc = crStateLoadProgram(&pContext->program.defaultVertexProgram, pSSM);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync //FILLDIRTY(pContext->program.defaultVertexProgram->dirtyProgram);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync rc = crStateLoadProgram(&pContext->program.defaultFragmentProgram, pSSM);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync //FILLDIRTY(pContext->program.defaultFragmentProgram->dirtyProgram);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* Load all the rest */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crHashtableAdd(pContext->program.programHash, pProgram->id, pProgram);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync //DIRTY(pProgram->dirtyProgram, pContext->neg_bitid);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync //FILLDIRTY(GetCurrentBits()->program.dirty);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* Load Pointers */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync pContext->program.currentVertexProgram = ui==0 ? pContext->program.defaultVertexProgram
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync : crHashtableSearch(pContext->program.programHash, ui);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync pContext->program.currentFragmentProgram = ui==0 ? pContext->program.defaultFragmentProgram
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync : crHashtableSearch(pContext->program.programHash, ui);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* Mark programs for resending to GPU */