glxclient.h revision 848b8605
1848b8605Smrg/*
2848b8605Smrg * SGI FREE SOFTWARE LICENSE B (Version 2.0, Sept. 18, 2008)
3848b8605Smrg * Copyright (C) 1991-2000 Silicon Graphics, Inc. All Rights Reserved.
4848b8605Smrg *
5848b8605Smrg * Permission is hereby granted, free of charge, to any person obtaining a
6848b8605Smrg * copy of this software and associated documentation files (the "Software"),
7848b8605Smrg * to deal in the Software without restriction, including without limitation
8848b8605Smrg * the rights to use, copy, modify, merge, publish, distribute, sublicense,
9848b8605Smrg * and/or sell copies of the Software, and to permit persons to whom the
10848b8605Smrg * Software is furnished to do so, subject to the following conditions:
11848b8605Smrg *
12848b8605Smrg * The above copyright notice including the dates of first publication and
13848b8605Smrg * either this permission notice or a reference to
14848b8605Smrg * http://oss.sgi.com/projects/FreeB/
15848b8605Smrg * shall be included in all copies or substantial portions of the Software.
16848b8605Smrg *
17848b8605Smrg * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
18848b8605Smrg * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19848b8605Smrg * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
20848b8605Smrg * SILICON GRAPHICS, INC. BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
21848b8605Smrg * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF
22848b8605Smrg * OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
23848b8605Smrg * SOFTWARE.
24848b8605Smrg *
25848b8605Smrg * Except as contained in this notice, the name of Silicon Graphics, Inc.
26848b8605Smrg * shall not be used in advertising or otherwise to promote the sale, use or
27848b8605Smrg * other dealings in this Software without prior written authorization from
28848b8605Smrg * Silicon Graphics, Inc.
29848b8605Smrg */
30848b8605Smrg
31848b8605Smrg/**
32848b8605Smrg * \file glxclient.h
33848b8605Smrg * Direct rendering support added by Precision Insight, Inc.
34848b8605Smrg *
35848b8605Smrg * \author Kevin E. Martin <kevin@precisioninsight.com>
36848b8605Smrg */
37848b8605Smrg
38848b8605Smrg#ifndef _GLX_client_h_
39848b8605Smrg#define _GLX_client_h_
40848b8605Smrg#include <X11/Xproto.h>
41848b8605Smrg#include <X11/Xlibint.h>
42848b8605Smrg#include <X11/Xfuncproto.h>
43848b8605Smrg#include <X11/extensions/extutil.h>
44848b8605Smrg#define GLX_GLXEXT_PROTOTYPES
45848b8605Smrg#include <GL/glx.h>
46848b8605Smrg#include <GL/glxext.h>
47848b8605Smrg#include <string.h>
48848b8605Smrg#include <stdlib.h>
49848b8605Smrg#include <stdio.h>
50848b8605Smrg#ifdef _WIN32
51848b8605Smrg#include <stdint.h>
52848b8605Smrg#endif
53848b8605Smrg#include "GL/glxproto.h"
54848b8605Smrg#include "glxconfig.h"
55848b8605Smrg#include "glxhash.h"
56848b8605Smrg#if defined( HAVE_PTHREAD )
57848b8605Smrg# include <pthread.h>
58848b8605Smrg#endif
59848b8605Smrg
60848b8605Smrg#include "glxextensions.h"
61848b8605Smrg
62848b8605Smrg#define ARRAY_SIZE(a) (sizeof (a) / sizeof ((a)[0]))
63848b8605Smrg
64848b8605Smrg#define GLX_MAJOR_VERSION 1       /* current version numbers */
65848b8605Smrg#define GLX_MINOR_VERSION 4
66848b8605Smrg
67848b8605Smrg#define __GLX_MAX_TEXTURE_UNITS 32
68848b8605Smrg
69848b8605Smrgstruct glx_display;
70848b8605Smrgstruct glx_context;
71848b8605Smrg
72848b8605Smrg/************************************************************************/
73848b8605Smrg
74848b8605Smrg#ifdef GLX_DIRECT_RENDERING
75848b8605Smrg
76848b8605Smrgextern void DRI_glXUseXFont(struct glx_context *ctx,
77848b8605Smrg			    Font font, int first, int count, int listbase);
78848b8605Smrg
79848b8605Smrg#endif
80848b8605Smrg
81848b8605Smrg#if defined(GLX_DIRECT_RENDERING) && !defined(GLX_USE_APPLEGL)
82848b8605Smrg
83848b8605Smrg/**
84848b8605Smrg * Display dependent methods.  This structure is initialized during the
85848b8605Smrg * \c driCreateDisplay call.
86848b8605Smrg */
87848b8605Smrgtypedef struct __GLXDRIdisplayRec __GLXDRIdisplay;
88848b8605Smrgtypedef struct __GLXDRIscreenRec __GLXDRIscreen;
89848b8605Smrgtypedef struct __GLXDRIdrawableRec __GLXDRIdrawable;
90848b8605Smrg
91848b8605Smrgstruct __GLXDRIdisplayRec
92848b8605Smrg{
93848b8605Smrg    /**
94848b8605Smrg     * Method to destroy the private DRI display data.
95848b8605Smrg     */
96848b8605Smrg   void (*destroyDisplay) (__GLXDRIdisplay * display);
97848b8605Smrg
98848b8605Smrg   struct glx_screen *(*createScreen)(int screen, struct glx_display * priv);
99848b8605Smrg};
100848b8605Smrg
101848b8605Smrgstruct __GLXDRIscreenRec {
102848b8605Smrg
103848b8605Smrg   void (*destroyScreen)(struct glx_screen *psc);
104848b8605Smrg
105848b8605Smrg   struct glx_context *(*createContext)(struct glx_screen *psc,
106848b8605Smrg					struct glx_config *config,
107848b8605Smrg					struct glx_context *shareList,
108848b8605Smrg					int renderType);
109848b8605Smrg
110848b8605Smrg   __GLXDRIdrawable *(*createDrawable)(struct glx_screen *psc,
111848b8605Smrg				       XID drawable,
112848b8605Smrg				       GLXDrawable glxDrawable,
113848b8605Smrg				       struct glx_config *config);
114848b8605Smrg
115848b8605Smrg   int64_t (*swapBuffers)(__GLXDRIdrawable *pdraw, int64_t target_msc,
116848b8605Smrg			  int64_t divisor, int64_t remainder, Bool flush);
117848b8605Smrg   void (*copySubBuffer)(__GLXDRIdrawable *pdraw,
118848b8605Smrg			 int x, int y, int width, int height, Bool flush);
119848b8605Smrg   int (*getDrawableMSC)(struct glx_screen *psc, __GLXDRIdrawable *pdraw,
120848b8605Smrg			 int64_t *ust, int64_t *msc, int64_t *sbc);
121848b8605Smrg   int (*waitForMSC)(__GLXDRIdrawable *pdraw, int64_t target_msc,
122848b8605Smrg		     int64_t divisor, int64_t remainder, int64_t *ust,
123848b8605Smrg		     int64_t *msc, int64_t *sbc);
124848b8605Smrg   int (*waitForSBC)(__GLXDRIdrawable *pdraw, int64_t target_sbc, int64_t *ust,
125848b8605Smrg		     int64_t *msc, int64_t *sbc);
126848b8605Smrg   int (*setSwapInterval)(__GLXDRIdrawable *pdraw, int interval);
127848b8605Smrg   int (*getSwapInterval)(__GLXDRIdrawable *pdraw);
128848b8605Smrg   int (*getBufferAge)(__GLXDRIdrawable *pdraw);
129848b8605Smrg};
130848b8605Smrg
131848b8605Smrgstruct __GLXDRIdrawableRec
132848b8605Smrg{
133848b8605Smrg   void (*destroyDrawable) (__GLXDRIdrawable * drawable);
134848b8605Smrg
135848b8605Smrg   XID xDrawable;
136848b8605Smrg   XID drawable;
137848b8605Smrg   struct glx_screen *psc;
138848b8605Smrg   GLenum textureTarget;
139848b8605Smrg   GLenum textureFormat;        /* EXT_texture_from_pixmap support */
140848b8605Smrg   unsigned long eventMask;
141848b8605Smrg   int refcount;
142848b8605Smrg};
143848b8605Smrg
144848b8605Smrg/*
145848b8605Smrg** Function to create and DRI display data and initialize the display
146848b8605Smrg** dependent methods.
147848b8605Smrg*/
148848b8605Smrgextern __GLXDRIdisplay *driswCreateDisplay(Display * dpy);
149848b8605Smrgextern __GLXDRIdisplay *driCreateDisplay(Display * dpy);
150848b8605Smrgextern __GLXDRIdisplay *dri2CreateDisplay(Display * dpy);
151848b8605Smrgextern void dri2InvalidateBuffers(Display *dpy, XID drawable);
152848b8605Smrgextern unsigned dri2GetSwapEventType(Display *dpy, XID drawable);
153848b8605Smrg
154848b8605Smrgextern __GLXDRIdisplay *dri3_create_display(Display * dpy);
155848b8605Smrg
156848b8605Smrg/*
157848b8605Smrg** Functions to obtain driver configuration information from a direct
158848b8605Smrg** rendering client application
159848b8605Smrg*/
160848b8605Smrgextern const char *glXGetScreenDriver(Display * dpy, int scrNum);
161848b8605Smrg
162848b8605Smrgextern const char *glXGetDriverConfig(const char *driverName);
163848b8605Smrg
164848b8605Smrg#endif
165848b8605Smrg
166848b8605Smrg/************************************************************************/
167848b8605Smrg
168848b8605Smrg#define __GL_CLIENT_ATTRIB_STACK_DEPTH 16
169848b8605Smrg
170848b8605Smrgtypedef struct __GLXpixelStoreModeRec
171848b8605Smrg{
172848b8605Smrg   GLboolean swapEndian;
173848b8605Smrg   GLboolean lsbFirst;
174848b8605Smrg   GLuint rowLength;
175848b8605Smrg   GLuint imageHeight;
176848b8605Smrg   GLuint imageDepth;
177848b8605Smrg   GLuint skipRows;
178848b8605Smrg   GLuint skipPixels;
179848b8605Smrg   GLuint skipImages;
180848b8605Smrg   GLuint alignment;
181848b8605Smrg} __GLXpixelStoreMode;
182848b8605Smrg
183848b8605Smrg
184848b8605Smrgtypedef struct __GLXattributeRec
185848b8605Smrg{
186848b8605Smrg   GLuint mask;
187848b8605Smrg
188848b8605Smrg    /**
189848b8605Smrg     * Pixel storage state.  Most of the pixel store mode state is kept
190848b8605Smrg     * here and used by the client code to manage the packing and
191848b8605Smrg     * unpacking of data sent to/received from the server.
192848b8605Smrg     */
193848b8605Smrg   __GLXpixelStoreMode storePack, storeUnpack;
194848b8605Smrg
195848b8605Smrg    /**
196848b8605Smrg     * Is EXT_vertex_array / GL 1.1 DrawArrays protocol specifically
197848b8605Smrg     * disabled?
198848b8605Smrg     */
199848b8605Smrg   GLboolean NoDrawArraysProtocol;
200848b8605Smrg
201848b8605Smrg    /**
202848b8605Smrg     * Vertex Array storage state.  The vertex array component
203848b8605Smrg     * state is stored here and is used to manage the packing of
204848b8605Smrg     * DrawArrays data sent to the server.
205848b8605Smrg     */
206848b8605Smrg   struct array_state_vector *array_state;
207848b8605Smrg} __GLXattribute;
208848b8605Smrg
209848b8605Smrgtypedef struct __GLXattributeMachineRec
210848b8605Smrg{
211848b8605Smrg   __GLXattribute *stack[__GL_CLIENT_ATTRIB_STACK_DEPTH];
212848b8605Smrg   __GLXattribute **stackPointer;
213848b8605Smrg} __GLXattributeMachine;
214848b8605Smrg
215848b8605Smrgstruct glx_context_vtable {
216848b8605Smrg   void (*destroy)(struct glx_context *ctx);
217848b8605Smrg   int (*bind)(struct glx_context *context, struct glx_context *old,
218848b8605Smrg	       GLXDrawable draw, GLXDrawable read);
219848b8605Smrg   void (*unbind)(struct glx_context *context, struct glx_context *new_ctx);
220848b8605Smrg   void (*wait_gl)(struct glx_context *ctx);
221848b8605Smrg   void (*wait_x)(struct glx_context *ctx);
222848b8605Smrg   void (*use_x_font)(struct glx_context *ctx,
223848b8605Smrg		      Font font, int first, int count, int listBase);
224848b8605Smrg   void (*bind_tex_image)(Display * dpy,
225848b8605Smrg			  GLXDrawable drawable,
226848b8605Smrg			  int buffer, const int *attrib_list);
227848b8605Smrg   void (*release_tex_image)(Display * dpy, GLXDrawable drawable, int buffer);
228848b8605Smrg   void * (*get_proc_address)(const char *symbol);
229848b8605Smrg};
230848b8605Smrg
231848b8605Smrg/**
232848b8605Smrg * GLX state that needs to be kept on the client.  One of these records
233848b8605Smrg * exist for each context that has been made current by this client.
234848b8605Smrg */
235848b8605Smrgstruct glx_context
236848b8605Smrg{
237848b8605Smrg    /**
238848b8605Smrg     * \name Drawing command buffer.
239848b8605Smrg     *
240848b8605Smrg     * Drawing commands are packed into this buffer before being sent as a
241848b8605Smrg     * single GLX protocol request.  The buffer is sent when it overflows or
242848b8605Smrg     * is flushed by \c __glXFlushRenderBuffer.  \c pc is the next location
243848b8605Smrg     * in the buffer to be filled.  \c limit is described above in the buffer
244848b8605Smrg     * slop discussion.
245848b8605Smrg     *
246848b8605Smrg     * Commands that require large amounts of data to be transfered will
247848b8605Smrg     * also use this buffer to hold a header that describes the large
248848b8605Smrg     * command.
249848b8605Smrg     *
250848b8605Smrg     * These must be the first 6 fields since they are static initialized
251848b8605Smrg     * in the dummy context in glxext.c
252848b8605Smrg     */
253848b8605Smrg   /*@{ */
254848b8605Smrg   GLubyte *buf;
255848b8605Smrg   GLubyte *pc;
256848b8605Smrg   GLubyte *limit;
257848b8605Smrg   GLubyte *bufEnd;
258848b8605Smrg   GLint bufSize;
259848b8605Smrg   /*@} */
260848b8605Smrg
261848b8605Smrg   const struct glx_context_vtable *vtable;
262848b8605Smrg
263848b8605Smrg    /**
264848b8605Smrg     * The XID of this rendering context.  When the context is created a
265848b8605Smrg     * new XID is allocated.  This is set to None when the context is
266848b8605Smrg     * destroyed but is still current to some thread. In this case the
267848b8605Smrg     * context will be freed on next MakeCurrent.
268848b8605Smrg     */
269848b8605Smrg   XID xid;
270848b8605Smrg
271848b8605Smrg    /**
272848b8605Smrg     * The XID of the \c shareList context.
273848b8605Smrg     */
274848b8605Smrg   XID share_xid;
275848b8605Smrg
276848b8605Smrg    /**
277848b8605Smrg     * Screen number.
278848b8605Smrg     */
279848b8605Smrg   GLint screen;
280848b8605Smrg   struct glx_screen *psc;
281848b8605Smrg
282848b8605Smrg    /**
283848b8605Smrg     * \c GL_TRUE if the context was created with ImportContext, which
284848b8605Smrg     * means the server-side context was created by another X client.
285848b8605Smrg     */
286848b8605Smrg   GLboolean imported;
287848b8605Smrg
288848b8605Smrg    /**
289848b8605Smrg     * The context tag returned by MakeCurrent when this context is made
290848b8605Smrg     * current. This tag is used to identify the context that a thread has
291848b8605Smrg     * current so that proper server context management can be done.  It is
292848b8605Smrg     * used for all context specific commands (i.e., \c Render, \c RenderLarge,
293848b8605Smrg     * \c WaitX, \c WaitGL, \c UseXFont, and \c MakeCurrent (for the old
294848b8605Smrg     * context)).
295848b8605Smrg     */
296848b8605Smrg   GLXContextTag currentContextTag;
297848b8605Smrg
298848b8605Smrg    /**
299848b8605Smrg     * \name Rendering mode
300848b8605Smrg     *
301848b8605Smrg     * The rendering mode is kept on the client as well as the server.
302848b8605Smrg     * When \c glRenderMode is called, the buffer associated with the
303848b8605Smrg     * previous rendering mode (feedback or select) is filled.
304848b8605Smrg     */
305848b8605Smrg   /*@{ */
306848b8605Smrg   GLenum renderMode;
307848b8605Smrg   GLfloat *feedbackBuf;
308848b8605Smrg   GLuint *selectBuf;
309848b8605Smrg   /*@} */
310848b8605Smrg
311848b8605Smrg    /**
312848b8605Smrg     * Fill newImage with the unpacked form of \c oldImage getting it
313848b8605Smrg     * ready for transport to the server.
314848b8605Smrg     */
315848b8605Smrg   void (*fillImage) (struct glx_context *, GLint, GLint, GLint, GLint, GLenum,
316848b8605Smrg                      GLenum, const GLvoid *, GLubyte *, GLubyte *);
317848b8605Smrg
318848b8605Smrg    /**
319848b8605Smrg     * Client side attribs.
320848b8605Smrg     */
321848b8605Smrg   __GLXattributeMachine attributes;
322848b8605Smrg
323848b8605Smrg    /**
324848b8605Smrg     * Client side error code.  This is set when client side gl API
325848b8605Smrg     * routines need to set an error because of a bad enumerant or
326848b8605Smrg     * running out of memory, etc.
327848b8605Smrg     */
328848b8605Smrg   GLenum error;
329848b8605Smrg
330848b8605Smrg    /**
331848b8605Smrg     * Whether this context does direct rendering.
332848b8605Smrg     */
333848b8605Smrg   Bool isDirect;
334848b8605Smrg
335848b8605Smrg#if defined(GLX_DIRECT_RENDERING) && defined(GLX_USE_APPLEGL)
336848b8605Smrg   void *driContext;
337848b8605Smrg#endif
338848b8605Smrg
339848b8605Smrg    /**
340848b8605Smrg     * \c dpy of current display for this context.  Will be \c NULL if not
341848b8605Smrg     * current to any display, or if this is the "dummy context".
342848b8605Smrg     */
343848b8605Smrg   Display *currentDpy;
344848b8605Smrg
345848b8605Smrg    /**
346848b8605Smrg     * The current drawable for this context.  Will be None if this
347848b8605Smrg     * context is not current to any drawable.  currentReadable is below.
348848b8605Smrg     */
349848b8605Smrg   GLXDrawable currentDrawable;
350848b8605Smrg
351848b8605Smrg    /**
352848b8605Smrg     * \name GL Constant Strings
353848b8605Smrg     *
354848b8605Smrg     * Constant strings that describe the server implementation
355848b8605Smrg     * These pertain to GL attributes, not to be confused with
356848b8605Smrg     * GLX versioning attributes.
357848b8605Smrg     */
358848b8605Smrg   /*@{ */
359848b8605Smrg   GLubyte *vendor;
360848b8605Smrg   GLubyte *renderer;
361848b8605Smrg   GLubyte *version;
362848b8605Smrg   GLubyte *extensions;
363848b8605Smrg   /*@} */
364848b8605Smrg
365848b8605Smrg    /**
366848b8605Smrg     * Maximum small render command size.  This is the smaller of 64k and
367848b8605Smrg     * the size of the above buffer.
368848b8605Smrg     */
369848b8605Smrg   GLint maxSmallRenderCommandSize;
370848b8605Smrg
371848b8605Smrg    /**
372848b8605Smrg     * Major opcode for the extension.  Copied here so a lookup isn't
373848b8605Smrg     * needed.
374848b8605Smrg     */
375848b8605Smrg   GLint majorOpcode;
376848b8605Smrg
377848b8605Smrg    /**
378848b8605Smrg     * Pointer to the config used to create this context.
379848b8605Smrg     */
380848b8605Smrg   struct glx_config *config;
381848b8605Smrg
382848b8605Smrg    /**
383848b8605Smrg     * The current read-drawable for this context.  Will be None if this
384848b8605Smrg     * context is not current to any drawable.
385848b8605Smrg     *
386848b8605Smrg     * \since Internal API version 20030606.
387848b8605Smrg     */
388848b8605Smrg   GLXDrawable currentReadable;
389848b8605Smrg
390848b8605Smrg   /**
391848b8605Smrg    * Pointer to client-state data that is private to libGL.  This is only
392848b8605Smrg    * used for indirect rendering contexts.
393848b8605Smrg    *
394848b8605Smrg    * No internal API version change was made for this change.  Client-side
395848b8605Smrg    * drivers should NEVER use this data or even care that it exists.
396848b8605Smrg    */
397848b8605Smrg   void *client_state_private;
398848b8605Smrg
399848b8605Smrg   /**
400848b8605Smrg    * Stored value for \c glXQueryContext attribute \c GLX_RENDER_TYPE.
401848b8605Smrg    */
402848b8605Smrg   int renderType;
403848b8605Smrg
404848b8605Smrg   /**
405848b8605Smrg    * \name Raw server GL version
406848b8605Smrg    *
407848b8605Smrg    * True core GL version supported by the server.  This is the raw value
408848b8605Smrg    * returned by the server, and it may not reflect what is actually
409848b8605Smrg    * supported (or reported) by the client-side library.
410848b8605Smrg    */
411848b8605Smrg   /*@{ */
412848b8605Smrg   int server_major;        /**< Major version number. */
413848b8605Smrg   int server_minor;        /**< Minor version number. */
414848b8605Smrg   /*@} */
415848b8605Smrg
416848b8605Smrg   /**
417848b8605Smrg    * Number of threads we're currently current in.
418848b8605Smrg    */
419848b8605Smrg   unsigned long thread_refcount;
420848b8605Smrg
421848b8605Smrg   char gl_extension_bits[__GL_EXT_BYTES];
422848b8605Smrg};
423848b8605Smrg
424848b8605Smrgextern Bool
425848b8605Smrgglx_context_init(struct glx_context *gc,
426848b8605Smrg		 struct glx_screen *psc, struct glx_config *fbconfig);
427848b8605Smrg
428848b8605Smrg#define __glXSetError(gc,code)  \
429848b8605Smrg   if (!(gc)->error) {          \
430848b8605Smrg      (gc)->error = code;       \
431848b8605Smrg   }
432848b8605Smrg
433848b8605Smrgextern void __glFreeAttributeState(struct glx_context *);
434848b8605Smrg
435848b8605Smrg/************************************************************************/
436848b8605Smrg
437848b8605Smrg/**
438848b8605Smrg * The size of the largest drawing command known to the implementation
439848b8605Smrg * that will use the GLXRender GLX command.  In this case it is
440848b8605Smrg * \c glPolygonStipple.
441848b8605Smrg */
442848b8605Smrg#define __GLX_MAX_SMALL_RENDER_CMD_SIZE 156
443848b8605Smrg
444848b8605Smrg/**
445848b8605Smrg * To keep the implementation fast, the code uses a "limit" pointer
446848b8605Smrg * to determine when the drawing command buffer is too full to hold
447848b8605Smrg * another fixed size command.  This constant defines the amount of
448848b8605Smrg * space that must always be available in the drawing command buffer
449848b8605Smrg * at all times for the implementation to work.  It is important that
450848b8605Smrg * the number be just large enough, but not so large as to reduce the
451848b8605Smrg * efficacy of the buffer.  The "+32" is just to keep the code working
452848b8605Smrg * in case somebody counts wrong.
453848b8605Smrg */
454848b8605Smrg#define __GLX_BUFFER_LIMIT_SIZE (__GLX_MAX_SMALL_RENDER_CMD_SIZE + 32)
455848b8605Smrg
456848b8605Smrg/**
457848b8605Smrg * This implementation uses a smaller threshold for switching
458848b8605Smrg * to the RenderLarge protocol than the protcol requires so that
459848b8605Smrg * large copies don't occur.
460848b8605Smrg */
461848b8605Smrg#define __GLX_RENDER_CMD_SIZE_LIMIT 4096
462848b8605Smrg
463848b8605Smrg/**
464848b8605Smrg * One of these records exists per screen of the display.  It contains
465848b8605Smrg * a pointer to the config data for that screen (if the screen supports GL).
466848b8605Smrg */
467848b8605Smrgstruct glx_screen_vtable {
468848b8605Smrg   struct glx_context *(*create_context)(struct glx_screen *psc,
469848b8605Smrg					 struct glx_config *config,
470848b8605Smrg					 struct glx_context *shareList,
471848b8605Smrg					 int renderType);
472848b8605Smrg
473848b8605Smrg   struct glx_context *(*create_context_attribs)(struct glx_screen *psc,
474848b8605Smrg						 struct glx_config *config,
475848b8605Smrg						 struct glx_context *shareList,
476848b8605Smrg						 unsigned num_attrib,
477848b8605Smrg						 const uint32_t *attribs,
478848b8605Smrg						 unsigned *error);
479848b8605Smrg   int (*query_renderer_integer)(struct glx_screen *psc,
480848b8605Smrg                                 int attribute,
481848b8605Smrg                                 unsigned int *value);
482848b8605Smrg   int (*query_renderer_string)(struct glx_screen *psc,
483848b8605Smrg                                int attribute,
484848b8605Smrg                                const char **value);
485848b8605Smrg};
486848b8605Smrg
487848b8605Smrgstruct glx_screen
488848b8605Smrg{
489848b8605Smrg   const struct glx_screen_vtable *vtable;
490848b8605Smrg
491848b8605Smrg    /**
492848b8605Smrg     * GLX extension string reported by the X-server.
493848b8605Smrg     */
494848b8605Smrg   const char *serverGLXexts;
495848b8605Smrg
496848b8605Smrg    /**
497848b8605Smrg     * GLX extension string to be reported to applications.  This is the
498848b8605Smrg     * set of extensions that the application can actually use.
499848b8605Smrg     */
500848b8605Smrg   char *effectiveGLXexts;
501848b8605Smrg
502848b8605Smrg   struct glx_display *display;
503848b8605Smrg
504848b8605Smrg   Display *dpy;
505848b8605Smrg   int scr;
506848b8605Smrg
507848b8605Smrg#if defined(GLX_DIRECT_RENDERING) && !defined(GLX_USE_APPLEGL)
508848b8605Smrg    /**
509848b8605Smrg     * Per screen direct rendering interface functions and data.
510848b8605Smrg     */
511848b8605Smrg   __GLXDRIscreen *driScreen;
512848b8605Smrg#endif
513848b8605Smrg
514848b8605Smrg    /**
515848b8605Smrg     * Linked list of glx visuals and  fbconfigs for this screen.
516848b8605Smrg     */
517848b8605Smrg   struct glx_config *visuals, *configs;
518848b8605Smrg
519848b8605Smrg    /**
520848b8605Smrg     * Per-screen dynamic GLX extension tracking.  The \c direct_support
521848b8605Smrg     * field only contains enough bits for 64 extensions.  Should libGL
522848b8605Smrg     * ever need to track more than 64 GLX extensions, we can safely grow
523848b8605Smrg     * this field.  The \c struct glx_screen structure is not used outside
524848b8605Smrg     * libGL.
525848b8605Smrg     */
526848b8605Smrg   /*@{ */
527848b8605Smrg   unsigned char direct_support[8];
528848b8605Smrg   GLboolean ext_list_first_time;
529848b8605Smrg   /*@} */
530848b8605Smrg
531848b8605Smrg};
532848b8605Smrg
533848b8605Smrg/**
534848b8605Smrg * Per display private data.  One of these records exists for each display
535848b8605Smrg * that is using the OpenGL (GLX) extension.
536848b8605Smrg */
537848b8605Smrgstruct glx_display
538848b8605Smrg{
539848b8605Smrg   /* The extension protocol codes */
540848b8605Smrg   XExtCodes *codes;
541848b8605Smrg   struct glx_display *next;
542848b8605Smrg
543848b8605Smrg    /**
544848b8605Smrg     * Back pointer to the display
545848b8605Smrg     */
546848b8605Smrg   Display *dpy;
547848b8605Smrg
548848b8605Smrg    /**
549848b8605Smrg     * The \c majorOpcode is common to all connections to the same server.
550848b8605Smrg     * It is also copied into the context structure.
551848b8605Smrg     */
552848b8605Smrg   int majorOpcode;
553848b8605Smrg
554848b8605Smrg    /**
555848b8605Smrg     * \name Server Version
556848b8605Smrg     *
557848b8605Smrg     * Major and minor version returned by the server during initialization.
558848b8605Smrg     */
559848b8605Smrg   /*@{ */
560848b8605Smrg   int majorVersion, minorVersion;
561848b8605Smrg   /*@} */
562848b8605Smrg
563848b8605Smrg    /**
564848b8605Smrg     * \name Storage for the servers GLX vendor and versions strings.
565848b8605Smrg     *
566848b8605Smrg     * These are the same for all screens on this display. These fields will
567848b8605Smrg     * be filled in on demand.
568848b8605Smrg     */
569848b8605Smrg   /*@{ */
570848b8605Smrg   const char *serverGLXvendor;
571848b8605Smrg   const char *serverGLXversion;
572848b8605Smrg   /*@} */
573848b8605Smrg
574848b8605Smrg    /**
575848b8605Smrg     * Configurations of visuals for all screens on this display.
576848b8605Smrg     * Also, per screen data which now includes the server \c GLX_EXTENSION
577848b8605Smrg     * string.
578848b8605Smrg     */
579848b8605Smrg   struct glx_screen **screens;
580848b8605Smrg
581848b8605Smrg   __glxHashTable *glXDrawHash;
582848b8605Smrg
583848b8605Smrg#if defined(GLX_DIRECT_RENDERING) && !defined(GLX_USE_APPLEGL)
584848b8605Smrg   __glxHashTable *drawHash;
585848b8605Smrg
586848b8605Smrg    /**
587848b8605Smrg     * Per display direct rendering interface functions and data.
588848b8605Smrg     */
589848b8605Smrg   __GLXDRIdisplay *driswDisplay;
590848b8605Smrg   __GLXDRIdisplay *driDisplay;
591848b8605Smrg   __GLXDRIdisplay *dri2Display;
592848b8605Smrg   __GLXDRIdisplay *dri3Display;
593848b8605Smrg#endif
594848b8605Smrg};
595848b8605Smrg
596848b8605Smrgstruct glx_drawable {
597848b8605Smrg   XID xDrawable;
598848b8605Smrg   XID drawable;
599848b8605Smrg
600848b8605Smrg   uint32_t lastEventSbc;
601848b8605Smrg   int64_t eventSbcWrap;
602848b8605Smrg};
603848b8605Smrg
604848b8605Smrgextern int
605848b8605Smrgglx_screen_init(struct glx_screen *psc,
606848b8605Smrg		int screen, struct glx_display * priv);
607848b8605Smrgextern void
608848b8605Smrgglx_screen_cleanup(struct glx_screen *psc);
609848b8605Smrg
610848b8605Smrg#if defined(GLX_DIRECT_RENDERING) && !defined(GLX_USE_APPLEGL)
611848b8605Smrgextern __GLXDRIdrawable *
612848b8605Smrgdri2GetGlxDrawableFromXDrawableId(Display *dpy, XID id);
613848b8605Smrg#endif
614848b8605Smrg
615848b8605Smrgextern GLubyte *__glXFlushRenderBuffer(struct glx_context *, GLubyte *);
616848b8605Smrg
617848b8605Smrgextern void __glXSendLargeChunk(struct glx_context * gc, GLint requestNumber,
618848b8605Smrg                                GLint totalRequests,
619848b8605Smrg                                const GLvoid * data, GLint dataLen);
620848b8605Smrg
621848b8605Smrgextern void __glXSendLargeCommand(struct glx_context *, const GLvoid *, GLint,
622848b8605Smrg                                  const GLvoid *, GLint);
623848b8605Smrg
624848b8605Smrg/* Initialize the GLX extension for dpy */
625848b8605Smrgextern struct glx_display *__glXInitialize(Display *);
626848b8605Smrg
627848b8605Smrgextern void __glXPreferEGL(int state);
628848b8605Smrg
629848b8605Smrg/************************************************************************/
630848b8605Smrg
631848b8605Smrgextern int __glXDebug;
632848b8605Smrg
633848b8605Smrg/* This is per-thread storage in an MT environment */
634848b8605Smrg#if defined( HAVE_PTHREAD )
635848b8605Smrg
636848b8605Smrgextern void __glXSetCurrentContext(struct glx_context * c);
637848b8605Smrg
638848b8605Smrg# if defined( GLX_USE_TLS )
639848b8605Smrg
640848b8605Smrgextern __thread void *__glX_tls_Context
641848b8605Smrg   __attribute__ ((tls_model("initial-exec")));
642848b8605Smrg
643848b8605Smrg#  define __glXGetCurrentContext() __glX_tls_Context
644848b8605Smrg
645848b8605Smrg# else
646848b8605Smrg
647848b8605Smrgextern struct glx_context *__glXGetCurrentContext(void);
648848b8605Smrg
649848b8605Smrg# endif /* defined( GLX_USE_TLS ) */
650848b8605Smrg
651848b8605Smrg#else
652848b8605Smrg
653848b8605Smrgextern struct glx_context *__glXcurrentContext;
654848b8605Smrg#define __glXGetCurrentContext() __glXcurrentContext
655848b8605Smrg#define __glXSetCurrentContext(gc) __glXcurrentContext = gc
656848b8605Smrg
657848b8605Smrg#endif /* defined( HAVE_PTHREAD ) */
658848b8605Smrg
659848b8605Smrgextern void __glXSetCurrentContextNull(void);
660848b8605Smrg
661848b8605Smrg
662848b8605Smrg/*
663848b8605Smrg** Global lock for all threads in this address space using the GLX
664848b8605Smrg** extension
665848b8605Smrg*/
666848b8605Smrg#if defined( HAVE_PTHREAD )
667848b8605Smrgextern pthread_mutex_t __glXmutex;
668848b8605Smrg#define __glXLock()    pthread_mutex_lock(&__glXmutex)
669848b8605Smrg#define __glXUnlock()  pthread_mutex_unlock(&__glXmutex)
670848b8605Smrg#else
671848b8605Smrg#define __glXLock()
672848b8605Smrg#define __glXUnlock()
673848b8605Smrg#endif
674848b8605Smrg
675848b8605Smrg/*
676848b8605Smrg** Setup for a command.  Initialize the extension for dpy if necessary.
677848b8605Smrg*/
678848b8605Smrgextern CARD8 __glXSetupForCommand(Display * dpy);
679848b8605Smrg
680848b8605Smrg/************************************************************************/
681848b8605Smrg
682848b8605Smrg/*
683848b8605Smrg** Data conversion and packing support.
684848b8605Smrg*/
685848b8605Smrg
686848b8605Smrgextern const GLuint __glXDefaultPixelStore[9];
687848b8605Smrg
688848b8605Smrg/* Send an image to the server using RenderLarge. */
689848b8605Smrgextern void __glXSendLargeImage(struct glx_context * gc, GLint compsize, GLint dim,
690848b8605Smrg                                GLint width, GLint height, GLint depth,
691848b8605Smrg                                GLenum format, GLenum type,
692848b8605Smrg                                const GLvoid * src, GLubyte * pc,
693848b8605Smrg                                GLubyte * modes);
694848b8605Smrg
695848b8605Smrg/* Return the size, in bytes, of some pixel data */
696848b8605Smrgextern GLint __glImageSize(GLint, GLint, GLint, GLenum, GLenum, GLenum);
697848b8605Smrg
698848b8605Smrg/* Return the number of elements per group of a specified format*/
699848b8605Smrgextern GLint __glElementsPerGroup(GLenum format, GLenum type);
700848b8605Smrg
701848b8605Smrg/* Return the number of bytes per element, based on the element type (other
702848b8605Smrg** than GL_BITMAP).
703848b8605Smrg*/
704848b8605Smrgextern GLint __glBytesPerElement(GLenum type);
705848b8605Smrg
706848b8605Smrg/*
707848b8605Smrg** Fill the transport buffer with the data from the users buffer,
708848b8605Smrg** applying some of the pixel store modes (unpack modes) to the data
709848b8605Smrg** first.  As a side effect of this call, the "modes" field is
710848b8605Smrg** updated to contain the modes needed by the server to decode the
711848b8605Smrg** sent data.
712848b8605Smrg*/
713848b8605Smrgextern void __glFillImage(struct glx_context *, GLint, GLint, GLint, GLint, GLenum,
714848b8605Smrg                          GLenum, const GLvoid *, GLubyte *, GLubyte *);
715848b8605Smrg
716848b8605Smrg/* Copy map data with a stride into a packed buffer */
717848b8605Smrgextern void __glFillMap1f(GLint, GLint, GLint, const GLfloat *, GLubyte *);
718848b8605Smrgextern void __glFillMap1d(GLint, GLint, GLint, const GLdouble *, GLubyte *);
719848b8605Smrgextern void __glFillMap2f(GLint, GLint, GLint, GLint, GLint,
720848b8605Smrg                          const GLfloat *, GLfloat *);
721848b8605Smrgextern void __glFillMap2d(GLint, GLint, GLint, GLint, GLint,
722848b8605Smrg                          const GLdouble *, GLdouble *);
723848b8605Smrg
724848b8605Smrg/*
725848b8605Smrg** Empty an image out of the reply buffer into the clients memory applying
726848b8605Smrg** the pack modes to pack back into the clients requested format.
727848b8605Smrg*/
728848b8605Smrgextern void __glEmptyImage(struct glx_context *, GLint, GLint, GLint, GLint, GLenum,
729848b8605Smrg                           GLenum, const GLubyte *, GLvoid *);
730848b8605Smrg
731848b8605Smrg
732848b8605Smrg/*
733848b8605Smrg** Allocate and Initialize Vertex Array client state, and free.
734848b8605Smrg*/
735848b8605Smrgextern void __glXInitVertexArrayState(struct glx_context *);
736848b8605Smrgextern void __glXFreeVertexArrayState(struct glx_context *);
737848b8605Smrg
738848b8605Smrg/*
739848b8605Smrg** Inform the Server of the major and minor numbers and of the client
740848b8605Smrg** libraries extension string.
741848b8605Smrg*/
742848b8605Smrgextern void __glXClientInfo(Display * dpy, int opcode);
743848b8605Smrg
744848b8605Smrg_X_HIDDEN void
745848b8605Smrg__glX_send_client_info(struct glx_display *glx_dpy);
746848b8605Smrg
747848b8605Smrg/************************************************************************/
748848b8605Smrg
749848b8605Smrg/*
750848b8605Smrg** Declarations that should be in Xlib
751848b8605Smrg*/
752848b8605Smrg#ifdef __GL_USE_OUR_PROTOTYPES
753848b8605Smrgextern void _XFlush(Display *);
754848b8605Smrgextern Status _XReply(Display *, xReply *, int, Bool);
755848b8605Smrgextern void _XRead(Display *, void *, long);
756848b8605Smrgextern void _XSend(Display *, const void *, long);
757848b8605Smrg#endif
758848b8605Smrg
759848b8605Smrg
760848b8605Smrgextern void __glXInitializeVisualConfigFromTags(struct glx_config * config,
761848b8605Smrg                                                int count, const INT32 * bp,
762848b8605Smrg                                                Bool tagged_only,
763848b8605Smrg                                                Bool fbconfig_style_tags);
764848b8605Smrg
765848b8605Smrgextern char *__glXQueryServerString(Display * dpy, int opcode,
766848b8605Smrg                                    CARD32 screen, CARD32 name);
767848b8605Smrgextern char *__glXGetString(Display * dpy, int opcode,
768848b8605Smrg                            CARD32 screen, CARD32 name);
769848b8605Smrg
770848b8605Smrgextern char *__glXstrdup(const char *str);
771848b8605Smrg
772848b8605Smrg
773848b8605Smrgextern const char __glXGLClientVersion[];
774848b8605Smrgextern const char __glXGLClientExtensions[];
775848b8605Smrg
776848b8605Smrg/* Get the unadjusted system time */
777848b8605Smrgextern int __glXGetUST(int64_t * ust);
778848b8605Smrg
779848b8605Smrgextern GLboolean __glXGetMscRateOML(Display * dpy, GLXDrawable drawable,
780848b8605Smrg                                    int32_t * numerator,
781848b8605Smrg                                    int32_t * denominator);
782848b8605Smrg
783848b8605Smrg#if defined(GLX_DIRECT_RENDERING) && !defined(GLX_USE_APPLEGL)
784848b8605Smrgextern GLboolean
785848b8605Smrg__glxGetMscRate(struct glx_screen *psc,
786848b8605Smrg		int32_t * numerator, int32_t * denominator);
787848b8605Smrg
788848b8605Smrg/* So that dri2.c:DRI2WireToEvent() can access
789848b8605Smrg * glx_info->codes->first_event */
790848b8605SmrgXExtDisplayInfo *__glXFindDisplay (Display *dpy);
791848b8605Smrg
792848b8605Smrgextern void
793848b8605SmrgGarbageCollectDRIDrawables(struct glx_screen *psc);
794848b8605Smrg
795848b8605Smrgextern __GLXDRIdrawable *
796848b8605SmrgGetGLXDRIDrawable(Display *dpy, GLXDrawable drawable);
797848b8605Smrg#endif
798848b8605Smrg
799848b8605Smrgextern struct glx_screen *GetGLXScreenConfigs(Display * dpy, int scrn);
800848b8605Smrg
801848b8605Smrg#ifdef GLX_USE_APPLEGL
802848b8605Smrgextern struct glx_screen *
803848b8605Smrgapplegl_create_screen(int screen, struct glx_display * priv);
804848b8605Smrg
805848b8605Smrgextern struct glx_context *
806848b8605Smrgapplegl_create_context(struct glx_screen *psc,
807848b8605Smrg			struct glx_config *mode,
808848b8605Smrg			struct glx_context *shareList, int renderType);
809848b8605Smrg
810848b8605Smrgextern int
811848b8605Smrgapplegl_create_display(struct glx_display *display);
812848b8605Smrg#endif
813848b8605Smrg
814848b8605Smrgextern Bool validate_renderType_against_config(const struct glx_config *config,
815848b8605Smrg                                               int renderType);
816848b8605Smrg
817848b8605Smrg
818848b8605Smrgextern struct glx_drawable *GetGLXDrawable(Display *dpy, GLXDrawable drawable);
819848b8605Smrgextern int InitGLXDrawable(Display *dpy, struct glx_drawable *glxDraw,
820848b8605Smrg			   XID xDrawable, GLXDrawable drawable);
821848b8605Smrgextern void DestroyGLXDrawable(Display *dpy, GLXDrawable drawable);
822848b8605Smrg
823848b8605Smrgextern struct glx_context dummyContext;
824848b8605Smrg
825848b8605Smrgextern struct glx_screen *
826848b8605Smrgindirect_create_screen(int screen, struct glx_display * priv);
827848b8605Smrgextern struct glx_context *
828848b8605Smrgindirect_create_context(struct glx_screen *psc,
829848b8605Smrg			struct glx_config *mode,
830848b8605Smrg			struct glx_context *shareList, int renderType);
831848b8605Smrgextern struct glx_context *
832848b8605Smrgindirect_create_context_attribs(struct glx_screen *base,
833848b8605Smrg                                struct glx_config *config_base,
834848b8605Smrg                                struct glx_context *shareList,
835848b8605Smrg                                unsigned num_attribs,
836848b8605Smrg                                const uint32_t *attribs,
837848b8605Smrg                                unsigned *error);
838848b8605Smrg
839848b8605Smrg#endif /* !__GLX_client_h__ */
840