xmesaP.h revision 848b8605
1/*
2 * Mesa 3-D graphics library
3 *
4 * Copyright (C) 1999-2007  Brian Paul   All Rights Reserved.
5 *
6 * Permission is hereby granted, free of charge, to any person obtaining a
7 * copy of this software and associated documentation files (the "Software"),
8 * to deal in the Software without restriction, including without limitation
9 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
10 * and/or sell copies of the Software, and to permit persons to whom the
11 * Software is furnished to do so, subject to the following conditions:
12 *
13 * The above copyright notice and this permission notice shall be included
14 * in all copies or substantial portions of the Software.
15 *
16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
17 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
19 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
20 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
21 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
22 * OTHER DEALINGS IN THE SOFTWARE.
23 */
24
25
26#ifndef XMESAP_H
27#define XMESAP_H
28
29
30#include "c11/threads.h"
31#include "xmesa.h"
32#include "main/mtypes.h"
33#include "swrast/s_context.h"
34
35
36extern mtx_t _xmesa_lock;
37
38extern XMesaBuffer XMesaBufferList;
39
40/* for PF_8R8G8B24 pixel format */
41typedef struct {
42   GLubyte b;
43   GLubyte g;
44   GLubyte r;
45} bgr_t;
46
47
48struct xmesa_renderbuffer;
49
50
51/* Function pointer for clearing color buffers */
52typedef void (*ClearFunc)( struct gl_context *ctx, struct xmesa_renderbuffer *xrb,
53                           GLint x, GLint y, GLint width, GLint height );
54
55
56
57
58/** Framebuffer pixel formats */
59enum pixel_format {
60   PF_Truecolor,	/**< TrueColor or DirectColor, any depth */
61   PF_Dither_True,	/**< TrueColor with dithering */
62   PF_8A8R8G8B,		/**< 32-bit TrueColor:  8-A, 8-R, 8-G, 8-B bits */
63   PF_8A8B8G8R,		/**< 32-bit TrueColor:  8-A, 8-B, 8-G, 8-R bits */
64   PF_8R8G8B,		/**< 32-bit TrueColor:  8-R, 8-G, 8-B bits */
65   PF_8R8G8B24,		/**< 24-bit TrueColor:  8-R, 8-G, 8-B bits */
66   PF_5R6G5B,		/**< 16-bit TrueColor:  5-R, 6-G, 5-B bits */
67   PF_Dither_5R6G5B	/**< 16-bit dithered TrueColor: 5-R, 6-G, 5-B */
68};
69
70
71/**
72 * Visual inforation, derived from struct gl_config.
73 * Basically corresponds to an XVisualInfo.
74 */
75struct xmesa_visual {
76   struct gl_config mesa_visual;	/* Device independent visual parameters */
77   XMesaDisplay *display;	/* The X11 display */
78   int screen, visualID;
79   int visualType;
80   XMesaVisualInfo visinfo;	/* X's visual info (pointer to private copy) */
81   XVisualInfo *vishandle;	/* Only used in fakeglx.c */
82   GLint BitsPerPixel;		/* True bits per pixel for XImages */
83
84   GLboolean ximage_flag;	/* Use XImage for back buffer (not pixmap)? */
85
86   enum pixel_format dithered_pf;  /* Pixel format when dithering */
87   enum pixel_format undithered_pf;/* Pixel format when not dithering */
88
89   GLfloat RedGamma;		/* Gamma values, 1.0 is default */
90   GLfloat GreenGamma;
91   GLfloat BlueGamma;
92
93   /* For PF_TRUECOLOR */
94   GLint rshift, gshift, bshift;/* Pixel color component shifts */
95   GLubyte Kernel[16];		/* Dither kernel */
96   unsigned long RtoPixel[512];	/* RGB to pixel conversion */
97   unsigned long GtoPixel[512];
98   unsigned long BtoPixel[512];
99   GLubyte PixelToR[256];	/* Pixel to RGB conversion */
100   GLubyte PixelToG[256];
101   GLubyte PixelToB[256];
102};
103
104
105/**
106 * Context info, derived from struct gl_context.
107 * Basically corresponds to a GLXContext.
108 */
109struct xmesa_context {
110   struct gl_context mesa;		/* the core library context (containment) */
111   XMesaVisual xm_visual;	/* Describes the buffers */
112   XMesaBuffer xm_buffer;	/* current span/point/line/triangle buffer */
113
114   XMesaDisplay *display;	/* == xm_visual->display */
115   GLboolean swapbytes;		/* Host byte order != display byte order? */
116   GLboolean direct;		/* Direct rendering context? */
117
118   enum pixel_format pixelformat;
119
120   GLubyte clearcolor[4];		/* current clearing color */
121   unsigned long clearpixel;		/* current clearing pixel value */
122};
123
124
125/**
126 * Types of X/GLX drawables we might render into.
127 */
128typedef enum {
129   WINDOW,          /* An X window */
130   GLXWINDOW,       /* GLX window */
131   PIXMAP,          /* GLX pixmap */
132   PBUFFER          /* GLX Pbuffer */
133} BufferType;
134
135
136/** Values for db_mode: */
137/*@{*/
138#define BACK_PIXMAP	1
139#define BACK_XIMAGE	2
140/*@}*/
141
142
143/**
144 * An xmesa_renderbuffer represents the back or front color buffer.
145 * For the front color buffer:
146 *    <drawable> is the X window
147 * For the back color buffer:
148 *    Either <ximage> or <pixmap> will be used, never both.
149 * In any case, <drawable> always equals <pixmap>.
150 * For stand-alone Mesa, we could merge <drawable> and <pixmap> into one
151 * field.  We don't do that for the server-side GLcore module because
152 * pixmaps and drawables are different and we'd need a bunch of casts.
153 */
154struct xmesa_renderbuffer
155{
156   struct swrast_renderbuffer Base;  /* Base class */
157
158   XMesaBuffer Parent;  /**< The XMesaBuffer this renderbuffer belongs to */
159   XMesaDrawable drawable;	/* Usually the X window ID */
160   XMesaPixmap pixmap;	/* Back color buffer */
161   XMesaImage *ximage;	/* The back buffer, if not using a Pixmap */
162
163   GLushort *origin2;	/* used for PIXEL_ADDR2 macro */
164   GLint width2;
165   GLubyte *origin3;	/* used for PIXEL_ADDR3 macro */
166   GLint width3;
167   GLuint *origin4;	/* used for PIXEL_ADDR4 macro */
168   GLint width4;
169
170   GLint bottom;	/* used for FLIP macro, equals height - 1 */
171
172   ClearFunc clearFunc;
173
174   GLuint map_x, map_y, map_w, map_h;
175   GLbitfield map_mode;
176   XMesaImage *map_ximage;
177};
178
179
180/**
181 * Framebuffer information, derived from.
182 * Basically corresponds to a GLXDrawable.
183 */
184struct xmesa_buffer {
185   struct gl_framebuffer mesa_buffer;	/* depth, stencil, accum, etc buffers */
186				/* This MUST BE FIRST! */
187   GLboolean wasCurrent;	/* was ever the current buffer? */
188   XMesaVisual xm_visual;	/* the X/Mesa visual */
189
190   XMesaDisplay *display;
191   BufferType type;             /* window, pixmap, pbuffer or glxwindow */
192
193   GLboolean largestPbuffer;    /**< for pbuffers */
194   GLboolean preservedContents; /**< for pbuffers */
195
196   struct xmesa_renderbuffer *frontxrb; /* front color renderbuffer */
197   struct xmesa_renderbuffer *backxrb;  /* back color renderbuffer */
198
199   XMesaColormap cmap;		/* the X colormap */
200
201   unsigned long selectedEvents;/* for pbuffers only */
202
203   GLint db_mode;		/* 0 = single buffered */
204				/* BACK_PIXMAP = use Pixmap for back buffer */
205				/* BACK_XIMAGE = use XImage for back buffer */
206   GLuint shm;			/* X Shared Memory extension status:	*/
207				/*    0 = not available			*/
208				/*    1 = XImage support available	*/
209				/*    2 = Pixmap support available too	*/
210#if defined(USE_XSHM)
211   XShmSegmentInfo shminfo;
212#endif
213
214   //   XMesaImage *rowimage;	/* Used for optimized span writing */
215   XMesaPixmap stipple_pixmap;	/* For polygon stippling */
216   XMesaGC stipple_gc;		/* For polygon stippling */
217
218   XMesaGC gc;			/* scratch GC for span, line, tri drawing */
219   XMesaGC cleargc;		/* GC for clearing the color buffer */
220   XMesaGC swapgc;		/* GC for swapping the color buffers */
221
222   /* The following are here instead of in the XMesaVisual
223    * because they depend on the window's colormap.
224    */
225
226   /* For PF_DITHER, PF_LOOKUP, PF_GRAYSCALE */
227   unsigned long color_table[576];	/* RGB -> pixel value */
228
229   /* For PF_DITHER, PF_LOOKUP, PF_GRAYSCALE */
230   GLubyte pixel_to_r[65536];		/* pixel value -> red */
231   GLubyte pixel_to_g[65536];		/* pixel value -> green */
232   GLubyte pixel_to_b[65536];		/* pixel value -> blue */
233
234   /* Used to do XAllocColor/XFreeColors accounting: */
235   int num_alloced;
236   unsigned long alloced_colors[256];
237
238   /* GLX_EXT_texture_from_pixmap */
239   GLint TextureTarget; /** GLX_TEXTURE_1D_EXT, for example */
240   GLint TextureFormat; /** GLX_TEXTURE_FORMAT_RGB_EXT, for example */
241   GLint TextureMipmap; /** 0 or 1 */
242
243   struct xmesa_buffer *Next;	/* Linked list pointer: */
244};
245
246
247/**
248 * If pixelformat==PF_TRUECOLOR:
249 */
250#define PACK_TRUECOLOR( PIXEL, R, G, B )	\
251   PIXEL = xmesa->xm_visual->RtoPixel[R]	\
252         | xmesa->xm_visual->GtoPixel[G]	\
253         | xmesa->xm_visual->BtoPixel[B];	\
254
255
256/**
257 * If pixelformat==PF_TRUEDITHER:
258 */
259#define PACK_TRUEDITHER( PIXEL, X, Y, R, G, B )			\
260{								\
261   int d = xmesa->xm_visual->Kernel[((X)&3) | (((Y)&3)<<2)];	\
262   PIXEL = xmesa->xm_visual->RtoPixel[(R)+d]			\
263         | xmesa->xm_visual->GtoPixel[(G)+d]			\
264         | xmesa->xm_visual->BtoPixel[(B)+d];			\
265}
266
267
268
269/**
270 * If pixelformat==PF_8A8B8G8R:
271 */
272#define PACK_8A8B8G8R( R, G, B, A )	\
273	( ((A) << 24) | ((B) << 16) | ((G) << 8) | (R) )
274
275
276/**
277 * Like PACK_8A8B8G8R() but don't use alpha.  This is usually an acceptable
278 * shortcut.
279 */
280#define PACK_8B8G8R( R, G, B )   ( ((B) << 16) | ((G) << 8) | (R) )
281
282
283
284/**
285 * If pixelformat==PF_8R8G8B:
286 */
287#define PACK_8R8G8B( R, G, B)	 ( ((R) << 16) | ((G) << 8) | (B) )
288
289
290/**
291 * If pixelformat==PF_5R6G5B:
292 */
293#define PACK_5R6G5B( R, G, B)	 ( (((R) & 0xf8) << 8) | (((G) & 0xfc) << 3) | ((B) >> 3) )
294
295
296/**
297 * If pixelformat==PF_8A8R8G8B:
298 */
299#define PACK_8A8R8G8B( R, G, B, A )	\
300	( ((A) << 24) | ((R) << 16) | ((G) << 8) | (B) )
301
302
303
304
305/**
306 * Converts a GL window Y coord to an X window Y coord:
307 */
308#define YFLIP(XRB, Y)  ((XRB)->bottom - (Y))
309
310
311/**
312 * Return the address of a 2, 3 or 4-byte pixel in the buffer's XImage:
313 * X==0 is left, Y==0 is bottom.
314 */
315#define PIXEL_ADDR2(XRB, X, Y)  \
316   ( (XRB)->origin2 - (Y) * (XRB)->width2 + (X) )
317
318#define PIXEL_ADDR3(XRB, X, Y)  \
319   ( (bgr_t *) ( (XRB)->origin3 - (Y) * (XRB)->width3 + 3 * (X) ))
320
321#define PIXEL_ADDR4(XRB, X, Y)  \
322   ( (XRB)->origin4 - (Y) * (XRB)->width4 + (X) )
323
324
325
326/*
327 * External functions:
328 */
329
330extern struct xmesa_renderbuffer *
331xmesa_new_renderbuffer(struct gl_context *ctx, GLuint name,
332                       const struct xmesa_visual *xmvis,
333                       GLboolean backBuffer);
334
335extern void
336xmesa_delete_framebuffer(struct gl_framebuffer *fb);
337
338extern XMesaBuffer
339xmesa_find_buffer(XMesaDisplay *dpy, XMesaColormap cmap, XMesaBuffer notThis);
340
341extern unsigned long
342xmesa_color_to_pixel( struct gl_context *ctx,
343                      GLubyte r, GLubyte g, GLubyte b, GLubyte a,
344                      GLuint pixelFormat );
345
346extern void
347xmesa_get_window_size(XMesaDisplay *dpy, XMesaBuffer b,
348                      GLuint *width, GLuint *height);
349
350extern void
351xmesa_check_and_update_buffer_size(XMesaContext xmctx, XMesaBuffer drawBuffer);
352
353extern void
354xmesa_init_driver_functions( XMesaVisual xmvisual,
355                             struct dd_function_table *driver );
356
357extern void
358xmesa_update_state( struct gl_context *ctx, GLbitfield new_state );
359
360
361extern void
362xmesa_MapRenderbuffer(struct gl_context *ctx,
363                      struct gl_renderbuffer *rb,
364                      GLuint x, GLuint y, GLuint w, GLuint h,
365                      GLbitfield mode,
366                      GLubyte **mapOut, GLint *rowStrideOut);
367
368extern void
369xmesa_UnmapRenderbuffer(struct gl_context *ctx, struct gl_renderbuffer *rb);
370
371extern void
372xmesa_destroy_buffers_on_display(XMesaDisplay *dpy);
373
374
375/**
376 * Using a function instead of an ordinary cast is safer.
377 */
378static INLINE struct xmesa_renderbuffer *
379xmesa_renderbuffer(struct gl_renderbuffer *rb)
380{
381   return (struct xmesa_renderbuffer *) rb;
382}
383
384
385/**
386 * Return pointer to XMesaContext corresponding to a Mesa struct gl_context.
387 * Since we're using structure containment, it's just a cast!.
388 */
389static INLINE XMesaContext
390XMESA_CONTEXT(struct gl_context *ctx)
391{
392   return (XMesaContext) ctx;
393}
394
395
396/**
397 * Return pointer to XMesaBuffer corresponding to a Mesa struct gl_framebuffer.
398 * Since we're using structure containment, it's just a cast!.
399 */
400static INLINE XMesaBuffer
401XMESA_BUFFER(struct gl_framebuffer *b)
402{
403   return (XMesaBuffer) b;
404}
405
406
407/* Plugged into the software rasterizer.  Try to use internal
408 * swrast-style point, line and triangle functions.
409 */
410extern void xmesa_choose_point( struct gl_context *ctx );
411extern void xmesa_choose_line( struct gl_context *ctx );
412extern void xmesa_choose_triangle( struct gl_context *ctx );
413
414
415extern void xmesa_register_swrast_functions( struct gl_context *ctx );
416
417
418
419#if   defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L
420#define ENABLE_EXT_timer_query 1 /* should have 64-bit GLuint64EXT */
421#else
422#define ENABLE_EXT_timer_query 0 /* may not have 64-bit GLuint64EXT */
423#endif
424
425
426#define TEST_META_FUNCS 0
427
428
429#endif
430