gl1ctrace and gl2ctrace support
[spandex:spandex.git] / sct / symbian / common / src / symbian_sicommon.cpp
1 /*\r
2  * Spandex benchmark and test framework.\r
3  *\r
4  * Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).\r
5  *\r
6  * Contact: Kari J. Kangas <kari.j.kangas@nokia.com>\r
7  *\r
8  *   This framework is free software; you can redistribute it and/or modify it\r
9  * under the terms of the GNU Lesser General Public License as published by the\r
10  * Free Software Foundation, version 2.1 of the License.\r
11  *\r
12  *   This framework is distributed in the hope that it will be useful, but\r
13  * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\r
14  * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License\r
15  * for more details.\r
16  *\r
17  *   You should have received a copy of the GNU Lesser General Public License\r
18  * along with this framework; if not, see <http://www.gnu.org/licenses/>.\r
19  *\r
20  */\r
21 \r
22 /* Symbian includes */\r
23 #include <e32def.h>\r
24 #include <e32std.h>\r
25 #include <w32std.h>\r
26 #include <e32debug.h>\r
27 #include <hal.h>\r
28 \r
29 /* Stdlib includes*/\r
30 #include <math.h>\r
31 #include <string.h>\r
32 #include <stdio.h>\r
33 #include <stdarg.h>\r
34 \r
35 /* Includes from Spandex core */\r
36 #include "sct_sicommon.h"\r
37 #include "sct_utils.h"\r
38 #include "sct_module.h"\r
39 #include "sct_systemmodule.h"\r
40 \r
41 #include "CSpandexCommon.h"\r
42 #include "CPlatform.h"\r
43 \r
44 #if defined( INCLUDE_CPU_MODULE )\r
45 # include "sct_cpumodule.h"\r
46 #endif  /* defined( INCLUDE_CPU_MODULE )*/\r
47 \r
48 #if defined( INCLUDE_MEMORY_MODULE )\r
49 # include "sct_memorymodule.h"\r
50 #endif  /* defined( INCLUDE_MEMORY_MODULE ) */\r
51 \r
52 #if defined( INCLUDE_OPENGLES1_MODULE )\r
53 # include "sct_opengles1module.h"\r
54 #endif  /* defined( INCLUDE_OPENGLES1_MODULE ) */\r
55 \r
56 #if defined( INCLUDE_OPENGLES2_MODULE )\r
57 # include "sct_opengles2module.h"\r
58 #endif  /* defined( INCLUDE_OPENGLES2_MODULE )*/\r
59 \r
60 #if defined( INCLUDE_OPENVG_MODULE )\r
61 # include "sct_openvgmodule.h"\r
62 #endif  /* defined( INCLUDE_OPENVG_MODULE ) */\r
63 \r
64 #if defined( INCLUDE_VGU_MODULE )\r
65 # include "sct_vgumodule.h"\r
66 #endif  /* defined( INCLUDE_VGU_MODULE ) */\r
67 \r
68 #if defined( INCLUDE_VGI_MODULE )\r
69 # include "sct_vgimodule.h"\r
70 #endif  /* defined( INCLUDE_VGI_MODULE ) */\r
71 \r
72 #if defined( INCLUDE_VGTEST_MODULE )\r
73 # include "sct_vgtestmodule.h"\r
74 #endif  /* defined( INCLUDE_VGTEST_MODULE )*/\r
75 \r
76 #if defined( INCLUDE_GLTEST_MODULE )\r
77 # include "sct_gltestmodule.h"\r
78 #endif  /* defined( INCLUDE_GLTEST_MODULE ) */\r
79 \r
80 #if defined( INCLUDE_EGL_MODULE )\r
81 # include "sct_eglmodule.h"\r
82 #endif  /* defined( INCLUDE_EGL_MODULE ) */\r
83 \r
84 #if defined( INCLUDE_SYMBIANBITGDI_MODULE )\r
85 # include "sct_symbianbitgdimodule.h"\r
86 #endif  /* defined( INCLUDE_SYMBIANBITGDI_MODULE ) */ \r
87 \r
88 #if defined( INCLUDE_SYMBIANSVG_MODULE )\r
89 # include "sct_symbiansvgmodule.h"\r
90 #endif  /* defined( INCLUDE_SYMBIANSVG_MODULE ) */\r
91 \r
92 #if defined( INCLUDE_PVR_MODULE )\r
93 # include "sct_pvrmodule.h"\r
94 #endif  /* defined( INCLUDE_PVR_MODULE ) */\r
95 \r
96 #if defined( INCLUDE_VGCTRACE_MODULE )\r
97 # include "sct_vgctracemodule.h"\r
98 #endif  /* defined( INCLUDE_VGCTRACE_MODULE ) */ \r
99 \r
100 #if defined( INCLUDE_GL1CTRACE_MODULE )\r
101 # include "sct_gl1ctracemodule.h"\r
102 #endif  /* defined( INCLUDE_GL1CTRACE_MODULE ) */\r
103 \r
104 #if defined( INCLUDE_GL2CTRACE_MODULE )\r
105 # include "sct_gl2ctracemodule.h"\r
106 #endif  /* defined( INCLUDE_GL2CTRACE_MODULE ) */\r
107 \r
108 #define EMULATOR_TIMER_MULTIPLIER       1000\r
109 \r
110 /* ---------------------------------------------------------------------- */\r
111 /*!\r
112  *\r
113  *\r
114  */\r
115 void* siCommonGetContext( void )\r
116 {\r
117     return CPlatform::SpandexCommon();\r
118 }\r
119 \r
120 /* ---------------------------------------------------------------------- */\r
121 /*!\r
122  *\r
123  *\r
124  */\r
125 const char* siCommonQueryAttribute( void* aContext, SCTSystemAttribute aName )\r
126 {\r
127         CSpandexCommon* spandex = ( CSpandexCommon* )( aContext ? aContext : siCommonGetContext() );\r
128         \r
129     SCT_ASSERT( spandex == siCommonGetContext() );\r
130     SCT_ASSERT_ALWAYS( spandex != NULL );\r
131 \r
132         switch( aName )\r
133         {\r
134         case SCT_SYSINFO_DEVICE_TYPE:\r
135                 return spandex->DeviceInfo().deviceName;\r
136 \r
137         case SCT_SYSINFO_CPU:\r
138                 return spandex->DeviceInfo().cpu;\r
139                 \r
140     case SCT_SYSINFO_OS:\r
141                 return spandex->DeviceInfo().OS;\r
142 \r
143         case SCT_SYSINFO_RAM_TOTAL:\r
144                 return spandex->DeviceInfo().totalMemory;\r
145 \r
146         case SCT_SYSINFO_RAM_FREE:\r
147                 return spandex->DeviceInfo().freeMemory;\r
148                 \r
149         default:\r
150         SCT_ASSERT_ALWAYS( 0 );\r
151                 return NULL;\r
152         }\r
153 }\r
154 \r
155 /* ---------------------------------------------------------------------- */\r
156 /*!\r
157  *\r
158  *\r
159  *\r
160  */\r
161 unsigned long siCommonGetTimerFrequency( void* /*aContext*/ )\r
162 {       \r
163 #if defined( EKA2 )\r
164     return 1000;\r
165 #else   /* defined( EKA2 ) */\r
166         TInt timerPeriod; //in microseconds\r
167         TInt timerFreq;\r
168 \r
169         HAL::Get( HALData::ESystemTickPeriod, timerPeriod );\r
170 \r
171         timerFreq = 1000000 / timerPeriod; // in Hz\r
172 \r
173 /* Make Symbian timer in emulator to appear more accurate than what it really is */\r
174 # if defined( __WINS__ )\r
175     timerFreq *= EMULATOR_TIMER_MULTIPLIER;\r
176 # endif /* defined( __WINS__ ) */\r
177 \r
178         return timerFreq;\r
179 #endif  /* defined( EKA2 ) */\r
180 }\r
181 \r
182 /* ---------------------------------------------------------------------- */\r
183 /*!\r
184  *\r
185  *\r
186  *\r
187  */\r
188 unsigned long siCommonGetTimerTick( void* /*aContext*/ )\r
189 {\r
190 #if defined( EKA2 )\r
191     return User::NTickCount();\r
192 #else   /* defined( EKA2 ) */\r
193 # if defined( __WINS__ )\r
194         return ( unsigned long )( User::TickCount() * EMULATOR_TIMER_MULTIPLIER );\r
195 # else  /* defined( __WINS__ ) */\r
196         return ( unsigned long )( User::TickCount() );\r
197 # endif /* defined( __WINS__ ) */\r
198 #endif  /* defined( EKA2 ) */\r
199 }\r
200 \r
201 /* ---------------------------------------------------------------------- */\r
202 /*!\r
203  *\r
204  *\r
205  *\r
206  */\r
207 void siCommonDebugPrintf( void* aContext, const char* fmt, ... )\r
208 {\r
209         CSpandexCommon* spandex         = ( CSpandexCommon* )( aContext ? aContext : siCommonGetContext() );\r
210     char            buf[ 1024 ];\r
211     va_list         ap;\r
212     \r
213     SCT_ASSERT( spandex == siCommonGetContext() );\r
214     SCT_ASSERT_ALWAYS( spandex != NULL );\r
215     SCT_ASSERT_ALWAYS( fmt != NULL );   \r
216     \r
217     /* Following code has potential buffer overflow. Too bad symbian does not\r
218      * seem to support vnsprintf. */\r
219         va_start( ap, fmt );\r
220         vsprintf( buf, fmt, ap );\r
221         va_end( ap );\r
222 \r
223     RDebug::Printf( buf );\r
224 }\r
225 \r
226 /* ---------------------------------------------------------------------- */\r
227 /*!\r
228  *\r
229  *\r
230  *\r
231  */\r
232 void siCommonErrorMessage( void* aContext, const char* aErrorMessage )\r
233 {\r
234         CSpandexCommon* spandex     = ( CSpandexCommon* )( aContext ? aContext : siCommonGetContext() );\r
235     FILE*           outputFile  = NULL;\r
236 \r
237     SCT_ASSERT( spandex == siCommonGetContext() );\r
238     SCT_ASSERT_ALWAYS( spandex != NULL );\r
239 \r
240     outputFile = spandex->OutputFile();\r
241         if( outputFile )\r
242         {\r
243                 fprintf( outputFile, "\nSpandex Error\nMessage: %s\n", aErrorMessage );\r
244                 fflush( outputFile );\r
245         }\r
246 \r
247     CPlatform::DisplayError( "Spandex error", "See output file for details" );\r
248 }\r
249 \r
250 /* ---------------------------------------------------------------------- */\r
251 /*!\r
252  *\r
253  *\r
254  *\r
255  */\r
256 SCTLog* siCommonGetErrorLog( void* /*context*/ )\r
257 {\r
258     return CPlatform::GetLog();\r
259 }\r
260 \r
261 /* ---------------------------------------------------------------------- */\r
262 /*!\r
263  *\r
264  *\r
265  *\r
266  */\r
267 void siCommonSetErrorLog( void* /*context*/, SCTLog* log )\r
268 {\r
269     CPlatform::SetLog( log );\r
270 }\r
271 \r
272 /* ---------------------------------------------------------------------- */\r
273 /*!\r
274  *\r
275  *\r
276  *\r
277  */\r
278 void siCommonProgressMessage( void* /*aContext*/, int aTotalBenchmark, int aCurrentBenchmark, int aCurrentRepeat, const char* aBenchmarkName )\r
279 {\r
280         CPlatform::ReportProgress( aTotalBenchmark, aCurrentBenchmark, aCurrentRepeat, aBenchmarkName );\r
281 }\r
282 \r
283 /* ---------------------------------------------------------------------- */\r
284 /*!\r
285  *\r
286  * \r
287  *\r
288  */\r
289 void siCommonAssert( void* aContext, void* aExp, void* aFile, unsigned int aLine )\r
290 {\r
291         CSpandexCommon* spandex     = ( CSpandexCommon* )( aContext ? aContext : siCommonGetContext() );\r
292     FILE*           outputFile  = NULL;\r
293 \r
294         if( spandex != NULL )\r
295         {\r
296             outputFile = spandex->OutputFile();\r
297                 if( outputFile )\r
298                 {\r
299             siCommonFlushOutput( aContext );\r
300                 fprintf( outputFile, "\nSpandex assert failed.\nExpresion: ( %s )\nFile: %s\nLine: %d\n",\r
301                          ( char* )aExp, ( char* )aFile, ( int )aLine ); \r
302             fflush( outputFile );\r
303             fclose( outputFile );\r
304         }\r
305         }\r
306         \r
307     CPlatform::DisplayError( "Spandex assert", "See output file for details" );\r
308     User::Panic( _L( "Spandex assert" ), 0 );\r
309 }\r
310 \r
311 /* ---------------------------------------------------------------------- */\r
312 /*!\r
313  * \r
314  *\r
315  */\r
316 void* siCommonMemoryAlloc( void* /*aContext*/, unsigned int aSize )\r
317 {\r
318         return User::Alloc( aSize );\r
319 }\r
320 \r
321 /* ---------------------------------------------------------------------- */\r
322 /*!\r
323  * \r
324  *\r
325  */\r
326 void* siCommonMemoryRealloc( void* /*aContext*/, void* aData, unsigned int aSize )\r
327 {\r
328         return User::ReAlloc( aData, aSize );\r
329 }\r
330 \r
331 /* ---------------------------------------------------------------------- */\r
332 /*!\r
333  *\r
334  *\r
335  */\r
336 void siCommonMemoryFree( void* /*aContext*/, void* aMemblock )\r
337 {\r
338         User::Free( aMemblock );\r
339 }\r
340 \r
341 /* ---------------------------------------------------------------------- */\r
342 /*!\r
343  *\r
344  *\r
345  *\r
346  */\r
347 char siCommonReadChar( void* aContext )\r
348 {\r
349         char            ch;\r
350         CSpandexCommon* spandex = ( CSpandexCommon* )( aContext ? aContext : siCommonGetContext() );\r
351 \r
352     SCT_ASSERT_ALWAYS( spandex != NULL );\r
353 \r
354         return ( fread( &ch, sizeof( char ), 1, spandex->InputFile() ) == 1 ) ? ch : SCT_END_OF_INPUT;\r
355 }\r
356 \r
357 /* ---------------------------------------------------------------------- */\r
358 /*!\r
359  *\r
360  * \r
361  *\r
362  */\r
363 int siCommonWriteChar( void* aContext, char aCh )\r
364 {\r
365         CSpandexCommon* spandex = ( CSpandexCommon* )( aContext ? aContext : siCommonGetContext() );\r
366 \r
367     SCT_ASSERT( spandex == siCommonGetContext() );\r
368     SCT_ASSERT_ALWAYS( spandex != NULL );\r
369 \r
370     spandex->outputBuffer[ spandex->outputSize++ ] = aCh;\r
371     if( spandex->outputSize >= EOutputBufferSize )\r
372     {\r
373         return siCommonFlushOutput( aContext );\r
374     }\r
375     else\r
376     {\r
377         return 1;\r
378     }\r
379 }\r
380 \r
381 /* ---------------------------------------------------------------------- */\r
382 /*!\r
383  *\r
384  * \r
385  *\r
386  */\r
387 int siCommonFlushOutput( void* aContext )\r
388 {\r
389         CSpandexCommon* spandex = ( CSpandexCommon* )( aContext ? aContext : siCommonGetContext() );\r
390     int             n;\r
391     \r
392     SCT_ASSERT( spandex == siCommonGetContext() );\r
393     SCT_ASSERT_ALWAYS( spandex != NULL );\r
394     SCT_ASSERT_ALWAYS( spandex->OutputFile() != NULL );\r
395 \r
396     n = fwrite( spandex->outputBuffer, spandex->outputSize, 1, spandex->OutputFile() );\r
397 \r
398     spandex->outputSize = 0;\r
399     fflush( spandex->OutputFile() );\r
400 \r
401     return ( n == 1 );\r
402 }\r
403 \r
404 /* ---------------------------------------------------------------------- */\r
405 /*!\r
406  *\r
407  *\r
408  *\r
409  */\r
410 SCTModuleList* siCommonGetModules( void* /*context*/ )\r
411 {\r
412     SCTModuleList*  modules;\r
413     SCTModule*      module;\r
414 \r
415     modules = sctCreateModuleList();\r
416     if( modules == NULL )\r
417     {\r
418         return NULL;\r
419     }\r
420 \r
421     module = sctCreateSystemModule();\r
422     if( module == NULL || sctAddModuleToList( modules, module ) == SCT_FALSE )\r
423     {\r
424         sctDestroyModuleList( modules );\r
425         return NULL;\r
426     }\r
427 \r
428 #if defined( INCLUDE_CPU_MODULE )\r
429     module = sctCreateCpuModule();\r
430     if( module == NULL || sctAddModuleToList( modules, module ) == SCT_FALSE )\r
431     {\r
432         sctDestroyModuleList( modules );\r
433         return NULL;\r
434     }\r
435 #endif  /* defined( INCLUDE_CPU_MODULE ) */\r
436 \r
437 #if defined( INCLUDE_MEMORY_MODULE )\r
438     module = sctCreateMemoryModule();\r
439     if( module == NULL || sctAddModuleToList( modules, module ) == SCT_FALSE )\r
440     {\r
441         sctDestroyModuleList( modules );\r
442         return NULL;\r
443     }\r
444 #endif  /* defined( INCLUDE_MEMORY_MODULE ) */\r
445 \r
446 #if defined( INCLUDE_OPENGLES1_MODULE )\r
447     module = sctCreateOpenGLES1Module();\r
448     if( module == NULL || sctAddModuleToList( modules, module ) == SCT_FALSE )\r
449     {\r
450         sctDestroyModuleList( modules );\r
451         return NULL;\r
452     }\r
453 #endif  /* defined( INCLUDE_OPENGLES1_MODULE ) */\r
454     \r
455 #if defined( INCLUDE_OPENGLES2_MODULE )\r
456     module = sctCreateOpenGLES2Module();\r
457     if( module == NULL || sctAddModuleToList( modules, module ) == SCT_FALSE )\r
458     {\r
459         sctDestroyModuleList( modules );\r
460         return NULL;\r
461     }\r
462 #endif  /* defined( INCLUDE_OPENGLES2_MODULE ) */\r
463 \r
464 #if defined( INCLUDE_OPENVG_MODULE )\r
465     module = sctCreateOpenVGModule();\r
466     if( module == NULL || sctAddModuleToList( modules, module ) == SCT_FALSE )\r
467     {\r
468         sctDestroyModuleList( modules );\r
469         return NULL;\r
470     }\r
471 #endif  /* defined( INCLUDE_OPENVG_MODULE ) */\r
472 \r
473 #if defined( INCLUDE_VGU_MODULE )\r
474     module = sctCreateVguModule();\r
475     if( module == NULL || sctAddModuleToList( modules, module ) == SCT_FALSE )\r
476     {\r
477         sctDestroyModuleList( modules );\r
478         return NULL;\r
479     }\r
480 #endif  /* defined( INCLUDE_VGU_MODULE ) */\r
481     \r
482 #if defined( INCLUDE_VGI_MODULE )\r
483     module = sctCreateVgiModule();\r
484     if( module == NULL || sctAddModuleToList( modules, module ) == SCT_FALSE )\r
485     {\r
486         sctDestroyModuleList( modules );\r
487         return NULL;\r
488     }\r
489 #endif  /* defined( INCLUDE_VGI_MODULE ) */\r
490 \r
491 #if defined( INCLUDE_VGTEST_MODULE )\r
492     module = sctCreateVgtestModule();\r
493     if( module == NULL || sctAddModuleToList( modules, module ) == SCT_FALSE )\r
494     {\r
495         sctDestroyModuleList( modules );\r
496         return NULL;\r
497     }\r
498 #endif  /* defined( INCLUDE_VGTEST_MODULE ) */\r
499 \r
500 #if defined( INCLUDE_GLTEST_MODULE )\r
501     module = sctCreateGltestModule();\r
502     if( module == NULL || sctAddModuleToList( modules, module ) == SCT_FALSE )\r
503     {\r
504         sctDestroyModuleList( modules );\r
505         return NULL;\r
506     }\r
507 #endif  /* defined( INCLUDE_GLTEST_MODULE ) */\r
508 \r
509 #if defined( INCLUDE_EGL_MODULE )\r
510     module = sctCreateEglModule();\r
511     if( module == NULL || sctAddModuleToList( modules, module ) == SCT_FALSE )\r
512     {\r
513         sctDestroyModuleList( modules );\r
514         return NULL;\r
515     }\r
516 #endif  /* defined( INCLUDE_EGL_MODULE ) */\r
517 \r
518 #if defined( INCLUDE_SYMBIANBITGDI_MODULE )\r
519     module = sctCreateSymbianBitGDIModule();\r
520     if( module == NULL || sctAddModuleToList( modules, module ) == SCT_FALSE )\r
521     {\r
522         sctDestroyModuleList( modules );\r
523         return NULL;\r
524     }\r
525 #endif  /* defined( INCLUDE_SYMBIANBITGDI_MODULE ) */\r
526 \r
527 #if defined( INCLUDE_SYMBIANSVG_MODULE )\r
528     module = sctCreateSymbianSVGModule();\r
529     if( module == NULL || sctAddModuleToList( modules, module ) == SCT_FALSE )\r
530     {\r
531         sctDestroyModuleList( modules );\r
532         return NULL;\r
533     }\r
534 #endif  /* defined( INCLUDE_SYMBIANSVG_MODULE ) */\r
535 \r
536 #if defined( INCLUDE_PVR_MODULE )\r
537     module = sctCreatePvrModule();\r
538     if( module == NULL || sctAddModuleToList( modules, module ) == SCT_FALSE )\r
539     {\r
540         sctDestroyModuleList( modules );\r
541         return NULL;\r
542     }\r
543 #endif  /* defined( INCLUDE_PVR_MODULE ) */\r
544 \r
545 #if defined( INCLUDE_VGCTRACE_MODULE )\r
546     module = sctCreateVgCtraceModule();\r
547     if( module == NULL || sctAddModuleToList( modules, module ) == SCT_FALSE )\r
548     {\r
549         sctDestroyModuleList( modules );\r
550         return NULL;\r
551     }\r
552 #endif  /* defined( INCLUDE_VGCTRACE_MODULE ) */\r
553 \r
554 #if defined( INCLUDE_GL1CTRACE_MODULE )\r
555     module = sctCreateGl1CtraceModule();\r
556     if( module == NULL || sctAddModuleToList( modules, module ) == SCT_FALSE )\r
557     {\r
558         sctDestroyModuleList( modules );\r
559         return NULL;\r
560     }\r
561 #endif  /* defined( INCLUDE_GL1CTRACE_MODULE ) */\r
562 \r
563 #if defined( INCLUDE_GL2CTRACE_MODULE )\r
564     module = sctCreateGl2CtraceModule();\r
565     if( module == NULL || sctAddModuleToList( modules, module ) == SCT_FALSE )\r
566     {\r
567         sctDestroyModuleList( modules );\r
568         return NULL;\r
569     }\r
570 #endif  /* defined( INCLUDE_GL2CTRACE_MODULE ) */\r
571     \r
572     return modules;\r
573 }\r
574 \r
575 /* ---------------------------------------------------------------------- */\r
576 /*!\r
577  *\r
578  *\r
579  *\r
580  */\r
581 void siCommonSleep( void* /*context*/, int micros )\r
582 {\r
583     //User::After( micros / 1000 );\r
584     User::AfterHighRes( micros );\r
585 }\r
586 \r
587 /* ---------------------------------------------------------------------- */\r
588 /*!\r
589  *\r
590  *\r
591  *\r
592  */\r
593 void siCommonYield( void* /*context*/ )\r
594 {\r
595     User::ResetInactivityTime();\r
596 }\r
597 \r
598 /* ---------------------------------------------------------------------- */\r
599 /*!\r
600  *\r
601  *\r
602  *\r
603  */\r
604 void siCommonGetTime( void* /*context*/, char* buffer, int length )\r
605 {\r
606     time_t      ltime;\r
607     struct tm*  today;\r
608 \r
609     SCT_ASSERT_ALWAYS( length >= 1 );\r
610 \r
611     time( &ltime );\r
612     today = localtime( &ltime );\r
613     if( strftime( buffer, length, "%Y-%m-%d %H:%M:%S", today ) == 0 )\r
614     {\r
615         buffer[ 0 ] = '\0';\r
616     }\r
617 }\r
618 \r
619 /* ---------------------------------------------------------------------- */\r
620 /*!\r
621  *\r
622  *\r
623  */\r
624 void* siCommonGetSingleton( void* aContext )\r
625 {\r
626     CSpandexCommon* spandex = ( CSpandexCommon* )( aContext ? aContext : siCommonGetContext() );\r
627 \r
628     SCT_ASSERT_ALWAYS( spandex != NULL );\r
629 \r
630     return spandex->GetSingleton();\r
631 }\r
632 \r
633 /* ---------------------------------------------------------------------- */\r
634 /*!\r
635  *\r
636  *\r
637  */\r
638 void siCommonSetSingleton( void* aContext, void* ptr )\r
639 {\r
640     CSpandexCommon* spandex     = ( CSpandexCommon* )( aContext ? aContext : siCommonGetContext() );\r
641 \r
642     SCT_ASSERT_ALWAYS( spandex != NULL );\r
643 \r
644     return spandex->SetSingleton( ptr );\r
645 }\r
646 \r
647 /* ---------------------------------------------------------------------- */\r
648 /*!\r
649  *\r
650  *\r
651  */\r
652 SCTExtensionProc siCommonGetProcAddress( void* context, const char* procname )\r
653 {\r
654     SCT_USE_VARIABLE( context );\r
655 \r
656 #if defined( INCLUDE_EGL_MODULE )\r
657     return ( SCTExtensionProc )( sctEglGetProcAddress( procname ) );\r
658 #else   /* defined( INCLUDE_EGL_MODULE ) */\r
659     SCT_USE_VARIABLE( procname );\r
660     return NULL;\r
661 #endif  /* defined( INCLUDE_EGL_MODULE ) */\r
662 }\r