state_snapshot.c revision 79664e45c3d7123821dcd5de01991c6de96b8794
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * VBox Context state saving/loading used by VM snapshot
e64031e20c39650a7bc902a3e1aba613b9415deevboxsync * Copyright (C) 2008 Oracle Corporation
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 * 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.
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncstatic int32_t crStateAllocAndSSMR3GetMem(PSSMHANDLE pSSM, void **pBuffer, size_t cbBuffer)
b862944342504d1b9dddd6348d1a9048c72ba418vboxsync#define SHCROGL_GET_STRUCT_PART(_pPtr, _type, _from, _to) do { \
b862944342504d1b9dddd6348d1a9048c72ba418vboxsync rc = SSMR3GetMem(pSSM, &(_pPtr)->_from, RT_OFFSETOF(_type, _to) - RT_OFFSETOF(_type, _from)); \
b862944342504d1b9dddd6348d1a9048c72ba418vboxsync } while (0)
b862944342504d1b9dddd6348d1a9048c72ba418vboxsync#define SHCROGL_GET_STRUCT_TAIL(_pPtr, _type, _from) do { \
b862944342504d1b9dddd6348d1a9048c72ba418vboxsync rc = SSMR3GetMem(pSSM, &(_pPtr)->_from, sizeof (_type) - RT_OFFSETOF(_type, _from)); \
b862944342504d1b9dddd6348d1a9048c72ba418vboxsync } while (0)
b862944342504d1b9dddd6348d1a9048c72ba418vboxsync#define SHCROGL_GET_STRUCT_HEAD(_pPtr, _type, _to) do { \
b862944342504d1b9dddd6348d1a9048c72ba418vboxsync rc = SSMR3GetMem(pSSM, (_pPtr), RT_OFFSETOF(_type, _to)); \
b862944342504d1b9dddd6348d1a9048c72ba418vboxsync } while (0)
b862944342504d1b9dddd6348d1a9048c72ba418vboxsync#define SHCROGL_CUT_FIELD_ALIGNMENT_SIZE(_type, _prevField, _field) (RT_OFFSETOF(_type, _field) - RT_OFFSETOF(_type, _prevField) - RT_SIZEOFMEMB(_type, _prevField))
b862944342504d1b9dddd6348d1a9048c72ba418vboxsync#define SHCROGL_CUT_FIELD_ALIGNMENT(_type, _prevField, _field) do { \
b862944342504d1b9dddd6348d1a9048c72ba418vboxsync const int32_t cbAlignment = SHCROGL_CUT_FIELD_ALIGNMENT_SIZE(_type, _prevField, _field) ; \
72045adcc823bc894f97f9a51d4e4b48b5ce0e39vboxsync /*AssertCompile(SHCROGL_CUT_FIELD_ALIGNMENT_SIZE(_type, _prevField, _field) >= 0 && SHCROGL_CUT_FIELD_ALIGNMENT_SIZE(_type, _prevField, _field) < sizeof (void*));*/ \
b862944342504d1b9dddd6348d1a9048c72ba418vboxsync } while (0)
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync#define SHCROGL_ROUNDBOUND(_v, _b) (((_v) + ((_b) - 1)) & ~((_b) - 1))
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync#define SHCROGL_ALIGNTAILSIZE(_v, _b) (SHCROGL_ROUNDBOUND((_v),(_b)) - (_v))
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync#define SHCROGL_CUT_FOR_OLD_TYPE_TO_ENSURE_ALIGNMENT_SIZE(_type, _field, _oldFieldType, _nextFieldAllignment) (SHCROGL_ALIGNTAILSIZE(((RT_OFFSETOF(_type, _field) + sizeof (_oldFieldType))), (_nextFieldAllignment)))
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync#define SHCROGL_CUT_FOR_OLD_TYPE_TO_ENSURE_ALIGNMENT(_type, _field, _oldFieldType, _nextFieldAllignment) do { \
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync const int32_t cbAlignment = SHCROGL_CUT_FOR_OLD_TYPE_TO_ENSURE_ALIGNMENT_SIZE(_type, _field, _oldFieldType, _nextFieldAllignment); \
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync /*AssertCompile(SHCROGL_CUT_TAIL_ALIGNMENT_SIZE(_type, _lastField) >= 0 && SHCROGL_CUT_TAIL_ALIGNMENT_SIZE(_type, _lastField) < sizeof (void*));*/ \
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync } while (0)
b862944342504d1b9dddd6348d1a9048c72ba418vboxsync#define SHCROGL_CUT_TAIL_ALIGNMENT_SIZE(_type, _lastField) (sizeof (_type) - RT_OFFSETOF(_type, _lastField) - RT_SIZEOFMEMB(_type, _lastField))
b862944342504d1b9dddd6348d1a9048c72ba418vboxsync#define SHCROGL_CUT_TAIL_ALIGNMENT(_type, _lastField) do { \
b862944342504d1b9dddd6348d1a9048c72ba418vboxsync const int32_t cbAlignment = SHCROGL_CUT_TAIL_ALIGNMENT_SIZE(_type, _lastField); \
72045adcc823bc894f97f9a51d4e4b48b5ce0e39vboxsync /*AssertCompile(SHCROGL_CUT_TAIL_ALIGNMENT_SIZE(_type, _lastField) >= 0 && SHCROGL_CUT_TAIL_ALIGNMENT_SIZE(_type, _lastField) < sizeof (void*));*/ \
b862944342504d1b9dddd6348d1a9048c72ba418vboxsync } while (0)
b862944342504d1b9dddd6348d1a9048c72ba418vboxsyncstatic int32_t crStateLoadTextureObj_v_BEFORE_CTXUSAGE_BITS(CRTextureObj *pTexture, PSSMHANDLE pSSM)
b862944342504d1b9dddd6348d1a9048c72ba418vboxsync uint32_t cbObj = RT_OFFSETOF(CRTextureObj, ctxUsage);
b862944342504d1b9dddd6348d1a9048c72ba418vboxsync cbObj = ((cbObj + sizeof (void*) - 1) & ~(sizeof (void*) - 1));
b862944342504d1b9dddd6348d1a9048c72ba418vboxsync /* just make all bits are used so that we fall back to the pre-ctxUsage behavior,
b862944342504d1b9dddd6348d1a9048c72ba418vboxsync * i.e. all shared resources will be destructed on last shared context termination */
b862944342504d1b9dddd6348d1a9048c72ba418vboxsyncstatic int32_t crStateLoadTextureUnit_v_BEFORE_CTXUSAGE_BITS(CRTextureUnit *t, PSSMHANDLE pSSM)
b862944342504d1b9dddd6348d1a9048c72ba418vboxsync SHCROGL_GET_STRUCT_HEAD(t, CRTextureUnit, Saved1D);
b862944342504d1b9dddd6348d1a9048c72ba418vboxsync rc = crStateLoadTextureObj_v_BEFORE_CTXUSAGE_BITS(&t->Saved1D, pSSM);
b862944342504d1b9dddd6348d1a9048c72ba418vboxsync SHCROGL_CUT_FIELD_ALIGNMENT(CRTextureUnit, Saved1D, Saved2D);
b862944342504d1b9dddd6348d1a9048c72ba418vboxsync rc = crStateLoadTextureObj_v_BEFORE_CTXUSAGE_BITS(&t->Saved2D, pSSM);
b862944342504d1b9dddd6348d1a9048c72ba418vboxsync SHCROGL_CUT_FIELD_ALIGNMENT(CRTextureUnit, Saved2D, Saved3D);
b862944342504d1b9dddd6348d1a9048c72ba418vboxsync rc = crStateLoadTextureObj_v_BEFORE_CTXUSAGE_BITS(&t->Saved3D, pSSM);
b862944342504d1b9dddd6348d1a9048c72ba418vboxsync SHCROGL_CUT_FIELD_ALIGNMENT(CRTextureUnit, Saved3D, SavedCubeMap);
b862944342504d1b9dddd6348d1a9048c72ba418vboxsync rc = crStateLoadTextureObj_v_BEFORE_CTXUSAGE_BITS(&t->SavedCubeMap, pSSM);
b862944342504d1b9dddd6348d1a9048c72ba418vboxsync SHCROGL_CUT_FIELD_ALIGNMENT(CRTextureUnit, SHCROGL_INTERNAL_LAST_FIELD, SavedRect);
b862944342504d1b9dddd6348d1a9048c72ba418vboxsync rc = crStateLoadTextureObj_v_BEFORE_CTXUSAGE_BITS(&t->SavedRect, pSSM);
b862944342504d1b9dddd6348d1a9048c72ba418vboxsync SHCROGL_CUT_TAIL_ALIGNMENT(CRTextureUnit, SHCROGL_INTERNAL_LAST_FIELD);
79664e45c3d7123821dcd5de01991c6de96b8794vboxsyncstatic int32_t crStateLoadStencilState_v_33(CRStencilState *s, PSSMHANDLE pSSM)
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync int32_t rc = SSMR3GetMem(pSSM, &stencilV33, sizeof (stencilV33));
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync s->buffers[CRSTATE_STENCIL_BUFFER_ID_FRONT].func = stencilV33.func;
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync s->buffers[CRSTATE_STENCIL_BUFFER_ID_FRONT].mask = stencilV33.mask;
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync s->buffers[CRSTATE_STENCIL_BUFFER_ID_FRONT].ref = stencilV33.ref;
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync s->buffers[CRSTATE_STENCIL_BUFFER_ID_FRONT].fail = stencilV33.fail;
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync s->buffers[CRSTATE_STENCIL_BUFFER_ID_FRONT].passDepthFail = stencilV33.passDepthFail;
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync s->buffers[CRSTATE_STENCIL_BUFFER_ID_FRONT].passDepthPass = stencilV33.passDepthPass;
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync s->buffers[CRSTATE_STENCIL_BUFFER_ID_BACK] = s->buffers[CRSTATE_STENCIL_BUFFER_ID_FRONT];
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync crStateStencilBufferInit(&s->buffers[CRSTATE_STENCIL_BUFFER_ID_TWO_SIDE_BACK]);
b862944342504d1b9dddd6348d1a9048c72ba418vboxsyncstatic int32_t crStateLoadTextureState_v_BEFORE_CTXUSAGE_BITS(CRTextureState *t, PSSMHANDLE pSSM)
b862944342504d1b9dddd6348d1a9048c72ba418vboxsync int32_t rc = crStateLoadTextureObj_v_BEFORE_CTXUSAGE_BITS(&t->base1D, pSSM);
b862944342504d1b9dddd6348d1a9048c72ba418vboxsync SHCROGL_CUT_FIELD_ALIGNMENT(CRTextureState, base1D, base2D);
b862944342504d1b9dddd6348d1a9048c72ba418vboxsync rc = crStateLoadTextureObj_v_BEFORE_CTXUSAGE_BITS(&t->base2D, pSSM);
b862944342504d1b9dddd6348d1a9048c72ba418vboxsync rc = crStateLoadTextureObj_v_BEFORE_CTXUSAGE_BITS(&t->base3D, pSSM);
b862944342504d1b9dddd6348d1a9048c72ba418vboxsync SHCROGL_CUT_FIELD_ALIGNMENT(CRTextureState, base2D, base3D);
b862944342504d1b9dddd6348d1a9048c72ba418vboxsync SHCROGL_CUT_FIELD_ALIGNMENT(CRTextureState, base3D, baseCubeMap);
b862944342504d1b9dddd6348d1a9048c72ba418vboxsync rc = crStateLoadTextureObj_v_BEFORE_CTXUSAGE_BITS(&t->baseCubeMap, pSSM);
b862944342504d1b9dddd6348d1a9048c72ba418vboxsync SHCROGL_CUT_FIELD_ALIGNMENT(CRTextureState, SHCROGL_INTERNAL_LAST_FIELD, baseRect);
b862944342504d1b9dddd6348d1a9048c72ba418vboxsync rc = crStateLoadTextureObj_v_BEFORE_CTXUSAGE_BITS(&t->baseRect, pSSM);
b862944342504d1b9dddd6348d1a9048c72ba418vboxsync SHCROGL_CUT_FIELD_ALIGNMENT(CRTextureState, SHCROGL_INTERNAL_LAST_FIELD, proxy1D);
b862944342504d1b9dddd6348d1a9048c72ba418vboxsync rc = crStateLoadTextureObj_v_BEFORE_CTXUSAGE_BITS(&t->proxy1D, pSSM);
b862944342504d1b9dddd6348d1a9048c72ba418vboxsync SHCROGL_CUT_FIELD_ALIGNMENT(CRTextureState, proxy1D, proxy2D);
b862944342504d1b9dddd6348d1a9048c72ba418vboxsync rc = crStateLoadTextureObj_v_BEFORE_CTXUSAGE_BITS(&t->proxy2D, pSSM);
b862944342504d1b9dddd6348d1a9048c72ba418vboxsync SHCROGL_CUT_FIELD_ALIGNMENT(CRTextureState, proxy2D, proxy3D);
b862944342504d1b9dddd6348d1a9048c72ba418vboxsync rc = crStateLoadTextureObj_v_BEFORE_CTXUSAGE_BITS(&t->proxy3D, pSSM);
b862944342504d1b9dddd6348d1a9048c72ba418vboxsync SHCROGL_CUT_FIELD_ALIGNMENT(CRTextureState, proxy3D, proxyCubeMap);
b862944342504d1b9dddd6348d1a9048c72ba418vboxsync rc = crStateLoadTextureObj_v_BEFORE_CTXUSAGE_BITS(&t->proxyCubeMap, pSSM);
b862944342504d1b9dddd6348d1a9048c72ba418vboxsync SHCROGL_CUT_FIELD_ALIGNMENT(CRTextureState, SHCROGL_INTERNAL_LAST_FIELD, proxyRect);
b862944342504d1b9dddd6348d1a9048c72ba418vboxsync rc = crStateLoadTextureObj_v_BEFORE_CTXUSAGE_BITS(&t->proxyRect, pSSM);
b862944342504d1b9dddd6348d1a9048c72ba418vboxsync SHCROGL_CUT_FIELD_ALIGNMENT(CRTextureState, SHCROGL_INTERNAL_LAST_FIELD, curTextureUnit);
b862944342504d1b9dddd6348d1a9048c72ba418vboxsync SHCROGL_GET_STRUCT_PART(t, CRTextureState, curTextureUnit, unit);
b862944342504d1b9dddd6348d1a9048c72ba418vboxsync for (i = 0; i < CR_MAX_TEXTURE_UNITS; ++i)
b862944342504d1b9dddd6348d1a9048c72ba418vboxsync rc = crStateLoadTextureUnit_v_BEFORE_CTXUSAGE_BITS(&t->unit[i], pSSM);
79664e45c3d7123821dcd5de01991c6de96b8794vboxsyncstatic int32_t crStateStencilBufferStack_v_33(CRStencilBufferStack *s, PSSMHANDLE pSSM)
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync int32_t rc = SSMR3GetMem(pSSM, &stackV33, sizeof (stackV33));
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync s->buffers[CRSTATE_STENCIL_BUFFER_ID_FRONT].func = stackV33.func;
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync s->buffers[CRSTATE_STENCIL_BUFFER_ID_FRONT].mask = stackV33.mask;
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync s->buffers[CRSTATE_STENCIL_BUFFER_ID_FRONT].ref = stackV33.ref;
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync s->buffers[CRSTATE_STENCIL_BUFFER_ID_FRONT].fail = stackV33.fail;
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync s->buffers[CRSTATE_STENCIL_BUFFER_ID_FRONT].passDepthFail = stackV33.passDepthFail;
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync s->buffers[CRSTATE_STENCIL_BUFFER_ID_FRONT].passDepthPass = stackV33.passDepthPass;
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync s->buffers[CRSTATE_STENCIL_BUFFER_ID_BACK] = s->buffers[CRSTATE_STENCIL_BUFFER_ID_FRONT];
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync s->buffers[CRSTATE_STENCIL_BUFFER_ID_TWO_SIDE_BACK].func = GL_ALWAYS;
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync s->buffers[CRSTATE_STENCIL_BUFFER_ID_TWO_SIDE_BACK].mask = 0xFFFFFFFF;
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync s->buffers[CRSTATE_STENCIL_BUFFER_ID_TWO_SIDE_BACK].ref = 0;
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync s->buffers[CRSTATE_STENCIL_BUFFER_ID_TWO_SIDE_BACK].fail = GL_KEEP;
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync s->buffers[CRSTATE_STENCIL_BUFFER_ID_TWO_SIDE_BACK].passDepthFail = GL_KEEP;
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync s->buffers[CRSTATE_STENCIL_BUFFER_ID_TWO_SIDE_BACK].passDepthPass = GL_KEEP;
79664e45c3d7123821dcd5de01991c6de96b8794vboxsyncstatic int32_t crStateLoadAttribState_v_33(CRAttribState *t, PSSMHANDLE pSSM)
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync SHCROGL_GET_STRUCT_HEAD(t, CRAttribState, stencilBufferStack);
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync for (i = 0; i < CR_MAX_ATTRIB_STACK_DEPTH; ++i)
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync rc = crStateStencilBufferStack_v_33(&t->stencilBufferStack[i], pSSM);
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync SHCROGL_GET_STRUCT_TAIL(t, CRAttribState, textureStackDepth);
b862944342504d1b9dddd6348d1a9048c72ba418vboxsyncstatic int32_t crStateLoadTextureStack_v_BEFORE_CTXUSAGE_BITS(CRTextureStack *t, PSSMHANDLE pSSM)
b862944342504d1b9dddd6348d1a9048c72ba418vboxsync for (i = 0; i < CR_MAX_TEXTURE_UNITS; ++i)
b862944342504d1b9dddd6348d1a9048c72ba418vboxsync rc = crStateLoadTextureUnit_v_BEFORE_CTXUSAGE_BITS(&t->unit[i], pSSM);
b862944342504d1b9dddd6348d1a9048c72ba418vboxsyncstatic int32_t crStateLoadAttribState_v_BEFORE_CTXUSAGE_BITS(CRAttribState *t, PSSMHANDLE pSSM)
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync SHCROGL_GET_STRUCT_HEAD(t, CRAttribState, stencilBufferStack);
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync for (i = 0; i < CR_MAX_ATTRIB_STACK_DEPTH; ++i)
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync rc = crStateStencilBufferStack_v_33(&t->stencilBufferStack[i], pSSM);
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync SHCROGL_GET_STRUCT_PART(t, CRAttribState, textureStackDepth, textureStack);
b862944342504d1b9dddd6348d1a9048c72ba418vboxsync for (i = 0; i < CR_MAX_ATTRIB_STACK_DEPTH; ++i)
b862944342504d1b9dddd6348d1a9048c72ba418vboxsync rc = crStateLoadTextureStack_v_BEFORE_CTXUSAGE_BITS(&t->textureStack[i], pSSM);
b862944342504d1b9dddd6348d1a9048c72ba418vboxsync SHCROGL_GET_STRUCT_TAIL(t, CRAttribState, transformStackDepth);
b862944342504d1b9dddd6348d1a9048c72ba418vboxsyncstatic int32_t crStateLoadTextureObj(CRTextureObj *pTexture, PSSMHANDLE pSSM, uint32_t u32Version)
b862944342504d1b9dddd6348d1a9048c72ba418vboxsync if (u32Version == SHCROGL_SSM_VERSION_BEFORE_CTXUSAGE_BITS)
b862944342504d1b9dddd6348d1a9048c72ba418vboxsync return crStateLoadTextureObj_v_BEFORE_CTXUSAGE_BITS(pTexture, pSSM);
b862944342504d1b9dddd6348d1a9048c72ba418vboxsync rc = SSMR3GetMem(pSSM, pTexture, sizeof (*pTexture));
b862944342504d1b9dddd6348d1a9048c72ba418vboxsyncstatic int32_t crStateLoadBufferObject(CRBufferObject *pBufferObj, PSSMHANDLE pSSM, uint32_t u32Version)
b862944342504d1b9dddd6348d1a9048c72ba418vboxsync if (u32Version == SHCROGL_SSM_VERSION_BEFORE_CTXUSAGE_BITS)
b862944342504d1b9dddd6348d1a9048c72ba418vboxsync uint32_t cbObj = RT_OFFSETOF(CRBufferObject, ctxUsage);
b862944342504d1b9dddd6348d1a9048c72ba418vboxsync cbObj = ((cbObj + sizeof (void*) - 1) & ~(sizeof (void*) - 1));
b862944342504d1b9dddd6348d1a9048c72ba418vboxsync /* just make all bits are used so that we fall back to the pre-ctxUsage behavior,
b862944342504d1b9dddd6348d1a9048c72ba418vboxsync * i.e. all shared resources will be destructed on last shared context termination */
b862944342504d1b9dddd6348d1a9048c72ba418vboxsync rc = SSMR3GetMem(pSSM, pBufferObj, sizeof(*pBufferObj));
b862944342504d1b9dddd6348d1a9048c72ba418vboxsyncstatic int32_t crStateLoadFramebufferObject(CRFramebufferObject *pFBO, PSSMHANDLE pSSM, uint32_t u32Version)
b862944342504d1b9dddd6348d1a9048c72ba418vboxsync if (u32Version == SHCROGL_SSM_VERSION_BEFORE_CTXUSAGE_BITS)
b862944342504d1b9dddd6348d1a9048c72ba418vboxsync uint32_t cbObj = RT_OFFSETOF(CRFramebufferObject, ctxUsage);
b862944342504d1b9dddd6348d1a9048c72ba418vboxsync cbObj = ((cbObj + sizeof (void*) - 1) & ~(sizeof (void*) - 1));
b862944342504d1b9dddd6348d1a9048c72ba418vboxsync /* just make all bits are used so that we fall back to the pre-ctxUsage behavior,
b862944342504d1b9dddd6348d1a9048c72ba418vboxsync * i.e. all shared resources will be destructed on last shared context termination */
b862944342504d1b9dddd6348d1a9048c72ba418vboxsyncstatic int32_t crStateLoadRenderbufferObject(CRRenderbufferObject *pRBO, PSSMHANDLE pSSM, uint32_t u32Version)
b862944342504d1b9dddd6348d1a9048c72ba418vboxsync if (u32Version == SHCROGL_SSM_VERSION_BEFORE_CTXUSAGE_BITS)
b862944342504d1b9dddd6348d1a9048c72ba418vboxsync uint32_t cbObj = RT_OFFSETOF(CRRenderbufferObject, ctxUsage);
b862944342504d1b9dddd6348d1a9048c72ba418vboxsync cbObj = ((cbObj + sizeof (void*) - 1) & ~(sizeof (void*) - 1));
b862944342504d1b9dddd6348d1a9048c72ba418vboxsync /* just make all bits are used so that we fall back to the pre-ctxUsage behavior,
b862944342504d1b9dddd6348d1a9048c72ba418vboxsync * i.e. all shared resources will be destructed on last shared context termination */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncstatic int32_t crStateSaveTextureObjData(CRTextureObj *pTexture, PSSMHANDLE pSSM)
c62d2520ac91e12cf4665c936f490dd2064152d3vboxsync crDebug("crStateSaveTextureObjData %u. START", pTexture->id);
51e7ffc68ae0a6122fcfdc746905b6c7dae2c610vboxsync for (i = 0; i < CR_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
dfd5d06c9f004de9f61904c9d1185bca70969c6avboxsync * (pContext->shared->bTexResyncNeeded==GL_TRUE).
c62d2520ac91e12cf4665c936f490dd2064152d3vboxsync diff_api.BindTexture(pTexture->target, pTexture->hwid);
b703ad1c64ab0297ac689f4511855cedde6332b6vboxsync /* osx nvidia drivers seem to have a bug that 1x1 TEXTURE_2D texture becmes inaccessible for some reason
b703ad1c64ab0297ac689f4511855cedde6332b6vboxsync * saw that for 1x1 dummy textures generated by wine
b703ad1c64ab0297ac689f4511855cedde6332b6vboxsync * to avoid crashes we skip texture data save if that is the case */
b703ad1c64ab0297ac689f4511855cedde6332b6vboxsync crWarning("unknown texture target: 0x%x", pTexture->target);
b703ad1c64ab0297ac689f4511855cedde6332b6vboxsync crWarning("texture not bound properly: expected %d, but was %d. Texture state data: target(0x%x), id(%d), w(%d), h(%d)",
b703ad1c64ab0297ac689f4511855cedde6332b6vboxsync crDebug("get image: compressed %i, face %i, level %i, width %i, height %i, bytes %i",
b703ad1c64ab0297ac689f4511855cedde6332b6vboxsync ptl->compressed, face, i, ptl->width, ptl->height, ptl->bytes);
b703ad1c64ab0297ac689f4511855cedde6332b6vboxsync diff_api.GetTexLevelParameteriv(target, i, GL_TEXTURE_WIDTH, &w);
b703ad1c64ab0297ac689f4511855cedde6332b6vboxsync diff_api.GetTexLevelParameteriv(target, i, GL_TEXTURE_HEIGHT, &h);
b703ad1c64ab0297ac689f4511855cedde6332b6vboxsync /*@todo: ugly workaround for crashes inside ati driver,
b703ad1c64ab0297ac689f4511855cedde6332b6vboxsync * they overwrite their own allocated memory in cases where texlevel >=4
b703ad1c64ab0297ac689f4511855cedde6332b6vboxsync and width or height <=2.
b703ad1c64ab0297ac689f4511855cedde6332b6vboxsync diff_api.GetTexImage(target, i, ptl->format, ptl->type, pImg);
b703ad1c64ab0297ac689f4511855cedde6332b6vboxsync diff_api.GetCompressedTexImageARB(target, i, pImg);
c62d2520ac91e12cf4665c936f490dd2064152d3vboxsync crDebug("crStateSaveTextureObjData %u. END", pTexture->id);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncstatic int32_t crStateLoadTextureObjData(CRTextureObj *pTexture, PSSMHANDLE pSSM)
51e7ffc68ae0a6122fcfdc746905b6c7dae2c610vboxsync for (i = 0; i < CR_MAX_MIPMAP_LEVELS; i++) {
0bebd3a2671042901f1fcceff14f8c58dd397478vboxsync /* Same story as in crStateSaveTextureObjData */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crStateTextureInitTextureFormat(ptl, ptl->internalFormat);
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));
bf144aab354eaec8ee22b16b1c138f47f38b7244vboxsync /*We could get here even though retainBufferData is false on host side, in case when we're taking snapshot
bf144aab354eaec8ee22b16b1c138f47f38b7244vboxsync after state load and before this context was ever made current*/
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync rc = SSMR3PutMem(pSSM, pBufferObj->data, pBufferObj->size);
c62d2520ac91e12cf4665c936f490dd2064152d3vboxsync diff_api.BindBufferARB(GL_ARRAY_BUFFER_ARB, pBufferObj->hwid);
bf144aab354eaec8ee22b16b1c138f47f38b7244vboxsync pBufferObj->pointer = diff_api.MapBufferARB(GL_ARRAY_BUFFER_ARB, GL_READ_ONLY_ARB);
bf144aab354eaec8ee22b16b1c138f47f38b7244vboxsync rc = SSMR3PutMem(pSSM, &pBufferObj->pointer, sizeof(pBufferObj->pointer));
bf144aab354eaec8ee22b16b1c138f47f38b7244vboxsync rc = SSMR3PutMem(pSSM, pBufferObj->pointer, 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);
bd810d58866067df322ea7f4a4627d9bdebb70d3vboxsyncstatic void crStateSaveFramebuffersCB(unsigned long key, void *data1, void *data2)
bd810d58866067df322ea7f4a4627d9bdebb70d3vboxsync CRFramebufferObject *pFBO = (CRFramebufferObject*) data1;
bd810d58866067df322ea7f4a4627d9bdebb70d3vboxsyncstatic void crStateSaveRenderbuffersCB(unsigned long key, void *data1, void *data2)
bd810d58866067df322ea7f4a4627d9bdebb70d3vboxsync CRRenderbufferObject *pRBO = (CRRenderbufferObject*) data1;
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);
6e7c344fc7cdb580356704e8201207b394d367bbvboxsyncstatic void crStateSaveString(const char *pStr, PSSMHANDLE pSSM)
6e7c344fc7cdb580356704e8201207b394d367bbvboxsyncstatic void crStateSaveGLSLShaderCB(unsigned long key, void *data1, void *data2)
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync diff_api.GetShaderiv(pShader->hwid, GL_SHADER_SOURCE_LENGTH, &sLen);
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync diff_api.GetShaderSource(pShader->hwid, sLen, NULL, source);
6e7c344fc7cdb580356704e8201207b394d367bbvboxsyncstatic CRGLSLShader* crStateLoadGLSLShader(PSSMHANDLE pSSM)
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync unsigned long key;
6e7c344fc7cdb580356704e8201207b394d367bbvboxsyncstatic void crStateSaveGLSLShaderKeyCB(unsigned long key, void *data1, void *data2)
6e7c344fc7cdb580356704e8201207b394d367bbvboxsyncstatic void crStateSaveGLSLProgramAttribs(CRGLSLProgramState *pState, PSSMHANDLE pSSM)
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync rc = SSMR3PutMem(pSSM, &pState->pAttribs[i].index, sizeof(pState->pAttribs[i].index));
6e7c344fc7cdb580356704e8201207b394d367bbvboxsyncstatic void crStateSaveGLSLProgramCB(unsigned long key, void *data1, void *data2)
c697d02eb4ededad7e08b2c48428ddb56c844a0avboxsync GLint maxUniformLen, activeUniforms=0, uniformsCount=0, i, j;
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync rc = SSMR3PutMem(pSSM, pProgram, sizeof(*pProgram));
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync ui32 = crHashtableNumElements(pProgram->currentState.attachedShaders);
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync crHashtableWalk(pProgram->currentState.attachedShaders, crStateSaveGLSLShaderKeyCB, pSSM);
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync ui32 = crHashtableNumElements(pProgram->activeState.attachedShaders);
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync crHashtableWalk(pProgram->currentState.attachedShaders, crStateSaveGLSLShaderCB, pSSM);
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync crStateSaveGLSLProgramAttribs(&pProgram->currentState, pSSM);
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync crStateSaveGLSLProgramAttribs(&pProgram->activeState, pSSM);
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync diff_api.GetProgramiv(pProgram->hwid, GL_ACTIVE_UNIFORM_MAX_LENGTH, &maxUniformLen);
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync diff_api.GetProgramiv(pProgram->hwid, GL_ACTIVE_UNIFORMS, &activeUniforms);
c697d02eb4ededad7e08b2c48428ddb56c844a0avboxsync name = (GLchar *) crAlloc((maxUniformLen+8)*sizeof(GLchar));
c697d02eb4ededad7e08b2c48428ddb56c844a0avboxsync crWarning("crStateSaveGLSLProgramCB: out of memory");
c697d02eb4ededad7e08b2c48428ddb56c844a0avboxsync for (i=0; i<activeUniforms; ++i)
c697d02eb4ededad7e08b2c48428ddb56c844a0avboxsync diff_api.GetActiveUniform(pProgram->hwid, i, maxUniformLen, NULL, &size, &type, name);
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync for (i=0; i<activeUniforms; ++i)
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync diff_api.GetActiveUniform(pProgram->hwid, i, maxUniformLen, NULL, &size, &type, name);
c697d02eb4ededad7e08b2c48428ddb56c844a0avboxsync for (j=0; j<size; ++j)
1949f98957df74949c101f6f2c97f5f7de38144avboxsync location = diff_api.GetUniformLocation(pProgram->hwid, name);
c697d02eb4ededad7e08b2c48428ddb56c844a0avboxsync diff_api.GetUniformiv(pProgram->hwid, location, &idata[0]);
c697d02eb4ededad7e08b2c48428ddb56c844a0avboxsync rc = SSMR3PutMem(pSSM, &idata[0], crStateGetUniformSize(type)*sizeof(idata[0]));
c697d02eb4ededad7e08b2c48428ddb56c844a0avboxsync diff_api.GetUniformfv(pProgram->hwid, location, &fdata[0]);
c697d02eb4ededad7e08b2c48428ddb56c844a0avboxsync rc = SSMR3PutMem(pSSM, &fdata[0], crStateGetUniformSize(type)*sizeof(fdata[0]));
e42c49edebbc79edb6d87377bab6d879fdb602favboxsyncstatic int32_t crStateSaveClientPointer(CRVertexArrays *pArrays, int32_t index, PSSMHANDLE pSSM)
e42c49edebbc79edb6d87377bab6d879fdb602favboxsync cp = crStateGetClientPointerByIndex(index, pArrays);
e42c49edebbc79edb6d87377bab6d879fdb602favboxsync rc = SSMR3PutMem(pSSM, cp->p, cp->stride*(pArrays->lockFirst+pArrays->lockCount));
e42c49edebbc79edb6d87377bab6d879fdb602favboxsyncstatic int32_t crStateLoadClientPointer(CRVertexArrays *pArrays, int32_t index, CRContext *pContext, PSSMHANDLE pSSM)
e42c49edebbc79edb6d87377bab6d879fdb602favboxsync cp = crStateGetClientPointerByIndex(index, pArrays);
c62d2520ac91e12cf4665c936f490dd2064152d3vboxsync cp->buffer = ui==0 ? pContext->bufferobject.nullBuffer : crHashtableSearch(pContext->shared->buffersTable, ui);
4ff9c17f67441ba055d522ae932fbe7fb47250a8vboxsync crWarning("crStateLoadClientPointer: ui=%d loaded as NULL buffer!", ui);
d28dc67f08822d73f954174fab43e570131b54davboxsync rc = crStateAllocAndSSMR3GetMem(pSSM, (void**)&cp->p, cp->stride*(pArrays->lockFirst+pArrays->lockCount));
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsyncstatic int32_t crStateSaveCurrentBits(CRStateBits *pBits, PSSMHANDLE pSSM)
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync rc = SSMR3PutMem(pSSM, pBits->client.v, GLCLIENT_BIT_ALLOC*sizeof(CRbitvalue));
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync rc = SSMR3PutMem(pSSM, pBits->client.n, GLCLIENT_BIT_ALLOC*sizeof(CRbitvalue));
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync rc = SSMR3PutMem(pSSM, pBits->client.c, GLCLIENT_BIT_ALLOC*sizeof(CRbitvalue));
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync rc = SSMR3PutMem(pSSM, pBits->client.s, GLCLIENT_BIT_ALLOC*sizeof(CRbitvalue));
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync rc = SSMR3PutMem(pSSM, pBits->client.i, GLCLIENT_BIT_ALLOC*sizeof(CRbitvalue));
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync for (i=0; i<CR_MAX_TEXTURE_UNITS; i++)
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync rc = SSMR3PutMem(pSSM, pBits->client.t[i], GLCLIENT_BIT_ALLOC*sizeof(CRbitvalue));
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync rc = SSMR3PutMem(pSSM, pBits->client.e, GLCLIENT_BIT_ALLOC*sizeof(CRbitvalue));
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync rc = SSMR3PutMem(pSSM, pBits->client.f, GLCLIENT_BIT_ALLOC*sizeof(CRbitvalue));
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync for (i=0; i<CR_MAX_VERTEX_ATTRIBS; i++)
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync rc = SSMR3PutMem(pSSM, pBits->client.a[i], GLCLIENT_BIT_ALLOC*sizeof(CRbitvalue));
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync rc = SSMR3PutMem(pSSM, pBits->lighting.light, CR_MAX_LIGHTS*sizeof(pBits->lighting.light));
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsyncstatic int32_t crStateLoadCurrentBits(CRStateBits *pBits, PSSMHANDLE pSSM)
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync for (i=0; i<CR_MAX_TEXTURE_UNITS; i++)
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync for (i=0; i<CR_MAX_VERTEX_ATTRIBS; i++)
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync rc = SSMR3GetMem(pSSM, pBits->client.v, GLCLIENT_BIT_ALLOC*sizeof(CRbitvalue));
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync rc = SSMR3GetMem(pSSM, pBits->client.n, GLCLIENT_BIT_ALLOC*sizeof(CRbitvalue));
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync rc = SSMR3GetMem(pSSM, pBits->client.c, GLCLIENT_BIT_ALLOC*sizeof(CRbitvalue));
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync rc = SSMR3GetMem(pSSM, pBits->client.s, GLCLIENT_BIT_ALLOC*sizeof(CRbitvalue));
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync rc = SSMR3GetMem(pSSM, pBits->client.i, GLCLIENT_BIT_ALLOC*sizeof(CRbitvalue));
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync rc = SSMR3GetMem(pSSM, pBits->client.e, GLCLIENT_BIT_ALLOC*sizeof(CRbitvalue));
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync rc = SSMR3GetMem(pSSM, pBits->client.f, GLCLIENT_BIT_ALLOC*sizeof(CRbitvalue));
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync for (i=0; i<CR_MAX_TEXTURE_UNITS; i++)
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync rc = SSMR3GetMem(pSSM, pBits->client.t[i], GLCLIENT_BIT_ALLOC*sizeof(CRbitvalue));
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync for (i=0; i<CR_MAX_VERTEX_ATTRIBS; i++)
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync rc = SSMR3GetMem(pSSM, pBits->client.a[i], GLCLIENT_BIT_ALLOC*sizeof(CRbitvalue));
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync rc = SSMR3GetMem(pSSM, pBits->lighting.light, CR_MAX_LIGHTS*sizeof(pBits->lighting.light));
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncint32_t crStateSaveContext(CRContext *pContext, PSSMHANDLE pSSM)
290d9ae9b95045c087215884b282b1130b99098avboxsync pContext->buffer.storedWidth = pContext->buffer.width;
290d9ae9b95045c087215884b282b1130b99098avboxsync pContext->buffer.storedHeight = pContext->buffer.height;
4e9f070a55a9ab37758f11adff5ca15d0498bcffvboxsync /* make sure the gl error state is captured by our state mechanism to store the correct gl error value */
4e9f070a55a9ab37758f11adff5ca15d0498bcffvboxsync 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));
5ce760ff6b7c94fe0d0ef3c0252d4864e629462bvboxsync rc = SSMR3PutS32(pSSM, crStateContextIsShared(pContext));
c62d2520ac91e12cf4665c936f490dd2064152d3vboxsync if (pContext->shared->saveCount == pContext->shared->refCount)
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 */
c62d2520ac91e12cf4665c936f490dd2064152d3vboxsync CRASSERT(pContext->shared && pContext->shared->textureTable);
c62d2520ac91e12cf4665c936f490dd2064152d3vboxsync ui32 = crHashtableNumElements(pContext->shared->textureTable);
c62d2520ac91e12cf4665c936f490dd2064152d3vboxsync crHashtableWalk(pContext->shared->textureTable, crStateSaveSharedTextureCB, pSSM);
c62d2520ac91e12cf4665c936f490dd2064152d3vboxsync /* Restore previous texture bindings via diff_api */
c62d2520ac91e12cf4665c936f490dd2064152d3vboxsync pTexUnit = &pContext->texture.unit[pContext->texture.curTextureUnit];
c62d2520ac91e12cf4665c936f490dd2064152d3vboxsync diff_api.BindTexture(GL_TEXTURE_1D, pTexUnit->currentTexture1D->hwid);
c62d2520ac91e12cf4665c936f490dd2064152d3vboxsync diff_api.BindTexture(GL_TEXTURE_2D, pTexUnit->currentTexture2D->hwid);
c62d2520ac91e12cf4665c936f490dd2064152d3vboxsync diff_api.BindTexture(GL_TEXTURE_3D, pTexUnit->currentTexture3D->hwid);
c62d2520ac91e12cf4665c936f490dd2064152d3vboxsync diff_api.BindTexture(GL_TEXTURE_CUBE_MAP_ARB, pTexUnit->currentTextureCubeMap->hwid);
c62d2520ac91e12cf4665c936f490dd2064152d3vboxsync diff_api.BindTexture(GL_TEXTURE_RECTANGLE_NV, pTexUnit->currentTextureRect->hwid);
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 */
c62d2520ac91e12cf4665c936f490dd2064152d3vboxsync ui32 = bSaveShared? crHashtableNumElements(pContext->shared->buffersTable):0;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* Save default one*/
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crStateSaveBufferObjectCB(0, pContext->bufferobject.nullBuffer, pSSM);
c62d2520ac91e12cf4665c936f490dd2064152d3vboxsync /* Save all the rest */
c62d2520ac91e12cf4665c936f490dd2064152d3vboxsync crHashtableWalk(pContext->shared->buffersTable, crStateSaveBufferObjectCB, pSSM);
bf144aab354eaec8ee22b16b1c138f47f38b7244vboxsync /* Restore binding */
c62d2520ac91e12cf4665c936f490dd2064152d3vboxsync diff_api.BindBufferARB(GL_ARRAY_BUFFER_ARB, pContext->bufferobject.arrayBuffer->hwid);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* Save pointers */
c62d2520ac91e12cf4665c936f490dd2064152d3vboxsync rc = SSMR3PutU32(pSSM, pContext->bufferobject.arrayBuffer->id);
c62d2520ac91e12cf4665c936f490dd2064152d3vboxsync rc = SSMR3PutU32(pSSM, pContext->bufferobject.elementsBuffer->id);
c62d2520ac91e12cf4665c936f490dd2064152d3vboxsync rc = SSMR3PutU32(pSSM, pContext->bufferobject.packBuffer->id);
c62d2520ac91e12cf4665c936f490dd2064152d3vboxsync rc = SSMR3PutU32(pSSM, pContext->bufferobject.unpackBuffer->id);
e42c49edebbc79edb6d87377bab6d879fdb602favboxsync /* Save clint pointers and buffer bindings*/
e42c49edebbc79edb6d87377bab6d879fdb602favboxsync rc = crStateSaveClientPointer(&pContext->client.array, i, pSSM);
e42c49edebbc79edb6d87377bab6d879fdb602favboxsync crDebug("client.vertexArrayStackDepth %i", pContext->client.vertexArrayStackDepth);
e42c49edebbc79edb6d87377bab6d879fdb602favboxsync for (i=0; i<pContext->client.vertexArrayStackDepth; ++i)
e42c49edebbc79edb6d87377bab6d879fdb602favboxsync CRVertexArrays *pArray = &pContext->client.vertexArrayStack[i];
bf144aab354eaec8ee22b16b1c138f47f38b7244vboxsync#endif /*CR_ARB_vertex_buffer_object*/
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* Save pixel/vertex programs */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync ui32 = crHashtableNumElements(pContext->program.programHash);
ad27e1d5e48ca41245120c331cc88b50464813cevboxsync /* Save defaults 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*/
bd810d58866067df322ea7f4a4627d9bdebb70d3vboxsync /* Save FBOs */
c62d2520ac91e12cf4665c936f490dd2064152d3vboxsync ui32 = crHashtableNumElements(pContext->shared->fbTable);
c62d2520ac91e12cf4665c936f490dd2064152d3vboxsync crHashtableWalk(pContext->shared->fbTable, crStateSaveFramebuffersCB, pSSM);
c62d2520ac91e12cf4665c936f490dd2064152d3vboxsync ui32 = crHashtableNumElements(pContext->shared->rbTable);
c62d2520ac91e12cf4665c936f490dd2064152d3vboxsync crHashtableWalk(pContext->shared->rbTable, crStateSaveRenderbuffersCB, pSSM);
061bebe04c5bfa05ed733d2a1204389c2a0c96a8vboxsync rc = SSMR3PutU32(pSSM, pContext->framebufferobject.drawFB?pContext->framebufferobject.drawFB->id:0);
061bebe04c5bfa05ed733d2a1204389c2a0c96a8vboxsync rc = SSMR3PutU32(pSSM, pContext->framebufferobject.readFB?pContext->framebufferobject.readFB->id:0);
bd810d58866067df322ea7f4a4627d9bdebb70d3vboxsync rc = SSMR3PutU32(pSSM, pContext->framebufferobject.renderbuffer?pContext->framebufferobject.renderbuffer->id:0);
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync /* Save GLSL related info */
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync ui32 = crHashtableNumElements(pContext->glsl.shaders);
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync crHashtableWalk(pContext->glsl.shaders, crStateSaveGLSLShaderCB, pSSM);
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync ui32 = crHashtableNumElements(pContext->glsl.programs);
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync crHashtableWalk(pContext->glsl.programs, crStateSaveGLSLProgramCB, pSSM);
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync rc = SSMR3PutU32(pSSM, pContext->glsl.activeProgram?pContext->glsl.activeProgram->id:0);
c62d2520ac91e12cf4665c936f490dd2064152d3vboxsyncstatic void crStateFindSharedCB(unsigned long key, void *data1, void *data2)
c62d2520ac91e12cf4665c936f490dd2064152d3vboxsync crFindSharedCtxParms_t *pParms = (crFindSharedCtxParms_t *) data2;
c62d2520ac91e12cf4665c936f490dd2064152d3vboxsync if (pContext!=pParms->pSrcCtx && pContext->shared->id==pParms->pSrcCtx->shared->id)
e85b92d4df013df97a72864a412eb94eb3f70acevboxsyncint32_t crStateLoadGlobals(PSSMHANDLE pSSM, uint32_t u32Version)
e85b92d4df013df97a72864a412eb94eb3f70acevboxsync if (u32Version >= SHCROGL_SSM_VERSION_WITH_STATE_BITS)
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync if (u32Version < SHCROGL_SSM_VERSION_WITH_FIXED_STENCIL)
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync#define CRSTATE_BITS_OP_VERSION (SHCROGL_SSM_VERSION_WITH_FIXED_STENCIL - 1)
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync#define CRSTATE_BITS_OP_STENCIL_FUNC_V_33(_i, _var) do {} while (0)
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync#define CRSTATE_BITS_OP_STENCIL_OP_V_33(_i, _var) do {} while (0)
e85b92d4df013df97a72864a412eb94eb3f70acevboxsync#define CRSTATE_BITS_OP(_var, _size) FILLDIRTY(pBits->_var);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#define SLC_COPYPTR(ptr) pTmpContext->ptr = pContext->ptr
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#define SLC_ASSSERT_NULL_PTR(ptr) CRASSERT(!pContext->ptr)
ca2d9a827c7e0bf938937debeb7e98e9be1edd86vboxsyncAssertCompile(VBOXTLSREFDATA_SIZE() <= CR_MAX_BITARRAY);
ca2d9a827c7e0bf938937debeb7e98e9be1edd86vboxsyncAssertCompile(VBOXTLSREFDATA_STATE_INITIALIZED != 0);
ca2d9a827c7e0bf938937debeb7e98e9be1edd86vboxsyncAssertCompile(RT_OFFSETOF(CRContext, shared) >= VBOXTLSREFDATA_OFFSET(CRContext) + VBOXTLSREFDATA_SIZE() + RT_SIZEOFMEMB(CRContext, bitid) + RT_SIZEOFMEMB(CRContext, neg_bitid));
b862944342504d1b9dddd6348d1a9048c72ba418vboxsyncint32_t crStateLoadContext(CRContext *pContext, CRHashTable * pCtxTable, PFNCRSTATE_CONTEXT_GET pfnCtxGet, PSSMHANDLE pSSM, uint32_t u32Version)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync unsigned long key;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* This one is rather big for stack allocation and causes macs to crash */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync pTmpContext = (CRContext*)crAlloc(sizeof(*pTmpContext));
4e9f070a55a9ab37758f11adff5ca15d0498bcffvboxsync if (u32Version <= SHCROGL_SSM_VERSION_WITH_INVALID_ERROR_STATE)
4e9f070a55a9ab37758f11adff5ca15d0498bcffvboxsync /* do not increment the saved state version due to VBOXTLSREFDATA addition to CRContext */
4e9f070a55a9ab37758f11adff5ca15d0498bcffvboxsync rc = SSMR3GetMem(pSSM, pTmpContext, VBOXTLSREFDATA_OFFSET(CRContext));
4e9f070a55a9ab37758f11adff5ca15d0498bcffvboxsync /* VBox 4.1.8 had a bug that VBOXTLSREFDATA was also stored in the snapshot,
4e9f070a55a9ab37758f11adff5ca15d0498bcffvboxsync * thus the saved state data format was changed w/o changing the saved state version.
4e9f070a55a9ab37758f11adff5ca15d0498bcffvboxsync * here we determine whether the saved state contains VBOXTLSREFDATA, and if so, treat it accordingly */
4e9f070a55a9ab37758f11adff5ca15d0498bcffvboxsync /* the bitid array has one bit set only. this is why if bitid.tlsRef has both cTlsRefs
4e9f070a55a9ab37758f11adff5ca15d0498bcffvboxsync * and enmTlsRefState non-zero - this is definitely NOT a bit id and is a VBOXTLSREFDATA */
4e9f070a55a9ab37758f11adff5ca15d0498bcffvboxsync if (bitid.tlsRef.enmTlsRefState == VBOXTLSREFDATA_STATE_INITIALIZED
4e9f070a55a9ab37758f11adff5ca15d0498bcffvboxsync /* VBOXTLSREFDATA is stored, skip it */
4e9f070a55a9ab37758f11adff5ca15d0498bcffvboxsync crMemcpy(&pTmpContext->bitid, ((uint8_t*)&bitid) + VBOXTLSREFDATA_SIZE(), sizeof (bitid) - VBOXTLSREFDATA_SIZE());
4e9f070a55a9ab37758f11adff5ca15d0498bcffvboxsync rc = SSMR3GetMem(pSSM, ((uint8_t*)&pTmpContext->bitid) + sizeof (pTmpContext->bitid) - VBOXTLSREFDATA_SIZE(), sizeof (pTmpContext->neg_bitid) + VBOXTLSREFDATA_SIZE());
4e9f070a55a9ab37758f11adff5ca15d0498bcffvboxsync ui = VBOXTLSREFDATA_OFFSET(CRContext) + VBOXTLSREFDATA_SIZE() + sizeof (pTmpContext->bitid) + sizeof (pTmpContext->neg_bitid);
4e9f070a55a9ab37758f11adff5ca15d0498bcffvboxsync /* VBOXTLSREFDATA is NOT stored */
4e9f070a55a9ab37758f11adff5ca15d0498bcffvboxsync crMemcpy(&pTmpContext->bitid, &bitid, sizeof (bitid));
4e9f070a55a9ab37758f11adff5ca15d0498bcffvboxsync rc = SSMR3GetMem(pSSM, &pTmpContext->neg_bitid, sizeof (pTmpContext->neg_bitid));
4e9f070a55a9ab37758f11adff5ca15d0498bcffvboxsync /* the pre-VBOXTLSREFDATA CRContext structure might have additional allignment bits before the CRContext::shared */
4e9f070a55a9ab37758f11adff5ca15d0498bcffvboxsync ui = VBOXTLSREFDATA_OFFSET(CRContext) + sizeof (pTmpContext->bitid) + sizeof (pTmpContext->neg_bitid);
4e9f070a55a9ab37758f11adff5ca15d0498bcffvboxsync if (u32Version == SHCROGL_SSM_VERSION_BEFORE_CTXUSAGE_BITS)
4e9f070a55a9ab37758f11adff5ca15d0498bcffvboxsync SHCROGL_GET_STRUCT_PART(pTmpContext, CRContext, shared, attrib);
4e9f070a55a9ab37758f11adff5ca15d0498bcffvboxsync rc = crStateLoadAttribState_v_BEFORE_CTXUSAGE_BITS(&pTmpContext->attrib, pSSM);
4e9f070a55a9ab37758f11adff5ca15d0498bcffvboxsync SHCROGL_CUT_FIELD_ALIGNMENT(CRContext, attrib, buffer);
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync SHCROGL_GET_STRUCT_PART(pTmpContext, CRContext, buffer, stencil);
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync rc = crStateLoadStencilState_v_33(&pTmpContext->stencil, pSSM);
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync SHCROGL_CUT_FOR_OLD_TYPE_TO_ENSURE_ALIGNMENT(CRContext, stencil, CRStencilState_v_33, sizeof (void*));
4e9f070a55a9ab37758f11adff5ca15d0498bcffvboxsync rc = crStateLoadTextureState_v_BEFORE_CTXUSAGE_BITS(&pTmpContext->texture, pSSM);
4e9f070a55a9ab37758f11adff5ca15d0498bcffvboxsync SHCROGL_CUT_FIELD_ALIGNMENT(CRContext, texture, transform);
4e9f070a55a9ab37758f11adff5ca15d0498bcffvboxsync SHCROGL_GET_STRUCT_TAIL(pTmpContext, CRContext, transform);
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync SHCROGL_GET_STRUCT_PART(pTmpContext, CRContext, shared, attrib);
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync rc = crStateLoadAttribState_v_33(&pTmpContext->attrib, pSSM);
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync SHCROGL_CUT_FIELD_ALIGNMENT(CRContext, attrib, buffer);
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync SHCROGL_GET_STRUCT_PART(pTmpContext, CRContext, buffer, stencil);
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync rc = crStateLoadStencilState_v_33(&pTmpContext->stencil, pSSM);
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync SHCROGL_CUT_FOR_OLD_TYPE_TO_ENSURE_ALIGNMENT(CRContext, stencil, CRStencilState_v_33, sizeof (void*));
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync SHCROGL_GET_STRUCT_TAIL(pTmpContext, CRContext, texture);
4e9f070a55a9ab37758f11adff5ca15d0498bcffvboxsync pTmpContext->error = GL_NO_ERROR; /* <- the error state contained some random error data here
4e9f070a55a9ab37758f11adff5ca15d0498bcffvboxsync * treat as no error */
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync else if (u32Version < SHCROGL_SSM_VERSION_WITH_FIXED_STENCIL)
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync SHCROGL_GET_STRUCT_HEAD(pTmpContext, CRContext, attrib);
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync rc = crStateLoadAttribState_v_33(&pTmpContext->attrib, pSSM);
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync SHCROGL_CUT_FIELD_ALIGNMENT(CRContext, attrib, buffer);
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync SHCROGL_GET_STRUCT_PART(pTmpContext, CRContext, buffer, stencil);
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync rc = crStateLoadStencilState_v_33(&pTmpContext->stencil, pSSM);
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync SHCROGL_CUT_FOR_OLD_TYPE_TO_ENSURE_ALIGNMENT(CRContext, stencil, CRStencilState_v_33, sizeof (void*));
79664e45c3d7123821dcd5de01991c6de96b8794vboxsync SHCROGL_GET_STRUCT_TAIL(pTmpContext, CRContext, texture);
4e9f070a55a9ab37758f11adff5ca15d0498bcffvboxsync rc = SSMR3GetMem(pSSM, pTmpContext, sizeof (*pTmpContext));
4e9f070a55a9ab37758f11adff5ca15d0498bcffvboxsync /* preserve the error to restore it at the end of context creation,
4e9f070a55a9ab37758f11adff5ca15d0498bcffvboxsync * it should not normally change, but just in case it it changed */
ca2d9a827c7e0bf938937debeb7e98e9be1edd86vboxsync /* we will later do crMemcpy from entire pTmpContext to pContext,
ca2d9a827c7e0bf938937debeb7e98e9be1edd86vboxsync * for simplicity store the VBOXTLSREFDATA from the pContext to pTmpContext */
c62d2520ac91e12cf4665c936f490dd2064152d3vboxsync /* Deal with shared state */
c62d2520ac91e12cf4665c936f490dd2064152d3vboxsync crHashtableWalk(pCtxTable, crStateFindSharedCB, &parms);
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);
bf144aab354eaec8ee22b16b1c138f47f38b7244vboxsync/*@todo, that should be removed probably as those should hold the offset values, so loading should be fine
bf144aab354eaec8ee22b16b1c138f47f38b7244vboxsync but better check*/
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync for (i = 0 ; i < CR_MAX_TEXTURE_UNITS ; i++)
bf144aab354eaec8ee22b16b1c138f47f38b7244vboxsync for (i = 0; i < CR_MAX_VERTEX_ATTRIBS; i++)
bf144aab354eaec8ee22b16b1c138f47f38b7244vboxsync /*That just sets those pointers to NULL*/
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync for (i = 0 ; i < CR_MAX_TEXTURE_UNITS ; i++)
bf144aab354eaec8ee22b16b1c138f47f38b7244vboxsync for (i = 0; i < CR_MAX_VERTEX_ATTRIBS; i++)
bf144aab354eaec8ee22b16b1c138f47f38b7244vboxsync#endif /*CR_ARB_vertex_buffer_object*/
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 */
ca2d9a827c7e0bf938937debeb7e98e9be1edd86vboxsync CRASSERT(VBOXTLSREFDATA_EQUAL(pContext, pTmpContext));
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);
c62d2520ac91e12cf4665c936f490dd2064152d3vboxsync /* Load shared textures */
c62d2520ac91e12cf4665c936f490dd2064152d3vboxsync CRASSERT(pContext->shared && pContext->shared->textureTable);
c62d2520ac91e12cf4665c936f490dd2064152d3vboxsync pTexture = (CRTextureObj *) crCalloc(sizeof(CRTextureObj));
b862944342504d1b9dddd6348d1a9048c72ba418vboxsync rc = crStateLoadTextureObj(pTexture, pSSM, u32Version);
c62d2520ac91e12cf4665c936f490dd2064152d3vboxsync /*allocate actual memory*/
c62d2520ac91e12cf4665c936f490dd2064152d3vboxsync for (i=0; i<6; ++i) {
c62d2520ac91e12cf4665c936f490dd2064152d3vboxsync pTexture->level[i] = (CRTextureLevel *) crCalloc(sizeof(CRTextureLevel) * CR_MAX_MIPMAP_LEVELS);
c62d2520ac91e12cf4665c936f490dd2064152d3vboxsync 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 /* 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));
b862944342504d1b9dddd6348d1a9048c72ba418vboxsync rc = crStateLoadBufferObject(pBufferObj, pSSM, u32Version);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync rc = SSMR3GetMem(pSSM, pBufferObj->data, pBufferObj->size);
bf144aab354eaec8ee22b16b1c138f47f38b7244vboxsync rc = SSMR3GetMem(pSSM, &pBufferObj->data, sizeof(pBufferObj->data));
bf144aab354eaec8ee22b16b1c138f47f38b7244vboxsync rc = SSMR3GetMem(pSSM, pBufferObj->data, pBufferObj->size);
c62d2520ac91e12cf4665c936f490dd2064152d3vboxsync crHashtableAdd(pContext->shared->buffersTable, key, pBufferObj);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* Load pointers */
c62d2520ac91e12cf4665c936f490dd2064152d3vboxsync#define CRS_GET_BO(name) (((name)==0) ? (pContext->bufferobject.nullBuffer) : crHashtableSearch(pContext->shared->buffersTable, name))
bf144aab354eaec8ee22b16b1c138f47f38b7244vboxsync pContext->bufferobject.arrayBuffer = CRS_GET_BO(ui);
bf144aab354eaec8ee22b16b1c138f47f38b7244vboxsync pContext->bufferobject.elementsBuffer = CRS_GET_BO(ui);
af8d59d05d72f134aeea62712f1286b369807d52vboxsync pContext->bufferobject.packBuffer = CRS_GET_BO(ui);
af8d59d05d72f134aeea62712f1286b369807d52vboxsync pContext->bufferobject.unpackBuffer = CRS_GET_BO(ui);
e42c49edebbc79edb6d87377bab6d879fdb602favboxsync /* Load client pointers and array buffer bindings*/
e42c49edebbc79edb6d87377bab6d879fdb602favboxsync rc = crStateLoadClientPointer(&pContext->client.array, i, pContext, pSSM);
e42c49edebbc79edb6d87377bab6d879fdb602favboxsync for (j=0; j<pContext->client.vertexArrayStackDepth; ++j)
e42c49edebbc79edb6d87377bab6d879fdb602favboxsync CRVertexArrays *pArray = &pContext->client.vertexArrayStack[j];
e42c49edebbc79edb6d87377bab6d879fdb602favboxsync rc = crStateLoadClientPointer(pArray, i, pContext, pSSM);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* Load pixel/vertex programs */
ad27e1d5e48ca41245120c331cc88b50464813cevboxsync /* Load defaults programs */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync rc = crStateLoadProgram(&pContext->program.defaultVertexProgram, pSSM);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync rc = crStateLoadProgram(&pContext->program.defaultFragmentProgram, pSSM);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* Load all the rest */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crHashtableAdd(pContext->program.programHash, pProgram->id, pProgram);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync //DIRTY(pProgram->dirtyProgram, pContext->neg_bitid);
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 */
bd810d58866067df322ea7f4a4627d9bdebb70d3vboxsync /* Load FBOs */
b862944342504d1b9dddd6348d1a9048c72ba418vboxsync rc = crStateLoadFramebufferObject(pFBO, pSSM, u32Version);
c62d2520ac91e12cf4665c936f490dd2064152d3vboxsync crHashtableAdd(pContext->shared->fbTable, key, pFBO);
b862944342504d1b9dddd6348d1a9048c72ba418vboxsync rc = crStateLoadRenderbufferObject(pRBO, pSSM, u32Version);
c62d2520ac91e12cf4665c936f490dd2064152d3vboxsync crHashtableAdd(pContext->shared->rbTable, key, pRBO);
c62d2520ac91e12cf4665c936f490dd2064152d3vboxsync : crHashtableSearch(pContext->shared->fbTable, ui);
c62d2520ac91e12cf4665c936f490dd2064152d3vboxsync : crHashtableSearch(pContext->shared->fbTable, ui);
bd810d58866067df322ea7f4a4627d9bdebb70d3vboxsync pContext->framebufferobject.renderbuffer = ui==0 ? NULL
c62d2520ac91e12cf4665c936f490dd2064152d3vboxsync : crHashtableSearch(pContext->shared->rbTable, ui);
bd810d58866067df322ea7f4a4627d9bdebb70d3vboxsync /* Mark FBOs/RBOs for resending to GPU */
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync /* Load GLSL related info */
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync CRGLSLShader *pShader = crStateLoadGLSLShader(pSSM);
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync crHashtableAdd(pContext->glsl.shaders, pShader->id, pShader);
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync rc = SSMR3GetMem(pSSM, pProgram, sizeof(*pProgram));
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync crHashtableAdd(pContext->glsl.programs, key, pProgram);
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync pProgram->currentState.attachedShaders = crAllocHashtable();
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync for (k=0; k<numShaders; ++k)
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync crHashtableAdd(pProgram->currentState.attachedShaders, key, crHashtableSearch(pContext->glsl.shaders, key));
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync pProgram->activeState.attachedShaders = crAllocHashtable();
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync for (k=0; k<numShaders; ++k)
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync CRGLSLShader *pShader = crStateLoadGLSLShader(pSSM);
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync crHashtableAdd(pProgram->activeState.attachedShaders, pShader->id, pShader);
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync pProgram->currentState.pAttribs = (CRGLSLAttrib*) crAlloc(pProgram->currentState.cAttribs*sizeof(CRGLSLAttrib));
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync rc = SSMR3GetMem(pSSM, &pProgram->currentState.pAttribs[k].index, sizeof(pProgram->currentState.pAttribs[k].index));
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync pProgram->currentState.pAttribs[k].name = crStateLoadString(pSSM);
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync pProgram->activeState.pAttribs = (CRGLSLAttrib*) crAlloc(pProgram->activeState.cAttribs*sizeof(CRGLSLAttrib));
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync rc = SSMR3GetMem(pSSM, &pProgram->activeState.pAttribs[k].index, sizeof(pProgram->activeState.pAttribs[k].index));
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync pProgram->activeState.pAttribs[k].name = crStateLoadString(pSSM);
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync pProgram->pUniforms = crAlloc(pProgram->cUniforms*sizeof(CRGLSLUniform));
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync rc = SSMR3GetMem(pSSM, &pProgram->pUniforms[k].type, sizeof(GLenum));
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync pProgram->pUniforms[k].name = crStateLoadString(pSSM);
c697d02eb4ededad7e08b2c48428ddb56c844a0avboxsync if (crStateIsIntUniform(pProgram->pUniforms[k].type))
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync datasize = crStateGetUniformSize(pProgram->pUniforms[k].type)*itemsize;
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync if (!pProgram->pUniforms[k].data) return VERR_NO_MEMORY;
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync rc = SSMR3GetMem(pSSM, pProgram->pUniforms[k].data, datasize);
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync /*Mark for resending to GPU*/
4e9f070a55a9ab37758f11adff5ca15d0498bcffvboxsync crWarning("context error state changed on context restore, was 0x%x, but became 0x%x, resetting to its original value",