Subversion Repositories shark

Rev

Rev 55 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
55 pj 1
/* $XFree86: xc/lib/GL/include/GL/internal/glcore.h,v 1.7 2001/03/25 05:32:00 tsi Exp $ */
2
#ifndef __gl_core_h_
3
#define __gl_core_h_
4
 
5
/*
6
** License Applicability. Except to the extent portions of this file are
7
** made subject to an alternative license as permitted in the SGI Free
8
** Software License B, Version 1.1 (the "License"), the contents of this
9
** file are subject only to the provisions of the License. You may not use
10
** this file except in compliance with the License. You may obtain a copy
11
** of the License at Silicon Graphics, Inc., attn: Legal Services, 1600
12
** Amphitheatre Parkway, Mountain View, CA 94043-1351, or at:
13
**
14
** http://oss.sgi.com/projects/FreeB
15
**
16
** Note that, as provided in the License, the Software is distributed on an
17
** "AS IS" basis, with ALL EXPRESS AND IMPLIED WARRANTIES AND CONDITIONS
18
** DISCLAIMED, INCLUDING, WITHOUT LIMITATION, ANY IMPLIED WARRANTIES AND
19
** CONDITIONS OF MERCHANTABILITY, SATISFACTORY QUALITY, FITNESS FOR A
20
** PARTICULAR PURPOSE, AND NON-INFRINGEMENT.
21
**
22
** Original Code. The Original Code is: OpenGL Sample Implementation,
23
** Version 1.2.1, released January 26, 2000, developed by Silicon Graphics,
24
** Inc. The Original Code is Copyright (c) 1991-2000 Silicon Graphics, Inc.
25
** Copyright in any portions created by third parties is as indicated
26
** elsewhere herein. All Rights Reserved.
27
**
28
** Additional Notice Provisions: The application programming interfaces
29
** established by SGI in conjunction with the Original Code are The
30
** OpenGL(R) Graphics System: A Specification (Version 1.2.1), released
31
** April 1, 1999; The OpenGL(R) Graphics System Utility Library (Version
32
** 1.3), released November 4, 1998; and OpenGL(R) Graphics with the X
33
** Window System(R) (Version 1.3), released October 19, 1998. This software
34
** was created using the OpenGL(R) version 1.2.1 Sample Implementation
35
** published by SGI, but has not been independently verified as being
36
** compliant with the OpenGL(R) version 1.2.1 Specification.
37
**
38
*/
39
 
40
#ifndef XFree86LOADER
41
#include <sys/types.h>
42
#endif
43
 
44
#define GL_CORE_SGI  1
45
#define GL_CORE_MESA 2
46
 
47
typedef struct __GLcontextRec __GLcontext;
48
typedef struct __GLinterfaceRec __GLinterface;
49
 
50
/*
51
** This file defines the interface between the GL core and the surrounding
52
** "operating system" that supports it (currently the GLX or WGL extensions).
53
**
54
** Members (data and function pointers) are documented as imported or
55
** exported according to how they are used by the core rendering functions.
56
** Imported members are initialized by the "operating system" and used by
57
** the core functions.  Exported members are initialized by the core functions
58
** and used by the "operating system".
59
*/
60
 
61
/*
62
** Mode and limit information for a context.  This information is
63
** kept around in the context so that values can be used during
64
** command execution, and for returning information about the
65
** context to the application.
66
*/
67
typedef struct __GLcontextModesRec {
68
    GLboolean rgbMode;
69
    GLboolean colorIndexMode;
70
    GLboolean doubleBufferMode;
71
    GLboolean stereoMode;
72
 
73
    GLboolean haveAccumBuffer;
74
    GLboolean haveDepthBuffer;
75
    GLboolean haveStencilBuffer;
76
 
77
    GLint redBits, greenBits, blueBits, alphaBits;      /* bits per comp */
78
    GLuint redMask, greenMask, blueMask, alphaMask;
79
    GLint rgbBits;              /* total bits for rgb */
80
    GLint indexBits;            /* total bits for colorindex */
81
 
82
    GLint accumRedBits, accumGreenBits, accumBlueBits, accumAlphaBits;
83
    GLint depthBits;
84
    GLint stencilBits;
85
 
86
    GLint numAuxBuffers;
87
 
88
    GLint level;
89
 
90
    GLint pixmapMode;
91
} __GLcontextModes;
92
 
93
/************************************************************************/
94
 
95
/*
96
** Structure used for allocating and freeing drawable private memory.
97
** (like software buffers, for example).
98
**
99
** The memory allocation routines are provided by the surrounding
100
** "operating system" code, and they are to be used for allocating
101
** software buffers and things which are associated with the drawable,
102
** and used by any context which draws to that drawable.  There are
103
** separate memory allocation functions for drawables and contexts
104
** since drawables and contexts can be created and destroyed independently
105
** of one another, and the "operating system" may want to use separate
106
** allocation arenas for each.
107
**
108
** The freePrivate function is filled in by the core routines when they
109
** allocates software buffers, and stick them in "private".  The freePrivate
110
** function will destroy anything allocated to this drawable (to be called
111
** when the drawable is destroyed).
112
*/
113
typedef struct __GLdrawableRegionRec __GLdrawableRegion;
114
typedef struct __GLdrawableBufferRec __GLdrawableBuffer;
115
typedef struct __GLdrawablePrivateRec __GLdrawablePrivate;
116
 
117
typedef struct __GLregionRectRec {
118
    /* lower left (inside the rectangle) */
119
    GLint x0, y0;
120
    /* upper right (outside the rectangle) */
121
    GLint x1, y1;
122
} __GLregionRect;
123
 
124
struct __GLdrawableRegionRec {
125
    GLint numRects;
126
    __GLregionRect *rects;
127
    __GLregionRect boundingRect;
128
};
129
 
130
/************************************************************************/
131
 
132
/* masks for the buffers */
133
#define __GL_FRONT_BUFFER_MASK          0x00000001
134
#define __GL_FRONT_LEFT_BUFFER_MASK     0x00000001
135
#define __GL_FRONT_RIGHT_BUFFER_MASK    0x00000002
136
#define __GL_BACK_BUFFER_MASK           0x00000004
137
#define __GL_BACK_LEFT_BUFFER_MASK      0x00000004
138
#define __GL_BACK_RIGHT_BUFFER_MASK     0x00000008
139
#define __GL_ACCUM_BUFFER_MASK          0x00000010
140
#define __GL_DEPTH_BUFFER_MASK          0x00000020
141
#define __GL_STENCIL_BUFFER_MASK        0x00000040
142
#define __GL_AUX_BUFFER_MASK(i)         (0x0000080 << (i))
143
 
144
#define __GL_ALL_BUFFER_MASK            0xffffffff
145
 
146
/* what Resize routines return if resize resorted to fallback case */
147
#define __GL_BUFFER_FALLBACK    0x10
148
 
149
typedef void (*__GLbufFallbackInitFn)(__GLdrawableBuffer *buf,
150
                                      __GLdrawablePrivate *glPriv, GLint bits);
151
typedef void (*__GLbufMainInitFn)(__GLdrawableBuffer *buf,
152
                                  __GLdrawablePrivate *glPriv, GLint bits,
153
                                  __GLbufFallbackInitFn back);
154
 
155
/*
156
** A drawable buffer
157
**
158
** This data structure describes the context side of a drawable.  
159
**
160
** According to the spec there could be multiple contexts bound to the same
161
** drawable at the same time (from different threads).  In order to avoid
162
** multiple-access conflicts, locks are used to serialize access.  When a
163
** thread needs to access (read or write) a member of the drawable, it takes
164
** a lock first.  Some of the entries in the drawable are treated "mostly
165
** constant", so we take the freedom of allowing access to them without
166
** taking a lock (for optimization reasons).
167
**
168
** For more details regarding locking, see buffers.h in the GL core
169
*/
170
struct __GLdrawableBufferRec {
171
    /*
172
    ** Buffer dimensions
173
    */
174
    GLint width, height, depth;
175
 
176
    /*
177
    ** Framebuffer base address
178
    */
179
    void *base;
180
 
181
    /*
182
    ** Framebuffer size (in bytes)
183
    */
184
    GLuint size;
185
 
186
    /*
187
    ** Size (in bytes) of each element in the framebuffer
188
    */
189
    GLuint elementSize;
190
    GLuint elementSizeLog2;
191
 
192
    /*
193
    ** Element skip from one scanline to the next.
194
    ** If the buffer is part of another buffer (for example, fullscreen
195
    ** front buffer), outerWidth is the width of that buffer.
196
    */
197
    GLint outerWidth;
198
 
199
    /*
200
    ** outerWidth * elementSize
201
    */
202
    GLint byteWidth;
203
 
204
    /*
205
    ** Allocation/deallocation is done based on this handle.  A handle
206
    ** is conceptually different from the framebuffer 'base'.
207
    */
208
    void *handle;
209
 
210
    /* imported */
211
    GLboolean (*resize)(__GLdrawableBuffer *buf,
212
                        GLint x, GLint y, GLuint width, GLuint height,
213
                        __GLdrawablePrivate *glPriv, GLuint bufferMask);
214
    void (*lock)(__GLdrawableBuffer *buf, __GLdrawablePrivate *glPriv);
215
    void (*unlock)(__GLdrawableBuffer *buf, __GLdrawablePrivate *glPriv);
216
    void (*fill)(__GLdrawableBuffer *buf, __GLdrawablePrivate *glPriv,
217
                GLuint val, GLint x, GLint y, GLint w, GLint h);
218
    void (*free)(__GLdrawableBuffer *buf, __GLdrawablePrivate *glPriv);
219
 
220
    /* exported */
221
    void (*freePrivate)(__GLdrawableBuffer *buf, __GLdrawablePrivate *glPriv);
222
#ifdef __cplusplus
223
    void *privatePtr;
224
#else
225
    void *private;
226
#endif
227
 
228
    /* private */
229
    void *other;        /* implementation private data */
230
    __GLbufMainInitFn mainInit;
231
    __GLbufFallbackInitFn fallbackInit;
232
};
233
 
234
/*
235
** The context side of the drawable private
236
*/
237
struct __GLdrawablePrivateRec {
238
    /*
239
    ** Drawable Modes
240
    */
241
    __GLcontextModes *modes;
242
 
243
    /*
244
    ** Drawable size
245
    */
246
    GLuint width, height;
247
 
248
    /*
249
    ** Origin in screen coordinates of the drawable
250
    */
251
    GLint xOrigin, yOrigin;
252
#ifdef __GL_ALIGNED_BUFFERS
253
    /*
254
    ** Drawable offset from screen origin
255
    */
256
    GLint xOffset, yOffset;
257
 
258
    /*
259
    ** Alignment restriction
260
    */
261
    GLint xAlignment, yAlignment;
262
#endif
263
    /*
264
    ** Should we invert the y axis?
265
    */
266
    GLint yInverted;
267
 
268
    /*
269
    ** Mask specifying which buffers are renderable by the hw
270
    */
271
    GLuint accelBufferMask;
272
 
273
    /*
274
    ** the buffers themselves
275
    */
276
    __GLdrawableBuffer frontBuffer;
277
    __GLdrawableBuffer backBuffer;
278
    __GLdrawableBuffer accumBuffer;
279
    __GLdrawableBuffer depthBuffer;
280
    __GLdrawableBuffer stencilBuffer;
281
#if defined(__GL_NUMBER_OF_AUX_BUFFERS) && (__GL_NUMBER_OF_AUX_BUFFERS > 0)
282
    __GLdrawableBuffer *auxBuffer;
283
#endif
284
 
285
    __GLdrawableRegion ownershipRegion;
286
 
287
    /*
288
    ** Lock for the drawable private structure
289
    */
290
    void *lock;
291
#ifdef DEBUG
292
    /* lock debugging info */
293
    int lockRefCount;
294
    int lockLine[10];
295
    char *lockFile[10];
296
#endif
297
 
298
    /* imported */
299
    void *(*malloc)(size_t size);
300
    void *(*calloc)(size_t numElem, size_t elemSize);
301
    void *(*realloc)(void *oldAddr, size_t newSize);
302
    void (*free)(void *addr);
303
 
304
    GLboolean (*addSwapRect)(__GLdrawablePrivate *glPriv,
305
                             GLint x, GLint y, GLsizei width, GLsizei height);
306
    void (*setClipRect)(__GLdrawablePrivate *glPriv,
307
                        GLint x, GLint y, GLsizei width, GLsizei height);
308
    void (*updateClipRegion)(__GLdrawablePrivate *glPriv);
309
    GLboolean (*resize)(__GLdrawablePrivate *glPriv);
310
    void (*getDrawableSize)(__GLdrawablePrivate *glPriv,
311
                            GLint *x, GLint *y, GLuint *width, GLuint *height);
312
 
313
    void (*lockDP)(__GLdrawablePrivate *glPriv, __GLcontext *gc);
314
    void (*unlockDP)(__GLdrawablePrivate *glPriv);
315
 
316
    /* exported */
317
#if 0 /* disable, just like in __GLimportsRec */
318
    void *wsPriv;       /* pointer to the window system DrawablePrivate */
319
#endif
320
#ifdef __cplusplus
321
    void *privatePtr;
322
#else
323
    void *private;
324
#endif
325
    void (*freePrivate)(__GLdrawablePrivate *);
326
 
327
    /* client data */
328
    void *other;
329
};
330
 
331
/*
332
** Macros to lock/unlock the drawable private
333
*/
334
#if defined(DEBUG)
335
#define __GL_LOCK_DP(glPriv,gc) \
336
    (*(glPriv)->lockDP)(glPriv,gc); \
337
    (glPriv)->lockLine[(glPriv)->lockRefCount] = __LINE__; \
338
    (glPriv)->lockFile[(glPriv)->lockRefCount] = __FILE__; \
339
    (glPriv)->lockRefCount++
340
#define __GL_UNLOCK_DP(glPriv) \
341
    (glPriv)->lockRefCount--; \
342
    (glPriv)->lockLine[(glPriv)->lockRefCount] = 0; \
343
    (glPriv)->lockFile[(glPriv)->lockRefCount] = NULL; \
344
    (*(glPriv)->unlockDP)(glPriv)
345
#else /* DEBUG */
346
#define __GL_LOCK_DP(glPriv,gc)         (*(glPriv)->lockDP)(glPriv,gc)
347
#define __GL_UNLOCK_DP(glPriv)          (*(glPriv)->unlockDP)(glPriv)
348
#endif /* DEBUG */
349
 
350
 
351
/*
352
** Procedures which are imported by the GL from the surrounding
353
** "operating system".  Math functions are not considered part of the
354
** "operating system".
355
*/
356
typedef struct __GLimportsRec {
357
    /* Memory management */
358
    void * (*malloc)(__GLcontext *gc, size_t size);
359
    void *(*calloc)(__GLcontext *gc, size_t numElem, size_t elemSize);
360
    void *(*realloc)(__GLcontext *gc, void *oldAddr, size_t newSize);
361
    void (*free)(__GLcontext *gc, void *addr);
362
 
363
    /* Error handling */
364
    void (*warning)(__GLcontext *gc, char *fmt);
365
    void (*fatal)(__GLcontext *gc, char *fmt);
366
 
367
    /* other system calls */
368
    char *(CAPI *getenv)(__GLcontext *gc, const char *var);
369
    int (CAPI *atoi)(__GLcontext *gc, const char *str);
370
    int (CAPI *sprintf)(__GLcontext *gc, char *str, const char *fmt, ...);
371
    void *(CAPI *fopen)(__GLcontext *gc, const char *path, const char *mode);
372
    int (CAPI *fclose)(__GLcontext *gc, void *stream);
373
    int (CAPI *fprintf)(__GLcontext *gc, void *stream, const char *fmt, ...);
374
 
375
    /* Drawing surface management */
376
    __GLdrawablePrivate *(*getDrawablePrivate)(__GLcontext *gc);
377
 
378
#if 0
379
   /* At some point, this field got removed from the XFree86 glcore.h file.
380
    * we're removing it here to prevent interop problems. (Brian)
381
    */
382
    /* Pointer to the window system context */
383
    void *wscx;
384
#endif
385
 
386
    /* Operating system dependent data goes here */
387
    void *other;
388
} __GLimports;
389
 
390
/************************************************************************/
391
 
392
/*
393
** Procedures which are exported by the GL to the surrounding "operating
394
** system" so that it can manage multiple GL context's.
395
*/
396
typedef struct __GLexportsRec {
397
    /* Context management (return GL_FALSE on failure) */
398
    GLboolean (*destroyContext)(__GLcontext *gc);
399
    GLboolean (*loseCurrent)(__GLcontext *gc);
400
    GLboolean (*makeCurrent)(__GLcontext *gc);
401
    GLboolean (*shareContext)(__GLcontext *gc, __GLcontext *gcShare);
402
    GLboolean (*copyContext)(__GLcontext *dst, const __GLcontext *src, GLuint mask);
403
    GLboolean (*forceCurrent)(__GLcontext *gc);
404
 
405
    /* Drawing surface notification callbacks */
406
    GLboolean (*notifyResize)(__GLcontext *gc);
407
    void (*notifyDestroy)(__GLcontext *gc);
408
    void (*notifySwapBuffers)(__GLcontext *gc);
409
 
410
    /* Dispatch table override control for external agents like libGLS */
411
    struct __GLdispatchStateRec* (*dispatchExec)(__GLcontext *gc);
412
    void (*beginDispatchOverride)(__GLcontext *gc);
413
    void (*endDispatchOverride)(__GLcontext *gc);
414
} __GLexports;
415
 
416
/************************************************************************/
417
 
418
/*
419
** This must be the first member of a __GLcontext structure.  This is the
420
** only part of a context that is exposed to the outside world; everything
421
** else is opaque.
422
*/
423
struct __GLinterfaceRec {
424
    __GLimports imports;
425
    __GLexports exports;
426
};
427
 
428
extern __GLcontext *__glCoreCreateContext(__GLimports *, __GLcontextModes *);
429
extern void __glCoreNopDispatch(void);
430
 
431
#endif /* __gl_core_h_ */