osmesa.c revision 709892459922a32096fe9dd8261d0d92337bb02f
1709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell/* $Id: osmesa.c,v 1.51 2001/03/19 02:25:35 keithw Exp $ */
2afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
3afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/*
4afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Mesa 3-D graphics library
574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul * Version:  3.5
6dbd1e2b5990a3689bf718296c57c14fc3ba38db5Jouk Jansen *
774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul * Copyright (C) 1999-2001  Brian Paul   All Rights Reserved.
8dbd1e2b5990a3689bf718296c57c14fc3ba38db5Jouk Jansen *
9afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Permission is hereby granted, free of charge, to any person obtaining a
10afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * copy of this software and associated documentation files (the "Software"),
11afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * to deal in the Software without restriction, including without limitation
12afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * the rights to use, copy, modify, merge, publish, distribute, sublicense,
13afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * and/or sell copies of the Software, and to permit persons to whom the
14afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Software is furnished to do so, subject to the following conditions:
15dbd1e2b5990a3689bf718296c57c14fc3ba38db5Jouk Jansen *
16afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * The above copyright notice and this permission notice shall be included
17afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * in all copies or substantial portions of the Software.
18dbd1e2b5990a3689bf718296c57c14fc3ba38db5Jouk Jansen *
19afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
20afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
21afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
22afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
23afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
24afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
25afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */
26afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
27afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
28afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/*
29afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Off-Screen Mesa rendering / Rendering into client memory space
30d3c070ca6a36daa765b1ad7f44e03e6671ad0490Brian Paul *
31d3c070ca6a36daa765b1ad7f44e03e6671ad0490Brian Paul * Note on thread safety:  this driver is thread safe.  All
32d3c070ca6a36daa765b1ad7f44e03e6671ad0490Brian Paul * functions are reentrant.  The notion of current context is
33b1394fa92aaaf859ce9efc8b5fc194397921320cBrian Paul * managed by the core _mesa_make_current() and _mesa_get_current_context()
34d3c070ca6a36daa765b1ad7f44e03e6671ad0490Brian Paul * functions.  Those functions are thread-safe.
35afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */
36afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
37afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
38eed6f691991ed0d64752fa712c83f67eb700b9adBrian Paul#include "glheader.h"
39afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#include "GL/osmesa.h"
40afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#include "context.h"
4174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul#include "colormac.h"
42afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#include "depth.h"
438e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul#include "extensions.h"
44ebb248aa5c018dc676d389221d76ed329059789eBrian Paul#include "macros.h"
45afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#include "matrix.h"
468e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul#include "mem.h"
473041d05bbcccfddba01a1eeaba01e5da0e1e99afBrian Paul#include "mmath.h"
48dbd1e2b5990a3689bf718296c57c14fc3ba38db5Jouk Jansen#include "mtypes.h"
498e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul#include "texstore.h"
508e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul#include "array_cache/acache.h"
511e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell#include "swrast/swrast.h"
521e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell#include "swrast_setup/swrast_setup.h"
531e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell#include "swrast/s_context.h"
54724abeb058ca9372c5a9b9e38ee43dde1accaa41Keith Whitwell#include "swrast/s_depth.h"
551e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell#include "swrast/s_lines.h"
561e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell#include "swrast/s_triangle.h"
575a9026c65d260dc185e072163999f5d810015108Brian Paul#include "tnl/tnl.h"
58709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell#include "tnl/t_context.h"
59afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
60724abeb058ca9372c5a9b9e38ee43dde1accaa41Keith Whitwell
61724abeb058ca9372c5a9b9e38ee43dde1accaa41Keith Whitwell
62304357dcd496f7ebf499fd9c77b4eba83a75abd5Brian Paul/*
63304357dcd496f7ebf499fd9c77b4eba83a75abd5Brian Paul * This is the OS/Mesa context struct.
64304357dcd496f7ebf499fd9c77b4eba83a75abd5Brian Paul * Notice how it includes a GLcontext.  By doing this we're mimicking
65304357dcd496f7ebf499fd9c77b4eba83a75abd5Brian Paul * C++ inheritance/derivation.
66304357dcd496f7ebf499fd9c77b4eba83a75abd5Brian Paul * Later, we can cast a GLcontext pointer into an OSMesaContext pointer
67304357dcd496f7ebf499fd9c77b4eba83a75abd5Brian Paul * or vice versa.
68304357dcd496f7ebf499fd9c77b4eba83a75abd5Brian Paul */
69afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgstruct osmesa_context {
70304357dcd496f7ebf499fd9c77b4eba83a75abd5Brian Paul   GLcontext gl_ctx;		/* The core GL/Mesa context */
71afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLvisual *gl_visual;		/* Describes the buffers */
72afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLframebuffer *gl_buffer;	/* Depth, stencil, accum, etc buffers */
73afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLenum format;		/* either GL_RGBA or GL_COLOR_INDEX */
74afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   void *buffer;		/* the image buffer */
75afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLint width, height;		/* size of image buffer */
76afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLint rowlength;		/* number of pixels per row */
77afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLint userRowLength;		/* user-specified number of pixels per row */
78afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLint rshift, gshift;	/* bit shifts for RGBA formats */
79afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLint bshift, ashift;
8074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   GLint rInd, gInd, bInd, aInd;/* index offsets for RGBA formats */
8174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   GLchan *rowaddr[MAX_HEIGHT];	/* address of first pixel in each image row */
82afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLboolean yup;		/* TRUE  -> Y increases upward */
83afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg				/* FALSE -> Y increases downward */
84afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg};
85afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
86afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
87afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
88afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/* A forward declaration: */
89cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwellstatic void osmesa_update_state( GLcontext *ctx, GLuint newstate );
901e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwellstatic void osmesa_register_swrast_functions( GLcontext *ctx );
91afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
92afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
93afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
94c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul#define OSMESA_CONTEXT(ctx)  ((OSMesaContext) (ctx->DriverCtx))
95c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul
96c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul
97c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul
98afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/**********************************************************************/
99afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/*****                    Public Functions                        *****/
100afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/**********************************************************************/
101afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
102afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
103afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/*
104afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Create an Off-Screen Mesa rendering context.  The only attribute needed is
105afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * an RGBA vs Color-Index mode flag.
106afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg *
107afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Input:  format - either GL_RGBA or GL_COLOR_INDEX
108afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg *         sharelist - specifies another OSMesaContext with which to share
109afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg *                     display lists.  NULL indicates no sharing.
110afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Return:  an OSMesaContext or 0 if error
111afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */
112d3c070ca6a36daa765b1ad7f44e03e6671ad0490Brian PaulOSMesaContext GLAPIENTRY
113d3c070ca6a36daa765b1ad7f44e03e6671ad0490Brian PaulOSMesaCreateContext( GLenum format, OSMesaContext sharelist )
114afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
1152bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul   return OSMesaCreateContextExt(format, DEFAULT_SOFTWARE_DEPTH_BITS,
1162bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul                                 8, 16, sharelist);
1172bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul}
1182bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul
1192bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul
1202bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul
1212bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul/*
1222bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul * New in Mesa 3.5
1232bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul *
1242bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul * Create context and specify size of ancillary buffers.
1252bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul */
1262bf5d9470d3232763cb49b5589209940d4d5398dBrian PaulOSMesaContext GLAPIENTRY
1272bf5d9470d3232763cb49b5589209940d4d5398dBrian PaulOSMesaCreateContextExt( GLenum format, GLint depthBits, GLint stencilBits,
1282bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul                        GLint accumBits, OSMesaContext sharelist )
1292bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul{
130afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   OSMesaContext osmesa;
131afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLint rshift, gshift, bshift, ashift;
13274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   GLint rind, gind, bind, aind;
1332bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul   GLint indexBits, redBits, greenBits, blueBits, alphaBits;
134afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLboolean rgbmode;
135afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLboolean swalpha;
13674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   const GLuint i4 = 1;
13774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   const GLubyte *i1 = (GLubyte *) &i4;
13874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   const GLint little_endian = *i1;
139afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
140afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   swalpha = GL_FALSE;
14174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   rind = gind = bind = aind = 0;
142afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   if (format==OSMESA_COLOR_INDEX) {
143afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      indexBits = 8;
144afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      rshift = gshift = bshift = ashift = 0;
145afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      rgbmode = GL_FALSE;
146afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
147afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   else if (format==OSMESA_RGBA) {
148afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      indexBits = 0;
14901915e90e6912f06d43d443a09157f7bbc96ddc5Brian Paul      redBits = CHAN_BITS;
15001915e90e6912f06d43d443a09157f7bbc96ddc5Brian Paul      greenBits = CHAN_BITS;
15101915e90e6912f06d43d443a09157f7bbc96ddc5Brian Paul      blueBits = CHAN_BITS;
15201915e90e6912f06d43d443a09157f7bbc96ddc5Brian Paul      alphaBits = CHAN_BITS;
15374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      rind = 0;
15474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      gind = 1;
15574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      bind = 2;
15674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      aind = 3;
157afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      if (little_endian) {
158afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         rshift = 0;
159afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         gshift = 8;
160afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         bshift = 16;
161afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         ashift = 24;
162afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
163afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      else {
164afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         rshift = 24;
165afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         gshift = 16;
166afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         bshift = 8;
167afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         ashift = 0;
168afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
169afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      rgbmode = GL_TRUE;
170afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
171afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   else if (format==OSMESA_BGRA) {
172afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      indexBits = 0;
17301915e90e6912f06d43d443a09157f7bbc96ddc5Brian Paul      redBits = CHAN_BITS;
17401915e90e6912f06d43d443a09157f7bbc96ddc5Brian Paul      greenBits = CHAN_BITS;
17501915e90e6912f06d43d443a09157f7bbc96ddc5Brian Paul      blueBits = CHAN_BITS;
17601915e90e6912f06d43d443a09157f7bbc96ddc5Brian Paul      alphaBits = CHAN_BITS;
17774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      rind = 2;
17874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      gind = 1;
17974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      bind = 0;
18074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      aind = 3;
181afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      if (little_endian) {
182afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         ashift = 0;
183afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         rshift = 8;
184afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         gshift = 16;
185afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         bshift = 24;
186afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
187afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      else {
188afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         bshift = 24;
189afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         gshift = 16;
190afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         rshift = 8;
191afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         ashift = 0;
192afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
193afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      rgbmode = GL_TRUE;
194afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
195afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   else if (format==OSMESA_ARGB) {
196afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      indexBits = 0;
19701915e90e6912f06d43d443a09157f7bbc96ddc5Brian Paul      redBits = CHAN_BITS;
19801915e90e6912f06d43d443a09157f7bbc96ddc5Brian Paul      greenBits = CHAN_BITS;
19901915e90e6912f06d43d443a09157f7bbc96ddc5Brian Paul      blueBits = CHAN_BITS;
20001915e90e6912f06d43d443a09157f7bbc96ddc5Brian Paul      alphaBits = CHAN_BITS;
20174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      rind = 1;
20274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      gind = 2;
20374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      bind = 3;
20474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      aind = 0;
205afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      if (little_endian) {
206afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         bshift = 0;
207afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         gshift = 8;
208afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         rshift = 16;
209afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         ashift = 24;
210afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
211afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      else {
212afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         ashift = 24;
213afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         rshift = 16;
214afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         gshift = 8;
215afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         bshift = 0;
216afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
217afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      rgbmode = GL_TRUE;
218afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
219afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   else if (format==OSMESA_RGB) {
220afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      indexBits = 0;
22101915e90e6912f06d43d443a09157f7bbc96ddc5Brian Paul      redBits = CHAN_BITS;
22201915e90e6912f06d43d443a09157f7bbc96ddc5Brian Paul      greenBits = CHAN_BITS;
22301915e90e6912f06d43d443a09157f7bbc96ddc5Brian Paul      blueBits = CHAN_BITS;
224afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      alphaBits = 0;
225afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      bshift = 0;
226afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      gshift = 8;
227afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      rshift = 16;
228afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      ashift = 24;
229afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      rind = 0;
23074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      gind = 1;
23174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      bind = 2;
232afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      rgbmode = GL_TRUE;
233afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      swalpha = GL_TRUE;
234afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
235afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   else if (format==OSMESA_BGR) {
236afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      indexBits = 0;
23701915e90e6912f06d43d443a09157f7bbc96ddc5Brian Paul      redBits = CHAN_BITS;
23801915e90e6912f06d43d443a09157f7bbc96ddc5Brian Paul      greenBits = CHAN_BITS;
23901915e90e6912f06d43d443a09157f7bbc96ddc5Brian Paul      blueBits = CHAN_BITS;
240afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      alphaBits = 0;
241afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      bshift = 0;
242afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      gshift = 8;
243afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      rshift = 16;
244afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      ashift = 24;
245afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      rind = 2;
24674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      gind = 1;
24774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      bind = 0;
248afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      rgbmode = GL_TRUE;
249afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      swalpha = GL_TRUE;
250afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
251afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   else {
252afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      return NULL;
253afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
254afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
255afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
256bd5cdaf4442872d3cd2ff94eeafadd481d27fcfbBrian Paul   osmesa = (OSMesaContext) CALLOC_STRUCT(osmesa_context);
257afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   if (osmesa) {
2582bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul      osmesa->gl_visual = _mesa_create_visual( rgbmode,
2592bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul                                               GL_FALSE,    /* double buffer */
2602bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul                                               GL_FALSE,    /* stereo */
2612bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul                                               redBits,
2622bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul                                               greenBits,
2632bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul                                               blueBits,
2642bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul                                               alphaBits,
2652bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul                                               indexBits,
2662bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul                                               depthBits,
2672bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul                                               stencilBits,
2682bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul                                               accumBits,
2692bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul                                               accumBits,
2702bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul                                               accumBits,
2712bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul                                               alphaBits ? accumBits : 0,
2722bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul                                               1            /* num samples */
2732bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul                                               );
274afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      if (!osmesa->gl_visual) {
275941dcc797e1a6317808c1ec43476817286d576baBrian Paul         FREE(osmesa);
276afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         return NULL;
277afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
278afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
279df81387dfae199a71bc55138ea5856dc05eacf24Brian Paul      if (!_mesa_initialize_context(&osmesa->gl_ctx,
280df81387dfae199a71bc55138ea5856dc05eacf24Brian Paul                                    osmesa->gl_visual,
281df81387dfae199a71bc55138ea5856dc05eacf24Brian Paul                                    sharelist ? &sharelist->gl_ctx
282df81387dfae199a71bc55138ea5856dc05eacf24Brian Paul                                              : (GLcontext *) NULL,
283df81387dfae199a71bc55138ea5856dc05eacf24Brian Paul                                    (void *) osmesa, GL_TRUE )) {
284df81387dfae199a71bc55138ea5856dc05eacf24Brian Paul         _mesa_destroy_visual( osmesa->gl_visual );
285bd5cdaf4442872d3cd2ff94eeafadd481d27fcfbBrian Paul         FREE(osmesa);
286afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         return NULL;
287afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
2885a9026c65d260dc185e072163999f5d810015108Brian Paul
2895a9026c65d260dc185e072163999f5d810015108Brian Paul      _mesa_enable_sw_extensions(&(osmesa->gl_ctx));
290304357dcd496f7ebf499fd9c77b4eba83a75abd5Brian Paul
291b1394fa92aaaf859ce9efc8b5fc194397921320cBrian Paul      osmesa->gl_buffer = _mesa_create_framebuffer( osmesa->gl_visual,
292b6bcae5698df88f7730d40004ce7ce0462e97a20Brian Paul                                          osmesa->gl_visual->depthBits > 0,
293b6bcae5698df88f7730d40004ce7ce0462e97a20Brian Paul                                          osmesa->gl_visual->stencilBits > 0,
294b6bcae5698df88f7730d40004ce7ce0462e97a20Brian Paul                                          osmesa->gl_visual->accumRedBits > 0,
295b6bcae5698df88f7730d40004ce7ce0462e97a20Brian Paul                                          osmesa->gl_visual->alphaBits > 0 );
2964c44d63f01a01f134d7e4456d4209edee97f9ef5Brian Paul
297afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      if (!osmesa->gl_buffer) {
298b1394fa92aaaf859ce9efc8b5fc194397921320cBrian Paul         _mesa_destroy_visual( osmesa->gl_visual );
299b1394fa92aaaf859ce9efc8b5fc194397921320cBrian Paul         _mesa_free_context_data( &osmesa->gl_ctx );
300bd5cdaf4442872d3cd2ff94eeafadd481d27fcfbBrian Paul         FREE(osmesa);
301afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         return NULL;
302afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
303afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      osmesa->format = format;
304afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      osmesa->buffer = NULL;
305afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      osmesa->width = 0;
306afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      osmesa->height = 0;
307afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      osmesa->userRowLength = 0;
308afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      osmesa->rowlength = 0;
309afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      osmesa->yup = GL_TRUE;
310afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      osmesa->rshift = rshift;
311afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      osmesa->gshift = gshift;
312afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      osmesa->bshift = bshift;
313afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      osmesa->ashift = ashift;
31474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      osmesa->rInd = rind;
31574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      osmesa->gInd = gind;
31674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      osmesa->bInd = bind;
31774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      osmesa->aInd = aind;
3181e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell
3191e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell
3201e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell      /* Initialize the software rasterizer and helper modules.
3211e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell       */
3221e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell      {
3231e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell	 GLcontext *ctx = &osmesa->gl_ctx;
3241e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell
3251e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell	 _swrast_CreateContext( ctx );
32658e991705392a2e17a1c8b034f4083a0adaf1943Keith Whitwell	 _ac_CreateContext( ctx );
32723caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell	 _tnl_CreateContext( ctx );
328cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell	 _swsetup_CreateContext( ctx );
329dbd1e2b5990a3689bf718296c57c14fc3ba38db5Jouk Jansen
3301e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell	 osmesa_register_swrast_functions( ctx );
3311e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell      }
332afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
333afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   return osmesa;
334afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
335afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
336afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
337afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
3382bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul
339afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/*
340afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Destroy an Off-Screen Mesa rendering context.
341afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg *
342afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Input:  ctx - the context to destroy
343afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */
344afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgvoid GLAPIENTRY OSMesaDestroyContext( OSMesaContext ctx )
345afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
346afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   if (ctx) {
347709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell      _swsetup_DestroyContext( &ctx->gl_ctx );
348709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell      _tnl_DestroyContext( &ctx->gl_ctx );
349709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell      _ac_DestroyContext( &ctx->gl_ctx );
350709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell      _swrast_DestroyContext( &ctx->gl_ctx );
351709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell
352b1394fa92aaaf859ce9efc8b5fc194397921320cBrian Paul      _mesa_destroy_visual( ctx->gl_visual );
353b1394fa92aaaf859ce9efc8b5fc194397921320cBrian Paul      _mesa_destroy_framebuffer( ctx->gl_buffer );
354b1394fa92aaaf859ce9efc8b5fc194397921320cBrian Paul      _mesa_free_context_data( &ctx->gl_ctx );
355bd5cdaf4442872d3cd2ff94eeafadd481d27fcfbBrian Paul      FREE( ctx );
356afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
357afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
358afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
359afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
360afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
361afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/*
362afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Recompute the values of the context's rowaddr array.
363afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */
364afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgstatic void compute_row_addresses( OSMesaContext ctx )
365afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
36674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   GLint bytesPerPixel, bytesPerRow, i;
36774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   GLubyte *origin = (GLubyte *) ctx->buffer;
36874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul
36974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   if (ctx->format == OSMESA_COLOR_INDEX) {
37074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      /* CI mode */
37174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      bytesPerPixel = 1 * sizeof(GLchan);
37274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   }
37374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   else if ((ctx->format == OSMESA_RGB) || (ctx->format == OSMESA_BGR)) {
37474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      /* RGB mode */
37574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      bytesPerPixel = 3 * sizeof(GLchan);
37674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   }
37774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   else {
37874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      /* RGBA mode */
37974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      bytesPerPixel = 4 * sizeof(GLchan);
38074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   }
38174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul
38274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   bytesPerRow = ctx->rowlength * bytesPerPixel;
383afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
384afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   if (ctx->yup) {
385afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      /* Y=0 is bottom line of window */
38674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      for (i = 0; i < MAX_HEIGHT; i++) {
38774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul         ctx->rowaddr[i] = (GLchan *) ((GLubyte *) origin + i * bytesPerRow);
388afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
389afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
390afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   else {
391afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      /* Y=0 is top line of window */
39274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      for (i = 0; i < MAX_HEIGHT; i++) {
39374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul         GLint j = ctx->height - i - 1;
39474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul         ctx->rowaddr[i] = (GLchan *) ((GLubyte *) origin + j * bytesPerRow);
395afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
396afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
397afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
398afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
399afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
400afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/*
401afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Bind an OSMesaContext to an image buffer.  The image buffer is just a
402afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * block of memory which the client provides.  Its size must be at least
403afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * as large as width*height*sizeof(type).  Its address should be a multiple
404afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * of 4 if using RGBA mode.
405afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg *
406afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Image data is stored in the order of glDrawPixels:  row-major order
407afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * with the lower-left image pixel stored in the first array position
408afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * (ie. bottom-to-top).
409afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg *
410afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Since the only type initially supported is GL_UNSIGNED_BYTE, if the
411afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * context is in RGBA mode, each pixel will be stored as a 4-byte RGBA
412afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * value.  If the context is in color indexed mode, each pixel will be
413afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * stored as a 1-byte value.
414afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg *
415afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * If the context's viewport hasn't been initialized yet, it will now be
416afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * initialized to (0,0,width,height).
417afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg *
418afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Input:  ctx - the rendering context
419afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg *         buffer - the image buffer memory
420afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg *         type - data type for pixel components, only GL_UNSIGNED_BYTE
421afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg *                supported now
422afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg *         width, height - size of image buffer in pixels, at least 1
423afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Return:  GL_TRUE if success, GL_FALSE if error because of invalid ctx,
424afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg *          invalid buffer address, type!=GL_UNSIGNED_BYTE, width<1, height<1,
425afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg *          width>internal limit or height>internal limit.
426afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */
427d3c070ca6a36daa765b1ad7f44e03e6671ad0490Brian PaulGLboolean GLAPIENTRY
428d3c070ca6a36daa765b1ad7f44e03e6671ad0490Brian PaulOSMesaMakeCurrent( OSMesaContext ctx, void *buffer, GLenum type,
429d3c070ca6a36daa765b1ad7f44e03e6671ad0490Brian Paul                   GLsizei width, GLsizei height )
430afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
43174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   if (!ctx || !buffer || type != CHAN_TYPE ||
43274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul       width < 1 || height < 1 ||
43374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul       width > MAX_WIDTH || height > MAX_HEIGHT) {
434afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      return GL_FALSE;
435afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
436afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
437cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   osmesa_update_state( &ctx->gl_ctx, 0 );
438b1394fa92aaaf859ce9efc8b5fc194397921320cBrian Paul   _mesa_make_current( &ctx->gl_ctx, ctx->gl_buffer );
439afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
440afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   ctx->buffer = buffer;
441afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   ctx->width = width;
442afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   ctx->height = height;
443afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   if (ctx->userRowLength)
444afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      ctx->rowlength = ctx->userRowLength;
445afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   else
446afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      ctx->rowlength = width;
447afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
448afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   compute_row_addresses( ctx );
449afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
450afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   /* init viewport */
451304357dcd496f7ebf499fd9c77b4eba83a75abd5Brian Paul   if (ctx->gl_ctx.Viewport.Width==0) {
452afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      /* initialize viewport and scissor box to buffer size */
453cb5ecb883eb3be842ef44c61df8d4b527877c858Brian Paul      _mesa_Viewport( 0, 0, width, height );
454304357dcd496f7ebf499fd9c77b4eba83a75abd5Brian Paul      ctx->gl_ctx.Scissor.Width = width;
455304357dcd496f7ebf499fd9c77b4eba83a75abd5Brian Paul      ctx->gl_ctx.Scissor.Height = height;
456afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
457afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
458afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   return GL_TRUE;
459afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
460afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
461afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
462afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
463afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgOSMesaContext GLAPIENTRY OSMesaGetCurrentContext( void )
464afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
465b1394fa92aaaf859ce9efc8b5fc194397921320cBrian Paul   GLcontext *ctx = _mesa_get_current_context();
466d3c070ca6a36daa765b1ad7f44e03e6671ad0490Brian Paul   if (ctx)
467304357dcd496f7ebf499fd9c77b4eba83a75abd5Brian Paul      return (OSMesaContext) ctx;
468d3c070ca6a36daa765b1ad7f44e03e6671ad0490Brian Paul   else
469d3c070ca6a36daa765b1ad7f44e03e6671ad0490Brian Paul      return NULL;
470afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
471afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
472afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
473afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
474afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgvoid GLAPIENTRY OSMesaPixelStore( GLint pname, GLint value )
475afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
476afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   OSMesaContext ctx = OSMesaGetCurrentContext();
477afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
478afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   switch (pname) {
479afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case OSMESA_ROW_LENGTH:
480afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         if (value<0) {
48108836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul            _mesa_error( &ctx->gl_ctx, GL_INVALID_VALUE,
482afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg                      "OSMesaPixelStore(value)" );
483afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            return;
484afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         }
485afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         ctx->userRowLength = value;
486afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         ctx->rowlength = value;
487afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         break;
488afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case OSMESA_Y_UP:
489afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         ctx->yup = value ? GL_TRUE : GL_FALSE;
490afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         break;
491afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      default:
49208836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul         _mesa_error( &ctx->gl_ctx, GL_INVALID_ENUM, "OSMesaPixelStore(pname)" );
493afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         return;
494afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
495afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
496afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   compute_row_addresses( ctx );
497afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
498afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
499afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
500afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgvoid GLAPIENTRY OSMesaGetIntegerv( GLint pname, GLint *value )
501afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
502afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   OSMesaContext ctx = OSMesaGetCurrentContext();
503afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
504afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   switch (pname) {
505afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case OSMESA_WIDTH:
506afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         *value = ctx->width;
507afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         return;
508afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case OSMESA_HEIGHT:
509afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         *value = ctx->height;
510afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         return;
511afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case OSMESA_FORMAT:
512afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         *value = ctx->format;
513afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         return;
514afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case OSMESA_TYPE:
51501915e90e6912f06d43d443a09157f7bbc96ddc5Brian Paul         *value = CHAN_TYPE;
516afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         return;
517afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case OSMESA_ROW_LENGTH:
518afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         *value = ctx->rowlength;
519afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         return;
520afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case OSMESA_Y_UP:
521afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         *value = ctx->yup;
522afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         return;
523afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      default:
52408836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul         _mesa_error(&ctx->gl_ctx, GL_INVALID_ENUM, "OSMesaGetIntergerv(pname)");
525afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         return;
526afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
527afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
528afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
529afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/*
530afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Return the depth buffer associated with an OSMesa context.
531afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Input:  c - the OSMesa context
532afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Output:  width, height - size of buffer in pixels
533afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg *          bytesPerValue - bytes per depth value (2 or 4)
534afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg *          buffer - pointer to depth buffer values
535afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Return:  GL_TRUE or GL_FALSE to indicate success or failure.
536afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */
5377e67fb41fb54e050f6983b4de09ed3a317d6148fBrian PaulGLboolean GLAPIENTRY
5387e67fb41fb54e050f6983b4de09ed3a317d6148fBrian PaulOSMesaGetDepthBuffer( OSMesaContext c, GLint *width, GLint *height,
5397e67fb41fb54e050f6983b4de09ed3a317d6148fBrian Paul                      GLint *bytesPerValue, void **buffer )
540afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
541650cb74bcb913d2589355d56a14da1ab0307d1fcBrian Paul   if ((!c->gl_buffer) || (!c->gl_buffer->DepthBuffer)) {
542afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      *width = 0;
543afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      *height = 0;
544afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      *bytesPerValue = 0;
545afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      *buffer = 0;
546afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      return GL_FALSE;
547afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
548afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   else {
549afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      *width = c->gl_buffer->Width;
550afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      *height = c->gl_buffer->Height;
5519db3f95acea5622573803890afd506ebcdaab3b3Brian Paul      if (c->gl_visual->depthBits <= 16)
5529db3f95acea5622573803890afd506ebcdaab3b3Brian Paul         *bytesPerValue = sizeof(GLushort);
5539db3f95acea5622573803890afd506ebcdaab3b3Brian Paul      else
5549db3f95acea5622573803890afd506ebcdaab3b3Brian Paul         *bytesPerValue = sizeof(GLuint);
555650cb74bcb913d2589355d56a14da1ab0307d1fcBrian Paul      *buffer = c->gl_buffer->DepthBuffer;
556afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      return GL_TRUE;
557afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
558afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
559afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
56023ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank/*
56123ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank * Return the color buffer associated with an OSMesa context.
56223ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank * Input:  c - the OSMesa context
56323ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank * Output:  width, height - size of buffer in pixels
56423ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank *          format - the pixel format (OSMESA_FORMAT)
56523ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank *          buffer - pointer to color buffer values
56623ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank * Return:  GL_TRUE or GL_FALSE to indicate success or failure.
56723ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank */
5687e67fb41fb54e050f6983b4de09ed3a317d6148fBrian PaulGLboolean GLAPIENTRY
5697e67fb41fb54e050f6983b4de09ed3a317d6148fBrian PaulOSMesaGetColorBuffer( OSMesaContext c, GLint *width,
5707e67fb41fb54e050f6983b4de09ed3a317d6148fBrian Paul                      GLint *height, GLint *format, void **buffer )
57123ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank{
57223ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank   if (!c->buffer) {
57323ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank      *width = 0;
57423ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank      *height = 0;
57523ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank      *format = 0;
57623ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank      *buffer = 0;
57723ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank      return GL_FALSE;
5787e67fb41fb54e050f6983b4de09ed3a317d6148fBrian Paul   }
5797e67fb41fb54e050f6983b4de09ed3a317d6148fBrian Paul   else {
58023ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank      *width = c->width;
58123ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank      *height = c->height;
58223ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank      *format = c->format;
58323ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank      *buffer = c->buffer;
58423ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank      return GL_TRUE;
58523ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank   }
58623ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank}
587afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
588afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/**********************************************************************/
589afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/*** Device Driver Functions                                        ***/
590afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/**********************************************************************/
591afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
592afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
593afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/*
594afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Useful macros:
595afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */
596afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
59774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul#define PACK_RGBA(DST, R, G, B, A)	\
59874b493a5e61237de081a438e774e5d8139d4c6b7Brian Pauldo {					\
59974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   (DST)[osmesa->rInd] = R;		\
60074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   (DST)[osmesa->gInd] = G;		\
60174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   (DST)[osmesa->bInd] = B;		\
60274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   (DST)[osmesa->aInd] = A;		\
60374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul} while (0)
60474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul
60574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul#define PACK_RGB(DST, R, G, B)  \
60674b493a5e61237de081a438e774e5d8139d4c6b7Brian Pauldo {				\
60774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   (DST)[0] = R;		\
60874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   (DST)[1] = G;		\
60974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   (DST)[2] = B;		\
61074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul} while (0)
611afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
61274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul#define PACK_BGR(DST, R, G, B)  \
61374b493a5e61237de081a438e774e5d8139d4c6b7Brian Pauldo {				\
61474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   (DST)[0] = B;		\
61574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   (DST)[1] = G;		\
61674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   (DST)[2] = R;		\
61774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul} while (0)
618afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
619afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
62001915e90e6912f06d43d443a09157f7bbc96ddc5Brian Paul#define UNPACK_RED(P)      ( (P)[osmesa->rInd] )
62101915e90e6912f06d43d443a09157f7bbc96ddc5Brian Paul#define UNPACK_GREEN(P)    ( (P)[osmesa->gInd] )
62201915e90e6912f06d43d443a09157f7bbc96ddc5Brian Paul#define UNPACK_BLUE(P)     ( (P)[osmesa->bInd] )
62301915e90e6912f06d43d443a09157f7bbc96ddc5Brian Paul#define UNPACK_ALPHA(P)    ( (P)[osmesa->aInd] )
62474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul
62574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul
62674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul#define PIXELADDR1(X,Y)  (osmesa->rowaddr[Y] + (X))
62774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul#define PIXELADDR3(X,Y)  (osmesa->rowaddr[Y] + 3 * (X))
62874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul#define PIXELADDR4(X,Y)  (osmesa->rowaddr[Y] + 4 * (X))
629afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
630afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
631afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
632cea0e8e6700e871bb9bcb334cb75fbfbfcdfd702Brian Paulstatic GLboolean set_draw_buffer( GLcontext *ctx, GLenum mode )
633afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
634afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   (void) ctx;
635afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   if (mode==GL_FRONT_LEFT) {
636afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      return GL_TRUE;
637afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
638afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   else {
639afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      return GL_FALSE;
640afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
641afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
642afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
643afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
644cea0e8e6700e871bb9bcb334cb75fbfbfcdfd702Brian Paulstatic void set_read_buffer( GLcontext *ctx, GLframebuffer *buffer, GLenum mode )
645cea0e8e6700e871bb9bcb334cb75fbfbfcdfd702Brian Paul{
646cea0e8e6700e871bb9bcb334cb75fbfbfcdfd702Brian Paul   /* separate read buffer not supported */
647cea0e8e6700e871bb9bcb334cb75fbfbfcdfd702Brian Paul   ASSERT(buffer == ctx->DrawBuffer);
648cea0e8e6700e871bb9bcb334cb75fbfbfcdfd702Brian Paul   ASSERT(mode == GL_FRONT_LEFT);
649cea0e8e6700e871bb9bcb334cb75fbfbfcdfd702Brian Paul}
650cea0e8e6700e871bb9bcb334cb75fbfbfcdfd702Brian Paul
651cea0e8e6700e871bb9bcb334cb75fbfbfcdfd702Brian Paul
652d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwellstatic void clear( GLcontext *ctx, GLbitfield mask, GLboolean all,
653d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell		   GLint x, GLint y, GLint width, GLint height )
654afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
655c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul   OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
656dd020f13a6d520b46aefd4453dae6b6edcc427f6Brian Paul   const GLuint *colorMask = (GLuint *) &ctx->Color.ColorMask;
657dd020f13a6d520b46aefd4453dae6b6edcc427f6Brian Paul
658dd020f13a6d520b46aefd4453dae6b6edcc427f6Brian Paul   /* sanity check - we only have a front-left buffer */
659dd020f13a6d520b46aefd4453dae6b6edcc427f6Brian Paul   ASSERT((mask & (DD_FRONT_RIGHT_BIT | DD_BACK_LEFT_BIT | DD_BACK_RIGHT_BIT)) == 0);
660d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell   if (*colorMask == 0xffffffff && ctx->Color.IndexMask == 0xffffffff) {
661d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell      if (mask & DD_FRONT_LEFT_BIT) {
662d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	 if (osmesa->format == OSMESA_COLOR_INDEX) {
663d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	    if (all) {
664d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	       /* Clear whole CI buffer */
66574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul#if CHAN_TYPE == GL_UNSIGNED_BYTE
666d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	       MEMSET(osmesa->buffer, ctx->Color.ClearIndex,
667d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell		      osmesa->rowlength * osmesa->height);
66874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul#else
669d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	       const GLint n = osmesa->rowlength * osmesa->height;
670d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	       GLchan *buffer = (GLchan *) osmesa->buffer;
671d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	       GLint i;
672d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	       for (i = 0; i < n; i ++) {
673d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell		  buffer[i] = ctx->Color.ClearIndex;
674d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	       }
67574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul#endif
676d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	    }
677d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	    else {
678d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	       /* Clear part of CI buffer */
679d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	       const GLchan clearIndex = (GLchan) ctx->Color.ClearIndex;
680d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	       GLint i, j;
681d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	       for (i = 0; i < height; i++) {
682d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell		  GLchan *ptr1 = PIXELADDR1(x, (y + i));
683d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell		  for (j = 0; j < width; j++) {
684d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell		     *ptr1++ = clearIndex;
685d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell		  }
686d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	       }
687d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	    }
688d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	 }
689d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	 else if (osmesa->format == OSMESA_RGB) {
690d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	    const GLchan r = ctx->Color.ClearColor[0];
691d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	    const GLchan g = ctx->Color.ClearColor[1];
692d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	    const GLchan b = ctx->Color.ClearColor[2];
693d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	    if (all) {
694d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	       /* Clear whole RGB buffer */
695d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	       GLuint n = osmesa->rowlength * osmesa->height;
696d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	       GLchan *ptr3 = (GLchan *) osmesa->buffer;
697d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	       GLuint i;
698d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	       for (i = 0; i < n; i++) {
699d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell		  PACK_RGB(ptr3, r, g, b);
700d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell		  ptr3 += 3;
701d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	       }
702d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	    }
703d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	    else {
704d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	       /* Clear part of RGB buffer */
705d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	       GLint i, j;
706d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	       for (i = 0; i < height; i++) {
707d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell		  GLchan *ptr3 = PIXELADDR3(x, (y + i));
708d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell		  for (j = 0; j < width; j++) {
709d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell		     PACK_RGB(ptr3, r, g, b);
710d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell		     ptr3 += 3;
711d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell		  }
712d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	       }
713d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	    }
714d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	 }
715d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	 else if (osmesa->format == OSMESA_BGR) {
716d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	    const GLchan r = ctx->Color.ClearColor[0];
717d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	    const GLchan g = ctx->Color.ClearColor[1];
718d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	    const GLchan b = ctx->Color.ClearColor[2];
719d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	    if (all) {
720d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	       /* Clear whole RGB buffer */
721d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	       const GLint n = osmesa->rowlength * osmesa->height;
722d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	       GLchan *ptr3 = (GLchan *) osmesa->buffer;
723d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	       GLint i;
724d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	       for (i = 0; i < n; i++) {
725d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell		  PACK_BGR(ptr3, r, g, b);
726d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell		  ptr3 += 3;
727d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	       }
728d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	    }
729d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	    else {
730d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	       /* Clear part of RGB buffer */
731d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	       GLint i, j;
732d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	       for (i = 0; i < height; i++) {
733d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell		  GLchan *ptr3 = PIXELADDR3(x, (y + i));
734d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell		  for (j = 0; j < width; j++) {
735d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell		     PACK_BGR(ptr3, r, g, b);
736d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell		     ptr3 += 3;
737d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell		  }
738d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	       }
739d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	    }
740d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	 }
741d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	 else {
74274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul#if CHAN_TYPE == GL_UNSIGNED_BYTE
743d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	    /* 4-byte pixel value */
744d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	    GLuint clearPixel;
745d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	    GLchan *clr = (GLchan *) &clearPixel;
746d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	    clr[osmesa->rInd] = ctx->Color.ClearColor[0];
747d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	    clr[osmesa->gInd] = ctx->Color.ClearColor[1];
748d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	    clr[osmesa->bInd] = ctx->Color.ClearColor[2];
749d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	    clr[osmesa->aInd] = ctx->Color.ClearColor[3];
750d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	    if (all) {
751d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	       /* Clear whole RGBA buffer */
752d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	       const GLuint n = osmesa->rowlength * osmesa->height;
753d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	       GLuint *ptr4 = (GLuint *) osmesa->buffer;
754d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	       GLuint i;
755d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	       if (clearPixel) {
756d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell		  for (i = 0; i < n; i++) {
757d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell		     *ptr4++ = clearPixel;
758d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell		  }
759d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	       }
760d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	       else {
761d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell		  BZERO(ptr4, n * sizeof(GLuint));
762d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	       }
763d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	    }
764d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	    else {
765d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	       /* Clear part of RGBA buffer */
766d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	       GLint i, j;
767d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	       for (i = 0; i < height; i++) {
768d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell		  GLuint *ptr4 = (GLuint *) PIXELADDR4(x, (y + i));
769d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell		  for (j = 0; j < width; j++) {
770d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell		     *ptr4++ = clearPixel;
771d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell		  }
772d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	       }
773d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	    }
77474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul#else
775d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	    const GLchan r = ctx->Color.ClearColor[0];
776d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	    const GLchan g = ctx->Color.ClearColor[1];
777d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	    const GLchan b = ctx->Color.ClearColor[2];
778d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	    const GLchan a = ctx->Color.ClearColor[3];
779d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	    if (all) {
780d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	       /* Clear whole RGBA buffer */
781d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	       const GLuint n = osmesa->rowlength * osmesa->height;
782d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	       GLchan *p = (GLchan *) osmesa->buffer;
783d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	       GLuint i;
784d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	       for (i = 0; i < n; i++) {
785d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell		  PACK_RGBA(p, r, g, b, a);
786d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell		  p += 4;
787d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	       }
788d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	    }
789d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	    else {
790d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	       /* Clear part of RGBA buffer */
791d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	       GLint i, j;
792d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	       for (i = 0; i < height; i++) {
793d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell		  GLchan *p = PIXELADDR4(x, (y + i));
794d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell		  for (j = 0; j < width; j++) {
795d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell		     PACK_RGBA(p, r, g, b, a);
796d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell		     p += 4;
797d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell		  }
798d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	       }
799d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	    }
80074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul
80174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul#endif
802d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	 }
803d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	 mask &= ~DD_FRONT_LEFT_BIT;
804afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
805afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
806d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell
807d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell   if (mask)
808d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell      _swrast_Clear( ctx, mask, all, x, y, width, height );
809afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
810afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
811afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
812afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
813afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgstatic void buffer_size( GLcontext *ctx, GLuint *width, GLuint *height )
814afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
815c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul   OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
816afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   *width = osmesa->width;
817afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   *height = osmesa->height;
818afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
819afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
820afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
821afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/**********************************************************************/
822afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/*****        Read/write spans/arrays of RGBA pixels              *****/
823afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/**********************************************************************/
824afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
825afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/* Write RGBA pixels to an RGBA (or permuted) buffer. */
82674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void
82774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulwrite_rgba_span( const GLcontext *ctx, GLuint n, GLint x, GLint y,
82874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul                 CONST GLchan rgba[][4], const GLubyte mask[] )
829afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
83074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   const OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
83174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   GLchan *p = PIXELADDR4(x, y);
832afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLuint i;
833afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   if (mask) {
83474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      for (i = 0; i < n; i++, p += 4) {
835afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         if (mask[i]) {
83674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul            PACK_RGBA(p, rgba[i][RCOMP], rgba[i][GCOMP],
83774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul                         rgba[i][BCOMP], rgba[i][ACOMP]);
838afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         }
839afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
840afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
841afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   else {
84274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      for (i = 0; i < n; i++, p += 4) {
84374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul         PACK_RGBA(p, rgba[i][RCOMP], rgba[i][GCOMP],
84474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul                      rgba[i][BCOMP], rgba[i][ACOMP]);
845afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
846afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
847afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
848afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
849afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
850afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/* Write RGBA pixels to an RGBA buffer.  This is the fastest span-writer. */
85174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void
85274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulwrite_rgba_span_rgba( const GLcontext *ctx, GLuint n, GLint x, GLint y,
85374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul                      CONST GLchan rgba[][4], const GLubyte mask[] )
854afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
855c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul   OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
85674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   GLuint *ptr4 = (GLuint *) PIXELADDR4(x, y);
857afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   const GLuint *rgba4 = (const GLuint *) rgba;
858afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLuint i;
85974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   ASSERT(CHAN_TYPE == GL_UNSIGNED_BYTE);
860afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   if (mask) {
86174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      for (i = 0; i < n; i++) {
862afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         if (mask[i]) {
863afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            ptr4[i] = rgba4[i];
864afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         }
865afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
866afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
867afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   else {
868afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      MEMCPY( ptr4, rgba4, n * 4 );
869afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
870afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
871afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
872afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
873afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/* Write RGB pixels to an RGBA (or permuted) buffer. */
87474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void
87574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulwrite_rgb_span( const GLcontext *ctx, GLuint n, GLint x, GLint y,
87674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul                CONST GLchan rgb[][3], const GLubyte mask[] )
877afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
87874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   const OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
87974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   GLchan *p = PIXELADDR4(x, y);
880afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLuint i;
881afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   if (mask) {
88274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      for (i = 0; i < n; i++, p+=4) {
883afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         if (mask[i]) {
88474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul            PACK_RGBA(p, rgb[i][RCOMP], rgb[i][GCOMP], rgb[i][BCOMP], 255);
885afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         }
886afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
887afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
888afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   else {
88974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      for (i = 0; i < n; i++, p+=4) {
89074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul         PACK_RGBA(p, rgb[i][RCOMP], rgb[i][GCOMP], rgb[i][BCOMP], 255);
891afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
892afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
893afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
894afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
895afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
896afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
89774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void
89874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulwrite_monocolor_span( const GLcontext *ctx, GLuint n, GLint x, GLint y,
89974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul                      const GLchan color[4], const GLubyte mask[] )
900afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
901c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul   const OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
90274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   GLchan *p = PIXELADDR4(x, y);
903afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLuint i;
90474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   for (i = 0; i < n; i++, p += 4) {
905afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      if (mask[i]) {
90674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul         PACK_RGBA(p, color[RCOMP], color[GCOMP], color[BCOMP], color[ACOMP]);
907afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
908afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
909afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
910afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
911afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
912afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
91374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void
91474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulwrite_rgba_pixels( const GLcontext *ctx, GLuint n,
91574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul                   const GLint x[], const GLint y[],
91674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul                   CONST GLchan rgba[][4], const GLubyte mask[] )
917afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
91874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   const OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
919afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLuint i;
92074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   for (i = 0; i < n; i++) {
921afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      if (mask[i]) {
92274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul         GLchan *p = PIXELADDR4(x[i], y[i]);
92374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul         PACK_RGBA(p, rgba[i][RCOMP], rgba[i][GCOMP],
92474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul                      rgba[i][BCOMP], rgba[i][ACOMP]);
925afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
926afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
927afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
928afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
929afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
930afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
93174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void
93274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulwrite_monocolor_pixels( const GLcontext *ctx, GLuint n,
93374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul                        const GLint x[], const GLint y[],
93474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul                        const GLchan color[4], const GLubyte mask[] )
935afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
93674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   const OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
937afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLuint i;
93874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   for (i = 0; i < n; i++) {
939afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      if (mask[i]) {
94074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul         GLchan *p = PIXELADDR4(x[i], y[i]);
94174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul         PACK_RGBA(p, color[RCOMP], color[GCOMP], color[BCOMP], color[ACOMP]);
942afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
943afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
944afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
945afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
946afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
94774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void
94874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulread_rgba_span( const GLcontext *ctx, GLuint n, GLint x, GLint y,
94974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul                GLchan rgba[][4] )
950afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
95174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   const OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
952afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLuint i;
95374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   GLchan *p = PIXELADDR4(x, y);
95474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   for (i = 0; i < n; i++, p += 4) {
95574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      rgba[i][RCOMP] = UNPACK_RED(p);
95674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      rgba[i][GCOMP] = UNPACK_GREEN(p);
95774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      rgba[i][BCOMP] = UNPACK_BLUE(p);
95874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      rgba[i][ACOMP] = UNPACK_ALPHA(p);
959afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
960afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
961afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
962afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
963afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/* Read RGBA pixels from an RGBA buffer */
96474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void
96574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulread_rgba_span_rgba( const GLcontext *ctx, GLuint n, GLint x, GLint y,
96674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul                     GLchan rgba[][4] )
967afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
968c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul   OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
96974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   GLuint *ptr4 = (GLuint *) PIXELADDR4(x, y);
9709499e017b7e05411a32b3e4fa94885eaec0d7277Brian Paul   MEMCPY( rgba, ptr4, n * 4 * sizeof(GLchan) );
971afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
972afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
973afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
97474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void
97574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulread_rgba_pixels( const GLcontext *ctx,
97674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul                  GLuint n, const GLint x[], const GLint y[],
97774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul                  GLchan rgba[][4], const GLubyte mask[] )
978afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
97974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   const OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
980afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLuint i;
98174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   for (i = 0; i < n; i++) {
982afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      if (mask[i]) {
98374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul         const GLchan *p = PIXELADDR4(x[i], y[i]);
98474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul         rgba[i][RCOMP] = UNPACK_RED(p);
98574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul         rgba[i][GCOMP] = UNPACK_GREEN(p);
98674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul         rgba[i][BCOMP] = UNPACK_BLUE(p);
98774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul         rgba[i][ACOMP] = UNPACK_ALPHA(p);
988afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
989afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
990afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
991afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
992afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/**********************************************************************/
993afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/*****                3 byte RGB pixel support funcs              *****/
994afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/**********************************************************************/
995afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
99674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul/* Write RGBA pixels to an RGB buffer. */
99774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void
99874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulwrite_rgba_span_RGB( const GLcontext *ctx, GLuint n, GLint x, GLint y,
99974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul                     CONST GLchan rgba[][4], const GLubyte mask[] )
1000afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
100174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   const OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
100274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   GLchan *p = PIXELADDR3(x, y);
1003afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLuint i;
1004afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   if (mask) {
100574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      for (i = 0; i < n; i++, p += 3) {
1006afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         if (mask[i]) {
100774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul            PACK_RGB(p, rgba[i][RCOMP], rgba[i][GCOMP], rgba[i][BCOMP]);
1008afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         }
1009afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
1010afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
1011afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   else {
101274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      for (i = 0; i < n; i++, p += 3) {
101374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul         PACK_RGB(p, rgba[i][RCOMP], rgba[i][GCOMP], rgba[i][BCOMP]);
1014afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
1015afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
1016afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
1017afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
101874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul/* Write RGBA pixels to an BGR buffer. */
101974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void
102074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulwrite_rgba_span_BGR( const GLcontext *ctx, GLuint n, GLint x, GLint y,
102174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul                     CONST GLchan rgba[][4], const GLubyte mask[] )
1022afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
1023c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul   const OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
102474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   GLchan *p = PIXELADDR3(x, y);
1025afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLuint i;
1026afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   if (mask) {
102774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      for (i = 0; i < n; i++, p += 3) {
1028afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         if (mask[i]) {
102974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul            PACK_BGR(p, rgba[i][RCOMP], rgba[i][GCOMP], rgba[i][BCOMP]);
1030afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         }
1031afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
1032afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
1033afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   else {
103474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      for (i = 0; i < n; i++, p += 3) {
103574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul         PACK_BGR(p, rgba[i][RCOMP], rgba[i][GCOMP], rgba[i][BCOMP]);
1036afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
1037afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
1038afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
1039afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
104074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul/* Write RGB pixels to an RGB buffer. */
104174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void
104274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulwrite_rgb_span_RGB( const GLcontext *ctx, GLuint n, GLint x, GLint y,
104374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul                    CONST GLchan rgb[][3], const GLubyte mask[] )
104474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul{
104574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   const OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
104674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   GLchan *p = PIXELADDR3(x, y);
104774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   GLuint i;
104874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   if (mask) {
104974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      for (i = 0; i < n; i++, p += 3) {
105074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul         if (mask[i]) {
105174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul            PACK_RGB(p, rgb[i][RCOMP], rgb[i][GCOMP], rgb[i][BCOMP]);
105274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul         }
105374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      }
105474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   }
105574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   else {
105674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      for (i = 0; i < n; i++, p += 3) {
105774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul         PACK_RGB(p, rgb[i][RCOMP], rgb[i][GCOMP], rgb[i][BCOMP]);
105874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      }
105974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   }
106074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul}
1061afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
106274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul/* Write RGB pixels to an BGR buffer. */
106374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void
106474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulwrite_rgb_span_BGR( const GLcontext *ctx, GLuint n, GLint x, GLint y,
106574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul                    CONST GLchan rgb[][3], const GLubyte mask[] )
1066afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
1067c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul   const OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
106874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   GLchan *p = PIXELADDR3(x, y);
1069afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLuint i;
107074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   if (mask) {
107174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      for (i = 0; i < n; i++, p += 3) {
107274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul         if (mask[i]) {
107374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul            PACK_BGR(p, rgb[i][RCOMP], rgb[i][GCOMP], rgb[i][BCOMP]);
107474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul         }
107574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      }
107674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   }
107774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   else {
107874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      for (i = 0; i < n; i++, p += 3) {
107974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul         PACK_BGR(p, rgb[i][RCOMP], rgb[i][GCOMP], rgb[i][BCOMP]);
108074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      }
108174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   }
108274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul}
108374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul
108474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul
108574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void
108674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulwrite_monocolor_span_RGB( const GLcontext *ctx, GLuint n, GLint x, GLint y,
108774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul                          const GLchan color[4], const GLubyte mask[] )
108874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul{
108974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   const OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
109074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   GLchan *p = PIXELADDR3(x, y);
109174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   GLuint i;
109274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   for (i = 0; i < n; i++, p += 3) {
109374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      if (mask[i]) {
109474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul         PACK_RGB(p, color[RCOMP], color[GCOMP], color[BCOMP]);
109574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      }
109674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   }
109774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul}
109874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul
109974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void
110074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulwrite_monocolor_span_BGR( const GLcontext *ctx, GLuint n, GLint x, GLint y,
110174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul                          const GLchan color[4], const GLubyte mask[] )
110274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul{
110374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   const OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
110474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   GLchan *p = PIXELADDR3(x, y);
110574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   GLuint i;
110674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   for (i = 0; i < n; i++, p += 3) {
1107afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      if (mask[i]) {
110874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul         PACK_BGR(p, color[RCOMP], color[GCOMP], color[BCOMP]);
1109afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
1110afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
1111afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
1112afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
111374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void
111474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulwrite_rgba_pixels_RGB( const GLcontext *ctx, GLuint n,
111574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul                       const GLint x[], const GLint y[],
111674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul                       CONST GLchan rgba[][4], const GLubyte mask[] )
1117afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
1118c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul   const OSMesaContext osmesa = (const OSMesaContext) ctx;
1119afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLuint i;
112074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   for (i = 0; i < n; i++) {
112174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      if (mask[i]) {
112274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul         GLchan *p = PIXELADDR3(x[i], y[i]);
112374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul         PACK_RGB(p, rgba[i][RCOMP], rgba[i][GCOMP], rgba[i][BCOMP]);
112474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      }
112574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   }
112674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul}
112774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul
112874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void
112974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulwrite_rgba_pixels_BGR( const GLcontext *ctx, GLuint n,
113074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul                       const GLint x[], const GLint y[],
113174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul                       CONST GLchan rgba[][4], const GLubyte mask[] )
113274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul{
113374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   const OSMesaContext osmesa = (const OSMesaContext) ctx;
113474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   GLuint i;
113574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   for (i = 0; i < n; i++) {
1136afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      if (mask[i]) {
113774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul         GLchan *p = PIXELADDR3(x[i], y[i]);
113874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul         PACK_BGR(p, rgba[i][RCOMP], rgba[i][GCOMP], rgba[i][BCOMP]);
1139afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
1140afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
1141afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
1142afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
114374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void
114474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulwrite_monocolor_pixels_RGB( const GLcontext *ctx,
114574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul                            GLuint n, const GLint x[], const GLint y[],
114674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul                            const GLchan color[4], const GLubyte mask[] )
1147afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
1148c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul   const OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
1149afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLuint i;
115074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   for (i = 0; i < n; i++) {
1151afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      if (mask[i]) {
115274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul         GLchan *p = PIXELADDR3(x[i], y[i]);
115374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul         PACK_RGB(p, color[RCOMP], color[GCOMP], color[BCOMP]);
1154afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
1155afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
1156afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
1157afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
115874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void
115974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulwrite_monocolor_pixels_BGR( const GLcontext *ctx,
116074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul                            GLuint n, const GLint x[], const GLint y[],
116174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul                            const GLchan color[4], const GLubyte mask[] )
1162afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
116374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   const OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
116474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   GLuint i;
116574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   for (i = 0; i < n; i++) {
116674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      if (mask[i]) {
116774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul         GLchan *p = PIXELADDR3(x[i], y[i]);
116874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul         PACK_BGR(p, color[RCOMP], color[GCOMP], color[BCOMP]);
116974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      }
117074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   }
117174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul}
117274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul
117374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void
117474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulread_rgba_span3( const GLcontext *ctx, GLuint n, GLint x, GLint y,
117574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul                 GLchan rgba[][4] )
117674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul{
117774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   const OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
1178afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLuint i;
117974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   const GLchan *p = PIXELADDR3(x, y);
118074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   for (i = 0; i < n; i++, p += 3) {
118174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      rgba[i][RCOMP] = UNPACK_RED(p);
118274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      rgba[i][GCOMP] = UNPACK_GREEN(p);
118374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      rgba[i][BCOMP] = UNPACK_BLUE(p);
118474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      rgba[i][ACOMP] = 255;
1185afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
1186afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
1187afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
118874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void
118974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulread_rgba_pixels3( const GLcontext *ctx,
119074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul                   GLuint n, const GLint x[], const GLint y[],
119174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul                   GLchan rgba[][4], const GLubyte mask[] )
1192afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
119374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   const OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
1194afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLuint i;
119574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   for (i = 0; i < n; i++) {
1196afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      if (mask[i]) {
119774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul         const GLchan *p = PIXELADDR3(x[i], y[i]);
119874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul         rgba[i][RCOMP] = UNPACK_RED(p);
119974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul         rgba[i][GCOMP] = UNPACK_GREEN(p);
120074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul         rgba[i][BCOMP] = UNPACK_BLUE(p);
120174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul         rgba[i][ACOMP] = 255;
1202afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
1203afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
1204afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
1205afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1206afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1207afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/**********************************************************************/
1208afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/*****        Read/write spans/arrays of CI pixels                *****/
1209afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/**********************************************************************/
1210afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1211afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/* Write 32-bit color index to buffer */
121274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void
121374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulwrite_index32_span( const GLcontext *ctx, GLuint n, GLint x, GLint y,
121474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul                    const GLuint index[], const GLubyte mask[] )
1215afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
121674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   const OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
121774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   GLchan *ptr1 = PIXELADDR1(x, y);
1218afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLuint i;
1219afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   if (mask) {
1220afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      for (i=0;i<n;i++,ptr1++) {
1221afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         if (mask[i]) {
122274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul            *ptr1 = (GLchan) index[i];
1223afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         }
1224afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
1225afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
1226afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   else {
1227afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      for (i=0;i<n;i++,ptr1++) {
122874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul         *ptr1 = (GLchan) index[i];
1229afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
1230afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
1231afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
1232afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1233afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1234afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/* Write 8-bit color index to buffer */
123574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void
123674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulwrite_index8_span( const GLcontext *ctx, GLuint n, GLint x, GLint y,
123774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul                   const GLubyte index[], const GLubyte mask[] )
1238afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
123974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   const OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
124074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   GLchan *ptr1 = PIXELADDR1(x, y);
1241afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLuint i;
1242afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   if (mask) {
1243afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      for (i=0;i<n;i++,ptr1++) {
1244afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         if (mask[i]) {
124574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul            *ptr1 = (GLchan) index[i];
1246afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         }
1247afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
1248afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
1249afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   else {
125074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      MEMCPY(ptr1, index, n * sizeof(GLchan));
1251afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
1252afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
1253afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1254afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
125574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void
125674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulwrite_monoindex_span( const GLcontext *ctx, GLuint n, GLint x, GLint y,
125774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul                      GLuint colorIndex, const GLubyte mask[] )
1258afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
125974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   const OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
126074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   GLchan *ptr1 = PIXELADDR1(x, y);
1261afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLuint i;
1262afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   for (i=0;i<n;i++,ptr1++) {
1263afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      if (mask[i]) {
126474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul         *ptr1 = (GLchan) colorIndex;
1265afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
1266afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
1267afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
1268afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1269afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
127074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void
127174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulwrite_index_pixels( const GLcontext *ctx,
127274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul                    GLuint n, const GLint x[], const GLint y[],
127374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul                    const GLuint index[], const GLubyte mask[] )
1274afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
127574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   const OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
1276afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLuint i;
1277afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   for (i=0;i<n;i++) {
1278afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      if (mask[i]) {
127974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul         GLchan *ptr1 = PIXELADDR1(x[i], y[i]);
128074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul         *ptr1 = (GLchan) index[i];
1281afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
1282afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
1283afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
1284afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1285afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
128674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void
128774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulwrite_monoindex_pixels( const GLcontext *ctx,
128874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul                        GLuint n, const GLint x[], const GLint y[],
128974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul                        GLuint colorIndex, const GLubyte mask[] )
1290afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
129174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   const OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
1292afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLuint i;
1293afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   for (i=0;i<n;i++) {
1294afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      if (mask[i]) {
129574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul         GLchan *ptr1 = PIXELADDR1(x[i], y[i]);
129674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul         *ptr1 = (GLchan) colorIndex;
1297afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
1298afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
1299afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
1300afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1301afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
130274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void
130374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulread_index_span( const GLcontext *ctx,
130474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul                 GLuint n, GLint x, GLint y, GLuint index[] )
1305afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
130674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   const OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
1307afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLuint i;
130874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   const GLchan *ptr1 = (const GLchan *) PIXELADDR1(x, y);
1309afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   for (i=0;i<n;i++,ptr1++) {
1310afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      index[i] = (GLuint) *ptr1;
1311afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
1312afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
1313afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1314afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
131574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void
131674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulread_index_pixels( const GLcontext *ctx,
131774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul                   GLuint n, const GLint x[], const GLint y[],
131874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul                   GLuint index[], const GLubyte mask[] )
1319afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
132074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   const OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
1321afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLuint i;
1322afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   for (i=0;i<n;i++) {
1323afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      if (mask[i] ) {
132474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul         const GLchan *ptr1 = PIXELADDR1(x[i], y[i]);
1325afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         index[i] = (GLuint) *ptr1;
1326afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
1327afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
1328afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
1329afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1330afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1331afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1332afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/**********************************************************************/
1333afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/*****                   Optimized line rendering                 *****/
1334afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/**********************************************************************/
1335afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1336afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1337afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/*
1338afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Draw a flat-shaded, RGB line into an osmesa buffer.
1339afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */
134074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void
134174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulflat_rgba_line( GLcontext *ctx, const SWvertex *vert0, const SWvertex *vert1 )
1342afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
134374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   const OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
134474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   const GLchan *color = vert0->color;
1345afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1346afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#define INTERP_XY 1
1347afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#define CLIP_HACK 1
134874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul#define PLOT(X, Y)						\
134974b493a5e61237de081a438e774e5d8139d4c6b7Brian Pauldo {								\
135074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   GLchan *p = PIXELADDR4(X, Y);				\
135174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   PACK_RGBA(p, color[0], color[1], color[2], color[3]);	\
135274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul} while (0)
1353afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1354afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#ifdef WIN32
1355724abeb058ca9372c5a9b9e38ee43dde1accaa41Keith Whitwell#include "..\swrast\s_linetemp.h"
1356afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#else
1357724abeb058ca9372c5a9b9e38ee43dde1accaa41Keith Whitwell#include "swrast/s_linetemp.h"
1358afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#endif
1359afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
1360afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1361afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1362afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/*
1363afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Draw a flat-shaded, Z-less, RGB line into an osmesa buffer.
1364afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */
136574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void
136674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulflat_rgba_z_line(GLcontext *ctx, const SWvertex *vert0, const SWvertex *vert1)
1367afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
136874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   const OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
136974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   const GLchan *color = vert0->color;
1370afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1371afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#define INTERP_XY 1
1372afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#define INTERP_Z 1
1373ed30dfa1264ec8875a3162c3c8778bc703bf11d5Brian Paul#define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE
1374afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#define CLIP_HACK 1
137574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul#define PLOT(X, Y)					\
137674b493a5e61237de081a438e774e5d8139d4c6b7Brian Pauldo {							\
137774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   if (Z < *zPtr) {					\
137874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      GLchan *p = PIXELADDR4(X, Y);			\
137974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      PACK_RGBA(p, color[RCOMP], color[GCOMP],		\
138074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul                   color[BCOMP], color[ACOMP]);		\
138174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      *zPtr = Z;					\
138274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   }							\
138374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul} while (0)
138474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul
1385afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1386afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#ifdef WIN32
1387724abeb058ca9372c5a9b9e38ee43dde1accaa41Keith Whitwell#include "..\swrast\s_linetemp.h"
1388afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#else
1389724abeb058ca9372c5a9b9e38ee43dde1accaa41Keith Whitwell#include "swrast/s_linetemp.h"
1390afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#endif
1391afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
1392afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1393afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1394afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/*
1395afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Draw a flat-shaded, alpha-blended, RGB line into an osmesa buffer.
139674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul * XXX update for GLchan
1397afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */
139874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void
139974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulflat_blend_rgba_line( GLcontext *ctx,
140074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul                      const SWvertex *vert0, const SWvertex *vert1 )
1401afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
140274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   const OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
140374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   const GLint rshift = osmesa->rshift;
140474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   const GLint gshift = osmesa->gshift;
140574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   const GLint bshift = osmesa->bshift;
140674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   const GLint avalue = vert0->color[3];
140774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   const GLint msavalue = 255 - avalue;
140874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   const GLint rvalue = vert0->color[0]*avalue;
140974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   const GLint gvalue = vert0->color[1]*avalue;
141074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   const GLint bvalue = vert0->color[2]*avalue;
1411afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1412afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#define INTERP_XY 1
1413afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#define CLIP_HACK 1
1414afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#define PLOT(X,Y)					\
141574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   { GLuint *ptr4 = (GLuint *) PIXELADDR4(X, Y);		\
14167e67fb41fb54e050f6983b4de09ed3a317d6148fBrian Paul     GLuint  pixel = 0;					\
1417afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg     pixel |=((((((*ptr4) >> rshift) & 0xff)*msavalue+rvalue)>>8) << rshift);\
1418afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg     pixel |=((((((*ptr4) >> gshift) & 0xff)*msavalue+gvalue)>>8) << gshift);\
1419afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg     pixel |=((((((*ptr4) >> bshift) & 0xff)*msavalue+bvalue)>>8) << bshift);\
14207e67fb41fb54e050f6983b4de09ed3a317d6148fBrian Paul     *ptr4 = pixel;					\
1421afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
1422afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1423afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#ifdef WIN32
1424724abeb058ca9372c5a9b9e38ee43dde1accaa41Keith Whitwell#include "..\swrast\s_linetemp.h"
1425afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#else
1426724abeb058ca9372c5a9b9e38ee43dde1accaa41Keith Whitwell#include "swrast/s_linetemp.h"
1427afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#endif
1428afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
1429afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1430ed30dfa1264ec8875a3162c3c8778bc703bf11d5Brian Paul
1431afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/*
1432afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Draw a flat-shaded, Z-less, alpha-blended, RGB line into an osmesa buffer.
143374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul * XXX update for GLchan
1434afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */
143574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void
143674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulflat_blend_rgba_z_line( GLcontext *ctx,
143774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul                        const SWvertex *vert0, const SWvertex *vert1 )
1438afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
143974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   const OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
144074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   const GLint rshift = osmesa->rshift;
144174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   const GLint gshift = osmesa->gshift;
144274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   const GLint bshift = osmesa->bshift;
144374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   const GLint avalue = vert0->color[3];
144474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   const GLint msavalue = 256 - avalue;
144574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   const GLint rvalue = vert0->color[0]*avalue;
144674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   const GLint gvalue = vert0->color[1]*avalue;
144774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   const GLint bvalue = vert0->color[2]*avalue;
1448afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1449afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#define INTERP_XY 1
1450afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#define INTERP_Z 1
1451ed30dfa1264ec8875a3162c3c8778bc703bf11d5Brian Paul#define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE
1452afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#define CLIP_HACK 1
14537e67fb41fb54e050f6983b4de09ed3a317d6148fBrian Paul#define PLOT(X,Y)							\
14547e67fb41fb54e050f6983b4de09ed3a317d6148fBrian Paul	if (Z < *zPtr) {						\
145574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul	   GLuint *ptr4 = (GLuint *) PIXELADDR4(X, Y);			\
14567e67fb41fb54e050f6983b4de09ed3a317d6148fBrian Paul	   GLuint  pixel = 0;						\
1457ed30dfa1264ec8875a3162c3c8778bc703bf11d5Brian Paul	   pixel |=((((((*ptr4) >> rshift) & 0xff)*msavalue+rvalue)>>8) << rshift);	\
1458ed30dfa1264ec8875a3162c3c8778bc703bf11d5Brian Paul	   pixel |=((((((*ptr4) >> gshift) & 0xff)*msavalue+gvalue)>>8) << gshift);	\
1459ed30dfa1264ec8875a3162c3c8778bc703bf11d5Brian Paul	   pixel |=((((((*ptr4) >> bshift) & 0xff)*msavalue+bvalue)>>8) << bshift);	\
14607e67fb41fb54e050f6983b4de09ed3a317d6148fBrian Paul	   *ptr4 = pixel; 						\
1461afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	}
1462afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1463afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#ifdef WIN32
1464724abeb058ca9372c5a9b9e38ee43dde1accaa41Keith Whitwell#include "..\swrast\s_linetemp.h"
1465afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#else
1466724abeb058ca9372c5a9b9e38ee43dde1accaa41Keith Whitwell#include "swrast/s_linetemp.h"
1467afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#endif
1468afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
1469afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1470ed30dfa1264ec8875a3162c3c8778bc703bf11d5Brian Paul
1471afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/*
1472afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Draw a flat-shaded, Z-less, alpha-blended, RGB line into an osmesa buffer.
147374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul * XXX update for GLchan
1474afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */
147574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void
147674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulflat_blend_rgba_z_line_write( GLcontext *ctx,
147774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul                              const SWvertex *vert0, const SWvertex *vert1 )
1478afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
147974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   const OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
148074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   const GLint rshift = osmesa->rshift;
148174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   const GLint gshift = osmesa->gshift;
148274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   const GLint bshift = osmesa->bshift;
148374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   const GLint avalue = vert0->color[3];
148474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   const GLint msavalue = 256 - avalue;
148574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   const GLint rvalue = vert0->color[0]*avalue;
148674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   const GLint gvalue = vert0->color[1]*avalue;
148774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   const GLint bvalue = vert0->color[2]*avalue;
1488afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1489afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#define INTERP_XY 1
1490afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#define INTERP_Z 1
1491ed30dfa1264ec8875a3162c3c8778bc703bf11d5Brian Paul#define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE
1492afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#define CLIP_HACK 1
14937e67fb41fb54e050f6983b4de09ed3a317d6148fBrian Paul#define PLOT(X,Y)							\
14947e67fb41fb54e050f6983b4de09ed3a317d6148fBrian Paul	if (Z < *zPtr) {						\
149574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul	   GLuint *ptr4 = (GLuint *) PIXELADDR4(X, Y);			\
14967e67fb41fb54e050f6983b4de09ed3a317d6148fBrian Paul	   GLuint  pixel = 0;						\
1497ed30dfa1264ec8875a3162c3c8778bc703bf11d5Brian Paul	   pixel |=((((((*ptr4) >> rshift) & 0xff)*msavalue+rvalue)>>8) << rshift);	\
1498ed30dfa1264ec8875a3162c3c8778bc703bf11d5Brian Paul	   pixel |=((((((*ptr4) >> gshift) & 0xff)*msavalue+gvalue)>>8) << gshift);	\
1499ed30dfa1264ec8875a3162c3c8778bc703bf11d5Brian Paul	   pixel |=((((((*ptr4) >> bshift) & 0xff)*msavalue+bvalue)>>8) << bshift);	\
15007e67fb41fb54e050f6983b4de09ed3a317d6148fBrian Paul	   *ptr4 = pixel;						\
15017e67fb41fb54e050f6983b4de09ed3a317d6148fBrian Paul	   *zPtr = Z;							\
1502afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	}
1503afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1504afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#ifdef WIN32
1505724abeb058ca9372c5a9b9e38ee43dde1accaa41Keith Whitwell#include "..\swrast\s_linetemp.h"
1506afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#else
1507724abeb058ca9372c5a9b9e38ee43dde1accaa41Keith Whitwell#include "swrast/s_linetemp.h"
1508afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#endif
1509afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
1510afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1511afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1512afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/*
1513afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Analyze context state to see if we can provide a fast line drawing
1514afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * function, like those in lines.c.  Otherwise, return NULL.
1515afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */
1516dbd1e2b5990a3689bf718296c57c14fc3ba38db5Jouk Jansenstatic swrast_line_func
15171e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwellosmesa_choose_line_function( GLcontext *ctx )
1518afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
151974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   const OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
152074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   const SWcontext *swrast = SWRAST_CONTEXT(ctx);
1521afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
152274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   if (CHAN_BITS != 8)                    return NULL;
15232d595d70202bad560c27ea81ec71b740415b3355Brian Paul   if (ctx->RenderMode != GL_RENDER)      return NULL;
1524afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   if (ctx->Line.SmoothFlag)              return NULL;
15252d595d70202bad560c27ea81ec71b740415b3355Brian Paul   if (ctx->Texture._ReallyEnabled)       return NULL;
152674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   if (ctx->Light.ShadeModel != GL_FLAT)  return NULL;
152774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   if (ctx->Line.Width != 1.0F)           return NULL;
152874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   if (ctx->Line.StippleFlag)             return NULL;
152974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   if (ctx->Line.SmoothFlag)              return NULL;
153074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   if (osmesa->format != OSMESA_RGBA &&
153174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul       osmesa->format != OSMESA_BGRA &&
153274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul       osmesa->format != OSMESA_ARGB)     return NULL;
153374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul
153474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   if (swrast->_RasterMask==DEPTH_BIT
153574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul       && ctx->Depth.Func==GL_LESS
153674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul       && ctx->Depth.Mask==GL_TRUE
153774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul       && ctx->Visual.depthBits == DEFAULT_SOFTWARE_DEPTH_BITS) {
153874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      return flat_rgba_z_line;
153974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   }
154074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul
154174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   if (swrast->_RasterMask == 0) {
154274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      return flat_rgba_line;
154374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   }
154474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul
154574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   if (swrast->_RasterMask==(DEPTH_BIT|BLEND_BIT)
154674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul       && ctx->Depth.Func==GL_LESS
154774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul       && ctx->Depth.Mask==GL_TRUE
154874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul       && ctx->Visual.depthBits == DEFAULT_SOFTWARE_DEPTH_BITS
154974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul       && ctx->Color.BlendSrcRGB==GL_SRC_ALPHA
155074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul       && ctx->Color.BlendDstRGB==GL_ONE_MINUS_SRC_ALPHA
155174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul       && ctx->Color.BlendSrcA==GL_SRC_ALPHA
155274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul       && ctx->Color.BlendDstA==GL_ONE_MINUS_SRC_ALPHA
155374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul       && ctx->Color.BlendEquation==GL_FUNC_ADD_EXT) {
155474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      return flat_blend_rgba_z_line_write;
155574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   }
155674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul
155774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   if (swrast->_RasterMask==(DEPTH_BIT|BLEND_BIT)
155874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul       && ctx->Depth.Func==GL_LESS
155974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul       && ctx->Depth.Mask==GL_FALSE
156074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul       && ctx->Visual.depthBits == DEFAULT_SOFTWARE_DEPTH_BITS
156174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul       && ctx->Color.BlendSrcRGB==GL_SRC_ALPHA
156274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul       && ctx->Color.BlendDstRGB==GL_ONE_MINUS_SRC_ALPHA
156374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul       && ctx->Color.BlendSrcA==GL_SRC_ALPHA
156474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul       && ctx->Color.BlendDstA==GL_ONE_MINUS_SRC_ALPHA
156574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul       && ctx->Color.BlendEquation==GL_FUNC_ADD_EXT) {
156674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      return flat_blend_rgba_z_line;
156774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   }
1568afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
156974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   if (swrast->_RasterMask==BLEND_BIT
157074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul       && ctx->Color.BlendSrcRGB==GL_SRC_ALPHA
157174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul       && ctx->Color.BlendDstRGB==GL_ONE_MINUS_SRC_ALPHA
157274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul       && ctx->Color.BlendSrcA==GL_SRC_ALPHA
157374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul       && ctx->Color.BlendDstA==GL_ONE_MINUS_SRC_ALPHA
157474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul       && ctx->Color.BlendEquation==GL_FUNC_ADD_EXT) {
157574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      return flat_blend_rgba_line;
1576afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
157774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul
1578afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   return NULL;
1579afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
1580afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1581afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1582afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/**********************************************************************/
1583afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/*****                 Optimized triangle rendering               *****/
1584afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/**********************************************************************/
1585afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1586afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1587afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/*
1588afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Smooth-shaded, z-less triangle, RGBA color.
1589afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */
1590dbd1e2b5990a3689bf718296c57c14fc3ba38db5Jouk Jansenstatic void smooth_rgba_z_triangle( GLcontext *ctx,
1591a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul				    const SWvertex *v0,
1592a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul                                    const SWvertex *v1,
1593a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul                                    const SWvertex *v2 )
1594afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
159574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   const OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
159623ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank
1597afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#define INTERP_Z 1
1598ed30dfa1264ec8875a3162c3c8778bc703bf11d5Brian Paul#define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE
1599afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#define INTERP_RGB 1
1600afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#define INTERP_ALPHA 1
1601afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#define INNER_LOOP( LEFT, RIGHT, Y )				\
1602afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{								\
1603afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLint i, len = RIGHT-LEFT;					\
160474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   GLchan *img = PIXELADDR4(LEFT, Y); 				\
160574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   for (i = 0; i < len; i++, img += 4) {			\
1606afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      GLdepth z = FixedToDepth(ffz);				\
1607afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      if (z < zRow[i]) {					\
160874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul         PACK_RGBA(img, FixedToInt(ffr), FixedToInt(ffg),	\
160974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul		        FixedToInt(ffb), FixedToInt(ffa));	\
1610afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         zRow[i] = z;						\
1611afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }								\
1612afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      ffr += fdrdx;  ffg += fdgdx;  ffb += fdbdx;  ffa += fdadx;\
1613afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      ffz += fdzdx;						\
1614afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }								\
1615afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
1616afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#ifdef WIN32
1617724abeb058ca9372c5a9b9e38ee43dde1accaa41Keith Whitwell#include "..\swrast\s_tritemp.h"
1618afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#else
1619724abeb058ca9372c5a9b9e38ee43dde1accaa41Keith Whitwell#include "swrast/s_tritemp.h"
1620afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#endif
1621afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
1622afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1623afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1624afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1625afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1626afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/*
1627afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Flat-shaded, z-less triangle, RGBA color.
1628afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */
1629dbd1e2b5990a3689bf718296c57c14fc3ba38db5Jouk Jansenstatic void flat_rgba_z_triangle( GLcontext *ctx,
1630a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul				  const SWvertex *v0,
1631a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul                                  const SWvertex *v1,
1632a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul                                  const SWvertex *v2 )
1633afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
163474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   const OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
1635afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#define INTERP_Z 1
1636ed30dfa1264ec8875a3162c3c8778bc703bf11d5Brian Paul#define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE
163774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul#define SETUP_CODE						\
163874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   GLuint pixel;						\
163974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   PACK_RGBA((GLchan *) &pixel, v0->color[0], v0->color[1],	\
164074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul                                v0->color[2], v0->color[3]);
164174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul
164274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul#define INNER_LOOP( LEFT, RIGHT, Y )			\
164374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul{							\
164474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   GLint i, len = RIGHT-LEFT;				\
164574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   GLuint *img = (GLuint *) PIXELADDR4(LEFT, Y);   	\
164674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   for (i=0;i<len;i++) {				\
164774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      GLdepth z = FixedToDepth(ffz);			\
164874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      if (z < zRow[i]) {				\
164974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul         img[i] = pixel;				\
165074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul         zRow[i] = z;					\
165174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      }							\
165274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      ffz += fdzdx;					\
165374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   }							\
1654afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
1655afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#ifdef WIN32
1656724abeb058ca9372c5a9b9e38ee43dde1accaa41Keith Whitwell#include "..\swrast\s_tritemp.h"
1657afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#else
1658724abeb058ca9372c5a9b9e38ee43dde1accaa41Keith Whitwell#include "swrast/s_tritemp.h"
1659afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#endif
1660afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
1661afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1662afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1663afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1664afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/*
1665afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Return pointer to an accelerated triangle function if possible.
1666afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */
1667dbd1e2b5990a3689bf718296c57c14fc3ba38db5Jouk Jansenstatic swrast_tri_func
16681e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwellosmesa_choose_triangle_function( GLcontext *ctx )
1669afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
167074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   const OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
167174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   const SWcontext *swrast = SWRAST_CONTEXT(ctx);
167274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul
167374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   if (CHAN_BITS != 8)                  return (swrast_tri_func) NULL;
167474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   if (ctx->RenderMode != GL_RENDER)    return (swrast_tri_func) NULL;
167574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   if (ctx->Polygon.SmoothFlag)         return (swrast_tri_func) NULL;
167674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   if (ctx->Polygon.StippleFlag)        return (swrast_tri_func) NULL;
167774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   if (ctx->Texture._ReallyEnabled)     return (swrast_tri_func) NULL;
167874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   if (osmesa->format != OSMESA_RGBA &&
167974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul       osmesa->format != OSMESA_BGRA &&
168074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul       osmesa->format != OSMESA_ARGB)   return (swrast_tri_func) NULL;
168174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul
168274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   if (swrast->_RasterMask == DEPTH_BIT &&
168374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul       ctx->Depth.Func == GL_LESS &&
168474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul       ctx->Depth.Mask == GL_TRUE &&
168574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul       ctx->Visual.depthBits == DEFAULT_SOFTWARE_DEPTH_BITS) {
168674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      if (ctx->Light.ShadeModel == GL_SMOOTH) {
1687afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         return smooth_rgba_z_triangle;
1688afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
1689afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      else {
1690afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         return flat_rgba_z_triangle;
1691afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
1692afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
169374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   return (swrast_tri_func) NULL;
16941e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell}
16951e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell
169674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul
169774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul
16981e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell/* Override for the swrast triangle-selection function.  Try to use one
16991e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell * of our internal triangle functions, otherwise fall back to the
1700dbd1e2b5990a3689bf718296c57c14fc3ba38db5Jouk Jansen * standard swrast functions.
17011e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell */
17021e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwellstatic void osmesa_choose_triangle( GLcontext *ctx )
17031e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell{
17041e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell   SWcontext *swrast = SWRAST_CONTEXT(ctx);
17051e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell
17061e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell   swrast->Triangle = osmesa_choose_triangle_function( ctx );
17071e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell   if (!swrast->Triangle)
17081e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell      _swrast_choose_triangle( ctx );
1709afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
1710afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
17111e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwellstatic void osmesa_choose_line( GLcontext *ctx )
17121e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell{
17131e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell   SWcontext *swrast = SWRAST_CONTEXT(ctx);
17141e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell
17151e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell   swrast->Line = osmesa_choose_line_function( ctx );
17161e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell   if (!swrast->Line)
17171e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell      _swrast_choose_line( ctx );
17181e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell}
17191e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell
17201e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell
17212d595d70202bad560c27ea81ec71b740415b3355Brian Paul#define OSMESA_NEW_LINE   (_NEW_LINE | \
17222d595d70202bad560c27ea81ec71b740415b3355Brian Paul                           _NEW_TEXTURE | \
17232d595d70202bad560c27ea81ec71b740415b3355Brian Paul                           _NEW_LIGHT | \
17242d595d70202bad560c27ea81ec71b740415b3355Brian Paul                           _NEW_DEPTH | \
17252d595d70202bad560c27ea81ec71b740415b3355Brian Paul                           _NEW_RENDERMODE | \
1726dbd1e2b5990a3689bf718296c57c14fc3ba38db5Jouk Jansen                           _SWRAST_NEW_RASTERMASK)
17272d595d70202bad560c27ea81ec71b740415b3355Brian Paul
17282d595d70202bad560c27ea81ec71b740415b3355Brian Paul#define OSMESA_NEW_TRIANGLE (_NEW_POLYGON | \
17292d595d70202bad560c27ea81ec71b740415b3355Brian Paul                             _NEW_TEXTURE | \
17302d595d70202bad560c27ea81ec71b740415b3355Brian Paul                             _NEW_LIGHT | \
17312d595d70202bad560c27ea81ec71b740415b3355Brian Paul                             _NEW_DEPTH | \
17322d595d70202bad560c27ea81ec71b740415b3355Brian Paul                             _NEW_RENDERMODE | \
17332d595d70202bad560c27ea81ec71b740415b3355Brian Paul                             _SWRAST_NEW_RASTERMASK)
17341e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell
17351e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell
1736dbd1e2b5990a3689bf718296c57c14fc3ba38db5Jouk Jansen/* Extend the software rasterizer with our line and triangle
17371e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell * functions.
17381e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell */
17391e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwellstatic void osmesa_register_swrast_functions( GLcontext *ctx )
17401e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell{
17411e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell   SWcontext *swrast = SWRAST_CONTEXT( ctx );
1742dbd1e2b5990a3689bf718296c57c14fc3ba38db5Jouk Jansen
17431e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell   swrast->choose_line = osmesa_choose_line;
17441e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell   swrast->choose_triangle = osmesa_choose_triangle;
1745dbd1e2b5990a3689bf718296c57c14fc3ba38db5Jouk Jansen
17461e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell   swrast->invalidate_line |= OSMESA_NEW_LINE;
17471e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell   swrast->invalidate_triangle |= OSMESA_NEW_TRIANGLE;
17481e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell}
1749ed30dfa1264ec8875a3162c3c8778bc703bf11d5Brian Paul
1750ed30dfa1264ec8875a3162c3c8778bc703bf11d5Brian Paul
1751afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgstatic const GLubyte *get_string( GLcontext *ctx, GLenum name )
1752afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
1753afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   (void) ctx;
1754afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   switch (name) {
1755afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GL_RENDERER:
1756afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         return (const GLubyte *) "Mesa OffScreen";
1757afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      default:
1758afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         return NULL;
1759afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
1760afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
1761afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1762afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1763cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwellstatic void osmesa_update_state( GLcontext *ctx, GLuint new_state )
1764afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
1765c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul   OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
1766709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell   struct swrast_device_driver *swdd = _swrast_GetDeviceDriverReference( ctx );
1767709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell   TNLcontext *tnl = TNL_CONTEXT(ctx);
1768304357dcd496f7ebf499fd9c77b4eba83a75abd5Brian Paul
1769304357dcd496f7ebf499fd9c77b4eba83a75abd5Brian Paul   ASSERT((void *) osmesa == (void *) ctx->DriverCtx);
1770afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
177174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   /*
177274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul    * XXX these function pointers could be initialized just once during
177374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul    * context creation since they don't depend on any state changes.
177474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul    */
177574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul
1776afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   ctx->Driver.GetString = get_string;
1777afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   ctx->Driver.UpdateState = osmesa_update_state;
1778cea0e8e6700e871bb9bcb334cb75fbfbfcdfd702Brian Paul   ctx->Driver.SetDrawBuffer = set_draw_buffer;
1779a81b3532f7c984878ba1d4b38f796abf731f76b1Brian Paul   ctx->Driver.ResizeBuffersMESA = _swrast_alloc_buffers;
1780a81b3532f7c984878ba1d4b38f796abf731f76b1Brian Paul   ctx->Driver.GetBufferSize = buffer_size;
1781a81b3532f7c984878ba1d4b38f796abf731f76b1Brian Paul
17825c1e7fa6ee72f4403d9ec9d12830dd689b966e71Keith Whitwell   ctx->Driver.Accum = _swrast_Accum;
17835c1e7fa6ee72f4403d9ec9d12830dd689b966e71Keith Whitwell   ctx->Driver.Bitmap = _swrast_Bitmap;
1784afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   ctx->Driver.Clear = clear;
17855c1e7fa6ee72f4403d9ec9d12830dd689b966e71Keith Whitwell   ctx->Driver.CopyPixels = _swrast_CopyPixels;
17865c1e7fa6ee72f4403d9ec9d12830dd689b966e71Keith Whitwell   ctx->Driver.DrawPixels = _swrast_DrawPixels;
17875c1e7fa6ee72f4403d9ec9d12830dd689b966e71Keith Whitwell   ctx->Driver.ReadPixels = _swrast_ReadPixels;
1788afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
17898e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul   ctx->Driver.TexImage1D = _mesa_store_teximage1d;
17908e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul   ctx->Driver.TexImage2D = _mesa_store_teximage2d;
17918e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul   ctx->Driver.TexImage3D = _mesa_store_teximage3d;
17928e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul   ctx->Driver.TexSubImage1D = _mesa_store_texsubimage1d;
17938e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul   ctx->Driver.TexSubImage2D = _mesa_store_texsubimage2d;
17948e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul   ctx->Driver.TexSubImage3D = _mesa_store_texsubimage3d;
17958e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul   ctx->Driver.TestProxyTexImage = _mesa_test_proxy_teximage;
17968e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul
1797709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell   ctx->Driver.CopyTexImage1D = _swrast_copy_teximage1d;
1798709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell   ctx->Driver.CopyTexImage2D = _swrast_copy_teximage2d;
1799709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell   ctx->Driver.CopyTexSubImage1D = _swrast_copy_texsubimage1d;
1800709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell   ctx->Driver.CopyTexSubImage2D = _swrast_copy_texsubimage2d;
1801709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell   ctx->Driver.CopyTexSubImage3D = _swrast_copy_texsubimage3d;
1802709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell   ctx->Driver.CopyColorTable = _swrast_CopyColorTable;
1803709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell   ctx->Driver.CopyColorSubTable = _swrast_CopyColorSubTable;
1804709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell   ctx->Driver.CopyConvolutionFilter1D = _swrast_CopyConvolutionFilter1D;
1805709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell   ctx->Driver.CopyConvolutionFilter2D = _swrast_CopyConvolutionFilter2D;
1806709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell
1807afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1808afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   /* RGB(A) span/pixel functions */
180974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   if (osmesa->format == OSMESA_RGB) {
1810709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell      swdd->WriteRGBASpan = write_rgba_span_RGB;
1811709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell      swdd->WriteRGBSpan = write_rgb_span_RGB;
1812709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell      swdd->WriteMonoRGBASpan = write_monocolor_span_RGB;
1813709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell      swdd->WriteRGBAPixels = write_rgba_pixels_RGB;
1814709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell      swdd->WriteMonoRGBAPixels = write_monocolor_pixels_RGB;
1815709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell      swdd->ReadRGBASpan = read_rgba_span3;
1816709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell      swdd->ReadRGBAPixels = read_rgba_pixels3;
181774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   }
181874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   else if (osmesa->format == OSMESA_BGR) {
1819709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell      swdd->WriteRGBASpan = write_rgba_span_BGR;
1820709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell      swdd->WriteRGBSpan = write_rgb_span_BGR;
1821709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell      swdd->WriteMonoRGBASpan = write_monocolor_span_BGR;
1822709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell      swdd->WriteRGBAPixels = write_rgba_pixels_BGR;
1823709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell      swdd->WriteMonoRGBAPixels = write_monocolor_pixels_BGR;
1824709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell      swdd->ReadRGBASpan = read_rgba_span3;
1825709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell      swdd->ReadRGBAPixels = read_rgba_pixels3;
1826afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
1827afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   else {
1828afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      /* 4 bytes / pixel in frame buffer */
1829709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell      swdd->WriteRGBSpan = write_rgb_span;
1830709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell      swdd->WriteRGBAPixels = write_rgba_pixels;
1831709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell      swdd->WriteMonoRGBASpan = write_monocolor_span;
1832709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell      swdd->WriteMonoRGBAPixels = write_monocolor_pixels;
183374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      if (osmesa->format == OSMESA_RGBA &&
183474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul          CHAN_TYPE == GL_UNSIGNED_BYTE &&
183574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul          RCOMP==0 && GCOMP==1 && BCOMP==2 && ACOMP==3) {
183674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul         /* special, fast case */
1837709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell         swdd->WriteRGBASpan = write_rgba_span_rgba;
1838709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell         swdd->ReadRGBASpan = read_rgba_span_rgba;
183974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      }
184074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      else {
1841709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell         swdd->WriteRGBASpan = write_rgba_span;
1842709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell         swdd->ReadRGBASpan = read_rgba_span;
184374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      }
1844709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell      swdd->ReadRGBAPixels = read_rgba_pixels;
1845afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
1846afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1847afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   /* CI span/pixel functions */
1848709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell   swdd->WriteCI32Span = write_index32_span;
1849709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell   swdd->WriteCI8Span = write_index8_span;
1850709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell   swdd->WriteMonoCISpan = write_monoindex_span;
1851709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell   swdd->WriteCI32Pixels = write_index_pixels;
1852709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell   swdd->WriteMonoCIPixels = write_monoindex_pixels;
1853709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell   swdd->ReadCI32Span = read_index_span;
1854709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell   swdd->ReadCI32Pixels = read_index_pixels;
1855709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell
1856709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell   swdd->SetReadBuffer = set_read_buffer;
1857709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell
1858709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell   tnl->Driver.RenderStart = _swsetup_RenderStart;
1859709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell   tnl->Driver.RenderFinish = _swsetup_RenderFinish;
1860709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell   tnl->Driver.BuildProjectedVertices = _swsetup_BuildProjectedVertices;
1861709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell   tnl->Driver.RenderPrimitive = _swsetup_RenderPrimitive;
1862709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell   tnl->Driver.PointsFunc = _swsetup_Points;
1863709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell   tnl->Driver.LineFunc = _swsetup_Line;
1864709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell   tnl->Driver.TriangleFunc = _swsetup_Triangle;
1865709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell   tnl->Driver.QuadFunc = _swsetup_Quad;
1866709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell   tnl->Driver.ResetLineStipple = _swrast_ResetLineStipple;
1867709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell   tnl->Driver.RenderInterp = _swsetup_RenderInterp;
1868709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell   tnl->Driver.RenderCopyPV = _swsetup_RenderCopyPV;
1869709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell   tnl->Driver.RenderClippedLine = _swsetup_RenderClippedLine;
1870709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell   tnl->Driver.RenderClippedPolygon = _swsetup_RenderClippedPolygon;
1871709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell
187223caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell
1873cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   _swrast_InvalidateState( ctx, new_state );
1874cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   _swsetup_InvalidateState( ctx, new_state );
187558e991705392a2e17a1c8b034f4083a0adaf1943Keith Whitwell   _ac_InvalidateState( ctx, new_state );
1876cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   _tnl_InvalidateState( ctx, new_state );
1877afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
1878