Subversion Repositories Kolibri OS

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
5564 serge 1
/*
2
 * SGI FREE SOFTWARE LICENSE B (Version 2.0, Sept. 18, 2008)
3
 * Copyright (C) 1991-2000 Silicon Graphics, Inc. All Rights Reserved.
4
 *
5
 * Permission is hereby granted, free of charge, to any person obtaining a
6
 * copy of this software and associated documentation files (the "Software"),
7
 * to deal in the Software without restriction, including without limitation
8
 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
9
 * and/or sell copies of the Software, and to permit persons to whom the
10
 * Software is furnished to do so, subject to the following conditions:
11
 *
12
 * The above copyright notice including the dates of first publication and
13
 * either this permission notice or a reference to
14
 * http://oss.sgi.com/projects/FreeB/
15
 * shall be included in all copies or substantial portions of the Software.
16
 *
17
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
18
 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
20
 * SILICON GRAPHICS, INC. BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
21
 * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF
22
 * OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
23
 * SOFTWARE.
24
 *
25
 * Except as contained in this notice, the name of Silicon Graphics, Inc.
26
 * shall not be used in advertising or otherwise to promote the sale, use or
27
 * other dealings in this Software without prior written authorization from
28
 * Silicon Graphics, Inc.
29
 */
30
 
31
/**
32
 * \file glxclient.h
33
 * Direct rendering support added by Precision Insight, Inc.
34
 *
35
 * \author Kevin E. Martin 
36
 */
37
 
38
#ifndef _GLX_client_h_
39
#define _GLX_client_h_
40
#include 
41
#include 
42
#include 
43
#include 
44
#define GLX_GLXEXT_PROTOTYPES
45
#include 
46
#include 
47
#include 
48
#include 
49
#include 
50
#include 
51
#include 
52
#include "GL/glxproto.h"
53
#include "glxconfig.h"
54
#include "glxhash.h"
55
#include "util/macros.h"
56
 
57
#include "glxextensions.h"
58
 
59
 
60
#define GLX_MAJOR_VERSION 1       /* current version numbers */
61
#define GLX_MINOR_VERSION 4
62
 
63
#define __GLX_MAX_TEXTURE_UNITS 32
64
 
65
struct glx_display;
66
struct glx_context;
67
 
68
/************************************************************************/
69
 
70
#ifdef GLX_DIRECT_RENDERING
71
 
72
extern void DRI_glXUseXFont(struct glx_context *ctx,
73
			    Font font, int first, int count, int listbase);
74
 
75
#endif
76
 
77
#if defined(GLX_DIRECT_RENDERING) && !defined(GLX_USE_APPLEGL)
78
 
79
/**
80
 * Display dependent methods.  This structure is initialized during the
81
 * \c driCreateDisplay call.
82
 */
83
typedef struct __GLXDRIdisplayRec __GLXDRIdisplay;
84
typedef struct __GLXDRIscreenRec __GLXDRIscreen;
85
typedef struct __GLXDRIdrawableRec __GLXDRIdrawable;
86
 
87
struct __GLXDRIdisplayRec
88
{
89
    /**
90
     * Method to destroy the private DRI display data.
91
     */
92
   void (*destroyDisplay) (__GLXDRIdisplay * display);
93
 
94
   struct glx_screen *(*createScreen)(int screen, struct glx_display * priv);
95
};
96
 
97
struct __GLXDRIscreenRec {
98
 
99
   void (*destroyScreen)(struct glx_screen *psc);
100
 
101
   struct glx_context *(*createContext)(struct glx_screen *psc,
102
					struct glx_config *config,
103
					struct glx_context *shareList,
104
					int renderType);
105
 
106
   __GLXDRIdrawable *(*createDrawable)(struct glx_screen *psc,
107
				       XID drawable,
108
				       GLXDrawable glxDrawable,
109
				       struct glx_config *config);
110
 
111
   int64_t (*swapBuffers)(__GLXDRIdrawable *pdraw, int64_t target_msc,
112
			  int64_t divisor, int64_t remainder, Bool flush);
113
   void (*copySubBuffer)(__GLXDRIdrawable *pdraw,
114
			 int x, int y, int width, int height, Bool flush);
115
   int (*getDrawableMSC)(struct glx_screen *psc, __GLXDRIdrawable *pdraw,
116
			 int64_t *ust, int64_t *msc, int64_t *sbc);
117
   int (*waitForMSC)(__GLXDRIdrawable *pdraw, int64_t target_msc,
118
		     int64_t divisor, int64_t remainder, int64_t *ust,
119
		     int64_t *msc, int64_t *sbc);
120
   int (*waitForSBC)(__GLXDRIdrawable *pdraw, int64_t target_sbc, int64_t *ust,
121
		     int64_t *msc, int64_t *sbc);
122
   int (*setSwapInterval)(__GLXDRIdrawable *pdraw, int interval);
123
   int (*getSwapInterval)(__GLXDRIdrawable *pdraw);
124
   int (*getBufferAge)(__GLXDRIdrawable *pdraw);
125
};
126
 
127
struct __GLXDRIdrawableRec
128
{
129
   void (*destroyDrawable) (__GLXDRIdrawable * drawable);
130
 
131
   XID xDrawable;
132
   XID drawable;
133
   struct glx_screen *psc;
134
   GLenum textureTarget;
135
   GLenum textureFormat;        /* EXT_texture_from_pixmap support */
136
   unsigned long eventMask;
137
   int refcount;
138
};
139
 
140
/*
141
** Function to create and DRI display data and initialize the display
142
** dependent methods.
143
*/
144
extern __GLXDRIdisplay *driswCreateDisplay(Display * dpy);
145
extern __GLXDRIdisplay *driCreateDisplay(Display * dpy);
146
extern __GLXDRIdisplay *dri2CreateDisplay(Display * dpy);
147
extern void dri2InvalidateBuffers(Display *dpy, XID drawable);
148
extern unsigned dri2GetSwapEventType(Display *dpy, XID drawable);
149
 
150
extern __GLXDRIdisplay *dri3_create_display(Display * dpy);
151
 
152
/*
153
** Functions to obtain driver configuration information from a direct
154
** rendering client application
155
*/
156
extern const char *glXGetScreenDriver(Display * dpy, int scrNum);
157
 
158
extern const char *glXGetDriverConfig(const char *driverName);
159
 
160
#endif
161
 
162
/************************************************************************/
163
 
164
#define __GL_CLIENT_ATTRIB_STACK_DEPTH 16
165
 
166
typedef struct __GLXpixelStoreModeRec
167
{
168
   GLboolean swapEndian;
169
   GLboolean lsbFirst;
170
   GLuint rowLength;
171
   GLuint imageHeight;
172
   GLuint imageDepth;
173
   GLuint skipRows;
174
   GLuint skipPixels;
175
   GLuint skipImages;
176
   GLuint alignment;
177
} __GLXpixelStoreMode;
178
 
179
 
180
typedef struct __GLXattributeRec
181
{
182
   GLuint mask;
183
 
184
    /**
185
     * Pixel storage state.  Most of the pixel store mode state is kept
186
     * here and used by the client code to manage the packing and
187
     * unpacking of data sent to/received from the server.
188
     */
189
   __GLXpixelStoreMode storePack, storeUnpack;
190
 
191
    /**
192
     * Is EXT_vertex_array / GL 1.1 DrawArrays protocol specifically
193
     * disabled?
194
     */
195
   GLboolean NoDrawArraysProtocol;
196
 
197
    /**
198
     * Vertex Array storage state.  The vertex array component
199
     * state is stored here and is used to manage the packing of
200
     * DrawArrays data sent to the server.
201
     */
202
   struct array_state_vector *array_state;
203
} __GLXattribute;
204
 
205
typedef struct __GLXattributeMachineRec
206
{
207
   __GLXattribute *stack[__GL_CLIENT_ATTRIB_STACK_DEPTH];
208
   __GLXattribute **stackPointer;
209
} __GLXattributeMachine;
210
 
211
struct glx_context_vtable {
212
   void (*destroy)(struct glx_context *ctx);
213
   int (*bind)(struct glx_context *context, struct glx_context *old,
214
	       GLXDrawable draw, GLXDrawable read);
215
   void (*unbind)(struct glx_context *context, struct glx_context *new_ctx);
216
   void (*wait_gl)(struct glx_context *ctx);
217
   void (*wait_x)(struct glx_context *ctx);
218
   void (*use_x_font)(struct glx_context *ctx,
219
		      Font font, int first, int count, int listBase);
220
   void (*bind_tex_image)(Display * dpy,
221
			  GLXDrawable drawable,
222
			  int buffer, const int *attrib_list);
223
   void (*release_tex_image)(Display * dpy, GLXDrawable drawable, int buffer);
224
   void * (*get_proc_address)(const char *symbol);
225
};
226
 
227
/**
228
 * GLX state that needs to be kept on the client.  One of these records
229
 * exist for each context that has been made current by this client.
230
 */
231
struct glx_context
232
{
233
    /**
234
     * \name Drawing command buffer.
235
     *
236
     * Drawing commands are packed into this buffer before being sent as a
237
     * single GLX protocol request.  The buffer is sent when it overflows or
238
     * is flushed by \c __glXFlushRenderBuffer.  \c pc is the next location
239
     * in the buffer to be filled.  \c limit is described above in the buffer
240
     * slop discussion.
241
     *
242
     * Commands that require large amounts of data to be transfered will
243
     * also use this buffer to hold a header that describes the large
244
     * command.
245
     *
246
     * These must be the first 6 fields since they are static initialized
247
     * in the dummy context in glxext.c
248
     */
249
   /*@{ */
250
   GLubyte *buf;
251
   GLubyte *pc;
252
   GLubyte *limit;
253
   GLubyte *bufEnd;
254
   GLint bufSize;
255
   /*@} */
256
 
257
   const struct glx_context_vtable *vtable;
258
 
259
    /**
260
     * The XID of this rendering context.  When the context is created a
261
     * new XID is allocated.  This is set to None when the context is
262
     * destroyed but is still current to some thread. In this case the
263
     * context will be freed on next MakeCurrent.
264
     */
265
   XID xid;
266
 
267
    /**
268
     * The XID of the \c shareList context.
269
     */
270
   XID share_xid;
271
 
272
    /**
273
     * Screen number.
274
     */
275
   GLint screen;
276
   struct glx_screen *psc;
277
 
278
    /**
279
     * \c GL_TRUE if the context was created with ImportContext, which
280
     * means the server-side context was created by another X client.
281
     */
282
   GLboolean imported;
283
 
284
    /**
285
     * The context tag returned by MakeCurrent when this context is made
286
     * current. This tag is used to identify the context that a thread has
287
     * current so that proper server context management can be done.  It is
288
     * used for all context specific commands (i.e., \c Render, \c RenderLarge,
289
     * \c WaitX, \c WaitGL, \c UseXFont, and \c MakeCurrent (for the old
290
     * context)).
291
     */
292
   GLXContextTag currentContextTag;
293
 
294
    /**
295
     * \name Rendering mode
296
     *
297
     * The rendering mode is kept on the client as well as the server.
298
     * When \c glRenderMode is called, the buffer associated with the
299
     * previous rendering mode (feedback or select) is filled.
300
     */
301
   /*@{ */
302
   GLenum renderMode;
303
   GLfloat *feedbackBuf;
304
   GLuint *selectBuf;
305
   /*@} */
306
 
307
    /**
308
     * Fill newImage with the unpacked form of \c oldImage getting it
309
     * ready for transport to the server.
310
     */
311
   void (*fillImage) (struct glx_context *, GLint, GLint, GLint, GLint, GLenum,
312
                      GLenum, const GLvoid *, GLubyte *, GLubyte *);
313
 
314
    /**
315
     * Client side attribs.
316
     */
317
   __GLXattributeMachine attributes;
318
 
319
    /**
320
     * Client side error code.  This is set when client side gl API
321
     * routines need to set an error because of a bad enumerant or
322
     * running out of memory, etc.
323
     */
324
   GLenum error;
325
 
326
    /**
327
     * Whether this context does direct rendering.
328
     */
329
   Bool isDirect;
330
 
331
#if defined(GLX_DIRECT_RENDERING) && defined(GLX_USE_APPLEGL)
332
   void *driContext;
333
#endif
334
 
335
    /**
336
     * \c dpy of current display for this context.  Will be \c NULL if not
337
     * current to any display, or if this is the "dummy context".
338
     */
339
   Display *currentDpy;
340
 
341
    /**
342
     * The current drawable for this context.  Will be None if this
343
     * context is not current to any drawable.  currentReadable is below.
344
     */
345
   GLXDrawable currentDrawable;
346
 
347
    /**
348
     * \name GL Constant Strings
349
     *
350
     * Constant strings that describe the server implementation
351
     * These pertain to GL attributes, not to be confused with
352
     * GLX versioning attributes.
353
     */
354
   /*@{ */
355
   GLubyte *vendor;
356
   GLubyte *renderer;
357
   GLubyte *version;
358
   GLubyte *extensions;
359
   /*@} */
360
 
361
    /**
362
     * Maximum small render command size.  This is the smaller of 64k and
363
     * the size of the above buffer.
364
     */
365
   GLint maxSmallRenderCommandSize;
366
 
367
    /**
368
     * Major opcode for the extension.  Copied here so a lookup isn't
369
     * needed.
370
     */
371
   GLint majorOpcode;
372
 
373
    /**
374
     * Pointer to the config used to create this context.
375
     */
376
   struct glx_config *config;
377
 
378
    /**
379
     * The current read-drawable for this context.  Will be None if this
380
     * context is not current to any drawable.
381
     *
382
     * \since Internal API version 20030606.
383
     */
384
   GLXDrawable currentReadable;
385
 
386
   /**
387
    * Pointer to client-state data that is private to libGL.  This is only
388
    * used for indirect rendering contexts.
389
    *
390
    * No internal API version change was made for this change.  Client-side
391
    * drivers should NEVER use this data or even care that it exists.
392
    */
393
   void *client_state_private;
394
 
395
   /**
396
    * Stored value for \c glXQueryContext attribute \c GLX_RENDER_TYPE.
397
    */
398
   int renderType;
399
 
400
   /**
401
    * \name Raw server GL version
402
    *
403
    * True core GL version supported by the server.  This is the raw value
404
    * returned by the server, and it may not reflect what is actually
405
    * supported (or reported) by the client-side library.
406
    */
407
   /*@{ */
408
   int server_major;        /**< Major version number. */
409
   int server_minor;        /**< Minor version number. */
410
   /*@} */
411
 
412
   /**
413
    * Number of threads we're currently current in.
414
    */
415
   unsigned long thread_refcount;
416
 
417
   char gl_extension_bits[__GL_EXT_BYTES];
418
};
419
 
420
extern Bool
421
glx_context_init(struct glx_context *gc,
422
		 struct glx_screen *psc, struct glx_config *fbconfig);
423
 
424
#define __glXSetError(gc,code)  \
425
   if (!(gc)->error) {          \
426
      (gc)->error = code;       \
427
   }
428
 
429
extern void __glFreeAttributeState(struct glx_context *);
430
 
431
/************************************************************************/
432
 
433
/**
434
 * The size of the largest drawing command known to the implementation
435
 * that will use the GLXRender GLX command.  In this case it is
436
 * \c glPolygonStipple.
437
 */
438
#define __GLX_MAX_SMALL_RENDER_CMD_SIZE 156
439
 
440
/**
441
 * To keep the implementation fast, the code uses a "limit" pointer
442
 * to determine when the drawing command buffer is too full to hold
443
 * another fixed size command.  This constant defines the amount of
444
 * space that must always be available in the drawing command buffer
445
 * at all times for the implementation to work.  It is important that
446
 * the number be just large enough, but not so large as to reduce the
447
 * efficacy of the buffer.  The "+32" is just to keep the code working
448
 * in case somebody counts wrong.
449
 */
450
#define __GLX_BUFFER_LIMIT_SIZE (__GLX_MAX_SMALL_RENDER_CMD_SIZE + 32)
451
 
452
/**
453
 * This implementation uses a smaller threshold for switching
454
 * to the RenderLarge protocol than the protcol requires so that
455
 * large copies don't occur.
456
 */
457
#define __GLX_RENDER_CMD_SIZE_LIMIT 4096
458
 
459
/**
460
 * One of these records exists per screen of the display.  It contains
461
 * a pointer to the config data for that screen (if the screen supports GL).
462
 */
463
struct glx_screen_vtable {
464
   struct glx_context *(*create_context)(struct glx_screen *psc,
465
					 struct glx_config *config,
466
					 struct glx_context *shareList,
467
					 int renderType);
468
 
469
   struct glx_context *(*create_context_attribs)(struct glx_screen *psc,
470
						 struct glx_config *config,
471
						 struct glx_context *shareList,
472
						 unsigned num_attrib,
473
						 const uint32_t *attribs,
474
						 unsigned *error);
475
   int (*query_renderer_integer)(struct glx_screen *psc,
476
                                 int attribute,
477
                                 unsigned int *value);
478
   int (*query_renderer_string)(struct glx_screen *psc,
479
                                int attribute,
480
                                const char **value);
481
};
482
 
483
struct glx_screen
484
{
485
   const struct glx_screen_vtable *vtable;
486
 
487
    /**
488
     * GLX extension string reported by the X-server.
489
     */
490
   const char *serverGLXexts;
491
 
492
    /**
493
     * GLX extension string to be reported to applications.  This is the
494
     * set of extensions that the application can actually use.
495
     */
496
   char *effectiveGLXexts;
497
 
498
   struct glx_display *display;
499
 
500
   Display *dpy;
501
   int scr;
502
 
503
#if defined(GLX_DIRECT_RENDERING) && !defined(GLX_USE_APPLEGL)
504
    /**
505
     * Per screen direct rendering interface functions and data.
506
     */
507
   __GLXDRIscreen *driScreen;
508
#endif
509
 
510
    /**
511
     * Linked list of glx visuals and  fbconfigs for this screen.
512
     */
513
   struct glx_config *visuals, *configs;
514
 
515
    /**
516
     * Per-screen dynamic GLX extension tracking.  The \c direct_support
517
     * field only contains enough bits for 64 extensions.  Should libGL
518
     * ever need to track more than 64 GLX extensions, we can safely grow
519
     * this field.  The \c struct glx_screen structure is not used outside
520
     * libGL.
521
     */
522
   /*@{ */
523
   unsigned char direct_support[8];
524
   GLboolean ext_list_first_time;
525
   /*@} */
526
 
527
};
528
 
529
/**
530
 * Per display private data.  One of these records exists for each display
531
 * that is using the OpenGL (GLX) extension.
532
 */
533
struct glx_display
534
{
535
   /* The extension protocol codes */
536
   XExtCodes *codes;
537
   struct glx_display *next;
538
 
539
    /**
540
     * Back pointer to the display
541
     */
542
   Display *dpy;
543
 
544
    /**
545
     * The \c majorOpcode is common to all connections to the same server.
546
     * It is also copied into the context structure.
547
     */
548
   int majorOpcode;
549
 
550
    /**
551
     * \name Server Version
552
     *
553
     * Major and minor version returned by the server during initialization.
554
     */
555
   /*@{ */
556
   int majorVersion, minorVersion;
557
   /*@} */
558
 
559
    /**
560
     * \name Storage for the servers GLX vendor and versions strings.
561
     *
562
     * These are the same for all screens on this display. These fields will
563
     * be filled in on demand.
564
     */
565
   /*@{ */
566
   const char *serverGLXvendor;
567
   const char *serverGLXversion;
568
   /*@} */
569
 
570
    /**
571
     * Configurations of visuals for all screens on this display.
572
     * Also, per screen data which now includes the server \c GLX_EXTENSION
573
     * string.
574
     */
575
   struct glx_screen **screens;
576
 
577
   __glxHashTable *glXDrawHash;
578
 
579
#if defined(GLX_DIRECT_RENDERING) && !defined(GLX_USE_APPLEGL)
580
   __glxHashTable *drawHash;
581
 
582
    /**
583
     * Per display direct rendering interface functions and data.
584
     */
585
   __GLXDRIdisplay *driswDisplay;
586
   __GLXDRIdisplay *driDisplay;
587
   __GLXDRIdisplay *dri2Display;
588
   __GLXDRIdisplay *dri3Display;
589
#endif
590
};
591
 
592
struct glx_drawable {
593
   XID xDrawable;
594
   XID drawable;
595
 
596
   uint32_t lastEventSbc;
597
   int64_t eventSbcWrap;
598
};
599
 
600
extern int
601
glx_screen_init(struct glx_screen *psc,
602
		int screen, struct glx_display * priv);
603
extern void
604
glx_screen_cleanup(struct glx_screen *psc);
605
 
606
#if defined(GLX_DIRECT_RENDERING) && !defined(GLX_USE_APPLEGL)
607
extern __GLXDRIdrawable *
608
dri2GetGlxDrawableFromXDrawableId(Display *dpy, XID id);
609
#endif
610
 
611
extern GLubyte *__glXFlushRenderBuffer(struct glx_context *, GLubyte *);
612
 
613
extern void __glXSendLargeChunk(struct glx_context * gc, GLint requestNumber,
614
                                GLint totalRequests,
615
                                const GLvoid * data, GLint dataLen);
616
 
617
extern void __glXSendLargeCommand(struct glx_context *, const GLvoid *, GLint,
618
                                  const GLvoid *, GLint);
619
 
620
/* Initialize the GLX extension for dpy */
621
extern struct glx_display *__glXInitialize(Display *);
622
 
623
extern void __glXPreferEGL(int state);
624
 
625
/************************************************************************/
626
 
627
extern int __glXDebug;
628
 
629
/* This is per-thread storage in an MT environment */
630
 
631
extern void __glXSetCurrentContext(struct glx_context * c);
632
 
633
# if defined( GLX_USE_TLS )
634
 
635
extern __thread void *__glX_tls_Context
636
   __attribute__ ((tls_model("initial-exec")));
637
 
638
#  define __glXGetCurrentContext() __glX_tls_Context
639
 
640
# else
641
 
642
extern struct glx_context *__glXGetCurrentContext(void);
643
 
644
# endif /* defined( GLX_USE_TLS ) */
645
 
646
extern void __glXSetCurrentContextNull(void);
647
 
648
 
649
/*
650
** Global lock for all threads in this address space using the GLX
651
** extension
652
*/
653
extern pthread_mutex_t __glXmutex;
654
#define __glXLock()    pthread_mutex_lock(&__glXmutex)
655
#define __glXUnlock()  pthread_mutex_unlock(&__glXmutex)
656
 
657
/*
658
** Setup for a command.  Initialize the extension for dpy if necessary.
659
*/
660
extern CARD8 __glXSetupForCommand(Display * dpy);
661
 
662
/************************************************************************/
663
 
664
/*
665
** Data conversion and packing support.
666
*/
667
 
668
extern const GLuint __glXDefaultPixelStore[9];
669
 
670
/* Send an image to the server using RenderLarge. */
671
extern void __glXSendLargeImage(struct glx_context * gc, GLint compsize, GLint dim,
672
                                GLint width, GLint height, GLint depth,
673
                                GLenum format, GLenum type,
674
                                const GLvoid * src, GLubyte * pc,
675
                                GLubyte * modes);
676
 
677
/* Return the size, in bytes, of some pixel data */
678
extern GLint __glImageSize(GLint, GLint, GLint, GLenum, GLenum, GLenum);
679
 
680
/* Return the number of elements per group of a specified format*/
681
extern GLint __glElementsPerGroup(GLenum format, GLenum type);
682
 
683
/* Return the number of bytes per element, based on the element type (other
684
** than GL_BITMAP).
685
*/
686
extern GLint __glBytesPerElement(GLenum type);
687
 
688
/*
689
** Fill the transport buffer with the data from the users buffer,
690
** applying some of the pixel store modes (unpack modes) to the data
691
** first.  As a side effect of this call, the "modes" field is
692
** updated to contain the modes needed by the server to decode the
693
** sent data.
694
*/
695
extern void __glFillImage(struct glx_context *, GLint, GLint, GLint, GLint, GLenum,
696
                          GLenum, const GLvoid *, GLubyte *, GLubyte *);
697
 
698
/* Copy map data with a stride into a packed buffer */
699
extern void __glFillMap1f(GLint, GLint, GLint, const GLfloat *, GLubyte *);
700
extern void __glFillMap1d(GLint, GLint, GLint, const GLdouble *, GLubyte *);
701
extern void __glFillMap2f(GLint, GLint, GLint, GLint, GLint,
702
                          const GLfloat *, GLfloat *);
703
extern void __glFillMap2d(GLint, GLint, GLint, GLint, GLint,
704
                          const GLdouble *, GLdouble *);
705
 
706
/*
707
** Empty an image out of the reply buffer into the clients memory applying
708
** the pack modes to pack back into the clients requested format.
709
*/
710
extern void __glEmptyImage(struct glx_context *, GLint, GLint, GLint, GLint, GLenum,
711
                           GLenum, const GLubyte *, GLvoid *);
712
 
713
 
714
/*
715
** Allocate and Initialize Vertex Array client state, and free.
716
*/
717
extern void __glXInitVertexArrayState(struct glx_context *);
718
extern void __glXFreeVertexArrayState(struct glx_context *);
719
 
720
/*
721
** Inform the Server of the major and minor numbers and of the client
722
** libraries extension string.
723
*/
724
extern void __glXClientInfo(Display * dpy, int opcode);
725
 
726
_X_HIDDEN void
727
__glX_send_client_info(struct glx_display *glx_dpy);
728
 
729
/************************************************************************/
730
 
731
/*
732
** Declarations that should be in Xlib
733
*/
734
#ifdef __GL_USE_OUR_PROTOTYPES
735
extern void _XFlush(Display *);
736
extern Status _XReply(Display *, xReply *, int, Bool);
737
extern void _XRead(Display *, void *, long);
738
extern void _XSend(Display *, const void *, long);
739
#endif
740
 
741
 
742
extern void __glXInitializeVisualConfigFromTags(struct glx_config * config,
743
                                                int count, const INT32 * bp,
744
                                                Bool tagged_only,
745
                                                Bool fbconfig_style_tags);
746
 
747
extern char *__glXQueryServerString(Display * dpy, int opcode,
748
                                    CARD32 screen, CARD32 name);
749
extern char *__glXGetString(Display * dpy, int opcode,
750
                            CARD32 screen, CARD32 name);
751
 
752
extern const char __glXGLClientVersion[];
753
extern const char __glXGLClientExtensions[];
754
 
755
/* Get the unadjusted system time */
756
extern int __glXGetUST(int64_t * ust);
757
 
758
extern GLboolean __glXGetMscRateOML(Display * dpy, GLXDrawable drawable,
759
                                    int32_t * numerator,
760
                                    int32_t * denominator);
761
 
762
#if defined(GLX_DIRECT_RENDERING) && !defined(GLX_USE_APPLEGL)
763
extern GLboolean
764
__glxGetMscRate(struct glx_screen *psc,
765
		int32_t * numerator, int32_t * denominator);
766
 
767
/* So that dri2.c:DRI2WireToEvent() can access
768
 * glx_info->codes->first_event */
769
XExtDisplayInfo *__glXFindDisplay (Display *dpy);
770
 
771
extern void
772
GarbageCollectDRIDrawables(struct glx_screen *psc);
773
 
774
extern __GLXDRIdrawable *
775
GetGLXDRIDrawable(Display *dpy, GLXDrawable drawable);
776
#endif
777
 
778
extern struct glx_screen *GetGLXScreenConfigs(Display * dpy, int scrn);
779
 
780
#ifdef GLX_USE_APPLEGL
781
extern struct glx_screen *
782
applegl_create_screen(int screen, struct glx_display * priv);
783
 
784
extern struct glx_context *
785
applegl_create_context(struct glx_screen *psc,
786
			struct glx_config *mode,
787
			struct glx_context *shareList, int renderType);
788
 
789
extern int
790
applegl_create_display(struct glx_display *display);
791
#endif
792
 
793
extern Bool validate_renderType_against_config(const struct glx_config *config,
794
                                               int renderType);
795
 
796
 
797
extern struct glx_drawable *GetGLXDrawable(Display *dpy, GLXDrawable drawable);
798
extern int InitGLXDrawable(Display *dpy, struct glx_drawable *glxDraw,
799
			   XID xDrawable, GLXDrawable drawable);
800
extern void DestroyGLXDrawable(Display *dpy, GLXDrawable drawable);
801
 
802
extern struct glx_context dummyContext;
803
 
804
extern struct glx_screen *
805
indirect_create_screen(int screen, struct glx_display * priv);
806
extern struct glx_context *
807
indirect_create_context(struct glx_screen *psc,
808
			struct glx_config *mode,
809
			struct glx_context *shareList, int renderType);
810
extern struct glx_context *
811
indirect_create_context_attribs(struct glx_screen *base,
812
                                struct glx_config *config_base,
813
                                struct glx_context *shareList,
814
                                unsigned num_attribs,
815
                                const uint32_t *attribs,
816
                                unsigned *error);
817
 
818
#endif /* !__GLX_client_h__ */