DECLEXPORT(GLuint) STATE_APIENTRY crStateCreateProgram(GLuint hwid) { CRGLSLProgram *pProgram; CRContext *g = GetCurrentContext(); GLuint stateId = hwid; #ifdef IN_GUEST pProgram = crStateGetProgramObj(stateId); if (pProgram) { crWarning("Program object %d already exists!", stateId); crStateDeleteProgram(stateId); CRASSERT(!crStateGetProgramObj(stateId)); } #else /* the id may not necesserily be hwid after save state restoration */ while ((pProgram = crStateGetProgramObj(stateId)) != NULL) { GLuint newStateId = stateId + 7; crDebug("Program object %d already exists, generating a new one, %d", stateId, newStateId); stateId = newStateId; } #endif pProgram = (CRGLSLProgram *) crAlloc(sizeof(*pProgram)); if (!pProgram) { crWarning("crStateCreateShader: Out of memory!"); return 0; } pProgram->id = stateId; pProgram->hwid = hwid; pProgram->validated = GL_FALSE; pProgram->linked = GL_FALSE; pProgram->deleted = GL_FALSE; pProgram->activeState.attachedShaders = NULL; pProgram->currentState.attachedShaders = crAllocHashtable(); pProgram->activeState.cAttribs = 0; pProgram->activeState.pAttribs = NULL; pProgram->currentState.cAttribs = 0; pProgram->currentState.pAttribs = NULL; pProgram->pUniforms = NULL; pProgram->cUniforms = 0; #ifdef IN_GUEST pProgram->bUniformsSynced = GL_FALSE; #endif crHashtableAdd(g->glsl.programs, stateId, pProgram); return stateId; }
DECLEXPORT(GLuint) STATE_APIENTRY crStateCreateProgram(GLuint hwid) { CRGLSLProgram *pProgram; CRContext *g = GetCurrentContext(); GLuint stateId = hwid; #ifdef IN_GUEST pProgram = crStateGetProgramObj(stateId); if (pProgram) { crWarning("Program object %d already exists!", stateId); crStateDeleteProgram(stateId); CRASSERT(!crStateGetProgramObj(stateId)); } #else stateId = crHashtableAllocKeys(g->glsl.programs, 1); if (!stateId) { crWarning("failed to allocate program key"); return 0; } #endif pProgram = (CRGLSLProgram *) crAlloc(sizeof(*pProgram)); if (!pProgram) { crWarning("crStateCreateProgram: Out of memory!"); return 0; } pProgram->id = stateId; pProgram->hwid = hwid; pProgram->validated = GL_FALSE; pProgram->linked = GL_FALSE; pProgram->deleted = GL_FALSE; pProgram->activeState.attachedShaders = NULL; pProgram->currentState.attachedShaders = crAllocHashtable(); pProgram->activeState.cAttribs = 0; pProgram->activeState.pAttribs = NULL; pProgram->currentState.cAttribs = 0; pProgram->currentState.pAttribs = NULL; pProgram->pUniforms = NULL; pProgram->cUniforms = 0; #ifdef IN_GUEST pProgram->bUniformsSynced = GL_FALSE; #endif crHashtableAdd(g->glsl.programs, stateId, pProgram); return stateId; }
DECLEXPORT(GLuint) STATE_APIENTRY crStateDeleteObjectARB( GLhandleARB obj ) { GLuint hwId = crStateGetProgramHWID(obj); if (hwId) { crStateDeleteProgram(obj); } else { hwId = crStateGetShaderHWID(obj); crStateDeleteShader(obj); } return hwId; }
void PACK_APIENTRY packspu_DeleteObjectARB(VBoxGLhandleARB obj) { GLuint hwid = crStateGetProgramHWID(obj); CRASSERT(obj); /* we do not track shader creation inside guest since it is not needed currently. * this is why we only care about programs here */ if (hwid) { crStateDeleteProgram(obj); } crPackDeleteObjectARB(obj); }
void SERVER_DISPATCH_APIENTRY crServerDispatchDeleteObjectARB(GLhandleARB obj) { GLuint hwid = crStateGetProgramHWID(obj); if (!hwid) { hwid = crStateGetShaderHWID(obj); crStateDeleteShader(obj); } else { crStateDeleteProgram(obj); } cr_server.head_spu->dispatch_table.DeleteObjectARB(hwid); }
void SERVER_DISPATCH_APIENTRY crServerDispatchDeleteProgram(GLuint program) { crStateDeleteProgram(program); cr_server.head_spu->dispatch_table.DeleteProgram(crStateGetProgramHWID(program)); }
void PACKSPU_APIENTRY packspu_DeleteProgram(GLuint program) { crStateDeleteProgram(program); crPackDeleteProgram(program); }