738d1893dbec98d8735a178784af1ac18b6b3469
[firefly-linux-kernel-4.4.55.git] / drivers / staging / rk29 / vivante / hal / inc / gc_hal_base.h
1 /****************************************************************************
2 *
3 *    Copyright (C) 2005 - 2010 by Vivante Corp.
4 *
5 *    This program is free software; you can redistribute it and/or modify
6 *    it under the terms of the GNU General Public License as published by
7 *    the Free Software Foundation; either version 2 of the license, or
8 *    (at your option) any later version.
9 *
10 *    This program is distributed in the hope that it will be useful,
11 *    but WITHOUT ANY WARRANTY; without even the implied warranty of
12 *    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 *    GNU General Public License for more details.
14 *
15 *    You should have received a copy of the GNU General Public License
16 *    along with this program; if not write to the Free Software
17 *    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
18 *
19 *****************************************************************************/
20
21
22
23
24 #ifndef __gc_hal_base_h_
25 #define __gc_hal_base_h_
26
27 #include "gc_hal_enum.h"
28 #include "gc_hal_types.h"
29 #include "gc_hal_dump.h"
30
31 #ifdef __cplusplus
32 extern "C" {
33 #endif
34
35 /******************************************************************************\
36 ****************************** Object Declarations *****************************
37 \******************************************************************************/
38
39 typedef struct _gcoHAL *                gcoHAL;
40 typedef struct _gcoOS *                 gcoOS;
41 typedef struct _gco2D *                 gco2D;
42 typedef struct _gcoVG *                 gcoVG;
43 typedef struct _gco3D *                 gco3D;
44 typedef struct _gcoSURF *               gcoSURF;
45 typedef struct _gcsSURF_INFO *          gcsSURF_INFO_PTR;
46 typedef struct _gcsSURF_NODE *          gcsSURF_NODE_PTR;
47 typedef struct _gcsSURF_FORMAT_INFO *   gcsSURF_FORMAT_INFO_PTR;
48 typedef struct _gcsPOINT *              gcsPOINT_PTR;
49 typedef struct _gcsSIZE *               gcsSIZE_PTR;
50 typedef struct _gcsRECT *               gcsRECT_PTR;
51 typedef struct _gcsBOUNDARY *           gcsBOUNDARY_PTR;
52 typedef struct _gcoDUMP *               gcoDUMP;
53 typedef struct _gcoHARDWARE *           gcoHARDWARE;
54
55 /******************************************************************************\
56 ********************************* Enumerations *********************************
57 \******************************************************************************/
58
59 /* Video memory pool type. */
60 typedef enum _gcePOOL
61 {
62     gcvPOOL_UNKNOWN,
63     gcvPOOL_DEFAULT,
64     gcvPOOL_LOCAL,
65     gcvPOOL_LOCAL_INTERNAL,
66     gcvPOOL_LOCAL_EXTERNAL,
67     gcvPOOL_UNIFIED,
68     gcvPOOL_SYSTEM,
69     gcvPOOL_VIRTUAL,
70     gcvPOOL_USER,
71     gcvPOOL_CONTIGUOUS
72 }
73 gcePOOL;
74
75 /* Blending functions. */
76 typedef enum _gceBLEND_FUNCTION
77 {
78     gcvBLEND_ZERO,
79     gcvBLEND_ONE,
80     gcvBLEND_SOURCE_COLOR,
81     gcvBLEND_INV_SOURCE_COLOR,
82     gcvBLEND_SOURCE_ALPHA,
83     gcvBLEND_INV_SOURCE_ALPHA,
84     gcvBLEND_TARGET_COLOR,
85     gcvBLEND_INV_TARGET_COLOR,
86     gcvBLEND_TARGET_ALPHA,
87     gcvBLEND_INV_TARGET_ALPHA,
88     gcvBLEND_SOURCE_ALPHA_SATURATE,
89     gcvBLEND_CONST_COLOR,
90     gcvBLEND_INV_CONST_COLOR,
91     gcvBLEND_CONST_ALPHA,
92     gcvBLEND_INV_CONST_ALPHA,
93 }
94 gceBLEND_FUNCTION;
95
96 /* Blending modes. */
97 typedef enum _gceBLEND_MODE
98 {
99     gcvBLEND_ADD,
100     gcvBLEND_SUBTRACT,
101     gcvBLEND_REVERSE_SUBTRACT,
102     gcvBLEND_MIN,
103     gcvBLEND_MAX,
104 }
105 gceBLEND_MODE;
106
107 /* API flags. */
108 typedef enum _gceAPI
109 {
110     gcvAPI_D3D                  = 0x1,
111     gcvAPI_OPENGL               = 0x2,
112 }
113 gceAPI;
114
115 /* Depth modes. */
116 typedef enum _gceDEPTH_MODE
117 {
118     gcvDEPTH_NONE,
119     gcvDEPTH_Z,
120     gcvDEPTH_W,
121 }
122 gceDEPTH_MODE;
123
124 typedef enum _gceWHERE
125 {
126     gcvWHERE_COMMAND,
127     gcvWHERE_RASTER,
128     gcvWHERE_PIXEL,
129 }
130 gceWHERE;
131
132 typedef enum _gceHOW
133 {
134     gcvHOW_SEMAPHORE            = 0x1,
135     gcvHOW_STALL                = 0x2,
136     gcvHOW_SEMAPHORE_STALL      = 0x3,
137 }
138 gceHOW;
139
140 /******************************************************************************\
141 ********************************* gcoHAL Object *********************************
142 \******************************************************************************/
143
144 /* Construct a new gcoHAL object. */
145 gceSTATUS
146 gcoHAL_Construct(
147     IN gctPOINTER Context,
148     IN gcoOS Os,
149     OUT gcoHAL * Hal
150     );
151
152 /* Destroy an gcoHAL object. */
153 gceSTATUS
154 gcoHAL_Destroy(
155     IN gcoHAL Hal
156     );
157
158 /* Get pointer to gco2D object. */
159 gceSTATUS
160 gcoHAL_Get2DEngine(
161     IN gcoHAL Hal,
162     OUT gco2D * Engine
163     );
164
165 /* Get pointer to gcoVG object. */
166 gceSTATUS
167 gcoHAL_GetVGEngine(
168     IN gcoHAL Hal,
169     OUT gcoVG * Engine
170     );
171
172 /* Get pointer to gco3D object. */
173 gceSTATUS
174 gcoHAL_Get3DEngine(
175     IN gcoHAL Hal,
176     OUT gco3D * Engine
177     );
178
179 /* Verify whether the specified feature is available in hardware. */
180 gceSTATUS
181 gcoHAL_IsFeatureAvailable(
182     IN gcoHAL Hal,
183     IN gceFEATURE Feature
184     );
185
186 /* Query the identity of the hardware. */
187 gceSTATUS
188 gcoHAL_QueryChipIdentity(
189     IN gcoHAL Hal,
190     OUT gceCHIPMODEL* ChipModel,
191     OUT gctUINT32* ChipRevision,
192     OUT gctUINT32* ChipFeatures,
193     OUT gctUINT32* ChipMinorFeatures
194     );
195
196 /* Query the amount of video memory. */
197 gceSTATUS
198 gcoHAL_QueryVideoMemory(
199     IN gcoHAL Hal,
200     OUT gctPHYS_ADDR * InternalAddress,
201     OUT gctSIZE_T * InternalSize,
202     OUT gctPHYS_ADDR * ExternalAddress,
203     OUT gctSIZE_T * ExternalSize,
204     OUT gctPHYS_ADDR * ContiguousAddress,
205     OUT gctSIZE_T * ContiguousSize
206     );
207
208 /* Map video memory. */
209 gceSTATUS
210 gcoHAL_MapMemory(
211     IN gcoHAL Hal,
212     IN gctPHYS_ADDR Physical,
213     IN gctSIZE_T NumberOfBytes,
214     OUT gctPOINTER * Logical
215     );
216
217 /* Unmap video memory. */
218 gceSTATUS
219 gcoHAL_UnmapMemory(
220     IN gcoHAL Hal,
221     IN gctPHYS_ADDR Physical,
222     IN gctSIZE_T NumberOfBytes,
223     IN gctPOINTER Logical
224     );
225
226 /* Schedule an unmap of a buffer mapped through its physical address. */
227 gceSTATUS
228 gcoHAL_ScheduleUnmapMemory(
229     IN gcoHAL Hal,
230     IN gctPHYS_ADDR Physical,
231     IN gctSIZE_T NumberOfBytes,
232     IN gctPOINTER Logical
233     );
234
235 /* Schedule an unmap of a user buffer using event mechanism. */
236 gceSTATUS
237 gcoHAL_ScheduleUnmapUserMemory(
238     IN gcoHAL Hal,
239     IN gctPOINTER Info,
240     IN gctSIZE_T Size,
241     IN gctUINT32 Address,
242     IN gctPOINTER Memory
243     );
244
245 /* Commit the current command buffer. */
246 gceSTATUS
247 gcoHAL_Commit(
248     IN gcoHAL Hal,
249     IN gctBOOL Stall
250     );
251
252 /* Query the tile capabilities. */
253 gceSTATUS
254 gcoHAL_QueryTiled(
255     IN gcoHAL Hal,
256     OUT gctINT32 * TileWidth2D,
257     OUT gctINT32 * TileHeight2D,
258     OUT gctINT32 * TileWidth3D,
259     OUT gctINT32 * TileHeight3D
260     );
261
262 gceSTATUS
263 gcoHAL_Compact(
264     IN gcoHAL Hal
265     );
266
267 gceSTATUS
268 gcoHAL_ProfileStart(
269     IN gcoHAL Hal
270     );
271
272 gceSTATUS
273 gcoHAL_ProfileEnd(
274     IN gcoHAL Hal,
275     IN gctCONST_STRING Title
276     );
277
278 /* Power Management */
279 gceSTATUS
280 gcoHAL_SetPowerManagementState(
281     IN gcoHAL Hal,
282     IN gceCHIPPOWERSTATE State
283     );
284
285 gceSTATUS
286 gcoHAL_QueryPowerManagementState(
287     IN gcoHAL Hal,
288     OUT gceCHIPPOWERSTATE *State
289     );
290
291 /* Set the filter type for filter blit. */
292 gceSTATUS
293 gcoHAL_SetFilterType(
294     IN gcoHAL Hal,
295     IN gceFILTER_TYPE FilterType
296     );
297
298 gceSTATUS
299 gcoHAL_GetDump(
300     IN gcoHAL Hal,
301     OUT gcoDUMP * Dump
302     );
303
304 /* Call the kernel HAL layer. */
305 gceSTATUS
306 gcoHAL_Call(
307     IN gcoHAL Hal,
308     IN OUT gcsHAL_INTERFACE_PTR Interface
309     );
310
311 /* Schedule an event. */
312 gceSTATUS
313 gcoHAL_ScheduleEvent(
314     IN gcoHAL Hal,
315     IN OUT gcsHAL_INTERFACE_PTR Interface
316     );
317
318 /* Destroy a surface. */
319 gceSTATUS
320 gcoHAL_DestroySurface(
321     IN gcoHAL Hal,
322     IN gcoSURF Surface
323     );
324
325 /******************************************************************************\
326 ********************************** gcoOS Object *********************************
327 \******************************************************************************/
328
329 /* Construct a new gcoOS object. */
330 gceSTATUS
331 gcoOS_Construct(
332     IN gctPOINTER Context,
333     OUT gcoOS * Os
334     );
335
336 /* Destroy an gcoOS object. */
337 gceSTATUS
338 gcoOS_Destroy(
339     IN gcoOS Os
340     );
341
342 /* Get the base address for the physical memory. */
343 gceSTATUS
344 gcoOS_GetBaseAddress(
345     IN gcoOS Os,
346     OUT gctUINT32_PTR BaseAddress
347     );
348
349 /* Allocate memory from the heap. */
350 gceSTATUS
351 gcoOS_Allocate(
352     IN gcoOS Os,
353     IN gctSIZE_T Bytes,
354     OUT gctPOINTER * Memory
355     );
356
357 /* Free allocated memory. */
358 gceSTATUS
359 gcoOS_Free(
360     IN gcoOS Os,
361     IN gctPOINTER Memory
362     );
363
364 /* Allocate memory. */
365 gceSTATUS
366 gcoOS_AllocateMemory(
367     IN gcoOS Os,
368     IN gctSIZE_T Bytes,
369     OUT gctPOINTER * Memory
370     );
371
372 /* Free memory. */
373 gceSTATUS
374 gcoOS_FreeMemory(
375     IN gcoOS Os,
376     IN gctPOINTER Memory
377     );
378
379 /* Allocate contiguous memory. */
380 gceSTATUS
381 gcoOS_AllocateContiguous(
382     IN gcoOS Os,
383     IN gctBOOL InUserSpace,
384     IN OUT gctSIZE_T * Bytes,
385     OUT gctPHYS_ADDR * Physical,
386     OUT gctPOINTER * Logical
387     );
388
389 /* Free contiguous memory. */
390 gceSTATUS
391 gcoOS_FreeContiguous(
392     IN gcoOS Os,
393     IN gctPHYS_ADDR Physical,
394     IN gctPOINTER Logical,
395     IN gctSIZE_T Bytes
396     );
397
398 /* Map user memory. */
399 gceSTATUS
400 gcoOS_MapUserMemory(
401     IN gcoOS Os,
402     IN gctPOINTER Memory,
403     IN gctSIZE_T Size,
404     OUT gctPOINTER * Info,
405     OUT gctUINT32_PTR Address
406     );
407
408 /* Unmap user memory. */
409 gceSTATUS
410 gcoOS_UnmapUserMemory(
411     IN gcoOS Os,
412     IN gctPOINTER Memory,
413     IN gctSIZE_T Size,
414     IN gctPOINTER Info,
415     IN gctUINT32 Address
416     );
417
418 /* Device I/O Control call to the kernel HAL layer. */
419 gceSTATUS
420 gcoOS_DeviceControl(
421     IN gcoOS Os,
422     IN gctUINT32 IoControlCode,
423     IN gctPOINTER InputBuffer,
424     IN gctSIZE_T InputBufferSize,
425     IN gctPOINTER OutputBuffer,
426     IN gctSIZE_T OutputBufferSize
427     );
428
429 /* Allocate non paged memory. */
430 gceSTATUS gcoOS_AllocateNonPagedMemory(
431         IN gcoOS Os,
432         IN gctBOOL InUserSpace,
433         IN OUT gctSIZE_T * Bytes,
434         OUT gctPHYS_ADDR * Physical,
435         OUT gctPOINTER * Logical
436         );
437
438 /* Free non paged memory. */
439 gceSTATUS gcoOS_FreeNonPagedMemory(
440         IN gcoOS Os,
441         IN gctSIZE_T Bytes,
442         IN gctPHYS_ADDR Physical,
443         IN gctPOINTER Logical
444         );
445
446 typedef enum _gceFILE_MODE
447 {
448     gcvFILE_CREATE          = 0,
449     gcvFILE_APPEND,
450     gcvFILE_READ,
451     gcvFILE_CREATETEXT,
452     gcvFILE_APPENDTEXT,
453     gcvFILE_READTEXT,
454 }
455 gceFILE_MODE;
456
457 /* Open a file. */
458 gceSTATUS
459 gcoOS_Open(
460     IN gcoOS Os,
461     IN gctCONST_STRING FileName,
462     IN gceFILE_MODE Mode,
463     OUT gctFILE * File
464     );
465
466 /* Close a file. */
467 gceSTATUS
468 gcoOS_Close(
469     IN gcoOS Os,
470     IN gctFILE File
471     );
472
473 /* Read data from a file. */
474 gceSTATUS
475 gcoOS_Read(
476     IN gcoOS Os,
477     IN gctFILE File,
478     IN gctSIZE_T ByteCount,
479     IN gctPOINTER Data,
480     OUT gctSIZE_T * ByteRead
481     );
482
483 /* Write data to a file. */
484 gceSTATUS
485 gcoOS_Write(
486     IN gcoOS Os,
487     IN gctFILE File,
488     IN gctSIZE_T ByteCount,
489     IN gctCONST_POINTER Data
490     );
491
492 typedef enum _gceFILE_WHENCE
493 {
494     gcvFILE_SEEK_SET,
495     gcvFILE_SEEK_CUR,
496     gcvFILE_SEEK_END
497 }
498 gceFILE_WHENCE;
499
500 /* Set the current position of a file. */
501 gceSTATUS
502 gcoOS_Seek(
503     IN gcoOS Os,
504     IN gctFILE File,
505     IN gctUINT32 Offset,
506     IN gceFILE_WHENCE Whence
507     );
508
509 /* Set the current position of a file. */
510 gceSTATUS
511 gcoOS_SetPos(
512     IN gcoOS Os,
513     IN gctFILE File,
514     IN gctUINT32 Position
515     );
516
517 /* Get the current position of a file. */
518 gceSTATUS
519 gcoOS_GetPos(
520     IN gcoOS Os,
521     IN gctFILE File,
522     OUT gctUINT32 * Position
523     );
524
525 /* Perform a memory copy. */
526 gceSTATUS
527 gcoOS_MemCopy(
528     IN gctPOINTER Destination,
529     IN gctCONST_POINTER Source,
530     IN gctSIZE_T Bytes
531     );
532
533 /* Perform a memory fill. */
534 gceSTATUS
535 gcoOS_MemFill(
536     IN gctPOINTER Destination,
537     IN gctUINT8 Filler,
538     IN gctSIZE_T Bytes
539     );
540
541 /* Zero memory. */
542 gceSTATUS
543 gcoOS_ZeroMemory(
544     IN gctPOINTER Memory,
545     IN gctSIZE_T Bytes
546     );
547
548 /* Find the last occurance of a character inside a string. */
549 gceSTATUS
550 gcoOS_StrFindReverse(
551     IN gctCONST_STRING String,
552     IN gctINT8 Character,
553     OUT gctSTRING * Output
554     );
555
556 gceSTATUS
557 gcoOS_StrLen(
558     IN gctCONST_STRING String,
559     OUT gctSIZE_T * Length
560     );
561
562 gceSTATUS
563 gcoOS_StrDup(
564     IN gcoOS Os,
565     IN gctCONST_STRING String,
566     OUT gctSTRING * Target
567     );
568
569 /* Copy a string. */
570 gceSTATUS
571 gcoOS_StrCopySafe(
572     IN gctSTRING Destination,
573     IN gctSIZE_T DestinationSize,
574     IN gctCONST_STRING Source
575     );
576
577 /* Append a string. */
578 gceSTATUS
579 gcoOS_StrCatSafe(
580     IN gctSTRING Destination,
581     IN gctSIZE_T DestinationSize,
582     IN gctCONST_STRING Source
583     );
584
585 /* Compare two strings. */
586 gceSTATUS
587 gcoOS_StrCmp(
588     IN gctCONST_STRING String1,
589     IN gctCONST_STRING String2
590     );
591
592 /* Compare characters of two strings. */
593 gceSTATUS
594 gcoOS_StrNCmp(
595     IN gctCONST_STRING String1,
596     IN gctCONST_STRING String2,
597     IN gctSIZE_T Count
598     );
599
600 /* Convert string to float. */
601 gceSTATUS
602 gcoOS_StrToFloat(
603     IN gctCONST_STRING String,
604     OUT gctFLOAT * Float
605     );
606
607 /* Convert string to integer. */
608 gceSTATUS
609 gcoOS_StrToInt(
610     IN gctCONST_STRING String,
611     OUT gctINT * Int
612     );
613
614 gceSTATUS
615 gcoOS_MemCmp(
616     IN gctCONST_POINTER Memory1,
617     IN gctCONST_POINTER Memory2,
618     IN gctSIZE_T Bytes
619     );
620
621 gceSTATUS
622 gcoOS_PrintStrSafe(
623     OUT gctSTRING String,
624     IN gctSIZE_T StringSize,
625     IN OUT gctUINT * Offset,
626     IN gctCONST_STRING Format,
627     ...
628     );
629
630 gceSTATUS
631 gcoOS_PrintStrVSafe(
632     OUT gctSTRING String,
633     IN gctSIZE_T StringSize,
634     IN OUT gctUINT * Offset,
635     IN gctCONST_STRING Format,
636     IN gctPOINTER Arguments
637     );
638
639 gceSTATUS
640 gcoOS_LoadLibrary(
641     IN gcoOS Os,
642     IN gctCONST_STRING Library,
643     OUT gctHANDLE * Handle
644     );
645
646 gceSTATUS
647 gcoOS_FreeLibrary(
648     IN gcoOS Os,
649     IN gctHANDLE Handle
650     );
651
652 gceSTATUS
653 gcoOS_GetProcAddress(
654     IN gcoOS Os,
655     IN gctHANDLE Handle,
656     IN gctCONST_STRING Name,
657     OUT gctPOINTER * Function
658     );
659
660 gceSTATUS
661 gcoOS_Compact(
662     IN gcoOS Os
663     );
664
665 gceSTATUS
666 gcoOS_ProfileStart(
667     IN gcoOS Os
668     );
669
670 gceSTATUS
671 gcoOS_ProfileEnd(
672     IN gcoOS Os,
673     IN gctCONST_STRING Title
674     );
675
676 gceSTATUS
677 gcoOS_SetProfileSetting(
678         IN gcoOS Os,
679         IN gctBOOL Enable,
680         IN gctCONST_STRING FileName
681         );
682
683 /* Query the video memory. */
684 gceSTATUS
685 gcoOS_QueryVideoMemory(
686     IN gcoOS Os,
687     OUT gctPHYS_ADDR * InternalAddress,
688     OUT gctSIZE_T * InternalSize,
689     OUT gctPHYS_ADDR * ExternalAddress,
690     OUT gctSIZE_T * ExternalSize,
691     OUT gctPHYS_ADDR * ContiguousAddress,
692     OUT gctSIZE_T * ContiguousSize
693     );
694
695 /*----------------------------------------------------------------------------*/
696 /*----- Atoms ----------------------------------------------------------------*/
697
698 typedef struct gcsATOM * gcsATOM_PTR;
699
700 /* Construct an atom. */
701 gceSTATUS
702 gcoOS_AtomConstruct(
703     IN gcoOS Os,
704     OUT gcsATOM_PTR * Atom
705     );
706
707 /* Destroy an atom. */
708 gceSTATUS
709 gcoOS_AtomDestroy(
710     IN gcoOS Os,
711     IN gcsATOM_PTR Atom
712     );
713
714 /* Increment an atom. */
715 gceSTATUS
716 gcoOS_AtomIncrement(
717     IN gcoOS Os,
718     IN gcsATOM_PTR Atom,
719     OUT gctINT32_PTR OldValue
720     );
721
722 /* Decrement an atom. */
723 gceSTATUS
724 gcoOS_AtomDecrement(
725     IN gcoOS Os,
726     IN gcsATOM_PTR Atom,
727     OUT gctINT32_PTR OldValue
728     );
729
730 gctHANDLE
731 gcoOS_GetCurrentProcessID(
732     void
733     );
734
735 /*----------------------------------------------------------------------------*/
736 /*----- Time -----------------------------------------------------------------*/
737
738 /* Get the number of milliseconds since the system started. */
739 gctUINT32
740 gcoOS_GetTicks(
741     void
742     );
743
744 /* Get time in microseconds. */
745 gceSTATUS
746 gcoOS_GetTime(
747     gctUINT64_PTR Time
748     );
749
750 /* Get CPU usage in microseconds. */
751 gceSTATUS
752 gcoOS_GetCPUTime(
753     gctUINT64_PTR CPUTime
754     );
755
756 /* Get memory usage. */
757 gceSTATUS
758 gcoOS_GetMemoryUsage(
759     gctUINT32_PTR MaxRSS,
760     gctUINT32_PTR IxRSS,
761     gctUINT32_PTR IdRSS,
762     gctUINT32_PTR IsRSS
763     );
764
765 /* Delay a number of microseconds. */
766 gceSTATUS
767 gcoOS_Delay(
768     IN gcoOS Os,
769     IN gctUINT32 Delay
770     );
771
772 /*----------------------------------------------------------------------------*/
773 /*----- Mutexes --------------------------------------------------------------*/
774
775 /* Create a new mutex. */
776 gceSTATUS
777 gcoOS_CreateMutex(
778     IN gcoOS Os,
779     OUT gctPOINTER * Mutex
780     );
781
782 /* Delete a mutex. */
783 gceSTATUS
784 gcoOS_DeleteMutex(
785     IN gcoOS Os,
786     IN gctPOINTER Mutex
787     );
788
789 /* Acquire a mutex. */
790 gceSTATUS
791 gcoOS_AcquireMutex(
792     IN gcoOS Os,
793     IN gctPOINTER Mutex,
794     IN gctUINT32 Timeout
795     );
796
797 /* Release a mutex. */
798 gceSTATUS
799 gcoOS_ReleaseMutex(
800     IN gcoOS Os,
801     IN gctPOINTER Mutex
802     );
803
804 /*----------------------------------------------------------------------------*/
805 /*----- Signals --------------------------------------------------------------*/
806
807 /* Create a signal. */
808 gceSTATUS
809 gcoOS_CreateSignal(
810     IN gcoOS Os,
811     IN gctBOOL ManualReset,
812     OUT gctSIGNAL * Signal
813     );
814
815 /* Destroy a signal. */
816 gceSTATUS
817 gcoOS_DestroySignal(
818     IN gcoOS Os,
819     IN gctSIGNAL Signal
820     );
821
822 /* Signal a signal. */
823 gceSTATUS
824 gcoOS_Signal(
825     IN gcoOS Os,
826     IN gctSIGNAL Signal,
827     IN gctBOOL State
828     );
829
830 /* Wait for a signal. */
831 gceSTATUS
832 gcoOS_WaitSignal(
833     IN gcoOS Os,
834     IN gctSIGNAL Signal,
835     IN gctUINT32 Wait
836     );
837
838 /* Write a register. */
839 gceSTATUS
840 gcoOS_WriteRegister(
841     IN gcoOS Os,
842     IN gctUINT32 Address,
843     IN gctUINT32 Data
844     );
845
846 /* Read a register. */
847 gceSTATUS
848 gcoOS_ReadRegister(
849     IN gcoOS Os,
850     IN gctUINT32 Address,
851     OUT gctUINT32 * Data
852     );
853
854 gceSTATUS
855 gcoOS_CacheFlush(
856     IN gcoOS Os,
857     IN gctPOINTER Logical,
858     IN gctSIZE_T Bytes
859     );
860
861 gceSTATUS
862 gcoOS_CacheInvalidate(
863     IN gcoOS Os,
864     IN gctPOINTER Logical,
865     IN gctSIZE_T Bytes
866     );
867
868 /*******************************************************************************
869 **  gcoMATH object
870 */
871
872 #define gcdPI                   3.14159265358979323846f
873
874 gctUINT32
875 gcoMATH_Log2in5dot5(
876     IN gctINT X
877     );
878
879 gctFLOAT
880 gcoMATH_Sine(
881     IN gctFLOAT X
882     );
883
884 gctFLOAT
885 gcoMATH_Cosine(
886     IN gctFLOAT X
887     );
888
889 gctFLOAT
890 gcoMATH_Floor(
891     IN gctFLOAT X
892     );
893
894 gctFLOAT
895 gcoMATH_Ceiling(
896     IN gctFLOAT X
897     );
898
899 gctFLOAT
900 gcoMATH_SquareRoot(
901     IN gctFLOAT X
902     );
903
904 gctFLOAT
905 gcoMATH_Log2(
906     IN gctFLOAT X
907     );
908
909 gctFLOAT
910 gcoMATH_Power(
911     IN gctFLOAT X,
912     IN gctFLOAT Y
913     );
914
915 gctFLOAT
916 gcoMATH_Modulo(
917     IN gctFLOAT X,
918     IN gctFLOAT Y
919     );
920
921 gctFLOAT
922 gcoMATH_Exp(
923     IN gctFLOAT X
924     );
925
926 gctFLOAT
927 gcoMATH_Absolute(
928     IN gctFLOAT X
929     );
930
931 gctFLOAT
932 gcoMATH_ArcCosine(
933     IN gctFLOAT X
934     );
935
936 gctFLOAT
937 gcoMATH_Tangent(
938     IN gctFLOAT X
939     );
940
941 gctFLOAT
942 gcoMATH_UInt2Float(
943     IN gctUINT X
944     );
945
946 gctUINT
947 gcoMATH_Float2UInt(
948     IN gctFLOAT X
949     );
950
951 gctFLOAT
952 gcoMATH_Multiply(
953     IN gctFLOAT X,
954     IN gctFLOAT Y
955     );
956
957 /******************************************************************************\
958 **************************** Coordinate Structures *****************************
959 \******************************************************************************/
960
961 typedef struct _gcsPOINT
962 {
963     gctINT32                    x;
964     gctINT32                    y;
965 }
966 gcsPOINT;
967
968 typedef struct _gcsSIZE
969 {
970     gctINT32                    width;
971     gctINT32                    height;
972 }
973 gcsSIZE;
974
975 typedef struct _gcsRECT
976 {
977     gctINT32                    left;
978     gctINT32                    top;
979     gctINT32                    right;
980     gctINT32                    bottom;
981 }
982 gcsRECT;
983
984
985 /******************************************************************************\
986 ********************************* gcoSURF Object ********************************
987 \******************************************************************************/
988
989 /*----------------------------------------------------------------------------*/
990 /*------------------------------- gcoSURF Common ------------------------------*/
991
992 /* Color format classes. */
993 typedef enum _gceFORMAT_CLASS
994 {
995     gcvFORMAT_CLASS_RGBA        = 4500,
996     gcvFORMAT_CLASS_YUV,
997     gcvFORMAT_CLASS_INDEX,
998     gcvFORMAT_CLASS_LUMINANCE,
999     gcvFORMAT_CLASS_BUMP,
1000     gcvFORMAT_CLASS_DEPTH,
1001 }
1002 gceFORMAT_CLASS;
1003
1004 /* Special enums for width field in gcsFORMAT_COMPONENT. */
1005 typedef enum _gceCOMPONENT_CONTROL
1006 {
1007     gcvCOMPONENT_NOTPRESENT     = 0x00,
1008     gcvCOMPONENT_DONTCARE       = 0x80,
1009     gcvCOMPONENT_WIDTHMASK      = 0x7F,
1010     gcvCOMPONENT_ODD            = 0x80
1011 }
1012 gceCOMPONENT_CONTROL;
1013
1014 /* Color format component parameters. */
1015 typedef struct _gcsFORMAT_COMPONENT
1016 {
1017     gctUINT8                    start;
1018     gctUINT8                    width;
1019 }
1020 gcsFORMAT_COMPONENT;
1021
1022 /* RGBA color format class. */
1023 typedef struct _gcsFORMAT_CLASS_TYPE_RGBA
1024 {
1025     gcsFORMAT_COMPONENT         alpha;
1026     gcsFORMAT_COMPONENT         red;
1027     gcsFORMAT_COMPONENT         green;
1028     gcsFORMAT_COMPONENT         blue;
1029 }
1030 gcsFORMAT_CLASS_TYPE_RGBA;
1031
1032 /* YUV color format class. */
1033 typedef struct _gcsFORMAT_CLASS_TYPE_YUV
1034 {
1035     gcsFORMAT_COMPONENT         y;
1036     gcsFORMAT_COMPONENT         u;
1037     gcsFORMAT_COMPONENT         v;
1038 }
1039 gcsFORMAT_CLASS_TYPE_YUV;
1040
1041 /* Index color format class. */
1042 typedef struct _gcsFORMAT_CLASS_TYPE_INDEX
1043 {
1044     gcsFORMAT_COMPONENT         value;
1045 }
1046 gcsFORMAT_CLASS_TYPE_INDEX;
1047
1048 /* Luminance color format class. */
1049 typedef struct _gcsFORMAT_CLASS_TYPE_LUMINANCE
1050 {
1051     gcsFORMAT_COMPONENT         alpha;
1052     gcsFORMAT_COMPONENT         value;
1053 }
1054 gcsFORMAT_CLASS_TYPE_LUMINANCE;
1055
1056 /* Bump map color format class. */
1057 typedef struct _gcsFORMAT_CLASS_TYPE_BUMP
1058 {
1059     gcsFORMAT_COMPONENT         alpha;
1060     gcsFORMAT_COMPONENT         l;
1061     gcsFORMAT_COMPONENT         v;
1062     gcsFORMAT_COMPONENT         u;
1063     gcsFORMAT_COMPONENT         q;
1064     gcsFORMAT_COMPONENT         w;
1065 }
1066 gcsFORMAT_CLASS_TYPE_BUMP;
1067
1068 /* Depth and stencil format class. */
1069 typedef struct _gcsFORMAT_CLASS_TYPE_DEPTH
1070 {
1071     gcsFORMAT_COMPONENT         depth;
1072     gcsFORMAT_COMPONENT         stencil;
1073 }
1074 gcsFORMAT_CLASS_TYPE_DEPTH;
1075
1076 /* Format parameters. */
1077 typedef struct _gcsSURF_FORMAT_INFO
1078 {
1079     /* Format code and class. */
1080     gceSURF_FORMAT              format;
1081     gceFORMAT_CLASS             fmtClass;
1082
1083     /* The size of one pixel in bits. */
1084     gctUINT8                    bitsPerPixel;
1085
1086     /* Component swizzle. */
1087     gceSURF_SWIZZLE             swizzle;
1088
1089     /* Some formats have two neighbour pixels interleaved together. */
1090     /* To describe such format, set the flag to 1 and add another   */
1091     /* like this one describing the odd pixel format.               */
1092     gctUINT8                    interleaved;
1093
1094     /* Format components. */
1095     union
1096     {
1097         gcsFORMAT_CLASS_TYPE_BUMP       bump;
1098         gcsFORMAT_CLASS_TYPE_RGBA       rgba;
1099         gcsFORMAT_CLASS_TYPE_YUV        yuv;
1100         gcsFORMAT_CLASS_TYPE_LUMINANCE  lum;
1101         gcsFORMAT_CLASS_TYPE_INDEX      index;
1102         gcsFORMAT_CLASS_TYPE_DEPTH      depth;
1103     } u;
1104 }
1105 gcsSURF_FORMAT_INFO;
1106
1107 /* Frame buffer information. */
1108 typedef struct _gcsSURF_FRAMEBUFFER
1109 {
1110     gctPOINTER                  logical;
1111     gctUINT                     width, height;
1112     gctINT                      stride;
1113     gceSURF_FORMAT              format;
1114 }
1115 gcsSURF_FRAMEBUFFER;
1116
1117 /* Generic pixel component descriptors. */
1118 extern gcsFORMAT_COMPONENT gcvPIXEL_COMP_XXX8;
1119 extern gcsFORMAT_COMPONENT gcvPIXEL_COMP_XX8X;
1120 extern gcsFORMAT_COMPONENT gcvPIXEL_COMP_X8XX;
1121 extern gcsFORMAT_COMPONENT gcvPIXEL_COMP_8XXX;
1122
1123 typedef enum _gceORIENTATION
1124 {
1125     gcvORIENTATION_TOP_BOTTOM,
1126     gcvORIENTATION_BOTTOM_TOP,
1127 }
1128 gceORIENTATION;
1129
1130
1131 /* Construct a new gcoSURF object. */
1132 gceSTATUS
1133 gcoSURF_Construct(
1134     IN gcoHAL Hal,
1135     IN gctUINT Width,
1136     IN gctUINT Height,
1137     IN gctUINT Depth,
1138     IN gceSURF_TYPE Type,
1139     IN gceSURF_FORMAT Format,
1140     IN gcePOOL Pool,
1141     OUT gcoSURF * Surface
1142     );
1143
1144 /* Destroy an gcoSURF object. */
1145 gceSTATUS
1146 gcoSURF_Destroy(
1147     IN gcoSURF Surface
1148     );
1149
1150 /* Map user-allocated surface. */
1151 gceSTATUS
1152 gcoSURF_MapUserSurface(
1153     IN gcoSURF Surface,
1154     IN gctUINT Alignment,
1155     IN gctPOINTER Logical,
1156     IN gctUINT32 Physical
1157     );
1158
1159 /* Set the color type of the surface. */
1160 gceSTATUS
1161 gcoSURF_SetColorType(
1162     IN gcoSURF Surface,
1163     IN gceSURF_COLOR_TYPE ColorType
1164     );
1165
1166 /* Get the color type of the surface. */
1167 gceSTATUS
1168 gcoSURF_GetColorType(
1169     IN gcoSURF Surface,
1170     OUT gceSURF_COLOR_TYPE *ColorType
1171     );
1172
1173 /* Set the surface ration angle. */
1174 gceSTATUS
1175 gcoSURF_SetRotation(
1176     IN gcoSURF Surface,
1177     IN gceSURF_ROTATION Rotation
1178     );
1179
1180 /* Verify and return the state of the tile status mechanism. */
1181 gceSTATUS
1182 gcoSURF_IsTileStatusSupported(
1183     IN gcoSURF Surface
1184     );
1185
1186 /* Enable tile status for the specified surface. */
1187 gceSTATUS
1188 gcoSURF_EnableTileStatus(
1189     IN gcoSURF Surface
1190     );
1191
1192 /* Disable tile status for the specified surface. */
1193 gceSTATUS
1194 gcoSURF_DisableTileStatus(
1195     IN gcoSURF Surface,
1196     IN gctBOOL Decompress
1197     );
1198
1199 /* Get surface size. */
1200 gceSTATUS
1201 gcoSURF_GetSize(
1202     IN gcoSURF Surface,
1203     OUT gctUINT * Width,
1204     OUT gctUINT * Height,
1205     OUT gctUINT * Depth
1206     );
1207
1208 /* Get surface aligned sizes. */
1209 gceSTATUS
1210 gcoSURF_GetAlignedSize(
1211     IN gcoSURF Surface,
1212     OUT gctUINT * Width,
1213     OUT gctUINT * Height,
1214     OUT gctINT * Stride
1215     );
1216
1217 /* Get surface type and format. */
1218 gceSTATUS
1219 gcoSURF_GetFormat(
1220     IN gcoSURF Surface,
1221     OUT gceSURF_TYPE * Type,
1222     OUT gceSURF_FORMAT * Format
1223     );
1224
1225 /* Lock the surface. */
1226 gceSTATUS
1227 gcoSURF_Lock(
1228     IN gcoSURF Surface,
1229     IN OUT gctUINT32 * Address,
1230     IN OUT gctPOINTER * Memory
1231     );
1232
1233 /* Unlock the surface. */
1234 gceSTATUS
1235 gcoSURF_Unlock(
1236     IN gcoSURF Surface,
1237     IN gctPOINTER Memory
1238     );
1239
1240 /* Return pixel format parameters. */
1241 gceSTATUS
1242 gcoSURF_QueryFormat(
1243     IN gceSURF_FORMAT Format,
1244     OUT gcsSURF_FORMAT_INFO_PTR * Info
1245     );
1246
1247 /* Compute the color pixel mask. */
1248 gceSTATUS
1249 gcoSURF_ComputeColorMask(
1250     IN gcsSURF_FORMAT_INFO_PTR Format,
1251     OUT gctUINT32_PTR ColorMask
1252     );
1253
1254 /* Flush the surface. */
1255 gceSTATUS
1256 gcoSURF_Flush(
1257     IN gcoSURF Surface
1258     );
1259
1260 /* Fill surface with a value. */
1261 gceSTATUS
1262 gcoSURF_Fill(
1263     IN gcoSURF Surface,
1264     IN gcsPOINT_PTR Origin,
1265     IN gcsSIZE_PTR Size,
1266     IN gctUINT32 Value,
1267     IN gctUINT32 Mask
1268     );
1269
1270 /* Alpha blend two surfaces together. */
1271 gceSTATUS
1272 gcoSURF_Blend(
1273     IN gcoSURF SrcSurface,
1274     IN gcoSURF DestSurface,
1275     IN gcsPOINT_PTR SrcOrig,
1276     IN gcsPOINT_PTR DestOrigin,
1277     IN gcsSIZE_PTR Size,
1278     IN gceSURF_BLEND_MODE Mode
1279     );
1280
1281 /* Create a new gcoSURF wrapper object. */
1282 gceSTATUS
1283 gcoSURF_ConstructWrapper(
1284     IN gcoHAL Hal,
1285     OUT gcoSURF * Surface
1286     );
1287
1288 /* Set the underlying buffer for the surface wrapper. */
1289 gceSTATUS
1290 gcoSURF_SetBuffer(
1291     IN gcoSURF Surface,
1292     IN gceSURF_TYPE Type,
1293     IN gceSURF_FORMAT Format,
1294     IN gctUINT Stride,
1295     IN gctPOINTER Logical,
1296     IN gctUINT32 Physical
1297     );
1298
1299 /* Set the size of the surface in pixels and map the underlying buffer. */
1300 gceSTATUS
1301 gcoSURF_SetWindow(
1302     IN gcoSURF Surface,
1303     IN gctUINT X,
1304     IN gctUINT Y,
1305     IN gctUINT Width,
1306     IN gctUINT Height
1307     );
1308
1309 /* Increase reference count of the surface. */
1310 gceSTATUS
1311 gcoSURF_ReferenceSurface(
1312     IN gcoSURF Surface
1313     );
1314
1315 /* Get surface reference count. */
1316 gceSTATUS
1317 gcoSURF_QueryReferenceCount(
1318     IN gcoSURF Surface,
1319     OUT gctINT32 * ReferenceCount
1320     );
1321
1322 /* Set surface orientation. */
1323 gceSTATUS
1324 gcoSURF_SetOrientation(
1325     IN gcoSURF Surface,
1326     IN gceORIENTATION Orientation
1327     );
1328
1329 /* Query surface orientation. */
1330 gceSTATUS
1331 gcoSURF_QueryOrientation(
1332     IN gcoSURF Surface,
1333     OUT gceORIENTATION * Orientation
1334     );
1335
1336 /******************************************************************************\
1337 ********************************* gcoDUMP Object ********************************
1338 \******************************************************************************/
1339
1340 /* Construct a new gcoDUMP object. */
1341 gceSTATUS
1342 gcoDUMP_Construct(
1343     IN gcoOS Os,
1344     IN gcoHAL Hal,
1345     OUT gcoDUMP * Dump
1346     );
1347
1348 /* Destroy a gcoDUMP object. */
1349 gceSTATUS
1350 gcoDUMP_Destroy(
1351     IN gcoDUMP Dump
1352     );
1353
1354 /* Enable/disable dumping. */
1355 gceSTATUS
1356 gcoDUMP_Control(
1357     IN gcoDUMP Dump,
1358     IN gctSTRING FileName
1359     );
1360
1361 gceSTATUS
1362 gcoDUMP_IsEnabled(
1363     IN gcoDUMP Dump,
1364     OUT gctBOOL * Enabled
1365     );
1366
1367 /* Add surface. */
1368 gceSTATUS
1369 gcoDUMP_AddSurface(
1370     IN gcoDUMP Dump,
1371     IN gctINT32 Width,
1372     IN gctINT32 Height,
1373     IN gceSURF_FORMAT PixelFormat,
1374     IN gctUINT32 Address,
1375     IN gctSIZE_T ByteCount
1376     );
1377
1378 /* Mark the beginning of a frame. */
1379 gceSTATUS
1380 gcoDUMP_FrameBegin(
1381     IN gcoDUMP Dump
1382     );
1383
1384 /* Mark the end of a frame. */
1385 gceSTATUS
1386 gcoDUMP_FrameEnd(
1387     IN gcoDUMP Dump
1388     );
1389
1390 /* Dump data. */
1391 gceSTATUS
1392 gcoDUMP_DumpData(
1393     IN gcoDUMP Dump,
1394     IN gceDUMP_TAG Type,
1395     IN gctUINT32 Address,
1396     IN gctSIZE_T ByteCount,
1397     IN gctCONST_POINTER Data
1398     );
1399
1400 /* Delete an address. */
1401 gceSTATUS
1402 gcoDUMP_Delete(
1403     IN gcoDUMP Dump,
1404     IN gctUINT32 Address
1405     );
1406
1407 /******************************************************************************\
1408 ******************************* gcsRECT Structure ******************************
1409 \******************************************************************************/
1410
1411 /* Initialize rectangle structure. */
1412 gceSTATUS
1413 gcsRECT_Set(
1414     OUT gcsRECT_PTR Rect,
1415     IN gctINT32 Left,
1416     IN gctINT32 Top,
1417     IN gctINT32 Right,
1418     IN gctINT32 Bottom
1419     );
1420
1421 /* Return the width of the rectangle. */
1422 gceSTATUS
1423 gcsRECT_Width(
1424     IN gcsRECT_PTR Rect,
1425     OUT gctINT32 * Width
1426     );
1427
1428 /* Return the height of the rectangle. */
1429 gceSTATUS
1430 gcsRECT_Height(
1431     IN gcsRECT_PTR Rect,
1432     OUT gctINT32 * Height
1433     );
1434
1435 /* Ensure that top left corner is to the left and above the right bottom. */
1436 gceSTATUS
1437 gcsRECT_Normalize(
1438     IN OUT gcsRECT_PTR Rect
1439     );
1440
1441 /* Compare two rectangles. */
1442 gceSTATUS
1443 gcsRECT_IsEqual(
1444     IN gcsRECT_PTR Rect1,
1445     IN gcsRECT_PTR Rect2,
1446     OUT gctBOOL * Equal
1447     );
1448
1449 /* Compare the sizes of two rectangles. */
1450 gceSTATUS
1451 gcsRECT_IsOfEqualSize(
1452     IN gcsRECT_PTR Rect1,
1453     IN gcsRECT_PTR Rect2,
1454     OUT gctBOOL * EqualSize
1455     );
1456
1457
1458 /******************************************************************************\
1459 **************************** gcsBOUNDARY Structure *****************************
1460 \******************************************************************************/
1461
1462 typedef struct _gcsBOUNDARY
1463 {
1464     gctINT                      x;
1465     gctINT                      y;
1466     gctINT                      width;
1467     gctINT                      height;
1468 }
1469 gcsBOUNDARY;
1470
1471 /******************************************************************************\
1472 ********************************* gcoHEAP Object ********************************
1473 \******************************************************************************/
1474
1475 typedef struct _gcoHEAP *       gcoHEAP;
1476
1477 /* Construct a new gcoHEAP object. */
1478 gceSTATUS
1479 gcoHEAP_Construct(
1480     IN gcoOS Os,
1481     IN gctSIZE_T AllocationSize,
1482     OUT gcoHEAP * Heap
1483     );
1484
1485 /* Destroy an gcoHEAP object. */
1486 gceSTATUS
1487 gcoHEAP_Destroy(
1488     IN gcoHEAP Heap
1489     );
1490
1491 /* Allocate memory. */
1492 gceSTATUS
1493 gcoHEAP_Allocate(
1494     IN gcoHEAP Heap,
1495     IN gctSIZE_T Bytes,
1496     OUT gctPOINTER * Node
1497     );
1498
1499 /* Free memory. */
1500 gceSTATUS
1501 gcoHEAP_Free(
1502     IN gcoHEAP Heap,
1503     IN gctPOINTER Node
1504     );
1505
1506 /* Profile the heap. */
1507 gceSTATUS
1508 gcoHEAP_ProfileStart(
1509     IN gcoHEAP Heap
1510     );
1511
1512 gceSTATUS
1513 gcoHEAP_ProfileEnd(
1514     IN gcoHEAP Heap,
1515     IN gctCONST_STRING Title
1516     );
1517
1518 #if defined gcdHAL_TEST
1519 gceSTATUS
1520 gcoHEAP_Test(
1521     IN gcoHEAP Heap,
1522     IN gctSIZE_T Vectors,
1523     IN gctSIZE_T MaxSize
1524     );
1525 #endif
1526
1527 /******************************************************************************\
1528 ******************************* Debugging Macros *******************************
1529 \******************************************************************************/
1530
1531 void
1532 gcoOS_SetDebugLevel(
1533     IN gctUINT32 Level
1534     );
1535
1536 void
1537 gcoOS_SetDebugZone(
1538     IN gctUINT32 Zone
1539     );
1540
1541 void
1542 gcoOS_SetDebugLevelZone(
1543     IN gctUINT32 Level,
1544     IN gctUINT32 Zone
1545     );
1546
1547 void
1548 gcoOS_SetDebugZones(
1549     IN gctUINT32 Zones,
1550     IN gctBOOL Enable
1551     );
1552
1553 void
1554 gcoOS_SetDebugFile(
1555     IN gctCONST_STRING FileName
1556     );
1557
1558 /*******************************************************************************
1559 **
1560 **  gcmFATAL
1561 **
1562 **      Print a message to the debugger and execute a break point.
1563 **
1564 **  ARGUMENTS:
1565 **
1566 **      message Message.
1567 **      ...     Optional arguments.
1568 */
1569
1570 void
1571 gckOS_DebugFatal(
1572     IN gctCONST_STRING Message,
1573     ...
1574     );
1575
1576 void
1577 gcoOS_DebugFatal(
1578     IN gctCONST_STRING Message,
1579     ...
1580     );
1581
1582 #if gcdDEBUG
1583 #   define gcmFATAL             gcoOS_DebugFatal
1584 #   define gcmkFATAL            gckOS_DebugFatal
1585 #elif gcdHAS_ELLIPSES
1586 #   define gcmFATAL(...)
1587 #   define gcmkFATAL(...)
1588 #else
1589     gcmINLINE static void
1590     __dummy_fatal(
1591         IN gctCONST_STRING Message,
1592         ...
1593         )
1594     {
1595     }
1596 #   define gcmFATAL             __dummy_fatal
1597 #   define gcmkFATAL            __dummy_fatal
1598 #endif
1599
1600 #define gcmENUM2TEXT(e)         case e: return #e
1601
1602 /*******************************************************************************
1603 **
1604 **  gcmTRACE
1605 **
1606 **      Print a message to the debugfer if the correct level has been set.  In
1607 **      retail mode this macro does nothing.
1608 **
1609 **  ARGUMENTS:
1610 **
1611 **      level   Level of message.
1612 **      message Message.
1613 **      ...     Optional arguments.
1614 */
1615 #define gcvLEVEL_NONE           -1
1616 #define gcvLEVEL_ERROR          0
1617 #define gcvLEVEL_WARNING        1
1618 #define gcvLEVEL_INFO           2
1619 #define gcvLEVEL_VERBOSE        3
1620
1621 void
1622 gckOS_DebugTrace(
1623     IN gctUINT32 Level,
1624     IN gctCONST_STRING Message,
1625     ...
1626     );
1627 void
1628
1629 gcoOS_DebugTrace(
1630     IN gctUINT32 Level,
1631     IN gctCONST_STRING Message,
1632     ...
1633     );
1634
1635 #if gcdDEBUG
1636 #   define gcmTRACE             gcoOS_DebugTrace
1637 #   define gcmkTRACE            gckOS_DebugTrace
1638 #elif gcdHAS_ELLIPSES
1639 #   define gcmTRACE(...)
1640 #   define gcmkTRACE(...)
1641 #else
1642     gcmINLINE static void
1643     __dummy_trace(
1644         IN gctUINT32 Level,
1645         IN gctCONST_STRING Message,
1646         ...
1647         )
1648     {
1649     }
1650 #   define gcmTRACE             __dummy_trace
1651 #   define gcmkTRACE            __dummy_trace
1652 #endif
1653
1654 /* Debug zones. */
1655 #define gcvZONE_OS              (1 << 0)
1656 #define gcvZONE_HARDWARE        (1 << 1)
1657 #define gcvZONE_HEAP            (1 << 2)
1658
1659 /* Kernel zones. */
1660 #define gcvZONE_KERNEL          (1 << 3)
1661 #define gcvZONE_VIDMEM          (1 << 4)
1662 #define gcvZONE_COMMAND         (1 << 5)
1663 #define gcvZONE_DRIVER          (1 << 6)
1664 #define gcvZONE_CMODEL          (1 << 7)
1665 #define gcvZONE_MMU             (1 << 8)
1666 #define gcvZONE_EVENT           (1 << 9)
1667 #define gcvZONE_DEVICE          (1 << 10)
1668
1669 /* User zones. */
1670 #define gcvZONE_HAL             (1 << 3)
1671 #define gcvZONE_BUFFER          (1 << 4)
1672 #define gcvZONE_CONTEXT         (1 << 5)
1673 #define gcvZONE_SURFACE         (1 << 6)
1674 #define gcvZONE_INDEX           (1 << 7)
1675 #define gcvZONE_STREAM          (1 << 8)
1676 #define gcvZONE_TEXTURE         (1 << 9)
1677 #define gcvZONE_2D              (1 << 10)
1678 #define gcvZONE_3D              (1 << 11)
1679 #define gcvZONE_COMPILER        (1 << 12)
1680 #define gcvZONE_MEMORY          (1 << 13)
1681 #define gcvZONE_STATE           (1 << 14)
1682 #define gcvZONE_AUX             (1 << 15)
1683
1684 /* API definitions. */
1685 #define gcvZONE_API_HAL         (0 << 28)
1686 #define gcvZONE_API_EGL         (1 << 28)
1687 #define gcvZONE_API_ES11        (2 << 28)
1688 #define gcvZONE_API_ES20        (3 << 28)
1689 #define gcvZONE_API_VG11        (4 << 28)
1690 #define gcvZONE_API_GL          (5 << 28)
1691 #define gcvZONE_API_DFB         (6 << 28)
1692 #define gcvZONE_API_GDI         (7 << 28)
1693 #define gcvZONE_API_D3D         (8 << 28)
1694
1695 #define gcmZONE_GET_API(zone)   ((zone) >> 28)
1696 #define gcdZONE_MASK            0x0FFFFFFF
1697
1698 /* Handy zones. */
1699 #define gcvZONE_NONE            0
1700 #define gcvZONE_ALL             gcdZONE_MASK
1701
1702 /*******************************************************************************
1703 **
1704 **  gcmTRACE_ZONE
1705 **
1706 **      Print a message to the debugger if the correct level and zone has been
1707 **      set.  In retail mode this macro does nothing.
1708 **
1709 **  ARGUMENTS:
1710 **
1711 **      Level   Level of message.
1712 **      Zone    Zone of message.
1713 **      Message Message.
1714 **      ...     Optional arguments.
1715 */
1716
1717 void
1718 gckOS_DebugTraceZone(
1719     IN gctUINT32 Level,
1720     IN gctUINT32 Zone,
1721     IN gctCONST_STRING Message,
1722     ...
1723     );
1724
1725 void
1726 gcoOS_DebugTraceZone(
1727     IN gctUINT32 Level,
1728     IN gctUINT32 Zone,
1729     IN gctCONST_STRING Message,
1730     ...
1731     );
1732
1733 #if gcdDEBUG
1734 #   define gcmTRACE_ZONE            gcoOS_DebugTraceZone
1735 #   define gcmkTRACE_ZONE           gckOS_DebugTraceZone
1736 #elif gcdHAS_ELLIPSES
1737 #   define gcmTRACE_ZONE(...)
1738 #   define gcmkTRACE_ZONE(...)
1739 #else
1740     gcmINLINE static void
1741     __dummy_trace_zone(
1742         IN gctUINT32 Level,
1743         IN gctUINT32 Zone,
1744         IN gctCONST_STRING Message,
1745         ...
1746         )
1747     {
1748     }
1749 #   define gcmTRACE_ZONE            __dummy_trace_zone
1750 #   define gcmkTRACE_ZONE           __dummy_trace_zone
1751 #endif
1752
1753 /******************************************************************************\
1754 ******************************** Logging Macros ********************************
1755 \******************************************************************************/
1756
1757 #define gcdHEADER_LEVEL             gcvLEVEL_VERBOSE
1758
1759 #define gcmHEADER() \
1760     gcmTRACE_ZONE(gcdHEADER_LEVEL, _GC_OBJ_ZONE, \
1761                   "++%s(%d)", __FUNCTION__, __LINE__)
1762
1763 #if gcdHAS_ELLIPSES
1764 #   define gcmHEADER_ARG(Text, ...) \
1765         gcmTRACE_ZONE(gcdHEADER_LEVEL, _GC_OBJ_ZONE, \
1766                       "++%s(%d): " Text, __FUNCTION__, __LINE__, __VA_ARGS__)
1767 #else
1768     gcmINLINE static void
1769     __dummy_header_arg(
1770         IN gctCONST_STRING Text,
1771         ...
1772         )
1773     {
1774     }
1775 #   define gcmHEADER_ARG                __dummy_header_arg
1776 #endif
1777
1778 #define gcmFOOTER() \
1779     gcmTRACE_ZONE(gcdHEADER_LEVEL, _GC_OBJ_ZONE, \
1780                   "--%s(%d): status=%d", \
1781                   __FUNCTION__, __LINE__, status)
1782
1783 #define gcmFOOTER_NO() \
1784     gcmTRACE_ZONE(gcdHEADER_LEVEL, _GC_OBJ_ZONE, \
1785                   "--%s(%d)", __FUNCTION__, __LINE__)
1786
1787 #if gcdHAS_ELLIPSES
1788 #   define gcmFOOTER_ARG(Text, ...) \
1789         gcmTRACE_ZONE(gcdHEADER_LEVEL, _GC_OBJ_ZONE, \
1790                       "--%s(%d): " Text, \
1791                       __FUNCTION__, __LINE__, __VA_ARGS__)
1792 #else
1793     gcmINLINE static void
1794     __dummy_footer_arg(
1795         IN gctCONST_STRING Text,
1796         ...
1797         )
1798     {
1799     }
1800 #   define gcmFOOTER_ARG                __dummy_footer_arg
1801 #endif
1802
1803 #define gcmkHEADER() \
1804     gcmkTRACE_ZONE(gcdHEADER_LEVEL, _GC_OBJ_ZONE, \
1805                    "++%s(%d)", __FUNCTION__, __LINE__)
1806
1807 #if gcdHAS_ELLIPSES
1808 #   define gcmkHEADER_ARG(Text, ...) \
1809         gcmkTRACE_ZONE(gcdHEADER_LEVEL, _GC_OBJ_ZONE, \
1810                        "++%s(%d): " Text, __FUNCTION__, __LINE__, __VA_ARGS__)
1811 #else
1812     gcmINLINE static void
1813     __dummy_kheader_arg(
1814         IN gctCONST_STRING Text,
1815         ...
1816         )
1817     {
1818     }
1819 #   define gcmkHEADER_ARG               __dummy_kheader_arg
1820 #endif
1821
1822 #define gcmkFOOTER() \
1823     gcmkTRACE_ZONE(gcdHEADER_LEVEL, _GC_OBJ_ZONE, \
1824                    "--%s(%d): status=%d", \
1825                    __FUNCTION__, __LINE__, status)
1826
1827 #define gcmkFOOTER_NO() \
1828     gcmkTRACE_ZONE(gcdHEADER_LEVEL, _GC_OBJ_ZONE, \
1829                    "--%s(%d)", __FUNCTION__, __LINE__)
1830
1831 #if gcdHAS_ELLIPSES
1832 #   define gcmkFOOTER_ARG(Text, ...) \
1833         gcmkTRACE_ZONE(gcdHEADER_LEVEL, _GC_OBJ_ZONE, \
1834                        "--%s(%d): " Text, \
1835                        __FUNCTION__, __LINE__, __VA_ARGS__)
1836 #else
1837     gcmINLINE static void
1838     __dummy_kfooter_arg(
1839         IN gctCONST_STRING Text,
1840         ...
1841         )
1842     {
1843     }
1844 #   define gcmkFOOTER_ARG               __dummy_kfooter_arg
1845 #endif
1846
1847 #define gcmOPT_VALUE(ptr)           (((ptr) == gcvNULL) ? 0 : *(ptr))
1848 #define gcmOPT_POINTER(ptr)         (((ptr) == gcvNULL) ? gcvNULL : *(ptr))
1849
1850 void
1851 gcoOS_Print(
1852     IN gctCONST_STRING Message,
1853     ...
1854     );
1855 void
1856 gckOS_Print(
1857     IN gctCONST_STRING Message,
1858     ...
1859     );
1860 #define gcmPRINT                gcoOS_Print
1861 #define gcmkPRINT               gckOS_Print
1862
1863 /*******************************************************************************
1864 **
1865 **  gcmDUMP
1866 **
1867 **      Print a dump message.
1868 **
1869 **  ARGUMENTS:
1870 **
1871 **      gctSTRING   Message.
1872 **
1873 **      ...         Optional arguments.
1874 */
1875 #if gcdDUMP
1876     gceSTATUS
1877     gcfDump(
1878         IN gcoOS Os,
1879         IN gctCONST_STRING String,
1880         ...
1881         );
1882 #  define gcmDUMP               gcfDump
1883 #elif gcdHAS_ELLIPSES
1884 #  define gcmDUMP(...)
1885 #else
1886     gcmINLINE static void
1887     __dummy_dump(
1888         IN gcoOS Os,
1889         IN gctCONST_STRING Message,
1890         ...
1891         )
1892     {
1893     }
1894 #  define gcmDUMP               __dummy_dump
1895 #endif
1896
1897 /*******************************************************************************
1898 **
1899 **  gcmDUMP_DATA
1900 **
1901 **      Add data to the dump.
1902 **
1903 **  ARGUMENTS:
1904 **
1905 **      gctSTRING Tag
1906 **          Tag for dump.
1907 **
1908 **      gctPOINTER Logical
1909 **          Logical address of buffer.
1910 **
1911 **      gctSIZE_T Bytes
1912 **          Number of bytes.
1913 */
1914
1915 #if gcdDUMP
1916     gceSTATUS
1917     gcfDumpData(
1918         IN gcoOS Os,
1919         IN gctSTRING Tag,
1920         IN gctPOINTER Logical,
1921         IN gctSIZE_T Bytes
1922         );
1923 #  define gcmDUMP_DATA          gcfDumpData
1924 #elif gcdHAS_ELLIPSES
1925 #  define gcmDUMP_DATA(...)
1926 #else
1927     gcmINLINE static void
1928     __dummy_dump_data(
1929         IN gcoOS Os,
1930         IN gctSTRING Tag,
1931         IN gctPOINTER Logical,
1932         IN gctSIZE_T Bytes
1933         )
1934     {
1935     }
1936 #  define gcmDUMP_DATA          __dummy_dump_data
1937 #endif
1938
1939 /*******************************************************************************
1940 **
1941 **  gcmDUMP_BUFFER
1942 **
1943 **      Print a buffer to the dump.
1944 **
1945 **  ARGUMENTS:
1946 **
1947 **      gctSTRING Tag
1948 **          Tag for dump.
1949 **
1950 **      gctUINT32 Physical
1951 **          Physical address of buffer.
1952 **
1953 **      gctPOINTER Logical
1954 **          Logical address of buffer.
1955 **
1956 **      gctUINT32 Offset
1957 **          Offset into buffer.
1958 **
1959 **      gctSIZE_T Bytes
1960 **          Number of bytes.
1961 */
1962
1963 #if gcdDUMP
1964 gceSTATUS
1965 gcfDumpBuffer(
1966     IN gcoOS Os,
1967     IN gctSTRING Tag,
1968     IN gctUINT32 Physical,
1969     IN gctPOINTER Logical,
1970     IN gctUINT32 Offset,
1971     IN gctSIZE_T Bytes
1972     );
1973 #   define gcmDUMP_BUFFER       gcfDumpBuffer
1974 #elif gcdHAS_ELLIPSES
1975 #   define gcmDUMP_BUFFER(...)
1976 #else
1977     gcmINLINE static void
1978     __dummy_dump_buffer(
1979         IN gcoOS Os,
1980         IN gctSTRING Tag,
1981         IN gctUINT32 Physical,
1982         IN gctPOINTER Logical,
1983         IN gctUINT32 Offset,
1984         IN gctSIZE_T Bytes
1985         )
1986     {
1987     }
1988 #   define gcmDUMP_BUFFER       __dummy_dump_buffer
1989 #endif
1990
1991 /*******************************************************************************
1992 **
1993 **  gcmDUMP_API
1994 **
1995 **      Print a dump message for a high level API prefixed by the function name.
1996 **
1997 **  ARGUMENTS:
1998 **
1999 **      gctSTRING   Message.
2000 **
2001 **      ...         Optional arguments.
2002 */
2003 #if gcdDUMP_API
2004     gceSTATUS
2005     gcfDumpApi(
2006         IN gctCONST_STRING String,
2007         ...
2008         );
2009 #   define gcmDUMP_API           gcfDumpApi
2010 #elif gcdHAS_ELLIPSES
2011 #   define gcmDUMP_API(...)
2012 #else
2013     gcmINLINE static void
2014     __dummy_dump_api(
2015         IN gctCONST_STRING Message,
2016         ...
2017         )
2018     {
2019     }
2020 #  define gcmDUMP_API           __dummy_dump_api
2021 #endif
2022
2023 /*******************************************************************************
2024 **
2025 **  gcmDUMP_API_ARRAY
2026 **
2027 **      Print an array of data.
2028 **
2029 **  ARGUMENTS:
2030 **
2031 **      gctUINT32_PTR   Pointer to array.
2032 **      gctUINT32       Size.
2033 */
2034 #if gcdDUMP_API
2035     gceSTATUS
2036     gcfDumpArray(
2037         IN gctCONST_POINTER Data,
2038         IN gctUINT32 Size
2039     );
2040 #   define gcmDUMP_API_ARRAY        gcfDumpArray
2041 #elif gcdHAS_ELLIPSES
2042 #   define gcmDUMP_API_ARRAY(...)
2043 #else
2044     gcmINLINE static void
2045     __dummy_dump_api_array(
2046         IN gctCONST_POINTER Data,
2047         IN gctUINT32 Size
2048         )
2049     {
2050     }
2051 #   define gcmDUMP_API_ARRAY        __dummy_dump_api_array
2052 #endif
2053
2054 /*******************************************************************************
2055 **
2056 **  gcmDUMP_API_ARRAY_TOKEN
2057 **
2058 **      Print an array of data terminated by a token.
2059 **
2060 **  ARGUMENTS:
2061 **
2062 **      gctUINT32_PTR   Pointer to array.
2063 **      gctUINT32       Termination.
2064 */
2065 #if gcdDUMP_API
2066     gceSTATUS
2067     gcfDumpArrayToken(
2068         IN gctCONST_POINTER Data,
2069         IN gctUINT32 Termination
2070     );
2071 #   define gcmDUMP_API_ARRAY_TOKEN  gcfDumpArrayToken
2072 #elif gcdHAS_ELLIPSES
2073 #   define gcmDUMP_API_ARRAY_TOKEN(...)
2074 #else
2075     gcmINLINE static void
2076     __dummy_dump_api_array_token(
2077         IN gctCONST_POINTER Data,
2078         IN gctUINT32 Termination
2079         )
2080     {
2081     }
2082 #   define gcmDUMP_API_ARRAY_TOKEN  __dummy_dump_api_array_token
2083 #endif
2084
2085 /*******************************************************************************
2086 **
2087 **  gcmTRACE_RELEASE
2088 **
2089 **      Print a message to the shader debugger.
2090 **
2091 **  ARGUMENTS:
2092 **
2093 **      message Message.
2094 **      ...     Optional arguments.
2095 */
2096
2097 #define gcmTRACE_RELEASE                gcoOS_DebugShaderTrace
2098
2099 void
2100 gcoOS_DebugShaderTrace(
2101     IN gctCONST_STRING Message,
2102     ...
2103     );
2104
2105 void
2106 gcoOS_SetDebugShaderFiles(
2107     IN gctCONST_STRING VSFileName,
2108     IN gctCONST_STRING FSFileName
2109     );
2110
2111 void
2112 gcoOS_SetDebugShaderFileType(
2113     IN gctUINT32 ShaderType
2114     );
2115
2116 /*******************************************************************************
2117 **
2118 **  gcmBREAK
2119 **
2120 **      Break into the debugger.  In retail mode this macro does nothing.
2121 **
2122 **  ARGUMENTS:
2123 **
2124 **      None.
2125 */
2126
2127 void
2128 gcoOS_DebugBreak(
2129     void
2130     );
2131
2132 void
2133 gckOS_DebugBreak(
2134     void
2135     );
2136
2137 #if gcdDEBUG
2138 #   define gcmBREAK             gcoOS_DebugBreak
2139 #   define gcmkBREAK            gckOS_DebugBreak
2140 #else
2141 #   define gcmBREAK()
2142 #   define gcmkBREAK()
2143 #endif
2144
2145 /*******************************************************************************
2146 **
2147 **  gcmASSERT
2148 **
2149 **      Evaluate an expression and break into the debugger if the expression
2150 **      evaluates to false.  In retail mode this macro does nothing.
2151 **
2152 **  ARGUMENTS:
2153 **
2154 **      exp     Expression to evaluate.
2155 */
2156 #if gcdDEBUG
2157 #   define _gcmASSERT(prefix, exp) \
2158         do \
2159         { \
2160             if (!(exp)) \
2161             { \
2162                 prefix##TRACE(gcvLEVEL_ERROR, \
2163                               #prefix "ASSERT at %s(%d) in " __FILE__, \
2164                               __FUNCTION__, __LINE__); \
2165                 prefix##TRACE(gcvLEVEL_ERROR, \
2166                               "(%s)", #exp); \
2167                 prefix##BREAK(); \
2168             } \
2169         } \
2170         while (gcvFALSE)
2171 #   define gcmASSERT(exp)           _gcmASSERT(gcm, exp)
2172 #   define gcmkASSERT(exp)          _gcmASSERT(gcmk, exp)
2173 #else
2174 #   define gcmASSERT(exp)
2175 #   define gcmkASSERT(exp)
2176 #endif
2177
2178 /*******************************************************************************
2179 **
2180 **  gcmVERIFY
2181 **
2182 **      Verify if an expression returns true.  If the expression does not
2183 **      evaluates to true, an assertion will happen in debug mode.
2184 **
2185 **  ARGUMENTS:
2186 **
2187 **      exp     Expression to evaluate.
2188 */
2189 #if gcdDEBUG
2190 #   define gcmVERIFY(exp)           gcmASSERT(exp)
2191 #   define gcmkVERIFY(exp)          gcmkASSERT(exp)
2192 #else
2193 #   define gcmVERIFY(exp)           exp
2194 #   define gcmkVERIFY(exp)          exp
2195 #endif
2196
2197 /*******************************************************************************
2198 **
2199 **  gcmVERIFY_OK
2200 **
2201 **      Verify a fucntion returns gcvSTATUS_OK.  If the function does not return
2202 **      gcvSTATUS_OK, an assertion will happen in debug mode.
2203 **
2204 **  ARGUMENTS:
2205 **
2206 **      func    Function to evaluate.
2207 */
2208
2209 void
2210 gcoOS_Verify(
2211     IN gceSTATUS Status
2212     );
2213
2214 void
2215 gckOS_Verify(
2216     IN gceSTATUS Status
2217     );
2218
2219 #if gcdDEBUG
2220 #   define gcmVERIFY_OK(func) \
2221         do \
2222         { \
2223             gceSTATUS verifyStatus = func; \
2224             gcoOS_Verify(verifyStatus); \
2225             gcmASSERT(verifyStatus == gcvSTATUS_OK); \
2226         } \
2227         while (gcvFALSE)
2228 #   define gcmkVERIFY_OK(func) \
2229         do \
2230         { \
2231             gceSTATUS verifyStatus = func; \
2232             gckOS_Verify(verifyStatus); \
2233             gcmkASSERT(verifyStatus == gcvSTATUS_OK); \
2234         } \
2235         while (gcvFALSE)
2236 #else
2237 #   define gcmVERIFY_OK(func)       func
2238 #   define gcmkVERIFY_OK(func)      func
2239 #endif
2240
2241 /*******************************************************************************
2242 **
2243 **  gcmERR_BREAK
2244 **
2245 **      Executes a break statement on error.
2246 **
2247 **  ASSUMPTIONS:
2248 **
2249 **      'status' variable of gceSTATUS type must be defined.
2250 **
2251 **  ARGUMENTS:
2252 **
2253 **      func    Function to evaluate.
2254 */
2255 #define _gcmERR_BREAK(prefix, func) \
2256     status = func; \
2257     if (gcmIS_ERROR(status)) \
2258     { \
2259         prefix##TRACE(gcvLEVEL_ERROR, \
2260             #prefix "ERR_BREAK: status=%d @ %s(%d) in " __FILE__, \
2261             status, __FUNCTION__, __LINE__); \
2262         break; \
2263     } \
2264     do { } while (gcvFALSE)
2265 #define gcmERR_BREAK(func)          _gcmERR_BREAK(gcm, func)
2266 #define gcmkERR_BREAK(func)         _gcmERR_BREAK(gcmk, func)
2267
2268 /*******************************************************************************
2269 **
2270 **  gcmERR_RETURN
2271 **
2272 **      Executes a return on error.
2273 **
2274 **  ASSUMPTIONS:
2275 **
2276 **      'status' variable of gceSTATUS type must be defined.
2277 **
2278 **  ARGUMENTS:
2279 **
2280 **      func    Function to evaluate.
2281 */
2282 #define _gcmERR_RETURN(prefix, func) \
2283     status = func; \
2284     if (gcmIS_ERROR(status)) \
2285     { \
2286         prefix##TRACE(gcvLEVEL_ERROR, \
2287             #prefix "ERR_RETURN: status=%d @ %s(%d) in " __FILE__, \
2288             status, __FUNCTION__, __LINE__); \
2289         return status; \
2290     } \
2291     do { } while (gcvFALSE)
2292 #define gcmERR_RETURN(func)         _gcmERR_RETURN(gcm, func)
2293 #define gcmkERR_RETURN(func)        _gcmERR_RETURN(gcmk, func)
2294
2295 /*******************************************************************************
2296 **
2297 **  gcmONERROR
2298 **
2299 **      Jump to the error handler in case there is an error.
2300 **
2301 **  ASSUMPTIONS:
2302 **
2303 **      'status' variable of gceSTATUS type must be defined.
2304 **
2305 **  ARGUMENTS:
2306 **
2307 **      func    Function to evaluate.
2308 */
2309 #define _gcmONERROR(prefix, func) \
2310     do \
2311     { \
2312         status = func; \
2313         if (gcmIS_ERROR(status)) \
2314         { \
2315             prefix##TRACE(gcvLEVEL_ERROR, \
2316                 #prefix "ONERROR: status=%d @ %s(%d) in " __FILE__, \
2317                 status, __FUNCTION__, __LINE__); \
2318             goto OnError; \
2319         } \
2320     } \
2321     while (gcvFALSE)
2322 #define gcmONERROR(func)            _gcmONERROR(gcm, func)
2323 #define gcmkONERROR(func)           _gcmONERROR(gcmk, func)
2324
2325 /*******************************************************************************
2326 **
2327 **  gcmVERIFY_LOCK
2328 **
2329 **      Verifies whether the surface is locked.
2330 **
2331 **  ARGUMENTS:
2332 **
2333 **      surfaceInfo Pointer to the surface iniformational structure.
2334 */
2335 #define gcmVERIFY_LOCK(surfaceInfo) \
2336     if (!surfaceInfo->node.valid) \
2337     { \
2338         status = gcvSTATUS_MEMORY_UNLOCKED; \
2339         break; \
2340     } \
2341     do { } while (gcvFALSE)
2342
2343 /*******************************************************************************
2344 **
2345 **  gcmVERIFY_NODE_LOCK
2346 **
2347 **      Verifies whether the surface node is locked.
2348 **
2349 **  ARGUMENTS:
2350 **
2351 **      surfaceInfo Pointer to the surface iniformational structure.
2352 */
2353 #define gcmVERIFY_NODE_LOCK(surfaceNode) \
2354     if (!surfaceNode->valid) \
2355     { \
2356         status = gcvSTATUS_MEMORY_UNLOCKED; \
2357         break; \
2358     } \
2359     do { } while (gcvFALSE)
2360
2361 /*******************************************************************************
2362 **
2363 **  gcmBADOBJECT_BREAK
2364 **
2365 **      Executes a break statement on bad object.
2366 **
2367 **  ARGUMENTS:
2368 **
2369 **      obj     Object to test.
2370 **      t       Expected type of the object.
2371 */
2372 #define gcmBADOBJECT_BREAK(obj, t) \
2373     if ((obj == gcvNULL) \
2374     ||  (((gcsOBJECT *)(obj))->type != t) \
2375     ) \
2376     { \
2377         status = gcvSTATUS_INVALID_OBJECT; \
2378         break; \
2379     } \
2380     do { } while (gcvFALSE)
2381
2382 /*******************************************************************************
2383 **
2384 **  gcmCHECK_STATUS
2385 **
2386 **      Executes a break statement on error.
2387 **
2388 **  ASSUMPTIONS:
2389 **
2390 **      'status' variable of gceSTATUS type must be defined.
2391 **
2392 **  ARGUMENTS:
2393 **
2394 **      func    Function to evaluate.
2395 */
2396 #define _gcmCHECK_STATUS(prefix, func) \
2397     do \
2398     { \
2399         last = func; \
2400         if (gcmIS_ERROR(last)) \
2401         { \
2402             prefix##TRACE(gcvLEVEL_ERROR, \
2403                 #prefix "CHECK_STATUS: status=%d @ %s(%d) in " __FILE__, \
2404                 last, __FUNCTION__, __LINE__); \
2405             status = last; \
2406         } \
2407     } \
2408     while (gcvFALSE)
2409 #define gcmCHECK_STATUS(func)       _gcmCHECK_STATUS(gcm, func)
2410 #define gcmkCHECK_STATUS(func)      _gcmCHECK_STATUS(gcmk, func)
2411
2412 /*******************************************************************************
2413 **
2414 **  gcmVERIFY_ARGUMENT
2415 **
2416 **      Assert if an argument does not apply to the specified expression.  If
2417 **      the argument evaluates to false, gcvSTATUS_INVALID_ARGUMENT will be
2418 **      returned from the current function.  In retail mode this macro does
2419 **      nothing.
2420 **
2421 **  ARGUMENTS:
2422 **
2423 **      arg     Argument to evaluate.
2424 */
2425 #ifndef EGL_API_ANDROID
2426 #   define _gcmVERIFY_ARGUMENT(prefix, arg) \
2427        do \
2428        { \
2429            if (!(arg)) \
2430            { \
2431                prefix##TRACE(gcvLEVEL_ERROR, #prefix "VERIFY_ARGUMENT failed:"); \
2432                prefix##ASSERT(arg); \
2433                prefix##FOOTER_ARG("status=%d", gcvSTATUS_INVALID_ARGUMENT); \
2434                return gcvSTATUS_INVALID_ARGUMENT; \
2435            } \
2436        } \
2437        while (gcvFALSE)
2438 #   define gcmVERIFY_ARGUMENT(arg)     _gcmVERIFY_ARGUMENT(gcm, arg)
2439 #   define gcmkVERIFY_ARGUMENT(arg)    _gcmVERIFY_ARGUMENT(gcmk, arg)
2440 #else
2441 #   define gcmVERIFY_ARGUMENT(arg)
2442 #   define gcmkVERIFY_ARGUMENT(arg)
2443 #endif
2444
2445 /*******************************************************************************
2446 **
2447 **  gcmVERIFY_ARGUMENT_RETURN
2448 **
2449 **      Assert if an argument does not apply to the specified expression.  If
2450 **      the argument evaluates to false, gcvSTATUS_INVALID_ARGUMENT will be
2451 **      returned from the current function.  In retail mode this macro does
2452 **      nothing.
2453 **
2454 **  ARGUMENTS:
2455 **
2456 **      arg     Argument to evaluate.
2457 */
2458 #ifndef EGL_API_ANDROID
2459 #   define _gcmVERIFY_ARGUMENT_RETURN(prefix, arg, value) \
2460        do \
2461        { \
2462            if (!(arg)) \
2463            { \
2464                prefix##TRACE(gcvLEVEL_ERROR, \
2465                              #prefix "gcmVERIFY_ARGUMENT_RETURN failed:"); \
2466                prefix##ASSERT(arg); \
2467                prefix##FOOTER_ARG("value=%d", value); \
2468                return value; \
2469            } \
2470        } \
2471        while (gcvFALSE)
2472 #   define gcmVERIFY_ARGUMENT_RETURN(arg, value) \
2473                 _gcmVERIFY_ARGUMENT_RETURN(gcm, arg, value)
2474 #   define gcmkVERIFY_ARGUMENT_RETURN(arg, value) \
2475                 _gcmVERIFY_ARGUMENT_RETURN(gcmk, arg, value)
2476 #else
2477 #   define gcmVERIFY_ARGUMENT_RETURN(arg, value)
2478 #   define gcmkVERIFY_ARGUMENT_RETURN(arg, value)
2479 #endif
2480 #ifdef __cplusplus
2481 }
2482 #endif
2483
2484 #endif /* __gc_hal_base_h_ */
2485