osmesa.c revision c19d783e0715ac01ad4d3fd0705500d2bf6f7039
1c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul/* $Id: osmesa.c,v 1.29 2000/11/14 17:40:14 brianp Exp $ */
2afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
3afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/*
4afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Mesa 3-D graphics library
5cb5ecb883eb3be842ef44c61df8d4b527877c858Brian Paul * Version:  3.3
6afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg *
7304357dcd496f7ebf499fd9c77b4eba83a75abd5Brian Paul * Copyright (C) 1999-2000  Brian Paul   All Rights Reserved.
8afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg *
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:
15afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg *
16afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * The above copyright notice and this permission notice shall be included
17afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * in all copies or substantial portions of the Software.
18afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg *
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
38afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#ifdef PC_HEADER
39afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#include "all.h"
40afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#else
41eed6f691991ed0d64752fa712c83f67eb700b9adBrian Paul#include "glheader.h"
42afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#include "GL/osmesa.h"
43afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#include "context.h"
44afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#include "depth.h"
45ebb248aa5c018dc676d389221d76ed329059789eBrian Paul#include "macros.h"
46cb5ecb883eb3be842ef44c61df8d4b527877c858Brian Paul#include "mem.h"
47afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#include "matrix.h"
48afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#include "types.h"
4923ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank#include "extensions.h"
501e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell#include "swrast/swrast.h"
511e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell#include "swrast_setup/swrast_setup.h"
521e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell#include "swrast/s_context.h"
53724abeb058ca9372c5a9b9e38ee43dde1accaa41Keith Whitwell#include "swrast/s_depth.h"
541e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell#include "swrast/s_lines.h"
551e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell#include "swrast/s_triangle.h"
56afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#endif
57afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
58afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
59724abeb058ca9372c5a9b9e38ee43dde1accaa41Keith Whitwell
60724abeb058ca9372c5a9b9e38ee43dde1accaa41Keith Whitwell
61304357dcd496f7ebf499fd9c77b4eba83a75abd5Brian Paul/*
62304357dcd496f7ebf499fd9c77b4eba83a75abd5Brian Paul * This is the OS/Mesa context struct.
63304357dcd496f7ebf499fd9c77b4eba83a75abd5Brian Paul * Notice how it includes a GLcontext.  By doing this we're mimicking
64304357dcd496f7ebf499fd9c77b4eba83a75abd5Brian Paul * C++ inheritance/derivation.
65304357dcd496f7ebf499fd9c77b4eba83a75abd5Brian Paul * Later, we can cast a GLcontext pointer into an OSMesaContext pointer
66304357dcd496f7ebf499fd9c77b4eba83a75abd5Brian Paul * or vice versa.
67304357dcd496f7ebf499fd9c77b4eba83a75abd5Brian Paul */
68afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgstruct osmesa_context {
69304357dcd496f7ebf499fd9c77b4eba83a75abd5Brian Paul   GLcontext gl_ctx;		/* The core GL/Mesa context */
70afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLvisual *gl_visual;		/* Describes the buffers */
71afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLframebuffer *gl_buffer;	/* Depth, stencil, accum, etc buffers */
72afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLenum format;		/* either GL_RGBA or GL_COLOR_INDEX */
73afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   void *buffer;		/* the image buffer */
74afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLint width, height;		/* size of image buffer */
75afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLuint pixel;		/* current color index or RGBA pixel value */
76afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLuint clearpixel;		/* pixel for clearing the color buffer */
77afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLint rowlength;		/* number of pixels per row */
78afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLint userRowLength;		/* user-specified number of pixels per row */
79afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLint rshift, gshift;	/* bit shifts for RGBA formats */
80afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLint bshift, ashift;
81afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLint rind, gind, bind;	/* index offsets for RGBA formats */
82afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   void *rowaddr[MAX_HEIGHT];	/* address of first pixel in each image row */
83afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLboolean yup;		/* TRUE  -> Y increases upward */
84afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg				/* FALSE -> Y increases downward */
85afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg};
86afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
87afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
88afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
89afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/* A forward declaration: */
90afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgstatic void osmesa_update_state( GLcontext *ctx );
911e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwellstatic void osmesa_register_swrast_functions( GLcontext *ctx );
92afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
93afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
94afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
95c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul#define OSMESA_CONTEXT(ctx)  ((OSMesaContext) (ctx->DriverCtx))
96c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul
97c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul
98c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul
99afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/**********************************************************************/
100afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/*****                    Public Functions                        *****/
101afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/**********************************************************************/
102afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
103afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
104afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/*
105afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Create an Off-Screen Mesa rendering context.  The only attribute needed is
106afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * an RGBA vs Color-Index mode flag.
107afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg *
108afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Input:  format - either GL_RGBA or GL_COLOR_INDEX
109afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg *         sharelist - specifies another OSMesaContext with which to share
110afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg *                     display lists.  NULL indicates no sharing.
111afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Return:  an OSMesaContext or 0 if error
112afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */
113d3c070ca6a36daa765b1ad7f44e03e6671ad0490Brian PaulOSMesaContext GLAPIENTRY
114d3c070ca6a36daa765b1ad7f44e03e6671ad0490Brian PaulOSMesaCreateContext( GLenum format, OSMesaContext sharelist )
115afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
1162bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul   return OSMesaCreateContextExt(format, DEFAULT_SOFTWARE_DEPTH_BITS,
1172bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul                                 8, 16, sharelist);
1182bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul}
1192bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul
1202bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul
1212bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul
1222bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul/*
1232bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul * New in Mesa 3.5
1242bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul *
1252bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul * Create context and specify size of ancillary buffers.
1262bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul */
1272bf5d9470d3232763cb49b5589209940d4d5398dBrian PaulOSMesaContext GLAPIENTRY
1282bf5d9470d3232763cb49b5589209940d4d5398dBrian PaulOSMesaCreateContextExt( GLenum format, GLint depthBits, GLint stencilBits,
1292bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul                        GLint accumBits, OSMesaContext sharelist )
1302bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul{
131afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   OSMesaContext osmesa;
132afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLint rshift, gshift, bshift, ashift;
133afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLint rind, gind, bind;
1342bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul   GLint indexBits, redBits, greenBits, blueBits, alphaBits;
135afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLboolean rgbmode;
136afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLboolean swalpha;
137afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLuint i4 = 1;
138afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLubyte *i1 = (GLubyte *) &i4;
139afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLint little_endian = *i1;
140afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
141afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   swalpha = GL_FALSE;
142afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   rind = gind = bind = 0;
143afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   if (format==OSMESA_COLOR_INDEX) {
144afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      indexBits = 8;
145afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      rshift = gshift = bshift = ashift = 0;
146afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      rgbmode = GL_FALSE;
147afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
148afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   else if (format==OSMESA_RGBA) {
149afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      indexBits = 0;
1502bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul      redBits = 8;
1512bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul      greenBits = 8;
1522bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul      blueBits = 8;
153afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      alphaBits = 8;
154afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      if (little_endian) {
155afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         rshift = 0;
156afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         gshift = 8;
157afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         bshift = 16;
158afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         ashift = 24;
159afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
160afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      else {
161afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         rshift = 24;
162afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         gshift = 16;
163afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         bshift = 8;
164afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         ashift = 0;
165afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
166afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      rgbmode = GL_TRUE;
167afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
168afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   else if (format==OSMESA_BGRA) {
169afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      indexBits = 0;
1702bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul      redBits = 8;
1712bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul      greenBits = 8;
1722bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul      blueBits = 8;
173afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      alphaBits = 8;
174afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      if (little_endian) {
175afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         ashift = 0;
176afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         rshift = 8;
177afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         gshift = 16;
178afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         bshift = 24;
179afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
180afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      else {
181afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         bshift = 24;
182afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         gshift = 16;
183afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         rshift = 8;
184afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         ashift = 0;
185afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
186afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      rgbmode = GL_TRUE;
187afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
188afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   else if (format==OSMESA_ARGB) {
189afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      indexBits = 0;
1902bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul      redBits = 8;
1912bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul      greenBits = 8;
1922bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul      blueBits = 8;
193afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      alphaBits = 8;
194afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      if (little_endian) {
195afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         bshift = 0;
196afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         gshift = 8;
197afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         rshift = 16;
198afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         ashift = 24;
199afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
200afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      else {
201afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         ashift = 24;
202afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         rshift = 16;
203afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         gshift = 8;
204afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         bshift = 0;
205afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
206afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      rgbmode = GL_TRUE;
207afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
208afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   else if (format==OSMESA_RGB) {
209afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      indexBits = 0;
2102bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul      redBits = 8;
2112bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul      greenBits = 8;
2122bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul      blueBits = 8;
213afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      alphaBits = 0;
214afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      bshift = 0;
215afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      gshift = 8;
216afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      rshift = 16;
217afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      ashift = 24;
218afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      bind = 2;
219afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      gind = 1;
220afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      rind = 0;
221afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      rgbmode = GL_TRUE;
222afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      swalpha = GL_TRUE;
223afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
224afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   else if (format==OSMESA_BGR) {
225afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      indexBits = 0;
2262bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul      redBits = 8;
2272bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul      greenBits = 8;
2282bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul      blueBits = 8;
229afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      alphaBits = 0;
230afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      bshift = 0;
231afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      gshift = 8;
232afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      rshift = 16;
233afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      ashift = 24;
234afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      bind = 0;
235afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      gind = 1;
236afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      rind = 2;
237afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      rgbmode = GL_TRUE;
238afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      swalpha = GL_TRUE;
239afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
240afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   else {
241afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      return NULL;
242afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
243afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
244afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
245bd5cdaf4442872d3cd2ff94eeafadd481d27fcfbBrian Paul   osmesa = (OSMesaContext) CALLOC_STRUCT(osmesa_context);
246afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   if (osmesa) {
2472bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul      osmesa->gl_visual = _mesa_create_visual( rgbmode,
2482bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul                                               GL_FALSE,    /* double buffer */
2492bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul                                               GL_FALSE,    /* stereo */
2502bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul                                               redBits,
2512bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul                                               greenBits,
2522bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul                                               blueBits,
2532bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul                                               alphaBits,
2542bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul                                               indexBits,
2552bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul                                               depthBits,
2562bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul                                               stencilBits,
2572bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul                                               accumBits,
2582bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul                                               accumBits,
2592bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul                                               accumBits,
2602bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul                                               alphaBits ? accumBits : 0,
2612bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul                                               1            /* num samples */
2622bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul                                               );
263afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      if (!osmesa->gl_visual) {
264941dcc797e1a6317808c1ec43476817286d576baBrian Paul         FREE(osmesa);
265afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         return NULL;
266afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
267afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
268df81387dfae199a71bc55138ea5856dc05eacf24Brian Paul      if (!_mesa_initialize_context(&osmesa->gl_ctx,
269df81387dfae199a71bc55138ea5856dc05eacf24Brian Paul                                    osmesa->gl_visual,
270df81387dfae199a71bc55138ea5856dc05eacf24Brian Paul                                    sharelist ? &sharelist->gl_ctx
271df81387dfae199a71bc55138ea5856dc05eacf24Brian Paul                                              : (GLcontext *) NULL,
272df81387dfae199a71bc55138ea5856dc05eacf24Brian Paul                                    (void *) osmesa, GL_TRUE )) {
273df81387dfae199a71bc55138ea5856dc05eacf24Brian Paul         _mesa_destroy_visual( osmesa->gl_visual );
274bd5cdaf4442872d3cd2ff94eeafadd481d27fcfbBrian Paul         FREE(osmesa);
275afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         return NULL;
276afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
27723ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank      gl_extensions_enable(&(osmesa->gl_ctx),"GL_HP_occlusion_test");
278413d6a21f849a689b5c83ea04395856b44fc65a8Brian Paul      gl_extensions_enable(&(osmesa->gl_ctx), "GL_ARB_texture_cube_map");
27924507ff6ab91a85f98da60745bd6585499968b60Brian Paul      gl_extensions_enable(&(osmesa->gl_ctx), "GL_EXT_texture_env_combine");
280304357dcd496f7ebf499fd9c77b4eba83a75abd5Brian Paul
281b1394fa92aaaf859ce9efc8b5fc194397921320cBrian Paul      osmesa->gl_buffer = _mesa_create_framebuffer( osmesa->gl_visual,
282b1394fa92aaaf859ce9efc8b5fc194397921320cBrian Paul                                          osmesa->gl_visual->DepthBits > 0,
283b1394fa92aaaf859ce9efc8b5fc194397921320cBrian Paul                                          osmesa->gl_visual->StencilBits > 0,
284b1394fa92aaaf859ce9efc8b5fc194397921320cBrian Paul                                          osmesa->gl_visual->AccumRedBits > 0,
285b1394fa92aaaf859ce9efc8b5fc194397921320cBrian Paul                                          osmesa->gl_visual->AlphaBits > 0 );
2864c44d63f01a01f134d7e4456d4209edee97f9ef5Brian Paul
287afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      if (!osmesa->gl_buffer) {
288b1394fa92aaaf859ce9efc8b5fc194397921320cBrian Paul         _mesa_destroy_visual( osmesa->gl_visual );
289b1394fa92aaaf859ce9efc8b5fc194397921320cBrian Paul         _mesa_free_context_data( &osmesa->gl_ctx );
290bd5cdaf4442872d3cd2ff94eeafadd481d27fcfbBrian Paul         FREE(osmesa);
291afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         return NULL;
292afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
293afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      osmesa->format = format;
294afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      osmesa->buffer = NULL;
295afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      osmesa->width = 0;
296afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      osmesa->height = 0;
297afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      osmesa->pixel = 0;
298afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      osmesa->clearpixel = 0;
299afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      osmesa->userRowLength = 0;
300afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      osmesa->rowlength = 0;
301afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      osmesa->yup = GL_TRUE;
302afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      osmesa->rshift = rshift;
303afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      osmesa->gshift = gshift;
304afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      osmesa->bshift = bshift;
305afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      osmesa->ashift = ashift;
306afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      osmesa->rind = rind;
307afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      osmesa->gind = gind;
308afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      osmesa->bind = bind;
3091e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell
3101e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell
3111e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell      /* Initialize the software rasterizer and helper modules.
3121e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell       */
3131e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell      {
3141e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell	 GLcontext *ctx = &osmesa->gl_ctx;
3151e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell
3161e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell	 _swrast_CreateContext( ctx );
3171e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell	 _swsetup_CreateContext( ctx );
3181e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell
3191e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell	 if (ctx->VB)
3201e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell	    _swsetup_RegisterVB( ctx->VB );
3211e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell
3221e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell	 osmesa_register_swrast_functions( ctx );
3231e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell      }
324afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
325afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   return osmesa;
326afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
327afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
328afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
329afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
3302bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul
331afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/*
332afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Destroy an Off-Screen Mesa rendering context.
333afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg *
334afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Input:  ctx - the context to destroy
335afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */
336afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgvoid GLAPIENTRY OSMesaDestroyContext( OSMesaContext ctx )
337afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
338afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   if (ctx) {
339b1394fa92aaaf859ce9efc8b5fc194397921320cBrian Paul      _mesa_destroy_visual( ctx->gl_visual );
340b1394fa92aaaf859ce9efc8b5fc194397921320cBrian Paul      _mesa_destroy_framebuffer( ctx->gl_buffer );
341b1394fa92aaaf859ce9efc8b5fc194397921320cBrian Paul      _mesa_free_context_data( &ctx->gl_ctx );
342bd5cdaf4442872d3cd2ff94eeafadd481d27fcfbBrian Paul      FREE( ctx );
343afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
344afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
345afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
346afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
347afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
348afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/*
349afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Recompute the values of the context's rowaddr array.
350afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */
351afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgstatic void compute_row_addresses( OSMesaContext ctx )
352afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
353afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLint i;
354afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
355afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   if (ctx->yup) {
356afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      /* Y=0 is bottom line of window */
357afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      if (ctx->format==OSMESA_COLOR_INDEX) {
358afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         /* 1-byte CI mode */
359afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         GLubyte *origin = (GLubyte *) ctx->buffer;
360afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         for (i=0;i<MAX_HEIGHT;i++) {
361afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            ctx->rowaddr[i] = origin + i * ctx->rowlength;
362afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         }
363afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
364afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      else {
365afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         if ((ctx->format==OSMESA_RGB) || (ctx->format==OSMESA_BGR)) {
366afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            /* 3-byte RGB mode */
367afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            GLubyte *origin = (GLubyte *) ctx->buffer;
368afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            for (i=0;i<MAX_HEIGHT;i++) {
369afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg               ctx->rowaddr[i] = origin + (i * (ctx->rowlength*3));
370afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            }
371afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         } else {
372afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            /* 4-byte RGBA mode */
373afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            GLuint *origin = (GLuint *) ctx->buffer;
374afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            for (i=0;i<MAX_HEIGHT;i++) {
375afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg               ctx->rowaddr[i] = origin + i * ctx->rowlength;
376afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            }
377afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         }
378afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
379afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
380afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   else {
381afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      /* Y=0 is top line of window */
382afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      if (ctx->format==OSMESA_COLOR_INDEX) {
383afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         /* 1-byte CI mode */
384afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         GLubyte *origin = (GLubyte *) ctx->buffer;
385afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         for (i=0;i<MAX_HEIGHT;i++) {
386afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            ctx->rowaddr[i] = origin + (ctx->height-i-1) * ctx->rowlength;
387afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         }
388afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
389afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      else {
390afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         if ((ctx->format==OSMESA_RGB) || (ctx->format==OSMESA_BGR)) {
391afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            /* 3-byte RGB mode */
392afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            GLubyte *origin = (GLubyte *) ctx->buffer;
393afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            for (i=0;i<MAX_HEIGHT;i++) {
394afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg               ctx->rowaddr[i] = origin + ((ctx->height-i-1) * (ctx->rowlength*3));
395afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            }
396afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         } else {
397afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            /* 4-byte RGBA mode */
398afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            GLuint *origin = (GLuint *) ctx->buffer;
399afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            for (i=0;i<MAX_HEIGHT;i++) {
400afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg               ctx->rowaddr[i] = origin + (ctx->height-i-1) * ctx->rowlength;
401afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            }
402afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         }
403afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
404afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
405afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
406afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
407afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
408afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/*
409afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Bind an OSMesaContext to an image buffer.  The image buffer is just a
410afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * block of memory which the client provides.  Its size must be at least
411afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * as large as width*height*sizeof(type).  Its address should be a multiple
412afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * of 4 if using RGBA mode.
413afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg *
414afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Image data is stored in the order of glDrawPixels:  row-major order
415afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * with the lower-left image pixel stored in the first array position
416afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * (ie. bottom-to-top).
417afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg *
418afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Since the only type initially supported is GL_UNSIGNED_BYTE, if the
419afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * context is in RGBA mode, each pixel will be stored as a 4-byte RGBA
420afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * value.  If the context is in color indexed mode, each pixel will be
421afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * stored as a 1-byte value.
422afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg *
423afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * If the context's viewport hasn't been initialized yet, it will now be
424afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * initialized to (0,0,width,height).
425afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg *
426afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Input:  ctx - the rendering context
427afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg *         buffer - the image buffer memory
428afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg *         type - data type for pixel components, only GL_UNSIGNED_BYTE
429afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg *                supported now
430afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg *         width, height - size of image buffer in pixels, at least 1
431afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Return:  GL_TRUE if success, GL_FALSE if error because of invalid ctx,
432afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg *          invalid buffer address, type!=GL_UNSIGNED_BYTE, width<1, height<1,
433afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg *          width>internal limit or height>internal limit.
434afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */
435d3c070ca6a36daa765b1ad7f44e03e6671ad0490Brian PaulGLboolean GLAPIENTRY
436d3c070ca6a36daa765b1ad7f44e03e6671ad0490Brian PaulOSMesaMakeCurrent( OSMesaContext ctx, void *buffer, GLenum type,
437d3c070ca6a36daa765b1ad7f44e03e6671ad0490Brian Paul                   GLsizei width, GLsizei height )
438afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
439afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   if (!ctx || !buffer || type!=GL_UNSIGNED_BYTE
440afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg       || width<1 || height<1 || width>MAX_WIDTH || height>MAX_HEIGHT) {
441afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      return GL_FALSE;
442afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
443afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
444304357dcd496f7ebf499fd9c77b4eba83a75abd5Brian Paul   osmesa_update_state( &ctx->gl_ctx );
445b1394fa92aaaf859ce9efc8b5fc194397921320cBrian Paul   _mesa_make_current( &ctx->gl_ctx, ctx->gl_buffer );
446afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
447afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   ctx->buffer = buffer;
448afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   ctx->width = width;
449afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   ctx->height = height;
450afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   if (ctx->userRowLength)
451afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      ctx->rowlength = ctx->userRowLength;
452afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   else
453afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      ctx->rowlength = width;
454afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
455afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   compute_row_addresses( ctx );
456afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
457afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   /* init viewport */
458304357dcd496f7ebf499fd9c77b4eba83a75abd5Brian Paul   if (ctx->gl_ctx.Viewport.Width==0) {
459afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      /* initialize viewport and scissor box to buffer size */
460cb5ecb883eb3be842ef44c61df8d4b527877c858Brian Paul      _mesa_Viewport( 0, 0, width, height );
461304357dcd496f7ebf499fd9c77b4eba83a75abd5Brian Paul      ctx->gl_ctx.Scissor.Width = width;
462304357dcd496f7ebf499fd9c77b4eba83a75abd5Brian Paul      ctx->gl_ctx.Scissor.Height = height;
463afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
464afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
465afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   return GL_TRUE;
466afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
467afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
468afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
469afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
470afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgOSMesaContext GLAPIENTRY OSMesaGetCurrentContext( void )
471afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
472b1394fa92aaaf859ce9efc8b5fc194397921320cBrian Paul   GLcontext *ctx = _mesa_get_current_context();
473d3c070ca6a36daa765b1ad7f44e03e6671ad0490Brian Paul   if (ctx)
474304357dcd496f7ebf499fd9c77b4eba83a75abd5Brian Paul      return (OSMesaContext) ctx;
475d3c070ca6a36daa765b1ad7f44e03e6671ad0490Brian Paul   else
476d3c070ca6a36daa765b1ad7f44e03e6671ad0490Brian Paul      return NULL;
477afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
478afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
479afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
480afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
481afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgvoid GLAPIENTRY OSMesaPixelStore( GLint pname, GLint value )
482afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
483afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   OSMesaContext ctx = OSMesaGetCurrentContext();
484afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
485afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   switch (pname) {
486afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case OSMESA_ROW_LENGTH:
487afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         if (value<0) {
488304357dcd496f7ebf499fd9c77b4eba83a75abd5Brian Paul            gl_error( &ctx->gl_ctx, GL_INVALID_VALUE,
489afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg                      "OSMesaPixelStore(value)" );
490afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            return;
491afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         }
492afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         ctx->userRowLength = value;
493afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         ctx->rowlength = value;
494afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         break;
495afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case OSMESA_Y_UP:
496afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         ctx->yup = value ? GL_TRUE : GL_FALSE;
497afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         break;
498afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      default:
499304357dcd496f7ebf499fd9c77b4eba83a75abd5Brian Paul         gl_error( &ctx->gl_ctx, GL_INVALID_ENUM, "OSMesaPixelStore(pname)" );
500afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         return;
501afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
502afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
503afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   compute_row_addresses( ctx );
504afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
505afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
506afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
507afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgvoid GLAPIENTRY OSMesaGetIntegerv( GLint pname, GLint *value )
508afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
509afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   OSMesaContext ctx = OSMesaGetCurrentContext();
510afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
511afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   switch (pname) {
512afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case OSMESA_WIDTH:
513afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         *value = ctx->width;
514afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         return;
515afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case OSMESA_HEIGHT:
516afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         *value = ctx->height;
517afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         return;
518afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case OSMESA_FORMAT:
519afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         *value = ctx->format;
520afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         return;
521afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case OSMESA_TYPE:
522afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         *value = GL_UNSIGNED_BYTE;
523afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         return;
524afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case OSMESA_ROW_LENGTH:
525afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         *value = ctx->rowlength;
526afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         return;
527afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case OSMESA_Y_UP:
528afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         *value = ctx->yup;
529afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         return;
530afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      default:
531304357dcd496f7ebf499fd9c77b4eba83a75abd5Brian Paul         gl_error(&ctx->gl_ctx, GL_INVALID_ENUM, "OSMesaGetIntergerv(pname)");
532afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         return;
533afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
534afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
535afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
536afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/*
537afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Return the depth buffer associated with an OSMesa context.
538afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Input:  c - the OSMesa context
539afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Output:  width, height - size of buffer in pixels
540afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg *          bytesPerValue - bytes per depth value (2 or 4)
541afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg *          buffer - pointer to depth buffer values
542afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Return:  GL_TRUE or GL_FALSE to indicate success or failure.
543afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */
5447e67fb41fb54e050f6983b4de09ed3a317d6148fBrian PaulGLboolean GLAPIENTRY
5457e67fb41fb54e050f6983b4de09ed3a317d6148fBrian PaulOSMesaGetDepthBuffer( OSMesaContext c, GLint *width, GLint *height,
5467e67fb41fb54e050f6983b4de09ed3a317d6148fBrian Paul                      GLint *bytesPerValue, void **buffer )
547afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
548650cb74bcb913d2589355d56a14da1ab0307d1fcBrian Paul   if ((!c->gl_buffer) || (!c->gl_buffer->DepthBuffer)) {
549afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      *width = 0;
550afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      *height = 0;
551afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      *bytesPerValue = 0;
552afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      *buffer = 0;
553afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      return GL_FALSE;
554afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
555afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   else {
556afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      *width = c->gl_buffer->Width;
557afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      *height = c->gl_buffer->Height;
558afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      *bytesPerValue = sizeof(GLdepth);
559650cb74bcb913d2589355d56a14da1ab0307d1fcBrian Paul      *buffer = c->gl_buffer->DepthBuffer;
560afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      return GL_TRUE;
561afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
562afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
563afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
56423ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank/*
56523ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank * Return the color buffer associated with an OSMesa context.
56623ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank * Input:  c - the OSMesa context
56723ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank * Output:  width, height - size of buffer in pixels
56823ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank *          format - the pixel format (OSMESA_FORMAT)
56923ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank *          buffer - pointer to color buffer values
57023ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank * Return:  GL_TRUE or GL_FALSE to indicate success or failure.
57123ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank */
5727e67fb41fb54e050f6983b4de09ed3a317d6148fBrian PaulGLboolean GLAPIENTRY
5737e67fb41fb54e050f6983b4de09ed3a317d6148fBrian PaulOSMesaGetColorBuffer( OSMesaContext c, GLint *width,
5747e67fb41fb54e050f6983b4de09ed3a317d6148fBrian Paul                      GLint *height, GLint *format, void **buffer )
57523ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank{
57623ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank   if (!c->buffer) {
57723ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank      *width = 0;
57823ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank      *height = 0;
57923ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank      *format = 0;
58023ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank      *buffer = 0;
58123ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank      return GL_FALSE;
5827e67fb41fb54e050f6983b4de09ed3a317d6148fBrian Paul   }
5837e67fb41fb54e050f6983b4de09ed3a317d6148fBrian Paul   else {
58423ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank      *width = c->width;
58523ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank      *height = c->height;
58623ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank      *format = c->format;
58723ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank      *buffer = c->buffer;
58823ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank      return GL_TRUE;
58923ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank   }
59023ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank}
591afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
592afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/**********************************************************************/
593afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/*** Device Driver Functions                                        ***/
594afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/**********************************************************************/
595afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
596afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
597afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/*
598afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Useful macros:
599afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */
600afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#define PACK_RGBA(R,G,B,A)  (  ((R) << osmesa->rshift) \
601afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg                             | ((G) << osmesa->gshift) \
602afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg                             | ((B) << osmesa->bshift) \
603afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg                             | ((A) << osmesa->ashift) )
604afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
605afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#define PACK_RGBA2(R,G,B,A)  (  ((R) << rshift) \
606afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg                              | ((G) << gshift) \
607afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg                              | ((B) << bshift) \
608afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg                              | ((A) << ashift) )
609afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
610afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#define UNPACK_RED(P)      (((P) >> osmesa->rshift) & 0xff)
611afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#define UNPACK_GREEN(P)    (((P) >> osmesa->gshift) & 0xff)
612afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#define UNPACK_BLUE(P)     (((P) >> osmesa->bshift) & 0xff)
613afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#define UNPACK_ALPHA(P)    (((P) >> osmesa->ashift) & 0xff)
614afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
615afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#define PIXELADDR1(X,Y)  ((GLubyte *) osmesa->rowaddr[Y] + (X))
616afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#define PIXELADDR3(X,Y)  ((GLubyte *) osmesa->rowaddr[Y] + ((X)*3))
617afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#define PIXELADDR4(X,Y)  ((GLuint *)  osmesa->rowaddr[Y] + (X))
618afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
619afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
620afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
621afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
622cea0e8e6700e871bb9bcb334cb75fbfbfcdfd702Brian Paulstatic GLboolean set_draw_buffer( GLcontext *ctx, GLenum mode )
623afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
624afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   (void) ctx;
625afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   if (mode==GL_FRONT_LEFT) {
626afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      return GL_TRUE;
627afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
628afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   else {
629afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      return GL_FALSE;
630afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
631afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
632afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
633afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
634cea0e8e6700e871bb9bcb334cb75fbfbfcdfd702Brian Paulstatic void set_read_buffer( GLcontext *ctx, GLframebuffer *buffer, GLenum mode )
635cea0e8e6700e871bb9bcb334cb75fbfbfcdfd702Brian Paul{
636cea0e8e6700e871bb9bcb334cb75fbfbfcdfd702Brian Paul   /* separate read buffer not supported */
637cea0e8e6700e871bb9bcb334cb75fbfbfcdfd702Brian Paul   ASSERT(buffer == ctx->DrawBuffer);
638cea0e8e6700e871bb9bcb334cb75fbfbfcdfd702Brian Paul   ASSERT(mode == GL_FRONT_LEFT);
639cea0e8e6700e871bb9bcb334cb75fbfbfcdfd702Brian Paul}
640cea0e8e6700e871bb9bcb334cb75fbfbfcdfd702Brian Paul
641cea0e8e6700e871bb9bcb334cb75fbfbfcdfd702Brian Paul
642afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgstatic void clear_index( GLcontext *ctx, GLuint index )
643afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
644c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul   OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
645afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   osmesa->clearpixel = index;
646afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
647afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
648afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
649afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
650afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgstatic void clear_color( GLcontext *ctx,
6519499e017b7e05411a32b3e4fa94885eaec0d7277Brian Paul                         GLchan r, GLchan g, GLchan b, GLchan a )
652afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
653c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul   OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
654afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   osmesa->clearpixel = PACK_RGBA( r, g, b, a );
655afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
656afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
657afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
658afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
659afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgstatic GLbitfield clear( GLcontext *ctx, GLbitfield mask, GLboolean all,
660afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg                         GLint x, GLint y, GLint width, GLint height )
661afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
662c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul   OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
663dd020f13a6d520b46aefd4453dae6b6edcc427f6Brian Paul   const GLuint *colorMask = (GLuint *) &ctx->Color.ColorMask;
664dd020f13a6d520b46aefd4453dae6b6edcc427f6Brian Paul
665dd020f13a6d520b46aefd4453dae6b6edcc427f6Brian Paul   /* we can't handle color or index masking */
666dd020f13a6d520b46aefd4453dae6b6edcc427f6Brian Paul   if (*colorMask != 0xffffffff || ctx->Color.IndexMask != 0xffffffff)
667dd020f13a6d520b46aefd4453dae6b6edcc427f6Brian Paul      return mask;
668dd020f13a6d520b46aefd4453dae6b6edcc427f6Brian Paul
669dd020f13a6d520b46aefd4453dae6b6edcc427f6Brian Paul   /* sanity check - we only have a front-left buffer */
670dd020f13a6d520b46aefd4453dae6b6edcc427f6Brian Paul   ASSERT((mask & (DD_FRONT_RIGHT_BIT | DD_BACK_LEFT_BIT | DD_BACK_RIGHT_BIT)) == 0);
671dd020f13a6d520b46aefd4453dae6b6edcc427f6Brian Paul
672dd020f13a6d520b46aefd4453dae6b6edcc427f6Brian Paul   if (mask & DD_FRONT_LEFT_BIT) {
673afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      if (osmesa->format==OSMESA_COLOR_INDEX) {
674afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         if (all) {
675afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            /* Clear whole CI buffer */
676afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            MEMSET(osmesa->buffer, osmesa->clearpixel,
677afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg                   osmesa->rowlength * osmesa->height);
678afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         }
679afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         else {
680afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            /* Clear part of CI buffer */
681afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            GLint i, j;
682afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            for (i=0;i<height;i++) {
683afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg               GLubyte *ptr1 = PIXELADDR1( x, (y+i) );
684afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg               for (j=0;j<width;j++) {
685afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg                  *ptr1++ = osmesa->clearpixel;
686afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg               }
687afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            }
688afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         }
689afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
690afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      else if ((osmesa->format==OSMESA_RGB)||(osmesa->format==OSMESA_BGR)) {
691afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         GLubyte rval = UNPACK_RED(osmesa->clearpixel);
692afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         GLubyte gval = UNPACK_GREEN(osmesa->clearpixel);
693afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         GLubyte bval = UNPACK_BLUE(osmesa->clearpixel);
694afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         GLint   rind = osmesa->rind;
695afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         GLint   gind = osmesa->gind;
696afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         GLint   bind = osmesa->bind;
697afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         if (all) {
698afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            GLuint  i, n;
699afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            GLubyte *ptr3 = (GLubyte *) osmesa->buffer;
700afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            /* Clear whole RGB buffer */
701afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            n = osmesa->rowlength * osmesa->height;
702afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            for (i=0;i<n;i++) {
703afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg               ptr3[rind] = rval;
704afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg               ptr3[gind] = gval;
705afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg               ptr3[bind] = bval;
706afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg               ptr3 += 3;
707afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            }
708afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         }
709afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         else {
710afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            /* Clear part of RGB buffer */
711afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            GLint i, j;
712afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            for (i=0;i<height;i++) {
713afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg               GLubyte *ptr3 = PIXELADDR3( x, (y+i) );
714afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg               for (j=0;j<width;j++) {
715afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg                  ptr3[rind] = rval;
716afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg                  ptr3[gind] = gval;
717afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg                  ptr3[bind] = bval;
718afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg                  ptr3 += 3;
719afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg               }
720afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            }
721afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         }
722afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
723afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      else {
724afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         if (all) {
725afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            /* Clear whole RGBA buffer */
726afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            GLuint i, n, *ptr4;
727afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            n = osmesa->rowlength * osmesa->height;
728afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            ptr4 = (GLuint *) osmesa->buffer;
729941dcc797e1a6317808c1ec43476817286d576baBrian Paul            if (osmesa->clearpixel) {
730941dcc797e1a6317808c1ec43476817286d576baBrian Paul               for (i=0;i<n;i++) {
731941dcc797e1a6317808c1ec43476817286d576baBrian Paul                  *ptr4++ = osmesa->clearpixel;
732941dcc797e1a6317808c1ec43476817286d576baBrian Paul               }
733941dcc797e1a6317808c1ec43476817286d576baBrian Paul            }
734941dcc797e1a6317808c1ec43476817286d576baBrian Paul            else {
735941dcc797e1a6317808c1ec43476817286d576baBrian Paul               BZERO(ptr4, n * sizeof(GLuint));
736afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            }
737afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         }
738afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         else {
739afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            /* Clear part of RGBA buffer */
740afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            GLint i, j;
741afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            for (i=0;i<height;i++) {
742afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg               GLuint *ptr4 = PIXELADDR4( x, (y+i) );
743afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg               for (j=0;j<width;j++) {
744afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg                  *ptr4++ = osmesa->clearpixel;
745afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg               }
746afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            }
747afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         }
748afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
749afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
750dd020f13a6d520b46aefd4453dae6b6edcc427f6Brian Paul   /* have Mesa clear all other buffers */
751dd020f13a6d520b46aefd4453dae6b6edcc427f6Brian Paul   return mask & (~DD_FRONT_LEFT_BIT);
752afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
753afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
754afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
755afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
756afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgstatic void set_index( GLcontext *ctx, GLuint index )
757afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
758c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul   OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
759afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   osmesa->pixel = index;
760afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
761afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
762afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
763afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
764afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgstatic void set_color( GLcontext *ctx,
7659499e017b7e05411a32b3e4fa94885eaec0d7277Brian Paul                       GLchan r, GLchan g, GLchan b, GLchan a )
766afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
767c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul   OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
768afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   osmesa->pixel = PACK_RGBA( r, g, b, a );
769afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
770afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
771afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
772afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
773afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgstatic void buffer_size( GLcontext *ctx, GLuint *width, GLuint *height )
774afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
775c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul   OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
776afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   *width = osmesa->width;
777afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   *height = osmesa->height;
778afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
779afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
780afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
781afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/**********************************************************************/
782afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/*****        Read/write spans/arrays of RGBA pixels              *****/
783afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/**********************************************************************/
784afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
785afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/* Write RGBA pixels to an RGBA (or permuted) buffer. */
786afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgstatic void write_rgba_span( const GLcontext *ctx,
787afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg                             GLuint n, GLint x, GLint y,
7889499e017b7e05411a32b3e4fa94885eaec0d7277Brian Paul                             CONST GLchan rgba[][4], const GLubyte mask[] )
789afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
790c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul   OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
791afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLuint *ptr4 = PIXELADDR4( x, y );
792afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLuint i;
793afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLint rshift = osmesa->rshift;
794afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLint gshift = osmesa->gshift;
795afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLint bshift = osmesa->bshift;
796afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLint ashift = osmesa->ashift;
797afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   if (mask) {
798afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      for (i=0;i<n;i++,ptr4++) {
799afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         if (mask[i]) {
800afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            *ptr4 = PACK_RGBA2( rgba[i][RCOMP], rgba[i][GCOMP], rgba[i][BCOMP], rgba[i][ACOMP] );
801afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         }
802afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
803afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
804afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   else {
805afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      for (i=0;i<n;i++,ptr4++) {
806afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         *ptr4 = PACK_RGBA2( rgba[i][RCOMP], rgba[i][GCOMP], rgba[i][BCOMP], rgba[i][ACOMP] );
807afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
808afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
809afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
810afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
811afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
812afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/* Write RGBA pixels to an RGBA buffer.  This is the fastest span-writer. */
813afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgstatic void write_rgba_span_rgba( const GLcontext *ctx,
814afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg                                  GLuint n, GLint x, GLint y,
8159499e017b7e05411a32b3e4fa94885eaec0d7277Brian Paul                                  CONST GLchan rgba[][4],
816afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg                                  const GLubyte mask[] )
817afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
818c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul   OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
819afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLuint *ptr4 = PIXELADDR4( x, y );
820afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   const GLuint *rgba4 = (const GLuint *) rgba;
821afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLuint i;
822afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   if (mask) {
823afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      for (i=0;i<n;i++) {
824afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         if (mask[i]) {
825afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            ptr4[i] = rgba4[i];
826afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         }
827afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
828afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
829afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   else {
830afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      MEMCPY( ptr4, rgba4, n * 4 );
831afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
832afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
833afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
834afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
835afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/* Write RGB pixels to an RGBA (or permuted) buffer. */
836afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgstatic void write_rgb_span( const GLcontext *ctx,
837afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg                            GLuint n, GLint x, GLint y,
8389499e017b7e05411a32b3e4fa94885eaec0d7277Brian Paul                            CONST GLchan rgb[][3], const GLubyte mask[] )
839afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
840c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul   OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
841afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLuint *ptr4 = PIXELADDR4( x, y );
842afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLuint i;
843afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLint rshift = osmesa->rshift;
844afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLint gshift = osmesa->gshift;
845afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLint bshift = osmesa->bshift;
846afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLint ashift = osmesa->ashift;
847afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   if (mask) {
848afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      for (i=0;i<n;i++,ptr4++) {
849afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         if (mask[i]) {
850afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            *ptr4 = PACK_RGBA2( rgb[i][RCOMP], rgb[i][GCOMP], rgb[i][BCOMP], 255 );
851afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         }
852afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
853afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
854afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   else {
855afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      for (i=0;i<n;i++,ptr4++) {
856afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         *ptr4 = PACK_RGBA2( rgb[i][RCOMP], rgb[i][GCOMP], rgb[i][BCOMP], 255);
857afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
858afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
859afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
860afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
861afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
862afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
863afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgstatic void write_monocolor_span( const GLcontext *ctx,
864afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg                                  GLuint n, GLint x, GLint y,
865c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul				  const GLchan color[4], const GLubyte mask[] )
866afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
867c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul   const OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
868c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul   const GLuint pixel = PACK_RGBA(color[RCOMP], color[GCOMP],
869c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul                                  color[BCOMP], color[ACOMP]);
870afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLuint *ptr4 = PIXELADDR4(x,y);
871afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLuint i;
872afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   for (i=0;i<n;i++,ptr4++) {
873afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      if (mask[i]) {
874c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul         *ptr4 = pixel;
875afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
876afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
877afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
878afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
879afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
880afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
881afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgstatic void write_rgba_pixels( const GLcontext *ctx,
882afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg                               GLuint n, const GLint x[], const GLint y[],
8839499e017b7e05411a32b3e4fa94885eaec0d7277Brian Paul                               CONST GLchan rgba[][4], const GLubyte mask[] )
884afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
885c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul   OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
886afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLuint i;
887afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLint rshift = osmesa->rshift;
888afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLint gshift = osmesa->gshift;
889afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLint bshift = osmesa->bshift;
890afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLint ashift = osmesa->ashift;
891afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   for (i=0;i<n;i++) {
892afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      if (mask[i]) {
893afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         GLuint *ptr4 = PIXELADDR4(x[i],y[i]);
894afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         *ptr4 = PACK_RGBA2( rgba[i][RCOMP], rgba[i][GCOMP], rgba[i][BCOMP], rgba[i][ACOMP] );
895afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
896afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
897afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
898afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
899afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
900afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
901afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgstatic void write_monocolor_pixels( const GLcontext *ctx,
902afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg                                    GLuint n, const GLint x[], const GLint y[],
903c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul				    const GLchan color[4],
904c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul                                    const GLubyte mask[] )
905afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
906c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul   OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
907c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul   const GLuint pixel = PACK_RGBA(color[RCOMP], color[GCOMP],
908c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul                                  color[BCOMP], color[ACOMP]);
909afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLuint i;
910afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   for (i=0;i<n;i++) {
911afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      if (mask[i]) {
912afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         GLuint *ptr4 = PIXELADDR4(x[i],y[i]);
913c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul         *ptr4 = pixel;
914afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
915afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
916afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
917afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
918afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
919afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgstatic void read_rgba_span( const GLcontext *ctx, GLuint n, GLint x, GLint y,
9209499e017b7e05411a32b3e4fa94885eaec0d7277Brian Paul                             GLchan rgba[][4] )
921afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
922c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul   OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
923afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLuint i;
924afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLuint *ptr4 = PIXELADDR4(x,y);
925afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   for (i=0;i<n;i++) {
926afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      GLuint pixel = *ptr4++;
927afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      rgba[i][RCOMP] = UNPACK_RED(pixel);
928afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      rgba[i][GCOMP] = UNPACK_GREEN(pixel);
929afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      rgba[i][BCOMP] = UNPACK_BLUE(pixel);
930afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      rgba[i][ACOMP] = UNPACK_ALPHA(pixel);
931afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
932afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
933afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
934afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
935afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/* Read RGBA pixels from an RGBA buffer */
936afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgstatic void read_rgba_span_rgba( const GLcontext *ctx,
937afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg                                 GLuint n, GLint x, GLint y,
9389499e017b7e05411a32b3e4fa94885eaec0d7277Brian Paul                                 GLchan rgba[][4] )
939afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
940c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul   OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
941afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLuint *ptr4 = PIXELADDR4(x,y);
9429499e017b7e05411a32b3e4fa94885eaec0d7277Brian Paul   MEMCPY( rgba, ptr4, n * 4 * sizeof(GLchan) );
943afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
944afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
945afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
946afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgstatic void read_rgba_pixels( const GLcontext *ctx,
947afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg                               GLuint n, const GLint x[], const GLint y[],
9489499e017b7e05411a32b3e4fa94885eaec0d7277Brian Paul			       GLchan rgba[][4], const GLubyte mask[] )
949afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
950c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul   OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
951afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLuint i;
952afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   for (i=0;i<n;i++) {
953afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      if (mask[i]) {
954afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         GLuint *ptr4 = PIXELADDR4(x[i],y[i]);
955afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         GLuint pixel = *ptr4;
956afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         rgba[i][RCOMP] = UNPACK_RED(pixel);
957afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         rgba[i][GCOMP] = UNPACK_GREEN(pixel);
958afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         rgba[i][BCOMP] = UNPACK_BLUE(pixel);
959afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         rgba[i][ACOMP] = UNPACK_ALPHA(pixel);
960afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
961afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
962afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
963afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
964afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/**********************************************************************/
965afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/*****                3 byte RGB pixel support funcs              *****/
966afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/**********************************************************************/
967afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
968afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/* Write RGBA pixels to an RGB or BGR buffer. */
969afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgstatic void write_rgba_span3( const GLcontext *ctx,
970afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg                              GLuint n, GLint x, GLint y,
9719499e017b7e05411a32b3e4fa94885eaec0d7277Brian Paul                              CONST GLchan rgba[][4], const GLubyte mask[] )
972afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
973c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul   OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
974afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLubyte *ptr3 = PIXELADDR3( x, y);
975afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLuint i;
976afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLint rind = osmesa->rind;
977afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLint gind = osmesa->gind;
978afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLint bind = osmesa->bind;
979afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   if (mask) {
980afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      for (i=0;i<n;i++,ptr3+=3) {
981afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         if (mask[i]) {
982afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            ptr3[rind] = rgba[i][RCOMP];
983afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            ptr3[gind] = rgba[i][GCOMP];
984afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            ptr3[bind] = rgba[i][BCOMP];
985afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         }
986afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
987afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
988afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   else {
989afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      for (i=0;i<n;i++,ptr3+=3) {
990afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         ptr3[rind] = rgba[i][RCOMP];
991afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         ptr3[gind] = rgba[i][GCOMP];
992afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         ptr3[bind] = rgba[i][BCOMP];
993afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
994afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
995afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
996afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
997afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/* Write RGB pixels to an RGB or BGR buffer. */
998afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgstatic void write_rgb_span3( const GLcontext *ctx,
999afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg                             GLuint n, GLint x, GLint y,
10009499e017b7e05411a32b3e4fa94885eaec0d7277Brian Paul                             CONST GLchan rgb[][3], const GLubyte mask[] )
1001afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
1002c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul   const OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
1003c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul   const GLint rind = osmesa->rind;
1004c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul   const GLint gind = osmesa->gind;
1005c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul   const GLint bind = osmesa->bind;
1006afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLubyte *ptr3 = PIXELADDR3( x, y);
1007afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLuint i;
1008afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   if (mask) {
1009afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      for (i=0;i<n;i++,ptr3+=3) {
1010afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         if (mask[i]) {
1011afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            ptr3[rind] = rgb[i][RCOMP];
1012afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            ptr3[gind] = rgb[i][GCOMP];
1013afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            ptr3[bind] = rgb[i][BCOMP];
1014afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         }
1015afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
1016afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
1017afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   else {
1018afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      for (i=0;i<n;i++,ptr3+=3) {
1019afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         ptr3[rind] = rgb[i][RCOMP];
1020afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         ptr3[gind] = rgb[i][GCOMP];
1021afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         ptr3[bind] = rgb[i][BCOMP];
1022afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
1023afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
1024afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
1025afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1026afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1027afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgstatic void write_monocolor_span3( const GLcontext *ctx,
1028c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul                                   GLuint n, GLint x, GLint y,
1029c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul                                   const GLchan color[4], const GLubyte mask[] )
1030afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
1031c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul   const OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
1032c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul   const GLubyte rval = color[RCOMP];
1033c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul   const GLubyte gval = color[GCOMP];
1034c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul   const GLubyte bval = color[BCOMP];
1035c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul   const GLint   rind = osmesa->rind;
1036c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul   const GLint   gind = osmesa->gind;
1037c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul   const GLint   bind = osmesa->bind;
1038afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLubyte *ptr3 = PIXELADDR3( x, y);
1039afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLuint i;
1040afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   for (i=0;i<n;i++,ptr3+=3) {
1041afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      if (mask[i]) {
1042afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         ptr3[rind] = rval;
1043afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         ptr3[gind] = gval;
1044afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         ptr3[bind] = bval;
1045afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
1046afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
1047afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
1048afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1049afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgstatic void write_rgba_pixels3( const GLcontext *ctx,
1050afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg                                GLuint n, const GLint x[], const GLint y[],
10519499e017b7e05411a32b3e4fa94885eaec0d7277Brian Paul                                CONST GLchan rgba[][4], const GLubyte mask[] )
1052afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
1053c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul   const OSMesaContext osmesa = (const OSMesaContext) ctx;
1054afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLuint i;
1055afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLint rind = osmesa->rind;
1056afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLint gind = osmesa->gind;
1057afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLint bind = osmesa->bind;
1058afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   for (i=0;i<n;i++) {
1059afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      if (mask[i]) {
1060afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         GLubyte *ptr3 = PIXELADDR3(x[i],y[i]);
1061afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         ptr3[rind] = rgba[i][RCOMP];
1062afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         ptr3[gind] = rgba[i][GCOMP];
1063afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         ptr3[bind] = rgba[i][BCOMP];
1064afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
1065afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
1066afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
1067afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1068afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgstatic void write_monocolor_pixels3( const GLcontext *ctx,
1069c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul                                     GLuint n, const GLint x[],
1070c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul                                     const GLint y[],
1071c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul                                     const GLchan color[4],
1072c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul                                     const GLubyte mask[] )
1073afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
1074c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul   const OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
1075c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul   const GLint rind = osmesa->rind;
1076c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul   const GLint gind = osmesa->gind;
1077c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul   const GLint bind = osmesa->bind;
1078c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul   const GLubyte rval = color[RCOMP];
1079c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul   const GLubyte gval = color[GCOMP];
1080c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul   const GLubyte bval = color[BCOMP];
1081afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLuint i;
1082afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   for (i=0;i<n;i++) {
1083afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      if (mask[i]) {
1084afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         GLubyte *ptr3 = PIXELADDR3(x[i],y[i]);
1085afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         ptr3[rind] = rval;
1086afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         ptr3[gind] = gval;
1087afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         ptr3[bind] = bval;
1088afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
1089afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
1090afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
1091afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1092afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgstatic void read_rgba_span3( const GLcontext *ctx,
1093afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg                             GLuint n, GLint x, GLint y,
10949499e017b7e05411a32b3e4fa94885eaec0d7277Brian Paul                             GLchan rgba[][4] )
1095afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
1096c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul   OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
1097afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLuint i;
1098afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLint rind = osmesa->rind;
1099afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLint gind = osmesa->gind;
1100afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLint bind = osmesa->bind;
11017e67fb41fb54e050f6983b4de09ed3a317d6148fBrian Paul   const GLubyte *ptr3 = PIXELADDR3( x, y);
1102afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   for (i=0;i<n;i++,ptr3+=3) {
1103afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      rgba[i][RCOMP] = ptr3[rind];
1104afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      rgba[i][GCOMP] = ptr3[gind];
1105afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      rgba[i][BCOMP] = ptr3[bind];
1106afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      rgba[i][ACOMP] = 0;
1107afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
1108afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
1109afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1110afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgstatic void read_rgba_pixels3( const GLcontext *ctx,
1111afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg                               GLuint n, const GLint x[], const GLint y[],
11129499e017b7e05411a32b3e4fa94885eaec0d7277Brian Paul			       GLchan rgba[][4], const GLubyte mask[] )
1113afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
1114c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul   OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
1115afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLuint i;
1116afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLint rind = osmesa->rind;
1117afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLint gind = osmesa->gind;
1118afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLint bind = osmesa->bind;
1119afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   for (i=0;i<n;i++) {
1120afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      if (mask[i]) {
11217e67fb41fb54e050f6983b4de09ed3a317d6148fBrian Paul         const GLubyte *ptr3 = PIXELADDR3(x[i],y[i]);
1122afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         rgba[i][RCOMP] = ptr3[rind];
1123afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         rgba[i][GCOMP] = ptr3[gind];
1124afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         rgba[i][BCOMP] = ptr3[bind];
1125afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         rgba[i][ACOMP] = 0;
1126afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
1127afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
1128afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
1129afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1130afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1131afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/**********************************************************************/
1132afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/*****        Read/write spans/arrays of CI pixels                *****/
1133afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/**********************************************************************/
1134afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1135afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/* Write 32-bit color index to buffer */
1136afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgstatic void write_index32_span( const GLcontext *ctx,
1137afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg                                GLuint n, GLint x, GLint y,
1138afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg                                const GLuint index[], const GLubyte mask[] )
1139afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
1140c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul   OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
1141afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLubyte *ptr1 = PIXELADDR1(x,y);
1142afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLuint i;
1143afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   if (mask) {
1144afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      for (i=0;i<n;i++,ptr1++) {
1145afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         if (mask[i]) {
1146afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            *ptr1 = (GLubyte) index[i];
1147afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         }
1148afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
1149afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
1150afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   else {
1151afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      for (i=0;i<n;i++,ptr1++) {
1152afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         *ptr1 = (GLubyte) index[i];
1153afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
1154afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
1155afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
1156afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1157afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1158afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/* Write 8-bit color index to buffer */
1159afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgstatic void write_index8_span( const GLcontext *ctx,
1160afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg                               GLuint n, GLint x, GLint y,
1161afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg                               const GLubyte index[], const GLubyte mask[] )
1162afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
1163c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul   OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
1164afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLubyte *ptr1 = PIXELADDR1(x,y);
1165afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLuint i;
1166afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   if (mask) {
1167afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      for (i=0;i<n;i++,ptr1++) {
1168afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         if (mask[i]) {
1169afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            *ptr1 = (GLubyte) index[i];
1170afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         }
1171afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
1172afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
1173afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   else {
1174afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      MEMCPY( ptr1, index, n );
1175afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
1176afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
1177afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1178afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1179afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgstatic void write_monoindex_span( const GLcontext *ctx,
1180afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg                                  GLuint n, GLint x, GLint y,
1181c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul				  GLuint colorIndex, const GLubyte mask[] )
1182afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
1183c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul   OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
1184afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLubyte *ptr1 = PIXELADDR1(x,y);
1185afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLuint i;
1186afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   for (i=0;i<n;i++,ptr1++) {
1187afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      if (mask[i]) {
1188c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul         *ptr1 = (GLubyte) colorIndex;
1189afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
1190afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
1191afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
1192afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1193afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1194afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgstatic void write_index_pixels( const GLcontext *ctx,
1195afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg                                GLuint n, const GLint x[], const GLint y[],
1196afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg			        const GLuint index[], const GLubyte mask[] )
1197afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
1198c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul   OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
1199afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLuint i;
1200afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   for (i=0;i<n;i++) {
1201afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      if (mask[i]) {
1202afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         GLubyte *ptr1 = PIXELADDR1(x[i],y[i]);
1203afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         *ptr1 = (GLubyte) index[i];
1204afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
1205afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
1206afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
1207afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1208afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1209afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgstatic void write_monoindex_pixels( const GLcontext *ctx,
1210afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg                                    GLuint n, const GLint x[], const GLint y[],
1211c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul				    GLuint colorIndex, const GLubyte mask[] )
1212afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
1213c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul   OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
1214afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLuint i;
1215afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   for (i=0;i<n;i++) {
1216afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      if (mask[i]) {
1217afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         GLubyte *ptr1 = PIXELADDR1(x[i],y[i]);
1218c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul         *ptr1 = (GLubyte) colorIndex;
1219afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
1220afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
1221afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
1222afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1223afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1224afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgstatic void read_index_span( const GLcontext *ctx,
1225afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg                             GLuint n, GLint x, GLint y, GLuint index[] )
1226afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
1227c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul   OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
1228afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLuint i;
12297e67fb41fb54e050f6983b4de09ed3a317d6148fBrian Paul   const GLubyte *ptr1 = PIXELADDR1(x,y);
1230afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   for (i=0;i<n;i++,ptr1++) {
1231afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      index[i] = (GLuint) *ptr1;
1232afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
1233afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
1234afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1235afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1236afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgstatic void read_index_pixels( const GLcontext *ctx,
1237afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg                               GLuint n, const GLint x[], const GLint y[],
1238afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg			       GLuint index[], const GLubyte mask[] )
1239afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
1240c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul   OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
1241afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLuint i;
1242afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   for (i=0;i<n;i++) {
1243afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      if (mask[i] ) {
12447e67fb41fb54e050f6983b4de09ed3a317d6148fBrian Paul         const GLubyte *ptr1 = PIXELADDR1(x[i],y[i]);
1245afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         index[i] = (GLuint) *ptr1;
1246afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
1247afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
1248afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
1249afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1250afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1251afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1252afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/**********************************************************************/
1253afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/*****                   Optimized line rendering                 *****/
1254afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/**********************************************************************/
1255afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1256afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1257afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/*
1258afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Draw a flat-shaded, RGB line into an osmesa buffer.
1259afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */
1260afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgstatic void flat_rgba_line( GLcontext *ctx,
12611e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell                            SWvertex *vert0, SWvertex *vert1 )
1262afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
1263c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul   OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
12641e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell   GLubyte *color = vert0->color;
1265afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   unsigned long pixel = PACK_RGBA( color[0], color[1], color[2], color[3] );
1266afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1267afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#define INTERP_XY 1
1268afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#define CLIP_HACK 1
1269afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#define PLOT(X,Y) { GLuint *ptr4 = PIXELADDR4(X,Y); *ptr4 = pixel; }
1270afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1271afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#ifdef WIN32
1272724abeb058ca9372c5a9b9e38ee43dde1accaa41Keith Whitwell#include "..\swrast\s_linetemp.h"
1273afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#else
1274724abeb058ca9372c5a9b9e38ee43dde1accaa41Keith Whitwell#include "swrast/s_linetemp.h"
1275afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#endif
1276afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
1277afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1278afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1279afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/*
1280afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Draw a flat-shaded, Z-less, RGB line into an osmesa buffer.
1281afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */
1282afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgstatic void flat_rgba_z_line( GLcontext *ctx,
12831e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell			      SWvertex *vert0, SWvertex *vert1 )
1284afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
1285c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul   OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
12861e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell   GLubyte *color = vert0->color;
1287afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   unsigned long pixel = PACK_RGBA( color[0], color[1], color[2], color[3] );
1288afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1289afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#define INTERP_XY 1
1290afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#define INTERP_Z 1
1291ed30dfa1264ec8875a3162c3c8778bc703bf11d5Brian Paul#define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE
1292afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#define CLIP_HACK 1
1293afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#define PLOT(X,Y)				\
1294afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	if (Z < *zPtr) {			\
1295afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	   GLuint *ptr4 = PIXELADDR4(X,Y);	\
1296afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	   *ptr4 = pixel;			\
1297afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	   *zPtr = Z;				\
1298afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	}
1299afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1300afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#ifdef WIN32
1301724abeb058ca9372c5a9b9e38ee43dde1accaa41Keith Whitwell#include "..\swrast\s_linetemp.h"
1302afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#else
1303724abeb058ca9372c5a9b9e38ee43dde1accaa41Keith Whitwell#include "swrast/s_linetemp.h"
1304afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#endif
1305afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
1306afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1307afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1308afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/*
1309afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Draw a flat-shaded, alpha-blended, RGB line into an osmesa buffer.
1310afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */
1311afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgstatic void flat_blend_rgba_line( GLcontext *ctx,
13121e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell				  SWvertex *vert0, SWvertex *vert1 )
1313afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
1314c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul   OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
1315afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLint rshift = osmesa->rshift;
1316afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLint gshift = osmesa->gshift;
1317afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLint bshift = osmesa->bshift;
13181e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell   GLint avalue = vert0->color[3];
1319afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLint msavalue = 255 - avalue;
13201e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell   GLint rvalue = vert0->color[0]*avalue;
13211e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell   GLint gvalue = vert0->color[1]*avalue;
13221e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell   GLint bvalue = vert0->color[2]*avalue;
1323afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1324afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#define INTERP_XY 1
1325afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#define CLIP_HACK 1
1326afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#define PLOT(X,Y)					\
13277e67fb41fb54e050f6983b4de09ed3a317d6148fBrian Paul   { GLuint *ptr4 = PIXELADDR4(X,Y);			\
13287e67fb41fb54e050f6983b4de09ed3a317d6148fBrian Paul     GLuint  pixel = 0;					\
1329afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg     pixel |=((((((*ptr4) >> rshift) & 0xff)*msavalue+rvalue)>>8) << rshift);\
1330afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg     pixel |=((((((*ptr4) >> gshift) & 0xff)*msavalue+gvalue)>>8) << gshift);\
1331afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg     pixel |=((((((*ptr4) >> bshift) & 0xff)*msavalue+bvalue)>>8) << bshift);\
13327e67fb41fb54e050f6983b4de09ed3a317d6148fBrian Paul     *ptr4 = pixel;					\
1333afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
1334afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1335afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#ifdef WIN32
1336724abeb058ca9372c5a9b9e38ee43dde1accaa41Keith Whitwell#include "..\swrast\s_linetemp.h"
1337afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#else
1338724abeb058ca9372c5a9b9e38ee43dde1accaa41Keith Whitwell#include "swrast/s_linetemp.h"
1339afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#endif
1340afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
1341afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1342ed30dfa1264ec8875a3162c3c8778bc703bf11d5Brian Paul
1343afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/*
1344afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Draw a flat-shaded, Z-less, alpha-blended, RGB line into an osmesa buffer.
1345afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */
1346afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgstatic void flat_blend_rgba_z_line( GLcontext *ctx,
13471e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell				    SWvertex *vert0, SWvertex *vert1 )
1348afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
1349c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul   OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
1350afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLint rshift = osmesa->rshift;
1351afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLint gshift = osmesa->gshift;
1352afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLint bshift = osmesa->bshift;
13531e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell   GLint avalue = vert0->color[3];
1354afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLint msavalue = 256 - avalue;
13551e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell   GLint rvalue = vert0->color[0]*avalue;
13561e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell   GLint gvalue = vert0->color[1]*avalue;
13571e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell   GLint bvalue = vert0->color[2]*avalue;
1358afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1359afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#define INTERP_XY 1
1360afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#define INTERP_Z 1
1361ed30dfa1264ec8875a3162c3c8778bc703bf11d5Brian Paul#define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE
1362afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#define CLIP_HACK 1
13637e67fb41fb54e050f6983b4de09ed3a317d6148fBrian Paul#define PLOT(X,Y)							\
13647e67fb41fb54e050f6983b4de09ed3a317d6148fBrian Paul	if (Z < *zPtr) {						\
13657e67fb41fb54e050f6983b4de09ed3a317d6148fBrian Paul	   GLuint *ptr4 = PIXELADDR4(X,Y);				\
13667e67fb41fb54e050f6983b4de09ed3a317d6148fBrian Paul	   GLuint  pixel = 0;						\
1367ed30dfa1264ec8875a3162c3c8778bc703bf11d5Brian Paul	   pixel |=((((((*ptr4) >> rshift) & 0xff)*msavalue+rvalue)>>8) << rshift);	\
1368ed30dfa1264ec8875a3162c3c8778bc703bf11d5Brian Paul	   pixel |=((((((*ptr4) >> gshift) & 0xff)*msavalue+gvalue)>>8) << gshift);	\
1369ed30dfa1264ec8875a3162c3c8778bc703bf11d5Brian Paul	   pixel |=((((((*ptr4) >> bshift) & 0xff)*msavalue+bvalue)>>8) << bshift);	\
13707e67fb41fb54e050f6983b4de09ed3a317d6148fBrian Paul	   *ptr4 = pixel; 						\
1371afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	}
1372afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1373afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#ifdef WIN32
1374724abeb058ca9372c5a9b9e38ee43dde1accaa41Keith Whitwell#include "..\swrast\s_linetemp.h"
1375afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#else
1376724abeb058ca9372c5a9b9e38ee43dde1accaa41Keith Whitwell#include "swrast/s_linetemp.h"
1377afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#endif
1378afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
1379afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1380ed30dfa1264ec8875a3162c3c8778bc703bf11d5Brian Paul
1381afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/*
1382afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Draw a flat-shaded, Z-less, alpha-blended, RGB line into an osmesa buffer.
1383afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */
1384afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgstatic void flat_blend_rgba_z_line_write( GLcontext *ctx,
13851e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell					  SWvertex *vert0, SWvertex *vert1 )
1386afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
1387c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul   OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
1388afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLint rshift = osmesa->rshift;
1389afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLint gshift = osmesa->gshift;
1390afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLint bshift = osmesa->bshift;
13911e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell   GLint avalue = vert0->color[3];
1392afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLint msavalue = 256 - avalue;
13931e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell   GLint rvalue = vert0->color[0]*avalue;
13941e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell   GLint gvalue = vert0->color[1]*avalue;
13951e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell   GLint bvalue = vert0->color[2]*avalue;
1396afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1397afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#define INTERP_XY 1
1398afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#define INTERP_Z 1
1399ed30dfa1264ec8875a3162c3c8778bc703bf11d5Brian Paul#define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE
1400afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#define CLIP_HACK 1
14017e67fb41fb54e050f6983b4de09ed3a317d6148fBrian Paul#define PLOT(X,Y)							\
14027e67fb41fb54e050f6983b4de09ed3a317d6148fBrian Paul	if (Z < *zPtr) {						\
14037e67fb41fb54e050f6983b4de09ed3a317d6148fBrian Paul	   GLuint *ptr4 = PIXELADDR4(X,Y);				\
14047e67fb41fb54e050f6983b4de09ed3a317d6148fBrian Paul	   GLuint  pixel = 0;						\
1405ed30dfa1264ec8875a3162c3c8778bc703bf11d5Brian Paul	   pixel |=((((((*ptr4) >> rshift) & 0xff)*msavalue+rvalue)>>8) << rshift);	\
1406ed30dfa1264ec8875a3162c3c8778bc703bf11d5Brian Paul	   pixel |=((((((*ptr4) >> gshift) & 0xff)*msavalue+gvalue)>>8) << gshift);	\
1407ed30dfa1264ec8875a3162c3c8778bc703bf11d5Brian Paul	   pixel |=((((((*ptr4) >> bshift) & 0xff)*msavalue+bvalue)>>8) << bshift);	\
14087e67fb41fb54e050f6983b4de09ed3a317d6148fBrian Paul	   *ptr4 = pixel;						\
14097e67fb41fb54e050f6983b4de09ed3a317d6148fBrian Paul	   *zPtr = Z;							\
1410afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	}
1411afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1412afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#ifdef WIN32
1413724abeb058ca9372c5a9b9e38ee43dde1accaa41Keith Whitwell#include "..\swrast\s_linetemp.h"
1414afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#else
1415724abeb058ca9372c5a9b9e38ee43dde1accaa41Keith Whitwell#include "swrast/s_linetemp.h"
1416afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#endif
1417afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
1418afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1419afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1420afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/*
1421afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Analyze context state to see if we can provide a fast line drawing
1422afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * function, like those in lines.c.  Otherwise, return NULL.
1423afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */
14241e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwellstatic swrast_line_func
14251e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwellosmesa_choose_line_function( GLcontext *ctx )
1426afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
1427c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul   OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
14281e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell   SWcontext *swrast = SWRAST_CONTEXT(ctx);
1429afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
14302d595d70202bad560c27ea81ec71b740415b3355Brian Paul   if (ctx->RenderMode != GL_RENDER)      return NULL;
1431afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   if (ctx->Line.SmoothFlag)              return NULL;
14322d595d70202bad560c27ea81ec71b740415b3355Brian Paul   if (ctx->Texture._ReallyEnabled)       return NULL;
1433afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   if (ctx->Light.ShadeModel!=GL_FLAT)    return NULL;
1434afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1435afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   if (ctx->Line.Width==1.0F
1436afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg       && ctx->Line.StippleFlag==GL_FALSE) {
1437afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
14381e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell       if (swrast->_RasterMask==DEPTH_BIT
1439afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg           && ctx->Depth.Func==GL_LESS
1440ed30dfa1264ec8875a3162c3c8778bc703bf11d5Brian Paul           && ctx->Depth.Mask==GL_TRUE
1441b1394fa92aaaf859ce9efc8b5fc194397921320cBrian Paul           && ctx->Visual.DepthBits == DEFAULT_SOFTWARE_DEPTH_BITS) {
1442afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg           switch(osmesa->format) {
1443afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg       		case OSMESA_RGBA:
1444afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg       		case OSMESA_BGRA:
1445afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg       		case OSMESA_ARGB:
1446afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg       			return flat_rgba_z_line;
1447afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg       		default:
1448afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg       			return NULL;
1449afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg           }
1450afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg       }
1451afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
14521e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell       if (swrast->_RasterMask==0) {
1453afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg           switch(osmesa->format) {
1454afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg       		case OSMESA_RGBA:
1455afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg       		case OSMESA_BGRA:
1456afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg       		case OSMESA_ARGB:
1457afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg       			return flat_rgba_line;
1458afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg       		default:
1459afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg       			return NULL;
1460afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg           }
1461afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg       }
1462afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
14631e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell       if (swrast->_RasterMask==(DEPTH_BIT|BLEND_BIT)
1464afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg           && ctx->Depth.Func==GL_LESS
1465afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg           && ctx->Depth.Mask==GL_TRUE
1466b1394fa92aaaf859ce9efc8b5fc194397921320cBrian Paul           && ctx->Visual.DepthBits == DEFAULT_SOFTWARE_DEPTH_BITS
1467afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg           && ctx->Color.BlendSrcRGB==GL_SRC_ALPHA
1468afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg           && ctx->Color.BlendDstRGB==GL_ONE_MINUS_SRC_ALPHA
1469afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg           && ctx->Color.BlendSrcA==GL_SRC_ALPHA
1470afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg           && ctx->Color.BlendDstA==GL_ONE_MINUS_SRC_ALPHA
1471afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg           && ctx->Color.BlendEquation==GL_FUNC_ADD_EXT) {
1472afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg           switch(osmesa->format) {
1473afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg       		case OSMESA_RGBA:
1474afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg       		case OSMESA_BGRA:
1475afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg       		case OSMESA_ARGB:
1476afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg       			return flat_blend_rgba_z_line_write;
1477afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg       		default:
1478afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg       			return NULL;
1479afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg           }
1480afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg       }
1481afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
14821e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell       if (swrast->_RasterMask==(DEPTH_BIT|BLEND_BIT)
1483afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg           && ctx->Depth.Func==GL_LESS
1484afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg           && ctx->Depth.Mask==GL_FALSE
1485b1394fa92aaaf859ce9efc8b5fc194397921320cBrian Paul           && ctx->Visual.DepthBits == DEFAULT_SOFTWARE_DEPTH_BITS
1486afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg           && ctx->Color.BlendSrcRGB==GL_SRC_ALPHA
1487afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg           && ctx->Color.BlendDstRGB==GL_ONE_MINUS_SRC_ALPHA
1488afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg           && ctx->Color.BlendSrcA==GL_SRC_ALPHA
1489afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg           && ctx->Color.BlendDstA==GL_ONE_MINUS_SRC_ALPHA
1490afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg           && ctx->Color.BlendEquation==GL_FUNC_ADD_EXT) {
1491afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg           switch(osmesa->format) {
1492afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg       		case OSMESA_RGBA:
1493afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg       		case OSMESA_BGRA:
1494afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg       		case OSMESA_ARGB:
1495afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg       			return flat_blend_rgba_z_line;
1496afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg       		default:
1497afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg       			return NULL;
1498afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg           }
1499afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg       }
1500afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
15011e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell       if (swrast->_RasterMask==BLEND_BIT
1502afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg           && ctx->Color.BlendSrcRGB==GL_SRC_ALPHA
1503afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg           && ctx->Color.BlendDstRGB==GL_ONE_MINUS_SRC_ALPHA
1504afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg           && ctx->Color.BlendSrcA==GL_SRC_ALPHA
1505afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg           && ctx->Color.BlendDstA==GL_ONE_MINUS_SRC_ALPHA
1506afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg           && ctx->Color.BlendEquation==GL_FUNC_ADD_EXT) {
1507afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg           switch(osmesa->format) {
1508afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg       		case OSMESA_RGBA:
1509afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg       		case OSMESA_BGRA:
1510afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg       		case OSMESA_ARGB:
1511afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg       			return flat_blend_rgba_line;
1512afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg       		default:
1513afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg       			return NULL;
1514afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg           }
1515afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg       }
1516afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1517afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
1518afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   return NULL;
1519afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
1520afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1521afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1522afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/**********************************************************************/
1523afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/*****                 Optimized triangle rendering               *****/
1524afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/**********************************************************************/
1525afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1526afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1527afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/*
1528afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Smooth-shaded, z-less triangle, RGBA color.
1529afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */
15301e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwellstatic void smooth_rgba_z_triangle( GLcontext *ctx,
15311e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell				    SWvertex *v0, SWvertex *v1, SWvertex *v2 )
1532afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
1533c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul   OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
1534afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLint rshift = osmesa->rshift;
1535afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLint gshift = osmesa->gshift;
1536afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLint bshift = osmesa->bshift;
1537afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLint ashift = osmesa->ashift;
153823ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank
1539afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#define INTERP_Z 1
1540ed30dfa1264ec8875a3162c3c8778bc703bf11d5Brian Paul#define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE
1541afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#define INTERP_RGB 1
1542afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#define INTERP_ALPHA 1
1543afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#define INNER_LOOP( LEFT, RIGHT, Y )				\
1544afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{								\
1545afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLint i, len = RIGHT-LEFT;					\
1546afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLuint *img = PIXELADDR4(LEFT,Y);   				\
1547724abeb058ca9372c5a9b9e38ee43dde1accaa41Keith Whitwell   (void) fffog;                        \
1548afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   for (i=0;i<len;i++,img++) {					\
1549afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      GLdepth z = FixedToDepth(ffz);				\
1550afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      if (z < zRow[i]) {					\
1551afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         *img = PACK_RGBA2( FixedToInt(ffr), FixedToInt(ffg),	\
1552afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg		            FixedToInt(ffb), FixedToInt(ffa) );	\
1553afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         zRow[i] = z;						\
1554afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }								\
1555afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      ffr += fdrdx;  ffg += fdgdx;  ffb += fdbdx;  ffa += fdadx;\
1556afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      ffz += fdzdx;						\
1557afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }								\
1558afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
1559afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#ifdef WIN32
1560724abeb058ca9372c5a9b9e38ee43dde1accaa41Keith Whitwell#include "..\swrast\s_tritemp.h"
1561afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#else
1562724abeb058ca9372c5a9b9e38ee43dde1accaa41Keith Whitwell#include "swrast/s_tritemp.h"
1563afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#endif
1564afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
1565afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1566afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1567afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1568afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1569afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/*
1570afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Flat-shaded, z-less triangle, RGBA color.
1571afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */
15721e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwellstatic void flat_rgba_z_triangle( GLcontext *ctx,
15731e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell				  SWvertex *v0, SWvertex *v1, SWvertex *v2 )
1574afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
1575c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul   OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
1576afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#define INTERP_Z 1
1577ed30dfa1264ec8875a3162c3c8778bc703bf11d5Brian Paul#define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE
1578afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#define SETUP_CODE			\
15791e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell   GLubyte r = v0->color[0];	\
15801e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell   GLubyte g = v0->color[1];	\
15811e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell   GLubyte b = v0->color[2];	\
15821e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell   GLubyte a = v0->color[3];	\
1583afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLuint pixel = PACK_RGBA(r,g,b,a);
1584afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1585afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#define INNER_LOOP( LEFT, RIGHT, Y )	\
1586afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{					\
1587afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLint i, len = RIGHT-LEFT;		\
1588afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLuint *img = PIXELADDR4(LEFT,Y);   	\
1589724abeb058ca9372c5a9b9e38ee43dde1accaa41Keith Whitwell   (void) fffog;                        \
1590afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   for (i=0;i<len;i++,img++) {		\
1591afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      GLdepth z = FixedToDepth(ffz);	\
1592afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      if (z < zRow[i]) {		\
1593afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         *img = pixel;			\
1594afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         zRow[i] = z;			\
1595afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }					\
1596afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      ffz += fdzdx;			\
1597afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }					\
1598afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
1599afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#ifdef WIN32
1600724abeb058ca9372c5a9b9e38ee43dde1accaa41Keith Whitwell#include "..\swrast\s_tritemp.h"
1601afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#else
1602724abeb058ca9372c5a9b9e38ee43dde1accaa41Keith Whitwell#include "swrast/s_tritemp.h"
1603afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#endif
1604afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
1605afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1606afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1607afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1608afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/*
1609afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Return pointer to an accelerated triangle function if possible.
1610afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */
16111e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwellstatic swrast_tri_func
16121e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwellosmesa_choose_triangle_function( GLcontext *ctx )
1613afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
1614c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul   OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
16151e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell   SWcontext *swrast = SWRAST_CONTEXT(ctx);
1616afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
16171e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell   if ((osmesa->format==OSMESA_RGB)||(osmesa->format==OSMESA_BGR))
16181e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell      return (swrast_tri_func)NULL;
1619afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
16202d595d70202bad560c27ea81ec71b740415b3355Brian Paul   if (ctx->RenderMode != GL_RENDER)  return (swrast_tri_func) NULL;
16212d595d70202bad560c27ea81ec71b740415b3355Brian Paul   if (ctx->Polygon.SmoothFlag)       return (swrast_tri_func) NULL;
16222d595d70202bad560c27ea81ec71b740415b3355Brian Paul   if (ctx->Polygon.StippleFlag)      return (swrast_tri_func) NULL;
16232d595d70202bad560c27ea81ec71b740415b3355Brian Paul   if (ctx->Texture._ReallyEnabled)   return (swrast_tri_func) NULL;
1624afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
16251e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell   if (swrast->_RasterMask==DEPTH_BIT
1626afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg       && ctx->Depth.Func==GL_LESS
1627afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg       && ctx->Depth.Mask==GL_TRUE
1628b1394fa92aaaf859ce9efc8b5fc194397921320cBrian Paul       && ctx->Visual.DepthBits == DEFAULT_SOFTWARE_DEPTH_BITS
1629afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg       && osmesa->format!=OSMESA_COLOR_INDEX) {
1630afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      if (ctx->Light.ShadeModel==GL_SMOOTH) {
1631afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         return smooth_rgba_z_triangle;
1632afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
1633afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      else {
1634afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         return flat_rgba_z_triangle;
1635afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
1636afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
16371e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell   return (swrast_tri_func)NULL;
16381e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell}
16391e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell
16401e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell/* Override for the swrast triangle-selection function.  Try to use one
16411e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell * of our internal triangle functions, otherwise fall back to the
16421e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell * standard swrast functions.
16431e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell */
16441e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwellstatic void osmesa_choose_triangle( GLcontext *ctx )
16451e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell{
16461e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell   SWcontext *swrast = SWRAST_CONTEXT(ctx);
16471e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell
16481e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell   swrast->Triangle = osmesa_choose_triangle_function( ctx );
16491e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell   if (!swrast->Triangle)
16501e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell      _swrast_choose_triangle( ctx );
1651afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
1652afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
16531e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwellstatic void osmesa_choose_line( GLcontext *ctx )
16541e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell{
16551e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell   SWcontext *swrast = SWRAST_CONTEXT(ctx);
16561e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell
16571e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell   swrast->Line = osmesa_choose_line_function( ctx );
16581e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell   if (!swrast->Line)
16591e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell      _swrast_choose_line( ctx );
16601e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell}
16611e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell
16621e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell
16632d595d70202bad560c27ea81ec71b740415b3355Brian Paul#define OSMESA_NEW_LINE   (_NEW_LINE | \
16642d595d70202bad560c27ea81ec71b740415b3355Brian Paul                           _NEW_TEXTURE | \
16652d595d70202bad560c27ea81ec71b740415b3355Brian Paul                           _NEW_LIGHT | \
16662d595d70202bad560c27ea81ec71b740415b3355Brian Paul                           _NEW_DEPTH | \
16672d595d70202bad560c27ea81ec71b740415b3355Brian Paul                           _NEW_RENDERMODE | \
16682d595d70202bad560c27ea81ec71b740415b3355Brian Paul                           _SWRAST_NEW_RASTERMASK)
16692d595d70202bad560c27ea81ec71b740415b3355Brian Paul
16702d595d70202bad560c27ea81ec71b740415b3355Brian Paul#define OSMESA_NEW_TRIANGLE (_NEW_POLYGON | \
16712d595d70202bad560c27ea81ec71b740415b3355Brian Paul                             _NEW_TEXTURE | \
16722d595d70202bad560c27ea81ec71b740415b3355Brian Paul                             _NEW_LIGHT | \
16732d595d70202bad560c27ea81ec71b740415b3355Brian Paul                             _NEW_DEPTH | \
16742d595d70202bad560c27ea81ec71b740415b3355Brian Paul                             _NEW_RENDERMODE | \
16752d595d70202bad560c27ea81ec71b740415b3355Brian Paul                             _SWRAST_NEW_RASTERMASK)
16761e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell
16771e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell
16781e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell/* Extend the software rasterizer with our line and triangle
16791e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell * functions.
16801e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell */
16811e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwellstatic void osmesa_register_swrast_functions( GLcontext *ctx )
16821e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell{
16831e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell   SWcontext *swrast = SWRAST_CONTEXT( ctx );
16841e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell
16851e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell   swrast->choose_line = osmesa_choose_line;
16861e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell   swrast->choose_triangle = osmesa_choose_triangle;
16871e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell
16881e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell   swrast->invalidate_line |= OSMESA_NEW_LINE;
16891e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell   swrast->invalidate_triangle |= OSMESA_NEW_TRIANGLE;
16901e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell}
1691ed30dfa1264ec8875a3162c3c8778bc703bf11d5Brian Paul
1692ed30dfa1264ec8875a3162c3c8778bc703bf11d5Brian Paul
1693afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgstatic const GLubyte *get_string( GLcontext *ctx, GLenum name )
1694afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
1695afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   (void) ctx;
1696afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   switch (name) {
1697afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GL_RENDERER:
1698afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         return (const GLubyte *) "Mesa OffScreen";
1699afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      default:
1700afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         return NULL;
1701afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
1702afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
1703afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1704afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1705afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgstatic void osmesa_update_state( GLcontext *ctx )
1706afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
1707c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul   OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
1708304357dcd496f7ebf499fd9c77b4eba83a75abd5Brian Paul
1709304357dcd496f7ebf499fd9c77b4eba83a75abd5Brian Paul   ASSERT((void *) osmesa == (void *) ctx->DriverCtx);
1710afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1711afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   ctx->Driver.GetString = get_string;
17121e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell   ctx->Driver.UpdateStateNotify = ~0;
1713afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   ctx->Driver.UpdateState = osmesa_update_state;
1714afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1715cea0e8e6700e871bb9bcb334cb75fbfbfcdfd702Brian Paul   ctx->Driver.SetDrawBuffer = set_draw_buffer;
1716cea0e8e6700e871bb9bcb334cb75fbfbfcdfd702Brian Paul   ctx->Driver.SetReadBuffer = set_read_buffer;
1717c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul#if 000
1718afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   ctx->Driver.Color = set_color;
1719afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   ctx->Driver.Index = set_index;
1720c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul#endif
1721afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   ctx->Driver.ClearIndex = clear_index;
1722afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   ctx->Driver.ClearColor = clear_color;
1723afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   ctx->Driver.Clear = clear;
1724afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1725afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   ctx->Driver.GetBufferSize = buffer_size;
1726afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
17271e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell   ctx->Driver.PointsFunc = _swsetup_Points;
17281e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell   ctx->Driver.LineFunc = _swsetup_Line;
17291e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell   ctx->Driver.TriangleFunc = _swsetup_Triangle;
17301e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell   ctx->Driver.QuadFunc = _swsetup_Quad;
17311e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell   ctx->Driver.RasterSetup = _swsetup_RasterSetup;
1732afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1733afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1734afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   /* RGB(A) span/pixel functions */
1735afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   if ((osmesa->format==OSMESA_RGB) || (osmesa->format==OSMESA_BGR)) {
1736afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      /* 3 bytes / pixel in frame buffer */
1737afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      ctx->Driver.WriteRGBASpan = write_rgba_span3;
1738afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      ctx->Driver.WriteRGBSpan = write_rgb_span3;
1739afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      ctx->Driver.WriteRGBAPixels = write_rgba_pixels3;
1740afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      ctx->Driver.WriteMonoRGBASpan = write_monocolor_span3;
1741afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      ctx->Driver.WriteMonoRGBAPixels = write_monocolor_pixels3;
1742afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      ctx->Driver.ReadRGBASpan = read_rgba_span3;
1743afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      ctx->Driver.ReadRGBAPixels = read_rgba_pixels3;
1744afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
1745afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   else {
1746afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      /* 4 bytes / pixel in frame buffer */
1747afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      if (osmesa->format==OSMESA_RGBA
1748afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg          && RCOMP==0 && GCOMP==1 && BCOMP==2 && ACOMP==3)
1749afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         ctx->Driver.WriteRGBASpan = write_rgba_span_rgba;
1750afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      else
1751afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         ctx->Driver.WriteRGBASpan = write_rgba_span;
1752afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      ctx->Driver.WriteRGBSpan = write_rgb_span;
1753afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      ctx->Driver.WriteRGBAPixels = write_rgba_pixels;
1754afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      ctx->Driver.WriteMonoRGBASpan = write_monocolor_span;
1755afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      ctx->Driver.WriteMonoRGBAPixels = write_monocolor_pixels;
1756afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      if (osmesa->format==OSMESA_RGBA
1757afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg          && RCOMP==0 && GCOMP==1 && BCOMP==2 && ACOMP==3)
1758afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         ctx->Driver.ReadRGBASpan = read_rgba_span_rgba;
1759afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      else
1760afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         ctx->Driver.ReadRGBASpan = read_rgba_span;
1761afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      ctx->Driver.ReadRGBAPixels = read_rgba_pixels;
1762afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
1763afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1764afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   /* CI span/pixel functions */
1765afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   ctx->Driver.WriteCI32Span = write_index32_span;
1766afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   ctx->Driver.WriteCI8Span = write_index8_span;
1767afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   ctx->Driver.WriteMonoCISpan = write_monoindex_span;
1768afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   ctx->Driver.WriteCI32Pixels = write_index_pixels;
1769afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   ctx->Driver.WriteMonoCIPixels = write_monoindex_pixels;
1770afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   ctx->Driver.ReadCI32Span = read_index_span;
1771afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   ctx->Driver.ReadCI32Pixels = read_index_pixels;
1772afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
1773