1 | /* Copyright (c) 2001, Stanford University
|
---|
2 | * All rights reserved
|
---|
3 | *
|
---|
4 | * See the file LICENSE.txt for information on redistributing this software.
|
---|
5 | */
|
---|
6 |
|
---|
7 | #include "renderspu.h"
|
---|
8 |
|
---|
9 | #include "cr_string.h"
|
---|
10 | #include "cr_mem.h"
|
---|
11 | #include "cr_error.h"
|
---|
12 | #include "cr_environment.h"
|
---|
13 | #include "cr_url.h"
|
---|
14 |
|
---|
15 |
|
---|
16 | static void set_window_geometry( RenderSPU *render_spu, const char *response )
|
---|
17 | {
|
---|
18 | int x, y, w, h;
|
---|
19 | CRASSERT(response[0] == '[');
|
---|
20 | sscanf( response, "[ %d, %d, %d, %d ]", &x, &y, &w, &h );
|
---|
21 | render_spu->defaultX = (int) x;
|
---|
22 | render_spu->defaultY = (int) y;
|
---|
23 | render_spu->defaultWidth = (unsigned int) w;
|
---|
24 | render_spu->defaultHeight = (unsigned int) h;
|
---|
25 | }
|
---|
26 |
|
---|
27 | static void set_default_visual( RenderSPU *render_spu, const char *response )
|
---|
28 | {
|
---|
29 | if (crStrlen(response) > 0) {
|
---|
30 | if (crStrstr(response, "rgb"))
|
---|
31 | render_spu->default_visual |= CR_RGB_BIT;
|
---|
32 | if (crStrstr(response, "alpha"))
|
---|
33 | render_spu->default_visual |= CR_ALPHA_BIT;
|
---|
34 | if (crStrstr(response, "z") || crStrstr(response, "depth"))
|
---|
35 | render_spu->default_visual |= CR_DEPTH_BIT;
|
---|
36 | if (crStrstr(response, "stencil"))
|
---|
37 | render_spu->default_visual |= CR_STENCIL_BIT;
|
---|
38 | if (crStrstr(response, "accum"))
|
---|
39 | render_spu->default_visual |= CR_ACCUM_BIT;
|
---|
40 | if (crStrstr(response, "stereo"))
|
---|
41 | render_spu->default_visual |= CR_STEREO_BIT;
|
---|
42 | if (crStrstr(response, "multisample"))
|
---|
43 | render_spu->default_visual |= CR_MULTISAMPLE_BIT;
|
---|
44 | if (crStrstr(response, "double"))
|
---|
45 | render_spu->default_visual |= CR_DOUBLE_BIT;
|
---|
46 | if (crStrstr(response, "pbuffer"))
|
---|
47 | render_spu->default_visual |= CR_PBUFFER_BIT;
|
---|
48 | }
|
---|
49 | }
|
---|
50 |
|
---|
51 | static void set_display_string( RenderSPU *render_spu, const char *response )
|
---|
52 | {
|
---|
53 | if (!crStrcmp(response, "DEFAULT")) {
|
---|
54 | const char *display = crGetenv("DISPLAY");
|
---|
55 | if (display)
|
---|
56 | crStrncpy(render_spu->display_string,
|
---|
57 | display,
|
---|
58 | sizeof(render_spu->display_string));
|
---|
59 | else
|
---|
60 | crStrcpy(render_spu->display_string, ""); /* empty string */
|
---|
61 | }
|
---|
62 | else {
|
---|
63 | crStrncpy(render_spu->display_string,
|
---|
64 | response,
|
---|
65 | sizeof(render_spu->display_string));
|
---|
66 | }
|
---|
67 | }
|
---|
68 |
|
---|
69 | static void set_fullscreen( RenderSPU *render_spu, const char *response )
|
---|
70 | {
|
---|
71 | sscanf( response, "%d", &(render_spu->fullscreen) );
|
---|
72 | }
|
---|
73 |
|
---|
74 | static void set_on_top( RenderSPU *render_spu, const char *response )
|
---|
75 | {
|
---|
76 | sscanf( response, "%d", &(render_spu->ontop) );
|
---|
77 | }
|
---|
78 |
|
---|
79 | static void set_system_gl_path( RenderSPU *render_spu, const char *response )
|
---|
80 | {
|
---|
81 | if (crStrlen(response) > 0)
|
---|
82 | crSetenv( "CR_SYSTEM_GL_PATH", response );
|
---|
83 | }
|
---|
84 |
|
---|
85 | static void set_title( RenderSPU *render_spu, const char *response )
|
---|
86 | {
|
---|
87 | crFree( render_spu->window_title );
|
---|
88 | render_spu->window_title = crStrdup( response );
|
---|
89 | }
|
---|
90 |
|
---|
91 | #if defined(GLX)
|
---|
92 | static void set_try_direct( RenderSPU *render_spu, const char *response )
|
---|
93 | {
|
---|
94 | sscanf( response, "%d", &(render_spu->try_direct) );
|
---|
95 | }
|
---|
96 |
|
---|
97 | static void set_force_direct( RenderSPU *render_spu, const char *response )
|
---|
98 | {
|
---|
99 | sscanf( response, "%d", &(render_spu->force_direct) );
|
---|
100 | }
|
---|
101 | #endif /* GLX */
|
---|
102 |
|
---|
103 | static void render_to_app_window( RenderSPU *render_spu, const char *response )
|
---|
104 | {
|
---|
105 | sscanf( response, "%d", &(render_spu->render_to_app_window) );
|
---|
106 | }
|
---|
107 |
|
---|
108 | static void render_to_crut_window( RenderSPU *render_spu, const char *response )
|
---|
109 | {
|
---|
110 | sscanf( response, "%d", &(render_spu->render_to_crut_window) );
|
---|
111 | }
|
---|
112 |
|
---|
113 | static void resizable( RenderSPU *render_spu, const char *response )
|
---|
114 | {
|
---|
115 | sscanf( response, "%d", &(render_spu->resizable) );
|
---|
116 | }
|
---|
117 |
|
---|
118 | static void set_borderless( RenderSPU *render_spu, const char *response )
|
---|
119 | {
|
---|
120 | sscanf( response, "%d", &(render_spu->borderless) );
|
---|
121 | }
|
---|
122 |
|
---|
123 | static void set_cursor( RenderSPU *render_spu, const char *response )
|
---|
124 | {
|
---|
125 | sscanf( response, "%d", &(render_spu->drawCursor) );
|
---|
126 | }
|
---|
127 |
|
---|
128 | static void gather_url( RenderSPU *render_spu, const char *response )
|
---|
129 | {
|
---|
130 | char protocol[4096], hostname[4096];
|
---|
131 | unsigned short port;
|
---|
132 |
|
---|
133 | if (!crParseURL(response, protocol, hostname, &port, 0))
|
---|
134 | {
|
---|
135 | crError( "Malformed URL: \"%s\"", response );
|
---|
136 | }
|
---|
137 |
|
---|
138 | render_spu->gather_port = port;
|
---|
139 | }
|
---|
140 |
|
---|
141 | static void gather_userbuf( RenderSPU *render_spu, const char *response )
|
---|
142 | {
|
---|
143 | sscanf( response, "%d", &(render_spu->gather_userbuf_size) );
|
---|
144 | }
|
---|
145 |
|
---|
146 | static void set_lut8( RenderSPU *render_spu, const char *response )
|
---|
147 | {
|
---|
148 | int a;
|
---|
149 | char **lut;
|
---|
150 |
|
---|
151 | if (!response[0]) return;
|
---|
152 |
|
---|
153 | lut = crStrSplit(response, ",");
|
---|
154 | if (!lut) return;
|
---|
155 |
|
---|
156 | for (a=0; a<256; a++)
|
---|
157 | {
|
---|
158 | render_spu->lut8[0][a] = crStrToInt(lut[a]);
|
---|
159 | render_spu->lut8[1][a] = crStrToInt(lut[256+a]);
|
---|
160 | render_spu->lut8[2][a] = crStrToInt(lut[512+a]);
|
---|
161 | }
|
---|
162 |
|
---|
163 | crFreeStrings(lut);
|
---|
164 |
|
---|
165 | render_spu->use_lut8 = 1;
|
---|
166 | }
|
---|
167 |
|
---|
168 | static void set_master_url ( RenderSPU *render_spu, char *response )
|
---|
169 | {
|
---|
170 | if (response[0])
|
---|
171 | render_spu->swap_master_url = crStrdup( response );
|
---|
172 | else
|
---|
173 | render_spu->swap_master_url = NULL;
|
---|
174 | }
|
---|
175 |
|
---|
176 | static void set_is_master ( RenderSPU *render_spu, char *response )
|
---|
177 | {
|
---|
178 | render_spu->is_swap_master = crStrToInt( response );
|
---|
179 | }
|
---|
180 |
|
---|
181 | static void set_num_clients ( RenderSPU *render_spu, char *response )
|
---|
182 | {
|
---|
183 | render_spu->num_swap_clients = crStrToInt( response );
|
---|
184 | }
|
---|
185 |
|
---|
186 | static void set_use_osmesa ( RenderSPU *render_spu, char *response )
|
---|
187 | {
|
---|
188 | int val = crStrToInt( response );
|
---|
189 | #ifdef USE_OSMESA
|
---|
190 | render_spu->use_osmesa = val;
|
---|
191 | #else
|
---|
192 | if (val != 0)
|
---|
193 | crError( "renderspu with Conf(use_osmesa, 1) but not compiled with -DUSE_OSMESA");
|
---|
194 | #endif
|
---|
195 | }
|
---|
196 |
|
---|
197 | static void set_nv_swap_group( RenderSPU *render_spu, char *response )
|
---|
198 | {
|
---|
199 | render_spu->nvSwapGroup = crStrToInt( response );
|
---|
200 | if (render_spu->nvSwapGroup < 0)
|
---|
201 | render_spu->nvSwapGroup = 0;
|
---|
202 | }
|
---|
203 |
|
---|
204 | static void set_ignore_papi( RenderSPU *render_spu, char *response )
|
---|
205 | {
|
---|
206 | render_spu->ignore_papi = crStrToInt( response );
|
---|
207 | }
|
---|
208 |
|
---|
209 | static void set_ignore_window_moves( RenderSPU *render_spu, char *response )
|
---|
210 | {
|
---|
211 | render_spu->ignore_window_moves = crStrToInt( response );
|
---|
212 | }
|
---|
213 |
|
---|
214 | static void set_pbuffer_size( RenderSPU *render_spu, const char *response )
|
---|
215 | {
|
---|
216 | CRASSERT(response[0] == '[');
|
---|
217 | sscanf( response, "[ %d, %d ]",
|
---|
218 | &render_spu->pbufferWidth, &render_spu->pbufferHeight);
|
---|
219 | }
|
---|
220 |
|
---|
221 | static void set_use_glxchoosevisual( RenderSPU *render_spu, char *response )
|
---|
222 | {
|
---|
223 | render_spu->use_glxchoosevisual = crStrToInt( response );
|
---|
224 | }
|
---|
225 |
|
---|
226 | static void set_draw_bbox( RenderSPU *render_spu, char *response )
|
---|
227 | {
|
---|
228 | render_spu->draw_bbox = crStrToInt( response );
|
---|
229 | }
|
---|
230 |
|
---|
231 |
|
---|
232 |
|
---|
233 | /* option, type, nr, default, min, max, title, callback
|
---|
234 | */
|
---|
235 | SPUOptions renderSPUOptions[] = {
|
---|
236 | { "title", CR_STRING, 1, "Chromium Render SPU", NULL, NULL,
|
---|
237 | "Window Title", (SPUOptionCB)set_title },
|
---|
238 |
|
---|
239 | { "window_geometry", CR_INT, 4, "[0, 0, 256, 256]", "[0, 0, 1, 1]", NULL,
|
---|
240 | "Default Window Geometry (x,y,w,h)", (SPUOptionCB)set_window_geometry },
|
---|
241 |
|
---|
242 | { "fullscreen", CR_BOOL, 1, "0", NULL, NULL,
|
---|
243 | "Full-screen Window", (SPUOptionCB)set_fullscreen },
|
---|
244 |
|
---|
245 | { "resizable", CR_BOOL, 1, "0", NULL, NULL,
|
---|
246 | "Resizable Window", (SPUOptionCB)resizable },
|
---|
247 |
|
---|
248 | { "on_top", CR_BOOL, 1, "0", NULL, NULL,
|
---|
249 | "Display on Top", (SPUOptionCB)set_on_top },
|
---|
250 |
|
---|
251 | { "borderless", CR_BOOL, 1, "0", NULL, NULL,
|
---|
252 | "Borderless Window", (SPUOptionCB) set_borderless },
|
---|
253 |
|
---|
254 | { "default_visual", CR_STRING, 1, "rgb, double, depth", NULL, NULL,
|
---|
255 | "Default GL Visual", (SPUOptionCB) set_default_visual },
|
---|
256 |
|
---|
257 | #if defined(GLX)
|
---|
258 | { "try_direct", CR_BOOL, 1, "1", NULL, NULL,
|
---|
259 | "Try Direct Rendering", (SPUOptionCB)set_try_direct },
|
---|
260 |
|
---|
261 | { "force_direct", CR_BOOL, 1, "0", NULL, NULL,
|
---|
262 | "Force Direct Rendering", (SPUOptionCB)set_force_direct },
|
---|
263 | #endif
|
---|
264 |
|
---|
265 | { "render_to_app_window", CR_BOOL, 1, "0", NULL, NULL,
|
---|
266 | "Render to Application window", (SPUOptionCB)render_to_app_window },
|
---|
267 |
|
---|
268 | { "render_to_crut_window", CR_BOOL, 1, "0", NULL, NULL,
|
---|
269 | "Render to CRUT window", (SPUOptionCB)render_to_crut_window },
|
---|
270 |
|
---|
271 | { "show_cursor", CR_BOOL, 1, "0", NULL, NULL,
|
---|
272 | "Show Software Cursor", (SPUOptionCB) set_cursor },
|
---|
273 |
|
---|
274 | { "system_gl_path", CR_STRING, 1, "", NULL, NULL,
|
---|
275 | "System GL Path", (SPUOptionCB)set_system_gl_path },
|
---|
276 |
|
---|
277 | { "display_string", CR_STRING, 1, "DEFAULT", NULL, NULL,
|
---|
278 | "X Display String", (SPUOptionCB)set_display_string },
|
---|
279 |
|
---|
280 | { "gather_url", CR_STRING, 1, "", NULL, NULL,
|
---|
281 | "Gatherer URL", (SPUOptionCB)gather_url},
|
---|
282 |
|
---|
283 | { "gather_userbuf_size", CR_INT, 1, "0", NULL, NULL,
|
---|
284 | "Size of Buffer to Allocate for Gathering", (SPUOptionCB)gather_userbuf},
|
---|
285 |
|
---|
286 | { "lut8", CR_STRING, 1, "", NULL, NULL,
|
---|
287 | "8 bit RGB LUT", (SPUOptionCB)set_lut8},
|
---|
288 |
|
---|
289 | { "swap_master_url", CR_STRING, 1, "", NULL, NULL,
|
---|
290 | "The URL to the master swapper", (SPUOptionCB)set_master_url },
|
---|
291 |
|
---|
292 | { "is_swap_master", CR_BOOL, 1, "0", NULL, NULL,
|
---|
293 | "Is this the swap master", (SPUOptionCB)set_is_master },
|
---|
294 |
|
---|
295 | { "num_swap_clients", CR_INT, 1, "1", NULL, NULL,
|
---|
296 | "How many swaps to wait on", (SPUOptionCB)set_num_clients },
|
---|
297 |
|
---|
298 | { "use_osmesa", CR_BOOL, 1, "0", NULL, NULL,
|
---|
299 | "Use offscreen rendering with Mesa", (SPUOptionCB)set_use_osmesa },
|
---|
300 |
|
---|
301 | { "nv_swap_group", CR_INT, 1, "0", NULL, NULL,
|
---|
302 | "NVIDIA Swap Group Number", (SPUOptionCB) set_nv_swap_group },
|
---|
303 |
|
---|
304 | { "ignore_papi", CR_BOOL, 1, "0", NULL, NULL,
|
---|
305 | "Ignore Barrier and Semaphore calls", (SPUOptionCB) set_ignore_papi },
|
---|
306 |
|
---|
307 | { "ignore_window_moves", CR_BOOL, 1, "0", NULL, NULL,
|
---|
308 | "Ignore crWindowPosition calls", (SPUOptionCB) set_ignore_window_moves },
|
---|
309 |
|
---|
310 | { "pbuffer_size", CR_INT, 2, "[0, 0]", "[0, 0]", NULL,
|
---|
311 | "Maximum PBuffer Size", (SPUOptionCB) set_pbuffer_size },
|
---|
312 |
|
---|
313 | { "use_glxchoosevisual", CR_BOOL, 1, "1", NULL, NULL,
|
---|
314 | "Use glXChooseVisual", (SPUOptionCB) set_use_glxchoosevisual },
|
---|
315 |
|
---|
316 | { "draw_bbox", CR_BOOL, 1, "0", NULL, NULL,
|
---|
317 | "Draw Bounding Boxes", (SPUOptionCB) set_draw_bbox },
|
---|
318 | { NULL, CR_BOOL, 0, NULL, NULL, NULL, NULL, NULL },
|
---|
319 | };
|
---|
320 |
|
---|
321 |
|
---|
322 | void renderspuSetVBoxConfiguration( RenderSPU *render_spu )
|
---|
323 | {
|
---|
324 | int a;
|
---|
325 |
|
---|
326 | for (a=0; a<256; a++)
|
---|
327 | {
|
---|
328 | render_spu->lut8[0][a] =
|
---|
329 | render_spu->lut8[1][a] =
|
---|
330 | render_spu->lut8[2][a] = a;
|
---|
331 | }
|
---|
332 | render_spu->use_lut8 = 0;
|
---|
333 |
|
---|
334 | set_title(render_spu, "Chromium Render SPU");
|
---|
335 | set_window_geometry(render_spu, "[0, 0, 0, 0]");
|
---|
336 | set_fullscreen(render_spu, "0");
|
---|
337 | resizable(render_spu, "0");
|
---|
338 | set_on_top(render_spu, "1");
|
---|
339 | set_borderless(render_spu, "1");
|
---|
340 | set_default_visual(render_spu, "rgb, double, depth");
|
---|
341 | #if defined(GLX)
|
---|
342 | set_try_direct(render_spu, "1");
|
---|
343 | set_force_direct(render_spu, "0");
|
---|
344 | #endif
|
---|
345 | render_to_app_window(render_spu, "0");
|
---|
346 | render_to_crut_window(render_spu, "0");
|
---|
347 | set_cursor(render_spu, "0");
|
---|
348 | set_system_gl_path(render_spu, "");
|
---|
349 | set_display_string(render_spu, "DEFAULT");
|
---|
350 | gather_url(render_spu, "");
|
---|
351 | gather_userbuf(render_spu, "0");
|
---|
352 | set_lut8(render_spu, "");
|
---|
353 | set_master_url(render_spu, "");
|
---|
354 | set_is_master(render_spu, "0");
|
---|
355 | set_num_clients(render_spu, "1");
|
---|
356 | set_use_osmesa(render_spu, "0");
|
---|
357 | set_nv_swap_group(render_spu, "0");
|
---|
358 | set_ignore_papi(render_spu, "0");
|
---|
359 | set_ignore_window_moves(render_spu, "0");
|
---|
360 | set_pbuffer_size(render_spu, "[0, 0]");
|
---|
361 | set_use_glxchoosevisual(render_spu, "1");
|
---|
362 | set_draw_bbox(render_spu, "0");
|
---|
363 |
|
---|
364 | render_spu->swap_mtu = 1024 * 500;
|
---|
365 |
|
---|
366 | /* Some initialization that doesn't really have anything to do
|
---|
367 | * with configuration but which was done here before:
|
---|
368 | */
|
---|
369 | render_spu->use_L2 = 0;
|
---|
370 | render_spu->cursorX = 0;
|
---|
371 | render_spu->cursorY = 0;
|
---|
372 | #if defined(GLX)
|
---|
373 | render_spu->sync = 0;
|
---|
374 | #endif
|
---|
375 | }
|
---|
376 |
|
---|