VirtualBox

source: vbox/trunk/src/VBox/HostServices/SharedOpenGL/crserverlib/server_lists.c@ 55013

最後變更 在這個檔案從55013是 55013,由 vboxsync 提交於 10 年 前

Host 3D: crServer: move things in place: texture-related stuff -> server_texture.c.

  • 屬性 svn:eol-style 設為 native
  • 屬性 svn:keywords 設為 Id
檔案大小: 9.8 KB
 
1/* Copyright (c) 2001-2003, Stanford University
2 All rights reserved.
3
4 See the file LICENSE.txt for information on redistributing this software. */
5
6#include "server_dispatch.h"
7#include "server.h"
8#include "cr_mem.h"
9
10
11/*
12 * Notes on ID translation:
13 *
14 * If a server has multiple clients (in the case of parallel applications)
15 * and N of the clients all create a display list with ID K, does K name
16 * one display list or N different display lists?
17 *
18 * By default, there is one display list named K. If the clients put
19 * identical commands into list K, then this is fine. But if the clients
20 * each put something different into list K when they created it, then this
21 * is a serious problem.
22 *
23 * By zeroing the 'shared_display_lists' configuration option, we can tell
24 * the server to make list K be unique for all N clients. We do this by
25 * translating K into a new, unique ID dependent on which client we're
26 * talking to (curClient->number).
27 *
28 * Same story for texture objects, vertex programs, etc.
29 *
30 * The application can also dynamically switch between shared and private
31 * display lists with:
32 * glChromiumParameteri(GL_SHARED_DISPLAY_LISTS_CR, GL_TRUE)
33 * and
34 * glChromiumParameteri(GL_SHARED_DISPLAY_LISTS_CR, GL_FALSE)
35 *
36 */
37
38
39
40static GLuint TranslateListID( GLuint id )
41{
42 if (!cr_server.sharedDisplayLists) {
43 int client = cr_server.curClient->number;
44 return id + client * 100000;
45 }
46 return id;
47}
48
49/* XXXX Note: shared/separate Program ID numbers aren't totally implemented! */
50GLuint crServerTranslateProgramID( GLuint id )
51{
52 if (!cr_server.sharedPrograms && id) {
53 int client = cr_server.curClient->number;
54 return id + client * 100000;
55 }
56 return id;
57}
58
59GLuint SERVER_DISPATCH_APIENTRY crServerDispatchGenLists( GLsizei range )
60{
61 GLuint retval;
62 retval = cr_server.head_spu->dispatch_table.GenLists( range );
63 crServerReturnValue( &retval, sizeof(retval) );
64 return retval; /* WILL PROBABLY BE IGNORED */
65}
66
67
68void SERVER_DISPATCH_APIENTRY
69crServerDispatchNewList( GLuint list, GLenum mode )
70{
71 if (mode == GL_COMPILE_AND_EXECUTE)
72 crWarning("using glNewList(GL_COMPILE_AND_EXECUTE) can confuse the crserver");
73
74 list = TranslateListID( list );
75 crStateNewList( list, mode );
76 cr_server.head_spu->dispatch_table.NewList( list, mode );
77}
78
79static void crServerQueryHWState()
80{
81 if (!cr_server.bUseMultipleContexts)
82 {
83 GLuint fbFbo, bbFbo;
84 CRClient *client = cr_server.curClient;
85 CRMuralInfo *mural = client ? client->currentMural : NULL;
86 if (mural && mural->fRedirected)
87 {
88 fbFbo = mural->aidFBOs[CR_SERVER_FBO_FB_IDX(mural)];
89 bbFbo = mural->aidFBOs[CR_SERVER_FBO_BB_IDX(mural)];
90 }
91 else
92 {
93 fbFbo = bbFbo = 0;
94 }
95 crStateQueryHWState(fbFbo, bbFbo);
96 }
97}
98
99void SERVER_DISPATCH_APIENTRY crServerDispatchEndList(void)
100{
101 CRContext *g = crStateGetCurrent();
102 CRListsState *l = &(g->lists);
103
104 cr_server.head_spu->dispatch_table.EndList();
105 crStateEndList();
106
107#ifndef IN_GUEST
108 if (l->mode==GL_COMPILE)
109 {
110 crServerQueryHWState();
111 }
112#endif
113}
114
115void SERVER_DISPATCH_APIENTRY
116crServerDispatchCallList( GLuint list )
117{
118 list = TranslateListID( list );
119
120 if (cr_server.curClient->currentCtxInfo->pContext->lists.mode == 0) {
121 /* we're not compiling, so execute the list now */
122 /* Issue the list as-is */
123 cr_server.head_spu->dispatch_table.CallList( list );
124 crServerQueryHWState();
125 }
126 else {
127 /* we're compiling glCallList into another list - just pass it through */
128 cr_server.head_spu->dispatch_table.CallList( list );
129 }
130}
131
132
133/**
134 * Translate an array of display list IDs from various datatypes to GLuint
135 * IDs while adding the per-client offset.
136 */
137static void
138TranslateListIDs(GLsizei n, GLenum type, const GLvoid *lists, GLuint *newLists)
139{
140 int offset = cr_server.curClient->number * 100000;
141 GLsizei i;
142 switch (type) {
143 case GL_UNSIGNED_BYTE:
144 {
145 const GLubyte *src = (const GLubyte *) lists;
146 for (i = 0; i < n; i++) {
147 newLists[i] = src[i] + offset;
148 }
149 }
150 break;
151 case GL_BYTE:
152 {
153 const GLbyte *src = (const GLbyte *) lists;
154 for (i = 0; i < n; i++) {
155 newLists[i] = src[i] + offset;
156 }
157 }
158 break;
159 case GL_UNSIGNED_SHORT:
160 {
161 const GLushort *src = (const GLushort *) lists;
162 for (i = 0; i < n; i++) {
163 newLists[i] = src[i] + offset;
164 }
165 }
166 break;
167 case GL_SHORT:
168 {
169 const GLshort *src = (const GLshort *) lists;
170 for (i = 0; i < n; i++) {
171 newLists[i] = src[i] + offset;
172 }
173 }
174 break;
175 case GL_UNSIGNED_INT:
176 {
177 const GLuint *src = (const GLuint *) lists;
178 for (i = 0; i < n; i++) {
179 newLists[i] = src[i] + offset;
180 }
181 }
182 break;
183 case GL_INT:
184 {
185 const GLint *src = (const GLint *) lists;
186 for (i = 0; i < n; i++) {
187 newLists[i] = src[i] + offset;
188 }
189 }
190 break;
191 case GL_FLOAT:
192 {
193 const GLfloat *src = (const GLfloat *) lists;
194 for (i = 0; i < n; i++) {
195 newLists[i] = (GLuint) src[i] + offset;
196 }
197 }
198 break;
199 case GL_2_BYTES:
200 {
201 const GLubyte *src = (const GLubyte *) lists;
202 for (i = 0; i < n; i++) {
203 newLists[i] = (src[i*2+0] * 256 +
204 src[i*2+1]) + offset;
205 }
206 }
207 break;
208 case GL_3_BYTES:
209 {
210 const GLubyte *src = (const GLubyte *) lists;
211 for (i = 0; i < n; i++) {
212 newLists[i] = (src[i*3+0] * 256 * 256 +
213 src[i*3+1] * 256 +
214 src[i*3+2]) + offset;
215 }
216 }
217 break;
218 case GL_4_BYTES:
219 {
220 const GLubyte *src = (const GLubyte *) lists;
221 for (i = 0; i < n; i++) {
222 newLists[i] = (src[i*4+0] * 256 * 256 * 256 +
223 src[i*4+1] * 256 * 256 +
224 src[i*4+2] * 256 +
225 src[i*4+3]) + offset;
226 }
227 }
228 break;
229 default:
230 crWarning("CRServer: invalid display list datatype 0x%x", type);
231 }
232}
233
234
235void SERVER_DISPATCH_APIENTRY
236crServerDispatchCallLists( GLsizei n, GLenum type, const GLvoid *lists )
237{
238 if (!cr_server.sharedDisplayLists) {
239 /* need to translate IDs */
240 GLuint *newLists = (GLuint *) crAlloc(n * sizeof(GLuint));
241 if (newLists) {
242 TranslateListIDs(n, type, lists, newLists);
243 }
244 lists = newLists;
245 type = GL_UNSIGNED_INT;
246 }
247
248 if (cr_server.curClient->currentCtxInfo->pContext->lists.mode == 0) {
249 /* we're not compiling, so execute the list now */
250 /* Issue the list as-is */
251 cr_server.head_spu->dispatch_table.CallLists( n, type, lists );
252 crServerQueryHWState();
253 }
254 else {
255 /* we're compiling glCallList into another list - just pass it through */
256 cr_server.head_spu->dispatch_table.CallLists( n, type, lists );
257 }
258
259 if (!cr_server.sharedDisplayLists) {
260 crFree((void *) lists); /* malloc'd above */
261 }
262}
263
264
265GLboolean SERVER_DISPATCH_APIENTRY crServerDispatchIsList( GLuint list )
266{
267 GLboolean retval;
268 list = TranslateListID( list );
269 retval = cr_server.head_spu->dispatch_table.IsList( list );
270 crServerReturnValue( &retval, sizeof(retval) );
271 return retval;
272}
273
274
275void SERVER_DISPATCH_APIENTRY crServerDispatchDeleteLists( GLuint list, GLsizei range )
276{
277 list = TranslateListID( list );
278 crStateDeleteLists( list, range );
279 cr_server.head_spu->dispatch_table.DeleteLists( list, range );
280}
281
282
283void SERVER_DISPATCH_APIENTRY crServerDispatchDeleteProgramsARB(GLsizei n, const GLuint * programs)
284{
285 GLuint *pLocalProgs = (GLuint *) crAlloc(n * sizeof(GLuint));
286 GLint i;
287 if (!pLocalProgs) {
288 crError("crServerDispatchDeleteProgramsARB: out of memory");
289 return;
290 }
291 for (i = 0; i < n; i++) {
292 pLocalProgs[i] = crServerTranslateProgramID(programs[i]);
293 }
294 crStateDeleteProgramsARB(n, pLocalProgs);
295 cr_server.head_spu->dispatch_table.DeleteProgramsARB(n, pLocalProgs);
296 crFree(pLocalProgs);
297}
298
299/*@todo will fail for progs loaded from snapshot */
300GLboolean SERVER_DISPATCH_APIENTRY crServerDispatchIsProgramARB( GLuint program )
301{
302 GLboolean retval;
303 program = crServerTranslateProgramID(program);
304 retval = cr_server.head_spu->dispatch_table.IsProgramARB( program );
305 crServerReturnValue( &retval, sizeof(retval) );
306 return retval; /* WILL PROBABLY BE IGNORED */
307}
308
309
310GLboolean SERVER_DISPATCH_APIENTRY
311crServerDispatchAreProgramsResidentNV(GLsizei n, const GLuint *programs,
312 GLboolean *residences)
313{
314 GLboolean retval;
315 GLboolean *res = (GLboolean *) crAlloc(n * sizeof(GLboolean));
316 GLsizei i;
317
318 (void) residences;
319
320 if (!cr_server.sharedTextureObjects) {
321 GLuint *programs2 = (GLuint *) crAlloc(n * sizeof(GLuint));
322 for (i = 0; i < n; i++)
323 programs2[i] = crServerTranslateProgramID(programs[i]);
324 retval = cr_server.head_spu->dispatch_table.AreProgramsResidentNV(n, programs2, res);
325 crFree(programs2);
326 }
327 else {
328 retval = cr_server.head_spu->dispatch_table.AreProgramsResidentNV(n, programs, res);
329 }
330
331 crServerReturnValue(res, n * sizeof(GLboolean));
332 crFree(res);
333
334 return retval; /* WILL PROBABLY BE IGNORED */
335}
注意: 瀏覽 TracBrowser 來幫助您使用儲存庫瀏覽器

© 2025 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette