1 | /* $Id: expandospu.c 76553 2019-01-01 01:45:53Z vboxsync $ */
|
---|
2 | /** @file
|
---|
3 | * Implementation of routines which Expando SPU explicitly overrides.
|
---|
4 | */
|
---|
5 |
|
---|
6 | /* Copyright (c) 2001, Stanford University
|
---|
7 | * All rights reserved
|
---|
8 | *
|
---|
9 | * See the file LICENSE.txt for information on redistributing this software.
|
---|
10 | */
|
---|
11 |
|
---|
12 |
|
---|
13 | /*
|
---|
14 | * Copyright (C) 2015-2019 Oracle Corporation
|
---|
15 | *
|
---|
16 | * This file is part of VirtualBox Open Source Edition (OSE), as
|
---|
17 | * available from http://www.virtualbox.org. This file is free software;
|
---|
18 | * you can redistribute it and/or modify it under the terms of the GNU
|
---|
19 | * General Public License (GPL) as published by the Free Software
|
---|
20 | * Foundation, in version 2 as it comes in the "COPYING" file of the
|
---|
21 | * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
|
---|
22 | * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
|
---|
23 | */
|
---|
24 |
|
---|
25 | #include <stdio.h>
|
---|
26 | #include "cr_spu.h"
|
---|
27 | #include "cr_dlm.h"
|
---|
28 | #include "cr_mem.h"
|
---|
29 | #include "expandospu.h"
|
---|
30 |
|
---|
31 | extern GLint EXPANDOSPU_APIENTRY
|
---|
32 | expandoCreateContext(const char *displayName, GLint visBits, GLint shareCtx)
|
---|
33 | {
|
---|
34 | ExpandoContextState *contextState;
|
---|
35 |
|
---|
36 | /* Allocate our own per-context record */
|
---|
37 | contextState = crCalloc(sizeof(ExpandoContextState));
|
---|
38 | if (contextState)
|
---|
39 | {
|
---|
40 | GLint contextId;
|
---|
41 |
|
---|
42 | /* Get an official context ID from our super */
|
---|
43 | contextId = expando_spu.super.CreateContext(displayName, visBits, shareCtx);
|
---|
44 |
|
---|
45 | /* Supplement that with our DLM. In a more correct situation, we should
|
---|
46 | * see if we've been called through glXCreateContext, which has a parameter
|
---|
47 | * for sharing DLMs. We don't currently get that information, so for now
|
---|
48 | * give each context its own DLM.
|
---|
49 | */
|
---|
50 | contextState->dlm = crDLMNewDLM(0, NULL);
|
---|
51 | if (contextState->dlm)
|
---|
52 | {
|
---|
53 | contextState->dlmContext = crDLMNewContext(contextState->dlm);
|
---|
54 | if (contextState->dlmContext)
|
---|
55 | {
|
---|
56 | /* The DLM needs us to use the state tracker to track client
|
---|
57 | * state, so we can compile client-state-using functions correctly.
|
---|
58 | */
|
---|
59 | contextState->State = crStateCreateContext(NULL, visBits, NULL);
|
---|
60 |
|
---|
61 | /* Associate the Expando context with the user context. */
|
---|
62 | crHashtableAdd(expando_spu.contextTable, contextId, (void *)contextState);
|
---|
63 |
|
---|
64 | crDebug("Expando SPU: created context %d (contextState=%p, contextState->dlm=%p, "
|
---|
65 | "contextState->dlmContext=%p, contextState->State=%p).",
|
---|
66 | contextId, contextState, contextState->dlm, contextState->dlmContext, contextState->State);
|
---|
67 |
|
---|
68 | return contextId;
|
---|
69 | }
|
---|
70 | else
|
---|
71 | crError("Expando SPU: can't allocate new DLM context.");
|
---|
72 |
|
---|
73 | crDLMFreeDLM(contextState->dlm, &expando_spu.super);
|
---|
74 | }
|
---|
75 | else
|
---|
76 | crError("Expando SPU: can't allocate new DLM.");
|
---|
77 |
|
---|
78 | crFree(contextState);
|
---|
79 | }
|
---|
80 | else
|
---|
81 | crError("Expando SPU: couldn't allocate per-context state");
|
---|
82 |
|
---|
83 | return 0;
|
---|
84 | }
|
---|
85 |
|
---|
86 | void expando_free_context_state(void *data)
|
---|
87 | {
|
---|
88 | ExpandoContextState *contextState = (ExpandoContextState *)data;
|
---|
89 |
|
---|
90 | crDebug("Expando SPU: destroying context internals: "
|
---|
91 | "contextState=%p, contextState->dlm=%p, contextState->dlmContext=%p, contextState->State=%p",
|
---|
92 | contextState, contextState->dlm, contextState->dlmContext, contextState->State);
|
---|
93 |
|
---|
94 | crDLMFreeContext(contextState->dlmContext, &expando_spu.super);
|
---|
95 | crDLMFreeDLM(contextState->dlm, &expando_spu.super);
|
---|
96 | crStateDestroyContext(contextState->State);
|
---|
97 | crFree(contextState);
|
---|
98 | }
|
---|
99 |
|
---|
100 | void EXPANDOSPU_APIENTRY
|
---|
101 | expandoDestroyContext(GLint contextId)
|
---|
102 | {
|
---|
103 | crDebug("Expando SPU: destroy context %d.", contextId);
|
---|
104 |
|
---|
105 | /* Destroy our context information */
|
---|
106 | crHashtableDelete(expando_spu.contextTable, contextId, expando_free_context_state);
|
---|
107 |
|
---|
108 | /* Pass along the destruction to our super. */
|
---|
109 | expando_spu.super.DestroyContext(contextId);
|
---|
110 | }
|
---|
111 |
|
---|
112 | void EXPANDOSPU_APIENTRY
|
---|
113 | expandoMakeCurrent(GLint crWindow, GLint nativeWindow, GLint contextId)
|
---|
114 | {
|
---|
115 | ExpandoContextState *expandoContextState;
|
---|
116 |
|
---|
117 | expando_spu.super.MakeCurrent(crWindow, nativeWindow, contextId);
|
---|
118 |
|
---|
119 | expandoContextState = crHashtableSearch(expando_spu.contextTable, contextId);
|
---|
120 | if (expandoContextState)
|
---|
121 | {
|
---|
122 | crDebug("Expando SPU: switch to context %d.", contextId);
|
---|
123 |
|
---|
124 | crDLMSetCurrentState(expandoContextState->dlmContext);
|
---|
125 | crStateMakeCurrent(expandoContextState->State);
|
---|
126 | }
|
---|
127 | else
|
---|
128 | {
|
---|
129 | crDebug("Expando SPU: can't switch to context %d: not found.", contextId);
|
---|
130 |
|
---|
131 | crDLMSetCurrentState(NULL);
|
---|
132 | crStateMakeCurrent(NULL);
|
---|
133 | }
|
---|
134 | }
|
---|
135 |
|
---|
136 | extern void EXPANDOSPU_APIENTRY
|
---|
137 | expandoNewList(GLuint list, GLenum mode)
|
---|
138 | {
|
---|
139 | crDLMNewList(list, mode, &expando_spu.super);
|
---|
140 | }
|
---|
141 |
|
---|
142 | extern void EXPANDOSPU_APIENTRY
|
---|
143 | expandoEndList(void)
|
---|
144 | {
|
---|
145 | crDLMEndList(&expando_spu.super);
|
---|
146 | }
|
---|
147 |
|
---|
148 | extern void EXPANDOSPU_APIENTRY
|
---|
149 | expandoDeleteLists(GLuint first, GLsizei range)
|
---|
150 | {
|
---|
151 | crDLMDeleteLists(first, range, &expando_spu.super);
|
---|
152 | }
|
---|
153 |
|
---|
154 | extern GLuint EXPANDOSPU_APIENTRY
|
---|
155 | expandoGenLists(GLsizei range)
|
---|
156 | {
|
---|
157 | return crDLMGenLists(range, &expando_spu.super);
|
---|
158 | }
|
---|
159 |
|
---|
160 | void EXPANDOSPU_APIENTRY
|
---|
161 | expandoListBase(GLuint base)
|
---|
162 | {
|
---|
163 | crDLMListBase(base, &expando_spu.super);
|
---|
164 | }
|
---|
165 |
|
---|
166 | extern GLboolean EXPANDOSPU_APIENTRY
|
---|
167 | expandoIsList(GLuint list)
|
---|
168 | {
|
---|
169 | return crDLMIsList(list, &expando_spu.super);
|
---|
170 | }
|
---|
171 |
|
---|
172 | extern void EXPANDOSPU_APIENTRY
|
---|
173 | expandoCallList(GLuint list)
|
---|
174 | {
|
---|
175 | crDLMCallList(list, &expando_spu.super);
|
---|
176 | }
|
---|
177 |
|
---|
178 | extern void EXPANDOSPU_APIENTRY
|
---|
179 | expandoCallLists(GLsizei n, GLenum type, const GLvoid *lists)
|
---|
180 | {
|
---|
181 | crDLMCallLists(n, type, lists, &expando_spu.super);
|
---|
182 | }
|
---|