state_snapshot.c revision 1949f98957df74949c101f6f2c97f5f7de38144a
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync/* $Id$ */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync/** @file
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * VBox Context state saving/loading used by VM snapshot
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync/*
e64031e20c39650a7bc902a3e1aba613b9415deevboxsync * Copyright (C) 2008 Oracle Corporation
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync *
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 */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#include "state.h"
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync#include "state_internals.h"
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#include "state/cr_statetypes.h"
0bebd3a2671042901f1fcceff14f8c58dd397478vboxsync#include "state/cr_texture.h"
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#include "cr_mem.h"
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync#include "cr_string.h"
f11a163be74ca22a873fc5437f7e2cbf6ab7a564vboxsync#include "cr_pixeldata.h"
c697d02eb4ededad7e08b2c48428ddb56c844a0avboxsync#include <stdio.h>
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#include <iprt/assert.h>
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#include <iprt/types.h>
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#include <iprt/err.h>
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#include <VBox/err.h>
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync/* @todo
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * We have two ways of saving/loading states.
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync *
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 *
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 */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncstatic int32_t crStateAllocAndSSMR3GetMem(PSSMHANDLE pSSM, void **pBuffer, size_t cbBuffer)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync{
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRASSERT(pSSM && pBuffer && cbBuffer>0);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync *pBuffer = crAlloc(cbBuffer);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (!*pBuffer)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync return VERR_NO_MEMORY;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync return SSMR3GetMem(pSSM, *pBuffer, cbBuffer);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync}
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncstatic int32_t crStateSaveTextureObjData(CRTextureObj *pTexture, PSSMHANDLE pSSM)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync{
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync int32_t rc, face, i;
51e7ffc68ae0a6122fcfdc746905b6c7dae2c610vboxsync GLboolean bound = GL_FALSE;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRASSERT(pTexture && pSSM);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
c62d2520ac91e12cf4665c936f490dd2064152d3vboxsync crDebug("crStateSaveTextureObjData %u. START", pTexture->id);
51e7ffc68ae0a6122fcfdc746905b6c7dae2c610vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync for (face = 0; face < 6; face++) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRASSERT(pTexture->level[face]);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
51e7ffc68ae0a6122fcfdc746905b6c7dae2c610vboxsync for (i = 0; i < CR_MAX_MIPMAP_LEVELS; i++) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRTextureLevel *ptl = &(pTexture->level[face][i]);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync rc = SSMR3PutMem(pSSM, ptl, sizeof(*ptl));
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync AssertRCReturn(rc, rc);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (ptl->img)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRASSERT(ptl->bytes);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync rc = SSMR3PutMem(pSSM, ptl->img, ptl->bytes);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync AssertRCReturn(rc, rc);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
0bebd3a2671042901f1fcceff14f8c58dd397478vboxsync#ifdef CR_STATE_NO_TEXTURE_IMAGE_STORE
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 */
0bebd3a2671042901f1fcceff14f8c58dd397478vboxsync else if (ptl->bytes)
0bebd3a2671042901f1fcceff14f8c58dd397478vboxsync {
0bebd3a2671042901f1fcceff14f8c58dd397478vboxsync char *pImg;
51e7ffc68ae0a6122fcfdc746905b6c7dae2c610vboxsync GLenum target;
51e7ffc68ae0a6122fcfdc746905b6c7dae2c610vboxsync
51e7ffc68ae0a6122fcfdc746905b6c7dae2c610vboxsync if (!bound)
51e7ffc68ae0a6122fcfdc746905b6c7dae2c610vboxsync {
c62d2520ac91e12cf4665c936f490dd2064152d3vboxsync diff_api.BindTexture(pTexture->target, pTexture->hwid);
51e7ffc68ae0a6122fcfdc746905b6c7dae2c610vboxsync bound = GL_TRUE;
51e7ffc68ae0a6122fcfdc746905b6c7dae2c610vboxsync }
51e7ffc68ae0a6122fcfdc746905b6c7dae2c610vboxsync
51e7ffc68ae0a6122fcfdc746905b6c7dae2c610vboxsync if (pTexture->target!=GL_TEXTURE_CUBE_MAP_ARB)
51e7ffc68ae0a6122fcfdc746905b6c7dae2c610vboxsync {
51e7ffc68ae0a6122fcfdc746905b6c7dae2c610vboxsync target = pTexture->target;
51e7ffc68ae0a6122fcfdc746905b6c7dae2c610vboxsync }
51e7ffc68ae0a6122fcfdc746905b6c7dae2c610vboxsync else
51e7ffc68ae0a6122fcfdc746905b6c7dae2c610vboxsync {
51e7ffc68ae0a6122fcfdc746905b6c7dae2c610vboxsync target = GL_TEXTURE_CUBE_MAP_POSITIVE_X + face;
51e7ffc68ae0a6122fcfdc746905b6c7dae2c610vboxsync }
0bebd3a2671042901f1fcceff14f8c58dd397478vboxsync
51e7ffc68ae0a6122fcfdc746905b6c7dae2c610vboxsync#ifdef DEBUG
51e7ffc68ae0a6122fcfdc746905b6c7dae2c610vboxsync pImg = crAlloc(ptl->bytes+4);
51e7ffc68ae0a6122fcfdc746905b6c7dae2c610vboxsync#else
0bebd3a2671042901f1fcceff14f8c58dd397478vboxsync pImg = crAlloc(ptl->bytes);
51e7ffc68ae0a6122fcfdc746905b6c7dae2c610vboxsync#endif
0bebd3a2671042901f1fcceff14f8c58dd397478vboxsync if (!pImg) return VERR_NO_MEMORY;
0bebd3a2671042901f1fcceff14f8c58dd397478vboxsync
51e7ffc68ae0a6122fcfdc746905b6c7dae2c610vboxsync#ifdef DEBUG
51e7ffc68ae0a6122fcfdc746905b6c7dae2c610vboxsync {
51e7ffc68ae0a6122fcfdc746905b6c7dae2c610vboxsync GLint w,h=0;
51e7ffc68ae0a6122fcfdc746905b6c7dae2c610vboxsync *(int*)((char*)pImg+ptl->bytes) = 0xDEADDEAD;
51e7ffc68ae0a6122fcfdc746905b6c7dae2c610vboxsync crDebug("get image: compressed %i, face %i, level %i, width %i, height %i, bytes %i",
51e7ffc68ae0a6122fcfdc746905b6c7dae2c610vboxsync ptl->compressed, face, i, ptl->width, ptl->height, ptl->bytes);
51e7ffc68ae0a6122fcfdc746905b6c7dae2c610vboxsync diff_api.GetTexLevelParameteriv(target, i, GL_TEXTURE_WIDTH, &w);
51e7ffc68ae0a6122fcfdc746905b6c7dae2c610vboxsync diff_api.GetTexLevelParameteriv(target, i, GL_TEXTURE_HEIGHT, &h);
51e7ffc68ae0a6122fcfdc746905b6c7dae2c610vboxsync if (w!=ptl->width || h!=ptl->height)
51e7ffc68ae0a6122fcfdc746905b6c7dae2c610vboxsync {
51e7ffc68ae0a6122fcfdc746905b6c7dae2c610vboxsync crWarning("!!!tex size mismatch %i, %i!!!", w, h);
51e7ffc68ae0a6122fcfdc746905b6c7dae2c610vboxsync }
51e7ffc68ae0a6122fcfdc746905b6c7dae2c610vboxsync }
51e7ffc68ae0a6122fcfdc746905b6c7dae2c610vboxsync#endif
51e7ffc68ae0a6122fcfdc746905b6c7dae2c610vboxsync
51e7ffc68ae0a6122fcfdc746905b6c7dae2c610vboxsync /*@todo: ugly workaround for crashes inside ati driver,
51e7ffc68ae0a6122fcfdc746905b6c7dae2c610vboxsync * they overwrite their own allocated memory in cases where texlevel >=4
51e7ffc68ae0a6122fcfdc746905b6c7dae2c610vboxsync and width or height <=2.
51e7ffc68ae0a6122fcfdc746905b6c7dae2c610vboxsync */
51e7ffc68ae0a6122fcfdc746905b6c7dae2c610vboxsync if (i<4 || (ptl->width>2 && ptl->height>2))
56602ba12f2388501d594c83fbbf77b4b16f8f4fvboxsync {
51e7ffc68ae0a6122fcfdc746905b6c7dae2c610vboxsync if (!ptl->compressed)
51e7ffc68ae0a6122fcfdc746905b6c7dae2c610vboxsync {
51e7ffc68ae0a6122fcfdc746905b6c7dae2c610vboxsync diff_api.GetTexImage(target, i, ptl->format, ptl->type, pImg);
51e7ffc68ae0a6122fcfdc746905b6c7dae2c610vboxsync }
51e7ffc68ae0a6122fcfdc746905b6c7dae2c610vboxsync else
51e7ffc68ae0a6122fcfdc746905b6c7dae2c610vboxsync {
51e7ffc68ae0a6122fcfdc746905b6c7dae2c610vboxsync diff_api.GetCompressedTexImageARB(target, i, pImg);
51e7ffc68ae0a6122fcfdc746905b6c7dae2c610vboxsync }
56602ba12f2388501d594c83fbbf77b4b16f8f4fvboxsync }
51e7ffc68ae0a6122fcfdc746905b6c7dae2c610vboxsync
51e7ffc68ae0a6122fcfdc746905b6c7dae2c610vboxsync#ifdef DEBUG
51e7ffc68ae0a6122fcfdc746905b6c7dae2c610vboxsync if (*(int*)((char*)pImg+ptl->bytes) != 0xDEADDEAD)
51e7ffc68ae0a6122fcfdc746905b6c7dae2c610vboxsync {
51e7ffc68ae0a6122fcfdc746905b6c7dae2c610vboxsync crWarning("Texture is bigger than expected!!!");
51e7ffc68ae0a6122fcfdc746905b6c7dae2c610vboxsync }
51e7ffc68ae0a6122fcfdc746905b6c7dae2c610vboxsync#endif
0bebd3a2671042901f1fcceff14f8c58dd397478vboxsync
0bebd3a2671042901f1fcceff14f8c58dd397478vboxsync rc = SSMR3PutMem(pSSM, pImg, ptl->bytes);
0bebd3a2671042901f1fcceff14f8c58dd397478vboxsync crFree(pImg);
0bebd3a2671042901f1fcceff14f8c58dd397478vboxsync AssertRCReturn(rc, rc);
0bebd3a2671042901f1fcceff14f8c58dd397478vboxsync }
0bebd3a2671042901f1fcceff14f8c58dd397478vboxsync#endif
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
c62d2520ac91e12cf4665c936f490dd2064152d3vboxsync crDebug("crStateSaveTextureObjData %u. END", pTexture->id);
51e7ffc68ae0a6122fcfdc746905b6c7dae2c610vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync return VINF_SUCCESS;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync}
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncstatic int32_t crStateLoadTextureObjData(CRTextureObj *pTexture, PSSMHANDLE pSSM)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync{
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync int32_t rc, face, i;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRASSERT(pTexture && pSSM);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync for (face = 0; face < 6; face++) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRASSERT(pTexture->level[face]);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
51e7ffc68ae0a6122fcfdc746905b6c7dae2c610vboxsync for (i = 0; i < CR_MAX_MIPMAP_LEVELS; i++) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRTextureLevel *ptl = &(pTexture->level[face][i]);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRASSERT(!ptl->img);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync rc = SSMR3GetMem(pSSM, ptl, sizeof(*ptl));
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync AssertRCReturn(rc, rc);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (ptl->img)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRASSERT(ptl->bytes);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync ptl->img = crAlloc(ptl->bytes);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (!ptl->img) return VERR_NO_MEMORY;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync rc = SSMR3GetMem(pSSM, ptl->img, ptl->bytes);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync AssertRCReturn(rc, rc);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
0bebd3a2671042901f1fcceff14f8c58dd397478vboxsync#ifdef CR_STATE_NO_TEXTURE_IMAGE_STORE
0bebd3a2671042901f1fcceff14f8c58dd397478vboxsync /* Same story as in crStateSaveTextureObjData */
0bebd3a2671042901f1fcceff14f8c58dd397478vboxsync else if (ptl->bytes)
0bebd3a2671042901f1fcceff14f8c58dd397478vboxsync {
0bebd3a2671042901f1fcceff14f8c58dd397478vboxsync ptl->img = crAlloc(ptl->bytes);
0bebd3a2671042901f1fcceff14f8c58dd397478vboxsync if (!ptl->img) return VERR_NO_MEMORY;
0bebd3a2671042901f1fcceff14f8c58dd397478vboxsync
0bebd3a2671042901f1fcceff14f8c58dd397478vboxsync rc = SSMR3GetMem(pSSM, ptl->img, ptl->bytes);
0bebd3a2671042901f1fcceff14f8c58dd397478vboxsync AssertRCReturn(rc, rc);
0bebd3a2671042901f1fcceff14f8c58dd397478vboxsync }
0bebd3a2671042901f1fcceff14f8c58dd397478vboxsync#endif
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crStateTextureInitTextureFormat(ptl, ptl->internalFormat);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync return VINF_SUCCESS;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync}
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncstatic void crStateSaveSharedTextureCB(unsigned long key, void *data1, void *data2)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync{
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRTextureObj *pTexture = (CRTextureObj *) data1;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync PSSMHANDLE pSSM = (PSSMHANDLE) data2;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync int32_t rc;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRASSERT(pTexture && pSSM);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync rc = SSMR3PutMem(pSSM, &key, sizeof(key));
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRASSERT(rc == VINF_SUCCESS);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync rc = SSMR3PutMem(pSSM, pTexture, sizeof(*pTexture));
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRASSERT(rc == VINF_SUCCESS);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync rc = crStateSaveTextureObjData(pTexture, pSSM);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRASSERT(rc == VINF_SUCCESS);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync}
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncstatic int32_t crStateSaveMatrixStack(CRMatrixStack *pStack, PSSMHANDLE pSSM)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync{
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync return SSMR3PutMem(pSSM, pStack->stack, sizeof(CRmatrix) * pStack->maxDepth);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync}
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncstatic int32_t crStateLoadMatrixStack(CRMatrixStack *pStack, PSSMHANDLE pSSM)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync{
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync int32_t rc;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRASSERT(pStack && pSSM);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync rc = SSMR3GetMem(pSSM, pStack->stack, sizeof(CRmatrix) * pStack->maxDepth);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* fixup stack top pointer */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync pStack->top = &pStack->stack[pStack->depth];
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync return rc;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync}
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncstatic int32_t crStateSaveTextureObjPtr(CRTextureObj *pTexture, PSSMHANDLE pSSM)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync{
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* Current texture pointer can't be NULL for real texture unit states,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * but it could be NULL for unused attribute stack depths.
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (pTexture)
c62d2520ac91e12cf4665c936f490dd2064152d3vboxsync return SSMR3PutU32(pSSM, pTexture->id);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync else
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync return VINF_SUCCESS;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync}
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncstatic int32_t crStateLoadTextureObjPtr(CRTextureObj **pTexture, CRContext *pContext, GLenum target, PSSMHANDLE pSSM)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync{
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync uint32_t texName;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync int32_t rc;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* We're loading attrib stack with unused state */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (!*pTexture)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync return VINF_SUCCESS;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync rc = SSMR3GetU32(pSSM, &texName);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync AssertRCReturn(rc, rc);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (texName)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync *pTexture = (CRTextureObj *) crHashtableSearch(pContext->shared->textureTable, texName);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync else
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync switch (target)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_TEXTURE_1D:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync *pTexture = &(pContext->texture.base1D);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync break;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_TEXTURE_2D:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync *pTexture = &(pContext->texture.base2D);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync break;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#ifdef CR_OPENGL_VERSION_1_2
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_TEXTURE_3D:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync *pTexture = &(pContext->texture.base3D);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync break;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#endif
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#ifdef CR_ARB_texture_cube_map
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_TEXTURE_CUBE_MAP_ARB:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync *pTexture = &(pContext->texture.baseCubeMap);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync break;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#endif
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#ifdef CR_NV_texture_rectangle
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_TEXTURE_RECTANGLE_NV:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync *pTexture = &(pContext->texture.baseRect);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync break;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#endif
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync default:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crError("LoadTextureObjPtr: Unknown texture target %d", target);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync return rc;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync}
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncstatic int32_t crStateSaveTexUnitCurrentTexturePtrs(CRTextureUnit *pTexUnit, PSSMHANDLE pSSM)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync{
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync int32_t rc;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync rc = crStateSaveTextureObjPtr(pTexUnit->currentTexture1D, pSSM);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync AssertRCReturn(rc, rc);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync rc = crStateSaveTextureObjPtr(pTexUnit->currentTexture2D, pSSM);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync AssertRCReturn(rc, rc);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync rc = crStateSaveTextureObjPtr(pTexUnit->currentTexture3D, pSSM);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync AssertRCReturn(rc, rc);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#ifdef CR_ARB_texture_cube_map
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync rc = crStateSaveTextureObjPtr(pTexUnit->currentTextureCubeMap, pSSM);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync AssertRCReturn(rc, rc);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#endif
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#ifdef CR_NV_texture_rectangle
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync rc = crStateSaveTextureObjPtr(pTexUnit->currentTextureRect, pSSM);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync AssertRCReturn(rc, rc);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#endif
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync return rc;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync}
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncstatic int32_t crStateLoadTexUnitCurrentTexturePtrs(CRTextureUnit *pTexUnit, CRContext *pContext, PSSMHANDLE pSSM)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync{
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync int32_t rc;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync rc = crStateLoadTextureObjPtr(&pTexUnit->currentTexture1D, pContext, GL_TEXTURE_1D, pSSM);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync AssertRCReturn(rc, rc);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync rc = crStateLoadTextureObjPtr(&pTexUnit->currentTexture2D, pContext, GL_TEXTURE_1D, pSSM);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync AssertRCReturn(rc, rc);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync rc = crStateLoadTextureObjPtr(&pTexUnit->currentTexture3D, pContext, GL_TEXTURE_2D, pSSM);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync AssertRCReturn(rc, rc);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#ifdef CR_ARB_texture_cube_map
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync rc = crStateLoadTextureObjPtr(&pTexUnit->currentTextureCubeMap, pContext, GL_TEXTURE_CUBE_MAP_ARB, pSSM);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync AssertRCReturn(rc, rc);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#endif
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#ifdef CR_NV_texture_rectangle
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync rc = crStateLoadTextureObjPtr(&pTexUnit->currentTextureRect, pContext, GL_TEXTURE_RECTANGLE_NV, pSSM);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync AssertRCReturn(rc, rc);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#endif
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync return rc;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync}
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncstatic int32_t crSateSaveEvalCoeffs1D(CREvaluator1D *pEval, PSSMHANDLE pSSM)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync{
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync int32_t rc, i;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync for (i=0; i<GLEVAL_TOT; ++i)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (pEval[i].coeff)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync rc = SSMR3PutMem(pSSM, pEval[i].coeff, pEval[i].order * gleval_sizes[i] * sizeof(GLfloat));
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync AssertRCReturn(rc, rc);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync return VINF_SUCCESS;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync}
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncstatic int32_t crSateSaveEvalCoeffs2D(CREvaluator2D *pEval, PSSMHANDLE pSSM)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync{
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync int32_t rc, i;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync for (i=0; i<GLEVAL_TOT; ++i)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (pEval[i].coeff)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync rc = SSMR3PutMem(pSSM, pEval[i].coeff, pEval[i].uorder * pEval[i].vorder * gleval_sizes[i] * sizeof(GLfloat));
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync AssertRCReturn(rc, rc);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync return VINF_SUCCESS;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync}
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncstatic int32_t crSateLoadEvalCoeffs1D(CREvaluator1D *pEval, GLboolean bReallocMem, PSSMHANDLE pSSM)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync{
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync int32_t rc, i;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync size_t size;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync for (i=0; i<GLEVAL_TOT; ++i)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (pEval[i].coeff)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync size = pEval[i].order * gleval_sizes[i] * sizeof(GLfloat);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (bReallocMem)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync pEval[i].coeff = (GLfloat*) crAlloc(size);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (!pEval[i].coeff) return VERR_NO_MEMORY;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync rc = SSMR3GetMem(pSSM, pEval[i].coeff, size);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync AssertRCReturn(rc, rc);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync return VINF_SUCCESS;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync}
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncstatic int32_t crSateLoadEvalCoeffs2D(CREvaluator2D *pEval, GLboolean bReallocMem, PSSMHANDLE pSSM)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync{
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync int32_t rc, i;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync size_t size;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync for (i=0; i<GLEVAL_TOT; ++i)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (pEval[i].coeff)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync size = pEval[i].uorder * pEval[i].vorder * gleval_sizes[i] * sizeof(GLfloat);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (bReallocMem)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync pEval[i].coeff = (GLfloat*) crAlloc(size);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (!pEval[i].coeff) return VERR_NO_MEMORY;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync rc = SSMR3GetMem(pSSM, pEval[i].coeff, size);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync AssertRCReturn(rc, rc);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync return VINF_SUCCESS;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync}
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncstatic void crStateCopyEvalPtrs1D(CREvaluator1D *pDst, CREvaluator1D *pSrc)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync{
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync int32_t i;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync for (i=0; i<GLEVAL_TOT; ++i)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync pDst[i].coeff = pSrc[i].coeff;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /*
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;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync}
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncstatic void crStateCopyEvalPtrs2D(CREvaluator2D *pDst, CREvaluator2D *pSrc)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync{
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync int32_t i;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync for (i=0; i<GLEVAL_TOT; ++i)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync pDst[i].coeff = pSrc[i].coeff;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /*
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;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync}
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncstatic void crStateSaveBufferObjectCB(unsigned long key, void *data1, void *data2)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync{
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRBufferObject *pBufferObj = (CRBufferObject *) data1;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync PSSMHANDLE pSSM = (PSSMHANDLE) data2;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync int32_t rc;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRASSERT(pBufferObj && pSSM);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync rc = SSMR3PutMem(pSSM, &key, sizeof(key));
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRASSERT(rc == VINF_SUCCESS);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync rc = SSMR3PutMem(pSSM, pBufferObj, sizeof(*pBufferObj));
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRASSERT(rc == VINF_SUCCESS);
bf144aab354eaec8ee22b16b1c138f47f38b7244vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (pBufferObj->data)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync {
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 CRASSERT(pBufferObj->size>0);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync rc = SSMR3PutMem(pSSM, pBufferObj->data, pBufferObj->size);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRASSERT(rc == VINF_SUCCESS);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
c62d2520ac91e12cf4665c936f490dd2064152d3vboxsync else if (pBufferObj->id!=0 && pBufferObj->size>0)
bf144aab354eaec8ee22b16b1c138f47f38b7244vboxsync {
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 CRASSERT(rc == VINF_SUCCESS);
bf144aab354eaec8ee22b16b1c138f47f38b7244vboxsync if (pBufferObj->pointer)
bf144aab354eaec8ee22b16b1c138f47f38b7244vboxsync {
bf144aab354eaec8ee22b16b1c138f47f38b7244vboxsync rc = SSMR3PutMem(pSSM, pBufferObj->pointer, pBufferObj->size);
bf144aab354eaec8ee22b16b1c138f47f38b7244vboxsync CRASSERT(rc == VINF_SUCCESS);
bf144aab354eaec8ee22b16b1c138f47f38b7244vboxsync }
bf144aab354eaec8ee22b16b1c138f47f38b7244vboxsync diff_api.UnmapBufferARB(GL_ARRAY_BUFFER_ARB);
bf144aab354eaec8ee22b16b1c138f47f38b7244vboxsync pBufferObj->pointer = NULL;
bf144aab354eaec8ee22b16b1c138f47f38b7244vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync}
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncstatic void crStateSaveProgramCB(unsigned long key, void *data1, void *data2)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync{
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRProgram *pProgram = (CRProgram *) data1;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync PSSMHANDLE pSSM = (PSSMHANDLE) data2;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRProgramSymbol *pSymbol;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync int32_t rc;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRASSERT(pProgram && pSSM);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync rc = SSMR3PutMem(pSSM, &key, sizeof(key));
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRASSERT(rc == VINF_SUCCESS);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync rc = SSMR3PutMem(pSSM, pProgram, sizeof(*pProgram));
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRASSERT(rc == VINF_SUCCESS);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (pProgram->string)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRASSERT(pProgram->length);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync rc = SSMR3PutMem(pSSM, pProgram->string, pProgram->length);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRASSERT(rc == VINF_SUCCESS);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync for (pSymbol = pProgram->symbolTable; pSymbol; pSymbol=pSymbol->next)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync rc = SSMR3PutMem(pSSM, pSymbol, sizeof(*pSymbol));
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRASSERT(rc == VINF_SUCCESS);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (pSymbol->name)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRASSERT(pSymbol->cbName>0);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync rc = SSMR3PutMem(pSSM, pSymbol->name, pSymbol->cbName);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRASSERT(rc == VINF_SUCCESS);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync}
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
bd810d58866067df322ea7f4a4627d9bdebb70d3vboxsyncstatic void crStateSaveFramebuffersCB(unsigned long key, void *data1, void *data2)
bd810d58866067df322ea7f4a4627d9bdebb70d3vboxsync{
bd810d58866067df322ea7f4a4627d9bdebb70d3vboxsync CRFramebufferObject *pFBO = (CRFramebufferObject*) data1;
bd810d58866067df322ea7f4a4627d9bdebb70d3vboxsync PSSMHANDLE pSSM = (PSSMHANDLE) data2;
bd810d58866067df322ea7f4a4627d9bdebb70d3vboxsync int32_t rc;
bd810d58866067df322ea7f4a4627d9bdebb70d3vboxsync
bd810d58866067df322ea7f4a4627d9bdebb70d3vboxsync rc = SSMR3PutMem(pSSM, &key, sizeof(key));
bd810d58866067df322ea7f4a4627d9bdebb70d3vboxsync CRASSERT(rc == VINF_SUCCESS);
bd810d58866067df322ea7f4a4627d9bdebb70d3vboxsync
bd810d58866067df322ea7f4a4627d9bdebb70d3vboxsync rc = SSMR3PutMem(pSSM, pFBO, sizeof(*pFBO));
bd810d58866067df322ea7f4a4627d9bdebb70d3vboxsync CRASSERT(rc == VINF_SUCCESS);
bd810d58866067df322ea7f4a4627d9bdebb70d3vboxsync}
bd810d58866067df322ea7f4a4627d9bdebb70d3vboxsync
bd810d58866067df322ea7f4a4627d9bdebb70d3vboxsyncstatic void crStateSaveRenderbuffersCB(unsigned long key, void *data1, void *data2)
bd810d58866067df322ea7f4a4627d9bdebb70d3vboxsync{
bd810d58866067df322ea7f4a4627d9bdebb70d3vboxsync CRRenderbufferObject *pRBO = (CRRenderbufferObject*) data1;
bd810d58866067df322ea7f4a4627d9bdebb70d3vboxsync PSSMHANDLE pSSM = (PSSMHANDLE) data2;
bd810d58866067df322ea7f4a4627d9bdebb70d3vboxsync int32_t rc;
bd810d58866067df322ea7f4a4627d9bdebb70d3vboxsync
bd810d58866067df322ea7f4a4627d9bdebb70d3vboxsync rc = SSMR3PutMem(pSSM, &key, sizeof(key));
bd810d58866067df322ea7f4a4627d9bdebb70d3vboxsync CRASSERT(rc == VINF_SUCCESS);
bd810d58866067df322ea7f4a4627d9bdebb70d3vboxsync
bd810d58866067df322ea7f4a4627d9bdebb70d3vboxsync rc = SSMR3PutMem(pSSM, pRBO, sizeof(*pRBO));
bd810d58866067df322ea7f4a4627d9bdebb70d3vboxsync CRASSERT(rc == VINF_SUCCESS);
bd810d58866067df322ea7f4a4627d9bdebb70d3vboxsync}
bd810d58866067df322ea7f4a4627d9bdebb70d3vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncstatic int32_t crStateLoadProgram(CRProgram **ppProgram, PSSMHANDLE pSSM)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync{
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRProgramSymbol **ppSymbol;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync int32_t rc;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync unsigned long key;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync rc = SSMR3GetMem(pSSM, &key, sizeof(key));
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync AssertRCReturn(rc, rc);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* we're loading default vertex or pixel program*/
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (*ppProgram)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (key!=0) return VERR_SSM_UNEXPECTED_DATA;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync else
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync *ppProgram = (CRProgram*) crAlloc(sizeof(CRProgram));
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (!ppProgram) return VERR_NO_MEMORY;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (key==0) return VERR_SSM_UNEXPECTED_DATA;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync rc = SSMR3GetMem(pSSM, *ppProgram, sizeof(**ppProgram));
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync AssertRCReturn(rc, rc);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if ((*ppProgram)->string)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRASSERT((*ppProgram)->length);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync (*ppProgram)->string = crAlloc((*ppProgram)->length);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (!(*ppProgram)->string) return VERR_NO_MEMORY;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync rc = SSMR3GetMem(pSSM, (void*) (*ppProgram)->string, (*ppProgram)->length);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync AssertRCReturn(rc, rc);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync for (ppSymbol = &(*ppProgram)->symbolTable; *ppSymbol; ppSymbol=&(*ppSymbol)->next)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync *ppSymbol = crAlloc(sizeof(CRProgramSymbol));
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (!ppSymbol) return VERR_NO_MEMORY;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync rc = SSMR3GetMem(pSSM, *ppSymbol, sizeof(**ppSymbol));
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync AssertRCReturn(rc, rc);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if ((*ppSymbol)->name)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRASSERT((*ppSymbol)->cbName>0);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync (*ppSymbol)->name = crAlloc((*ppSymbol)->cbName);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (!(*ppSymbol)->name) return VERR_NO_MEMORY;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync rc = SSMR3GetMem(pSSM, (void*) (*ppSymbol)->name, (*ppSymbol)->cbName);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync AssertRCReturn(rc, rc);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync return VINF_SUCCESS;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync}
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
6e7c344fc7cdb580356704e8201207b394d367bbvboxsyncstatic void crStateSaveString(const char *pStr, PSSMHANDLE pSSM)
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync{
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync int32_t len;
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync int32_t rc;
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync if (pStr)
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync {
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync len = crStrlen(pStr)+1;
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync rc = SSMR3PutS32(pSSM, len);
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync CRASSERT(rc == VINF_SUCCESS);
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync rc = SSMR3PutMem(pSSM, pStr, len*sizeof(*pStr));
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync CRASSERT(rc == VINF_SUCCESS);
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync }
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync else
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync {
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync rc = SSMR3PutS32(pSSM, 0);
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync CRASSERT(rc == VINF_SUCCESS);
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync }
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync}
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync
6e7c344fc7cdb580356704e8201207b394d367bbvboxsyncstatic char* crStateLoadString(PSSMHANDLE pSSM)
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync{
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync int32_t len, rc;
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync char* pStr = NULL;
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync rc = SSMR3GetS32(pSSM, &len);
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync CRASSERT(rc == VINF_SUCCESS);
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync if (len!=0)
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync {
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync pStr = crAlloc(len*sizeof(*pStr));
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync rc = SSMR3GetMem(pSSM, pStr, len*sizeof(*pStr));
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync CRASSERT(rc == VINF_SUCCESS);
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync }
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync return pStr;
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync}
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync
6e7c344fc7cdb580356704e8201207b394d367bbvboxsyncstatic void crStateSaveGLSLShaderCB(unsigned long key, void *data1, void *data2)
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync{
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync CRGLSLShader *pShader = (CRGLSLShader*) data1;
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync PSSMHANDLE pSSM = (PSSMHANDLE) data2;
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync int32_t rc;
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync rc = SSMR3PutMem(pSSM, &key, sizeof(key));
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync CRASSERT(rc == VINF_SUCCESS);
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync rc = SSMR3PutMem(pSSM, pShader, sizeof(*pShader));
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync CRASSERT(rc == VINF_SUCCESS);
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync if (pShader->source)
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync {
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync crStateSaveString(pShader->source, pSSM);
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync }
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync else
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync {
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync GLint sLen=0;
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync GLchar *source=NULL;
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync diff_api.GetShaderiv(pShader->hwid, GL_SHADER_SOURCE_LENGTH, &sLen);
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync if (sLen>0)
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync {
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync source = (GLchar*) crAlloc(sLen);
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync diff_api.GetShaderSource(pShader->hwid, sLen, NULL, source);
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync }
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync crStateSaveString(source, pSSM);
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync if (source) crFree(source);
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync }
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync}
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync
6e7c344fc7cdb580356704e8201207b394d367bbvboxsyncstatic CRGLSLShader* crStateLoadGLSLShader(PSSMHANDLE pSSM)
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync{
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync CRGLSLShader *pShader;
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync int32_t rc;
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync unsigned long key;
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync pShader = crAlloc(sizeof(*pShader));
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync if (!pShader) return NULL;
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync rc = SSMR3GetMem(pSSM, &key, sizeof(key));
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync CRASSERT(rc == VINF_SUCCESS);
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync rc = SSMR3GetMem(pSSM, pShader, sizeof(*pShader));
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync CRASSERT(rc == VINF_SUCCESS);
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync pShader->source = crStateLoadString(pSSM);
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync return pShader;
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync}
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync
6e7c344fc7cdb580356704e8201207b394d367bbvboxsyncstatic void crStateSaveGLSLShaderKeyCB(unsigned long key, void *data1, void *data2)
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync{
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync CRGLSLShader *pShader = (CRGLSLShader*) data1;
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync PSSMHANDLE pSSM = (PSSMHANDLE) data2;
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync int32_t rc;
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync rc = SSMR3PutMem(pSSM, &key, sizeof(key));
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync CRASSERT(rc == VINF_SUCCESS);
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync}
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync
6e7c344fc7cdb580356704e8201207b394d367bbvboxsyncstatic void crStateSaveGLSLProgramAttribs(CRGLSLProgramState *pState, PSSMHANDLE pSSM)
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync{
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync GLuint i;
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync int32_t rc;
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync for (i=0; i<pState->cAttribs; ++i)
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync {
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync rc = SSMR3PutMem(pSSM, &pState->pAttribs[i].index, sizeof(pState->pAttribs[i].index));
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync CRASSERT(rc == VINF_SUCCESS);
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync crStateSaveString(pState->pAttribs[i].name, pSSM);
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync }
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync}
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync
6e7c344fc7cdb580356704e8201207b394d367bbvboxsyncstatic void crStateSaveGLSLProgramCB(unsigned long key, void *data1, void *data2)
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync{
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync CRGLSLProgram *pProgram = (CRGLSLProgram*) data1;
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync PSSMHANDLE pSSM = (PSSMHANDLE) data2;
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync int32_t rc;
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync uint32_t ui32;
c697d02eb4ededad7e08b2c48428ddb56c844a0avboxsync GLint maxUniformLen, activeUniforms=0, uniformsCount=0, i, j;
841fc232dfd102207563580ef5b2875edb98e305vboxsync GLchar *name = NULL;
c697d02eb4ededad7e08b2c48428ddb56c844a0avboxsync GLenum type;
c697d02eb4ededad7e08b2c48428ddb56c844a0avboxsync GLint size, location;
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync rc = SSMR3PutMem(pSSM, &key, sizeof(key));
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync CRASSERT(rc == VINF_SUCCESS);
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync rc = SSMR3PutMem(pSSM, pProgram, sizeof(*pProgram));
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync CRASSERT(rc == VINF_SUCCESS);
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync ui32 = crHashtableNumElements(pProgram->currentState.attachedShaders);
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync rc = SSMR3PutU32(pSSM, ui32);
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync CRASSERT(rc == VINF_SUCCESS);
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync crHashtableWalk(pProgram->currentState.attachedShaders, crStateSaveGLSLShaderKeyCB, pSSM);
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync if (pProgram->activeState.attachedShaders)
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync {
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync ui32 = crHashtableNumElements(pProgram->activeState.attachedShaders);
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync rc = SSMR3PutU32(pSSM, ui32);
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync CRASSERT(rc == VINF_SUCCESS);
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync crHashtableWalk(pProgram->currentState.attachedShaders, crStateSaveGLSLShaderCB, pSSM);
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync }
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync crStateSaveGLSLProgramAttribs(&pProgram->currentState, pSSM);
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync crStateSaveGLSLProgramAttribs(&pProgram->activeState, pSSM);
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync diff_api.GetProgramiv(pProgram->hwid, GL_ACTIVE_UNIFORM_MAX_LENGTH, &maxUniformLen);
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync diff_api.GetProgramiv(pProgram->hwid, GL_ACTIVE_UNIFORMS, &activeUniforms);
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync
c697d02eb4ededad7e08b2c48428ddb56c844a0avboxsync if (activeUniforms>0)
c697d02eb4ededad7e08b2c48428ddb56c844a0avboxsync {
c697d02eb4ededad7e08b2c48428ddb56c844a0avboxsync name = (GLchar *) crAlloc((maxUniformLen+8)*sizeof(GLchar));
c697d02eb4ededad7e08b2c48428ddb56c844a0avboxsync
c697d02eb4ededad7e08b2c48428ddb56c844a0avboxsync if (!name)
c697d02eb4ededad7e08b2c48428ddb56c844a0avboxsync {
c697d02eb4ededad7e08b2c48428ddb56c844a0avboxsync crWarning("crStateSaveGLSLProgramCB: out of memory");
c697d02eb4ededad7e08b2c48428ddb56c844a0avboxsync return;
c697d02eb4ededad7e08b2c48428ddb56c844a0avboxsync }
c697d02eb4ededad7e08b2c48428ddb56c844a0avboxsync }
c697d02eb4ededad7e08b2c48428ddb56c844a0avboxsync
c697d02eb4ededad7e08b2c48428ddb56c844a0avboxsync for (i=0; i<activeUniforms; ++i)
c697d02eb4ededad7e08b2c48428ddb56c844a0avboxsync {
c697d02eb4ededad7e08b2c48428ddb56c844a0avboxsync diff_api.GetActiveUniform(pProgram->hwid, i, maxUniformLen, NULL, &size, &type, name);
c697d02eb4ededad7e08b2c48428ddb56c844a0avboxsync uniformsCount += size;
c697d02eb4ededad7e08b2c48428ddb56c844a0avboxsync }
c697d02eb4ededad7e08b2c48428ddb56c844a0avboxsync CRASSERT(uniformsCount>=activeUniforms);
c697d02eb4ededad7e08b2c48428ddb56c844a0avboxsync
c697d02eb4ededad7e08b2c48428ddb56c844a0avboxsync rc = SSMR3PutS32(pSSM, uniformsCount);
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync CRASSERT(rc == VINF_SUCCESS);
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync if (activeUniforms>0)
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync {
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync GLfloat fdata[16];
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync GLint idata[16];
c697d02eb4ededad7e08b2c48428ddb56c844a0avboxsync char *pIndexStr=NULL;
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync for (i=0; i<activeUniforms; ++i)
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync {
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync diff_api.GetActiveUniform(pProgram->hwid, i, maxUniformLen, NULL, &size, &type, name);
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync
c697d02eb4ededad7e08b2c48428ddb56c844a0avboxsync if (size>1)
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync {
c697d02eb4ededad7e08b2c48428ddb56c844a0avboxsync pIndexStr = crStrchr(name, '[');
c697d02eb4ededad7e08b2c48428ddb56c844a0avboxsync if (!pIndexStr)
c697d02eb4ededad7e08b2c48428ddb56c844a0avboxsync {
c697d02eb4ededad7e08b2c48428ddb56c844a0avboxsync pIndexStr = name+crStrlen(name);
c697d02eb4ededad7e08b2c48428ddb56c844a0avboxsync }
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync }
c697d02eb4ededad7e08b2c48428ddb56c844a0avboxsync
c697d02eb4ededad7e08b2c48428ddb56c844a0avboxsync for (j=0; j<size; ++j)
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync {
c697d02eb4ededad7e08b2c48428ddb56c844a0avboxsync if (size>1)
c697d02eb4ededad7e08b2c48428ddb56c844a0avboxsync {
c697d02eb4ededad7e08b2c48428ddb56c844a0avboxsync sprintf(pIndexStr, "[%i]", j);
c697d02eb4ededad7e08b2c48428ddb56c844a0avboxsync }
1949f98957df74949c101f6f2c97f5f7de38144avboxsync location = diff_api.GetUniformLocation(pProgram->hwid, name);
c697d02eb4ededad7e08b2c48428ddb56c844a0avboxsync
c697d02eb4ededad7e08b2c48428ddb56c844a0avboxsync rc = SSMR3PutMem(pSSM, &type, sizeof(type));
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync CRASSERT(rc == VINF_SUCCESS);
c697d02eb4ededad7e08b2c48428ddb56c844a0avboxsync
c697d02eb4ededad7e08b2c48428ddb56c844a0avboxsync crStateSaveString(name, pSSM);
c697d02eb4ededad7e08b2c48428ddb56c844a0avboxsync
c697d02eb4ededad7e08b2c48428ddb56c844a0avboxsync if (crStateIsIntUniform(type))
c697d02eb4ededad7e08b2c48428ddb56c844a0avboxsync {
c697d02eb4ededad7e08b2c48428ddb56c844a0avboxsync diff_api.GetUniformiv(pProgram->hwid, location, &idata[0]);
c697d02eb4ededad7e08b2c48428ddb56c844a0avboxsync rc = SSMR3PutMem(pSSM, &idata[0], crStateGetUniformSize(type)*sizeof(idata[0]));
c697d02eb4ededad7e08b2c48428ddb56c844a0avboxsync CRASSERT(rc == VINF_SUCCESS);
c697d02eb4ededad7e08b2c48428ddb56c844a0avboxsync }
c697d02eb4ededad7e08b2c48428ddb56c844a0avboxsync else
c697d02eb4ededad7e08b2c48428ddb56c844a0avboxsync {
c697d02eb4ededad7e08b2c48428ddb56c844a0avboxsync diff_api.GetUniformfv(pProgram->hwid, location, &fdata[0]);
c697d02eb4ededad7e08b2c48428ddb56c844a0avboxsync rc = SSMR3PutMem(pSSM, &fdata[0], crStateGetUniformSize(type)*sizeof(fdata[0]));
c697d02eb4ededad7e08b2c48428ddb56c844a0avboxsync CRASSERT(rc == VINF_SUCCESS);
c697d02eb4ededad7e08b2c48428ddb56c844a0avboxsync }
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync }
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync }
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync crFree(name);
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync }
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync}
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync
e42c49edebbc79edb6d87377bab6d879fdb602favboxsyncstatic int32_t crStateSaveClientPointer(CRVertexArrays *pArrays, int32_t index, PSSMHANDLE pSSM)
e42c49edebbc79edb6d87377bab6d879fdb602favboxsync{
e42c49edebbc79edb6d87377bab6d879fdb602favboxsync int32_t rc;
e42c49edebbc79edb6d87377bab6d879fdb602favboxsync CRClientPointer *cp;
e42c49edebbc79edb6d87377bab6d879fdb602favboxsync
e42c49edebbc79edb6d87377bab6d879fdb602favboxsync cp = crStateGetClientPointerByIndex(index, pArrays);
e42c49edebbc79edb6d87377bab6d879fdb602favboxsync
c62d2520ac91e12cf4665c936f490dd2064152d3vboxsync rc = SSMR3PutU32(pSSM, cp->buffer->id);
e42c49edebbc79edb6d87377bab6d879fdb602favboxsync AssertRCReturn(rc, rc);
e42c49edebbc79edb6d87377bab6d879fdb602favboxsync
e42c49edebbc79edb6d87377bab6d879fdb602favboxsync#ifdef CR_EXT_compiled_vertex_array
e42c49edebbc79edb6d87377bab6d879fdb602favboxsync if (cp->locked)
e42c49edebbc79edb6d87377bab6d879fdb602favboxsync {
e42c49edebbc79edb6d87377bab6d879fdb602favboxsync CRASSERT(cp->p);
e42c49edebbc79edb6d87377bab6d879fdb602favboxsync rc = SSMR3PutMem(pSSM, cp->p, cp->stride*(pArrays->lockFirst+pArrays->lockCount));
e42c49edebbc79edb6d87377bab6d879fdb602favboxsync AssertRCReturn(rc, rc);
e42c49edebbc79edb6d87377bab6d879fdb602favboxsync }
e42c49edebbc79edb6d87377bab6d879fdb602favboxsync#endif
e42c49edebbc79edb6d87377bab6d879fdb602favboxsync
e42c49edebbc79edb6d87377bab6d879fdb602favboxsync return VINF_SUCCESS;
e42c49edebbc79edb6d87377bab6d879fdb602favboxsync}
e42c49edebbc79edb6d87377bab6d879fdb602favboxsync
e42c49edebbc79edb6d87377bab6d879fdb602favboxsyncstatic int32_t crStateLoadClientPointer(CRVertexArrays *pArrays, int32_t index, CRContext *pContext, PSSMHANDLE pSSM)
e42c49edebbc79edb6d87377bab6d879fdb602favboxsync{
e42c49edebbc79edb6d87377bab6d879fdb602favboxsync int32_t rc;
e42c49edebbc79edb6d87377bab6d879fdb602favboxsync uint32_t ui;
e42c49edebbc79edb6d87377bab6d879fdb602favboxsync CRClientPointer *cp;
e42c49edebbc79edb6d87377bab6d879fdb602favboxsync
e42c49edebbc79edb6d87377bab6d879fdb602favboxsync cp = crStateGetClientPointerByIndex(index, pArrays);
e42c49edebbc79edb6d87377bab6d879fdb602favboxsync
e42c49edebbc79edb6d87377bab6d879fdb602favboxsync rc = SSMR3GetU32(pSSM, &ui);
e42c49edebbc79edb6d87377bab6d879fdb602favboxsync AssertRCReturn(rc, rc);
c62d2520ac91e12cf4665c936f490dd2064152d3vboxsync cp->buffer = ui==0 ? pContext->bufferobject.nullBuffer : crHashtableSearch(pContext->shared->buffersTable, ui);
e42c49edebbc79edb6d87377bab6d879fdb602favboxsync
e42c49edebbc79edb6d87377bab6d879fdb602favboxsync#ifdef CR_EXT_compiled_vertex_array
e42c49edebbc79edb6d87377bab6d879fdb602favboxsync if (cp->locked)
e42c49edebbc79edb6d87377bab6d879fdb602favboxsync {
d28dc67f08822d73f954174fab43e570131b54davboxsync rc = crStateAllocAndSSMR3GetMem(pSSM, (void**)&cp->p, cp->stride*(pArrays->lockFirst+pArrays->lockCount));
e42c49edebbc79edb6d87377bab6d879fdb602favboxsync AssertRCReturn(rc, rc);
e42c49edebbc79edb6d87377bab6d879fdb602favboxsync }
e42c49edebbc79edb6d87377bab6d879fdb602favboxsync#endif
e42c49edebbc79edb6d87377bab6d879fdb602favboxsync
e42c49edebbc79edb6d87377bab6d879fdb602favboxsync return VINF_SUCCESS;
e42c49edebbc79edb6d87377bab6d879fdb602favboxsync}
e42c49edebbc79edb6d87377bab6d879fdb602favboxsync
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsyncstatic int32_t crStateSaveCurrentBits(CRStateBits *pBits, PSSMHANDLE pSSM)
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync{
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync int32_t rc, i;
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync rc = SSMR3PutMem(pSSM, pBits, sizeof(*pBits));
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync AssertRCReturn(rc, rc);
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync rc = SSMR3PutMem(pSSM, pBits->client.v, GLCLIENT_BIT_ALLOC*sizeof(CRbitvalue));
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync AssertRCReturn(rc, rc);
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync rc = SSMR3PutMem(pSSM, pBits->client.n, GLCLIENT_BIT_ALLOC*sizeof(CRbitvalue));
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync AssertRCReturn(rc, rc);
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync rc = SSMR3PutMem(pSSM, pBits->client.c, GLCLIENT_BIT_ALLOC*sizeof(CRbitvalue));
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync AssertRCReturn(rc, rc);
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync rc = SSMR3PutMem(pSSM, pBits->client.s, GLCLIENT_BIT_ALLOC*sizeof(CRbitvalue));
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync AssertRCReturn(rc, rc);
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync rc = SSMR3PutMem(pSSM, pBits->client.i, GLCLIENT_BIT_ALLOC*sizeof(CRbitvalue));
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync AssertRCReturn(rc, rc);
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync for (i=0; i<CR_MAX_TEXTURE_UNITS; i++)
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync {
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync rc = SSMR3PutMem(pSSM, pBits->client.t[i], GLCLIENT_BIT_ALLOC*sizeof(CRbitvalue));
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync AssertRCReturn(rc, rc);
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync }
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync rc = SSMR3PutMem(pSSM, pBits->client.e, GLCLIENT_BIT_ALLOC*sizeof(CRbitvalue));
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync AssertRCReturn(rc, rc);
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync rc = SSMR3PutMem(pSSM, pBits->client.f, GLCLIENT_BIT_ALLOC*sizeof(CRbitvalue));
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync AssertRCReturn(rc, rc);
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync#ifdef CR_NV_vertex_program
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync for (i=0; i<CR_MAX_VERTEX_ATTRIBS; i++)
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync {
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync rc = SSMR3PutMem(pSSM, pBits->client.a[i], GLCLIENT_BIT_ALLOC*sizeof(CRbitvalue));
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync AssertRCReturn(rc, rc);
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync }
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync#endif
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync rc = SSMR3PutMem(pSSM, pBits->lighting.light, CR_MAX_LIGHTS*sizeof(pBits->lighting.light));
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync AssertRCReturn(rc, rc);
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync return VINF_SUCCESS;
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync}
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsyncstatic int32_t crStateLoadCurrentBits(CRStateBits *pBits, PSSMHANDLE pSSM)
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync{
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync int32_t rc, i;
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync CRClientBits client;
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync CRLightingBits lighting;
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync CRASSERT(pBits);
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync client.v = pBits->client.v;
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync client.n = pBits->client.n;
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync client.c = pBits->client.c;
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync client.s = pBits->client.s;
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync client.i = pBits->client.i;
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync client.e = pBits->client.e;
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync client.f = pBits->client.f;
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync for (i=0; i<CR_MAX_TEXTURE_UNITS; i++)
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync {
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync client.t[i] = pBits->client.t[i];
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync }
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync#ifdef CR_NV_vertex_program
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync for (i=0; i<CR_MAX_VERTEX_ATTRIBS; i++)
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync {
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync client.a[i] = pBits->client.a[i];
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync }
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync#endif
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync lighting.light = pBits->lighting.light;
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync rc = SSMR3GetMem(pSSM, pBits, sizeof(*pBits));
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync AssertRCReturn(rc, rc);
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync pBits->client.v = client.v;
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync rc = SSMR3GetMem(pSSM, pBits->client.v, GLCLIENT_BIT_ALLOC*sizeof(CRbitvalue));
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync AssertRCReturn(rc, rc);
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync pBits->client.n = client.n;
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync rc = SSMR3GetMem(pSSM, pBits->client.n, GLCLIENT_BIT_ALLOC*sizeof(CRbitvalue));
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync AssertRCReturn(rc, rc);
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync pBits->client.c = client.c;
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync rc = SSMR3GetMem(pSSM, pBits->client.c, GLCLIENT_BIT_ALLOC*sizeof(CRbitvalue));
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync AssertRCReturn(rc, rc);
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync pBits->client.s = client.s;
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync rc = SSMR3GetMem(pSSM, pBits->client.s, GLCLIENT_BIT_ALLOC*sizeof(CRbitvalue));
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync AssertRCReturn(rc, rc);
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync pBits->client.i = client.i;
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync rc = SSMR3GetMem(pSSM, pBits->client.i, GLCLIENT_BIT_ALLOC*sizeof(CRbitvalue));
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync AssertRCReturn(rc, rc);
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync pBits->client.e = client.e;
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync rc = SSMR3GetMem(pSSM, pBits->client.e, GLCLIENT_BIT_ALLOC*sizeof(CRbitvalue));
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync AssertRCReturn(rc, rc);
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync pBits->client.f = client.f;
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync rc = SSMR3GetMem(pSSM, pBits->client.f, GLCLIENT_BIT_ALLOC*sizeof(CRbitvalue));
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync AssertRCReturn(rc, rc);
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync for (i=0; i<CR_MAX_TEXTURE_UNITS; i++)
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync {
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync pBits->client.t[i] = client.t[i];
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync rc = SSMR3GetMem(pSSM, pBits->client.t[i], GLCLIENT_BIT_ALLOC*sizeof(CRbitvalue));
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync AssertRCReturn(rc, rc);
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync }
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync#ifdef CR_NV_vertex_program
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync for (i=0; i<CR_MAX_VERTEX_ATTRIBS; i++)
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync {
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync pBits->client.a[i] = client.a[i];
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync rc = SSMR3GetMem(pSSM, pBits->client.a[i], GLCLIENT_BIT_ALLOC*sizeof(CRbitvalue));
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync AssertRCReturn(rc, rc);
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync }
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync#endif
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync pBits->lighting.light = lighting.light;
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync rc = SSMR3GetMem(pSSM, pBits->lighting.light, CR_MAX_LIGHTS*sizeof(pBits->lighting.light));
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync AssertRCReturn(rc, rc);
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync return VINF_SUCCESS;
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync}
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncint32_t crStateSaveContext(CRContext *pContext, PSSMHANDLE pSSM)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync{
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync int32_t rc, i;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync uint32_t ui32, j;
c62d2520ac91e12cf4665c936f490dd2064152d3vboxsync GLboolean bSaveShared = GL_TRUE;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRASSERT(pContext && pSSM);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync rc = SSMR3PutMem(pSSM, pContext, sizeof(*pContext));
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync AssertRCReturn(rc, rc);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (crHashtableNumElements(pContext->shared->dlistTable)>0)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crWarning("Saving state with %d display lists, unsupported", crHashtableNumElements(pContext->shared->dlistTable));
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (crHashtableNumElements(pContext->program.programHash)>0)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crDebug("Saving state with %d programs", crHashtableNumElements(pContext->program.programHash));
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
c62d2520ac91e12cf4665c936f490dd2064152d3vboxsync rc = SSMR3PutS32(pSSM, pContext->shared->id);
c62d2520ac91e12cf4665c936f490dd2064152d3vboxsync if (pContext->shared->refCount>1)
c62d2520ac91e12cf4665c936f490dd2064152d3vboxsync {
c62d2520ac91e12cf4665c936f490dd2064152d3vboxsync bSaveShared = pContext->shared->saveCount==0;
c62d2520ac91e12cf4665c936f490dd2064152d3vboxsync
c62d2520ac91e12cf4665c936f490dd2064152d3vboxsync ++pContext->shared->saveCount;
c62d2520ac91e12cf4665c936f490dd2064152d3vboxsync if (pContext->shared->saveCount == pContext->shared->refCount)
c62d2520ac91e12cf4665c936f490dd2064152d3vboxsync {
c62d2520ac91e12cf4665c936f490dd2064152d3vboxsync pContext->shared->saveCount=0;
c62d2520ac91e12cf4665c936f490dd2064152d3vboxsync }
c62d2520ac91e12cf4665c936f490dd2064152d3vboxsync }
c62d2520ac91e12cf4665c936f490dd2064152d3vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* Save transform state */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync rc = SSMR3PutMem(pSSM, pContext->transform.clipPlane, sizeof(GLvectord)*CR_MAX_CLIP_PLANES);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync AssertRCReturn(rc, rc);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync rc = SSMR3PutMem(pSSM, pContext->transform.clip, sizeof(GLboolean)*CR_MAX_CLIP_PLANES);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync AssertRCReturn(rc, rc);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync rc = crStateSaveMatrixStack(&pContext->transform.modelViewStack, pSSM);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync AssertRCReturn(rc, rc);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync rc = crStateSaveMatrixStack(&pContext->transform.projectionStack, pSSM);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync AssertRCReturn(rc, rc);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync rc = crStateSaveMatrixStack(&pContext->transform.colorStack, pSSM);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync AssertRCReturn(rc, rc);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync for (i = 0 ; i < CR_MAX_TEXTURE_UNITS ; i++)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync rc = crStateSaveMatrixStack(&pContext->transform.textureStack[i], pSSM);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync AssertRCReturn(rc, rc);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync for (i = 0 ; i < CR_MAX_PROGRAM_MATRICES ; i++)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync rc = crStateSaveMatrixStack(&pContext->transform.programStack[i], pSSM);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync AssertRCReturn(rc, rc);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* Save textures */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync rc = crStateSaveTextureObjData(&pContext->texture.base1D, pSSM);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync AssertRCReturn(rc, rc);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync rc = crStateSaveTextureObjData(&pContext->texture.base2D, pSSM);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync AssertRCReturn(rc, rc);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync rc = crStateSaveTextureObjData(&pContext->texture.base3D, pSSM);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync AssertRCReturn(rc, rc);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync rc = crStateSaveTextureObjData(&pContext->texture.proxy1D, pSSM);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync AssertRCReturn(rc, rc);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync rc = crStateSaveTextureObjData(&pContext->texture.proxy2D, pSSM);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync AssertRCReturn(rc, rc);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync rc = crStateSaveTextureObjData(&pContext->texture.proxy3D, pSSM);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#ifdef CR_ARB_texture_cube_map
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync rc = crStateSaveTextureObjData(&pContext->texture.baseCubeMap, pSSM);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync AssertRCReturn(rc, rc);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync rc = crStateSaveTextureObjData(&pContext->texture.proxyCubeMap, pSSM);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync AssertRCReturn(rc, rc);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#endif
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#ifdef CR_NV_texture_rectangle
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync rc = crStateSaveTextureObjData(&pContext->texture.baseRect, pSSM);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync AssertRCReturn(rc, rc);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync rc = crStateSaveTextureObjData(&pContext->texture.proxyRect, pSSM);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync AssertRCReturn(rc, rc);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#endif
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* Save shared textures */
c62d2520ac91e12cf4665c936f490dd2064152d3vboxsync if (bSaveShared)
c62d2520ac91e12cf4665c936f490dd2064152d3vboxsync {
c62d2520ac91e12cf4665c936f490dd2064152d3vboxsync CRASSERT(pContext->shared && pContext->shared->textureTable);
c62d2520ac91e12cf4665c936f490dd2064152d3vboxsync ui32 = crHashtableNumElements(pContext->shared->textureTable);
c62d2520ac91e12cf4665c936f490dd2064152d3vboxsync rc = SSMR3PutU32(pSSM, ui32);
c62d2520ac91e12cf4665c936f490dd2064152d3vboxsync AssertRCReturn(rc, rc);
c62d2520ac91e12cf4665c936f490dd2064152d3vboxsync crHashtableWalk(pContext->shared->textureTable, crStateSaveSharedTextureCB, pSSM);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
0bebd3a2671042901f1fcceff14f8c58dd397478vboxsync#ifdef CR_STATE_NO_TEXTURE_IMAGE_STORE
c62d2520ac91e12cf4665c936f490dd2064152d3vboxsync /* Restore previous texture bindings via diff_api */
c62d2520ac91e12cf4665c936f490dd2064152d3vboxsync if (ui32)
c62d2520ac91e12cf4665c936f490dd2064152d3vboxsync {
c62d2520ac91e12cf4665c936f490dd2064152d3vboxsync CRTextureUnit *pTexUnit;
0bebd3a2671042901f1fcceff14f8c58dd397478vboxsync
c62d2520ac91e12cf4665c936f490dd2064152d3vboxsync pTexUnit = &pContext->texture.unit[pContext->texture.curTextureUnit];
0bebd3a2671042901f1fcceff14f8c58dd397478vboxsync
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);
0bebd3a2671042901f1fcceff14f8c58dd397478vboxsync#ifdef CR_ARB_texture_cube_map
c62d2520ac91e12cf4665c936f490dd2064152d3vboxsync diff_api.BindTexture(GL_TEXTURE_CUBE_MAP_ARB, pTexUnit->currentTextureCubeMap->hwid);
0bebd3a2671042901f1fcceff14f8c58dd397478vboxsync#endif
0bebd3a2671042901f1fcceff14f8c58dd397478vboxsync#ifdef CR_NV_texture_rectangle
c62d2520ac91e12cf4665c936f490dd2064152d3vboxsync diff_api.BindTexture(GL_TEXTURE_RECTANGLE_NV, pTexUnit->currentTextureRect->hwid);
0bebd3a2671042901f1fcceff14f8c58dd397478vboxsync#endif
c62d2520ac91e12cf4665c936f490dd2064152d3vboxsync }
0bebd3a2671042901f1fcceff14f8c58dd397478vboxsync#endif
c62d2520ac91e12cf4665c936f490dd2064152d3vboxsync }
0bebd3a2671042901f1fcceff14f8c58dd397478vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* Save current texture pointers */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync for (i=0; i<CR_MAX_TEXTURE_UNITS; ++i)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync rc = crStateSaveTexUnitCurrentTexturePtrs(&pContext->texture.unit[i], pSSM);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync AssertRCReturn(rc, rc);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* Save lights */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRASSERT(pContext->lighting.light);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync rc = SSMR3PutMem(pSSM, pContext->lighting.light, CR_MAX_LIGHTS * sizeof(*pContext->lighting.light));
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync AssertRCReturn(rc, rc);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
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 {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (pContext->attrib.enableStack[i].clip)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync rc = SSMR3PutMem(pSSM, pContext->attrib.enableStack[i].clip,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync pContext->limits.maxClipPlanes*sizeof(GLboolean));
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync AssertRCReturn(rc, rc);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (pContext->attrib.enableStack[i].light)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync rc = SSMR3PutMem(pSSM, pContext->attrib.enableStack[i].light,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync pContext->limits.maxLights*sizeof(GLboolean));
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync AssertRCReturn(rc, rc);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (pContext->attrib.lightingStack[i].light)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync rc = SSMR3PutMem(pSSM, pContext->attrib.lightingStack[i].light,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync pContext->limits.maxLights*sizeof(CRLight));
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync AssertRCReturn(rc, rc);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync for (j=0; j<pContext->limits.maxTextureUnits; ++j)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync rc = crStateSaveTexUnitCurrentTexturePtrs(&pContext->attrib.textureStack[i].unit[j], pSSM);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync AssertRCReturn(rc, rc);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (pContext->attrib.transformStack[i].clip)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync rc = SSMR3PutMem(pSSM, pContext->attrib.transformStack[i].clip,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync pContext->limits.maxClipPlanes*sizeof(GLboolean));
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync AssertRCReturn(rc, rc);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (pContext->attrib.transformStack[i].clipPlane)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync rc = SSMR3PutMem(pSSM, pContext->attrib.transformStack[i].clipPlane,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync pContext->limits.maxClipPlanes*sizeof(GLvectord));
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync AssertRCReturn(rc, rc);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync rc = crSateSaveEvalCoeffs1D(pContext->attrib.evalStack[i].eval1D, pSSM);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync AssertRCReturn(rc, rc);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync rc = crSateSaveEvalCoeffs2D(pContext->attrib.evalStack[i].eval2D, pSSM);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync AssertRCReturn(rc, rc);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* Save evaluator coeffs */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync rc = crSateSaveEvalCoeffs1D(pContext->eval.eval1D, pSSM);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync AssertRCReturn(rc, rc);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync rc = crSateSaveEvalCoeffs2D(pContext->eval.eval2D, pSSM);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync AssertRCReturn(rc, rc);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#ifdef CR_ARB_vertex_buffer_object
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* Save buffer objects */
c62d2520ac91e12cf4665c936f490dd2064152d3vboxsync ui32 = bSaveShared? crHashtableNumElements(pContext->shared->buffersTable):0;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync rc = SSMR3PutU32(pSSM, ui32);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync AssertRCReturn(rc, rc);
c62d2520ac91e12cf4665c936f490dd2064152d3vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* Save default one*/
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crStateSaveBufferObjectCB(0, pContext->bufferobject.nullBuffer, pSSM);
c62d2520ac91e12cf4665c936f490dd2064152d3vboxsync
c62d2520ac91e12cf4665c936f490dd2064152d3vboxsync if (bSaveShared)
c62d2520ac91e12cf4665c936f490dd2064152d3vboxsync {
c62d2520ac91e12cf4665c936f490dd2064152d3vboxsync /* Save all the rest */
c62d2520ac91e12cf4665c936f490dd2064152d3vboxsync crHashtableWalk(pContext->shared->buffersTable, crStateSaveBufferObjectCB, pSSM);
c62d2520ac91e12cf4665c936f490dd2064152d3vboxsync }
c62d2520ac91e12cf4665c936f490dd2064152d3vboxsync
bf144aab354eaec8ee22b16b1c138f47f38b7244vboxsync /* Restore binding */
c62d2520ac91e12cf4665c936f490dd2064152d3vboxsync diff_api.BindBufferARB(GL_ARRAY_BUFFER_ARB, pContext->bufferobject.arrayBuffer->hwid);
c62d2520ac91e12cf4665c936f490dd2064152d3vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* Save pointers */
c62d2520ac91e12cf4665c936f490dd2064152d3vboxsync rc = SSMR3PutU32(pSSM, pContext->bufferobject.arrayBuffer->id);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync AssertRCReturn(rc, rc);
c62d2520ac91e12cf4665c936f490dd2064152d3vboxsync rc = SSMR3PutU32(pSSM, pContext->bufferobject.elementsBuffer->id);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync AssertRCReturn(rc, rc);
af8d59d05d72f134aeea62712f1286b369807d52vboxsync#ifdef CR_ARB_pixel_buffer_object
c62d2520ac91e12cf4665c936f490dd2064152d3vboxsync rc = SSMR3PutU32(pSSM, pContext->bufferobject.packBuffer->id);
af8d59d05d72f134aeea62712f1286b369807d52vboxsync AssertRCReturn(rc, rc);
c62d2520ac91e12cf4665c936f490dd2064152d3vboxsync rc = SSMR3PutU32(pSSM, pContext->bufferobject.unpackBuffer->id);
af8d59d05d72f134aeea62712f1286b369807d52vboxsync AssertRCReturn(rc, rc);
af8d59d05d72f134aeea62712f1286b369807d52vboxsync#endif
e42c49edebbc79edb6d87377bab6d879fdb602favboxsync /* Save clint pointers and buffer bindings*/
e42c49edebbc79edb6d87377bab6d879fdb602favboxsync for (i=0; i<CRSTATECLIENT_MAX_VERTEXARRAYS; ++i)
bf144aab354eaec8ee22b16b1c138f47f38b7244vboxsync {
e42c49edebbc79edb6d87377bab6d879fdb602favboxsync rc = crStateSaveClientPointer(&pContext->client.array, i, pSSM);
bf144aab354eaec8ee22b16b1c138f47f38b7244vboxsync AssertRCReturn(rc, rc);
bf144aab354eaec8ee22b16b1c138f47f38b7244vboxsync }
e42c49edebbc79edb6d87377bab6d879fdb602favboxsync
e42c49edebbc79edb6d87377bab6d879fdb602favboxsync crDebug("client.vertexArrayStackDepth %i", pContext->client.vertexArrayStackDepth);
e42c49edebbc79edb6d87377bab6d879fdb602favboxsync for (i=0; i<pContext->client.vertexArrayStackDepth; ++i)
bf144aab354eaec8ee22b16b1c138f47f38b7244vboxsync {
e42c49edebbc79edb6d87377bab6d879fdb602favboxsync CRVertexArrays *pArray = &pContext->client.vertexArrayStack[i];
e42c49edebbc79edb6d87377bab6d879fdb602favboxsync for (j=0; j<CRSTATECLIENT_MAX_VERTEXARRAYS; ++j)
e42c49edebbc79edb6d87377bab6d879fdb602favboxsync {
e42c49edebbc79edb6d87377bab6d879fdb602favboxsync rc = crStateSaveClientPointer(pArray, j, pSSM);
e42c49edebbc79edb6d87377bab6d879fdb602favboxsync AssertRCReturn(rc, rc);
e42c49edebbc79edb6d87377bab6d879fdb602favboxsync }
bf144aab354eaec8ee22b16b1c138f47f38b7244vboxsync }
bf144aab354eaec8ee22b16b1c138f47f38b7244vboxsync#endif /*CR_ARB_vertex_buffer_object*/
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* Save pixel/vertex programs */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync ui32 = crHashtableNumElements(pContext->program.programHash);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync rc = SSMR3PutU32(pSSM, ui32);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync AssertRCReturn(rc, rc);
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 AssertRCReturn(rc, rc);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync rc = SSMR3PutU32(pSSM, pContext->program.currentFragmentProgram->id);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync AssertRCReturn(rc, rc);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* This one is unused it seems*/
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRASSERT(!pContext->program.errorString);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
bd810d58866067df322ea7f4a4627d9bdebb70d3vboxsync#ifdef CR_EXT_framebuffer_object
bd810d58866067df322ea7f4a4627d9bdebb70d3vboxsync /* Save FBOs */
c62d2520ac91e12cf4665c936f490dd2064152d3vboxsync if (bSaveShared)
c62d2520ac91e12cf4665c936f490dd2064152d3vboxsync {
c62d2520ac91e12cf4665c936f490dd2064152d3vboxsync ui32 = crHashtableNumElements(pContext->shared->fbTable);
c62d2520ac91e12cf4665c936f490dd2064152d3vboxsync rc = SSMR3PutU32(pSSM, ui32);
c62d2520ac91e12cf4665c936f490dd2064152d3vboxsync AssertRCReturn(rc, rc);
c62d2520ac91e12cf4665c936f490dd2064152d3vboxsync crHashtableWalk(pContext->shared->fbTable, crStateSaveFramebuffersCB, pSSM);
c62d2520ac91e12cf4665c936f490dd2064152d3vboxsync ui32 = crHashtableNumElements(pContext->shared->rbTable);
c62d2520ac91e12cf4665c936f490dd2064152d3vboxsync rc = SSMR3PutU32(pSSM, ui32);
c62d2520ac91e12cf4665c936f490dd2064152d3vboxsync AssertRCReturn(rc, rc);
c62d2520ac91e12cf4665c936f490dd2064152d3vboxsync crHashtableWalk(pContext->shared->rbTable, crStateSaveRenderbuffersCB, pSSM);
c62d2520ac91e12cf4665c936f490dd2064152d3vboxsync }
061bebe04c5bfa05ed733d2a1204389c2a0c96a8vboxsync rc = SSMR3PutU32(pSSM, pContext->framebufferobject.drawFB?pContext->framebufferobject.drawFB->id:0);
061bebe04c5bfa05ed733d2a1204389c2a0c96a8vboxsync AssertRCReturn(rc, rc);
061bebe04c5bfa05ed733d2a1204389c2a0c96a8vboxsync rc = SSMR3PutU32(pSSM, pContext->framebufferobject.readFB?pContext->framebufferobject.readFB->id:0);
bd810d58866067df322ea7f4a4627d9bdebb70d3vboxsync AssertRCReturn(rc, rc);
bd810d58866067df322ea7f4a4627d9bdebb70d3vboxsync rc = SSMR3PutU32(pSSM, pContext->framebufferobject.renderbuffer?pContext->framebufferobject.renderbuffer->id:0);
bd810d58866067df322ea7f4a4627d9bdebb70d3vboxsync AssertRCReturn(rc, rc);
bd810d58866067df322ea7f4a4627d9bdebb70d3vboxsync#endif
bd810d58866067df322ea7f4a4627d9bdebb70d3vboxsync
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync#ifdef CR_OPENGL_VERSION_2_0
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync /* Save GLSL related info */
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync ui32 = crHashtableNumElements(pContext->glsl.shaders);
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync rc = SSMR3PutU32(pSSM, ui32);
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync AssertRCReturn(rc, rc);
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync crHashtableWalk(pContext->glsl.shaders, crStateSaveGLSLShaderCB, pSSM);
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync ui32 = crHashtableNumElements(pContext->glsl.programs);
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync rc = SSMR3PutU32(pSSM, ui32);
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync AssertRCReturn(rc, rc);
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync crHashtableWalk(pContext->glsl.programs, crStateSaveGLSLProgramCB, pSSM);
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync rc = SSMR3PutU32(pSSM, pContext->glsl.activeProgram?pContext->glsl.activeProgram->id:0);
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync AssertRCReturn(rc, rc);
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync#endif
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync
f11a163be74ca22a873fc5437f7e2cbf6ab7a564vboxsync {
f11a163be74ca22a873fc5437f7e2cbf6ab7a564vboxsync CRViewportState *pVP = &pContext->viewport;
f11a163be74ca22a873fc5437f7e2cbf6ab7a564vboxsync CRPixelPackState packing = pContext->client.pack;
f11a163be74ca22a873fc5437f7e2cbf6ab7a564vboxsync GLint cbData = crPixelSize(GL_RGBA, GL_UNSIGNED_BYTE) * pVP->viewportH * pVP->viewportW;
f11a163be74ca22a873fc5437f7e2cbf6ab7a564vboxsync void *pData = crAlloc(cbData);
f11a163be74ca22a873fc5437f7e2cbf6ab7a564vboxsync
f11a163be74ca22a873fc5437f7e2cbf6ab7a564vboxsync if (!pData)
f11a163be74ca22a873fc5437f7e2cbf6ab7a564vboxsync {
f11a163be74ca22a873fc5437f7e2cbf6ab7a564vboxsync return VERR_NO_MEMORY;
f11a163be74ca22a873fc5437f7e2cbf6ab7a564vboxsync }
f11a163be74ca22a873fc5437f7e2cbf6ab7a564vboxsync
f11a163be74ca22a873fc5437f7e2cbf6ab7a564vboxsync diff_api.PixelStorei(GL_PACK_SKIP_ROWS, 0);
f11a163be74ca22a873fc5437f7e2cbf6ab7a564vboxsync diff_api.PixelStorei(GL_PACK_SKIP_PIXELS, 0);
f11a163be74ca22a873fc5437f7e2cbf6ab7a564vboxsync diff_api.PixelStorei(GL_PACK_ALIGNMENT, 1);
f11a163be74ca22a873fc5437f7e2cbf6ab7a564vboxsync diff_api.PixelStorei(GL_PACK_ROW_LENGTH, 0);
f11a163be74ca22a873fc5437f7e2cbf6ab7a564vboxsync diff_api.PixelStorei(GL_PACK_IMAGE_HEIGHT, 0);
f11a163be74ca22a873fc5437f7e2cbf6ab7a564vboxsync diff_api.PixelStorei(GL_PACK_SKIP_IMAGES, 0);
f11a163be74ca22a873fc5437f7e2cbf6ab7a564vboxsync diff_api.PixelStorei(GL_PACK_SWAP_BYTES, 0);
f11a163be74ca22a873fc5437f7e2cbf6ab7a564vboxsync diff_api.PixelStorei(GL_PACK_LSB_FIRST, 0);
f11a163be74ca22a873fc5437f7e2cbf6ab7a564vboxsync
509a2f53cb92e3bf060f4615936354188ce92836vboxsync diff_api.ReadBuffer(GL_FRONT);
f11a163be74ca22a873fc5437f7e2cbf6ab7a564vboxsync diff_api.ReadPixels(0, 0, pVP->viewportW, pVP->viewportH, GL_RGBA, GL_UNSIGNED_BYTE, pData);
f11a163be74ca22a873fc5437f7e2cbf6ab7a564vboxsync
509a2f53cb92e3bf060f4615936354188ce92836vboxsync diff_api.ReadBuffer(pContext->framebufferobject.readFB ?
509a2f53cb92e3bf060f4615936354188ce92836vboxsync pContext->framebufferobject.readFB->readbuffer : pContext->buffer.readBuffer);
f11a163be74ca22a873fc5437f7e2cbf6ab7a564vboxsync diff_api.PixelStorei(GL_PACK_SKIP_ROWS, packing.skipRows);
f11a163be74ca22a873fc5437f7e2cbf6ab7a564vboxsync diff_api.PixelStorei(GL_PACK_SKIP_PIXELS, packing.skipPixels);
f11a163be74ca22a873fc5437f7e2cbf6ab7a564vboxsync diff_api.PixelStorei(GL_PACK_ALIGNMENT, packing.alignment);
f11a163be74ca22a873fc5437f7e2cbf6ab7a564vboxsync diff_api.PixelStorei(GL_PACK_ROW_LENGTH, packing.rowLength);
f11a163be74ca22a873fc5437f7e2cbf6ab7a564vboxsync diff_api.PixelStorei(GL_PACK_IMAGE_HEIGHT, packing.imageHeight);
f11a163be74ca22a873fc5437f7e2cbf6ab7a564vboxsync diff_api.PixelStorei(GL_PACK_SKIP_IMAGES, packing.skipImages);
f11a163be74ca22a873fc5437f7e2cbf6ab7a564vboxsync diff_api.PixelStorei(GL_PACK_SWAP_BYTES, packing.swapBytes);
f11a163be74ca22a873fc5437f7e2cbf6ab7a564vboxsync diff_api.PixelStorei(GL_PACK_LSB_FIRST, packing.psLSBFirst);
f11a163be74ca22a873fc5437f7e2cbf6ab7a564vboxsync
f11a163be74ca22a873fc5437f7e2cbf6ab7a564vboxsync rc = SSMR3PutMem(pSSM, pData, cbData);
f11a163be74ca22a873fc5437f7e2cbf6ab7a564vboxsync AssertRCReturn(rc, rc);
f11a163be74ca22a873fc5437f7e2cbf6ab7a564vboxsync
f11a163be74ca22a873fc5437f7e2cbf6ab7a564vboxsync crFree(pData);
f11a163be74ca22a873fc5437f7e2cbf6ab7a564vboxsync }
f11a163be74ca22a873fc5437f7e2cbf6ab7a564vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync return VINF_SUCCESS;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync}
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
c62d2520ac91e12cf4665c936f490dd2064152d3vboxsynctypedef struct _crFindSharedCtxParms {
c62d2520ac91e12cf4665c936f490dd2064152d3vboxsync CRContext *pSrcCtx, *pDstCtx;
c62d2520ac91e12cf4665c936f490dd2064152d3vboxsync} crFindSharedCtxParms_t;
c62d2520ac91e12cf4665c936f490dd2064152d3vboxsync
c62d2520ac91e12cf4665c936f490dd2064152d3vboxsyncstatic void crStateFindSharedCB(unsigned long key, void *data1, void *data2)
c62d2520ac91e12cf4665c936f490dd2064152d3vboxsync{
c62d2520ac91e12cf4665c936f490dd2064152d3vboxsync CRContext *pContext = (CRContext *) data1;
c62d2520ac91e12cf4665c936f490dd2064152d3vboxsync crFindSharedCtxParms_t *pParms = (crFindSharedCtxParms_t *) data2;
c62d2520ac91e12cf4665c936f490dd2064152d3vboxsync (void) key;
c62d2520ac91e12cf4665c936f490dd2064152d3vboxsync
c62d2520ac91e12cf4665c936f490dd2064152d3vboxsync if (pContext!=pParms->pSrcCtx && pContext->shared->id==pParms->pSrcCtx->shared->id)
c62d2520ac91e12cf4665c936f490dd2064152d3vboxsync {
c62d2520ac91e12cf4665c936f490dd2064152d3vboxsync pParms->pDstCtx->shared = pContext->shared;
c62d2520ac91e12cf4665c936f490dd2064152d3vboxsync }
c62d2520ac91e12cf4665c936f490dd2064152d3vboxsync}
c62d2520ac91e12cf4665c936f490dd2064152d3vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#define SLC_COPYPTR(ptr) pTmpContext->ptr = pContext->ptr
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#define SLC_ASSSERT_NULL_PTR(ptr) CRASSERT(!pContext->ptr)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
c62d2520ac91e12cf4665c936f490dd2064152d3vboxsyncint32_t crStateLoadContext(CRContext *pContext, CRHashTable * pCtxTable, PSSMHANDLE pSSM)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync{
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRContext* pTmpContext;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync int32_t rc, i, j;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync uint32_t uiNumElems, ui, k;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync unsigned long key;
c62d2520ac91e12cf4665c936f490dd2064152d3vboxsync GLboolean bLoadShared = GL_TRUE;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRASSERT(pContext && pSSM);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* This one is rather big for stack allocation and causes macs to crash */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync pTmpContext = (CRContext*)crAlloc(sizeof(*pTmpContext));
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (!pTmpContext)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync return VERR_NO_MEMORY;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync rc = SSMR3GetMem(pSSM, pTmpContext, sizeof(*pTmpContext));
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync AssertRCReturn(rc, rc);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
c62d2520ac91e12cf4665c936f490dd2064152d3vboxsync /* Deal with shared state */
c62d2520ac91e12cf4665c936f490dd2064152d3vboxsync {
c62d2520ac91e12cf4665c936f490dd2064152d3vboxsync crFindSharedCtxParms_t parms;
c62d2520ac91e12cf4665c936f490dd2064152d3vboxsync
c62d2520ac91e12cf4665c936f490dd2064152d3vboxsync rc = SSMR3GetS32(pSSM, &pContext->shared->id);
c62d2520ac91e12cf4665c936f490dd2064152d3vboxsync AssertRCReturn(rc, rc);
c62d2520ac91e12cf4665c936f490dd2064152d3vboxsync
c62d2520ac91e12cf4665c936f490dd2064152d3vboxsync pTmpContext->shared = NULL;
c62d2520ac91e12cf4665c936f490dd2064152d3vboxsync parms.pSrcCtx = pContext;
c62d2520ac91e12cf4665c936f490dd2064152d3vboxsync parms.pDstCtx = pTmpContext;
c62d2520ac91e12cf4665c936f490dd2064152d3vboxsync crHashtableWalk(pCtxTable, crStateFindSharedCB, &parms);
c62d2520ac91e12cf4665c936f490dd2064152d3vboxsync
c62d2520ac91e12cf4665c936f490dd2064152d3vboxsync if (pTmpContext->shared)
c62d2520ac91e12cf4665c936f490dd2064152d3vboxsync {
c62d2520ac91e12cf4665c936f490dd2064152d3vboxsync CRASSERT(pContext->shared->refCount==1 && pTmpContext->shared->refCount>1);
c62d2520ac91e12cf4665c936f490dd2064152d3vboxsync bLoadShared = GL_FALSE;
c62d2520ac91e12cf4665c936f490dd2064152d3vboxsync crStateFreeShared(pContext->shared);
c62d2520ac91e12cf4665c936f490dd2064152d3vboxsync pContext->shared = NULL;
c62d2520ac91e12cf4665c936f490dd2064152d3vboxsync }
c62d2520ac91e12cf4665c936f490dd2064152d3vboxsync else
c62d2520ac91e12cf4665c936f490dd2064152d3vboxsync {
c62d2520ac91e12cf4665c936f490dd2064152d3vboxsync SLC_COPYPTR(shared);
c62d2520ac91e12cf4665c936f490dd2064152d3vboxsync }
c62d2520ac91e12cf4665c936f490dd2064152d3vboxsync }
c62d2520ac91e12cf4665c936f490dd2064152d3vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync SLC_COPYPTR(flush_func);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync SLC_COPYPTR(flush_arg);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
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 {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync SLC_ASSSERT_NULL_PTR(attrib.enableStack[i].clip);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync SLC_ASSSERT_NULL_PTR(attrib.enableStack[i].light);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
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
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync for (j=0; j<GLEVAL_TOT; ++j)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync SLC_ASSSERT_NULL_PTR(attrib.evalStack[i].eval1D[j].coeff);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync SLC_ASSSERT_NULL_PTR(attrib.evalStack[i].eval2D[j].coeff);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#ifdef CR_ARB_vertex_buffer_object
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync SLC_COPYPTR(bufferobject.nullBuffer);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#endif
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
bf144aab354eaec8ee22b16b1c138f47f38b7244vboxsync/*@todo, that should be removed probably as those should hold the offset values, so loading should be fine
bf144aab354eaec8ee22b16b1c138f47f38b7244vboxsync but better check*/
bf144aab354eaec8ee22b16b1c138f47f38b7244vboxsync#if 0
bf144aab354eaec8ee22b16b1c138f47f38b7244vboxsync#ifdef CR_EXT_compiled_vertex_array
bf144aab354eaec8ee22b16b1c138f47f38b7244vboxsync SLC_COPYPTR(client.array.v.prevPtr);
bf144aab354eaec8ee22b16b1c138f47f38b7244vboxsync SLC_COPYPTR(client.array.c.prevPtr);
bf144aab354eaec8ee22b16b1c138f47f38b7244vboxsync SLC_COPYPTR(client.array.f.prevPtr);
bf144aab354eaec8ee22b16b1c138f47f38b7244vboxsync SLC_COPYPTR(client.array.s.prevPtr);
bf144aab354eaec8ee22b16b1c138f47f38b7244vboxsync SLC_COPYPTR(client.array.e.prevPtr);
bf144aab354eaec8ee22b16b1c138f47f38b7244vboxsync SLC_COPYPTR(client.array.i.prevPtr);
bf144aab354eaec8ee22b16b1c138f47f38b7244vboxsync SLC_COPYPTR(client.array.n.prevPtr);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync for (i = 0 ; i < CR_MAX_TEXTURE_UNITS ; i++)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync {
bf144aab354eaec8ee22b16b1c138f47f38b7244vboxsync SLC_COPYPTR(client.array.t[i].prevPtr);
bf144aab354eaec8ee22b16b1c138f47f38b7244vboxsync }
bf144aab354eaec8ee22b16b1c138f47f38b7244vboxsync
bf144aab354eaec8ee22b16b1c138f47f38b7244vboxsync# ifdef CR_NV_vertex_program
bf144aab354eaec8ee22b16b1c138f47f38b7244vboxsync for (i = 0; i < CR_MAX_VERTEX_ATTRIBS; i++)
bf144aab354eaec8ee22b16b1c138f47f38b7244vboxsync {
bf144aab354eaec8ee22b16b1c138f47f38b7244vboxsync SLC_COPYPTR(client.array.a[i].prevPtr);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
bf144aab354eaec8ee22b16b1c138f47f38b7244vboxsync# endif
bf144aab354eaec8ee22b16b1c138f47f38b7244vboxsync#endif
bf144aab354eaec8ee22b16b1c138f47f38b7244vboxsync#endif
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
bf144aab354eaec8ee22b16b1c138f47f38b7244vboxsync#ifdef CR_ARB_vertex_buffer_object
bf144aab354eaec8ee22b16b1c138f47f38b7244vboxsync /*That just sets those pointers to NULL*/
bf144aab354eaec8ee22b16b1c138f47f38b7244vboxsync SLC_COPYPTR(client.array.v.buffer);
bf144aab354eaec8ee22b16b1c138f47f38b7244vboxsync SLC_COPYPTR(client.array.c.buffer);
bf144aab354eaec8ee22b16b1c138f47f38b7244vboxsync SLC_COPYPTR(client.array.f.buffer);
bf144aab354eaec8ee22b16b1c138f47f38b7244vboxsync SLC_COPYPTR(client.array.s.buffer);
bf144aab354eaec8ee22b16b1c138f47f38b7244vboxsync SLC_COPYPTR(client.array.e.buffer);
bf144aab354eaec8ee22b16b1c138f47f38b7244vboxsync SLC_COPYPTR(client.array.i.buffer);
bf144aab354eaec8ee22b16b1c138f47f38b7244vboxsync SLC_COPYPTR(client.array.n.buffer);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync for (i = 0 ; i < CR_MAX_TEXTURE_UNITS ; i++)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync {
bf144aab354eaec8ee22b16b1c138f47f38b7244vboxsync SLC_COPYPTR(client.array.t[i].buffer);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
bf144aab354eaec8ee22b16b1c138f47f38b7244vboxsync# ifdef CR_NV_vertex_program
bf144aab354eaec8ee22b16b1c138f47f38b7244vboxsync for (i = 0; i < CR_MAX_VERTEX_ATTRIBS; i++)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync {
bf144aab354eaec8ee22b16b1c138f47f38b7244vboxsync SLC_COPYPTR(client.array.a[i].buffer);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
bf144aab354eaec8ee22b16b1c138f47f38b7244vboxsync# endif
bf144aab354eaec8ee22b16b1c138f47f38b7244vboxsync#endif /*CR_ARB_vertex_buffer_object*/
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /*@todo CR_NV_vertex_program*/
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crStateCopyEvalPtrs1D(pTmpContext->eval.eval1D, pContext->eval.eval1D);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crStateCopyEvalPtrs2D(pTmpContext->eval.eval2D, pContext->eval.eval2D);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync SLC_COPYPTR(feedback.buffer); /*@todo*/
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync SLC_COPYPTR(selection.buffer); /*@todo*/
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync SLC_COPYPTR(lighting.light);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /*This one could be tricky if we're loading snapshot on host with different GPU*/
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync SLC_COPYPTR(limits.extensions);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#if CR_ARB_occlusion_query
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync SLC_COPYPTR(occlusion.objects); /*@todo*/
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#endif
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync SLC_COPYPTR(program.errorString);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync SLC_COPYPTR(program.programHash);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync SLC_COPYPTR(program.defaultVertexProgram);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync SLC_COPYPTR(program.defaultFragmentProgram);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* Texture pointers */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync for (i=0; i<6; ++i)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync SLC_COPYPTR(texture.base1D.level[i]);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync SLC_COPYPTR(texture.base2D.level[i]);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync SLC_COPYPTR(texture.base3D.level[i]);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync SLC_COPYPTR(texture.proxy1D.level[i]);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync SLC_COPYPTR(texture.proxy2D.level[i]);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync SLC_COPYPTR(texture.proxy3D.level[i]);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#ifdef CR_ARB_texture_cube_map
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync SLC_COPYPTR(texture.baseCubeMap.level[i]);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync SLC_COPYPTR(texture.proxyCubeMap.level[i]);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#endif
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#ifdef CR_NV_texture_rectangle
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync SLC_COPYPTR(texture.baseRect.level[i]);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync SLC_COPYPTR(texture.proxyRect.level[i]);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#endif
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* Load transform state */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync SLC_COPYPTR(transform.clipPlane);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync SLC_COPYPTR(transform.clip);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* Don't have to worry about pContext->transform.current as it'd be set in crStateSetCurrent call */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /*SLC_COPYPTR(transform.currentStack);*/
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync SLC_COPYPTR(transform.modelViewStack.stack);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync SLC_COPYPTR(transform.projectionStack.stack);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync SLC_COPYPTR(transform.colorStack.stack);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync for (i = 0 ; i < CR_MAX_TEXTURE_UNITS ; i++)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync SLC_COPYPTR(transform.textureStack[i].stack);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync for (i = 0 ; i < CR_MAX_PROGRAM_MATRICES ; i++)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync SLC_COPYPTR(transform.programStack[i].stack);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync#ifdef CR_OPENGL_VERSION_2_0
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync SLC_COPYPTR(glsl.shaders);
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync SLC_COPYPTR(glsl.programs);
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync#endif
bd810d58866067df322ea7f4a4627d9bdebb70d3vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* Have to preserve original context id */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRASSERT(pTmpContext->id == pContext->id);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* Copy ordinary state to real context */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crMemcpy(pContext, pTmpContext, sizeof(*pTmpContext));
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crFree(pTmpContext);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync pTmpContext = NULL;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* Now deal with pointers */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* Load transform state */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync rc = SSMR3GetMem(pSSM, pContext->transform.clipPlane, sizeof(GLvectord)*CR_MAX_CLIP_PLANES);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync AssertRCReturn(rc, rc);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync rc = SSMR3GetMem(pSSM, pContext->transform.clip, sizeof(GLboolean)*CR_MAX_CLIP_PLANES);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync AssertRCReturn(rc, rc);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync rc = crStateLoadMatrixStack(&pContext->transform.modelViewStack, pSSM);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync AssertRCReturn(rc, rc);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync rc = crStateLoadMatrixStack(&pContext->transform.projectionStack, pSSM);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync AssertRCReturn(rc, rc);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync rc = crStateLoadMatrixStack(&pContext->transform.colorStack, pSSM);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync AssertRCReturn(rc, rc);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync for (i = 0 ; i < CR_MAX_TEXTURE_UNITS ; i++)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync rc = crStateLoadMatrixStack(&pContext->transform.textureStack[i], pSSM);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync AssertRCReturn(rc, rc);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync for (i = 0 ; i < CR_MAX_PROGRAM_MATRICES ; i++)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync rc = crStateLoadMatrixStack(&pContext->transform.programStack[i], pSSM);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync AssertRCReturn(rc, rc);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* Load Textures */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync rc = crStateLoadTextureObjData(&pContext->texture.base1D, pSSM);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync AssertRCReturn(rc, rc);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync rc = crStateLoadTextureObjData(&pContext->texture.base2D, pSSM);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync AssertRCReturn(rc, rc);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync rc = crStateLoadTextureObjData(&pContext->texture.base3D, pSSM);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync AssertRCReturn(rc, rc);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync rc = crStateLoadTextureObjData(&pContext->texture.proxy1D, pSSM);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync AssertRCReturn(rc, rc);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync rc = crStateLoadTextureObjData(&pContext->texture.proxy2D, pSSM);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync AssertRCReturn(rc, rc);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync rc = crStateLoadTextureObjData(&pContext->texture.proxy3D, pSSM);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync AssertRCReturn(rc, rc);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#ifdef CR_ARB_texture_cube_map
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync rc = crStateLoadTextureObjData(&pContext->texture.baseCubeMap, pSSM);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync AssertRCReturn(rc, rc);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync rc = crStateLoadTextureObjData(&pContext->texture.proxyCubeMap, pSSM);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync AssertRCReturn(rc, rc);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#endif
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#ifdef CR_NV_texture_rectangle
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync rc = crStateLoadTextureObjData(&pContext->texture.baseRect, pSSM);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync AssertRCReturn(rc, rc);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync rc = crStateLoadTextureObjData(&pContext->texture.proxyRect, pSSM);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync AssertRCReturn(rc, rc);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#endif
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
c62d2520ac91e12cf4665c936f490dd2064152d3vboxsync if (bLoadShared)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync {
c62d2520ac91e12cf4665c936f490dd2064152d3vboxsync /* Load shared textures */
c62d2520ac91e12cf4665c936f490dd2064152d3vboxsync CRASSERT(pContext->shared && pContext->shared->textureTable);
c62d2520ac91e12cf4665c936f490dd2064152d3vboxsync rc = SSMR3GetU32(pSSM, &uiNumElems);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync AssertRCReturn(rc, rc);
c62d2520ac91e12cf4665c936f490dd2064152d3vboxsync for (ui=0; ui<uiNumElems; ++ui)
c62d2520ac91e12cf4665c936f490dd2064152d3vboxsync {
c62d2520ac91e12cf4665c936f490dd2064152d3vboxsync CRTextureObj *pTexture;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
c62d2520ac91e12cf4665c936f490dd2064152d3vboxsync rc = SSMR3GetMem(pSSM, &key, sizeof(key));
c62d2520ac91e12cf4665c936f490dd2064152d3vboxsync AssertRCReturn(rc, rc);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
c62d2520ac91e12cf4665c936f490dd2064152d3vboxsync pTexture = (CRTextureObj *) crCalloc(sizeof(CRTextureObj));
c62d2520ac91e12cf4665c936f490dd2064152d3vboxsync if (!pTexture) return VERR_NO_MEMORY;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
c62d2520ac91e12cf4665c936f490dd2064152d3vboxsync rc = SSMR3GetMem(pSSM, pTexture, sizeof(*pTexture));
c62d2520ac91e12cf4665c936f490dd2064152d3vboxsync AssertRCReturn(rc, rc);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
c62d2520ac91e12cf4665c936f490dd2064152d3vboxsync pTexture->hwid = 0;
c62d2520ac91e12cf4665c936f490dd2064152d3vboxsync
c62d2520ac91e12cf4665c936f490dd2064152d3vboxsync /*allocate actual memory*/
c62d2520ac91e12cf4665c936f490dd2064152d3vboxsync for (i=0; i<6; ++i) {
c62d2520ac91e12cf4665c936f490dd2064152d3vboxsync pTexture->level[i] = (CRTextureLevel *) crCalloc(sizeof(CRTextureLevel) * CR_MAX_MIPMAP_LEVELS);
c62d2520ac91e12cf4665c936f490dd2064152d3vboxsync if (!pTexture->level[i]) return VERR_NO_MEMORY;
c62d2520ac91e12cf4665c936f490dd2064152d3vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
c62d2520ac91e12cf4665c936f490dd2064152d3vboxsync rc = crStateLoadTextureObjData(pTexture, pSSM);
c62d2520ac91e12cf4665c936f490dd2064152d3vboxsync AssertRCReturn(rc, rc);
c62d2520ac91e12cf4665c936f490dd2064152d3vboxsync
c62d2520ac91e12cf4665c936f490dd2064152d3vboxsync crHashtableAdd(pContext->shared->textureTable, key, pTexture);
c62d2520ac91e12cf4665c936f490dd2064152d3vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* Load current texture pointers */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync for (i=0; i<CR_MAX_TEXTURE_UNITS; ++i)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync rc = crStateLoadTexUnitCurrentTexturePtrs(&pContext->texture.unit[i], pContext, pSSM);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync AssertRCReturn(rc, rc);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* Mark textures for resending to GPU */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync pContext->texture.bResyncNeeded = GL_TRUE;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* Load lights */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRASSERT(pContext->lighting.light);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync rc = SSMR3GetMem(pSSM, pContext->lighting.light, CR_MAX_LIGHTS * sizeof(*pContext->lighting.light));
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync AssertRCReturn(rc, rc);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* Load attrib stack*/
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync for ( i = 0 ; i < CR_MAX_ATTRIB_STACK_DEPTH ; i++)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (pContext->attrib.enableStack[i].clip)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync {
885ac2b8c00cb7f4878e9108f40e1a43ff756e35vboxsync rc = crStateAllocAndSSMR3GetMem(pSSM, (void**)&pContext->attrib.enableStack[i].clip,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync pContext->limits.maxClipPlanes*sizeof(GLboolean));
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync AssertRCReturn(rc, rc);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (pContext->attrib.enableStack[i].light)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync {
885ac2b8c00cb7f4878e9108f40e1a43ff756e35vboxsync rc = crStateAllocAndSSMR3GetMem(pSSM, (void**)&pContext->attrib.enableStack[i].light,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync pContext->limits.maxLights*sizeof(GLboolean));
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync AssertRCReturn(rc, rc);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (pContext->attrib.lightingStack[i].light)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync {
885ac2b8c00cb7f4878e9108f40e1a43ff756e35vboxsync rc = crStateAllocAndSSMR3GetMem(pSSM, (void**)&pContext->attrib.lightingStack[i].light,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync pContext->limits.maxLights*sizeof(CRLight));
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync AssertRCReturn(rc, rc);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync for (k=0; k<pContext->limits.maxTextureUnits; ++k)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync rc = crStateLoadTexUnitCurrentTexturePtrs(&pContext->attrib.textureStack[i].unit[k], pContext, pSSM);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync AssertRCReturn(rc, rc);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (pContext->attrib.transformStack[i].clip)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync {
885ac2b8c00cb7f4878e9108f40e1a43ff756e35vboxsync rc = crStateAllocAndSSMR3GetMem(pSSM, (void*)&pContext->attrib.transformStack[i].clip,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync pContext->limits.maxClipPlanes*sizeof(GLboolean));
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync AssertRCReturn(rc, rc);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (pContext->attrib.transformStack[i].clipPlane)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync {
885ac2b8c00cb7f4878e9108f40e1a43ff756e35vboxsync rc = crStateAllocAndSSMR3GetMem(pSSM, (void**)&pContext->attrib.transformStack[i].clipPlane,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync pContext->limits.maxClipPlanes*sizeof(GLvectord));
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync AssertRCReturn(rc, rc);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync rc = crSateLoadEvalCoeffs1D(pContext->attrib.evalStack[i].eval1D, GL_TRUE, pSSM);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync AssertRCReturn(rc, rc);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync rc = crSateLoadEvalCoeffs2D(pContext->attrib.evalStack[i].eval2D, GL_TRUE, pSSM);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync AssertRCReturn(rc, rc);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* Load evaluator coeffs */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync rc = crSateLoadEvalCoeffs1D(pContext->eval.eval1D, GL_FALSE, pSSM);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync AssertRCReturn(rc, rc);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync rc = crSateLoadEvalCoeffs2D(pContext->eval.eval2D, GL_FALSE, pSSM);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync AssertRCReturn(rc, rc);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* Load buffer objects */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#ifdef CR_ARB_vertex_buffer_object
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync rc = SSMR3GetU32(pSSM, &uiNumElems);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync AssertRCReturn(rc, rc);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync for (ui=0; ui<=uiNumElems; ++ui) /*ui<=uiNumElems to load nullBuffer in same loop*/
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRBufferObject *pBufferObj;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync rc = SSMR3GetMem(pSSM, &key, sizeof(key));
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync AssertRCReturn(rc, rc);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* default one should be already allocated */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (key==0)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync pBufferObj = pContext->bufferobject.nullBuffer;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (!pBufferObj) return VERR_SSM_UNEXPECTED_DATA;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync else
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync pBufferObj = (CRBufferObject *) crCalloc(sizeof(*pBufferObj));
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (!pBufferObj) return VERR_NO_MEMORY;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync rc = SSMR3GetMem(pSSM, pBufferObj, sizeof(*pBufferObj));
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync AssertRCReturn(rc, rc);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
c62d2520ac91e12cf4665c936f490dd2064152d3vboxsync pBufferObj->hwid = 0;
c62d2520ac91e12cf4665c936f490dd2064152d3vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (pBufferObj->data)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRASSERT(pBufferObj->size>0);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync pBufferObj->data = crAlloc(pBufferObj->size);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync rc = SSMR3GetMem(pSSM, pBufferObj->data, pBufferObj->size);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync AssertRCReturn(rc, rc);
bf144aab354eaec8ee22b16b1c138f47f38b7244vboxsync }
c62d2520ac91e12cf4665c936f490dd2064152d3vboxsync else if (pBufferObj->id!=0 && pBufferObj->size>0)
bf144aab354eaec8ee22b16b1c138f47f38b7244vboxsync {
bf144aab354eaec8ee22b16b1c138f47f38b7244vboxsync rc = SSMR3GetMem(pSSM, &pBufferObj->data, sizeof(pBufferObj->data));
bf144aab354eaec8ee22b16b1c138f47f38b7244vboxsync AssertRCReturn(rc, rc);
bf144aab354eaec8ee22b16b1c138f47f38b7244vboxsync
bf144aab354eaec8ee22b16b1c138f47f38b7244vboxsync if (pBufferObj->data)
bf144aab354eaec8ee22b16b1c138f47f38b7244vboxsync {
bf144aab354eaec8ee22b16b1c138f47f38b7244vboxsync pBufferObj->data = crAlloc(pBufferObj->size);
bf144aab354eaec8ee22b16b1c138f47f38b7244vboxsync rc = SSMR3GetMem(pSSM, pBufferObj->data, pBufferObj->size);
bf144aab354eaec8ee22b16b1c138f47f38b7244vboxsync AssertRCReturn(rc, rc);
bf144aab354eaec8ee22b16b1c138f47f38b7244vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
bf144aab354eaec8ee22b16b1c138f47f38b7244vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (key!=0)
c62d2520ac91e12cf4665c936f490dd2064152d3vboxsync crHashtableAdd(pContext->shared->buffersTable, key, pBufferObj);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* Load pointers */
c62d2520ac91e12cf4665c936f490dd2064152d3vboxsync#define CRS_GET_BO(name) (((name)==0) ? (pContext->bufferobject.nullBuffer) : crHashtableSearch(pContext->shared->buffersTable, name))
bf144aab354eaec8ee22b16b1c138f47f38b7244vboxsync rc = SSMR3GetU32(pSSM, &ui);
bf144aab354eaec8ee22b16b1c138f47f38b7244vboxsync AssertRCReturn(rc, rc);
bf144aab354eaec8ee22b16b1c138f47f38b7244vboxsync pContext->bufferobject.arrayBuffer = CRS_GET_BO(ui);
bf144aab354eaec8ee22b16b1c138f47f38b7244vboxsync rc = SSMR3GetU32(pSSM, &ui);
bf144aab354eaec8ee22b16b1c138f47f38b7244vboxsync AssertRCReturn(rc, rc);
bf144aab354eaec8ee22b16b1c138f47f38b7244vboxsync pContext->bufferobject.elementsBuffer = CRS_GET_BO(ui);
af8d59d05d72f134aeea62712f1286b369807d52vboxsync#ifdef CR_ARB_pixel_buffer_object
af8d59d05d72f134aeea62712f1286b369807d52vboxsync rc = SSMR3GetU32(pSSM, &ui);
af8d59d05d72f134aeea62712f1286b369807d52vboxsync AssertRCReturn(rc, rc);
af8d59d05d72f134aeea62712f1286b369807d52vboxsync pContext->bufferobject.packBuffer = CRS_GET_BO(ui);
af8d59d05d72f134aeea62712f1286b369807d52vboxsync rc = SSMR3GetU32(pSSM, &ui);
af8d59d05d72f134aeea62712f1286b369807d52vboxsync AssertRCReturn(rc, rc);
af8d59d05d72f134aeea62712f1286b369807d52vboxsync pContext->bufferobject.unpackBuffer = CRS_GET_BO(ui);
af8d59d05d72f134aeea62712f1286b369807d52vboxsync#endif
e42c49edebbc79edb6d87377bab6d879fdb602favboxsync#undef CRS_GET_BO
bf144aab354eaec8ee22b16b1c138f47f38b7244vboxsync
e42c49edebbc79edb6d87377bab6d879fdb602favboxsync /* Load client pointers and array buffer bindings*/
e42c49edebbc79edb6d87377bab6d879fdb602favboxsync for (i=0; i<CRSTATECLIENT_MAX_VERTEXARRAYS; ++i)
bf144aab354eaec8ee22b16b1c138f47f38b7244vboxsync {
e42c49edebbc79edb6d87377bab6d879fdb602favboxsync rc = crStateLoadClientPointer(&pContext->client.array, i, pContext, pSSM);
bf144aab354eaec8ee22b16b1c138f47f38b7244vboxsync AssertRCReturn(rc, rc);
bf144aab354eaec8ee22b16b1c138f47f38b7244vboxsync }
e42c49edebbc79edb6d87377bab6d879fdb602favboxsync for (j=0; j<pContext->client.vertexArrayStackDepth; ++j)
bf144aab354eaec8ee22b16b1c138f47f38b7244vboxsync {
e42c49edebbc79edb6d87377bab6d879fdb602favboxsync CRVertexArrays *pArray = &pContext->client.vertexArrayStack[j];
e42c49edebbc79edb6d87377bab6d879fdb602favboxsync for (i=0; i<CRSTATECLIENT_MAX_VERTEXARRAYS; ++i)
e42c49edebbc79edb6d87377bab6d879fdb602favboxsync {
e42c49edebbc79edb6d87377bab6d879fdb602favboxsync rc = crStateLoadClientPointer(pArray, i, pContext, pSSM);
e42c49edebbc79edb6d87377bab6d879fdb602favboxsync AssertRCReturn(rc, rc);
e42c49edebbc79edb6d87377bab6d879fdb602favboxsync }
bf144aab354eaec8ee22b16b1c138f47f38b7244vboxsync }
bf144aab354eaec8ee22b16b1c138f47f38b7244vboxsync
bf144aab354eaec8ee22b16b1c138f47f38b7244vboxsync pContext->bufferobject.bResyncNeeded = GL_TRUE;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#endif
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* Load pixel/vertex programs */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync rc = SSMR3GetU32(pSSM, &uiNumElems);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync AssertRCReturn(rc, rc);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* Load defauls programs */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync rc = crStateLoadProgram(&pContext->program.defaultVertexProgram, pSSM);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync AssertRCReturn(rc, rc);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync rc = crStateLoadProgram(&pContext->program.defaultFragmentProgram, pSSM);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync AssertRCReturn(rc, rc);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* Load all the rest */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync for (ui=0; ui<uiNumElems; ++ui)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRProgram *pProgram = NULL;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync rc = crStateLoadProgram(&pProgram, pSSM);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync AssertRCReturn(rc, rc);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crHashtableAdd(pContext->program.programHash, pProgram->id, pProgram);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync //DIRTY(pProgram->dirtyProgram, pContext->neg_bitid);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* Load Pointers */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync rc = SSMR3GetU32(pSSM, &ui);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync AssertRCReturn(rc, rc);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync pContext->program.currentVertexProgram = ui==0 ? pContext->program.defaultVertexProgram
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync : crHashtableSearch(pContext->program.programHash, ui);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync rc = SSMR3GetU32(pSSM, &ui);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync AssertRCReturn(rc, rc);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync pContext->program.currentFragmentProgram = ui==0 ? pContext->program.defaultFragmentProgram
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync : crHashtableSearch(pContext->program.programHash, ui);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* Mark programs for resending to GPU */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync pContext->program.bResyncNeeded = GL_TRUE;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
bd810d58866067df322ea7f4a4627d9bdebb70d3vboxsync#ifdef CR_EXT_framebuffer_object
bd810d58866067df322ea7f4a4627d9bdebb70d3vboxsync /* Load FBOs */
c62d2520ac91e12cf4665c936f490dd2064152d3vboxsync if (bLoadShared)
bd810d58866067df322ea7f4a4627d9bdebb70d3vboxsync {
c62d2520ac91e12cf4665c936f490dd2064152d3vboxsync rc = SSMR3GetU32(pSSM, &uiNumElems);
bd810d58866067df322ea7f4a4627d9bdebb70d3vboxsync AssertRCReturn(rc, rc);
c62d2520ac91e12cf4665c936f490dd2064152d3vboxsync for (ui=0; ui<uiNumElems; ++ui)
c62d2520ac91e12cf4665c936f490dd2064152d3vboxsync {
c62d2520ac91e12cf4665c936f490dd2064152d3vboxsync CRFramebufferObject *pFBO;
c62d2520ac91e12cf4665c936f490dd2064152d3vboxsync pFBO = crAlloc(sizeof(*pFBO));
c62d2520ac91e12cf4665c936f490dd2064152d3vboxsync if (!pFBO) return VERR_NO_MEMORY;
bd810d58866067df322ea7f4a4627d9bdebb70d3vboxsync
c62d2520ac91e12cf4665c936f490dd2064152d3vboxsync rc = SSMR3GetMem(pSSM, &key, sizeof(key));
c62d2520ac91e12cf4665c936f490dd2064152d3vboxsync AssertRCReturn(rc, rc);
bd810d58866067df322ea7f4a4627d9bdebb70d3vboxsync
c62d2520ac91e12cf4665c936f490dd2064152d3vboxsync rc = SSMR3GetMem(pSSM, pFBO, sizeof(*pFBO));
c62d2520ac91e12cf4665c936f490dd2064152d3vboxsync AssertRCReturn(rc, rc);
bd810d58866067df322ea7f4a4627d9bdebb70d3vboxsync
c62d2520ac91e12cf4665c936f490dd2064152d3vboxsync crHashtableAdd(pContext->shared->fbTable, key, pFBO);
c62d2520ac91e12cf4665c936f490dd2064152d3vboxsync }
bd810d58866067df322ea7f4a4627d9bdebb70d3vboxsync
c62d2520ac91e12cf4665c936f490dd2064152d3vboxsync rc = SSMR3GetU32(pSSM, &uiNumElems);
bd810d58866067df322ea7f4a4627d9bdebb70d3vboxsync AssertRCReturn(rc, rc);
c62d2520ac91e12cf4665c936f490dd2064152d3vboxsync for (ui=0; ui<uiNumElems; ++ui)
c62d2520ac91e12cf4665c936f490dd2064152d3vboxsync {
c62d2520ac91e12cf4665c936f490dd2064152d3vboxsync CRRenderbufferObject *pRBO;
c62d2520ac91e12cf4665c936f490dd2064152d3vboxsync pRBO = crAlloc(sizeof(*pRBO));
c62d2520ac91e12cf4665c936f490dd2064152d3vboxsync if (!pRBO) return VERR_NO_MEMORY;
bd810d58866067df322ea7f4a4627d9bdebb70d3vboxsync
c62d2520ac91e12cf4665c936f490dd2064152d3vboxsync rc = SSMR3GetMem(pSSM, &key, sizeof(key));
c62d2520ac91e12cf4665c936f490dd2064152d3vboxsync AssertRCReturn(rc, rc);
bd810d58866067df322ea7f4a4627d9bdebb70d3vboxsync
c62d2520ac91e12cf4665c936f490dd2064152d3vboxsync rc = SSMR3GetMem(pSSM, pRBO, sizeof(*pRBO));
c62d2520ac91e12cf4665c936f490dd2064152d3vboxsync AssertRCReturn(rc, rc);
c62d2520ac91e12cf4665c936f490dd2064152d3vboxsync
c62d2520ac91e12cf4665c936f490dd2064152d3vboxsync crHashtableAdd(pContext->shared->rbTable, key, pRBO);
c62d2520ac91e12cf4665c936f490dd2064152d3vboxsync }
bd810d58866067df322ea7f4a4627d9bdebb70d3vboxsync }
bd810d58866067df322ea7f4a4627d9bdebb70d3vboxsync
bd810d58866067df322ea7f4a4627d9bdebb70d3vboxsync rc = SSMR3GetU32(pSSM, &ui);
bd810d58866067df322ea7f4a4627d9bdebb70d3vboxsync AssertRCReturn(rc, rc);
061bebe04c5bfa05ed733d2a1204389c2a0c96a8vboxsync pContext->framebufferobject.drawFB = ui==0 ? NULL
c62d2520ac91e12cf4665c936f490dd2064152d3vboxsync : crHashtableSearch(pContext->shared->fbTable, ui);
061bebe04c5bfa05ed733d2a1204389c2a0c96a8vboxsync
061bebe04c5bfa05ed733d2a1204389c2a0c96a8vboxsync rc = SSMR3GetU32(pSSM, &ui);
061bebe04c5bfa05ed733d2a1204389c2a0c96a8vboxsync AssertRCReturn(rc, rc);
061bebe04c5bfa05ed733d2a1204389c2a0c96a8vboxsync pContext->framebufferobject.readFB = ui==0 ? NULL
c62d2520ac91e12cf4665c936f490dd2064152d3vboxsync : crHashtableSearch(pContext->shared->fbTable, ui);
bd810d58866067df322ea7f4a4627d9bdebb70d3vboxsync
bd810d58866067df322ea7f4a4627d9bdebb70d3vboxsync rc = SSMR3GetU32(pSSM, &ui);
bd810d58866067df322ea7f4a4627d9bdebb70d3vboxsync AssertRCReturn(rc, rc);
bd810d58866067df322ea7f4a4627d9bdebb70d3vboxsync pContext->framebufferobject.renderbuffer = ui==0 ? NULL
c62d2520ac91e12cf4665c936f490dd2064152d3vboxsync : crHashtableSearch(pContext->shared->rbTable, ui);
bd810d58866067df322ea7f4a4627d9bdebb70d3vboxsync
bd810d58866067df322ea7f4a4627d9bdebb70d3vboxsync /* Mark FBOs/RBOs for resending to GPU */
bd810d58866067df322ea7f4a4627d9bdebb70d3vboxsync pContext->framebufferobject.bResyncNeeded = GL_TRUE;
bd810d58866067df322ea7f4a4627d9bdebb70d3vboxsync#endif
bd810d58866067df322ea7f4a4627d9bdebb70d3vboxsync
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync#ifdef CR_OPENGL_VERSION_2_0
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync /* Load GLSL related info */
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync rc = SSMR3GetU32(pSSM, &uiNumElems);
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync AssertRCReturn(rc, rc);
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync for (ui=0; ui<uiNumElems; ++ui)
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync {
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync CRGLSLShader *pShader = crStateLoadGLSLShader(pSSM);
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync if (!pShader) return VERR_SSM_UNEXPECTED_DATA;
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync crHashtableAdd(pContext->glsl.shaders, pShader->id, pShader);
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync }
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync rc = SSMR3GetU32(pSSM, &uiNumElems);
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync AssertRCReturn(rc, rc);
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync for (ui=0; ui<uiNumElems; ++ui)
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync {
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync CRGLSLProgram *pProgram;
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync uint32_t numShaders;
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync pProgram = crAlloc(sizeof(*pProgram));
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync if (!pProgram) return VERR_NO_MEMORY;
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync rc = SSMR3GetMem(pSSM, &key, sizeof(key));
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync AssertRCReturn(rc, rc);
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync rc = SSMR3GetMem(pSSM, pProgram, sizeof(*pProgram));
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync AssertRCReturn(rc, rc);
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync crHashtableAdd(pContext->glsl.programs, key, pProgram);
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync pProgram->currentState.attachedShaders = crAllocHashtable();
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync rc = SSMR3GetU32(pSSM, &numShaders);
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync AssertRCReturn(rc, rc);
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync for (k=0; k<numShaders; ++k)
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync {
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync rc = SSMR3GetMem(pSSM, &key, sizeof(key));
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync AssertRCReturn(rc, rc);
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync crHashtableAdd(pProgram->currentState.attachedShaders, key, crHashtableSearch(pContext->glsl.shaders, key));
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync }
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync if (pProgram->activeState.attachedShaders)
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync {
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync pProgram->activeState.attachedShaders = crAllocHashtable();
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync rc = SSMR3GetU32(pSSM, &numShaders);
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync AssertRCReturn(rc, rc);
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync for (k=0; k<numShaders; ++k)
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync {
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync CRGLSLShader *pShader = crStateLoadGLSLShader(pSSM);
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync if (!pShader) return VERR_SSM_UNEXPECTED_DATA;
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync crHashtableAdd(pProgram->activeState.attachedShaders, pShader->id, pShader);
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync }
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync }
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync if (pProgram->currentState.cAttribs)
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync pProgram->currentState.pAttribs = (CRGLSLAttrib*) crAlloc(pProgram->currentState.cAttribs*sizeof(CRGLSLAttrib));
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync for (k=0; k<pProgram->currentState.cAttribs; ++k)
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync {
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync rc = SSMR3GetMem(pSSM, &pProgram->currentState.pAttribs[k].index, sizeof(pProgram->currentState.pAttribs[k].index));
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync AssertRCReturn(rc, rc);
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync pProgram->currentState.pAttribs[k].name = crStateLoadString(pSSM);
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync }
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync if (pProgram->activeState.cAttribs)
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync pProgram->activeState.pAttribs = (CRGLSLAttrib*) crAlloc(pProgram->activeState.cAttribs*sizeof(CRGLSLAttrib));
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync for (k=0; k<pProgram->activeState.cAttribs; ++k)
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync {
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync rc = SSMR3GetMem(pSSM, &pProgram->activeState.pAttribs[k].index, sizeof(pProgram->activeState.pAttribs[k].index));
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync AssertRCReturn(rc, rc);
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync pProgram->activeState.pAttribs[k].name = crStateLoadString(pSSM);
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync }
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync
4a82b347bce2c97db4707d994221b4c20437b520vboxsync {
4a82b347bce2c97db4707d994221b4c20437b520vboxsync int32_t cUniforms;
4a82b347bce2c97db4707d994221b4c20437b520vboxsync rc = SSMR3GetS32(pSSM, &cUniforms);
4a82b347bce2c97db4707d994221b4c20437b520vboxsync pProgram->cUniforms = cUniforms;
4a82b347bce2c97db4707d994221b4c20437b520vboxsync AssertRCReturn(rc, rc);
4a82b347bce2c97db4707d994221b4c20437b520vboxsync }
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync if (pProgram->cUniforms)
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync {
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync pProgram->pUniforms = crAlloc(pProgram->cUniforms*sizeof(CRGLSLUniform));
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync if (!pProgram) return VERR_NO_MEMORY;
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync for (k=0; k<pProgram->cUniforms; ++k)
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync {
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync size_t itemsize, datasize;
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync rc = SSMR3GetMem(pSSM, &pProgram->pUniforms[k].type, sizeof(GLenum));
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync pProgram->pUniforms[k].name = crStateLoadString(pSSM);
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync
c697d02eb4ededad7e08b2c48428ddb56c844a0avboxsync if (crStateIsIntUniform(pProgram->pUniforms[k].type))
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync {
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync itemsize = sizeof(GLint);
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync } else itemsize = sizeof(GLfloat);
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync datasize = crStateGetUniformSize(pProgram->pUniforms[k].type)*itemsize;
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync pProgram->pUniforms[k].data = crAlloc(datasize);
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync if (!pProgram->pUniforms[k].data) return VERR_NO_MEMORY;
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync rc = SSMR3GetMem(pSSM, pProgram->pUniforms[k].data, datasize);
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync }
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync }
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync }
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync rc = SSMR3GetU32(pSSM, &ui);
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync AssertRCReturn(rc, rc);
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync pContext->glsl.activeProgram = ui==0 ? NULL
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync : crHashtableSearch(pContext->glsl.programs, ui);
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync /*Mark for resending to GPU*/
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync pContext->glsl.bResyncNeeded = GL_TRUE;
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync#endif
6e7c344fc7cdb580356704e8201207b394d367bbvboxsync
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync /*Restore front buffer image*/
f11a163be74ca22a873fc5437f7e2cbf6ab7a564vboxsync {
f11a163be74ca22a873fc5437f7e2cbf6ab7a564vboxsync CRViewportState *pVP = &pContext->viewport;
f11a163be74ca22a873fc5437f7e2cbf6ab7a564vboxsync GLint cbData = crPixelSize(GL_RGBA, GL_UNSIGNED_BYTE) * pVP->viewportH * pVP->viewportW;
f11a163be74ca22a873fc5437f7e2cbf6ab7a564vboxsync void *pData = crAlloc(cbData);
f11a163be74ca22a873fc5437f7e2cbf6ab7a564vboxsync
f11a163be74ca22a873fc5437f7e2cbf6ab7a564vboxsync if (!pData)
f11a163be74ca22a873fc5437f7e2cbf6ab7a564vboxsync {
509a2f53cb92e3bf060f4615936354188ce92836vboxsync pContext->pImage = NULL;
f11a163be74ca22a873fc5437f7e2cbf6ab7a564vboxsync return VERR_NO_MEMORY;
f11a163be74ca22a873fc5437f7e2cbf6ab7a564vboxsync }
f11a163be74ca22a873fc5437f7e2cbf6ab7a564vboxsync
f11a163be74ca22a873fc5437f7e2cbf6ab7a564vboxsync rc = SSMR3GetMem(pSSM, pData, cbData);
f11a163be74ca22a873fc5437f7e2cbf6ab7a564vboxsync AssertRCReturn(rc, rc);
f11a163be74ca22a873fc5437f7e2cbf6ab7a564vboxsync
509a2f53cb92e3bf060f4615936354188ce92836vboxsync pContext->pImage = pData;
f11a163be74ca22a873fc5437f7e2cbf6ab7a564vboxsync }
f11a163be74ca22a873fc5437f7e2cbf6ab7a564vboxsync
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync /*Mark all as dirty to make sure we'd restore correct context state*/
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync {
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync CRStateBits *pBits = GetCurrentBits();
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync FILLDIRTY(pBits->attrib.dirty);
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync FILLDIRTY(pBits->buffer.dirty);
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync FILLDIRTY(pBits->buffer.enable);
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync FILLDIRTY(pBits->buffer.alphaFunc);
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync FILLDIRTY(pBits->buffer.depthFunc);
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync FILLDIRTY(pBits->buffer.blendFunc);
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync FILLDIRTY(pBits->buffer.logicOp);
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync FILLDIRTY(pBits->buffer.indexLogicOp);
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync FILLDIRTY(pBits->buffer.drawBuffer);
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync FILLDIRTY(pBits->buffer.readBuffer);
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync FILLDIRTY(pBits->buffer.indexMask);
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync FILLDIRTY(pBits->buffer.colorWriteMask);
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync FILLDIRTY(pBits->buffer.clearColor);
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync FILLDIRTY(pBits->buffer.clearIndex);
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync FILLDIRTY(pBits->buffer.clearDepth);
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync FILLDIRTY(pBits->buffer.clearAccum);
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync FILLDIRTY(pBits->buffer.depthMask);
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync#ifdef CR_EXT_blend_color
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync FILLDIRTY(pBits->buffer.blendColor);
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync#endif
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync#if defined(CR_EXT_blend_minmax) || defined(CR_EXT_blend_subtract) || defined(CR_EXT_blend_logic_op)
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync FILLDIRTY(pBits->buffer.blendEquation);
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync#endif
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync#if defined(CR_EXT_blend_func_separate)
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync FILLDIRTY(pBits->buffer.blendFuncSeparate);
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync#endif
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync#ifdef CR_ARB_vertex_buffer_object
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync FILLDIRTY(pBits->bufferobject.dirty);
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync FILLDIRTY(pBits->bufferobject.arrayBinding);
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync FILLDIRTY(pBits->bufferobject.elementsBinding);
af8d59d05d72f134aeea62712f1286b369807d52vboxsync# ifdef CR_ARB_pixel_buffer_object
af8d59d05d72f134aeea62712f1286b369807d52vboxsync FILLDIRTY(pBits->bufferobject.packBinding);
af8d59d05d72f134aeea62712f1286b369807d52vboxsync FILLDIRTY(pBits->bufferobject.unpackBinding);
af8d59d05d72f134aeea62712f1286b369807d52vboxsync# endif
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync#endif
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync FILLDIRTY(pBits->client.dirty);
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync FILLDIRTY(pBits->client.pack);
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync FILLDIRTY(pBits->client.unpack);
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync FILLDIRTY(pBits->client.enableClientState);
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync FILLDIRTY(pBits->client.clientPointer);
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync FILLDIRTY(pBits->client.v);
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync FILLDIRTY(pBits->client.n);
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync FILLDIRTY(pBits->client.c);
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync FILLDIRTY(pBits->client.i);
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync FILLDIRTY(pBits->client.e);
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync FILLDIRTY(pBits->client.s);
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync FILLDIRTY(pBits->client.f);
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync for (i=0; i<CR_MAX_TEXTURE_UNITS; i++)
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync {
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync FILLDIRTY(pBits->client.t[i]);
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync }
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync#ifdef CR_NV_vertex_program
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync for (i=0; i<CR_MAX_VERTEX_ATTRIBS; i++)
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync {
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync FILLDIRTY(pBits->client.a[i]);
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync }
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync#endif
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync FILLDIRTY(pBits->current.dirty);
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync for (i=0; i<CR_MAX_VERTEX_ATTRIBS; i++)
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync {
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync FILLDIRTY(pBits->current.vertexAttrib[i]);
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync }
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync FILLDIRTY(pBits->current.edgeFlag);
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync FILLDIRTY(pBits->current.colorIndex);
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync FILLDIRTY(pBits->current.rasterPos);
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync FILLDIRTY(pBits->eval.dirty);
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync for (i=0; i<GLEVAL_TOT; i++)
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync {
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync FILLDIRTY(pBits->eval.eval1D[i]);
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync FILLDIRTY(pBits->eval.eval2D[i]);
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync FILLDIRTY(pBits->eval.enable1D[i]);
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync FILLDIRTY(pBits->eval.enable2D[i]);
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync }
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync FILLDIRTY(pBits->eval.enable);
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync FILLDIRTY(pBits->eval.grid1D);
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync FILLDIRTY(pBits->eval.grid2D);
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync#ifdef CR_NV_vertex_program
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync /*@todo Those seems to be unused?
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync FILLDIRTY(pBits->eval.enableAttrib1D);
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync FILLDIRTY(pBits->eval.enableAttrib2D);
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync */
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync#endif
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync FILLDIRTY(pBits->feedback.dirty);
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync FILLDIRTY(pBits->selection.dirty);
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync FILLDIRTY(pBits->fog.dirty);
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync FILLDIRTY(pBits->fog.color);
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync FILLDIRTY(pBits->fog.index);
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync FILLDIRTY(pBits->fog.density);
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync FILLDIRTY(pBits->fog.start);
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync FILLDIRTY(pBits->fog.end);
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync FILLDIRTY(pBits->fog.mode);
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync FILLDIRTY(pBits->fog.enable);
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync#ifdef CR_NV_fog_distance
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync FILLDIRTY(pBits->fog.fogDistanceMode);
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync#endif
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync#ifdef CR_EXT_fog_coord
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync FILLDIRTY(pBits->fog.fogCoordinateSource);
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync#endif
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync FILLDIRTY(pBits->hint.dirty);
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync FILLDIRTY(pBits->hint.perspectiveCorrection);
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync FILLDIRTY(pBits->hint.pointSmooth);
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync FILLDIRTY(pBits->hint.lineSmooth);
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync FILLDIRTY(pBits->hint.polygonSmooth);
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync FILLDIRTY(pBits->hint.fog);
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync#ifdef CR_EXT_clip_volume_hint
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync FILLDIRTY(pBits->hint.clipVolumeClipping);
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync#endif
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync#ifdef CR_ARB_texture_compression
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync FILLDIRTY(pBits->hint.textureCompression);
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync#endif
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync#ifdef CR_SGIS_generate_mipmap
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync FILLDIRTY(pBits->hint.generateMipmap);
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync#endif
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync FILLDIRTY(pBits->lighting.dirty);
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync FILLDIRTY(pBits->lighting.shadeModel);
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync FILLDIRTY(pBits->lighting.colorMaterial);
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync FILLDIRTY(pBits->lighting.lightModel);
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync FILLDIRTY(pBits->lighting.material);
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync FILLDIRTY(pBits->lighting.enable);
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync for (i=0; i<CR_MAX_LIGHTS; ++i)
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync {
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync FILLDIRTY(pBits->lighting.light[i].dirty);
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync FILLDIRTY(pBits->lighting.light[i].enable);
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync FILLDIRTY(pBits->lighting.light[i].ambient);
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync FILLDIRTY(pBits->lighting.light[i].diffuse);
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync FILLDIRTY(pBits->lighting.light[i].specular);
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync FILLDIRTY(pBits->lighting.light[i].position);
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync FILLDIRTY(pBits->lighting.light[i].attenuation);
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync FILLDIRTY(pBits->lighting.light[i].spot);
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync }
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync FILLDIRTY(pBits->line.dirty);
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync FILLDIRTY(pBits->line.enable);
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync FILLDIRTY(pBits->line.width);
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync FILLDIRTY(pBits->line.stipple);
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync FILLDIRTY(pBits->lists.dirty);
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync FILLDIRTY(pBits->lists.base);
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync FILLDIRTY(pBits->multisample.dirty);
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync FILLDIRTY(pBits->multisample.enable);
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync FILLDIRTY(pBits->multisample.sampleAlphaToCoverage);
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync FILLDIRTY(pBits->multisample.sampleAlphaToOne);
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync FILLDIRTY(pBits->multisample.sampleCoverage);
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync FILLDIRTY(pBits->multisample.sampleCoverageValue);
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync#if CR_ARB_occlusion_query
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync FILLDIRTY(pBits->occlusion.dirty);
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync#endif
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync FILLDIRTY(pBits->pixel.dirty);
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync FILLDIRTY(pBits->pixel.transfer);
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync FILLDIRTY(pBits->pixel.zoom);
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync FILLDIRTY(pBits->pixel.maps);
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync FILLDIRTY(pBits->point.dirty);
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync FILLDIRTY(pBits->point.enableSmooth);
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync FILLDIRTY(pBits->point.size);
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync#ifdef CR_ARB_point_parameters
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync FILLDIRTY(pBits->point.minSize);
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync FILLDIRTY(pBits->point.maxSize);
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync FILLDIRTY(pBits->point.fadeThresholdSize);
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync FILLDIRTY(pBits->point.distanceAttenuation);
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync#endif
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync#ifdef CR_ARB_point_sprite
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync FILLDIRTY(pBits->point.enableSprite);
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync for (i=0; i<CR_MAX_TEXTURE_UNITS; ++i)
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync {
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync FILLDIRTY(pBits->point.coordReplacement[i]);
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync }
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync#endif
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync FILLDIRTY(pBits->polygon.dirty);
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync FILLDIRTY(pBits->polygon.enable);
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync FILLDIRTY(pBits->polygon.offset);
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync FILLDIRTY(pBits->polygon.mode);
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync FILLDIRTY(pBits->polygon.stipple);
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync FILLDIRTY(pBits->program.dirty);
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync FILLDIRTY(pBits->program.vpEnable);
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync FILLDIRTY(pBits->program.fpEnable);
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync FILLDIRTY(pBits->program.vpBinding);
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync FILLDIRTY(pBits->program.fpBinding);
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync for (i=0; i<CR_MAX_VERTEX_ATTRIBS; ++i)
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync {
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync FILLDIRTY(pBits->program.vertexAttribArrayEnable[i]);
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync FILLDIRTY(pBits->program.map1AttribArrayEnable[i]);
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync FILLDIRTY(pBits->program.map2AttribArrayEnable[i]);
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync }
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync for (i=0; i<CR_MAX_VERTEX_PROGRAM_ENV_PARAMS; ++i)
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync {
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync FILLDIRTY(pBits->program.vertexEnvParameter[i]);
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync }
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync for (i=0; i<CR_MAX_FRAGMENT_PROGRAM_ENV_PARAMS; ++i)
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync {
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync FILLDIRTY(pBits->program.fragmentEnvParameter[i]);
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync }
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync FILLDIRTY(pBits->program.vertexEnvParameters);
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync FILLDIRTY(pBits->program.fragmentEnvParameters);
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync for (i=0; i<CR_MAX_VERTEX_PROGRAM_ENV_PARAMS/4; ++i)
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync {
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync FILLDIRTY(pBits->program.trackMatrix[i]);
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync }
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync FILLDIRTY(pBits->regcombiner.dirty);
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync FILLDIRTY(pBits->regcombiner.enable);
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync FILLDIRTY(pBits->regcombiner.regCombinerVars);
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync FILLDIRTY(pBits->regcombiner.regCombinerColor0);
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync FILLDIRTY(pBits->regcombiner.regCombinerColor1);
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync for (i=0; i<CR_MAX_GENERAL_COMBINERS; ++i)
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync {
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync FILLDIRTY(pBits->regcombiner.regCombinerStageColor0[i]);
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync FILLDIRTY(pBits->regcombiner.regCombinerStageColor1[i]);
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync FILLDIRTY(pBits->regcombiner.regCombinerInput[i]);
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync FILLDIRTY(pBits->regcombiner.regCombinerOutput[i]);
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync }
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync FILLDIRTY(pBits->regcombiner.regCombinerFinalInput);
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync FILLDIRTY(pBits->stencil.dirty);
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync FILLDIRTY(pBits->stencil.enable);
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync FILLDIRTY(pBits->stencil.func);
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync FILLDIRTY(pBits->stencil.op);
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync FILLDIRTY(pBits->stencil.clearValue);
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync FILLDIRTY(pBits->stencil.writeMask);
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync FILLDIRTY(pBits->texture.dirty);
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync for (i=0; i<CR_MAX_TEXTURE_UNITS; ++i)
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync {
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync FILLDIRTY(pBits->texture.enable[i]);
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync FILLDIRTY(pBits->texture.current[i]);
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync FILLDIRTY(pBits->texture.objGen[i]);
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync FILLDIRTY(pBits->texture.eyeGen[i]);
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync FILLDIRTY(pBits->texture.genMode[i]);
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync FILLDIRTY(pBits->texture.envBit[i]);
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync }
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync FILLDIRTY(pBits->transform.dirty);
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync FILLDIRTY(pBits->transform.matrixMode);
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync FILLDIRTY(pBits->transform.modelviewMatrix);
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync FILLDIRTY(pBits->transform.projectionMatrix);
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync FILLDIRTY(pBits->transform.colorMatrix);
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync FILLDIRTY(pBits->transform.textureMatrix);
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync FILLDIRTY(pBits->transform.programMatrix);
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync FILLDIRTY(pBits->transform.clipPlane);
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync FILLDIRTY(pBits->transform.enable);
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync FILLDIRTY(pBits->transform.base);
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync FILLDIRTY(pBits->viewport.dirty);
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync FILLDIRTY(pBits->viewport.v_dims);
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync FILLDIRTY(pBits->viewport.s_dims);
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync FILLDIRTY(pBits->viewport.enable);
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync FILLDIRTY(pBits->viewport.depth);
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync }
fdd5017195ab02e09ceefa312beaf5d538fdf2edvboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync return VINF_SUCCESS;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync}