072f0b86f23a38efb7454da3144cbce76805be76vboxsync/* $Id$ */
072f0b86f23a38efb7454da3144cbce76805be76vboxsync#include <stdio.h>
072f0b86f23a38efb7454da3144cbce76805be76vboxsync#include "cr_spu.h"
072f0b86f23a38efb7454da3144cbce76805be76vboxsync#include "cr_dlm.h"
072f0b86f23a38efb7454da3144cbce76805be76vboxsync#include "cr_mem.h"
072f0b86f23a38efb7454da3144cbce76805be76vboxsync#include "cr_error.h"
072f0b86f23a38efb7454da3144cbce76805be76vboxsync#include "dlm.h"
072f0b86f23a38efb7454da3144cbce76805be76vboxsync#include <VBox/VBoxUhgsmi.h>
072f0b86f23a38efb7454da3144cbce76805be76vboxsync/* The headers and structures are still auto-generated */
072f0b86f23a38efb7454da3144cbce76805be76vboxsync#include "dlm_generated.h"
072f0b86f23a38efb7454da3144cbce76805be76vboxsync
072f0b86f23a38efb7454da3144cbce76805be76vboxsync/* The CallList functions have a special implementation. They aren't commonly
072f0b86f23a38efb7454da3144cbce76805be76vboxsync * listed as state-changers, but they can cause state to change.
072f0b86f23a38efb7454da3144cbce76805be76vboxsync */
072f0b86f23a38efb7454da3144cbce76805be76vboxsync
072f0b86f23a38efb7454da3144cbce76805be76vboxsyncstatic void DLM_APIENTRY executeCallList(DLMInstanceList *x, SPUDispatchTable *dispatchTable)
072f0b86f23a38efb7454da3144cbce76805be76vboxsync{
072f0b86f23a38efb7454da3144cbce76805be76vboxsync struct instanceCallList *instance = (struct instanceCallList *)x;
072f0b86f23a38efb7454da3144cbce76805be76vboxsync dispatchTable->CallList(instance->list);
072f0b86f23a38efb7454da3144cbce76805be76vboxsync}
072f0b86f23a38efb7454da3144cbce76805be76vboxsyncvoid DLM_APIENTRY crDLMCompileCallList( GLuint list )
072f0b86f23a38efb7454da3144cbce76805be76vboxsync{
072f0b86f23a38efb7454da3144cbce76805be76vboxsync struct instanceCallList *instance;
072f0b86f23a38efb7454da3144cbce76805be76vboxsync instance = crCalloc(sizeof(struct instanceCallList));
072f0b86f23a38efb7454da3144cbce76805be76vboxsync if (!instance) {
072f0b86f23a38efb7454da3144cbce76805be76vboxsync crdlm_error(__LINE__, __FILE__, GL_OUT_OF_MEMORY,
072f0b86f23a38efb7454da3144cbce76805be76vboxsync "out of memory adding CallList to display list");
072f0b86f23a38efb7454da3144cbce76805be76vboxsync return;
072f0b86f23a38efb7454da3144cbce76805be76vboxsync }
072f0b86f23a38efb7454da3144cbce76805be76vboxsync /* Put in the parameters */
072f0b86f23a38efb7454da3144cbce76805be76vboxsync instance->list = list;
072f0b86f23a38efb7454da3144cbce76805be76vboxsync
072f0b86f23a38efb7454da3144cbce76805be76vboxsync /* Add to the display list correctly */
072f0b86f23a38efb7454da3144cbce76805be76vboxsync crdlm_add_to_list((DLMInstanceList *)instance, executeCallList);
072f0b86f23a38efb7454da3144cbce76805be76vboxsync}
072f0b86f23a38efb7454da3144cbce76805be76vboxsync
072f0b86f23a38efb7454da3144cbce76805be76vboxsync/*** CallLists ***/
072f0b86f23a38efb7454da3144cbce76805be76vboxsyncstatic void DLM_APIENTRY executeCallLists(DLMInstanceList *x, SPUDispatchTable *dispatchTable)
072f0b86f23a38efb7454da3144cbce76805be76vboxsync{
072f0b86f23a38efb7454da3144cbce76805be76vboxsync struct instanceCallLists *instance = (struct instanceCallLists *)x;
072f0b86f23a38efb7454da3144cbce76805be76vboxsync dispatchTable->CallLists(instance->n, instance->type, instance->lists);
072f0b86f23a38efb7454da3144cbce76805be76vboxsync}
072f0b86f23a38efb7454da3144cbce76805be76vboxsyncvoid DLM_APIENTRY crDLMCompileCallLists( GLsizei n, GLenum type, const GLvoid * lists )
072f0b86f23a38efb7454da3144cbce76805be76vboxsync{
072f0b86f23a38efb7454da3144cbce76805be76vboxsync struct instanceCallLists *instance;
072f0b86f23a38efb7454da3144cbce76805be76vboxsync instance = crCalloc(sizeof(struct instanceCallLists) + crdlm_pointers_CallLists(NULL, n, type, lists));
072f0b86f23a38efb7454da3144cbce76805be76vboxsync if (!instance) {
072f0b86f23a38efb7454da3144cbce76805be76vboxsync crdlm_error(__LINE__, __FILE__, GL_OUT_OF_MEMORY,
072f0b86f23a38efb7454da3144cbce76805be76vboxsync "out of memory adding CallLists to display list");
072f0b86f23a38efb7454da3144cbce76805be76vboxsync return;
072f0b86f23a38efb7454da3144cbce76805be76vboxsync }
072f0b86f23a38efb7454da3144cbce76805be76vboxsync instance->n = n;
072f0b86f23a38efb7454da3144cbce76805be76vboxsync instance->type = type;
072f0b86f23a38efb7454da3144cbce76805be76vboxsync if (lists == NULL) {
072f0b86f23a38efb7454da3144cbce76805be76vboxsync instance->lists = NULL;
072f0b86f23a38efb7454da3144cbce76805be76vboxsync }
072f0b86f23a38efb7454da3144cbce76805be76vboxsync else {
072f0b86f23a38efb7454da3144cbce76805be76vboxsync instance->lists = instance->listsData;
072f0b86f23a38efb7454da3144cbce76805be76vboxsync }
072f0b86f23a38efb7454da3144cbce76805be76vboxsync (void) crdlm_pointers_CallLists(instance, n, type, lists);
072f0b86f23a38efb7454da3144cbce76805be76vboxsync
072f0b86f23a38efb7454da3144cbce76805be76vboxsync crdlm_add_to_list((DLMInstanceList *)instance, executeCallLists);
072f0b86f23a38efb7454da3144cbce76805be76vboxsync}