osmesa.c revision 01dc182ee86922845ba0b17a2cda9af19150c93a
101dc182ee86922845ba0b17a2cda9af19150c93aBrian Paul/* $Id: osmesa.c,v 1.78 2002/04/04 16:58:04 brianp Exp $ */
2afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
3afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/*
4afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Mesa 3-D graphics library
51cefc83a8802deb53a176e20fd2d23b8ce47909fBrian Paul * Version:  4.1
6dbd1e2b5990a3689bf718296c57c14fc3ba38db5Jouk Jansen *
71cefc83a8802deb53a176e20fd2d23b8ce47909fBrian Paul * Copyright (C) 1999-2002  Brian Paul   All Rights Reserved.
8dbd1e2b5990a3689bf718296c57c14fc3ba38db5Jouk Jansen *
9afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Permission is hereby granted, free of charge, to any person obtaining a
10afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * copy of this software and associated documentation files (the "Software"),
11afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * to deal in the Software without restriction, including without limitation
12afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * the rights to use, copy, modify, merge, publish, distribute, sublicense,
13afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * and/or sell copies of the Software, and to permit persons to whom the
14afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Software is furnished to do so, subject to the following conditions:
15dbd1e2b5990a3689bf718296c57c14fc3ba38db5Jouk Jansen *
16afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * The above copyright notice and this permission notice shall be included
17afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * in all copies or substantial portions of the Software.
18dbd1e2b5990a3689bf718296c57c14fc3ba38db5Jouk Jansen *
19afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
20afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
21afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
22afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
23afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
24afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
25afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */
26afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
27afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
28afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/*
29afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Off-Screen Mesa rendering / Rendering into client memory space
30d3c070ca6a36daa765b1ad7f44e03e6671ad0490Brian Paul *
31d3c070ca6a36daa765b1ad7f44e03e6671ad0490Brian Paul * Note on thread safety:  this driver is thread safe.  All
32d3c070ca6a36daa765b1ad7f44e03e6671ad0490Brian Paul * functions are reentrant.  The notion of current context is
33b1394fa92aaaf859ce9efc8b5fc194397921320cBrian Paul * managed by the core _mesa_make_current() and _mesa_get_current_context()
34d3c070ca6a36daa765b1ad7f44e03e6671ad0490Brian Paul * functions.  Those functions are thread-safe.
35afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */
36afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
37afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
38eed6f691991ed0d64752fa712c83f67eb700b9adBrian Paul#include "glheader.h"
39afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#include "GL/osmesa.h"
4002ee456248c75cfee324164ec6fd81a3b77ec2bfBrian Paul#include "buffers.h"
41afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#include "context.h"
4274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul#include "colormac.h"
43afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#include "depth.h"
448e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul#include "extensions.h"
45ebb248aa5c018dc676d389221d76ed329059789eBrian Paul#include "macros.h"
46afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#include "matrix.h"
478e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul#include "mem.h"
483041d05bbcccfddba01a1eeaba01e5da0e1e99afBrian Paul#include "mmath.h"
49dbd1e2b5990a3689bf718296c57c14fc3ba38db5Jouk Jansen#include "mtypes.h"
507d58f44f73be59bd3583e6dfeedf56c43f7fbd55Brian Paul#include "texformat.h"
518e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul#include "texstore.h"
528e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul#include "array_cache/acache.h"
531e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell#include "swrast/swrast.h"
541e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell#include "swrast_setup/swrast_setup.h"
551e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell#include "swrast/s_context.h"
56724abeb058ca9372c5a9b9e38ee43dde1accaa41Keith Whitwell#include "swrast/s_depth.h"
571e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell#include "swrast/s_lines.h"
581e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell#include "swrast/s_triangle.h"
595a9026c65d260dc185e072163999f5d810015108Brian Paul#include "tnl/tnl.h"
60709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell#include "tnl/t_context.h"
61bc69de5f21ebb4d6e1c65bf5652d17a9fc87dda7Keith Whitwell#include "tnl/t_pipeline.h"
62afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
63724abeb058ca9372c5a9b9e38ee43dde1accaa41Keith Whitwell
64724abeb058ca9372c5a9b9e38ee43dde1accaa41Keith Whitwell
65304357dcd496f7ebf499fd9c77b4eba83a75abd5Brian Paul/*
66304357dcd496f7ebf499fd9c77b4eba83a75abd5Brian Paul * This is the OS/Mesa context struct.
67304357dcd496f7ebf499fd9c77b4eba83a75abd5Brian Paul * Notice how it includes a GLcontext.  By doing this we're mimicking
68304357dcd496f7ebf499fd9c77b4eba83a75abd5Brian Paul * C++ inheritance/derivation.
69304357dcd496f7ebf499fd9c77b4eba83a75abd5Brian Paul * Later, we can cast a GLcontext pointer into an OSMesaContext pointer
70304357dcd496f7ebf499fd9c77b4eba83a75abd5Brian Paul * or vice versa.
71304357dcd496f7ebf499fd9c77b4eba83a75abd5Brian Paul */
72afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgstruct osmesa_context {
73304357dcd496f7ebf499fd9c77b4eba83a75abd5Brian Paul   GLcontext gl_ctx;		/* The core GL/Mesa context */
74afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLvisual *gl_visual;		/* Describes the buffers */
75afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLframebuffer *gl_buffer;	/* Depth, stencil, accum, etc buffers */
76afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLenum format;		/* either GL_RGBA or GL_COLOR_INDEX */
77afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   void *buffer;		/* the image buffer */
78afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLint width, height;		/* size of image buffer */
79afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLint rowlength;		/* number of pixels per row */
80afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLint userRowLength;		/* user-specified number of pixels per row */
81afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLint rshift, gshift;	/* bit shifts for RGBA formats */
82afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLint bshift, ashift;
8374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   GLint rInd, gInd, bInd, aInd;/* index offsets for RGBA formats */
8474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   GLchan *rowaddr[MAX_HEIGHT];	/* address of first pixel in each image row */
85afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLboolean yup;		/* TRUE  -> Y increases upward */
86afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg				/* FALSE -> Y increases downward */
87afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg};
88afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
89afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
90afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
91afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/* A forward declaration: */
92cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwellstatic void osmesa_update_state( GLcontext *ctx, GLuint newstate );
931e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwellstatic void osmesa_register_swrast_functions( GLcontext *ctx );
94afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
95afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
96afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
97c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul#define OSMESA_CONTEXT(ctx)  ((OSMesaContext) (ctx->DriverCtx))
98c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul
99c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul
100c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul
101afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/**********************************************************************/
102afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/*****                    Public Functions                        *****/
103afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/**********************************************************************/
104afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
105afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
106afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/*
107afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Create an Off-Screen Mesa rendering context.  The only attribute needed is
108afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * an RGBA vs Color-Index mode flag.
109afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg *
110afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Input:  format - either GL_RGBA or GL_COLOR_INDEX
111afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg *         sharelist - specifies another OSMesaContext with which to share
112afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg *                     display lists.  NULL indicates no sharing.
113afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Return:  an OSMesaContext or 0 if error
114afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */
11505ba9becc3211795af539d79b70c8a6af2688108Karl SchultzGLAPI OSMesaContext GLAPIENTRY
116d3c070ca6a36daa765b1ad7f44e03e6671ad0490Brian PaulOSMesaCreateContext( GLenum format, OSMesaContext sharelist )
117afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
1182bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul   return OSMesaCreateContextExt(format, DEFAULT_SOFTWARE_DEPTH_BITS,
1192bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul                                 8, 16, sharelist);
1202bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul}
1212bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul
1222bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul
1232bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul
1242bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul/*
1252bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul * New in Mesa 3.5
1262bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul *
1272bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul * Create context and specify size of ancillary buffers.
1282bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul */
12905ba9becc3211795af539d79b70c8a6af2688108Karl SchultzGLAPI OSMesaContext GLAPIENTRY
1302bf5d9470d3232763cb49b5589209940d4d5398dBrian PaulOSMesaCreateContextExt( GLenum format, GLint depthBits, GLint stencilBits,
1312bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul                        GLint accumBits, OSMesaContext sharelist )
1322bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul{
133afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   OSMesaContext osmesa;
134afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLint rshift, gshift, bshift, ashift;
13574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   GLint rind, gind, bind, aind;
1362780ed4b978b32a08be6eecb0e923250e7b907eeBrian Paul   GLint indexBits = 0, redBits = 0, greenBits = 0, blueBits = 0, alphaBits =0;
137afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLboolean rgbmode;
13874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   const GLuint i4 = 1;
13974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   const GLubyte *i1 = (GLubyte *) &i4;
14074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   const GLint little_endian = *i1;
141afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
14274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   rind = gind = bind = aind = 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;
15001915e90e6912f06d43d443a09157f7bbc96ddc5Brian Paul      redBits = CHAN_BITS;
15101915e90e6912f06d43d443a09157f7bbc96ddc5Brian Paul      greenBits = CHAN_BITS;
15201915e90e6912f06d43d443a09157f7bbc96ddc5Brian Paul      blueBits = CHAN_BITS;
15301915e90e6912f06d43d443a09157f7bbc96ddc5Brian Paul      alphaBits = CHAN_BITS;
15474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      rind = 0;
15574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      gind = 1;
15674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      bind = 2;
15774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      aind = 3;
158afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      if (little_endian) {
159afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         rshift = 0;
160afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         gshift = 8;
161afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         bshift = 16;
162afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         ashift = 24;
163afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
164afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      else {
165afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         rshift = 24;
166afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         gshift = 16;
167afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         bshift = 8;
168afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         ashift = 0;
169afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
170afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      rgbmode = GL_TRUE;
171afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
172afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   else if (format==OSMESA_BGRA) {
173afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      indexBits = 0;
17401915e90e6912f06d43d443a09157f7bbc96ddc5Brian Paul      redBits = CHAN_BITS;
17501915e90e6912f06d43d443a09157f7bbc96ddc5Brian Paul      greenBits = CHAN_BITS;
17601915e90e6912f06d43d443a09157f7bbc96ddc5Brian Paul      blueBits = CHAN_BITS;
17701915e90e6912f06d43d443a09157f7bbc96ddc5Brian Paul      alphaBits = CHAN_BITS;
17874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      bind = 0;
1792427575c21c7c04b52f4a3605ad87c142c01f840Brian Paul      gind = 1;
1802427575c21c7c04b52f4a3605ad87c142c01f840Brian Paul      rind = 2;
18174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      aind = 3;
182afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      if (little_endian) {
1832427575c21c7c04b52f4a3605ad87c142c01f840Brian Paul         bshift = 0;
1842427575c21c7c04b52f4a3605ad87c142c01f840Brian Paul         gshift = 8;
1852427575c21c7c04b52f4a3605ad87c142c01f840Brian Paul         rshift = 16;
1862427575c21c7c04b52f4a3605ad87c142c01f840Brian Paul         ashift = 24;
187afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
188afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      else {
189afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         bshift = 24;
190afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         gshift = 16;
191afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         rshift = 8;
192afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         ashift = 0;
193afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
194afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      rgbmode = GL_TRUE;
195afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
196afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   else if (format==OSMESA_ARGB) {
197afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      indexBits = 0;
19801915e90e6912f06d43d443a09157f7bbc96ddc5Brian Paul      redBits = CHAN_BITS;
19901915e90e6912f06d43d443a09157f7bbc96ddc5Brian Paul      greenBits = CHAN_BITS;
20001915e90e6912f06d43d443a09157f7bbc96ddc5Brian Paul      blueBits = CHAN_BITS;
20101915e90e6912f06d43d443a09157f7bbc96ddc5Brian Paul      alphaBits = CHAN_BITS;
2022427575c21c7c04b52f4a3605ad87c142c01f840Brian Paul      aind = 0;
20374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      rind = 1;
20474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      gind = 2;
20574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      bind = 3;
206afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      if (little_endian) {
2072427575c21c7c04b52f4a3605ad87c142c01f840Brian Paul         ashift = 0;
2082427575c21c7c04b52f4a3605ad87c142c01f840Brian Paul         rshift = 8;
2092427575c21c7c04b52f4a3605ad87c142c01f840Brian Paul         gshift = 16;
2102427575c21c7c04b52f4a3605ad87c142c01f840Brian Paul         bshift = 24;
211afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
212afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      else {
213afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         ashift = 24;
214afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         rshift = 16;
215afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         gshift = 8;
216afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         bshift = 0;
217afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
218afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      rgbmode = GL_TRUE;
219afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
220afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   else if (format==OSMESA_RGB) {
221afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      indexBits = 0;
22201915e90e6912f06d43d443a09157f7bbc96ddc5Brian Paul      redBits = CHAN_BITS;
22301915e90e6912f06d43d443a09157f7bbc96ddc5Brian Paul      greenBits = CHAN_BITS;
22401915e90e6912f06d43d443a09157f7bbc96ddc5Brian Paul      blueBits = CHAN_BITS;
225afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      alphaBits = 0;
226afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      bshift = 0;
227afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      gshift = 8;
228afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      rshift = 16;
229afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      ashift = 24;
230afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      rind = 0;
23174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      gind = 1;
23274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      bind = 2;
233afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      rgbmode = GL_TRUE;
234afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
235afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   else if (format==OSMESA_BGR) {
236afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      indexBits = 0;
23701915e90e6912f06d43d443a09157f7bbc96ddc5Brian Paul      redBits = CHAN_BITS;
23801915e90e6912f06d43d443a09157f7bbc96ddc5Brian Paul      greenBits = CHAN_BITS;
23901915e90e6912f06d43d443a09157f7bbc96ddc5Brian Paul      blueBits = CHAN_BITS;
240afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      alphaBits = 0;
241afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      bshift = 0;
242afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      gshift = 8;
243afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      rshift = 16;
244afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      ashift = 24;
245afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      rind = 2;
24674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      gind = 1;
24774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      bind = 0;
248afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      rgbmode = GL_TRUE;
249afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
250206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul   else if (format==OSMESA_RGB_565) {
251206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul      indexBits = 0;
252206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul      redBits = 5;
253206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul      greenBits = 6;
254206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul      blueBits = 5;
255206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul      alphaBits = 0;
256206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul      rshift = 11;
257206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul      gshift = 5;
258206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul      bshift = 0;
259206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul      ashift = 0;
260206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul      rind = 0; /* not used */
261206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul      gind = 0;
262206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul      bind = 0;
263206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul      rgbmode = GL_TRUE;
264206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul   }
265afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   else {
266afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      return NULL;
267afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
268afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
269afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
270bd5cdaf4442872d3cd2ff94eeafadd481d27fcfbBrian Paul   osmesa = (OSMesaContext) CALLOC_STRUCT(osmesa_context);
271afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   if (osmesa) {
2722bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul      osmesa->gl_visual = _mesa_create_visual( rgbmode,
2732bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul                                               GL_FALSE,    /* double buffer */
2742bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul                                               GL_FALSE,    /* stereo */
2752bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul                                               redBits,
2762bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul                                               greenBits,
2772bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul                                               blueBits,
2782bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul                                               alphaBits,
2792bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul                                               indexBits,
2802bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul                                               depthBits,
2812bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul                                               stencilBits,
2822bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul                                               accumBits,
2832bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul                                               accumBits,
2842bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul                                               accumBits,
2852bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul                                               alphaBits ? accumBits : 0,
2862bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul                                               1            /* num samples */
2872bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul                                               );
288afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      if (!osmesa->gl_visual) {
289941dcc797e1a6317808c1ec43476817286d576baBrian Paul         FREE(osmesa);
290afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         return NULL;
291afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
292afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
293df81387dfae199a71bc55138ea5856dc05eacf24Brian Paul      if (!_mesa_initialize_context(&osmesa->gl_ctx,
294df81387dfae199a71bc55138ea5856dc05eacf24Brian Paul                                    osmesa->gl_visual,
295df81387dfae199a71bc55138ea5856dc05eacf24Brian Paul                                    sharelist ? &sharelist->gl_ctx
296df81387dfae199a71bc55138ea5856dc05eacf24Brian Paul                                              : (GLcontext *) NULL,
297df81387dfae199a71bc55138ea5856dc05eacf24Brian Paul                                    (void *) osmesa, GL_TRUE )) {
298df81387dfae199a71bc55138ea5856dc05eacf24Brian Paul         _mesa_destroy_visual( osmesa->gl_visual );
299bd5cdaf4442872d3cd2ff94eeafadd481d27fcfbBrian Paul         FREE(osmesa);
300afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         return NULL;
301afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
3025a9026c65d260dc185e072163999f5d810015108Brian Paul
3035a9026c65d260dc185e072163999f5d810015108Brian Paul      _mesa_enable_sw_extensions(&(osmesa->gl_ctx));
3042a88946f9ad82350c2f7edc2185bf9394d2d4764Brian Paul      _mesa_enable_1_3_extensions(&(osmesa->gl_ctx));
305304357dcd496f7ebf499fd9c77b4eba83a75abd5Brian Paul
306b1394fa92aaaf859ce9efc8b5fc194397921320cBrian Paul      osmesa->gl_buffer = _mesa_create_framebuffer( osmesa->gl_visual,
3074742735a5c22f2400a2777965e08e757ec384979Karl Schultz                           (GLboolean) ( osmesa->gl_visual->depthBits > 0 ),
3084742735a5c22f2400a2777965e08e757ec384979Karl Schultz                           (GLboolean) ( osmesa->gl_visual->stencilBits > 0 ),
3094742735a5c22f2400a2777965e08e757ec384979Karl Schultz                           (GLboolean) ( osmesa->gl_visual->accumRedBits > 0 ),
3104742735a5c22f2400a2777965e08e757ec384979Karl Schultz                           GL_FALSE /* s/w alpha */ );
3114c44d63f01a01f134d7e4456d4209edee97f9ef5Brian Paul
312afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      if (!osmesa->gl_buffer) {
313b1394fa92aaaf859ce9efc8b5fc194397921320cBrian Paul         _mesa_destroy_visual( osmesa->gl_visual );
314b1394fa92aaaf859ce9efc8b5fc194397921320cBrian Paul         _mesa_free_context_data( &osmesa->gl_ctx );
315bd5cdaf4442872d3cd2ff94eeafadd481d27fcfbBrian Paul         FREE(osmesa);
316afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         return NULL;
317afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
318afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      osmesa->format = format;
319afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      osmesa->buffer = NULL;
320afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      osmesa->width = 0;
321afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      osmesa->height = 0;
322afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      osmesa->userRowLength = 0;
323afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      osmesa->rowlength = 0;
324afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      osmesa->yup = GL_TRUE;
325afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      osmesa->rshift = rshift;
326afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      osmesa->gshift = gshift;
327afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      osmesa->bshift = bshift;
328afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      osmesa->ashift = ashift;
32974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      osmesa->rInd = rind;
33074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      osmesa->gInd = gind;
33174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      osmesa->bInd = bind;
33274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      osmesa->aInd = aind;
3331e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell
3341e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell
3351e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell      /* Initialize the software rasterizer and helper modules.
3361e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell       */
3371e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell      {
3381e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell	 GLcontext *ctx = &osmesa->gl_ctx;
3391e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell
3401e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell	 _swrast_CreateContext( ctx );
34158e991705392a2e17a1c8b034f4083a0adaf1943Keith Whitwell	 _ac_CreateContext( ctx );
34223caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell	 _tnl_CreateContext( ctx );
343cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell	 _swsetup_CreateContext( ctx );
344dbd1e2b5990a3689bf718296c57c14fc3ba38db5Jouk Jansen
3451182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell	 _swsetup_Wakeup( ctx );
3461e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell	 osmesa_register_swrast_functions( ctx );
3471e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell      }
348afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
349afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   return osmesa;
350afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
351afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
352afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
353afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
3542bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul
355afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/*
356afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Destroy an Off-Screen Mesa rendering context.
357afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg *
358afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Input:  ctx - the context to destroy
359afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */
36005ba9becc3211795af539d79b70c8a6af2688108Karl SchultzGLAPI void GLAPIENTRY OSMesaDestroyContext( OSMesaContext ctx )
361afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
362afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   if (ctx) {
363709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell      _swsetup_DestroyContext( &ctx->gl_ctx );
364709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell      _tnl_DestroyContext( &ctx->gl_ctx );
365709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell      _ac_DestroyContext( &ctx->gl_ctx );
366709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell      _swrast_DestroyContext( &ctx->gl_ctx );
367709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell
368b1394fa92aaaf859ce9efc8b5fc194397921320cBrian Paul      _mesa_destroy_visual( ctx->gl_visual );
369b1394fa92aaaf859ce9efc8b5fc194397921320cBrian Paul      _mesa_destroy_framebuffer( ctx->gl_buffer );
370b1394fa92aaaf859ce9efc8b5fc194397921320cBrian Paul      _mesa_free_context_data( &ctx->gl_ctx );
371bd5cdaf4442872d3cd2ff94eeafadd481d27fcfbBrian Paul      FREE( ctx );
372afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
373afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
374afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
375afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
376afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
377afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/*
378afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Recompute the values of the context's rowaddr array.
379afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */
380afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgstatic void compute_row_addresses( OSMesaContext ctx )
381afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
38274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   GLint bytesPerPixel, bytesPerRow, i;
38374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   GLubyte *origin = (GLubyte *) ctx->buffer;
38474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul
38574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   if (ctx->format == OSMESA_COLOR_INDEX) {
38674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      /* CI mode */
38774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      bytesPerPixel = 1 * sizeof(GLchan);
38874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   }
38974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   else if ((ctx->format == OSMESA_RGB) || (ctx->format == OSMESA_BGR)) {
39074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      /* RGB mode */
39174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      bytesPerPixel = 3 * sizeof(GLchan);
39274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   }
393206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul   else if (ctx->format == OSMESA_RGB_565) {
394206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul      /* 5/6/5 RGB pixel in 16 bits */
395206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul      bytesPerPixel = 2;
396206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul   }
39774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   else {
39874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      /* RGBA mode */
39974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      bytesPerPixel = 4 * sizeof(GLchan);
40074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   }
40174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul
40274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   bytesPerRow = ctx->rowlength * bytesPerPixel;
403afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
404afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   if (ctx->yup) {
405afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      /* Y=0 is bottom line of window */
40674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      for (i = 0; i < MAX_HEIGHT; i++) {
40774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul         ctx->rowaddr[i] = (GLchan *) ((GLubyte *) origin + i * bytesPerRow);
408afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
409afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
410afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   else {
411afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      /* Y=0 is top line of window */
41274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      for (i = 0; i < MAX_HEIGHT; i++) {
41374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul         GLint j = ctx->height - i - 1;
41474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul         ctx->rowaddr[i] = (GLchan *) ((GLubyte *) origin + j * bytesPerRow);
415afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
416afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
417afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
418afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
419afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
420afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/*
421afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Bind an OSMesaContext to an image buffer.  The image buffer is just a
422afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * block of memory which the client provides.  Its size must be at least
423afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * as large as width*height*sizeof(type).  Its address should be a multiple
424afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * of 4 if using RGBA mode.
425afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg *
426afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Image data is stored in the order of glDrawPixels:  row-major order
427afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * with the lower-left image pixel stored in the first array position
428afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * (ie. bottom-to-top).
429afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg *
430afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * If the context's viewport hasn't been initialized yet, it will now be
431afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * initialized to (0,0,width,height).
432afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg *
433afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Input:  ctx - the rendering context
434afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg *         buffer - the image buffer memory
43509a0cb464d2bc661859c6435f2145e8a5ece005aBrian Paul *         type - data type for pixel components
43609a0cb464d2bc661859c6435f2145e8a5ece005aBrian Paul *            Normally, only GL_UNSIGNED_BYTE and GL_UNSIGNED_SHORT_5_6_5
43709a0cb464d2bc661859c6435f2145e8a5ece005aBrian Paul *            are supported.  But if Mesa's been compiled with CHAN_BITS==16
43809a0cb464d2bc661859c6435f2145e8a5ece005aBrian Paul *            then type must be GL_UNSIGNED_SHORT.  And if Mesa's been build
43909a0cb464d2bc661859c6435f2145e8a5ece005aBrian Paul *            with CHAN_BITS==32 then type must be GL_FLOAT.
440afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg *         width, height - size of image buffer in pixels, at least 1
441afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Return:  GL_TRUE if success, GL_FALSE if error because of invalid ctx,
44209a0cb464d2bc661859c6435f2145e8a5ece005aBrian Paul *          invalid buffer address, invalid type, width<1, height<1,
443afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg *          width>internal limit or height>internal limit.
444afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */
44505ba9becc3211795af539d79b70c8a6af2688108Karl SchultzGLAPI GLboolean GLAPIENTRY
446d3c070ca6a36daa765b1ad7f44e03e6671ad0490Brian PaulOSMesaMakeCurrent( OSMesaContext ctx, void *buffer, GLenum type,
447d3c070ca6a36daa765b1ad7f44e03e6671ad0490Brian Paul                   GLsizei width, GLsizei height )
448afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
449206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul   if (!ctx || !buffer ||
45074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul       width < 1 || height < 1 ||
45174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul       width > MAX_WIDTH || height > MAX_HEIGHT) {
452afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      return GL_FALSE;
453afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
454afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
4555233ca8d3061e9e126c73073dccf56c65869bb61Brian Paul   if (ctx->format == OSMESA_RGB_565) {
4565233ca8d3061e9e126c73073dccf56c65869bb61Brian Paul      if (type != GL_UNSIGNED_SHORT_5_6_5)
4575233ca8d3061e9e126c73073dccf56c65869bb61Brian Paul         return GL_FALSE;
458206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul   }
459206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul   else if (type != CHAN_TYPE) {
460206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul      return GL_FALSE;
461206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul   }
462206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul
463cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   osmesa_update_state( &ctx->gl_ctx, 0 );
464b1394fa92aaaf859ce9efc8b5fc194397921320cBrian Paul   _mesa_make_current( &ctx->gl_ctx, ctx->gl_buffer );
465afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
466afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   ctx->buffer = buffer;
467afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   ctx->width = width;
468afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   ctx->height = height;
469afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   if (ctx->userRowLength)
470afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      ctx->rowlength = ctx->userRowLength;
471afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   else
472afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      ctx->rowlength = width;
473afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
474afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   compute_row_addresses( ctx );
475afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
476afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   /* init viewport */
47702ee456248c75cfee324164ec6fd81a3b77ec2bfBrian Paul   if (ctx->gl_ctx.Viewport.Width == 0) {
478afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      /* initialize viewport and scissor box to buffer size */
479cb5ecb883eb3be842ef44c61df8d4b527877c858Brian Paul      _mesa_Viewport( 0, 0, width, height );
480304357dcd496f7ebf499fd9c77b4eba83a75abd5Brian Paul      ctx->gl_ctx.Scissor.Width = width;
481304357dcd496f7ebf499fd9c77b4eba83a75abd5Brian Paul      ctx->gl_ctx.Scissor.Height = height;
482afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
48302ee456248c75cfee324164ec6fd81a3b77ec2bfBrian Paul   else {
48402ee456248c75cfee324164ec6fd81a3b77ec2bfBrian Paul      /* this will make ensure we recognize the new buffer size */
48502ee456248c75cfee324164ec6fd81a3b77ec2bfBrian Paul      _mesa_ResizeBuffersMESA();
48602ee456248c75cfee324164ec6fd81a3b77ec2bfBrian Paul   }
487afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
488afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   return GL_TRUE;
489afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
490afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
491afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
492afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
49305ba9becc3211795af539d79b70c8a6af2688108Karl SchultzGLAPI OSMesaContext GLAPIENTRY OSMesaGetCurrentContext( void )
494afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
495b1394fa92aaaf859ce9efc8b5fc194397921320cBrian Paul   GLcontext *ctx = _mesa_get_current_context();
496d3c070ca6a36daa765b1ad7f44e03e6671ad0490Brian Paul   if (ctx)
497304357dcd496f7ebf499fd9c77b4eba83a75abd5Brian Paul      return (OSMesaContext) ctx;
498d3c070ca6a36daa765b1ad7f44e03e6671ad0490Brian Paul   else
499d3c070ca6a36daa765b1ad7f44e03e6671ad0490Brian Paul      return NULL;
500afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
501afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
502afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
503afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
50405ba9becc3211795af539d79b70c8a6af2688108Karl SchultzGLAPI void GLAPIENTRY OSMesaPixelStore( GLint pname, GLint value )
505afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
506afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   OSMesaContext ctx = OSMesaGetCurrentContext();
507afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
508afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   switch (pname) {
509afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case OSMESA_ROW_LENGTH:
510afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         if (value<0) {
51108836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul            _mesa_error( &ctx->gl_ctx, GL_INVALID_VALUE,
512afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg                      "OSMesaPixelStore(value)" );
513afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            return;
514afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         }
515afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         ctx->userRowLength = value;
516afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         ctx->rowlength = value;
517afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         break;
518afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case OSMESA_Y_UP:
519afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         ctx->yup = value ? GL_TRUE : GL_FALSE;
520afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         break;
521afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      default:
52208836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul         _mesa_error( &ctx->gl_ctx, GL_INVALID_ENUM, "OSMesaPixelStore(pname)" );
523afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         return;
524afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
525afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
526afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   compute_row_addresses( ctx );
527afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
528afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
529afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
53005ba9becc3211795af539d79b70c8a6af2688108Karl SchultzGLAPI void GLAPIENTRY OSMesaGetIntegerv( GLint pname, GLint *value )
531afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
532afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   OSMesaContext ctx = OSMesaGetCurrentContext();
533afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
534afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   switch (pname) {
535afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case OSMESA_WIDTH:
536afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         *value = ctx->width;
537afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         return;
538afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case OSMESA_HEIGHT:
539afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         *value = ctx->height;
540afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         return;
541afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case OSMESA_FORMAT:
542afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         *value = ctx->format;
543afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         return;
544afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case OSMESA_TYPE:
54501915e90e6912f06d43d443a09157f7bbc96ddc5Brian Paul         *value = CHAN_TYPE;
546afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         return;
547afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case OSMESA_ROW_LENGTH:
548afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         *value = ctx->rowlength;
549afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         return;
550afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case OSMESA_Y_UP:
551afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         *value = ctx->yup;
552afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         return;
553a0037ad8b38e25bdb16e64e4da6e5c75cc66a9cdBrian Paul      case OSMESA_MAX_WIDTH:
554a0037ad8b38e25bdb16e64e4da6e5c75cc66a9cdBrian Paul         *value = MAX_WIDTH;
555a0037ad8b38e25bdb16e64e4da6e5c75cc66a9cdBrian Paul         return;
556a0037ad8b38e25bdb16e64e4da6e5c75cc66a9cdBrian Paul      case OSMESA_MAX_HEIGHT:
557a0037ad8b38e25bdb16e64e4da6e5c75cc66a9cdBrian Paul         *value = MAX_HEIGHT;
558a0037ad8b38e25bdb16e64e4da6e5c75cc66a9cdBrian Paul         return;
559afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      default:
56008836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul         _mesa_error(&ctx->gl_ctx, GL_INVALID_ENUM, "OSMesaGetIntergerv(pname)");
561afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         return;
562afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
563afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
564afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
565afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/*
566afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Return the depth buffer associated with an OSMesa context.
567afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Input:  c - the OSMesa context
568afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Output:  width, height - size of buffer in pixels
569afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg *          bytesPerValue - bytes per depth value (2 or 4)
570afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg *          buffer - pointer to depth buffer values
571afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Return:  GL_TRUE or GL_FALSE to indicate success or failure.
572afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */
57305ba9becc3211795af539d79b70c8a6af2688108Karl SchultzGLAPI GLboolean GLAPIENTRY
5747e67fb41fb54e050f6983b4de09ed3a317d6148fBrian PaulOSMesaGetDepthBuffer( OSMesaContext c, GLint *width, GLint *height,
5757e67fb41fb54e050f6983b4de09ed3a317d6148fBrian Paul                      GLint *bytesPerValue, void **buffer )
576afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
577650cb74bcb913d2589355d56a14da1ab0307d1fcBrian Paul   if ((!c->gl_buffer) || (!c->gl_buffer->DepthBuffer)) {
578afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      *width = 0;
579afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      *height = 0;
580afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      *bytesPerValue = 0;
581afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      *buffer = 0;
582afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      return GL_FALSE;
583afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
584afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   else {
585afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      *width = c->gl_buffer->Width;
586afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      *height = c->gl_buffer->Height;
5879db3f95acea5622573803890afd506ebcdaab3b3Brian Paul      if (c->gl_visual->depthBits <= 16)
5889db3f95acea5622573803890afd506ebcdaab3b3Brian Paul         *bytesPerValue = sizeof(GLushort);
5899db3f95acea5622573803890afd506ebcdaab3b3Brian Paul      else
5909db3f95acea5622573803890afd506ebcdaab3b3Brian Paul         *bytesPerValue = sizeof(GLuint);
591650cb74bcb913d2589355d56a14da1ab0307d1fcBrian Paul      *buffer = c->gl_buffer->DepthBuffer;
592afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      return GL_TRUE;
593afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
594afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
595afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
59623ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank/*
59723ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank * Return the color buffer associated with an OSMesa context.
59823ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank * Input:  c - the OSMesa context
59923ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank * Output:  width, height - size of buffer in pixels
60023ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank *          format - the pixel format (OSMESA_FORMAT)
60123ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank *          buffer - pointer to color buffer values
60223ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank * Return:  GL_TRUE or GL_FALSE to indicate success or failure.
60323ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank */
60405ba9becc3211795af539d79b70c8a6af2688108Karl SchultzGLAPI GLboolean GLAPIENTRY
6057e67fb41fb54e050f6983b4de09ed3a317d6148fBrian PaulOSMesaGetColorBuffer( OSMesaContext c, GLint *width,
6067e67fb41fb54e050f6983b4de09ed3a317d6148fBrian Paul                      GLint *height, GLint *format, void **buffer )
60723ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank{
60823ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank   if (!c->buffer) {
60923ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank      *width = 0;
61023ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank      *height = 0;
61123ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank      *format = 0;
61223ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank      *buffer = 0;
61323ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank      return GL_FALSE;
6147e67fb41fb54e050f6983b4de09ed3a317d6148fBrian Paul   }
6157e67fb41fb54e050f6983b4de09ed3a317d6148fBrian Paul   else {
61623ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank      *width = c->width;
61723ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank      *height = c->height;
61823ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank      *format = c->format;
61923ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank      *buffer = c->buffer;
62023ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank      return GL_TRUE;
62123ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank   }
62223ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank}
623afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
62401dc182ee86922845ba0b17a2cda9af19150c93aBrian Paul
62501dc182ee86922845ba0b17a2cda9af19150c93aBrian Paul
62601dc182ee86922845ba0b17a2cda9af19150c93aBrian Paulstruct name_address {
62701dc182ee86922845ba0b17a2cda9af19150c93aBrian Paul   const char *Name;
62801dc182ee86922845ba0b17a2cda9af19150c93aBrian Paul   GLvoid *Address;
62901dc182ee86922845ba0b17a2cda9af19150c93aBrian Paul};
63001dc182ee86922845ba0b17a2cda9af19150c93aBrian Paul
63101dc182ee86922845ba0b17a2cda9af19150c93aBrian Paulstatic struct name_address functions[] = {
63201dc182ee86922845ba0b17a2cda9af19150c93aBrian Paul   { "OSMesaCreateContext", (void *) OSMesaCreateContext },
63301dc182ee86922845ba0b17a2cda9af19150c93aBrian Paul   { "OSMesaCreateContextExt", (void *) OSMesaCreateContextExt },
63401dc182ee86922845ba0b17a2cda9af19150c93aBrian Paul   { "OSMesaDestroyContext", (void *) OSMesaDestroyContext },
63501dc182ee86922845ba0b17a2cda9af19150c93aBrian Paul   { "OSMesaMakeCurrent", (void *) OSMesaMakeCurrent },
63601dc182ee86922845ba0b17a2cda9af19150c93aBrian Paul   { "OSMesaGetCurrentContext", (void *) OSMesaGetCurrentContext },
63701dc182ee86922845ba0b17a2cda9af19150c93aBrian Paul   { "OSMesaPixelsStore", (void *) OSMesaPixelStore },
63801dc182ee86922845ba0b17a2cda9af19150c93aBrian Paul   { "OSMesaGetIntegerv", (void *) OSMesaGetIntegerv },
63901dc182ee86922845ba0b17a2cda9af19150c93aBrian Paul   { "OSMesaGetDepthBuffer", (void *) OSMesaGetDepthBuffer },
64001dc182ee86922845ba0b17a2cda9af19150c93aBrian Paul   { "OSMesaGetColorBuffer", (void *) OSMesaGetColorBuffer },
64101dc182ee86922845ba0b17a2cda9af19150c93aBrian Paul   { "OSMesaGetProcAddress", (void *) OSMesaGetProcAddress },
64201dc182ee86922845ba0b17a2cda9af19150c93aBrian Paul   { NULL, NULL }
64301dc182ee86922845ba0b17a2cda9af19150c93aBrian Paul};
64401dc182ee86922845ba0b17a2cda9af19150c93aBrian Paul
64501dc182ee86922845ba0b17a2cda9af19150c93aBrian PaulGLAPI void * GLAPIENTRY
64601dc182ee86922845ba0b17a2cda9af19150c93aBrian PaulOSMesaGetProcAddress( const char *funcName )
64701dc182ee86922845ba0b17a2cda9af19150c93aBrian Paul{
64801dc182ee86922845ba0b17a2cda9af19150c93aBrian Paul   int i;
64901dc182ee86922845ba0b17a2cda9af19150c93aBrian Paul   for (i = 0; functions[i].Name; i++) {
65001dc182ee86922845ba0b17a2cda9af19150c93aBrian Paul      if (strcmp(functions[i].Name, funcName) == 0)
65101dc182ee86922845ba0b17a2cda9af19150c93aBrian Paul         return (void *) functions[i].Address;
65201dc182ee86922845ba0b17a2cda9af19150c93aBrian Paul   }
65301dc182ee86922845ba0b17a2cda9af19150c93aBrian Paul   return (void *) _glapi_get_proc_address(funcName);
65401dc182ee86922845ba0b17a2cda9af19150c93aBrian Paul}
65501dc182ee86922845ba0b17a2cda9af19150c93aBrian Paul
65601dc182ee86922845ba0b17a2cda9af19150c93aBrian Paul
657afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/**********************************************************************/
658afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/*** Device Driver Functions                                        ***/
659afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/**********************************************************************/
660afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
661afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
662afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/*
663afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Useful macros:
664afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */
665afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
66674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul#define PACK_RGBA(DST, R, G, B, A)	\
66774b493a5e61237de081a438e774e5d8139d4c6b7Brian Pauldo {					\
66874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   (DST)[osmesa->rInd] = R;		\
66974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   (DST)[osmesa->gInd] = G;		\
67074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   (DST)[osmesa->bInd] = B;		\
67174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   (DST)[osmesa->aInd] = A;		\
67274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul} while (0)
67374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul
67474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul#define PACK_RGB(DST, R, G, B)  \
67574b493a5e61237de081a438e774e5d8139d4c6b7Brian Pauldo {				\
67674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   (DST)[0] = R;		\
67774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   (DST)[1] = G;		\
67874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   (DST)[2] = B;		\
67974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul} while (0)
680afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
68174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul#define PACK_BGR(DST, R, G, B)  \
68274b493a5e61237de081a438e774e5d8139d4c6b7Brian Pauldo {				\
68374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   (DST)[0] = B;		\
68474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   (DST)[1] = G;		\
68574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   (DST)[2] = R;		\
68674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul} while (0)
687afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
688206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul#define PACK_RGB_565(DST, R, G, B)					\
689206eda8b69ab3c63e9597015189f49d1bda9356fBrian Pauldo {									\
690f431a3fb4dc1bf860203d79e54657e3a62bc50dfBrian Paul   (DST) = (((int) (R) << 8) & 0xf800) | (((int) (G) << 3) & 0x7e0) | ((int) (B) >> 3);\
691206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul} while (0)
692206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul
693afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
69401915e90e6912f06d43d443a09157f7bbc96ddc5Brian Paul#define UNPACK_RED(P)      ( (P)[osmesa->rInd] )
69501915e90e6912f06d43d443a09157f7bbc96ddc5Brian Paul#define UNPACK_GREEN(P)    ( (P)[osmesa->gInd] )
69601915e90e6912f06d43d443a09157f7bbc96ddc5Brian Paul#define UNPACK_BLUE(P)     ( (P)[osmesa->bInd] )
69701915e90e6912f06d43d443a09157f7bbc96ddc5Brian Paul#define UNPACK_ALPHA(P)    ( (P)[osmesa->aInd] )
69874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul
69974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul
70074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul#define PIXELADDR1(X,Y)  (osmesa->rowaddr[Y] + (X))
701206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul#define PIXELADDR2(X,Y)  (osmesa->rowaddr[Y] + 2 * (X))
70274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul#define PIXELADDR3(X,Y)  (osmesa->rowaddr[Y] + 3 * (X))
70374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul#define PIXELADDR4(X,Y)  (osmesa->rowaddr[Y] + 4 * (X))
704afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
705afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
706afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
707cea0e8e6700e871bb9bcb334cb75fbfbfcdfd702Brian Paulstatic GLboolean set_draw_buffer( GLcontext *ctx, GLenum mode )
708afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
709afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   (void) ctx;
710afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   if (mode==GL_FRONT_LEFT) {
711afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      return GL_TRUE;
712afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
713afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   else {
714afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      return GL_FALSE;
715afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
716afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
717afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
718afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
719cea0e8e6700e871bb9bcb334cb75fbfbfcdfd702Brian Paulstatic void set_read_buffer( GLcontext *ctx, GLframebuffer *buffer, GLenum mode )
720cea0e8e6700e871bb9bcb334cb75fbfbfcdfd702Brian Paul{
721cea0e8e6700e871bb9bcb334cb75fbfbfcdfd702Brian Paul   /* separate read buffer not supported */
722cea0e8e6700e871bb9bcb334cb75fbfbfcdfd702Brian Paul   ASSERT(buffer == ctx->DrawBuffer);
723cea0e8e6700e871bb9bcb334cb75fbfbfcdfd702Brian Paul   ASSERT(mode == GL_FRONT_LEFT);
724cea0e8e6700e871bb9bcb334cb75fbfbfcdfd702Brian Paul}
725cea0e8e6700e871bb9bcb334cb75fbfbfcdfd702Brian Paul
726cea0e8e6700e871bb9bcb334cb75fbfbfcdfd702Brian Paul
727d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwellstatic void clear( GLcontext *ctx, GLbitfield mask, GLboolean all,
728d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell		   GLint x, GLint y, GLint width, GLint height )
729afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
730c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul   OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
731dd020f13a6d520b46aefd4453dae6b6edcc427f6Brian Paul   const GLuint *colorMask = (GLuint *) &ctx->Color.ColorMask;
732dd020f13a6d520b46aefd4453dae6b6edcc427f6Brian Paul
733dd020f13a6d520b46aefd4453dae6b6edcc427f6Brian Paul   /* sanity check - we only have a front-left buffer */
734dd020f13a6d520b46aefd4453dae6b6edcc427f6Brian Paul   ASSERT((mask & (DD_FRONT_RIGHT_BIT | DD_BACK_LEFT_BIT | DD_BACK_RIGHT_BIT)) == 0);
735d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell   if (*colorMask == 0xffffffff && ctx->Color.IndexMask == 0xffffffff) {
736d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell      if (mask & DD_FRONT_LEFT_BIT) {
737d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	 if (osmesa->format == OSMESA_COLOR_INDEX) {
738d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	    if (all) {
739d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	       /* Clear whole CI buffer */
74074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul#if CHAN_TYPE == GL_UNSIGNED_BYTE
741d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	       MEMSET(osmesa->buffer, ctx->Color.ClearIndex,
742d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell		      osmesa->rowlength * osmesa->height);
74374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul#else
744d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	       const GLint n = osmesa->rowlength * osmesa->height;
745d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	       GLchan *buffer = (GLchan *) osmesa->buffer;
746d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	       GLint i;
747d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	       for (i = 0; i < n; i ++) {
748d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell		  buffer[i] = ctx->Color.ClearIndex;
749d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	       }
75074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul#endif
751d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	    }
752d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	    else {
753d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	       /* Clear part of CI buffer */
754d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	       const GLchan clearIndex = (GLchan) ctx->Color.ClearIndex;
755d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	       GLint i, j;
756d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	       for (i = 0; i < height; i++) {
757d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell		  GLchan *ptr1 = PIXELADDR1(x, (y + i));
758d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell		  for (j = 0; j < width; j++) {
759d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell		     *ptr1++ = clearIndex;
760d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell		  }
761d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	       }
762d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	    }
763d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	 }
764d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	 else if (osmesa->format == OSMESA_RGB) {
765d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	    const GLchan r = ctx->Color.ClearColor[0];
766d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	    const GLchan g = ctx->Color.ClearColor[1];
767d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	    const GLchan b = ctx->Color.ClearColor[2];
768d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	    if (all) {
769d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	       /* Clear whole RGB buffer */
770d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	       GLuint n = osmesa->rowlength * osmesa->height;
771d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	       GLchan *ptr3 = (GLchan *) osmesa->buffer;
772d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	       GLuint i;
773d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	       for (i = 0; i < n; i++) {
774d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell		  PACK_RGB(ptr3, r, g, b);
775d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell		  ptr3 += 3;
776d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	       }
777d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	    }
778d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	    else {
779d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	       /* Clear part of RGB buffer */
780d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	       GLint i, j;
781d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	       for (i = 0; i < height; i++) {
782d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell		  GLchan *ptr3 = PIXELADDR3(x, (y + i));
783d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell		  for (j = 0; j < width; j++) {
784d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell		     PACK_RGB(ptr3, r, g, b);
785d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell		     ptr3 += 3;
786d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell		  }
787d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	       }
788d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	    }
789d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	 }
790d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	 else if (osmesa->format == OSMESA_BGR) {
791d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	    const GLchan r = ctx->Color.ClearColor[0];
792d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	    const GLchan g = ctx->Color.ClearColor[1];
793d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	    const GLchan b = ctx->Color.ClearColor[2];
794d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	    if (all) {
795d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	       /* Clear whole RGB buffer */
796d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	       const GLint n = osmesa->rowlength * osmesa->height;
797d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	       GLchan *ptr3 = (GLchan *) osmesa->buffer;
798d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	       GLint i;
799d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	       for (i = 0; i < n; i++) {
800d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell		  PACK_BGR(ptr3, r, g, b);
801d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell		  ptr3 += 3;
802d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	       }
803d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	    }
804d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	    else {
805d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	       /* Clear part of RGB buffer */
806d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	       GLint i, j;
807d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	       for (i = 0; i < height; i++) {
808d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell		  GLchan *ptr3 = PIXELADDR3(x, (y + i));
809d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell		  for (j = 0; j < width; j++) {
810d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell		     PACK_BGR(ptr3, r, g, b);
811d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell		     ptr3 += 3;
812d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell		  }
813d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	       }
814d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	    }
815d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	 }
816206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul         else if (osmesa->format == OSMESA_RGB_565) {
817206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul	    const GLchan r = ctx->Color.ClearColor[0];
818206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul	    const GLchan g = ctx->Color.ClearColor[1];
819206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul	    const GLchan b = ctx->Color.ClearColor[2];
820206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul            GLushort clearPixel;
821206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul            PACK_RGB_565(clearPixel, r, g, b);
822206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul            if (all) {
823206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul               /* Clear whole RGB buffer */
8244742735a5c22f2400a2777965e08e757ec384979Karl Schultz	       const GLuint n = osmesa->rowlength * osmesa->height;
825206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul               GLushort *ptr2 = (GLushort *) osmesa->buffer;
826206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul               GLuint  i;
827206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul               for (i = 0; i < n; i++) {
828206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul                  *ptr2 = clearPixel;
829206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul                  ptr2++;
830206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul               }
831206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul            }
832206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul            else {
833206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul               /* clear scissored region */
834206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul               GLint i, j;
835206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul               for (i = 0; i < height; i++) {
836206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul                  GLushort *ptr2 = (GLushort *) PIXELADDR2(x, (y + i));
837206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul                  for (j = 0; j < width; j++) {
838206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul                     *ptr2 = clearPixel;
839206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul                     ptr2++;
840206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul                  }
841206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul               }
842206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul            }
843206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul         }
844d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	 else {
84574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul#if CHAN_TYPE == GL_UNSIGNED_BYTE
846d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	    /* 4-byte pixel value */
847d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	    GLuint clearPixel;
848d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	    GLchan *clr = (GLchan *) &clearPixel;
849d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	    clr[osmesa->rInd] = ctx->Color.ClearColor[0];
850d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	    clr[osmesa->gInd] = ctx->Color.ClearColor[1];
851d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	    clr[osmesa->bInd] = ctx->Color.ClearColor[2];
852d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	    clr[osmesa->aInd] = ctx->Color.ClearColor[3];
853d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	    if (all) {
854d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	       /* Clear whole RGBA buffer */
855d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	       const GLuint n = osmesa->rowlength * osmesa->height;
856d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	       GLuint *ptr4 = (GLuint *) osmesa->buffer;
857d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	       GLuint i;
858d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	       if (clearPixel) {
859d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell		  for (i = 0; i < n; i++) {
860d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell		     *ptr4++ = clearPixel;
861d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell		  }
862d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	       }
863d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	       else {
864d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell		  BZERO(ptr4, n * sizeof(GLuint));
865d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	       }
866d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	    }
867d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	    else {
868d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	       /* Clear part of RGBA buffer */
869d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	       GLint i, j;
870d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	       for (i = 0; i < height; i++) {
871d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell		  GLuint *ptr4 = (GLuint *) PIXELADDR4(x, (y + i));
872d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell		  for (j = 0; j < width; j++) {
873d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell		     *ptr4++ = clearPixel;
874d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell		  }
875d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	       }
876d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	    }
87774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul#else
878d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	    const GLchan r = ctx->Color.ClearColor[0];
879d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	    const GLchan g = ctx->Color.ClearColor[1];
880d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	    const GLchan b = ctx->Color.ClearColor[2];
881d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	    const GLchan a = ctx->Color.ClearColor[3];
882d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	    if (all) {
883d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	       /* Clear whole RGBA buffer */
884d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	       const GLuint n = osmesa->rowlength * osmesa->height;
885d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	       GLchan *p = (GLchan *) osmesa->buffer;
886d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	       GLuint i;
887d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	       for (i = 0; i < n; i++) {
888d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell		  PACK_RGBA(p, r, g, b, a);
889d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell		  p += 4;
890d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	       }
891d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	    }
892d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	    else {
893d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	       /* Clear part of RGBA buffer */
894d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	       GLint i, j;
895d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	       for (i = 0; i < height; i++) {
896d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell		  GLchan *p = PIXELADDR4(x, (y + i));
897d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell		  for (j = 0; j < width; j++) {
898d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell		     PACK_RGBA(p, r, g, b, a);
899d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell		     p += 4;
900d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell		  }
901d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	       }
902d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	    }
90374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul
90474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul#endif
905d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	 }
906d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell	 mask &= ~DD_FRONT_LEFT_BIT;
907afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
908afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
909d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell
910d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell   if (mask)
911d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell      _swrast_Clear( ctx, mask, all, x, y, width, height );
912afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
913afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
914afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
915afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
91618a285a5e244b7405b85feb7315a30d99920ec5dBrian Paulstatic void buffer_size( GLframebuffer *buffer, GLuint *width, GLuint *height )
917afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
91823d319fc7dda3ae3639c05cd2c7a8bcdac9eac36Brian Paul   /* don't use GET_CURRENT_CONTEXT(ctx) here - it's a problem on Windows */
91923d319fc7dda3ae3639c05cd2c7a8bcdac9eac36Brian Paul   GLcontext *ctx = (GLcontext *) _glapi_get_context();
92018a285a5e244b7405b85feb7315a30d99920ec5dBrian Paul   (void) buffer;
92118a285a5e244b7405b85feb7315a30d99920ec5dBrian Paul   if (ctx) {
92218a285a5e244b7405b85feb7315a30d99920ec5dBrian Paul      OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
92318a285a5e244b7405b85feb7315a30d99920ec5dBrian Paul      *width = osmesa->width;
92418a285a5e244b7405b85feb7315a30d99920ec5dBrian Paul      *height = osmesa->height;
92518a285a5e244b7405b85feb7315a30d99920ec5dBrian Paul   }
926afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
927afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
928afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
929afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/**********************************************************************/
930afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/*****        Read/write spans/arrays of RGBA pixels              *****/
931afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/**********************************************************************/
932afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
933afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/* Write RGBA pixels to an RGBA (or permuted) buffer. */
93474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void
93574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulwrite_rgba_span( const GLcontext *ctx, GLuint n, GLint x, GLint y,
93674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul                 CONST GLchan rgba[][4], const GLubyte mask[] )
937afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
93874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   const OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
93974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   GLchan *p = PIXELADDR4(x, y);
940afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLuint i;
941afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   if (mask) {
94274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      for (i = 0; i < n; i++, p += 4) {
943afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         if (mask[i]) {
94474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul            PACK_RGBA(p, rgba[i][RCOMP], rgba[i][GCOMP],
94574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul                         rgba[i][BCOMP], rgba[i][ACOMP]);
946afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         }
947afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
948afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
949afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   else {
95074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      for (i = 0; i < n; i++, p += 4) {
95174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul         PACK_RGBA(p, rgba[i][RCOMP], rgba[i][GCOMP],
95274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul                      rgba[i][BCOMP], rgba[i][ACOMP]);
953afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
954afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
955afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
956afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
957afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
958afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/* Write RGBA pixels to an RGBA buffer.  This is the fastest span-writer. */
95974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void
96074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulwrite_rgba_span_rgba( const GLcontext *ctx, GLuint n, GLint x, GLint y,
96174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul                      CONST GLchan rgba[][4], const GLubyte mask[] )
962afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
963c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul   OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
96474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   GLuint *ptr4 = (GLuint *) PIXELADDR4(x, y);
965afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   const GLuint *rgba4 = (const GLuint *) rgba;
966afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLuint i;
96774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   ASSERT(CHAN_TYPE == GL_UNSIGNED_BYTE);
968afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   if (mask) {
96974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      for (i = 0; i < n; i++) {
970afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         if (mask[i]) {
971afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            ptr4[i] = rgba4[i];
972afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         }
973afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
974afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
975afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   else {
976afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      MEMCPY( ptr4, rgba4, n * 4 );
977afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
978afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
979afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
980afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
981afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/* Write RGB pixels to an RGBA (or permuted) buffer. */
98274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void
98374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulwrite_rgb_span( const GLcontext *ctx, GLuint n, GLint x, GLint y,
98474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul                CONST GLchan rgb[][3], const GLubyte mask[] )
985afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
98674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   const OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
98774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   GLchan *p = PIXELADDR4(x, y);
988afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLuint i;
989afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   if (mask) {
99074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      for (i = 0; i < n; i++, p+=4) {
991afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         if (mask[i]) {
99265c6ca91795a71cf38dbe5f49f2d73fd9d4049cdBrian Paul            PACK_RGBA(p, rgb[i][RCOMP], rgb[i][GCOMP], rgb[i][BCOMP], CHAN_MAX);
993afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         }
994afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
995afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
996afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   else {
99774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      for (i = 0; i < n; i++, p+=4) {
99865c6ca91795a71cf38dbe5f49f2d73fd9d4049cdBrian Paul         PACK_RGBA(p, rgb[i][RCOMP], rgb[i][GCOMP], rgb[i][BCOMP], CHAN_MAX);
999afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
1000afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
1001afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
1002afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1003afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1004afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
100574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void
100674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulwrite_monocolor_span( const GLcontext *ctx, GLuint n, GLint x, GLint y,
100774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul                      const GLchan color[4], const GLubyte mask[] )
1008afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
1009c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul   const OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
101074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   GLchan *p = PIXELADDR4(x, y);
1011afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLuint i;
101274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   for (i = 0; i < n; i++, p += 4) {
1013afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      if (mask[i]) {
101474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul         PACK_RGBA(p, color[RCOMP], color[GCOMP], color[BCOMP], color[ACOMP]);
1015afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
1016afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
1017afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
1018afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1019afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1020afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
102174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void
102274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulwrite_rgba_pixels( const GLcontext *ctx, GLuint n,
102374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul                   const GLint x[], const GLint y[],
102474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul                   CONST GLchan rgba[][4], const GLubyte mask[] )
1025afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
102674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   const OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
1027afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLuint i;
102874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   for (i = 0; i < n; i++) {
1029afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      if (mask[i]) {
103074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul         GLchan *p = PIXELADDR4(x[i], y[i]);
103174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul         PACK_RGBA(p, rgba[i][RCOMP], rgba[i][GCOMP],
103274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul                      rgba[i][BCOMP], rgba[i][ACOMP]);
1033afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
1034afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
1035afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
1036afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1037afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1038afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
103974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void
104074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulwrite_monocolor_pixels( const GLcontext *ctx, GLuint n,
104174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul                        const GLint x[], const GLint y[],
104274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul                        const GLchan color[4], const GLubyte mask[] )
1043afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
104474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   const OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
1045afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLuint i;
104674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   for (i = 0; i < n; i++) {
1047afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      if (mask[i]) {
104874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul         GLchan *p = PIXELADDR4(x[i], y[i]);
104974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul         PACK_RGBA(p, color[RCOMP], color[GCOMP], color[BCOMP], color[ACOMP]);
1050afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
1051afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
1052afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
1053afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1054afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
105574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void
105674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulread_rgba_span( const GLcontext *ctx, GLuint n, GLint x, GLint y,
105774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul                GLchan rgba[][4] )
1058afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
105974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   const OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
1060afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLuint i;
106174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   GLchan *p = PIXELADDR4(x, y);
106274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   for (i = 0; i < n; i++, p += 4) {
106374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      rgba[i][RCOMP] = UNPACK_RED(p);
106474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      rgba[i][GCOMP] = UNPACK_GREEN(p);
106574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      rgba[i][BCOMP] = UNPACK_BLUE(p);
106674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      rgba[i][ACOMP] = UNPACK_ALPHA(p);
1067afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
1068afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
1069afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1070afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1071afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/* Read RGBA pixels from an RGBA buffer */
107274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void
107374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulread_rgba_span_rgba( const GLcontext *ctx, GLuint n, GLint x, GLint y,
107474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul                     GLchan rgba[][4] )
1075afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
1076c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul   OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
107774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   GLuint *ptr4 = (GLuint *) PIXELADDR4(x, y);
10789499e017b7e05411a32b3e4fa94885eaec0d7277Brian Paul   MEMCPY( rgba, ptr4, n * 4 * sizeof(GLchan) );
1079afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
1080afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1081afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
108274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void
108374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulread_rgba_pixels( const GLcontext *ctx,
108474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul                  GLuint n, const GLint x[], const GLint y[],
108574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul                  GLchan rgba[][4], const GLubyte mask[] )
1086afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
108774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   const OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
1088afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLuint i;
108974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   for (i = 0; i < n; i++) {
1090afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      if (mask[i]) {
109174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul         const GLchan *p = PIXELADDR4(x[i], y[i]);
109274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul         rgba[i][RCOMP] = UNPACK_RED(p);
109374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul         rgba[i][GCOMP] = UNPACK_GREEN(p);
109474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul         rgba[i][BCOMP] = UNPACK_BLUE(p);
109574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul         rgba[i][ACOMP] = UNPACK_ALPHA(p);
1096afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
1097afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
1098afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
1099afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1100afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/**********************************************************************/
1101afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/*****                3 byte RGB pixel support funcs              *****/
1102afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/**********************************************************************/
1103afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
110474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul/* Write RGBA pixels to an RGB buffer. */
110574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void
110674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulwrite_rgba_span_RGB( const GLcontext *ctx, GLuint n, GLint x, GLint y,
110774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul                     CONST GLchan rgba[][4], const GLubyte mask[] )
1108afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
110974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   const OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
111074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   GLchan *p = PIXELADDR3(x, y);
1111afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLuint i;
1112afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   if (mask) {
111374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      for (i = 0; i < n; i++, p += 3) {
1114afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         if (mask[i]) {
111574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul            PACK_RGB(p, rgba[i][RCOMP], rgba[i][GCOMP], rgba[i][BCOMP]);
1116afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         }
1117afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
1118afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
1119afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   else {
112074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      for (i = 0; i < n; i++, p += 3) {
112174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul         PACK_RGB(p, rgba[i][RCOMP], rgba[i][GCOMP], rgba[i][BCOMP]);
1122afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
1123afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
1124afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
1125afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
112674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul/* Write RGBA pixels to an BGR buffer. */
112774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void
112874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulwrite_rgba_span_BGR( const GLcontext *ctx, GLuint n, GLint x, GLint y,
112974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul                     CONST GLchan rgba[][4], const GLubyte mask[] )
1130afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
1131c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul   const OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
113274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   GLchan *p = PIXELADDR3(x, y);
1133afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLuint i;
1134afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   if (mask) {
113574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      for (i = 0; i < n; i++, p += 3) {
1136afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         if (mask[i]) {
113774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul            PACK_BGR(p, rgba[i][RCOMP], rgba[i][GCOMP], rgba[i][BCOMP]);
1138afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         }
1139afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
1140afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
1141afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   else {
114274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      for (i = 0; i < n; i++, p += 3) {
114374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul         PACK_BGR(p, rgba[i][RCOMP], rgba[i][GCOMP], rgba[i][BCOMP]);
1144afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
1145afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
1146afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
1147afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
114874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul/* Write RGB pixels to an RGB buffer. */
114974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void
115074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulwrite_rgb_span_RGB( const GLcontext *ctx, GLuint n, GLint x, GLint y,
115174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul                    CONST GLchan rgb[][3], const GLubyte mask[] )
115274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul{
115374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   const OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
115474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   GLchan *p = PIXELADDR3(x, y);
115574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   GLuint i;
115674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   if (mask) {
115774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      for (i = 0; i < n; i++, p += 3) {
115874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul         if (mask[i]) {
115974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul            PACK_RGB(p, rgb[i][RCOMP], rgb[i][GCOMP], rgb[i][BCOMP]);
116074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul         }
116174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      }
116274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   }
116374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   else {
116474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      for (i = 0; i < n; i++, p += 3) {
116574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul         PACK_RGB(p, rgb[i][RCOMP], rgb[i][GCOMP], rgb[i][BCOMP]);
116674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      }
116774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   }
116874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul}
1169afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
117074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul/* Write RGB pixels to an BGR buffer. */
117174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void
117274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulwrite_rgb_span_BGR( const GLcontext *ctx, GLuint n, GLint x, GLint y,
117374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul                    CONST GLchan rgb[][3], const GLubyte mask[] )
1174afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
1175c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul   const OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
117674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   GLchan *p = PIXELADDR3(x, y);
1177afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLuint i;
117874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   if (mask) {
117974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      for (i = 0; i < n; i++, p += 3) {
118074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul         if (mask[i]) {
118174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul            PACK_BGR(p, rgb[i][RCOMP], rgb[i][GCOMP], rgb[i][BCOMP]);
118274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul         }
118374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      }
118474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   }
118574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   else {
118674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      for (i = 0; i < n; i++, p += 3) {
118774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul         PACK_BGR(p, rgb[i][RCOMP], rgb[i][GCOMP], rgb[i][BCOMP]);
118874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      }
118974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   }
119074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul}
119174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul
119274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul
119374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void
119474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulwrite_monocolor_span_RGB( const GLcontext *ctx, GLuint n, GLint x, GLint y,
119574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul                          const GLchan color[4], const GLubyte mask[] )
119674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul{
119774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   const OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
119874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   GLchan *p = PIXELADDR3(x, y);
119974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   GLuint i;
120074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   for (i = 0; i < n; i++, p += 3) {
120174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      if (mask[i]) {
120274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul         PACK_RGB(p, color[RCOMP], color[GCOMP], color[BCOMP]);
120374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      }
120474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   }
120574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul}
120674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul
120774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void
120874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulwrite_monocolor_span_BGR( const GLcontext *ctx, GLuint n, GLint x, GLint y,
120974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul                          const GLchan color[4], const GLubyte mask[] )
121074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul{
121174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   const OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
121274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   GLchan *p = PIXELADDR3(x, y);
121374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   GLuint i;
121474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   for (i = 0; i < n; i++, p += 3) {
1215afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      if (mask[i]) {
121674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul         PACK_BGR(p, color[RCOMP], color[GCOMP], color[BCOMP]);
1217afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
1218afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
1219afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
1220afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
122174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void
122274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulwrite_rgba_pixels_RGB( const GLcontext *ctx, GLuint n,
122374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul                       const GLint x[], const GLint y[],
122474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul                       CONST GLchan rgba[][4], const GLubyte mask[] )
1225afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
1226c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul   const OSMesaContext osmesa = (const OSMesaContext) ctx;
1227afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLuint i;
122874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   for (i = 0; i < n; i++) {
122974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      if (mask[i]) {
123074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul         GLchan *p = PIXELADDR3(x[i], y[i]);
123174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul         PACK_RGB(p, rgba[i][RCOMP], rgba[i][GCOMP], rgba[i][BCOMP]);
123274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      }
123374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   }
123474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul}
123574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul
123674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void
123774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulwrite_rgba_pixels_BGR( const GLcontext *ctx, GLuint n,
123874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul                       const GLint x[], const GLint y[],
123974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul                       CONST GLchan rgba[][4], const GLubyte mask[] )
124074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul{
124174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   const OSMesaContext osmesa = (const OSMesaContext) ctx;
124274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   GLuint i;
124374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   for (i = 0; i < n; i++) {
1244afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      if (mask[i]) {
124574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul         GLchan *p = PIXELADDR3(x[i], y[i]);
124674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul         PACK_BGR(p, rgba[i][RCOMP], rgba[i][GCOMP], rgba[i][BCOMP]);
1247afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
1248afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
1249afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
1250afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
125174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void
125274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulwrite_monocolor_pixels_RGB( const GLcontext *ctx,
125374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul                            GLuint n, const GLint x[], const GLint y[],
125474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul                            const GLchan color[4], const GLubyte mask[] )
1255afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
1256c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul   const OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
1257afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLuint i;
125874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   for (i = 0; i < n; i++) {
1259afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      if (mask[i]) {
126074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul         GLchan *p = PIXELADDR3(x[i], y[i]);
126174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul         PACK_RGB(p, color[RCOMP], color[GCOMP], color[BCOMP]);
1262afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
1263afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
1264afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
1265afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
126674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void
126774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulwrite_monocolor_pixels_BGR( const GLcontext *ctx,
126874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul                            GLuint n, const GLint x[], const GLint y[],
126974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul                            const GLchan color[4], const GLubyte mask[] )
1270afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
127174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   const OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
127274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   GLuint i;
127374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   for (i = 0; i < n; i++) {
127474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      if (mask[i]) {
127574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul         GLchan *p = PIXELADDR3(x[i], y[i]);
127674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul         PACK_BGR(p, color[RCOMP], color[GCOMP], color[BCOMP]);
127774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      }
127874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   }
127974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul}
128074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul
128174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void
128274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulread_rgba_span3( const GLcontext *ctx, GLuint n, GLint x, GLint y,
128374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul                 GLchan rgba[][4] )
128474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul{
128574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   const OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
1286afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLuint i;
128774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   const GLchan *p = PIXELADDR3(x, y);
128874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   for (i = 0; i < n; i++, p += 3) {
128974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      rgba[i][RCOMP] = UNPACK_RED(p);
129074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      rgba[i][GCOMP] = UNPACK_GREEN(p);
129174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      rgba[i][BCOMP] = UNPACK_BLUE(p);
129265c6ca91795a71cf38dbe5f49f2d73fd9d4049cdBrian Paul      rgba[i][ACOMP] = CHAN_MAX;
1293afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
1294afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
1295afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
129674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void
129774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulread_rgba_pixels3( const GLcontext *ctx,
129874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul                   GLuint n, const GLint x[], const GLint y[],
129974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul                   GLchan rgba[][4], const GLubyte mask[] )
1300afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
130174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   const OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
1302afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLuint i;
130374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   for (i = 0; i < n; i++) {
1304afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      if (mask[i]) {
130574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul         const GLchan *p = PIXELADDR3(x[i], y[i]);
130674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul         rgba[i][RCOMP] = UNPACK_RED(p);
130774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul         rgba[i][GCOMP] = UNPACK_GREEN(p);
130874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul         rgba[i][BCOMP] = UNPACK_BLUE(p);
130965c6ca91795a71cf38dbe5f49f2d73fd9d4049cdBrian Paul         rgba[i][ACOMP] = CHAN_MAX;
1310afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
1311afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
1312afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
1313afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1314afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1315afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/**********************************************************************/
1316206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul/*****                2 byte RGB pixel support funcs              *****/
1317206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul/**********************************************************************/
1318206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul
1319206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul/* Write RGBA pixels to an RGB_565 buffer. */
1320206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paulstatic void
1321206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paulwrite_rgba_span2( const GLcontext *ctx,
1322206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul                  GLuint n, GLint x, GLint y,
1323f431a3fb4dc1bf860203d79e54657e3a62bc50dfBrian Paul                  CONST GLchan rgba[][4], const GLubyte mask[] )
1324206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul{
1325206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul   OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
1326206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul   GLushort *ptr2 = (GLushort *) PIXELADDR2(x, y);
1327206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul   GLuint i;
1328206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul   if (mask) {
1329206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul      for (i = 0; i < n; i++, ptr2++) {
1330206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul         if (mask[i]) {
1331206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul            PACK_RGB_565(*ptr2, rgba[i][RCOMP], rgba[i][GCOMP], rgba[i][BCOMP]);
1332206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul         }
1333206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul      }
1334206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul   }
1335206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul   else {
1336206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul      for (i = 0; i < n; i++, ptr2++) {
1337206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul         PACK_RGB_565(*ptr2, rgba[i][RCOMP], rgba[i][GCOMP], rgba[i][BCOMP]);
1338206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul      }
1339206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul   }
1340206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul}
1341206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul
1342206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul
1343206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul/* Write RGB pixels to an RGB_565 buffer. */
1344206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paulstatic void
1345206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paulwrite_rgb_span2( const GLcontext *ctx,
1346206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul                 GLuint n, GLint x, GLint y,
1347f431a3fb4dc1bf860203d79e54657e3a62bc50dfBrian Paul                 CONST GLchan rgb[][3], const GLubyte mask[] )
1348206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul{
1349206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul   OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
1350206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul   GLushort *ptr2 = (GLushort *) PIXELADDR2(x, y);
1351206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul   GLuint i;
1352206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul   if (mask) {
1353206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul      for (i = 0; i < n; i++, ptr2++) {
1354206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul         if (mask[i]) {
1355206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul            PACK_RGB_565(*ptr2, rgb[i][RCOMP], rgb[i][GCOMP], rgb[i][BCOMP]);
1356206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul         }
1357206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul      }
1358206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul   }
1359206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul   else {
1360206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul      for (i = 0; i < n; i++, ptr2++) {
1361206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul         PACK_RGB_565(*ptr2, rgb[i][RCOMP], rgb[i][GCOMP], rgb[i][BCOMP]);
1362206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul      }
1363206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul   }
1364206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul}
1365206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul
1366206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul
1367206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paulstatic void
1368206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paulwrite_monocolor_span2( const GLcontext *ctx, GLuint n, GLint x, GLint y,
1369206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul                       const GLchan color[4], const GLubyte mask[] )
1370206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul{
1371206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul   OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
1372206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul   GLushort pixel;
1373206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul   GLushort *ptr2 = (GLushort *) PIXELADDR2(x, y);
1374206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul   GLuint i;
1375206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul   PACK_RGB_565(pixel, color[RCOMP], color[GCOMP], color[BCOMP]);
1376206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul   for (i = 0; i < n; i++, ptr2++) {
1377206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul      if (mask[i]) {
1378206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul         *ptr2 = pixel;
1379206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul      }
1380206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul   }
1381206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul}
1382206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul
1383206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul
1384206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paulstatic void
1385206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paulwrite_rgba_pixels2( const GLcontext *ctx,
1386206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul                    GLuint n, const GLint x[], const GLint y[],
1387f431a3fb4dc1bf860203d79e54657e3a62bc50dfBrian Paul                    CONST GLchan rgba[][4], const GLubyte mask[] )
1388206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul{
1389206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul   OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
1390206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul   GLuint i;
1391206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul   for (i = 0; i < n; i++) {
1392206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul      if (mask[i]) {
1393206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul         GLushort *ptr2 = (GLushort *) PIXELADDR2(x[i],y[i]);
1394206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul         PACK_RGB_565(*ptr2, rgba[i][RCOMP], rgba[i][GCOMP], rgba[i][BCOMP]);
1395206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul      }
1396206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul   }
1397206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul}
1398206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul
1399206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paulstatic void
1400206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paulwrite_monocolor_pixels2( const GLcontext *ctx,
1401206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul                         GLuint n, const GLint x[], const GLint y[],
1402206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul                         const GLchan color[4], const GLubyte mask[] )
1403206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul{
1404206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul   OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
1405206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul   GLuint i;
1406206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul   GLushort pixel;
1407206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul   PACK_RGB_565(pixel, color[RCOMP], color[GCOMP], color[BCOMP]);
1408206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul   for (i = 0; i < n; i++) {
1409206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul      if (mask[i]) {
1410206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul         GLushort *ptr2 = (GLushort *) PIXELADDR2(x[i],y[i]);
1411206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul         *ptr2 = pixel;
1412206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul      }
1413206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul   }
1414206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul}
1415206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul
1416206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paulstatic void
1417206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paulread_rgba_span2( const GLcontext *ctx,
1418206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul                 GLuint n, GLint x, GLint y,
1419f431a3fb4dc1bf860203d79e54657e3a62bc50dfBrian Paul                 GLchan rgba[][4] )
1420206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul{
1421206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul   OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
1422206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul   GLuint i;
1423206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul   const GLushort *ptr2 = (const GLushort *) PIXELADDR2(x, y);
1424206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul   for (i = 0; i < n; i++, ptr2++) {
1425206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul      /* This should be fixed to get the low bits right */
1426206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul      rgba[i][RCOMP] = (*ptr2 >> 8) & 0xFe;
1427206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul      rgba[i][GCOMP] = (*ptr2 >> 3) & 0xFc;
1428206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul      rgba[i][BCOMP] = (*ptr2 << 3) & 0xFe;
1429206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul      rgba[i][ACOMP] = 0;
1430206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul   }
1431206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul}
1432206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul
1433206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paulstatic void
1434206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paulread_rgba_pixels2( const GLcontext *ctx,
1435206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul                   GLuint n, const GLint x[], const GLint y[],
1436f431a3fb4dc1bf860203d79e54657e3a62bc50dfBrian Paul                   GLchan rgba[][4], const GLubyte mask[] )
1437206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul{
1438206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul   OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
1439206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul   GLuint i;
1440206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul   for (i = 0; i < n; i++) {
1441206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul      if (mask[i]) {
1442206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul         /* This should be fixed to get the low bits right */
1443206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul         const GLushort *ptr2 = (const GLushort *) PIXELADDR2(x[i],y[i]);
1444206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul         rgba[i][RCOMP] = (*ptr2 >> 8) & 0xFE;
1445206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul         rgba[i][GCOMP] = (*ptr2 >> 3) & 0xFC;
1446206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul         rgba[i][BCOMP] = (*ptr2 << 3) & 0xFE;
1447206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul         rgba[i][ACOMP] = 0;
1448206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul      }
1449206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul   }
1450206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul}
1451206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul
1452206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul
1453206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul
1454206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul/**********************************************************************/
1455afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/*****        Read/write spans/arrays of CI pixels                *****/
1456afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/**********************************************************************/
1457afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1458afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/* Write 32-bit color index to buffer */
145974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void
146074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulwrite_index32_span( const GLcontext *ctx, GLuint n, GLint x, GLint y,
146174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul                    const GLuint index[], const GLubyte mask[] )
1462afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
146374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   const OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
146474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   GLchan *ptr1 = PIXELADDR1(x, y);
1465afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLuint i;
1466afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   if (mask) {
1467afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      for (i=0;i<n;i++,ptr1++) {
1468afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         if (mask[i]) {
146974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul            *ptr1 = (GLchan) index[i];
1470afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         }
1471afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
1472afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
1473afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   else {
1474afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      for (i=0;i<n;i++,ptr1++) {
147574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul         *ptr1 = (GLchan) index[i];
1476afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
1477afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
1478afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
1479afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1480afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1481afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/* Write 8-bit color index to buffer */
148274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void
148374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulwrite_index8_span( const GLcontext *ctx, GLuint n, GLint x, GLint y,
148474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul                   const GLubyte index[], const GLubyte mask[] )
1485afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
148674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   const OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
148774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   GLchan *ptr1 = PIXELADDR1(x, y);
1488afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLuint i;
1489afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   if (mask) {
1490afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      for (i=0;i<n;i++,ptr1++) {
1491afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         if (mask[i]) {
149274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul            *ptr1 = (GLchan) index[i];
1493afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         }
1494afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
1495afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
1496afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   else {
149774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      MEMCPY(ptr1, index, n * sizeof(GLchan));
1498afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
1499afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
1500afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1501afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
150274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void
150374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulwrite_monoindex_span( const GLcontext *ctx, GLuint n, GLint x, GLint y,
150474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul                      GLuint colorIndex, const GLubyte mask[] )
1505afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
150674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   const OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
150774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   GLchan *ptr1 = PIXELADDR1(x, y);
1508afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLuint i;
1509afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   for (i=0;i<n;i++,ptr1++) {
1510afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      if (mask[i]) {
151174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul         *ptr1 = (GLchan) colorIndex;
1512afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
1513afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
1514afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
1515afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1516afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
151774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void
151874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulwrite_index_pixels( const GLcontext *ctx,
151974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul                    GLuint n, const GLint x[], const GLint y[],
152074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul                    const GLuint index[], const GLubyte mask[] )
1521afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
152274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   const OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
1523afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLuint i;
1524afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   for (i=0;i<n;i++) {
1525afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      if (mask[i]) {
152674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul         GLchan *ptr1 = PIXELADDR1(x[i], y[i]);
152774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul         *ptr1 = (GLchan) index[i];
1528afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
1529afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
1530afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
1531afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1532afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
153374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void
153474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulwrite_monoindex_pixels( const GLcontext *ctx,
153574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul                        GLuint n, const GLint x[], const GLint y[],
153674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul                        GLuint colorIndex, const GLubyte mask[] )
1537afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
153874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   const OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
1539afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLuint i;
1540afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   for (i=0;i<n;i++) {
1541afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      if (mask[i]) {
154274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul         GLchan *ptr1 = PIXELADDR1(x[i], y[i]);
154374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul         *ptr1 = (GLchan) colorIndex;
1544afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
1545afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
1546afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
1547afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1548afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
154974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void
155074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulread_index_span( const GLcontext *ctx,
155174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul                 GLuint n, GLint x, GLint y, GLuint index[] )
1552afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
155374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   const OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
1554afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLuint i;
155574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   const GLchan *ptr1 = (const GLchan *) PIXELADDR1(x, y);
1556afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   for (i=0;i<n;i++,ptr1++) {
1557afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      index[i] = (GLuint) *ptr1;
1558afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
1559afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
1560afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1561afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
156274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void
156374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulread_index_pixels( const GLcontext *ctx,
156474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul                   GLuint n, const GLint x[], const GLint y[],
156574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul                   GLuint index[], const GLubyte mask[] )
1566afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
156774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   const OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
1568afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLuint i;
1569afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   for (i=0;i<n;i++) {
1570afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      if (mask[i] ) {
157174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul         const GLchan *ptr1 = PIXELADDR1(x[i], y[i]);
1572afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         index[i] = (GLuint) *ptr1;
1573afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
1574afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
1575afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
1576afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1577afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1578afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1579afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/**********************************************************************/
1580afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/*****                   Optimized line rendering                 *****/
1581afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/**********************************************************************/
1582afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1583afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1584afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/*
1585afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Draw a flat-shaded, RGB line into an osmesa buffer.
1586afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */
158774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void
158874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulflat_rgba_line( GLcontext *ctx, const SWvertex *vert0, const SWvertex *vert1 )
1589afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
159074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   const OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
159131c40f0905331ca51d705f8a072a9d239d692966Keith Whitwell   const GLchan *color = vert1->color;
1592afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1593afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#define INTERP_XY 1
1594afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#define CLIP_HACK 1
159574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul#define PLOT(X, Y)						\
159674b493a5e61237de081a438e774e5d8139d4c6b7Brian Pauldo {								\
159774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   GLchan *p = PIXELADDR4(X, Y);				\
159874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   PACK_RGBA(p, color[0], color[1], color[2], color[3]);	\
159974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul} while (0)
1600afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1601afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#ifdef WIN32
1602724abeb058ca9372c5a9b9e38ee43dde1accaa41Keith Whitwell#include "..\swrast\s_linetemp.h"
1603afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#else
1604724abeb058ca9372c5a9b9e38ee43dde1accaa41Keith Whitwell#include "swrast/s_linetemp.h"
1605afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#endif
1606afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
1607afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1608afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1609afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/*
1610afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Draw a flat-shaded, Z-less, RGB line into an osmesa buffer.
1611afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */
161274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void
161374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulflat_rgba_z_line(GLcontext *ctx, const SWvertex *vert0, const SWvertex *vert1)
1614afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
161574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   const OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
161631c40f0905331ca51d705f8a072a9d239d692966Keith Whitwell   const GLchan *color = vert1->color;
1617afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1618afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#define INTERP_XY 1
1619afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#define INTERP_Z 1
1620ed30dfa1264ec8875a3162c3c8778bc703bf11d5Brian Paul#define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE
1621afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#define CLIP_HACK 1
162274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul#define PLOT(X, Y)					\
162374b493a5e61237de081a438e774e5d8139d4c6b7Brian Pauldo {							\
162474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   if (Z < *zPtr) {					\
162574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      GLchan *p = PIXELADDR4(X, Y);			\
162674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      PACK_RGBA(p, color[RCOMP], color[GCOMP],		\
162774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul                   color[BCOMP], color[ACOMP]);		\
162874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      *zPtr = Z;					\
162974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   }							\
163074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul} while (0)
163174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul
1632afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1633afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#ifdef WIN32
1634724abeb058ca9372c5a9b9e38ee43dde1accaa41Keith Whitwell#include "..\swrast\s_linetemp.h"
1635afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#else
1636724abeb058ca9372c5a9b9e38ee43dde1accaa41Keith Whitwell#include "swrast/s_linetemp.h"
1637afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#endif
1638afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
1639afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1640afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1641afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/*
1642afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Draw a flat-shaded, alpha-blended, RGB line into an osmesa buffer.
164374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul * XXX update for GLchan
1644afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */
164574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void
164674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulflat_blend_rgba_line( GLcontext *ctx,
164774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul                      const SWvertex *vert0, const SWvertex *vert1 )
1648afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
164974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   const OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
165074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   const GLint rshift = osmesa->rshift;
165174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   const GLint gshift = osmesa->gshift;
165274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   const GLint bshift = osmesa->bshift;
165374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   const GLint avalue = vert0->color[3];
165465c6ca91795a71cf38dbe5f49f2d73fd9d4049cdBrian Paul   const GLint msavalue = CHAN_MAX - avalue;
165531c40f0905331ca51d705f8a072a9d239d692966Keith Whitwell   const GLint rvalue = vert1->color[0]*avalue;
165631c40f0905331ca51d705f8a072a9d239d692966Keith Whitwell   const GLint gvalue = vert1->color[1]*avalue;
165731c40f0905331ca51d705f8a072a9d239d692966Keith Whitwell   const GLint bvalue = vert1->color[2]*avalue;
1658afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1659afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#define INTERP_XY 1
1660afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#define CLIP_HACK 1
1661afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#define PLOT(X,Y)					\
166265c6ca91795a71cf38dbe5f49f2d73fd9d4049cdBrian Paul   { GLuint *ptr4 = (GLuint *) PIXELADDR4(X, Y);	\
16637e67fb41fb54e050f6983b4de09ed3a317d6148fBrian Paul     GLuint  pixel = 0;					\
1664afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg     pixel |=((((((*ptr4) >> rshift) & 0xff)*msavalue+rvalue)>>8) << rshift);\
1665afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg     pixel |=((((((*ptr4) >> gshift) & 0xff)*msavalue+gvalue)>>8) << gshift);\
1666afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg     pixel |=((((((*ptr4) >> bshift) & 0xff)*msavalue+bvalue)>>8) << bshift);\
16677e67fb41fb54e050f6983b4de09ed3a317d6148fBrian Paul     *ptr4 = pixel;					\
1668afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
1669afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
16702427575c21c7c04b52f4a3605ad87c142c01f840Brian Paul#if 0  /* XXX use this in the future */
16712427575c21c7c04b52f4a3605ad87c142c01f840Brian Paul#define PLOT(X,Y)							\
16722427575c21c7c04b52f4a3605ad87c142c01f840Brian Paul   {									\
16732427575c21c7c04b52f4a3605ad87c142c01f840Brian Paul      GLchan *pixel = (GLchan *) PIXELADDR4(X, Y);			\
16742427575c21c7c04b52f4a3605ad87c142c01f840Brian Paul      pixel[rInd] = (pixel[rInd] * msavalue + rvalue) >> CHAN_BITS;	\
16752427575c21c7c04b52f4a3605ad87c142c01f840Brian Paul      pixel[gInd] = (pixel[gInd] * msavalue + gvalue) >> CHAN_BITS;	\
16762427575c21c7c04b52f4a3605ad87c142c01f840Brian Paul      pixel[bInd] = (pixel[bInd] * msavalue + bvalue) >> CHAN_BITS;	\
16772427575c21c7c04b52f4a3605ad87c142c01f840Brian Paul      pixel[aInd] = (pixel[aInd] * msavalue + avalue) >> CHAN_BITS;	\
16782427575c21c7c04b52f4a3605ad87c142c01f840Brian Paul   }
16792427575c21c7c04b52f4a3605ad87c142c01f840Brian Paul#endif
16802427575c21c7c04b52f4a3605ad87c142c01f840Brian Paul
1681afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#ifdef WIN32
1682724abeb058ca9372c5a9b9e38ee43dde1accaa41Keith Whitwell#include "..\swrast\s_linetemp.h"
1683afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#else
1684724abeb058ca9372c5a9b9e38ee43dde1accaa41Keith Whitwell#include "swrast/s_linetemp.h"
1685afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#endif
1686afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
1687afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1688ed30dfa1264ec8875a3162c3c8778bc703bf11d5Brian Paul
1689afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/*
1690afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Draw a flat-shaded, Z-less, alpha-blended, RGB line into an osmesa buffer.
16912427575c21c7c04b52f4a3605ad87c142c01f840Brian Paul * But don't write to Z buffer.
169274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul * XXX update for GLchan
1693afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */
169474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void
169574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulflat_blend_rgba_z_line( GLcontext *ctx,
169674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul                        const SWvertex *vert0, const SWvertex *vert1 )
1697afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
169874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   const OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
169974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   const GLint rshift = osmesa->rshift;
170074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   const GLint gshift = osmesa->gshift;
170174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   const GLint bshift = osmesa->bshift;
170274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   const GLint avalue = vert0->color[3];
170374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   const GLint msavalue = 256 - avalue;
170431c40f0905331ca51d705f8a072a9d239d692966Keith Whitwell   const GLint rvalue = vert1->color[0]*avalue;
170531c40f0905331ca51d705f8a072a9d239d692966Keith Whitwell   const GLint gvalue = vert1->color[1]*avalue;
170631c40f0905331ca51d705f8a072a9d239d692966Keith Whitwell   const GLint bvalue = vert1->color[2]*avalue;
1707afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1708afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#define INTERP_XY 1
1709afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#define INTERP_Z 1
1710ed30dfa1264ec8875a3162c3c8778bc703bf11d5Brian Paul#define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE
1711afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#define CLIP_HACK 1
17127e67fb41fb54e050f6983b4de09ed3a317d6148fBrian Paul#define PLOT(X,Y)							\
17137e67fb41fb54e050f6983b4de09ed3a317d6148fBrian Paul	if (Z < *zPtr) {						\
171474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul	   GLuint *ptr4 = (GLuint *) PIXELADDR4(X, Y);			\
17157e67fb41fb54e050f6983b4de09ed3a317d6148fBrian Paul	   GLuint  pixel = 0;						\
1716ed30dfa1264ec8875a3162c3c8778bc703bf11d5Brian Paul	   pixel |=((((((*ptr4) >> rshift) & 0xff)*msavalue+rvalue)>>8) << rshift);	\
1717ed30dfa1264ec8875a3162c3c8778bc703bf11d5Brian Paul	   pixel |=((((((*ptr4) >> gshift) & 0xff)*msavalue+gvalue)>>8) << gshift);	\
1718ed30dfa1264ec8875a3162c3c8778bc703bf11d5Brian Paul	   pixel |=((((((*ptr4) >> bshift) & 0xff)*msavalue+bvalue)>>8) << bshift);	\
17197e67fb41fb54e050f6983b4de09ed3a317d6148fBrian Paul	   *ptr4 = pixel; 						\
1720afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	}
1721afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
17222427575c21c7c04b52f4a3605ad87c142c01f840Brian Paul#if 0  /* XXX use this in the future */
17232427575c21c7c04b52f4a3605ad87c142c01f840Brian Paul#define PLOT(X,Y)							\
17242427575c21c7c04b52f4a3605ad87c142c01f840Brian Paul   if (Z < *zPtr) {							\
17252427575c21c7c04b52f4a3605ad87c142c01f840Brian Paul      GLchan *pixel = (GLchan *) PIXELADDR4(X, Y);			\
17262427575c21c7c04b52f4a3605ad87c142c01f840Brian Paul      pixel[rInd] = (pixel[rInd] * msavalue + rvalue) >> CHAN_BITS;	\
17272427575c21c7c04b52f4a3605ad87c142c01f840Brian Paul      pixel[gInd] = (pixel[gInd] * msavalue + gvalue) >> CHAN_BITS;	\
17282427575c21c7c04b52f4a3605ad87c142c01f840Brian Paul      pixel[bInd] = (pixel[bInd] * msavalue + bvalue) >> CHAN_BITS;	\
17292427575c21c7c04b52f4a3605ad87c142c01f840Brian Paul      pixel[aInd] = (pixel[aInd] * msavalue + avalue) >> CHAN_BITS;	\
17302427575c21c7c04b52f4a3605ad87c142c01f840Brian Paul   }
17312427575c21c7c04b52f4a3605ad87c142c01f840Brian Paul#endif
17322427575c21c7c04b52f4a3605ad87c142c01f840Brian Paul
1733afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#ifdef WIN32
1734724abeb058ca9372c5a9b9e38ee43dde1accaa41Keith Whitwell#include "..\swrast\s_linetemp.h"
1735afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#else
1736724abeb058ca9372c5a9b9e38ee43dde1accaa41Keith Whitwell#include "swrast/s_linetemp.h"
1737afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#endif
1738afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
1739afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1740ed30dfa1264ec8875a3162c3c8778bc703bf11d5Brian Paul
1741afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/*
1742afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Draw a flat-shaded, Z-less, alpha-blended, RGB line into an osmesa buffer.
174374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul * XXX update for GLchan
1744afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */
174574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void
174674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulflat_blend_rgba_z_line_write( GLcontext *ctx,
174774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul                              const SWvertex *vert0, const SWvertex *vert1 )
1748afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
174974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   const OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
175074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   const GLint rshift = osmesa->rshift;
175174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   const GLint gshift = osmesa->gshift;
175274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   const GLint bshift = osmesa->bshift;
175374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   const GLint avalue = vert0->color[3];
175474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   const GLint msavalue = 256 - avalue;
175531c40f0905331ca51d705f8a072a9d239d692966Keith Whitwell   const GLint rvalue = vert1->color[0]*avalue;
175631c40f0905331ca51d705f8a072a9d239d692966Keith Whitwell   const GLint gvalue = vert1->color[1]*avalue;
175731c40f0905331ca51d705f8a072a9d239d692966Keith Whitwell   const GLint bvalue = vert1->color[2]*avalue;
1758afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1759afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#define INTERP_XY 1
1760afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#define INTERP_Z 1
1761ed30dfa1264ec8875a3162c3c8778bc703bf11d5Brian Paul#define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE
1762afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#define CLIP_HACK 1
17637e67fb41fb54e050f6983b4de09ed3a317d6148fBrian Paul#define PLOT(X,Y)							\
17647e67fb41fb54e050f6983b4de09ed3a317d6148fBrian Paul	if (Z < *zPtr) {						\
176574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul	   GLuint *ptr4 = (GLuint *) PIXELADDR4(X, Y);			\
17667e67fb41fb54e050f6983b4de09ed3a317d6148fBrian Paul	   GLuint  pixel = 0;						\
1767ed30dfa1264ec8875a3162c3c8778bc703bf11d5Brian Paul	   pixel |=((((((*ptr4) >> rshift) & 0xff)*msavalue+rvalue)>>8) << rshift);	\
1768ed30dfa1264ec8875a3162c3c8778bc703bf11d5Brian Paul	   pixel |=((((((*ptr4) >> gshift) & 0xff)*msavalue+gvalue)>>8) << gshift);	\
1769ed30dfa1264ec8875a3162c3c8778bc703bf11d5Brian Paul	   pixel |=((((((*ptr4) >> bshift) & 0xff)*msavalue+bvalue)>>8) << bshift);	\
17707e67fb41fb54e050f6983b4de09ed3a317d6148fBrian Paul	   *ptr4 = pixel;						\
17717e67fb41fb54e050f6983b4de09ed3a317d6148fBrian Paul	   *zPtr = Z;							\
1772afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	}
1773afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
17742427575c21c7c04b52f4a3605ad87c142c01f840Brian Paul#if 0  /* XXX use this in the future */
17752427575c21c7c04b52f4a3605ad87c142c01f840Brian Paul#define PLOT(X,Y)							\
17762427575c21c7c04b52f4a3605ad87c142c01f840Brian Paul   if (Z < *zPtr) {							\
17772427575c21c7c04b52f4a3605ad87c142c01f840Brian Paul      GLchan *pixel = (GLchan *) PIXELADDR4(X, Y);			\
17782427575c21c7c04b52f4a3605ad87c142c01f840Brian Paul      pixel[rInd] = (pixel[rInd] * msavalue + rvalue) >> CHAN_BITS;	\
17792427575c21c7c04b52f4a3605ad87c142c01f840Brian Paul      pixel[gInd] = (pixel[gInd] * msavalue + gvalue) >> CHAN_BITS;	\
17802427575c21c7c04b52f4a3605ad87c142c01f840Brian Paul      pixel[bInd] = (pixel[bInd] * msavalue + bvalue) >> CHAN_BITS;	\
17812427575c21c7c04b52f4a3605ad87c142c01f840Brian Paul      pixel[aInd] = (pixel[aInd] * msavalue + avalue) >> CHAN_BITS;	\
17822427575c21c7c04b52f4a3605ad87c142c01f840Brian Paul      *zPtr = Z;							\
17832427575c21c7c04b52f4a3605ad87c142c01f840Brian Paul   }
17842427575c21c7c04b52f4a3605ad87c142c01f840Brian Paul#endif
17852427575c21c7c04b52f4a3605ad87c142c01f840Brian Paul
1786afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#ifdef WIN32
1787724abeb058ca9372c5a9b9e38ee43dde1accaa41Keith Whitwell#include "..\swrast\s_linetemp.h"
1788afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#else
1789724abeb058ca9372c5a9b9e38ee43dde1accaa41Keith Whitwell#include "swrast/s_linetemp.h"
1790afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#endif
1791afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
1792afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1793afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1794afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/*
1795afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Analyze context state to see if we can provide a fast line drawing
1796afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * function, like those in lines.c.  Otherwise, return NULL.
1797afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */
1798dbd1e2b5990a3689bf718296c57c14fc3ba38db5Jouk Jansenstatic swrast_line_func
17991e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwellosmesa_choose_line_function( GLcontext *ctx )
1800afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
180174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   const OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
180274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   const SWcontext *swrast = SWRAST_CONTEXT(ctx);
1803afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
180474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   if (CHAN_BITS != 8)                    return NULL;
18052d595d70202bad560c27ea81ec71b740415b3355Brian Paul   if (ctx->RenderMode != GL_RENDER)      return NULL;
1806afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   if (ctx->Line.SmoothFlag)              return NULL;
18072d595d70202bad560c27ea81ec71b740415b3355Brian Paul   if (ctx->Texture._ReallyEnabled)       return NULL;
180874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   if (ctx->Light.ShadeModel != GL_FLAT)  return NULL;
180974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   if (ctx->Line.Width != 1.0F)           return NULL;
181074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   if (ctx->Line.StippleFlag)             return NULL;
181174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   if (ctx->Line.SmoothFlag)              return NULL;
181274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   if (osmesa->format != OSMESA_RGBA &&
181374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul       osmesa->format != OSMESA_BGRA &&
181474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul       osmesa->format != OSMESA_ARGB)     return NULL;
181574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul
181674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   if (swrast->_RasterMask==DEPTH_BIT
181774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul       && ctx->Depth.Func==GL_LESS
181874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul       && ctx->Depth.Mask==GL_TRUE
181974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul       && ctx->Visual.depthBits == DEFAULT_SOFTWARE_DEPTH_BITS) {
18204742735a5c22f2400a2777965e08e757ec384979Karl Schultz      return (swrast_line_func) flat_rgba_z_line;
182174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   }
182274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul
182374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   if (swrast->_RasterMask == 0) {
18244742735a5c22f2400a2777965e08e757ec384979Karl Schultz      return (swrast_line_func) flat_rgba_line;
182574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   }
182674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul
182774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   if (swrast->_RasterMask==(DEPTH_BIT|BLEND_BIT)
182874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul       && ctx->Depth.Func==GL_LESS
182974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul       && ctx->Depth.Mask==GL_TRUE
183074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul       && ctx->Visual.depthBits == DEFAULT_SOFTWARE_DEPTH_BITS
183174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul       && ctx->Color.BlendSrcRGB==GL_SRC_ALPHA
183274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul       && ctx->Color.BlendDstRGB==GL_ONE_MINUS_SRC_ALPHA
183374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul       && ctx->Color.BlendSrcA==GL_SRC_ALPHA
183474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul       && ctx->Color.BlendDstA==GL_ONE_MINUS_SRC_ALPHA
183574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul       && ctx->Color.BlendEquation==GL_FUNC_ADD_EXT) {
18364742735a5c22f2400a2777965e08e757ec384979Karl Schultz      return (swrast_line_func) flat_blend_rgba_z_line_write;
183774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   }
183874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul
183974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   if (swrast->_RasterMask==(DEPTH_BIT|BLEND_BIT)
184074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul       && ctx->Depth.Func==GL_LESS
184174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul       && ctx->Depth.Mask==GL_FALSE
184274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul       && ctx->Visual.depthBits == DEFAULT_SOFTWARE_DEPTH_BITS
184374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul       && ctx->Color.BlendSrcRGB==GL_SRC_ALPHA
184474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul       && ctx->Color.BlendDstRGB==GL_ONE_MINUS_SRC_ALPHA
184574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul       && ctx->Color.BlendSrcA==GL_SRC_ALPHA
184674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul       && ctx->Color.BlendDstA==GL_ONE_MINUS_SRC_ALPHA
184774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul       && ctx->Color.BlendEquation==GL_FUNC_ADD_EXT) {
18484742735a5c22f2400a2777965e08e757ec384979Karl Schultz      return (swrast_line_func) flat_blend_rgba_z_line;
184974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   }
1850afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
185174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   if (swrast->_RasterMask==BLEND_BIT
185274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul       && ctx->Color.BlendSrcRGB==GL_SRC_ALPHA
185374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul       && ctx->Color.BlendDstRGB==GL_ONE_MINUS_SRC_ALPHA
185474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul       && ctx->Color.BlendSrcA==GL_SRC_ALPHA
185574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul       && ctx->Color.BlendDstA==GL_ONE_MINUS_SRC_ALPHA
185674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul       && ctx->Color.BlendEquation==GL_FUNC_ADD_EXT) {
18574742735a5c22f2400a2777965e08e757ec384979Karl Schultz      return (swrast_line_func) flat_blend_rgba_line;
1858afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
185974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul
18604742735a5c22f2400a2777965e08e757ec384979Karl Schultz   return (swrast_line_func) NULL;
1861afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
1862afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1863afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1864afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/**********************************************************************/
1865afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/*****                 Optimized triangle rendering               *****/
1866afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/**********************************************************************/
1867afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1868afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1869afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/*
1870afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Smooth-shaded, z-less triangle, RGBA color.
1871afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */
1872dbd1e2b5990a3689bf718296c57c14fc3ba38db5Jouk Jansenstatic void smooth_rgba_z_triangle( GLcontext *ctx,
1873a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul				    const SWvertex *v0,
1874a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul                                    const SWvertex *v1,
1875a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul                                    const SWvertex *v2 )
1876afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
187774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   const OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
187823ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank
1879afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#define INTERP_Z 1
1880ed30dfa1264ec8875a3162c3c8778bc703bf11d5Brian Paul#define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE
1881afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#define INTERP_RGB 1
1882afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#define INTERP_ALPHA 1
18839bf68ad963ba92b5d1e725f965979042495a5313Brian Paul#define RENDER_SPAN( span )					\
18849bf68ad963ba92b5d1e725f965979042495a5313Brian Paul   GLuint i;							\
18859bf68ad963ba92b5d1e725f965979042495a5313Brian Paul   GLchan *img = PIXELADDR4(span.x, span.y); 			\
188610f30eb43835c57c00783390a02d72daf4f78e26Brian Paul   for (i = 0; i < span.end; i++, img += 4) {			\
18879bf68ad963ba92b5d1e725f965979042495a5313Brian Paul      const GLdepth z = FixedToDepth(span.z);			\
1888afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      if (z < zRow[i]) {					\
188996385fa15569e25cd0977e678c0ff3bdab6ef316Brian Paul         PACK_RGBA(img, FixedToChan(span.red),			\
189096385fa15569e25cd0977e678c0ff3bdab6ef316Brian Paul            FixedToChan(span.green), FixedToChan(span.blue),	\
189196385fa15569e25cd0977e678c0ff3bdab6ef316Brian Paul            FixedToChan(span.alpha));				\
1892afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         zRow[i] = z;						\
1893afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }								\
18949bf68ad963ba92b5d1e725f965979042495a5313Brian Paul      span.red += span.redStep;					\
18959bf68ad963ba92b5d1e725f965979042495a5313Brian Paul      span.green += span.greenStep;				\
18969bf68ad963ba92b5d1e725f965979042495a5313Brian Paul      span.blue += span.blueStep;				\
18979bf68ad963ba92b5d1e725f965979042495a5313Brian Paul      span.alpha += span.alphaStep;				\
18989bf68ad963ba92b5d1e725f965979042495a5313Brian Paul      span.z += span.zStep;					\
18999bf68ad963ba92b5d1e725f965979042495a5313Brian Paul   }
19009bf68ad963ba92b5d1e725f965979042495a5313Brian Paul
1901afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#ifdef WIN32
1902724abeb058ca9372c5a9b9e38ee43dde1accaa41Keith Whitwell#include "..\swrast\s_tritemp.h"
1903afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#else
1904724abeb058ca9372c5a9b9e38ee43dde1accaa41Keith Whitwell#include "swrast/s_tritemp.h"
1905afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#endif
1906afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
1907afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1908afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1909afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1910afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1911afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/*
1912afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Flat-shaded, z-less triangle, RGBA color.
1913afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */
1914dbd1e2b5990a3689bf718296c57c14fc3ba38db5Jouk Jansenstatic void flat_rgba_z_triangle( GLcontext *ctx,
1915a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul				  const SWvertex *v0,
1916a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul                                  const SWvertex *v1,
1917a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul                                  const SWvertex *v2 )
1918afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
191974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   const OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
1920afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#define INTERP_Z 1
1921ed30dfa1264ec8875a3162c3c8778bc703bf11d5Brian Paul#define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE
192274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul#define SETUP_CODE						\
192374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   GLuint pixel;						\
192431c40f0905331ca51d705f8a072a9d239d692966Keith Whitwell   PACK_RGBA((GLchan *) &pixel, v2->color[0], v2->color[1],	\
192531c40f0905331ca51d705f8a072a9d239d692966Keith Whitwell                                v2->color[2], v2->color[3]);
192674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul
19279bf68ad963ba92b5d1e725f965979042495a5313Brian Paul#define RENDER_SPAN( span )				\
19289bf68ad963ba92b5d1e725f965979042495a5313Brian Paul   GLuint i;						\
19299bf68ad963ba92b5d1e725f965979042495a5313Brian Paul   GLuint *img = (GLuint *) PIXELADDR4(span.x, span.y);	\
193010f30eb43835c57c00783390a02d72daf4f78e26Brian Paul   for (i = 0; i < span.end; i++) {			\
19319bf68ad963ba92b5d1e725f965979042495a5313Brian Paul      const GLdepth z = FixedToDepth(span.z);		\
193274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      if (z < zRow[i]) {				\
193374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul         img[i] = pixel;				\
193474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul         zRow[i] = z;					\
193574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      }							\
19369bf68ad963ba92b5d1e725f965979042495a5313Brian Paul      span.z += span.zStep;				\
19379bf68ad963ba92b5d1e725f965979042495a5313Brian Paul   }
19389bf68ad963ba92b5d1e725f965979042495a5313Brian Paul
1939afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#ifdef WIN32
1940724abeb058ca9372c5a9b9e38ee43dde1accaa41Keith Whitwell#include "..\swrast\s_tritemp.h"
1941afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#else
1942724abeb058ca9372c5a9b9e38ee43dde1accaa41Keith Whitwell#include "swrast/s_tritemp.h"
1943afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#endif
1944afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
1945afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1946afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1947afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1948afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/*
1949afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Return pointer to an accelerated triangle function if possible.
1950afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */
1951dbd1e2b5990a3689bf718296c57c14fc3ba38db5Jouk Jansenstatic swrast_tri_func
19521e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwellosmesa_choose_triangle_function( GLcontext *ctx )
1953afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
195474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   const OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
195574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   const SWcontext *swrast = SWRAST_CONTEXT(ctx);
195674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul
195774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   if (CHAN_BITS != 8)                  return (swrast_tri_func) NULL;
195874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   if (ctx->RenderMode != GL_RENDER)    return (swrast_tri_func) NULL;
195974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   if (ctx->Polygon.SmoothFlag)         return (swrast_tri_func) NULL;
196074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   if (ctx->Polygon.StippleFlag)        return (swrast_tri_func) NULL;
196174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   if (ctx->Texture._ReallyEnabled)     return (swrast_tri_func) NULL;
196274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   if (osmesa->format != OSMESA_RGBA &&
196374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul       osmesa->format != OSMESA_BGRA &&
196474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul       osmesa->format != OSMESA_ARGB)   return (swrast_tri_func) NULL;
196574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul
196674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   if (swrast->_RasterMask == DEPTH_BIT &&
196774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul       ctx->Depth.Func == GL_LESS &&
196874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul       ctx->Depth.Mask == GL_TRUE &&
196974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul       ctx->Visual.depthBits == DEFAULT_SOFTWARE_DEPTH_BITS) {
197074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      if (ctx->Light.ShadeModel == GL_SMOOTH) {
19714742735a5c22f2400a2777965e08e757ec384979Karl Schultz         return (swrast_tri_func) smooth_rgba_z_triangle;
1972afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
1973afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      else {
19744742735a5c22f2400a2777965e08e757ec384979Karl Schultz         return (swrast_tri_func) flat_rgba_z_triangle;
1975afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
1976afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
197774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   return (swrast_tri_func) NULL;
19781e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell}
19791e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell
198074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul
198174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul
19821e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell/* Override for the swrast triangle-selection function.  Try to use one
19831e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell * of our internal triangle functions, otherwise fall back to the
1984dbd1e2b5990a3689bf718296c57c14fc3ba38db5Jouk Jansen * standard swrast functions.
19851e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell */
19861e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwellstatic void osmesa_choose_triangle( GLcontext *ctx )
19871e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell{
19881e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell   SWcontext *swrast = SWRAST_CONTEXT(ctx);
19891e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell
19901e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell   swrast->Triangle = osmesa_choose_triangle_function( ctx );
19911e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell   if (!swrast->Triangle)
19921e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell      _swrast_choose_triangle( ctx );
1993afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
1994afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
19951e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwellstatic void osmesa_choose_line( GLcontext *ctx )
19961e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell{
19971e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell   SWcontext *swrast = SWRAST_CONTEXT(ctx);
19981e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell
19991e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell   swrast->Line = osmesa_choose_line_function( ctx );
20001e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell   if (!swrast->Line)
20011e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell      _swrast_choose_line( ctx );
20021e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell}
20031e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell
20041e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell
20052d595d70202bad560c27ea81ec71b740415b3355Brian Paul#define OSMESA_NEW_LINE   (_NEW_LINE | \
20062d595d70202bad560c27ea81ec71b740415b3355Brian Paul                           _NEW_TEXTURE | \
20072d595d70202bad560c27ea81ec71b740415b3355Brian Paul                           _NEW_LIGHT | \
20082d595d70202bad560c27ea81ec71b740415b3355Brian Paul                           _NEW_DEPTH | \
20092d595d70202bad560c27ea81ec71b740415b3355Brian Paul                           _NEW_RENDERMODE | \
2010dbd1e2b5990a3689bf718296c57c14fc3ba38db5Jouk Jansen                           _SWRAST_NEW_RASTERMASK)
20112d595d70202bad560c27ea81ec71b740415b3355Brian Paul
20122d595d70202bad560c27ea81ec71b740415b3355Brian Paul#define OSMESA_NEW_TRIANGLE (_NEW_POLYGON | \
20132d595d70202bad560c27ea81ec71b740415b3355Brian Paul                             _NEW_TEXTURE | \
20142d595d70202bad560c27ea81ec71b740415b3355Brian Paul                             _NEW_LIGHT | \
20152d595d70202bad560c27ea81ec71b740415b3355Brian Paul                             _NEW_DEPTH | \
20162d595d70202bad560c27ea81ec71b740415b3355Brian Paul                             _NEW_RENDERMODE | \
20172d595d70202bad560c27ea81ec71b740415b3355Brian Paul                             _SWRAST_NEW_RASTERMASK)
20181e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell
20191e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell
2020dbd1e2b5990a3689bf718296c57c14fc3ba38db5Jouk Jansen/* Extend the software rasterizer with our line and triangle
20211e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell * functions.
20221e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell */
20231e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwellstatic void osmesa_register_swrast_functions( GLcontext *ctx )
20241e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell{
20251e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell   SWcontext *swrast = SWRAST_CONTEXT( ctx );
2026dbd1e2b5990a3689bf718296c57c14fc3ba38db5Jouk Jansen
20271e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell   swrast->choose_line = osmesa_choose_line;
20281e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell   swrast->choose_triangle = osmesa_choose_triangle;
2029dbd1e2b5990a3689bf718296c57c14fc3ba38db5Jouk Jansen
20301e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell   swrast->invalidate_line |= OSMESA_NEW_LINE;
20311e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell   swrast->invalidate_triangle |= OSMESA_NEW_TRIANGLE;
20321e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell}
2033ed30dfa1264ec8875a3162c3c8778bc703bf11d5Brian Paul
2034ed30dfa1264ec8875a3162c3c8778bc703bf11d5Brian Paul
2035afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgstatic const GLubyte *get_string( GLcontext *ctx, GLenum name )
2036afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
2037afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   (void) ctx;
2038afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   switch (name) {
2039afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GL_RENDERER:
20401cefc83a8802deb53a176e20fd2d23b8ce47909fBrian Paul#if CHAN_BITS == 32
20411cefc83a8802deb53a176e20fd2d23b8ce47909fBrian Paul         return (const GLubyte *) "Mesa OffScreen32";
20421cefc83a8802deb53a176e20fd2d23b8ce47909fBrian Paul#elif CHAN_BITS == 16
20431cefc83a8802deb53a176e20fd2d23b8ce47909fBrian Paul         return (const GLubyte *) "Mesa OffScreen16";
20441cefc83a8802deb53a176e20fd2d23b8ce47909fBrian Paul#else
2045afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         return (const GLubyte *) "Mesa OffScreen";
20461cefc83a8802deb53a176e20fd2d23b8ce47909fBrian Paul#endif
2047afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      default:
2048afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         return NULL;
2049afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
2050afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
2051afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
2052afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
2053cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwellstatic void osmesa_update_state( GLcontext *ctx, GLuint new_state )
2054afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
2055c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul   OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
2056709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell   struct swrast_device_driver *swdd = _swrast_GetDeviceDriverReference( ctx );
2057709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell   TNLcontext *tnl = TNL_CONTEXT(ctx);
2058304357dcd496f7ebf499fd9c77b4eba83a75abd5Brian Paul
2059304357dcd496f7ebf499fd9c77b4eba83a75abd5Brian Paul   ASSERT((void *) osmesa == (void *) ctx->DriverCtx);
2060afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
206174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   /*
206274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul    * XXX these function pointers could be initialized just once during
206374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul    * context creation since they don't depend on any state changes.
206474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul    */
206574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul
2066afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   ctx->Driver.GetString = get_string;
2067afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   ctx->Driver.UpdateState = osmesa_update_state;
2068cea0e8e6700e871bb9bcb334cb75fbfbfcdfd702Brian Paul   ctx->Driver.SetDrawBuffer = set_draw_buffer;
206918a285a5e244b7405b85feb7315a30d99920ec5dBrian Paul   ctx->Driver.ResizeBuffers = _swrast_alloc_buffers;
2070a81b3532f7c984878ba1d4b38f796abf731f76b1Brian Paul   ctx->Driver.GetBufferSize = buffer_size;
2071a81b3532f7c984878ba1d4b38f796abf731f76b1Brian Paul
20725c1e7fa6ee72f4403d9ec9d12830dd689b966e71Keith Whitwell   ctx->Driver.Accum = _swrast_Accum;
20735c1e7fa6ee72f4403d9ec9d12830dd689b966e71Keith Whitwell   ctx->Driver.Bitmap = _swrast_Bitmap;
2074afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   ctx->Driver.Clear = clear;
20755c1e7fa6ee72f4403d9ec9d12830dd689b966e71Keith Whitwell   ctx->Driver.CopyPixels = _swrast_CopyPixels;
20765c1e7fa6ee72f4403d9ec9d12830dd689b966e71Keith Whitwell   ctx->Driver.DrawPixels = _swrast_DrawPixels;
20775c1e7fa6ee72f4403d9ec9d12830dd689b966e71Keith Whitwell   ctx->Driver.ReadPixels = _swrast_ReadPixels;
2078afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
20797d58f44f73be59bd3583e6dfeedf56c43f7fbd55Brian Paul   ctx->Driver.ChooseTextureFormat = _mesa_choose_tex_format;
20808e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul   ctx->Driver.TexImage1D = _mesa_store_teximage1d;
20818e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul   ctx->Driver.TexImage2D = _mesa_store_teximage2d;
20828e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul   ctx->Driver.TexImage3D = _mesa_store_teximage3d;
20838e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul   ctx->Driver.TexSubImage1D = _mesa_store_texsubimage1d;
20848e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul   ctx->Driver.TexSubImage2D = _mesa_store_texsubimage2d;
20858e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul   ctx->Driver.TexSubImage3D = _mesa_store_texsubimage3d;
20868e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul   ctx->Driver.TestProxyTexImage = _mesa_test_proxy_teximage;
20878e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul
2088709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell   ctx->Driver.CopyTexImage1D = _swrast_copy_teximage1d;
2089709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell   ctx->Driver.CopyTexImage2D = _swrast_copy_teximage2d;
2090709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell   ctx->Driver.CopyTexSubImage1D = _swrast_copy_texsubimage1d;
2091709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell   ctx->Driver.CopyTexSubImage2D = _swrast_copy_texsubimage2d;
2092709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell   ctx->Driver.CopyTexSubImage3D = _swrast_copy_texsubimage3d;
2093709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell   ctx->Driver.CopyColorTable = _swrast_CopyColorTable;
2094709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell   ctx->Driver.CopyColorSubTable = _swrast_CopyColorSubTable;
2095709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell   ctx->Driver.CopyConvolutionFilter1D = _swrast_CopyConvolutionFilter1D;
2096709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell   ctx->Driver.CopyConvolutionFilter2D = _swrast_CopyConvolutionFilter2D;
2097709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell
2098e79f4b08d5005a4053230a1e4c66455fb9e56430Brian Paul   ctx->Driver.BaseCompressedTexFormat = _mesa_base_compressed_texformat;
2099e79f4b08d5005a4053230a1e4c66455fb9e56430Brian Paul   ctx->Driver.CompressedTextureSize = _mesa_compressed_texture_size;
2100e79f4b08d5005a4053230a1e4c66455fb9e56430Brian Paul   ctx->Driver.GetCompressedTexImage = _mesa_get_compressed_teximage;
2101afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
2102afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   /* RGB(A) span/pixel functions */
210374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   if (osmesa->format == OSMESA_RGB) {
2104709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell      swdd->WriteRGBASpan = write_rgba_span_RGB;
2105709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell      swdd->WriteRGBSpan = write_rgb_span_RGB;
2106709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell      swdd->WriteMonoRGBASpan = write_monocolor_span_RGB;
2107709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell      swdd->WriteRGBAPixels = write_rgba_pixels_RGB;
2108709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell      swdd->WriteMonoRGBAPixels = write_monocolor_pixels_RGB;
2109709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell      swdd->ReadRGBASpan = read_rgba_span3;
2110709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell      swdd->ReadRGBAPixels = read_rgba_pixels3;
211174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   }
211274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   else if (osmesa->format == OSMESA_BGR) {
2113709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell      swdd->WriteRGBASpan = write_rgba_span_BGR;
2114709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell      swdd->WriteRGBSpan = write_rgb_span_BGR;
2115709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell      swdd->WriteMonoRGBASpan = write_monocolor_span_BGR;
2116709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell      swdd->WriteRGBAPixels = write_rgba_pixels_BGR;
2117709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell      swdd->WriteMonoRGBAPixels = write_monocolor_pixels_BGR;
2118709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell      swdd->ReadRGBASpan = read_rgba_span3;
2119709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell      swdd->ReadRGBAPixels = read_rgba_pixels3;
2120afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
2121206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul   else if (osmesa->format == OSMESA_RGB_565) {
2122206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul      swdd->WriteRGBASpan = write_rgba_span2;
2123206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul      swdd->WriteRGBSpan = write_rgb_span2;
2124206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul      swdd->WriteMonoRGBASpan = write_monocolor_span2;
2125206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul      swdd->WriteRGBAPixels = write_rgba_pixels2;
2126206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul      swdd->WriteMonoRGBAPixels = write_monocolor_pixels2;
2127206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul      swdd->ReadRGBASpan = read_rgba_span2;
2128206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul      swdd->ReadRGBAPixels = read_rgba_pixels2;
2129206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul   }
2130afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   else {
21312db44ffe9d591b0686755e2128ae9a6a1611f2a5Brian Paul      /* 4 GLchan / pixel in frame buffer */
2132709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell      swdd->WriteRGBSpan = write_rgb_span;
2133709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell      swdd->WriteRGBAPixels = write_rgba_pixels;
2134709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell      swdd->WriteMonoRGBASpan = write_monocolor_span;
2135709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell      swdd->WriteMonoRGBAPixels = write_monocolor_pixels;
213674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      if (osmesa->format == OSMESA_RGBA &&
213774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul          CHAN_TYPE == GL_UNSIGNED_BYTE &&
213874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul          RCOMP==0 && GCOMP==1 && BCOMP==2 && ACOMP==3) {
213974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul         /* special, fast case */
2140709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell         swdd->WriteRGBASpan = write_rgba_span_rgba;
2141709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell         swdd->ReadRGBASpan = read_rgba_span_rgba;
214274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      }
214374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      else {
2144709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell         swdd->WriteRGBASpan = write_rgba_span;
2145709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell         swdd->ReadRGBASpan = read_rgba_span;
214674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      }
2147709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell      swdd->ReadRGBAPixels = read_rgba_pixels;
2148afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
2149afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
2150afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   /* CI span/pixel functions */
2151709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell   swdd->WriteCI32Span = write_index32_span;
2152709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell   swdd->WriteCI8Span = write_index8_span;
2153709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell   swdd->WriteMonoCISpan = write_monoindex_span;
2154709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell   swdd->WriteCI32Pixels = write_index_pixels;
2155709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell   swdd->WriteMonoCIPixels = write_monoindex_pixels;
2156709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell   swdd->ReadCI32Span = read_index_span;
2157709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell   swdd->ReadCI32Pixels = read_index_pixels;
2158709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell
2159709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell   swdd->SetReadBuffer = set_read_buffer;
2160709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell
2161bc69de5f21ebb4d6e1c65bf5652d17a9fc87dda7Keith Whitwell   tnl->Driver.RunPipeline = _tnl_run_pipeline;
216223caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell
2163cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   _swrast_InvalidateState( ctx, new_state );
2164cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   _swsetup_InvalidateState( ctx, new_state );
216558e991705392a2e17a1c8b034f4083a0adaf1943Keith Whitwell   _ac_InvalidateState( ctx, new_state );
2166cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   _tnl_InvalidateState( ctx, new_state );
2167afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
2168