osmesa.c revision 206eda8b69ab3c63e9597015189f49d1bda9356f
1206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul/* $Id: osmesa.c,v 1.59 2001/06/27 13:56:17 brianp 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"
497d58f44f73be59bd3583e6dfeedf56c43f7fbd55Brian Paul#include "texformat.h"
508e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul#include "texstore.h"
518e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul#include "array_cache/acache.h"
521e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell#include "swrast/swrast.h"
531e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell#include "swrast_setup/swrast_setup.h"
541e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell#include "swrast/s_context.h"
55724abeb058ca9372c5a9b9e38ee43dde1accaa41Keith Whitwell#include "swrast/s_depth.h"
561e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell#include "swrast/s_lines.h"
571e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell#include "swrast/s_triangle.h"
589bf68ad963ba92b5d1e725f965979042495a5313Brian Paul#include "swrast/s_trispan.h"
595a9026c65d260dc185e072163999f5d810015108Brian Paul#include "tnl/tnl.h"
60709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell#include "tnl/t_context.h"
61bc69de5f21ebb4d6e1c65bf5652d17a9fc87dda7Keith Whitwell#include "tnl/t_pipeline.h"
62afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
63724abeb058ca9372c5a9b9e38ee43dde1accaa41Keith Whitwell
64724abeb058ca9372c5a9b9e38ee43dde1accaa41Keith Whitwell
65304357dcd496f7ebf499fd9c77b4eba83a75abd5Brian Paul/*
66304357dcd496f7ebf499fd9c77b4eba83a75abd5Brian Paul * This is the OS/Mesa context struct.
67304357dcd496f7ebf499fd9c77b4eba83a75abd5Brian Paul * Notice how it includes a GLcontext.  By doing this we're mimicking
68304357dcd496f7ebf499fd9c77b4eba83a75abd5Brian Paul * C++ inheritance/derivation.
69304357dcd496f7ebf499fd9c77b4eba83a75abd5Brian Paul * Later, we can cast a GLcontext pointer into an OSMesaContext pointer
70304357dcd496f7ebf499fd9c77b4eba83a75abd5Brian Paul * or vice versa.
71304357dcd496f7ebf499fd9c77b4eba83a75abd5Brian Paul */
72afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgstruct osmesa_context {
73304357dcd496f7ebf499fd9c77b4eba83a75abd5Brian Paul   GLcontext gl_ctx;		/* The core GL/Mesa context */
74afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLvisual *gl_visual;		/* Describes the buffers */
75afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLframebuffer *gl_buffer;	/* Depth, stencil, accum, etc buffers */
76afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLenum format;		/* either GL_RGBA or GL_COLOR_INDEX */
77afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   void *buffer;		/* the image buffer */
78afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLint width, height;		/* size of image buffer */
79afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLint rowlength;		/* number of pixels per row */
80afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLint userRowLength;		/* user-specified number of pixels per row */
81afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLint rshift, gshift;	/* bit shifts for RGBA formats */
82afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLint bshift, ashift;
8374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   GLint rInd, gInd, bInd, aInd;/* index offsets for RGBA formats */
8474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   GLchan *rowaddr[MAX_HEIGHT];	/* address of first pixel in each image row */
85afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLboolean yup;		/* TRUE  -> Y increases upward */
86afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg				/* FALSE -> Y increases downward */
87afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg};
88afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
89afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
90afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
91afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/* A forward declaration: */
92cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwellstatic void osmesa_update_state( GLcontext *ctx, GLuint newstate );
931e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwellstatic void osmesa_register_swrast_functions( GLcontext *ctx );
94afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
95afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
96afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
97c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul#define OSMESA_CONTEXT(ctx)  ((OSMesaContext) (ctx->DriverCtx))
98c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul
99c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul
100c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul
101afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/**********************************************************************/
102afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/*****                    Public Functions                        *****/
103afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/**********************************************************************/
104afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
105afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
106afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/*
107afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Create an Off-Screen Mesa rendering context.  The only attribute needed is
108afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * an RGBA vs Color-Index mode flag.
109afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg *
110afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Input:  format - either GL_RGBA or GL_COLOR_INDEX
111afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg *         sharelist - specifies another OSMesaContext with which to share
112afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg *                     display lists.  NULL indicates no sharing.
113afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Return:  an OSMesaContext or 0 if error
114afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */
115d3c070ca6a36daa765b1ad7f44e03e6671ad0490Brian PaulOSMesaContext GLAPIENTRY
116d3c070ca6a36daa765b1ad7f44e03e6671ad0490Brian PaulOSMesaCreateContext( GLenum format, OSMesaContext sharelist )
117afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
1182bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul   return OSMesaCreateContextExt(format, DEFAULT_SOFTWARE_DEPTH_BITS,
1192bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul                                 8, 16, sharelist);
1202bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul}
1212bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul
1222bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul
1232bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul
1242bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul/*
1252bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul * New in Mesa 3.5
1262bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul *
1272bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul * Create context and specify size of ancillary buffers.
1282bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul */
1292bf5d9470d3232763cb49b5589209940d4d5398dBrian PaulOSMesaContext GLAPIENTRY
1302bf5d9470d3232763cb49b5589209940d4d5398dBrian PaulOSMesaCreateContextExt( GLenum format, GLint depthBits, GLint stencilBits,
1312bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul                        GLint accumBits, OSMesaContext sharelist )
1322bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul{
133afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   OSMesaContext osmesa;
134afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLint rshift, gshift, bshift, ashift;
13574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   GLint rind, gind, bind, aind;
1362780ed4b978b32a08be6eecb0e923250e7b907eeBrian Paul   GLint indexBits = 0, redBits = 0, greenBits = 0, blueBits = 0, alphaBits =0;
137afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLboolean rgbmode;
138afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLboolean swalpha;
13974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   const GLuint i4 = 1;
14074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   const GLubyte *i1 = (GLubyte *) &i4;
14174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   const GLint little_endian = *i1;
142afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
143afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   swalpha = GL_FALSE;
14474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   rind = gind = bind = aind = 0;
145afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   if (format==OSMESA_COLOR_INDEX) {
146afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      indexBits = 8;
147afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      rshift = gshift = bshift = ashift = 0;
148afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      rgbmode = GL_FALSE;
149afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
150afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   else if (format==OSMESA_RGBA) {
151afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      indexBits = 0;
15201915e90e6912f06d43d443a09157f7bbc96ddc5Brian Paul      redBits = CHAN_BITS;
15301915e90e6912f06d43d443a09157f7bbc96ddc5Brian Paul      greenBits = CHAN_BITS;
15401915e90e6912f06d43d443a09157f7bbc96ddc5Brian Paul      blueBits = CHAN_BITS;
15501915e90e6912f06d43d443a09157f7bbc96ddc5Brian Paul      alphaBits = CHAN_BITS;
15674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      rind = 0;
15774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      gind = 1;
15874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      bind = 2;
15974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      aind = 3;
160afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      if (little_endian) {
161afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         rshift = 0;
162afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         gshift = 8;
163afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         bshift = 16;
164afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         ashift = 24;
165afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
166afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      else {
167afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         rshift = 24;
168afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         gshift = 16;
169afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         bshift = 8;
170afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         ashift = 0;
171afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
172afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      rgbmode = GL_TRUE;
173afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
174afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   else if (format==OSMESA_BGRA) {
175afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      indexBits = 0;
17601915e90e6912f06d43d443a09157f7bbc96ddc5Brian Paul      redBits = CHAN_BITS;
17701915e90e6912f06d43d443a09157f7bbc96ddc5Brian Paul      greenBits = CHAN_BITS;
17801915e90e6912f06d43d443a09157f7bbc96ddc5Brian Paul      blueBits = CHAN_BITS;
17901915e90e6912f06d43d443a09157f7bbc96ddc5Brian Paul      alphaBits = CHAN_BITS;
18074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      rind = 2;
18174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      gind = 1;
18274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      bind = 0;
18374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      aind = 3;
184afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      if (little_endian) {
185afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         ashift = 0;
186afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         rshift = 8;
187afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         gshift = 16;
188afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         bshift = 24;
189afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
190afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      else {
191afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         bshift = 24;
192afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         gshift = 16;
193afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         rshift = 8;
194afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         ashift = 0;
195afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
196afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      rgbmode = GL_TRUE;
197afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
198afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   else if (format==OSMESA_ARGB) {
199afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      indexBits = 0;
20001915e90e6912f06d43d443a09157f7bbc96ddc5Brian Paul      redBits = CHAN_BITS;
20101915e90e6912f06d43d443a09157f7bbc96ddc5Brian Paul      greenBits = CHAN_BITS;
20201915e90e6912f06d43d443a09157f7bbc96ddc5Brian Paul      blueBits = CHAN_BITS;
20301915e90e6912f06d43d443a09157f7bbc96ddc5Brian Paul      alphaBits = CHAN_BITS;
20474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      rind = 1;
20574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      gind = 2;
20674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      bind = 3;
20774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      aind = 0;
208afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      if (little_endian) {
209afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         bshift = 0;
210afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         gshift = 8;
211afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         rshift = 16;
212afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         ashift = 24;
213afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
214afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      else {
215afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         ashift = 24;
216afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         rshift = 16;
217afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         gshift = 8;
218afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         bshift = 0;
219afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
220afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      rgbmode = GL_TRUE;
221afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
222afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   else if (format==OSMESA_RGB) {
223afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      indexBits = 0;
22401915e90e6912f06d43d443a09157f7bbc96ddc5Brian Paul      redBits = CHAN_BITS;
22501915e90e6912f06d43d443a09157f7bbc96ddc5Brian Paul      greenBits = CHAN_BITS;
22601915e90e6912f06d43d443a09157f7bbc96ddc5Brian Paul      blueBits = CHAN_BITS;
227afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      alphaBits = 0;
228afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      bshift = 0;
229afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      gshift = 8;
230afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      rshift = 16;
231afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      ashift = 24;
232afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      rind = 0;
23374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      gind = 1;
23474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      bind = 2;
235afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      rgbmode = GL_TRUE;
236afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      swalpha = GL_TRUE;
237afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
238afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   else if (format==OSMESA_BGR) {
239afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      indexBits = 0;
24001915e90e6912f06d43d443a09157f7bbc96ddc5Brian Paul      redBits = CHAN_BITS;
24101915e90e6912f06d43d443a09157f7bbc96ddc5Brian Paul      greenBits = CHAN_BITS;
24201915e90e6912f06d43d443a09157f7bbc96ddc5Brian Paul      blueBits = CHAN_BITS;
243afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      alphaBits = 0;
244afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      bshift = 0;
245afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      gshift = 8;
246afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      rshift = 16;
247afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      ashift = 24;
248afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      rind = 2;
24974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      gind = 1;
25074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      bind = 0;
251afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      rgbmode = GL_TRUE;
252afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      swalpha = GL_TRUE;
253afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
254206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul   else if (format==OSMESA_RGB_565) {
255206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul      indexBits = 0;
256206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul      redBits = 5;
257206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul      greenBits = 6;
258206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul      blueBits = 5;
259206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul      alphaBits = 0;
260206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul      rshift = 11;
261206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul      gshift = 5;
262206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul      bshift = 0;
263206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul      ashift = 0;
264206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul      rind = 0; /* not used */
265206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul      gind = 0;
266206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul      bind = 0;
267206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul      rgbmode = GL_TRUE;
268206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul      swalpha = GL_FALSE;
269206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul   }
270afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   else {
271afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      return NULL;
272afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
273afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
274afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
275bd5cdaf4442872d3cd2ff94eeafadd481d27fcfbBrian Paul   osmesa = (OSMesaContext) CALLOC_STRUCT(osmesa_context);
276afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   if (osmesa) {
2772bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul      osmesa->gl_visual = _mesa_create_visual( rgbmode,
2782bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul                                               GL_FALSE,    /* double buffer */
2792bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul                                               GL_FALSE,    /* stereo */
2802bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul                                               redBits,
2812bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul                                               greenBits,
2822bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul                                               blueBits,
2832bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul                                               alphaBits,
2842bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul                                               indexBits,
2852bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul                                               depthBits,
2862bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul                                               stencilBits,
2872bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul                                               accumBits,
2882bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul                                               accumBits,
2892bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul                                               accumBits,
2902bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul                                               alphaBits ? accumBits : 0,
2912bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul                                               1            /* num samples */
2922bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul                                               );
293afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      if (!osmesa->gl_visual) {
294941dcc797e1a6317808c1ec43476817286d576baBrian Paul         FREE(osmesa);
295afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         return NULL;
296afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
297afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
298df81387dfae199a71bc55138ea5856dc05eacf24Brian Paul      if (!_mesa_initialize_context(&osmesa->gl_ctx,
299df81387dfae199a71bc55138ea5856dc05eacf24Brian Paul                                    osmesa->gl_visual,
300df81387dfae199a71bc55138ea5856dc05eacf24Brian Paul                                    sharelist ? &sharelist->gl_ctx
301df81387dfae199a71bc55138ea5856dc05eacf24Brian Paul                                              : (GLcontext *) NULL,
302df81387dfae199a71bc55138ea5856dc05eacf24Brian Paul                                    (void *) osmesa, GL_TRUE )) {
303df81387dfae199a71bc55138ea5856dc05eacf24Brian Paul         _mesa_destroy_visual( osmesa->gl_visual );
304bd5cdaf4442872d3cd2ff94eeafadd481d27fcfbBrian Paul         FREE(osmesa);
305afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         return NULL;
306afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
3075a9026c65d260dc185e072163999f5d810015108Brian Paul
3085a9026c65d260dc185e072163999f5d810015108Brian Paul      _mesa_enable_sw_extensions(&(osmesa->gl_ctx));
309304357dcd496f7ebf499fd9c77b4eba83a75abd5Brian Paul
310b1394fa92aaaf859ce9efc8b5fc194397921320cBrian Paul      osmesa->gl_buffer = _mesa_create_framebuffer( osmesa->gl_visual,
311b6bcae5698df88f7730d40004ce7ce0462e97a20Brian Paul                                          osmesa->gl_visual->depthBits > 0,
312b6bcae5698df88f7730d40004ce7ce0462e97a20Brian Paul                                          osmesa->gl_visual->stencilBits > 0,
313b6bcae5698df88f7730d40004ce7ce0462e97a20Brian Paul                                          osmesa->gl_visual->accumRedBits > 0,
314e715c4a62d57eacb4b5b3b94276f251b7a4e5d22Brian Paul                                          swalpha );
3154c44d63f01a01f134d7e4456d4209edee97f9ef5Brian Paul
316afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      if (!osmesa->gl_buffer) {
317b1394fa92aaaf859ce9efc8b5fc194397921320cBrian Paul         _mesa_destroy_visual( osmesa->gl_visual );
318b1394fa92aaaf859ce9efc8b5fc194397921320cBrian Paul         _mesa_free_context_data( &osmesa->gl_ctx );
319bd5cdaf4442872d3cd2ff94eeafadd481d27fcfbBrian Paul         FREE(osmesa);
320afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         return NULL;
321afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
322afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      osmesa->format = format;
323afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      osmesa->buffer = NULL;
324afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      osmesa->width = 0;
325afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      osmesa->height = 0;
326afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      osmesa->userRowLength = 0;
327afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      osmesa->rowlength = 0;
328afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      osmesa->yup = GL_TRUE;
329afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      osmesa->rshift = rshift;
330afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      osmesa->gshift = gshift;
331afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      osmesa->bshift = bshift;
332afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      osmesa->ashift = ashift;
33374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      osmesa->rInd = rind;
33474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      osmesa->gInd = gind;
33574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      osmesa->bInd = bind;
33674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      osmesa->aInd = aind;
3371e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell
3381e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell
3391e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell      /* Initialize the software rasterizer and helper modules.
3401e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell       */
3411e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell      {
3421e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell	 GLcontext *ctx = &osmesa->gl_ctx;
3431e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell
3441e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell	 _swrast_CreateContext( ctx );
34558e991705392a2e17a1c8b034f4083a0adaf1943Keith Whitwell	 _ac_CreateContext( ctx );
34623caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell	 _tnl_CreateContext( ctx );
347cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell	 _swsetup_CreateContext( ctx );
348dbd1e2b5990a3689bf718296c57c14fc3ba38db5Jouk Jansen
3491e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell	 osmesa_register_swrast_functions( ctx );
3501e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell      }
351afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
352afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   return osmesa;
353afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
354afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
355afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
356afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
3572bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul
358afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/*
359afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Destroy an Off-Screen Mesa rendering context.
360afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg *
361afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Input:  ctx - the context to destroy
362afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */
363afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgvoid GLAPIENTRY OSMesaDestroyContext( OSMesaContext ctx )
364afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
365afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   if (ctx) {
366709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell      _swsetup_DestroyContext( &ctx->gl_ctx );
367709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell      _tnl_DestroyContext( &ctx->gl_ctx );
368709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell      _ac_DestroyContext( &ctx->gl_ctx );
369709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell      _swrast_DestroyContext( &ctx->gl_ctx );
370709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell
371b1394fa92aaaf859ce9efc8b5fc194397921320cBrian Paul      _mesa_destroy_visual( ctx->gl_visual );
372b1394fa92aaaf859ce9efc8b5fc194397921320cBrian Paul      _mesa_destroy_framebuffer( ctx->gl_buffer );
373b1394fa92aaaf859ce9efc8b5fc194397921320cBrian Paul      _mesa_free_context_data( &ctx->gl_ctx );
374bd5cdaf4442872d3cd2ff94eeafadd481d27fcfbBrian Paul      FREE( ctx );
375afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
376afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
377afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
378afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
379afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
380afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/*
381afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Recompute the values of the context's rowaddr array.
382afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */
383afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgstatic void compute_row_addresses( OSMesaContext ctx )
384afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
38574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   GLint bytesPerPixel, bytesPerRow, i;
38674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   GLubyte *origin = (GLubyte *) ctx->buffer;
38774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul
38874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   if (ctx->format == OSMESA_COLOR_INDEX) {
38974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      /* CI mode */
39074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      bytesPerPixel = 1 * sizeof(GLchan);
39174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   }
39274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   else if ((ctx->format == OSMESA_RGB) || (ctx->format == OSMESA_BGR)) {
39374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      /* RGB mode */
39474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      bytesPerPixel = 3 * sizeof(GLchan);
39574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   }
396206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul   else if (ctx->format == OSMESA_RGB_565) {
397206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul      /* 5/6/5 RGB pixel in 16 bits */
398206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul      bytesPerPixel = 2;
399206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul   }
40074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   else {
40174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      /* RGBA mode */
40274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      bytesPerPixel = 4 * sizeof(GLchan);
40374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   }
40474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul
40574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   bytesPerRow = ctx->rowlength * bytesPerPixel;
406afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
407afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   if (ctx->yup) {
408afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      /* Y=0 is bottom line of window */
40974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      for (i = 0; i < MAX_HEIGHT; i++) {
41074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul         ctx->rowaddr[i] = (GLchan *) ((GLubyte *) origin + i * bytesPerRow);
411afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
412afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
413afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   else {
414afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      /* Y=0 is top line of window */
41574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      for (i = 0; i < MAX_HEIGHT; i++) {
41674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul         GLint j = ctx->height - i - 1;
41774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul         ctx->rowaddr[i] = (GLchan *) ((GLubyte *) origin + j * bytesPerRow);
418afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
419afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
420afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
421afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
422afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
423afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/*
424afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Bind an OSMesaContext to an image buffer.  The image buffer is just a
425afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * block of memory which the client provides.  Its size must be at least
426afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * as large as width*height*sizeof(type).  Its address should be a multiple
427afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * of 4 if using RGBA mode.
428afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg *
429afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Image data is stored in the order of glDrawPixels:  row-major order
430afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * with the lower-left image pixel stored in the first array position
431afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * (ie. bottom-to-top).
432afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg *
433afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Since the only type initially supported is GL_UNSIGNED_BYTE, if the
434afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * context is in RGBA mode, each pixel will be stored as a 4-byte RGBA
435afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * value.  If the context is in color indexed mode, each pixel will be
436afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * stored as a 1-byte value.
437afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg *
438afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * If the context's viewport hasn't been initialized yet, it will now be
439afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * initialized to (0,0,width,height).
440afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg *
441afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Input:  ctx - the rendering context
442afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg *         buffer - the image buffer memory
443afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg *         type - data type for pixel components, only GL_UNSIGNED_BYTE
444206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul *                and GL_UNSIGNED_SHORT_5_6_5 supported now.
445afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg *         width, height - size of image buffer in pixels, at least 1
446afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Return:  GL_TRUE if success, GL_FALSE if error because of invalid ctx,
447afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg *          invalid buffer address, type!=GL_UNSIGNED_BYTE, width<1, height<1,
448afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg *          width>internal limit or height>internal limit.
449afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */
450d3c070ca6a36daa765b1ad7f44e03e6671ad0490Brian PaulGLboolean GLAPIENTRY
451d3c070ca6a36daa765b1ad7f44e03e6671ad0490Brian PaulOSMesaMakeCurrent( OSMesaContext ctx, void *buffer, GLenum type,
452d3c070ca6a36daa765b1ad7f44e03e6671ad0490Brian Paul                   GLsizei width, GLsizei height )
453afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
454206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul   if (!ctx || !buffer ||
45574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul       width < 1 || height < 1 ||
45674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul       width > MAX_WIDTH || height > MAX_HEIGHT) {
457afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      return GL_FALSE;
458afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
459afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
460206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul   if (ctx->format == OSMESA_RGB_565 && type != GL_UNSIGNED_SHORT_5_6_5) {
461206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul      return GL_FALSE;
462206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul   }
463206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul   else if (type != CHAN_TYPE) {
464206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul      return GL_FALSE;
465206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul   }
466206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul
467cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   osmesa_update_state( &ctx->gl_ctx, 0 );
468b1394fa92aaaf859ce9efc8b5fc194397921320cBrian Paul   _mesa_make_current( &ctx->gl_ctx, ctx->gl_buffer );
469afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
470afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   ctx->buffer = buffer;
471afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   ctx->width = width;
472afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   ctx->height = height;
473afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   if (ctx->userRowLength)
474afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      ctx->rowlength = ctx->userRowLength;
475afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   else
476afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      ctx->rowlength = width;
477afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
478afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   compute_row_addresses( ctx );
479afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
480afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   /* init viewport */
481304357dcd496f7ebf499fd9c77b4eba83a75abd5Brian Paul   if (ctx->gl_ctx.Viewport.Width==0) {
482afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      /* initialize viewport and scissor box to buffer size */
483cb5ecb883eb3be842ef44c61df8d4b527877c858Brian Paul      _mesa_Viewport( 0, 0, width, height );
484304357dcd496f7ebf499fd9c77b4eba83a75abd5Brian Paul      ctx->gl_ctx.Scissor.Width = width;
485304357dcd496f7ebf499fd9c77b4eba83a75abd5Brian Paul      ctx->gl_ctx.Scissor.Height = height;
486afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
487afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
488afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   return GL_TRUE;
489afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
490afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
491afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
492afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
493afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgOSMesaContext GLAPIENTRY OSMesaGetCurrentContext( void )
494afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
495b1394fa92aaaf859ce9efc8b5fc194397921320cBrian Paul   GLcontext *ctx = _mesa_get_current_context();
496d3c070ca6a36daa765b1ad7f44e03e6671ad0490Brian Paul   if (ctx)
497304357dcd496f7ebf499fd9c77b4eba83a75abd5Brian Paul      return (OSMesaContext) ctx;
498d3c070ca6a36daa765b1ad7f44e03e6671ad0490Brian Paul   else
499d3c070ca6a36daa765b1ad7f44e03e6671ad0490Brian Paul      return NULL;
500afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
501afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
502afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
503afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
504afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgvoid GLAPIENTRY OSMesaPixelStore( GLint pname, GLint value )
505afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
506afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   OSMesaContext ctx = OSMesaGetCurrentContext();
507afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
508afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   switch (pname) {
509afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case OSMESA_ROW_LENGTH:
510afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         if (value<0) {
51108836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul            _mesa_error( &ctx->gl_ctx, GL_INVALID_VALUE,
512afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg                      "OSMesaPixelStore(value)" );
513afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            return;
514afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         }
515afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         ctx->userRowLength = value;
516afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         ctx->rowlength = value;
517afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         break;
518afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case OSMESA_Y_UP:
519afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         ctx->yup = value ? GL_TRUE : GL_FALSE;
520afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         break;
521afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      default:
52208836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul         _mesa_error( &ctx->gl_ctx, GL_INVALID_ENUM, "OSMesaPixelStore(pname)" );
523afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         return;
524afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
525afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
526afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   compute_row_addresses( ctx );
527afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
528afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
529afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
530afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgvoid GLAPIENTRY OSMesaGetIntegerv( GLint pname, GLint *value )
531afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
532afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   OSMesaContext ctx = OSMesaGetCurrentContext();
533afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
534afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   switch (pname) {
535afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case OSMESA_WIDTH:
536afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         *value = ctx->width;
537afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         return;
538afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case OSMESA_HEIGHT:
539afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         *value = ctx->height;
540afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         return;
541afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case OSMESA_FORMAT:
542afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         *value = ctx->format;
543afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         return;
544afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case OSMESA_TYPE:
54501915e90e6912f06d43d443a09157f7bbc96ddc5Brian Paul         *value = CHAN_TYPE;
546afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         return;
547afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case OSMESA_ROW_LENGTH:
548afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         *value = ctx->rowlength;
549afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         return;
550afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case OSMESA_Y_UP:
551afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         *value = ctx->yup;
552afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         return;
553afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      default:
55408836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul         _mesa_error(&ctx->gl_ctx, GL_INVALID_ENUM, "OSMesaGetIntergerv(pname)");
555afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         return;
556afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
557afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
558afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
559afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/*
560afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Return the depth buffer associated with an OSMesa context.
561afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Input:  c - the OSMesa context
562afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Output:  width, height - size of buffer in pixels
563afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg *          bytesPerValue - bytes per depth value (2 or 4)
564afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg *          buffer - pointer to depth buffer values
565afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Return:  GL_TRUE or GL_FALSE to indicate success or failure.
566afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */
5677e67fb41fb54e050f6983b4de09ed3a317d6148fBrian PaulGLboolean GLAPIENTRY
5687e67fb41fb54e050f6983b4de09ed3a317d6148fBrian PaulOSMesaGetDepthBuffer( OSMesaContext c, GLint *width, GLint *height,
5697e67fb41fb54e050f6983b4de09ed3a317d6148fBrian Paul                      GLint *bytesPerValue, void **buffer )
570afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
571650cb74bcb913d2589355d56a14da1ab0307d1fcBrian Paul   if ((!c->gl_buffer) || (!c->gl_buffer->DepthBuffer)) {
572afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      *width = 0;
573afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      *height = 0;
574afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      *bytesPerValue = 0;
575afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      *buffer = 0;
576afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      return GL_FALSE;
577afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
578afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   else {
579afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      *width = c->gl_buffer->Width;
580afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      *height = c->gl_buffer->Height;
5819db3f95acea5622573803890afd506ebcdaab3b3Brian Paul      if (c->gl_visual->depthBits <= 16)
5829db3f95acea5622573803890afd506ebcdaab3b3Brian Paul         *bytesPerValue = sizeof(GLushort);
5839db3f95acea5622573803890afd506ebcdaab3b3Brian Paul      else
5849db3f95acea5622573803890afd506ebcdaab3b3Brian Paul         *bytesPerValue = sizeof(GLuint);
585650cb74bcb913d2589355d56a14da1ab0307d1fcBrian Paul      *buffer = c->gl_buffer->DepthBuffer;
586afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      return GL_TRUE;
587afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
588afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
589afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
59023ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank/*
59123ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank * Return the color buffer associated with an OSMesa context.
59223ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank * Input:  c - the OSMesa context
59323ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank * Output:  width, height - size of buffer in pixels
59423ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank *          format - the pixel format (OSMESA_FORMAT)
59523ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank *          buffer - pointer to color buffer values
59623ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank * Return:  GL_TRUE or GL_FALSE to indicate success or failure.
59723ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank */
5987e67fb41fb54e050f6983b4de09ed3a317d6148fBrian PaulGLboolean GLAPIENTRY
5997e67fb41fb54e050f6983b4de09ed3a317d6148fBrian PaulOSMesaGetColorBuffer( OSMesaContext c, GLint *width,
6007e67fb41fb54e050f6983b4de09ed3a317d6148fBrian Paul                      GLint *height, GLint *format, void **buffer )
60123ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank{
60223ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank   if (!c->buffer) {
60323ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank      *width = 0;
60423ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank      *height = 0;
60523ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank      *format = 0;
60623ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank      *buffer = 0;
60723ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank      return GL_FALSE;
6087e67fb41fb54e050f6983b4de09ed3a317d6148fBrian Paul   }
6097e67fb41fb54e050f6983b4de09ed3a317d6148fBrian Paul   else {
61023ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank      *width = c->width;
61123ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank      *height = c->height;
61223ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank      *format = c->format;
61323ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank      *buffer = c->buffer;
61423ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank      return GL_TRUE;
61523ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank   }
61623ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank}
617afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
618afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/**********************************************************************/
619afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/*** Device Driver Functions                                        ***/
620afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/**********************************************************************/
621afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
622afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
623afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/*
624afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Useful macros:
625afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */
626afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
62774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul#define PACK_RGBA(DST, R, G, B, A)	\
62874b493a5e61237de081a438e774e5d8139d4c6b7Brian Pauldo {					\
62974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   (DST)[osmesa->rInd] = R;		\
63074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   (DST)[osmesa->gInd] = G;		\
63174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   (DST)[osmesa->bInd] = B;		\
63274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   (DST)[osmesa->aInd] = A;		\
63374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul} while (0)
63474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul
63574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul#define PACK_RGB(DST, R, G, B)  \
63674b493a5e61237de081a438e774e5d8139d4c6b7Brian Pauldo {				\
63774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   (DST)[0] = R;		\
63874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   (DST)[1] = G;		\
63974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   (DST)[2] = B;		\
64074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul} while (0)
641afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
64274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul#define PACK_BGR(DST, R, G, B)  \
64374b493a5e61237de081a438e774e5d8139d4c6b7Brian Pauldo {				\
64474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   (DST)[0] = B;		\
64574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   (DST)[1] = G;		\
64674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   (DST)[2] = R;		\
64774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul} while (0)
648afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
649206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul#define PACK_RGB_565(DST, R, G, B)					\
650206eda8b69ab3c63e9597015189f49d1bda9356fBrian Pauldo {									\
651206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul   (DST) = (((R) << 8) & 0xf800) | (((G) << 3) & 0x7e0) | ((B) >> 3);\
652206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul} while (0)
653206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul
654afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
65501915e90e6912f06d43d443a09157f7bbc96ddc5Brian Paul#define UNPACK_RED(P)      ( (P)[osmesa->rInd] )
65601915e90e6912f06d43d443a09157f7bbc96ddc5Brian Paul#define UNPACK_GREEN(P)    ( (P)[osmesa->gInd] )
65701915e90e6912f06d43d443a09157f7bbc96ddc5Brian Paul#define UNPACK_BLUE(P)     ( (P)[osmesa->bInd] )
65801915e90e6912f06d43d443a09157f7bbc96ddc5Brian Paul#define UNPACK_ALPHA(P)    ( (P)[osmesa->aInd] )
65974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul
66074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul
66174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul#define PIXELADDR1(X,Y)  (osmesa->rowaddr[Y] + (X))
662206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul#define PIXELADDR2(X,Y)  (osmesa->rowaddr[Y] + 2 * (X))
66374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul#define PIXELADDR3(X,Y)  (osmesa->rowaddr[Y] + 3 * (X))
66474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul#define PIXELADDR4(X,Y)  (osmesa->rowaddr[Y] + 4 * (X))
665afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
666afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
667afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
668cea0e8e6700e871bb9bcb334cb75fbfbfcdfd702Brian Paulstatic GLboolean set_draw_buffer( GLcontext *ctx, GLenum mode )
669afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
670afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   (void) ctx;
671afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   if (mode==GL_FRONT_LEFT) {
672afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      return GL_TRUE;
673afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
674afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   else {
675afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      return GL_FALSE;
676afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
677afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
678afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
679afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
680cea0e8e6700e871bb9bcb334cb75fbfbfcdfd702Brian Paulstatic void set_read_buffer( GLcontext *ctx, GLframebuffer *buffer, GLenum mode )
681cea0e8e6700e871bb9bcb334cb75fbfbfcdfd702Brian Paul{
682cea0e8e6700e871bb9bcb334cb75fbfbfcdfd702Brian Paul   /* separate read buffer not supported */
683cea0e8e6700e871bb9bcb334cb75fbfbfcdfd702Brian Paul   ASSERT(buffer == ctx->DrawBuffer);
684cea0e8e6700e871bb9bcb334cb75fbfbfcdfd702Brian Paul   ASSERT(mode == GL_FRONT_LEFT);
685cea0e8e6700e871bb9bcb334cb75fbfbfcdfd702Brian Paul}
686cea0e8e6700e871bb9bcb334cb75fbfbfcdfd702Brian Paul
687cea0e8e6700e871bb9bcb334cb75fbfbfcdfd702Brian Paul
688d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwellstatic void clear( GLcontext *ctx, GLbitfield mask, GLboolean all,
689d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell		   GLint x, GLint y, GLint width, GLint height )
690afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
691c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul   OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
692dd020f13a6d520b46aefd4453dae6b6edcc427f6Brian Paul   const GLuint *colorMask = (GLuint *) &ctx->Color.ColorMask;
693dd020f13a6d520b46aefd4453dae6b6edcc427f6Brian Paul
694dd020f13a6d520b46aefd4453dae6b6edcc427f6Brian Paul   /* sanity check - we only have a front-left buffer */
695dd020f13a6d520b46aefd4453dae6b6edcc427f6Brian Paul   ASSERT((mask & (DD_FRONT_RIGHT_BIT | DD_BACK_LEFT_BIT | DD_BACK_RIGHT_BIT)) == 0);
696d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell   if (*colorMask == 0xffffffff && ctx->Color.IndexMask == 0xffffffff) {
697d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell      if (mask & DD_FRONT_LEFT_BIT) {
698d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	 if (osmesa->format == OSMESA_COLOR_INDEX) {
699d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	    if (all) {
700d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	       /* Clear whole CI buffer */
70174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul#if CHAN_TYPE == GL_UNSIGNED_BYTE
702d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	       MEMSET(osmesa->buffer, ctx->Color.ClearIndex,
703d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell		      osmesa->rowlength * osmesa->height);
70474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul#else
705d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	       const GLint n = osmesa->rowlength * osmesa->height;
706d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	       GLchan *buffer = (GLchan *) osmesa->buffer;
707d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	       GLint i;
708d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	       for (i = 0; i < n; i ++) {
709d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell		  buffer[i] = ctx->Color.ClearIndex;
710d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	       }
71174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul#endif
712d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	    }
713d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	    else {
714d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	       /* Clear part of CI buffer */
715d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	       const GLchan clearIndex = (GLchan) ctx->Color.ClearIndex;
716d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	       GLint i, j;
717d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	       for (i = 0; i < height; i++) {
718d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell		  GLchan *ptr1 = PIXELADDR1(x, (y + i));
719d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell		  for (j = 0; j < width; j++) {
720d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell		     *ptr1++ = clearIndex;
721d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell		  }
722d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	       }
723d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	    }
724d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	 }
725d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	 else if (osmesa->format == OSMESA_RGB) {
726d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	    const GLchan r = ctx->Color.ClearColor[0];
727d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	    const GLchan g = ctx->Color.ClearColor[1];
728d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	    const GLchan b = ctx->Color.ClearColor[2];
729d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	    if (all) {
730d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	       /* Clear whole RGB buffer */
731d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	       GLuint n = osmesa->rowlength * osmesa->height;
732d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	       GLchan *ptr3 = (GLchan *) osmesa->buffer;
733d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	       GLuint i;
734d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	       for (i = 0; i < n; i++) {
735d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell		  PACK_RGB(ptr3, r, g, b);
736d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell		  ptr3 += 3;
737d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	       }
738d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	    }
739d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	    else {
740d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	       /* Clear part of RGB buffer */
741d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	       GLint i, j;
742d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	       for (i = 0; i < height; i++) {
743d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell		  GLchan *ptr3 = PIXELADDR3(x, (y + i));
744d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell		  for (j = 0; j < width; j++) {
745d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell		     PACK_RGB(ptr3, r, g, b);
746d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell		     ptr3 += 3;
747d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell		  }
748d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	       }
749d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	    }
750d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	 }
751d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	 else if (osmesa->format == OSMESA_BGR) {
752d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	    const GLchan r = ctx->Color.ClearColor[0];
753d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	    const GLchan g = ctx->Color.ClearColor[1];
754d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	    const GLchan b = ctx->Color.ClearColor[2];
755d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	    if (all) {
756d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	       /* Clear whole RGB buffer */
757d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	       const GLint n = osmesa->rowlength * osmesa->height;
758d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	       GLchan *ptr3 = (GLchan *) osmesa->buffer;
759d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	       GLint i;
760d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	       for (i = 0; i < n; i++) {
761d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell		  PACK_BGR(ptr3, r, g, b);
762d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell		  ptr3 += 3;
763d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	       }
764d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	    }
765d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	    else {
766d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	       /* Clear part of RGB buffer */
767d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	       GLint i, j;
768d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	       for (i = 0; i < height; i++) {
769d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell		  GLchan *ptr3 = PIXELADDR3(x, (y + i));
770d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell		  for (j = 0; j < width; j++) {
771d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell		     PACK_BGR(ptr3, r, g, b);
772d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell		     ptr3 += 3;
773d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell		  }
774d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	       }
775d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	    }
776d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	 }
777206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul         else if (osmesa->format == OSMESA_RGB_565) {
778206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul	    const GLchan r = ctx->Color.ClearColor[0];
779206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul	    const GLchan g = ctx->Color.ClearColor[1];
780206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul	    const GLchan b = ctx->Color.ClearColor[2];
781206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul            GLushort clearPixel;
782206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul            PACK_RGB_565(clearPixel, r, g, b);
783206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul            if (all) {
784206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul               /* Clear whole RGB buffer */
785206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul	       const GLint n = osmesa->rowlength * osmesa->height;
786206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul               GLushort *ptr2 = (GLushort *) osmesa->buffer;
787206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul               GLuint  i;
788206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul               for (i = 0; i < n; i++) {
789206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul                  *ptr2 = clearPixel;
790206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul                  ptr2++;
791206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul               }
792206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul            }
793206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul            else {
794206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul               /* clear scissored region */
795206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul               GLint i, j;
796206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul               for (i = 0; i < height; i++) {
797206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul                  GLushort *ptr2 = (GLushort *) PIXELADDR2(x, (y + i));
798206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul                  for (j = 0; j < width; j++) {
799206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul                     *ptr2 = clearPixel;
800206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul                     ptr2++;
801206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul                  }
802206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul               }
803206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul            }
804206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul         }
805d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	 else {
80674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul#if CHAN_TYPE == GL_UNSIGNED_BYTE
807d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	    /* 4-byte pixel value */
808d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	    GLuint clearPixel;
809d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	    GLchan *clr = (GLchan *) &clearPixel;
810d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	    clr[osmesa->rInd] = ctx->Color.ClearColor[0];
811d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	    clr[osmesa->gInd] = ctx->Color.ClearColor[1];
812d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	    clr[osmesa->bInd] = ctx->Color.ClearColor[2];
813d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	    clr[osmesa->aInd] = ctx->Color.ClearColor[3];
814d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	    if (all) {
815d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	       /* Clear whole RGBA buffer */
816d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	       const GLuint n = osmesa->rowlength * osmesa->height;
817d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	       GLuint *ptr4 = (GLuint *) osmesa->buffer;
818d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	       GLuint i;
819d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	       if (clearPixel) {
820d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell		  for (i = 0; i < n; i++) {
821d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell		     *ptr4++ = clearPixel;
822d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell		  }
823d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	       }
824d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	       else {
825d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell		  BZERO(ptr4, n * sizeof(GLuint));
826d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	       }
827d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	    }
828d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	    else {
829d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	       /* Clear part of RGBA buffer */
830d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	       GLint i, j;
831d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	       for (i = 0; i < height; i++) {
832d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell		  GLuint *ptr4 = (GLuint *) PIXELADDR4(x, (y + i));
833d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell		  for (j = 0; j < width; j++) {
834d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell		     *ptr4++ = clearPixel;
835d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell		  }
836d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	       }
837d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	    }
83874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul#else
839d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	    const GLchan r = ctx->Color.ClearColor[0];
840d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	    const GLchan g = ctx->Color.ClearColor[1];
841d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	    const GLchan b = ctx->Color.ClearColor[2];
842d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	    const GLchan a = ctx->Color.ClearColor[3];
843d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	    if (all) {
844d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	       /* Clear whole RGBA buffer */
845d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	       const GLuint n = osmesa->rowlength * osmesa->height;
846d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	       GLchan *p = (GLchan *) osmesa->buffer;
847d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	       GLuint i;
848d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	       for (i = 0; i < n; i++) {
849d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell		  PACK_RGBA(p, r, g, b, a);
850d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell		  p += 4;
851d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	       }
852d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	    }
853d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	    else {
854d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	       /* Clear part of RGBA buffer */
855d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	       GLint i, j;
856d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	       for (i = 0; i < height; i++) {
857d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell		  GLchan *p = PIXELADDR4(x, (y + i));
858d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell		  for (j = 0; j < width; j++) {
859d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell		     PACK_RGBA(p, r, g, b, a);
860d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell		     p += 4;
861d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell		  }
862d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	       }
863d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	    }
86474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul
86574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul#endif
866d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	 }
867d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	 mask &= ~DD_FRONT_LEFT_BIT;
868afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
869afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
870d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell
871d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell   if (mask)
872d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell      _swrast_Clear( ctx, mask, all, x, y, width, height );
873afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
874afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
875afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
876afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
877afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgstatic void buffer_size( GLcontext *ctx, GLuint *width, GLuint *height )
878afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
879c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul   OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
880afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   *width = osmesa->width;
881afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   *height = osmesa->height;
882afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
883afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
884afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
885afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/**********************************************************************/
886afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/*****        Read/write spans/arrays of RGBA pixels              *****/
887afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/**********************************************************************/
888afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
889afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/* Write RGBA pixels to an RGBA (or permuted) buffer. */
89074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void
89174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulwrite_rgba_span( const GLcontext *ctx, GLuint n, GLint x, GLint y,
89274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul                 CONST GLchan rgba[][4], const GLubyte mask[] )
893afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
89474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   const OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
89574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   GLchan *p = PIXELADDR4(x, y);
896afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLuint i;
897afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   if (mask) {
89874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      for (i = 0; i < n; i++, p += 4) {
899afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         if (mask[i]) {
90074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul            PACK_RGBA(p, rgba[i][RCOMP], rgba[i][GCOMP],
90174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul                         rgba[i][BCOMP], rgba[i][ACOMP]);
902afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         }
903afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
904afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
905afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   else {
90674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      for (i = 0; i < n; i++, p += 4) {
90774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul         PACK_RGBA(p, rgba[i][RCOMP], rgba[i][GCOMP],
90874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul                      rgba[i][BCOMP], rgba[i][ACOMP]);
909afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
910afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
911afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
912afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
913afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
914afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/* Write RGBA pixels to an RGBA buffer.  This is the fastest span-writer. */
91574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void
91674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulwrite_rgba_span_rgba( const GLcontext *ctx, GLuint n, GLint x, GLint y,
91774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul                      CONST GLchan rgba[][4], const GLubyte mask[] )
918afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
919c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul   OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
92074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   GLuint *ptr4 = (GLuint *) PIXELADDR4(x, y);
921afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   const GLuint *rgba4 = (const GLuint *) rgba;
922afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLuint i;
92374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   ASSERT(CHAN_TYPE == GL_UNSIGNED_BYTE);
924afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   if (mask) {
92574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      for (i = 0; i < n; i++) {
926afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         if (mask[i]) {
927afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            ptr4[i] = rgba4[i];
928afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         }
929afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
930afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
931afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   else {
932afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      MEMCPY( ptr4, rgba4, n * 4 );
933afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
934afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
935afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
936afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
937afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/* Write RGB pixels to an RGBA (or permuted) buffer. */
93874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void
93974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulwrite_rgb_span( const GLcontext *ctx, GLuint n, GLint x, GLint y,
94074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul                CONST GLchan rgb[][3], const GLubyte mask[] )
941afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
94274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   const OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
94374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   GLchan *p = PIXELADDR4(x, y);
944afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLuint i;
945afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   if (mask) {
94674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      for (i = 0; i < n; i++, p+=4) {
947afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         if (mask[i]) {
94865c6ca91795a71cf38dbe5f49f2d73fd9d4049cdBrian Paul            PACK_RGBA(p, rgb[i][RCOMP], rgb[i][GCOMP], rgb[i][BCOMP], CHAN_MAX);
949afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         }
950afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
951afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
952afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   else {
95374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      for (i = 0; i < n; i++, p+=4) {
95465c6ca91795a71cf38dbe5f49f2d73fd9d4049cdBrian Paul         PACK_RGBA(p, rgb[i][RCOMP], rgb[i][GCOMP], rgb[i][BCOMP], CHAN_MAX);
955afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
956afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
957afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
958afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
959afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
960afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
96174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void
96274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulwrite_monocolor_span( const GLcontext *ctx, GLuint n, GLint x, GLint y,
96374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul                      const GLchan color[4], const GLubyte mask[] )
964afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
965c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul   const OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
96674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   GLchan *p = PIXELADDR4(x, y);
967afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLuint i;
96874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   for (i = 0; i < n; i++, p += 4) {
969afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      if (mask[i]) {
97074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul         PACK_RGBA(p, color[RCOMP], color[GCOMP], color[BCOMP], color[ACOMP]);
971afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
972afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
973afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
974afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
975afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
976afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
97774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void
97874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulwrite_rgba_pixels( const GLcontext *ctx, GLuint n,
97974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul                   const GLint x[], const GLint y[],
98074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul                   CONST GLchan rgba[][4], const GLubyte mask[] )
981afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
98274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   const OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
983afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLuint i;
98474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   for (i = 0; i < n; i++) {
985afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      if (mask[i]) {
98674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul         GLchan *p = PIXELADDR4(x[i], y[i]);
98774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul         PACK_RGBA(p, rgba[i][RCOMP], rgba[i][GCOMP],
98874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul                      rgba[i][BCOMP], rgba[i][ACOMP]);
989afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
990afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
991afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
992afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
993afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
994afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
99574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void
99674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulwrite_monocolor_pixels( const GLcontext *ctx, GLuint n,
99774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul                        const GLint x[], const GLint y[],
99874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul                        const GLchan color[4], const GLubyte mask[] )
999afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
100074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   const OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
1001afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLuint i;
100274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   for (i = 0; i < n; i++) {
1003afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      if (mask[i]) {
100474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul         GLchan *p = PIXELADDR4(x[i], y[i]);
100574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul         PACK_RGBA(p, color[RCOMP], color[GCOMP], color[BCOMP], color[ACOMP]);
1006afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
1007afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
1008afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
1009afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1010afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
101174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void
101274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulread_rgba_span( const GLcontext *ctx, GLuint n, GLint x, GLint y,
101374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul                GLchan rgba[][4] )
1014afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
101574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   const OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
1016afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLuint i;
101774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   GLchan *p = PIXELADDR4(x, y);
101874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   for (i = 0; i < n; i++, p += 4) {
101974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      rgba[i][RCOMP] = UNPACK_RED(p);
102074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      rgba[i][GCOMP] = UNPACK_GREEN(p);
102174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      rgba[i][BCOMP] = UNPACK_BLUE(p);
102274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      rgba[i][ACOMP] = UNPACK_ALPHA(p);
1023afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
1024afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
1025afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1026afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1027afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/* Read RGBA pixels from an RGBA buffer */
102874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void
102974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulread_rgba_span_rgba( const GLcontext *ctx, GLuint n, GLint x, GLint y,
103074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul                     GLchan rgba[][4] )
1031afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
1032c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul   OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
103374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   GLuint *ptr4 = (GLuint *) PIXELADDR4(x, y);
10349499e017b7e05411a32b3e4fa94885eaec0d7277Brian Paul   MEMCPY( rgba, ptr4, n * 4 * sizeof(GLchan) );
1035afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
1036afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1037afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
103874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void
103974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulread_rgba_pixels( const GLcontext *ctx,
104074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul                  GLuint n, const GLint x[], const GLint y[],
104174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul                  GLchan rgba[][4], const GLubyte mask[] )
1042afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
104374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   const OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
1044afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLuint i;
104574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   for (i = 0; i < n; i++) {
1046afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      if (mask[i]) {
104774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul         const GLchan *p = PIXELADDR4(x[i], y[i]);
104874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul         rgba[i][RCOMP] = UNPACK_RED(p);
104974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul         rgba[i][GCOMP] = UNPACK_GREEN(p);
105074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul         rgba[i][BCOMP] = UNPACK_BLUE(p);
105174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul         rgba[i][ACOMP] = UNPACK_ALPHA(p);
1052afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
1053afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
1054afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
1055afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1056afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/**********************************************************************/
1057afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/*****                3 byte RGB pixel support funcs              *****/
1058afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/**********************************************************************/
1059afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
106074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul/* Write RGBA pixels to an RGB buffer. */
106174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void
106274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulwrite_rgba_span_RGB( const GLcontext *ctx, GLuint n, GLint x, GLint y,
106374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul                     CONST GLchan rgba[][4], const GLubyte mask[] )
1064afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
106574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   const OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
106674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   GLchan *p = PIXELADDR3(x, y);
1067afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLuint i;
1068afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   if (mask) {
106974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      for (i = 0; i < n; i++, p += 3) {
1070afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         if (mask[i]) {
107174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul            PACK_RGB(p, rgba[i][RCOMP], rgba[i][GCOMP], rgba[i][BCOMP]);
1072afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         }
1073afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
1074afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
1075afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   else {
107674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      for (i = 0; i < n; i++, p += 3) {
107774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul         PACK_RGB(p, rgba[i][RCOMP], rgba[i][GCOMP], rgba[i][BCOMP]);
1078afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
1079afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
1080afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
1081afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
108274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul/* Write RGBA pixels to an BGR buffer. */
108374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void
108474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulwrite_rgba_span_BGR( const GLcontext *ctx, GLuint n, GLint x, GLint y,
108574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul                     CONST GLchan rgba[][4], const GLubyte mask[] )
1086afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
1087c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul   const OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
108874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   GLchan *p = PIXELADDR3(x, y);
1089afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLuint i;
1090afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   if (mask) {
109174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      for (i = 0; i < n; i++, p += 3) {
1092afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         if (mask[i]) {
109374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul            PACK_BGR(p, rgba[i][RCOMP], rgba[i][GCOMP], rgba[i][BCOMP]);
1094afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         }
1095afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
1096afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
1097afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   else {
109874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      for (i = 0; i < n; i++, p += 3) {
109974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul         PACK_BGR(p, rgba[i][RCOMP], rgba[i][GCOMP], rgba[i][BCOMP]);
1100afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
1101afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
1102afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
1103afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
110474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul/* Write RGB pixels to an RGB buffer. */
110574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void
110674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulwrite_rgb_span_RGB( const GLcontext *ctx, GLuint n, GLint x, GLint y,
110774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul                    CONST GLchan rgb[][3], const GLubyte mask[] )
110874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul{
110974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   const OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
111074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   GLchan *p = PIXELADDR3(x, y);
111174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   GLuint i;
111274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   if (mask) {
111374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      for (i = 0; i < n; i++, p += 3) {
111474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul         if (mask[i]) {
111574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul            PACK_RGB(p, rgb[i][RCOMP], rgb[i][GCOMP], rgb[i][BCOMP]);
111674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul         }
111774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      }
111874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   }
111974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   else {
112074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      for (i = 0; i < n; i++, p += 3) {
112174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul         PACK_RGB(p, rgb[i][RCOMP], rgb[i][GCOMP], rgb[i][BCOMP]);
112274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      }
112374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   }
112474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul}
1125afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
112674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul/* Write RGB pixels to an BGR buffer. */
112774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void
112874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulwrite_rgb_span_BGR( const GLcontext *ctx, GLuint n, GLint x, GLint y,
112974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul                    CONST GLchan rgb[][3], const GLubyte mask[] )
1130afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
1131c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul   const OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
113274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   GLchan *p = PIXELADDR3(x, y);
1133afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLuint i;
113474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   if (mask) {
113574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      for (i = 0; i < n; i++, p += 3) {
113674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul         if (mask[i]) {
113774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul            PACK_BGR(p, rgb[i][RCOMP], rgb[i][GCOMP], rgb[i][BCOMP]);
113874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul         }
113974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      }
114074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   }
114174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   else {
114274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      for (i = 0; i < n; i++, p += 3) {
114374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul         PACK_BGR(p, rgb[i][RCOMP], rgb[i][GCOMP], rgb[i][BCOMP]);
114474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      }
114574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   }
114674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul}
114774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul
114874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul
114974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void
115074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulwrite_monocolor_span_RGB( const GLcontext *ctx, GLuint n, GLint x, GLint y,
115174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul                          const GLchan color[4], const GLubyte mask[] )
115274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul{
115374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   const OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
115474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   GLchan *p = PIXELADDR3(x, y);
115574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   GLuint i;
115674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   for (i = 0; i < n; i++, p += 3) {
115774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      if (mask[i]) {
115874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul         PACK_RGB(p, color[RCOMP], color[GCOMP], color[BCOMP]);
115974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      }
116074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   }
116174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul}
116274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul
116374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void
116474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulwrite_monocolor_span_BGR( const GLcontext *ctx, GLuint n, GLint x, GLint y,
116574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul                          const GLchan color[4], const GLubyte mask[] )
116674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul{
116774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   const OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
116874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   GLchan *p = PIXELADDR3(x, y);
116974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   GLuint i;
117074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   for (i = 0; i < n; i++, p += 3) {
1171afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      if (mask[i]) {
117274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul         PACK_BGR(p, color[RCOMP], color[GCOMP], color[BCOMP]);
1173afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
1174afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
1175afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
1176afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
117774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void
117874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulwrite_rgba_pixels_RGB( const GLcontext *ctx, GLuint n,
117974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul                       const GLint x[], const GLint y[],
118074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul                       CONST GLchan rgba[][4], const GLubyte mask[] )
1181afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
1182c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul   const OSMesaContext osmesa = (const OSMesaContext) ctx;
1183afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLuint i;
118474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   for (i = 0; i < n; i++) {
118574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      if (mask[i]) {
118674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul         GLchan *p = PIXELADDR3(x[i], y[i]);
118774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul         PACK_RGB(p, rgba[i][RCOMP], rgba[i][GCOMP], rgba[i][BCOMP]);
118874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      }
118974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   }
119074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul}
119174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul
119274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void
119374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulwrite_rgba_pixels_BGR( const GLcontext *ctx, GLuint n,
119474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul                       const GLint x[], const GLint y[],
119574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul                       CONST GLchan rgba[][4], const GLubyte mask[] )
119674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul{
119774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   const OSMesaContext osmesa = (const OSMesaContext) ctx;
119874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   GLuint i;
119974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   for (i = 0; i < n; i++) {
1200afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      if (mask[i]) {
120174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul         GLchan *p = PIXELADDR3(x[i], y[i]);
120274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul         PACK_BGR(p, rgba[i][RCOMP], rgba[i][GCOMP], rgba[i][BCOMP]);
1203afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
1204afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
1205afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
1206afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
120774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void
120874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulwrite_monocolor_pixels_RGB( const GLcontext *ctx,
120974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul                            GLuint n, const GLint x[], const GLint y[],
121074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul                            const GLchan color[4], const GLubyte mask[] )
1211afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
1212c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul   const OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
1213afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLuint i;
121474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   for (i = 0; i < n; i++) {
1215afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      if (mask[i]) {
121674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul         GLchan *p = PIXELADDR3(x[i], y[i]);
121774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul         PACK_RGB(p, color[RCOMP], color[GCOMP], color[BCOMP]);
1218afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
1219afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
1220afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
1221afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
122274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void
122374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulwrite_monocolor_pixels_BGR( const GLcontext *ctx,
122474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul                            GLuint n, const GLint x[], const GLint y[],
122574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul                            const GLchan color[4], const GLubyte mask[] )
1226afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
122774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   const OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
122874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   GLuint i;
122974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   for (i = 0; i < n; i++) {
123074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      if (mask[i]) {
123174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul         GLchan *p = PIXELADDR3(x[i], y[i]);
123274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul         PACK_BGR(p, color[RCOMP], color[GCOMP], color[BCOMP]);
123374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      }
123474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   }
123574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul}
123674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul
123774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void
123874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulread_rgba_span3( const GLcontext *ctx, GLuint n, GLint x, GLint y,
123974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul                 GLchan rgba[][4] )
124074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul{
124174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   const OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
1242afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLuint i;
124374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   const GLchan *p = PIXELADDR3(x, y);
124474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   for (i = 0; i < n; i++, p += 3) {
124574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      rgba[i][RCOMP] = UNPACK_RED(p);
124674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      rgba[i][GCOMP] = UNPACK_GREEN(p);
124774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      rgba[i][BCOMP] = UNPACK_BLUE(p);
124865c6ca91795a71cf38dbe5f49f2d73fd9d4049cdBrian Paul      rgba[i][ACOMP] = CHAN_MAX;
1249afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
1250afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
1251afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
125274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void
125374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulread_rgba_pixels3( const GLcontext *ctx,
125474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul                   GLuint n, const GLint x[], const GLint y[],
125574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul                   GLchan rgba[][4], const GLubyte mask[] )
1256afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
125774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   const OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
1258afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLuint i;
125974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   for (i = 0; i < n; i++) {
1260afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      if (mask[i]) {
126174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul         const GLchan *p = PIXELADDR3(x[i], y[i]);
126274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul         rgba[i][RCOMP] = UNPACK_RED(p);
126374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul         rgba[i][GCOMP] = UNPACK_GREEN(p);
126474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul         rgba[i][BCOMP] = UNPACK_BLUE(p);
126565c6ca91795a71cf38dbe5f49f2d73fd9d4049cdBrian Paul         rgba[i][ACOMP] = CHAN_MAX;
1266afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
1267afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
1268afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
1269afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1270afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1271afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/**********************************************************************/
1272206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul/*****                2 byte RGB pixel support funcs              *****/
1273206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul/**********************************************************************/
1274206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul
1275206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul/* Write RGBA pixels to an RGB_565 buffer. */
1276206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paulstatic void
1277206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paulwrite_rgba_span2( const GLcontext *ctx,
1278206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul                  GLuint n, GLint x, GLint y,
1279206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul                  CONST GLubyte rgba[][4], const GLubyte mask[] )
1280206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul{
1281206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul   OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
1282206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul   GLushort *ptr2 = (GLushort *) PIXELADDR2(x, y);
1283206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul   GLuint i;
1284206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul   if (mask) {
1285206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul      for (i = 0; i < n; i++, ptr2++) {
1286206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul         if (mask[i]) {
1287206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul            PACK_RGB_565(*ptr2, rgba[i][RCOMP], rgba[i][GCOMP], rgba[i][BCOMP]);
1288206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul         }
1289206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul      }
1290206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul   }
1291206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul   else {
1292206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul      for (i = 0; i < n; i++, ptr2++) {
1293206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul         PACK_RGB_565(*ptr2, rgba[i][RCOMP], rgba[i][GCOMP], rgba[i][BCOMP]);
1294206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul      }
1295206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul   }
1296206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul}
1297206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul
1298206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul
1299206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul/* Write RGB pixels to an RGB_565 buffer. */
1300206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paulstatic void
1301206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paulwrite_rgb_span2( const GLcontext *ctx,
1302206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul                 GLuint n, GLint x, GLint y,
1303206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul                 CONST GLubyte rgb[][3], const GLubyte mask[] )
1304206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul{
1305206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul   OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
1306206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul   GLushort *ptr2 = (GLushort *) PIXELADDR2(x, y);
1307206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul   GLuint i;
1308206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul   if (mask) {
1309206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul      for (i = 0; i < n; i++, ptr2++) {
1310206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul         if (mask[i]) {
1311206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul            PACK_RGB_565(*ptr2, rgb[i][RCOMP], rgb[i][GCOMP], rgb[i][BCOMP]);
1312206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul         }
1313206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul      }
1314206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul   }
1315206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul   else {
1316206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul      for (i = 0; i < n; i++, ptr2++) {
1317206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul         PACK_RGB_565(*ptr2, rgb[i][RCOMP], rgb[i][GCOMP], rgb[i][BCOMP]);
1318206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul      }
1319206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul   }
1320206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul}
1321206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul
1322206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul
1323206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paulstatic void
1324206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paulwrite_monocolor_span2( const GLcontext *ctx, GLuint n, GLint x, GLint y,
1325206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul                       const GLchan color[4], const GLubyte mask[] )
1326206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul{
1327206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul   OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
1328206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul   GLushort pixel;
1329206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul   GLushort *ptr2 = (GLushort *) PIXELADDR2(x, y);
1330206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul   GLuint i;
1331206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul   PACK_RGB_565(pixel, color[RCOMP], color[GCOMP], color[BCOMP]);
1332206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul   for (i = 0; i < n; i++, ptr2++) {
1333206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul      if (mask[i]) {
1334206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul         *ptr2 = pixel;
1335206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul      }
1336206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul   }
1337206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul}
1338206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul
1339206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul
1340206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paulstatic void
1341206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paulwrite_rgba_pixels2( const GLcontext *ctx,
1342206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul                    GLuint n, const GLint x[], const GLint y[],
1343206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul                    CONST GLubyte rgba[][4], const GLubyte mask[] )
1344206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul{
1345206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul   OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
1346206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul   GLuint i;
1347206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul   for (i = 0; i < n; i++) {
1348206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul      if (mask[i]) {
1349206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul         GLushort *ptr2 = (GLushort *) PIXELADDR2(x[i],y[i]);
1350206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul         PACK_RGB_565(*ptr2, rgba[i][RCOMP], rgba[i][GCOMP], rgba[i][BCOMP]);
1351206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul      }
1352206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul   }
1353206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul}
1354206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul
1355206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paulstatic void
1356206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paulwrite_monocolor_pixels2( const GLcontext *ctx,
1357206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul                         GLuint n, const GLint x[], const GLint y[],
1358206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul                         const GLchan color[4], const GLubyte mask[] )
1359206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul{
1360206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul   OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
1361206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul   GLuint i;
1362206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul   GLushort pixel;
1363206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul   PACK_RGB_565(pixel, color[RCOMP], color[GCOMP], color[BCOMP]);
1364206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul   for (i = 0; i < n; i++) {
1365206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul      if (mask[i]) {
1366206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul         GLushort *ptr2 = (GLushort *) PIXELADDR2(x[i],y[i]);
1367206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul         *ptr2 = pixel;
1368206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul      }
1369206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul   }
1370206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul}
1371206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul
1372206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paulstatic void
1373206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paulread_rgba_span2( const GLcontext *ctx,
1374206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul                 GLuint n, GLint x, GLint y,
1375206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul                 GLubyte rgba[][4] )
1376206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul{
1377206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul   OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
1378206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul   GLuint i;
1379206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul   const GLushort *ptr2 = (const GLushort *) PIXELADDR2(x, y);
1380206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul   for (i = 0; i < n; i++, ptr2++) {
1381206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul      /* This should be fixed to get the low bits right */
1382206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul      rgba[i][RCOMP] = (*ptr2 >> 8) & 0xFe;
1383206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul      rgba[i][GCOMP] = (*ptr2 >> 3) & 0xFc;
1384206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul      rgba[i][BCOMP] = (*ptr2 << 3) & 0xFe;
1385206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul      rgba[i][ACOMP] = 0;
1386206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul   }
1387206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul}
1388206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul
1389206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paulstatic void
1390206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paulread_rgba_pixels2( const GLcontext *ctx,
1391206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul                   GLuint n, const GLint x[], const GLint y[],
1392206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul                   GLubyte rgba[][4], const GLubyte mask[] )
1393206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul{
1394206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul   OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
1395206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul   GLuint i;
1396206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul   for (i = 0; i < n; i++) {
1397206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul      if (mask[i]) {
1398206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul         /* This should be fixed to get the low bits right */
1399206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul         const GLushort *ptr2 = (const GLushort *) PIXELADDR2(x[i],y[i]);
1400206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul         rgba[i][RCOMP] = (*ptr2 >> 8) & 0xFE;
1401206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul         rgba[i][GCOMP] = (*ptr2 >> 3) & 0xFC;
1402206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul         rgba[i][BCOMP] = (*ptr2 << 3) & 0xFE;
1403206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul         rgba[i][ACOMP] = 0;
1404206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul      }
1405206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul   }
1406206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul}
1407206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul
1408206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul
1409206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul
1410206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul/**********************************************************************/
1411afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/*****        Read/write spans/arrays of CI pixels                *****/
1412afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/**********************************************************************/
1413afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1414afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/* Write 32-bit color index to buffer */
141574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void
141674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulwrite_index32_span( const GLcontext *ctx, GLuint n, GLint x, GLint y,
141774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul                    const GLuint index[], const GLubyte mask[] )
1418afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
141974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   const OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
142074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   GLchan *ptr1 = PIXELADDR1(x, y);
1421afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLuint i;
1422afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   if (mask) {
1423afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      for (i=0;i<n;i++,ptr1++) {
1424afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         if (mask[i]) {
142574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul            *ptr1 = (GLchan) index[i];
1426afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         }
1427afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
1428afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
1429afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   else {
1430afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      for (i=0;i<n;i++,ptr1++) {
143174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul         *ptr1 = (GLchan) index[i];
1432afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
1433afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
1434afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
1435afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1436afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1437afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/* Write 8-bit color index to buffer */
143874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void
143974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulwrite_index8_span( const GLcontext *ctx, GLuint n, GLint x, GLint y,
144074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul                   const GLubyte index[], const GLubyte mask[] )
1441afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
144274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   const OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
144374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   GLchan *ptr1 = PIXELADDR1(x, y);
1444afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLuint i;
1445afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   if (mask) {
1446afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      for (i=0;i<n;i++,ptr1++) {
1447afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         if (mask[i]) {
144874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul            *ptr1 = (GLchan) index[i];
1449afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         }
1450afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
1451afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
1452afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   else {
145374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      MEMCPY(ptr1, index, n * sizeof(GLchan));
1454afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
1455afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
1456afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1457afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
145874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void
145974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulwrite_monoindex_span( const GLcontext *ctx, GLuint n, GLint x, GLint y,
146074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul                      GLuint colorIndex, const GLubyte mask[] )
1461afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
146274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   const OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
146374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   GLchan *ptr1 = PIXELADDR1(x, y);
1464afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLuint i;
1465afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   for (i=0;i<n;i++,ptr1++) {
1466afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      if (mask[i]) {
146774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul         *ptr1 = (GLchan) colorIndex;
1468afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
1469afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
1470afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
1471afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1472afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
147374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void
147474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulwrite_index_pixels( const GLcontext *ctx,
147574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul                    GLuint n, const GLint x[], const GLint y[],
147674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul                    const GLuint index[], const GLubyte mask[] )
1477afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
147874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   const OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
1479afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLuint i;
1480afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   for (i=0;i<n;i++) {
1481afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      if (mask[i]) {
148274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul         GLchan *ptr1 = PIXELADDR1(x[i], y[i]);
148374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul         *ptr1 = (GLchan) index[i];
1484afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
1485afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
1486afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
1487afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1488afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
148974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void
149074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulwrite_monoindex_pixels( const GLcontext *ctx,
149174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul                        GLuint n, const GLint x[], const GLint y[],
149274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul                        GLuint colorIndex, const GLubyte mask[] )
1493afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
149474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   const OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
1495afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLuint i;
1496afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   for (i=0;i<n;i++) {
1497afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      if (mask[i]) {
149874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul         GLchan *ptr1 = PIXELADDR1(x[i], y[i]);
149974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul         *ptr1 = (GLchan) colorIndex;
1500afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
1501afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
1502afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
1503afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1504afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
150574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void
150674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulread_index_span( const GLcontext *ctx,
150774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul                 GLuint n, GLint x, GLint y, GLuint index[] )
1508afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
150974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   const OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
1510afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLuint i;
151174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   const GLchan *ptr1 = (const GLchan *) PIXELADDR1(x, y);
1512afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   for (i=0;i<n;i++,ptr1++) {
1513afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      index[i] = (GLuint) *ptr1;
1514afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
1515afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
1516afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1517afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
151874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void
151974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulread_index_pixels( const GLcontext *ctx,
152074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul                   GLuint n, const GLint x[], const GLint y[],
152174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul                   GLuint index[], const GLubyte mask[] )
1522afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
152374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   const OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
1524afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLuint i;
1525afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   for (i=0;i<n;i++) {
1526afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      if (mask[i] ) {
152774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul         const GLchan *ptr1 = PIXELADDR1(x[i], y[i]);
1528afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         index[i] = (GLuint) *ptr1;
1529afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
1530afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
1531afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
1532afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1533afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1534afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1535afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/**********************************************************************/
1536afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/*****                   Optimized line rendering                 *****/
1537afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/**********************************************************************/
1538afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1539afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1540afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/*
1541afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Draw a flat-shaded, RGB line into an osmesa buffer.
1542afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */
154374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void
154474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulflat_rgba_line( GLcontext *ctx, const SWvertex *vert0, const SWvertex *vert1 )
1545afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
154674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   const OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
154774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   const GLchan *color = vert0->color;
1548afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1549afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#define INTERP_XY 1
1550afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#define CLIP_HACK 1
155174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul#define PLOT(X, Y)						\
155274b493a5e61237de081a438e774e5d8139d4c6b7Brian Pauldo {								\
155374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   GLchan *p = PIXELADDR4(X, Y);				\
155474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   PACK_RGBA(p, color[0], color[1], color[2], color[3]);	\
155574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul} while (0)
1556afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1557afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#ifdef WIN32
1558724abeb058ca9372c5a9b9e38ee43dde1accaa41Keith Whitwell#include "..\swrast\s_linetemp.h"
1559afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#else
1560724abeb058ca9372c5a9b9e38ee43dde1accaa41Keith Whitwell#include "swrast/s_linetemp.h"
1561afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#endif
1562afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
1563afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1564afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1565afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/*
1566afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Draw a flat-shaded, Z-less, RGB line into an osmesa buffer.
1567afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */
156874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void
156974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulflat_rgba_z_line(GLcontext *ctx, const SWvertex *vert0, const SWvertex *vert1)
1570afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
157174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   const OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
157274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   const GLchan *color = vert0->color;
1573afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1574afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#define INTERP_XY 1
1575afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#define INTERP_Z 1
1576ed30dfa1264ec8875a3162c3c8778bc703bf11d5Brian Paul#define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE
1577afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#define CLIP_HACK 1
157874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul#define PLOT(X, Y)					\
157974b493a5e61237de081a438e774e5d8139d4c6b7Brian Pauldo {							\
158074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   if (Z < *zPtr) {					\
158174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      GLchan *p = PIXELADDR4(X, Y);			\
158274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      PACK_RGBA(p, color[RCOMP], color[GCOMP],		\
158374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul                   color[BCOMP], color[ACOMP]);		\
158474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      *zPtr = Z;					\
158574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   }							\
158674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul} while (0)
158774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul
1588afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1589afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#ifdef WIN32
1590724abeb058ca9372c5a9b9e38ee43dde1accaa41Keith Whitwell#include "..\swrast\s_linetemp.h"
1591afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#else
1592724abeb058ca9372c5a9b9e38ee43dde1accaa41Keith Whitwell#include "swrast/s_linetemp.h"
1593afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#endif
1594afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
1595afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1596afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1597afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/*
1598afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Draw a flat-shaded, alpha-blended, RGB line into an osmesa buffer.
159974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul * XXX update for GLchan
1600afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */
160174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void
160274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulflat_blend_rgba_line( GLcontext *ctx,
160374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul                      const SWvertex *vert0, const SWvertex *vert1 )
1604afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
160574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   const OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
160674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   const GLint rshift = osmesa->rshift;
160774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   const GLint gshift = osmesa->gshift;
160874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   const GLint bshift = osmesa->bshift;
160974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   const GLint avalue = vert0->color[3];
161065c6ca91795a71cf38dbe5f49f2d73fd9d4049cdBrian Paul   const GLint msavalue = CHAN_MAX - avalue;
161174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   const GLint rvalue = vert0->color[0]*avalue;
161274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   const GLint gvalue = vert0->color[1]*avalue;
161374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   const GLint bvalue = vert0->color[2]*avalue;
1614afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1615afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#define INTERP_XY 1
1616afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#define CLIP_HACK 1
1617afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#define PLOT(X,Y)					\
161865c6ca91795a71cf38dbe5f49f2d73fd9d4049cdBrian Paul   { GLuint *ptr4 = (GLuint *) PIXELADDR4(X, Y);	\
16197e67fb41fb54e050f6983b4de09ed3a317d6148fBrian Paul     GLuint  pixel = 0;					\
1620afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg     pixel |=((((((*ptr4) >> rshift) & 0xff)*msavalue+rvalue)>>8) << rshift);\
1621afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg     pixel |=((((((*ptr4) >> gshift) & 0xff)*msavalue+gvalue)>>8) << gshift);\
1622afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg     pixel |=((((((*ptr4) >> bshift) & 0xff)*msavalue+bvalue)>>8) << bshift);\
16237e67fb41fb54e050f6983b4de09ed3a317d6148fBrian Paul     *ptr4 = pixel;					\
1624afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
1625afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1626afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#ifdef WIN32
1627724abeb058ca9372c5a9b9e38ee43dde1accaa41Keith Whitwell#include "..\swrast\s_linetemp.h"
1628afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#else
1629724abeb058ca9372c5a9b9e38ee43dde1accaa41Keith Whitwell#include "swrast/s_linetemp.h"
1630afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#endif
1631afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
1632afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1633ed30dfa1264ec8875a3162c3c8778bc703bf11d5Brian Paul
1634afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/*
1635afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Draw a flat-shaded, Z-less, alpha-blended, RGB line into an osmesa buffer.
163674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul * XXX update for GLchan
1637afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */
163874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void
163974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulflat_blend_rgba_z_line( GLcontext *ctx,
164074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul                        const SWvertex *vert0, const SWvertex *vert1 )
1641afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
164274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   const OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
164374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   const GLint rshift = osmesa->rshift;
164474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   const GLint gshift = osmesa->gshift;
164574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   const GLint bshift = osmesa->bshift;
164674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   const GLint avalue = vert0->color[3];
164774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   const GLint msavalue = 256 - avalue;
164874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   const GLint rvalue = vert0->color[0]*avalue;
164974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   const GLint gvalue = vert0->color[1]*avalue;
165074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   const GLint bvalue = vert0->color[2]*avalue;
1651afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1652afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#define INTERP_XY 1
1653afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#define INTERP_Z 1
1654ed30dfa1264ec8875a3162c3c8778bc703bf11d5Brian Paul#define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE
1655afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#define CLIP_HACK 1
16567e67fb41fb54e050f6983b4de09ed3a317d6148fBrian Paul#define PLOT(X,Y)							\
16577e67fb41fb54e050f6983b4de09ed3a317d6148fBrian Paul	if (Z < *zPtr) {						\
165874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul	   GLuint *ptr4 = (GLuint *) PIXELADDR4(X, Y);			\
16597e67fb41fb54e050f6983b4de09ed3a317d6148fBrian Paul	   GLuint  pixel = 0;						\
1660ed30dfa1264ec8875a3162c3c8778bc703bf11d5Brian Paul	   pixel |=((((((*ptr4) >> rshift) & 0xff)*msavalue+rvalue)>>8) << rshift);	\
1661ed30dfa1264ec8875a3162c3c8778bc703bf11d5Brian Paul	   pixel |=((((((*ptr4) >> gshift) & 0xff)*msavalue+gvalue)>>8) << gshift);	\
1662ed30dfa1264ec8875a3162c3c8778bc703bf11d5Brian Paul	   pixel |=((((((*ptr4) >> bshift) & 0xff)*msavalue+bvalue)>>8) << bshift);	\
16637e67fb41fb54e050f6983b4de09ed3a317d6148fBrian Paul	   *ptr4 = pixel; 						\
1664afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	}
1665afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1666afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#ifdef WIN32
1667724abeb058ca9372c5a9b9e38ee43dde1accaa41Keith Whitwell#include "..\swrast\s_linetemp.h"
1668afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#else
1669724abeb058ca9372c5a9b9e38ee43dde1accaa41Keith Whitwell#include "swrast/s_linetemp.h"
1670afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#endif
1671afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
1672afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1673ed30dfa1264ec8875a3162c3c8778bc703bf11d5Brian Paul
1674afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/*
1675afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Draw a flat-shaded, Z-less, alpha-blended, RGB line into an osmesa buffer.
167674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul * XXX update for GLchan
1677afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */
167874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void
167974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulflat_blend_rgba_z_line_write( GLcontext *ctx,
168074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul                              const SWvertex *vert0, const SWvertex *vert1 )
1681afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
168274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   const OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
168374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   const GLint rshift = osmesa->rshift;
168474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   const GLint gshift = osmesa->gshift;
168574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   const GLint bshift = osmesa->bshift;
168674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   const GLint avalue = vert0->color[3];
168774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   const GLint msavalue = 256 - avalue;
168874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   const GLint rvalue = vert0->color[0]*avalue;
168974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   const GLint gvalue = vert0->color[1]*avalue;
169074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   const GLint bvalue = vert0->color[2]*avalue;
1691afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1692afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#define INTERP_XY 1
1693afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#define INTERP_Z 1
1694ed30dfa1264ec8875a3162c3c8778bc703bf11d5Brian Paul#define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE
1695afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#define CLIP_HACK 1
16967e67fb41fb54e050f6983b4de09ed3a317d6148fBrian Paul#define PLOT(X,Y)							\
16977e67fb41fb54e050f6983b4de09ed3a317d6148fBrian Paul	if (Z < *zPtr) {						\
169874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul	   GLuint *ptr4 = (GLuint *) PIXELADDR4(X, Y);			\
16997e67fb41fb54e050f6983b4de09ed3a317d6148fBrian Paul	   GLuint  pixel = 0;						\
1700ed30dfa1264ec8875a3162c3c8778bc703bf11d5Brian Paul	   pixel |=((((((*ptr4) >> rshift) & 0xff)*msavalue+rvalue)>>8) << rshift);	\
1701ed30dfa1264ec8875a3162c3c8778bc703bf11d5Brian Paul	   pixel |=((((((*ptr4) >> gshift) & 0xff)*msavalue+gvalue)>>8) << gshift);	\
1702ed30dfa1264ec8875a3162c3c8778bc703bf11d5Brian Paul	   pixel |=((((((*ptr4) >> bshift) & 0xff)*msavalue+bvalue)>>8) << bshift);	\
17037e67fb41fb54e050f6983b4de09ed3a317d6148fBrian Paul	   *ptr4 = pixel;						\
17047e67fb41fb54e050f6983b4de09ed3a317d6148fBrian Paul	   *zPtr = Z;							\
1705afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	}
1706afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1707afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#ifdef WIN32
1708724abeb058ca9372c5a9b9e38ee43dde1accaa41Keith Whitwell#include "..\swrast\s_linetemp.h"
1709afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#else
1710724abeb058ca9372c5a9b9e38ee43dde1accaa41Keith Whitwell#include "swrast/s_linetemp.h"
1711afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#endif
1712afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
1713afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1714afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1715afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/*
1716afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Analyze context state to see if we can provide a fast line drawing
1717afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * function, like those in lines.c.  Otherwise, return NULL.
1718afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */
1719dbd1e2b5990a3689bf718296c57c14fc3ba38db5Jouk Jansenstatic swrast_line_func
17201e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwellosmesa_choose_line_function( GLcontext *ctx )
1721afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
172274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   const OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
172374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   const SWcontext *swrast = SWRAST_CONTEXT(ctx);
1724afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
172574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   if (CHAN_BITS != 8)                    return NULL;
17262d595d70202bad560c27ea81ec71b740415b3355Brian Paul   if (ctx->RenderMode != GL_RENDER)      return NULL;
1727afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   if (ctx->Line.SmoothFlag)              return NULL;
17282d595d70202bad560c27ea81ec71b740415b3355Brian Paul   if (ctx->Texture._ReallyEnabled)       return NULL;
172974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   if (ctx->Light.ShadeModel != GL_FLAT)  return NULL;
173074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   if (ctx->Line.Width != 1.0F)           return NULL;
173174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   if (ctx->Line.StippleFlag)             return NULL;
173274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   if (ctx->Line.SmoothFlag)              return NULL;
173374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   if (osmesa->format != OSMESA_RGBA &&
173474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul       osmesa->format != OSMESA_BGRA &&
173574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul       osmesa->format != OSMESA_ARGB)     return NULL;
173674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul
173774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   if (swrast->_RasterMask==DEPTH_BIT
173874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul       && ctx->Depth.Func==GL_LESS
173974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul       && ctx->Depth.Mask==GL_TRUE
174074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul       && ctx->Visual.depthBits == DEFAULT_SOFTWARE_DEPTH_BITS) {
174174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      return flat_rgba_z_line;
174274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   }
174374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul
174474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   if (swrast->_RasterMask == 0) {
174574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      return flat_rgba_line;
174674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   }
174774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul
174874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   if (swrast->_RasterMask==(DEPTH_BIT|BLEND_BIT)
174974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul       && ctx->Depth.Func==GL_LESS
175074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul       && ctx->Depth.Mask==GL_TRUE
175174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul       && ctx->Visual.depthBits == DEFAULT_SOFTWARE_DEPTH_BITS
175274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul       && ctx->Color.BlendSrcRGB==GL_SRC_ALPHA
175374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul       && ctx->Color.BlendDstRGB==GL_ONE_MINUS_SRC_ALPHA
175474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul       && ctx->Color.BlendSrcA==GL_SRC_ALPHA
175574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul       && ctx->Color.BlendDstA==GL_ONE_MINUS_SRC_ALPHA
175674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul       && ctx->Color.BlendEquation==GL_FUNC_ADD_EXT) {
175774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      return flat_blend_rgba_z_line_write;
175874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   }
175974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul
176074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   if (swrast->_RasterMask==(DEPTH_BIT|BLEND_BIT)
176174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul       && ctx->Depth.Func==GL_LESS
176274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul       && ctx->Depth.Mask==GL_FALSE
176374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul       && ctx->Visual.depthBits == DEFAULT_SOFTWARE_DEPTH_BITS
176474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul       && ctx->Color.BlendSrcRGB==GL_SRC_ALPHA
176574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul       && ctx->Color.BlendDstRGB==GL_ONE_MINUS_SRC_ALPHA
176674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul       && ctx->Color.BlendSrcA==GL_SRC_ALPHA
176774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul       && ctx->Color.BlendDstA==GL_ONE_MINUS_SRC_ALPHA
176874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul       && ctx->Color.BlendEquation==GL_FUNC_ADD_EXT) {
176974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      return flat_blend_rgba_z_line;
177074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   }
1771afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
177274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   if (swrast->_RasterMask==BLEND_BIT
177374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul       && ctx->Color.BlendSrcRGB==GL_SRC_ALPHA
177474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul       && ctx->Color.BlendDstRGB==GL_ONE_MINUS_SRC_ALPHA
177574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul       && ctx->Color.BlendSrcA==GL_SRC_ALPHA
177674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul       && ctx->Color.BlendDstA==GL_ONE_MINUS_SRC_ALPHA
177774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul       && ctx->Color.BlendEquation==GL_FUNC_ADD_EXT) {
177874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      return flat_blend_rgba_line;
1779afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
178074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul
1781afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   return NULL;
1782afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
1783afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1784afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1785afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/**********************************************************************/
1786afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/*****                 Optimized triangle rendering               *****/
1787afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/**********************************************************************/
1788afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1789afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1790afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/*
1791afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Smooth-shaded, z-less triangle, RGBA color.
1792afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */
1793dbd1e2b5990a3689bf718296c57c14fc3ba38db5Jouk Jansenstatic void smooth_rgba_z_triangle( GLcontext *ctx,
1794a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul				    const SWvertex *v0,
1795a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul                                    const SWvertex *v1,
1796a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul                                    const SWvertex *v2 )
1797afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
179874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   const OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
179923ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank
1800afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#define INTERP_Z 1
1801ed30dfa1264ec8875a3162c3c8778bc703bf11d5Brian Paul#define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE
1802afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#define INTERP_RGB 1
1803afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#define INTERP_ALPHA 1
18049bf68ad963ba92b5d1e725f965979042495a5313Brian Paul#define RENDER_SPAN( span )					\
18059bf68ad963ba92b5d1e725f965979042495a5313Brian Paul   GLuint i;							\
18069bf68ad963ba92b5d1e725f965979042495a5313Brian Paul   GLchan *img = PIXELADDR4(span.x, span.y); 			\
18079bf68ad963ba92b5d1e725f965979042495a5313Brian Paul   for (i = 0; i < span.count; i++, img += 4) {			\
18089bf68ad963ba92b5d1e725f965979042495a5313Brian Paul      const GLdepth z = FixedToDepth(span.z);			\
1809afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      if (z < zRow[i]) {					\
18109bf68ad963ba92b5d1e725f965979042495a5313Brian Paul         PACK_RGBA(img, FixedToInt(span.red),			\
18119bf68ad963ba92b5d1e725f965979042495a5313Brian Paul            FixedToInt(span.green), FixedToInt(span.blue),	\
18129bf68ad963ba92b5d1e725f965979042495a5313Brian Paul            FixedToInt(span.alpha));				\
1813afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         zRow[i] = z;						\
1814afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }								\
18159bf68ad963ba92b5d1e725f965979042495a5313Brian Paul      span.red += span.redStep;					\
18169bf68ad963ba92b5d1e725f965979042495a5313Brian Paul      span.green += span.greenStep;				\
18179bf68ad963ba92b5d1e725f965979042495a5313Brian Paul      span.blue += span.blueStep;				\
18189bf68ad963ba92b5d1e725f965979042495a5313Brian Paul      span.alpha += span.alphaStep;				\
18199bf68ad963ba92b5d1e725f965979042495a5313Brian Paul      span.z += span.zStep;					\
18209bf68ad963ba92b5d1e725f965979042495a5313Brian Paul   }
18219bf68ad963ba92b5d1e725f965979042495a5313Brian Paul
1822afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#ifdef WIN32
1823724abeb058ca9372c5a9b9e38ee43dde1accaa41Keith Whitwell#include "..\swrast\s_tritemp.h"
1824afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#else
1825724abeb058ca9372c5a9b9e38ee43dde1accaa41Keith Whitwell#include "swrast/s_tritemp.h"
1826afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#endif
1827afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
1828afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1829afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1830afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1831afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1832afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/*
1833afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Flat-shaded, z-less triangle, RGBA color.
1834afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */
1835dbd1e2b5990a3689bf718296c57c14fc3ba38db5Jouk Jansenstatic void flat_rgba_z_triangle( GLcontext *ctx,
1836a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul				  const SWvertex *v0,
1837a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul                                  const SWvertex *v1,
1838a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul                                  const SWvertex *v2 )
1839afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
184074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   const OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
1841afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#define INTERP_Z 1
1842ed30dfa1264ec8875a3162c3c8778bc703bf11d5Brian Paul#define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE
184374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul#define SETUP_CODE						\
184474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   GLuint pixel;						\
184574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   PACK_RGBA((GLchan *) &pixel, v0->color[0], v0->color[1],	\
184674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul                                v0->color[2], v0->color[3]);
184774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul
18489bf68ad963ba92b5d1e725f965979042495a5313Brian Paul#define RENDER_SPAN( span )				\
18499bf68ad963ba92b5d1e725f965979042495a5313Brian Paul   GLuint i;						\
18509bf68ad963ba92b5d1e725f965979042495a5313Brian Paul   GLuint *img = (GLuint *) PIXELADDR4(span.x, span.y);	\
18519bf68ad963ba92b5d1e725f965979042495a5313Brian Paul   for (i = 0; i < span.count; i++) {			\
18529bf68ad963ba92b5d1e725f965979042495a5313Brian Paul      const GLdepth z = FixedToDepth(span.z);		\
185374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      if (z < zRow[i]) {				\
185474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul         img[i] = pixel;				\
185574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul         zRow[i] = z;					\
185674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      }							\
18579bf68ad963ba92b5d1e725f965979042495a5313Brian Paul      span.z += span.zStep;				\
18589bf68ad963ba92b5d1e725f965979042495a5313Brian Paul   }
18599bf68ad963ba92b5d1e725f965979042495a5313Brian Paul
1860afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#ifdef WIN32
1861724abeb058ca9372c5a9b9e38ee43dde1accaa41Keith Whitwell#include "..\swrast\s_tritemp.h"
1862afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#else
1863724abeb058ca9372c5a9b9e38ee43dde1accaa41Keith Whitwell#include "swrast/s_tritemp.h"
1864afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#endif
1865afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
1866afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1867afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1868afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1869afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/*
1870afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Return pointer to an accelerated triangle function if possible.
1871afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */
1872dbd1e2b5990a3689bf718296c57c14fc3ba38db5Jouk Jansenstatic swrast_tri_func
18731e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwellosmesa_choose_triangle_function( GLcontext *ctx )
1874afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
187574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   const OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
187674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   const SWcontext *swrast = SWRAST_CONTEXT(ctx);
187774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul
187874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   if (CHAN_BITS != 8)                  return (swrast_tri_func) NULL;
187974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   if (ctx->RenderMode != GL_RENDER)    return (swrast_tri_func) NULL;
188074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   if (ctx->Polygon.SmoothFlag)         return (swrast_tri_func) NULL;
188174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   if (ctx->Polygon.StippleFlag)        return (swrast_tri_func) NULL;
188274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   if (ctx->Texture._ReallyEnabled)     return (swrast_tri_func) NULL;
188374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   if (osmesa->format != OSMESA_RGBA &&
188474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul       osmesa->format != OSMESA_BGRA &&
188574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul       osmesa->format != OSMESA_ARGB)   return (swrast_tri_func) NULL;
188674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul
188774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   if (swrast->_RasterMask == DEPTH_BIT &&
188874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul       ctx->Depth.Func == GL_LESS &&
188974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul       ctx->Depth.Mask == GL_TRUE &&
189074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul       ctx->Visual.depthBits == DEFAULT_SOFTWARE_DEPTH_BITS) {
189174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      if (ctx->Light.ShadeModel == GL_SMOOTH) {
1892afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         return smooth_rgba_z_triangle;
1893afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
1894afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      else {
1895afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         return flat_rgba_z_triangle;
1896afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
1897afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
189874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   return (swrast_tri_func) NULL;
18991e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell}
19001e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell
190174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul
190274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul
19031e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell/* Override for the swrast triangle-selection function.  Try to use one
19041e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell * of our internal triangle functions, otherwise fall back to the
1905dbd1e2b5990a3689bf718296c57c14fc3ba38db5Jouk Jansen * standard swrast functions.
19061e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell */
19071e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwellstatic void osmesa_choose_triangle( GLcontext *ctx )
19081e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell{
19091e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell   SWcontext *swrast = SWRAST_CONTEXT(ctx);
19101e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell
19111e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell   swrast->Triangle = osmesa_choose_triangle_function( ctx );
19121e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell   if (!swrast->Triangle)
19131e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell      _swrast_choose_triangle( ctx );
1914afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
1915afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
19161e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwellstatic void osmesa_choose_line( GLcontext *ctx )
19171e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell{
19181e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell   SWcontext *swrast = SWRAST_CONTEXT(ctx);
19191e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell
19201e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell   swrast->Line = osmesa_choose_line_function( ctx );
19211e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell   if (!swrast->Line)
19221e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell      _swrast_choose_line( ctx );
19231e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell}
19241e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell
19251e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell
19262d595d70202bad560c27ea81ec71b740415b3355Brian Paul#define OSMESA_NEW_LINE   (_NEW_LINE | \
19272d595d70202bad560c27ea81ec71b740415b3355Brian Paul                           _NEW_TEXTURE | \
19282d595d70202bad560c27ea81ec71b740415b3355Brian Paul                           _NEW_LIGHT | \
19292d595d70202bad560c27ea81ec71b740415b3355Brian Paul                           _NEW_DEPTH | \
19302d595d70202bad560c27ea81ec71b740415b3355Brian Paul                           _NEW_RENDERMODE | \
1931dbd1e2b5990a3689bf718296c57c14fc3ba38db5Jouk Jansen                           _SWRAST_NEW_RASTERMASK)
19322d595d70202bad560c27ea81ec71b740415b3355Brian Paul
19332d595d70202bad560c27ea81ec71b740415b3355Brian Paul#define OSMESA_NEW_TRIANGLE (_NEW_POLYGON | \
19342d595d70202bad560c27ea81ec71b740415b3355Brian Paul                             _NEW_TEXTURE | \
19352d595d70202bad560c27ea81ec71b740415b3355Brian Paul                             _NEW_LIGHT | \
19362d595d70202bad560c27ea81ec71b740415b3355Brian Paul                             _NEW_DEPTH | \
19372d595d70202bad560c27ea81ec71b740415b3355Brian Paul                             _NEW_RENDERMODE | \
19382d595d70202bad560c27ea81ec71b740415b3355Brian Paul                             _SWRAST_NEW_RASTERMASK)
19391e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell
19401e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell
1941dbd1e2b5990a3689bf718296c57c14fc3ba38db5Jouk Jansen/* Extend the software rasterizer with our line and triangle
19421e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell * functions.
19431e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell */
19441e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwellstatic void osmesa_register_swrast_functions( GLcontext *ctx )
19451e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell{
19461e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell   SWcontext *swrast = SWRAST_CONTEXT( ctx );
1947dbd1e2b5990a3689bf718296c57c14fc3ba38db5Jouk Jansen
19481e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell   swrast->choose_line = osmesa_choose_line;
19491e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell   swrast->choose_triangle = osmesa_choose_triangle;
1950dbd1e2b5990a3689bf718296c57c14fc3ba38db5Jouk Jansen
19511e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell   swrast->invalidate_line |= OSMESA_NEW_LINE;
19521e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell   swrast->invalidate_triangle |= OSMESA_NEW_TRIANGLE;
19531e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell}
1954ed30dfa1264ec8875a3162c3c8778bc703bf11d5Brian Paul
1955ed30dfa1264ec8875a3162c3c8778bc703bf11d5Brian Paul
1956afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgstatic const GLubyte *get_string( GLcontext *ctx, GLenum name )
1957afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
1958afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   (void) ctx;
1959afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   switch (name) {
1960afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GL_RENDERER:
1961afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         return (const GLubyte *) "Mesa OffScreen";
1962afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      default:
1963afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         return NULL;
1964afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
1965afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
1966afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1967afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1968cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwellstatic void osmesa_update_state( GLcontext *ctx, GLuint new_state )
1969afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
1970c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul   OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
1971709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell   struct swrast_device_driver *swdd = _swrast_GetDeviceDriverReference( ctx );
1972709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell   TNLcontext *tnl = TNL_CONTEXT(ctx);
1973304357dcd496f7ebf499fd9c77b4eba83a75abd5Brian Paul
1974304357dcd496f7ebf499fd9c77b4eba83a75abd5Brian Paul   ASSERT((void *) osmesa == (void *) ctx->DriverCtx);
1975afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
197674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   /*
197774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul    * XXX these function pointers could be initialized just once during
197874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul    * context creation since they don't depend on any state changes.
197974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul    */
198074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul
1981afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   ctx->Driver.GetString = get_string;
1982afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   ctx->Driver.UpdateState = osmesa_update_state;
1983cea0e8e6700e871bb9bcb334cb75fbfbfcdfd702Brian Paul   ctx->Driver.SetDrawBuffer = set_draw_buffer;
1984a81b3532f7c984878ba1d4b38f796abf731f76b1Brian Paul   ctx->Driver.ResizeBuffersMESA = _swrast_alloc_buffers;
1985a81b3532f7c984878ba1d4b38f796abf731f76b1Brian Paul   ctx->Driver.GetBufferSize = buffer_size;
1986a81b3532f7c984878ba1d4b38f796abf731f76b1Brian Paul
19875c1e7fa6ee72f4403d9ec9d12830dd689b966e71Keith Whitwell   ctx->Driver.Accum = _swrast_Accum;
19885c1e7fa6ee72f4403d9ec9d12830dd689b966e71Keith Whitwell   ctx->Driver.Bitmap = _swrast_Bitmap;
1989afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   ctx->Driver.Clear = clear;
19905c1e7fa6ee72f4403d9ec9d12830dd689b966e71Keith Whitwell   ctx->Driver.CopyPixels = _swrast_CopyPixels;
19915c1e7fa6ee72f4403d9ec9d12830dd689b966e71Keith Whitwell   ctx->Driver.DrawPixels = _swrast_DrawPixels;
19925c1e7fa6ee72f4403d9ec9d12830dd689b966e71Keith Whitwell   ctx->Driver.ReadPixels = _swrast_ReadPixels;
1993afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
19947d58f44f73be59bd3583e6dfeedf56c43f7fbd55Brian Paul   ctx->Driver.ChooseTextureFormat = _mesa_choose_tex_format;
19958e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul   ctx->Driver.TexImage1D = _mesa_store_teximage1d;
19968e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul   ctx->Driver.TexImage2D = _mesa_store_teximage2d;
19978e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul   ctx->Driver.TexImage3D = _mesa_store_teximage3d;
19988e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul   ctx->Driver.TexSubImage1D = _mesa_store_texsubimage1d;
19998e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul   ctx->Driver.TexSubImage2D = _mesa_store_texsubimage2d;
20008e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul   ctx->Driver.TexSubImage3D = _mesa_store_texsubimage3d;
20018e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul   ctx->Driver.TestProxyTexImage = _mesa_test_proxy_teximage;
20028e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul
2003709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell   ctx->Driver.CopyTexImage1D = _swrast_copy_teximage1d;
2004709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell   ctx->Driver.CopyTexImage2D = _swrast_copy_teximage2d;
2005709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell   ctx->Driver.CopyTexSubImage1D = _swrast_copy_texsubimage1d;
2006709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell   ctx->Driver.CopyTexSubImage2D = _swrast_copy_texsubimage2d;
2007709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell   ctx->Driver.CopyTexSubImage3D = _swrast_copy_texsubimage3d;
2008709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell   ctx->Driver.CopyColorTable = _swrast_CopyColorTable;
2009709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell   ctx->Driver.CopyColorSubTable = _swrast_CopyColorSubTable;
2010709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell   ctx->Driver.CopyConvolutionFilter1D = _swrast_CopyConvolutionFilter1D;
2011709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell   ctx->Driver.CopyConvolutionFilter2D = _swrast_CopyConvolutionFilter2D;
2012709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell
2013afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
2014afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   /* RGB(A) span/pixel functions */
201574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   if (osmesa->format == OSMESA_RGB) {
2016709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell      swdd->WriteRGBASpan = write_rgba_span_RGB;
2017709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell      swdd->WriteRGBSpan = write_rgb_span_RGB;
2018709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell      swdd->WriteMonoRGBASpan = write_monocolor_span_RGB;
2019709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell      swdd->WriteRGBAPixels = write_rgba_pixels_RGB;
2020709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell      swdd->WriteMonoRGBAPixels = write_monocolor_pixels_RGB;
2021709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell      swdd->ReadRGBASpan = read_rgba_span3;
2022709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell      swdd->ReadRGBAPixels = read_rgba_pixels3;
202374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   }
202474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   else if (osmesa->format == OSMESA_BGR) {
2025709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell      swdd->WriteRGBASpan = write_rgba_span_BGR;
2026709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell      swdd->WriteRGBSpan = write_rgb_span_BGR;
2027709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell      swdd->WriteMonoRGBASpan = write_monocolor_span_BGR;
2028709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell      swdd->WriteRGBAPixels = write_rgba_pixels_BGR;
2029709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell      swdd->WriteMonoRGBAPixels = write_monocolor_pixels_BGR;
2030709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell      swdd->ReadRGBASpan = read_rgba_span3;
2031709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell      swdd->ReadRGBAPixels = read_rgba_pixels3;
2032afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
2033206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul   else if (osmesa->format == OSMESA_RGB_565) {
2034206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul      swdd->WriteRGBASpan = write_rgba_span2;
2035206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul      swdd->WriteRGBSpan = write_rgb_span2;
2036206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul      swdd->WriteMonoRGBASpan = write_monocolor_span2;
2037206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul      swdd->WriteRGBAPixels = write_rgba_pixels2;
2038206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul      swdd->WriteMonoRGBAPixels = write_monocolor_pixels2;
2039206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul      swdd->ReadRGBASpan = read_rgba_span2;
2040206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul      swdd->ReadRGBAPixels = read_rgba_pixels2;
2041206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul   }
2042afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   else {
20432db44ffe9d591b0686755e2128ae9a6a1611f2a5Brian Paul      /* 4 GLchan / pixel in frame buffer */
2044709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell      swdd->WriteRGBSpan = write_rgb_span;
2045709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell      swdd->WriteRGBAPixels = write_rgba_pixels;
2046709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell      swdd->WriteMonoRGBASpan = write_monocolor_span;
2047709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell      swdd->WriteMonoRGBAPixels = write_monocolor_pixels;
204874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      if (osmesa->format == OSMESA_RGBA &&
204974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul          CHAN_TYPE == GL_UNSIGNED_BYTE &&
205074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul          RCOMP==0 && GCOMP==1 && BCOMP==2 && ACOMP==3) {
205174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul         /* special, fast case */
2052709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell         swdd->WriteRGBASpan = write_rgba_span_rgba;
2053709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell         swdd->ReadRGBASpan = read_rgba_span_rgba;
205474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      }
205574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      else {
2056709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell         swdd->WriteRGBASpan = write_rgba_span;
2057709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell         swdd->ReadRGBASpan = read_rgba_span;
205874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      }
2059709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell      swdd->ReadRGBAPixels = read_rgba_pixels;
2060afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
2061afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
2062afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   /* CI span/pixel functions */
2063709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell   swdd->WriteCI32Span = write_index32_span;
2064709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell   swdd->WriteCI8Span = write_index8_span;
2065709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell   swdd->WriteMonoCISpan = write_monoindex_span;
2066709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell   swdd->WriteCI32Pixels = write_index_pixels;
2067709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell   swdd->WriteMonoCIPixels = write_monoindex_pixels;
2068709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell   swdd->ReadCI32Span = read_index_span;
2069709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell   swdd->ReadCI32Pixels = read_index_pixels;
2070709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell
2071709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell   swdd->SetReadBuffer = set_read_buffer;
2072709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell
2073bc69de5f21ebb4d6e1c65bf5652d17a9fc87dda7Keith Whitwell   tnl->Driver.RunPipeline = _tnl_run_pipeline;
2074709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell   tnl->Driver.RenderStart = _swsetup_RenderStart;
2075709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell   tnl->Driver.RenderFinish = _swsetup_RenderFinish;
2076709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell   tnl->Driver.BuildProjectedVertices = _swsetup_BuildProjectedVertices;
2077709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell   tnl->Driver.RenderPrimitive = _swsetup_RenderPrimitive;
2078709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell   tnl->Driver.PointsFunc = _swsetup_Points;
2079709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell   tnl->Driver.LineFunc = _swsetup_Line;
2080709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell   tnl->Driver.TriangleFunc = _swsetup_Triangle;
2081709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell   tnl->Driver.QuadFunc = _swsetup_Quad;
2082709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell   tnl->Driver.ResetLineStipple = _swrast_ResetLineStipple;
2083709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell   tnl->Driver.RenderInterp = _swsetup_RenderInterp;
2084709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell   tnl->Driver.RenderCopyPV = _swsetup_RenderCopyPV;
2085709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell   tnl->Driver.RenderClippedLine = _swsetup_RenderClippedLine;
2086709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell   tnl->Driver.RenderClippedPolygon = _swsetup_RenderClippedPolygon;
2087709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell
208823caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell
2089cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   _swrast_InvalidateState( ctx, new_state );
2090cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   _swsetup_InvalidateState( ctx, new_state );
209158e991705392a2e17a1c8b034f4083a0adaf1943Keith Whitwell   _ac_InvalidateState( ctx, new_state );
2092cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   _tnl_InvalidateState( ctx, new_state );
2093afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
2094