void REPLICATESPU_APIENTRY replicatespu_DeleteLists(GLuint listIdentifier, GLsizei range) { if (range < 0) { crStateError(__LINE__, __FILE__, GL_INVALID_VALUE, "replicate: DeleteLists with negative range (%d)", range); return; } crStateDeleteLists(listIdentifier, range); crDLMDeleteLists(listIdentifier, range); if (replicate_spu.swap) { crPackDeleteListsSWAP(listIdentifier, range); } else { crPackDeleteLists(listIdentifier, range); } }
/** * Generate host and guest IDs, setup IDs mapping between host and guest. */ GLuint DLM_APIENTRY crDLMGenLists(GLsizei range, SPUDispatchTable *dispatchTable) { CRDLMContextState *listState = CURRENT_STATE(); GLuint idHostRangeStart = 0; GLuint idGuestRangeStart = 0; crDebug("DLM: GenLists(%d) (DLM=%p).", range, listState ? listState->dlm : 0); if (listState) { idHostRangeStart = dispatchTable->GenLists(range); if (idHostRangeStart > 0) { idGuestRangeStart = crHashtableAllocKeys(listState->dlm->displayLists, range); if (idGuestRangeStart > 0) { GLuint i; bool fSuccess = true; /* Now have successfully generated IDs range for host and guest. Let's make IDs association. */ for (i = 0; i < (GLuint)range; i++) { DLMListInfo *pListInfo; pListInfo = (DLMListInfo *)crCalloc(sizeof(DLMListInfo)); if (pListInfo) { crMemset(pListInfo, 0, sizeof(DLMListInfo)); pListInfo->hwid = idHostRangeStart + i; /* Insert pre-initialized list data which contains IDs mapping into the hash. */ crHashtableReplace(listState->dlm->displayLists, idGuestRangeStart + i, pListInfo, NULL); } else { fSuccess = false; break; } } /* All structures allocated and initialized successfully. */ if (fSuccess) return idGuestRangeStart; /* Rollback some data was not allocated. */ crDLMDeleteLists(idGuestRangeStart, range, NULL /* we do DeleteLists() later in this routine */ ); } else crDebug("DLM: Can't allocate Display List IDs range for the guest."); dispatchTable->DeleteLists(idHostRangeStart, range); } else crDebug("DLM: Can't allocate Display List IDs range on the host side."); } else crDebug("DLM: GenLists(%u) called with no current state.", range); /* Can't reserve IDs range. */ return 0; }