osmesa.c revision 544b94e15617fb69f77ebd57b1be49aafe2f64e6
1afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/*
2afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Mesa 3-D graphics library
3d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul * Version:  6.5.1
4dbd1e2b5990a3689bf718296c57c14fc3ba38db5Jouk Jansen *
5c6c0f947142c0cc82626c238804a68b4e8f53945Brian Paul * Copyright (C) 1999-2006  Brian Paul   All Rights Reserved.
6dbd1e2b5990a3689bf718296c57c14fc3ba38db5Jouk Jansen *
7afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Permission is hereby granted, free of charge, to any person obtaining a
8afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * copy of this software and associated documentation files (the "Software"),
9afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * to deal in the Software without restriction, including without limitation
10afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * the rights to use, copy, modify, merge, publish, distribute, sublicense,
11afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * and/or sell copies of the Software, and to permit persons to whom the
12afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Software is furnished to do so, subject to the following conditions:
13dbd1e2b5990a3689bf718296c57c14fc3ba38db5Jouk Jansen *
14afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * The above copyright notice and this permission notice shall be included
15afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * in all copies or substantial portions of the Software.
16dbd1e2b5990a3689bf718296c57c14fc3ba38db5Jouk Jansen *
17afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
18afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
20afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
21afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
22afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
23afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */
24afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
25afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
26afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/*
27afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Off-Screen Mesa rendering / Rendering into client memory space
28d3c070ca6a36daa765b1ad7f44e03e6671ad0490Brian Paul *
29d3c070ca6a36daa765b1ad7f44e03e6671ad0490Brian Paul * Note on thread safety:  this driver is thread safe.  All
30d3c070ca6a36daa765b1ad7f44e03e6671ad0490Brian Paul * functions are reentrant.  The notion of current context is
31b1394fa92aaaf859ce9efc8b5fc194397921320cBrian Paul * managed by the core _mesa_make_current() and _mesa_get_current_context()
32d3c070ca6a36daa765b1ad7f44e03e6671ad0490Brian Paul * functions.  Those functions are thread-safe.
33afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */
34afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
35afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
36eed6f691991ed0d64752fa712c83f67eb700b9adBrian Paul#include "glheader.h"
37afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#include "GL/osmesa.h"
38afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#include "context.h"
398e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul#include "extensions.h"
40e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul#include "framebuffer.h"
419a33a11d714c90162d32781ebbd2c1dfab52cfd1Brian Paul#include "imports.h"
42dbd1e2b5990a3689bf718296c57c14fc3ba38db5Jouk Jansen#include "mtypes.h"
43e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul#include "renderbuffer.h"
448e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul#include "array_cache/acache.h"
451e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell#include "swrast/swrast.h"
461e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell#include "swrast_setup/swrast_setup.h"
471e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell#include "swrast/s_context.h"
481e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell#include "swrast/s_lines.h"
491e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell#include "swrast/s_triangle.h"
505a9026c65d260dc185e072163999f5d810015108Brian Paul#include "tnl/tnl.h"
51709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell#include "tnl/t_context.h"
52bc69de5f21ebb4d6e1c65bf5652d17a9fc87dda7Keith Whitwell#include "tnl/t_pipeline.h"
53d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul#include "drivers/common/driverfuncs.h"
54afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
55724abeb058ca9372c5a9b9e38ee43dde1accaa41Keith Whitwell
56724abeb058ca9372c5a9b9e38ee43dde1accaa41Keith Whitwell
57d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul/**
58d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul * OSMesa rendering context, derived from core Mesa GLcontext.
59304357dcd496f7ebf499fd9c77b4eba83a75abd5Brian Paul */
60d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paulstruct osmesa_context
61d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul{
62d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   GLcontext mesa;		/*< Base class - this must be first */
63d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   GLvisual *gl_visual;		/*< Describes the buffers */
64d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   struct gl_renderbuffer *rb;  /*< The user's colorbuffer */
65d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   GLframebuffer *gl_buffer;	/*< The framebuffer, containing user's rb */
66d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   GLenum format;		/*< User-specified context format */
67d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   GLint userRowLength;		/*< user-specified number of pixels per row */
68d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   GLint rInd, gInd, bInd, aInd;/*< index offsets for RGBA formats */
69d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   GLvoid *rowaddr[MAX_HEIGHT];	/*< address of first pixel in each image row */
70d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   GLboolean yup;		/*< TRUE  -> Y increases upward */
71d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul				/*< FALSE -> Y increases downward */
72afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg};
73afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
74afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
75d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paulstatic INLINE OSMesaContext
76d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian PaulOSMESA_CONTEXT(GLcontext *ctx)
77d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul{
78d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   /* Just cast, since we're using structure containment */
79d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   return (OSMesaContext) ctx;
80d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul}
81c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul
82c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul
83afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/**********************************************************************/
849c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul/*** Private Device Driver Functions                                ***/
85afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/**********************************************************************/
86afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
87afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
889c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paulstatic const GLubyte *
899c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paulget_string( GLcontext *ctx, GLenum name )
90afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
919c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   (void) ctx;
929c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   switch (name) {
939c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      case GL_RENDERER:
949c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#if CHAN_BITS == 32
959c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         return (const GLubyte *) "Mesa OffScreen32";
969c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#elif CHAN_BITS == 16
979c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         return (const GLubyte *) "Mesa OffScreen16";
989c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#else
999c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         return (const GLubyte *) "Mesa OffScreen";
1009c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#endif
1019c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      default:
1029c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         return NULL;
1039c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   }
1042bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul}
1052bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul
1062bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul
1079c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paulstatic void
1089c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paulosmesa_update_state( GLcontext *ctx, GLuint new_state )
1099c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul{
1109c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   /* easy - just propogate */
1119c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   _swrast_InvalidateState( ctx, new_state );
1129c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   _swsetup_InvalidateState( ctx, new_state );
1139c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   _ac_InvalidateState( ctx, new_state );
1149c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   _tnl_InvalidateState( ctx, new_state );
1159c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul}
1169c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul
1172bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul
1189c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul
1199c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul/**********************************************************************/
1209c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul/*****        Read/write spans/arrays of pixels                   *****/
1219c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul/**********************************************************************/
1225a9026c65d260dc185e072163999f5d810015108Brian Paul
123d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul/* 8-bit RGBA */
124d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define NAME(PREFIX) PREFIX##_RGBA8
125d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define RB_TYPE GLubyte
1269c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define SPAN_VARS \
1279c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   const OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
1289c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define INIT_PIXEL_PTR(P, X, Y) \
129d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   GLubyte *P = (GLubyte *) osmesa->rowaddr[Y] + 4 * (X)
1309c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define INC_PIXEL_PTR(P) P += 4
131e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul#define STORE_PIXEL(DST, X, Y, VALUE) \
132d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   DST[0] = VALUE[RCOMP];  \
133d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   DST[1] = VALUE[GCOMP];  \
134d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   DST[2] = VALUE[BCOMP];  \
135d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   DST[3] = VALUE[ACOMP]
136286c4cc201390e868c4f9b5ebe14c40db2d74a5dBrian Paul#define STORE_PIXEL_RGB(DST, X, Y, VALUE) \
137d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   DST[0] = VALUE[RCOMP];  \
138d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   DST[1] = VALUE[GCOMP];  \
139d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   DST[2] = VALUE[BCOMP];  \
140d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   DST[3] = 255
141d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define FETCH_PIXEL(DST, SRC) \
142d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   DST[RCOMP] = SRC[0];  \
143d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   DST[GCOMP] = SRC[1];  \
144d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   DST[BCOMP] = SRC[2];  \
145d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   DST[ACOMP] = SRC[3]
146d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#include "swrast/s_spantemp.h"
147d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul
148d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul/* 16-bit RGBA */
149d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define NAME(PREFIX) PREFIX##_RGBA16
150d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define RB_TYPE GLushort
151d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define SPAN_VARS \
152d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   const OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
153d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define INIT_PIXEL_PTR(P, X, Y) \
154d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   GLushort *P = (GLushort *) osmesa->rowaddr[Y] + 4 * (X)
155d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define INC_PIXEL_PTR(P) P += 4
156e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul#define STORE_PIXEL(DST, X, Y, VALUE) \
157e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   DST[0] = VALUE[RCOMP];  \
158e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   DST[1] = VALUE[GCOMP];  \
159e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   DST[2] = VALUE[BCOMP];  \
160e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   DST[3] = VALUE[ACOMP]
161286c4cc201390e868c4f9b5ebe14c40db2d74a5dBrian Paul#define STORE_PIXEL_RGB(DST, X, Y, VALUE) \
162286c4cc201390e868c4f9b5ebe14c40db2d74a5dBrian Paul   DST[0] = VALUE[RCOMP];  \
163286c4cc201390e868c4f9b5ebe14c40db2d74a5dBrian Paul   DST[1] = VALUE[GCOMP];  \
164286c4cc201390e868c4f9b5ebe14c40db2d74a5dBrian Paul   DST[2] = VALUE[BCOMP];  \
165d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   DST[3] = 65535
166d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define FETCH_PIXEL(DST, SRC) \
167d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   DST[RCOMP] = SRC[0];  \
168d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   DST[GCOMP] = SRC[1];  \
169d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   DST[BCOMP] = SRC[2];  \
170d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   DST[ACOMP] = SRC[3]
171d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#include "swrast/s_spantemp.h"
172d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul
173d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul/* 32-bit RGBA */
174d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define NAME(PREFIX) PREFIX##_RGBA32
175d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define RB_TYPE GLfloat
176d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define SPAN_VARS \
177d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   const OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
178d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define INIT_PIXEL_PTR(P, X, Y) \
179d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   GLfloat *P = (GLfloat *) osmesa->rowaddr[Y] + 4 * (X)
180d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define INC_PIXEL_PTR(P) P += 4
181d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define STORE_PIXEL(DST, X, Y, VALUE) \
182d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   DST[0] = MAX2((VALUE[RCOMP]), 0.0F); \
183d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   DST[1] = MAX2((VALUE[GCOMP]), 0.0F); \
184d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   DST[2] = MAX2((VALUE[BCOMP]), 0.0F); \
185d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   DST[3] = CLAMP((VALUE[ACOMP]), 0.0F, 1.0F)
186d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define STORE_PIXEL_RGB(DST, X, Y, VALUE) \
187d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   DST[0] = MAX2((VALUE[RCOMP]), 0.0F); \
188d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   DST[1] = MAX2((VALUE[GCOMP]), 0.0F); \
189d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   DST[2] = MAX2((VALUE[BCOMP]), 0.0F); \
190d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   DST[3] = 1.0F
191e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul#define FETCH_PIXEL(DST, SRC) \
192e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   DST[RCOMP] = SRC[0];  \
193e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   DST[GCOMP] = SRC[1];  \
194e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   DST[BCOMP] = SRC[2];  \
19522652f952fbd3968f3d5a3db7898911508d76145Brian Paul   DST[ACOMP] = SRC[3]
196eae0439ae6027ba64fba49fe13360d105700905fBrian Paul#include "swrast/s_spantemp.h"
1974c44d63f01a01f134d7e4456d4209edee97f9ef5Brian Paul
198d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul
199d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul/* 8-bit BGRA */
200d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define NAME(PREFIX) PREFIX##_BGRA8
201d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define RB_TYPE GLubyte
202d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define SPAN_VARS \
203d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   const OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
204d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define INIT_PIXEL_PTR(P, X, Y) \
205d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   GLubyte *P = (GLubyte *) osmesa->rowaddr[Y] + 4 * (X)
206d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define INC_PIXEL_PTR(P) P += 4
207d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define STORE_PIXEL(DST, X, Y, VALUE) \
208d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   DST[2] = VALUE[RCOMP];  \
209d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   DST[1] = VALUE[GCOMP];  \
210d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   DST[0] = VALUE[BCOMP];  \
211d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   DST[3] = VALUE[ACOMP]
212d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define STORE_PIXEL_RGB(DST, X, Y, VALUE) \
213d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   DST[2] = VALUE[RCOMP];  \
214d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   DST[1] = VALUE[GCOMP];  \
215d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   DST[0] = VALUE[BCOMP];  \
216d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   DST[3] = 255
217d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define FETCH_PIXEL(DST, SRC) \
218d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   DST[RCOMP] = SRC[2];  \
219d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   DST[GCOMP] = SRC[1];  \
220d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   DST[BCOMP] = SRC[0];  \
221d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   DST[ACOMP] = SRC[3]
222d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#include "swrast/s_spantemp.h"
223d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul
224d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul/* 16-bit BGRA */
225d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define NAME(PREFIX) PREFIX##_BGRA16
226d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define RB_TYPE GLushort
2279c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define SPAN_VARS \
2289c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   const OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
2299c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define INIT_PIXEL_PTR(P, X, Y) \
230d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   GLushort *P = (GLushort *) osmesa->rowaddr[Y] + 4 * (X)
2319c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define INC_PIXEL_PTR(P) P += 4
232e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul#define STORE_PIXEL(DST, X, Y, VALUE) \
233e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   DST[2] = VALUE[RCOMP];  \
234e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   DST[1] = VALUE[GCOMP];  \
235e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   DST[0] = VALUE[BCOMP];  \
236e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   DST[3] = VALUE[ACOMP]
237286c4cc201390e868c4f9b5ebe14c40db2d74a5dBrian Paul#define STORE_PIXEL_RGB(DST, X, Y, VALUE) \
238286c4cc201390e868c4f9b5ebe14c40db2d74a5dBrian Paul   DST[2] = VALUE[RCOMP];  \
239286c4cc201390e868c4f9b5ebe14c40db2d74a5dBrian Paul   DST[1] = VALUE[GCOMP];  \
240286c4cc201390e868c4f9b5ebe14c40db2d74a5dBrian Paul   DST[0] = VALUE[BCOMP];  \
241d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   DST[3] = 65535
242e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul#define FETCH_PIXEL(DST, SRC) \
243e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   DST[RCOMP] = SRC[2];  \
244e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   DST[GCOMP] = SRC[1];  \
245e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   DST[BCOMP] = SRC[0];  \
24622652f952fbd3968f3d5a3db7898911508d76145Brian Paul   DST[ACOMP] = SRC[3]
247eae0439ae6027ba64fba49fe13360d105700905fBrian Paul#include "swrast/s_spantemp.h"
2489c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul
249d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul/* 32-bit BGRA */
250d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define NAME(PREFIX) PREFIX##_BGRA32
251d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define RB_TYPE GLfloat
2529c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define SPAN_VARS \
2539c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   const OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
2549c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define INIT_PIXEL_PTR(P, X, Y) \
255d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   GLfloat *P = (GLfloat *) osmesa->rowaddr[Y] + 4 * (X)
256d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define INC_PIXEL_PTR(P) P += 4
257d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define STORE_PIXEL(DST, X, Y, VALUE) \
258d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   DST[2] = VALUE[RCOMP];  \
259d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   DST[1] = VALUE[GCOMP];  \
260d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   DST[0] = VALUE[BCOMP];  \
261d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   DST[3] = VALUE[ACOMP]
262d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define STORE_PIXEL_RGB(DST, X, Y, VALUE) \
263d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   DST[2] = VALUE[RCOMP];  \
264d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   DST[1] = VALUE[GCOMP];  \
265d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   DST[0] = VALUE[BCOMP];  \
266d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   DST[3] = 1.0F
267d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define FETCH_PIXEL(DST, SRC) \
268d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   DST[RCOMP] = SRC[2];  \
269d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   DST[GCOMP] = SRC[1];  \
270d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   DST[BCOMP] = SRC[0];  \
271d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   DST[ACOMP] = SRC[3]
272d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#include "swrast/s_spantemp.h"
273d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul
274d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul
275d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul/* 8-bit ARGB */
276d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define NAME(PREFIX) PREFIX##_ARGB8
277d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define RB_TYPE GLubyte
278d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define SPAN_VARS \
279d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   const OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
280d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define INIT_PIXEL_PTR(P, X, Y) \
281d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   GLubyte *P = (GLubyte *) osmesa->rowaddr[Y] + 4 * (X)
282d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define INC_PIXEL_PTR(P) P += 4
283d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define STORE_PIXEL(DST, X, Y, VALUE) \
284d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   DST[1] = VALUE[RCOMP];  \
285d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   DST[2] = VALUE[GCOMP];  \
286d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   DST[3] = VALUE[BCOMP];  \
287d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   DST[0] = VALUE[ACOMP]
288d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define STORE_PIXEL_RGB(DST, X, Y, VALUE) \
289d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   DST[1] = VALUE[RCOMP];  \
290d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   DST[2] = VALUE[GCOMP];  \
291d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   DST[3] = VALUE[BCOMP];  \
292d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   DST[0] = 255
293d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define FETCH_PIXEL(DST, SRC) \
294d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   DST[RCOMP] = SRC[1];  \
295d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   DST[GCOMP] = SRC[2];  \
296d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   DST[BCOMP] = SRC[3];  \
297d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   DST[ACOMP] = SRC[0]
298d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#include "swrast/s_spantemp.h"
299d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul
300d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul/* 16-bit ARGB */
301d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define NAME(PREFIX) PREFIX##_ARGB16
302d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define RB_TYPE GLushort
303d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define SPAN_VARS \
304d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   const OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
305d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define INIT_PIXEL_PTR(P, X, Y) \
306d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   GLushort *P = (GLushort *) osmesa->rowaddr[Y] + 4 * (X)
3079c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define INC_PIXEL_PTR(P) P += 4
308e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul#define STORE_PIXEL(DST, X, Y, VALUE) \
309e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   DST[1] = VALUE[RCOMP];  \
310e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   DST[2] = VALUE[GCOMP];  \
311e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   DST[3] = VALUE[BCOMP];  \
312e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   DST[0] = VALUE[ACOMP]
313286c4cc201390e868c4f9b5ebe14c40db2d74a5dBrian Paul#define STORE_PIXEL_RGB(DST, X, Y, VALUE) \
314286c4cc201390e868c4f9b5ebe14c40db2d74a5dBrian Paul   DST[1] = VALUE[RCOMP];  \
315286c4cc201390e868c4f9b5ebe14c40db2d74a5dBrian Paul   DST[2] = VALUE[GCOMP];  \
316286c4cc201390e868c4f9b5ebe14c40db2d74a5dBrian Paul   DST[3] = VALUE[BCOMP];  \
317d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   DST[0] = 65535
318e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul#define FETCH_PIXEL(DST, SRC) \
319e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   DST[RCOMP] = SRC[1];  \
320e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   DST[GCOMP] = SRC[2];  \
321e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   DST[BCOMP] = SRC[3];  \
32222652f952fbd3968f3d5a3db7898911508d76145Brian Paul   DST[ACOMP] = SRC[0]
323eae0439ae6027ba64fba49fe13360d105700905fBrian Paul#include "swrast/s_spantemp.h"
3249c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul
325d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul/* 32-bit ARGB */
326d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define NAME(PREFIX) PREFIX##_ARGB32
327d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define RB_TYPE GLfloat
3289c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define SPAN_VARS \
3299c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   const OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
3309c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define INIT_PIXEL_PTR(P, X, Y) \
331d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   GLfloat *P = (GLfloat *) osmesa->rowaddr[Y] + 4 * (X)
332d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define INC_PIXEL_PTR(P) P += 4
333d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define STORE_PIXEL(DST, X, Y, VALUE) \
334d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   DST[1] = VALUE[RCOMP];  \
335d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   DST[2] = VALUE[GCOMP];  \
336d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   DST[3] = VALUE[BCOMP];  \
337d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   DST[0] = VALUE[ACOMP]
338d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define STORE_PIXEL_RGB(DST, X, Y, VALUE) \
339d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   DST[1] = VALUE[RCOMP];  \
340d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   DST[2] = VALUE[GCOMP];  \
341d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   DST[3] = VALUE[BCOMP];  \
342d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   DST[0] = 1.0F
343d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define FETCH_PIXEL(DST, SRC) \
344d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   DST[RCOMP] = SRC[1];  \
345d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   DST[GCOMP] = SRC[2];  \
346d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   DST[BCOMP] = SRC[3];  \
347d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   DST[ACOMP] = SRC[0]
348d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#include "swrast/s_spantemp.h"
349d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul
350d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul
351d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul/* 8-bit RGB */
352d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define NAME(PREFIX) PREFIX##_RGB8
353d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define RB_TYPE GLubyte
354d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define SPAN_VARS \
355d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   const OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
356d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define INIT_PIXEL_PTR(P, X, Y) \
357d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   GLubyte *P = (GLubyte *) osmesa->rowaddr[Y] + 3 * (X)
3583340a9ea9ea31e6bd7f37d5c1f25ffcc97f20a6bBrian Paul#define INC_PIXEL_PTR(P) P += 3
359e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul#define STORE_PIXEL(DST, X, Y, VALUE) \
360e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   DST[0] = VALUE[RCOMP];  \
361e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   DST[1] = VALUE[GCOMP];  \
362e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   DST[2] = VALUE[BCOMP]
363e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul#define FETCH_PIXEL(DST, SRC) \
364e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   DST[RCOMP] = SRC[0];  \
365e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   DST[GCOMP] = SRC[1];  \
366e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   DST[BCOMP] = SRC[2];  \
367d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   DST[ACOMP] = 255
368eae0439ae6027ba64fba49fe13360d105700905fBrian Paul#include "swrast/s_spantemp.h"
3699c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul
370d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul/* 16-bit RGB */
371d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define NAME(PREFIX) PREFIX##_RGB16
372d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define RB_TYPE GLushort
373d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define SPAN_VARS \
374d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   const OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
375d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define INIT_PIXEL_PTR(P, X, Y) \
376d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   GLushort *P = (GLushort *) osmesa->rowaddr[Y] + 3 * (X)
377d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define INC_PIXEL_PTR(P) P += 3
378d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define STORE_PIXEL(DST, X, Y, VALUE) \
379d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   DST[0] = VALUE[RCOMP];  \
380d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   DST[1] = VALUE[GCOMP];  \
381d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   DST[2] = VALUE[BCOMP]
382d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define FETCH_PIXEL(DST, SRC) \
383d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   DST[RCOMP] = SRC[0];  \
384d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   DST[GCOMP] = SRC[1];  \
385d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   DST[BCOMP] = SRC[2];  \
386d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   DST[ACOMP] = 65535U
387d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#include "swrast/s_spantemp.h"
388d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul
389d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul/* 32-bit RGB */
390d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define NAME(PREFIX) PREFIX##_RGB32
391d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define RB_TYPE GLfloat
392d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define SPAN_VARS \
393d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   const OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
394d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define INIT_PIXEL_PTR(P, X, Y) \
395d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   GLfloat *P = (GLfloat *) osmesa->rowaddr[Y] + 3 * (X)
396d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define INC_PIXEL_PTR(P) P += 3
397d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define STORE_PIXEL(DST, X, Y, VALUE) \
398d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   DST[0] = VALUE[RCOMP];  \
399d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   DST[1] = VALUE[GCOMP];  \
400d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   DST[2] = VALUE[BCOMP]
401d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define FETCH_PIXEL(DST, SRC) \
402d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   DST[RCOMP] = SRC[0];  \
403d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   DST[GCOMP] = SRC[1];  \
404d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   DST[BCOMP] = SRC[2];  \
405d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   DST[ACOMP] = 1.0F
406d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#include "swrast/s_spantemp.h"
407d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul
408d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul
409d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul/* 8-bit BGR */
410d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define NAME(PREFIX) PREFIX##_BGR8
411d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define RB_TYPE GLubyte
4129c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define SPAN_VARS \
4139c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   const OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
4149c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define INIT_PIXEL_PTR(P, X, Y) \
415d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   GLubyte *P = (GLubyte *) osmesa->rowaddr[Y] + 3 * (X)
4163340a9ea9ea31e6bd7f37d5c1f25ffcc97f20a6bBrian Paul#define INC_PIXEL_PTR(P) P += 3
417e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul#define STORE_PIXEL(DST, X, Y, VALUE) \
418e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   DST[2] = VALUE[RCOMP];  \
419e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   DST[1] = VALUE[GCOMP];  \
420e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   DST[0] = VALUE[BCOMP]
421e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul#define FETCH_PIXEL(DST, SRC) \
422e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   DST[RCOMP] = SRC[2];  \
423e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   DST[GCOMP] = SRC[1];  \
424e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   DST[BCOMP] = SRC[0];  \
425d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   DST[ACOMP] = 255
426eae0439ae6027ba64fba49fe13360d105700905fBrian Paul#include "swrast/s_spantemp.h"
4279c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul
428d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul/* 16-bit BGR */
429d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define NAME(PREFIX) PREFIX##_BGR16
430d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define RB_TYPE GLushort
431d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define SPAN_VARS \
432d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   const OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
433d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define INIT_PIXEL_PTR(P, X, Y) \
434d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   GLushort *P = (GLushort *) osmesa->rowaddr[Y] + 3 * (X)
435d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define INC_PIXEL_PTR(P) P += 3
436d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define STORE_PIXEL(DST, X, Y, VALUE) \
437d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   DST[2] = VALUE[RCOMP];  \
438d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   DST[1] = VALUE[GCOMP];  \
439d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   DST[0] = VALUE[BCOMP]
440d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define FETCH_PIXEL(DST, SRC) \
441d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   DST[RCOMP] = SRC[2];  \
442d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   DST[GCOMP] = SRC[1];  \
443d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   DST[BCOMP] = SRC[0];  \
444d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   DST[ACOMP] = 65535
445d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#include "swrast/s_spantemp.h"
446d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul
447d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul/* 32-bit BGR */
448d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define NAME(PREFIX) PREFIX##_BGR32
449d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define RB_TYPE GLfloat
450d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define SPAN_VARS \
451d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   const OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
452d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define INIT_PIXEL_PTR(P, X, Y) \
453d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   GLfloat *P = (GLfloat *) osmesa->rowaddr[Y] + 3 * (X)
454d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define INC_PIXEL_PTR(P) P += 3
455d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define STORE_PIXEL(DST, X, Y, VALUE) \
456d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   DST[2] = VALUE[RCOMP];  \
457d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   DST[1] = VALUE[GCOMP];  \
458d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   DST[0] = VALUE[BCOMP]
459d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define FETCH_PIXEL(DST, SRC) \
460d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   DST[RCOMP] = SRC[2];  \
461d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   DST[GCOMP] = SRC[1];  \
462d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   DST[BCOMP] = SRC[0];  \
463d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   DST[ACOMP] = 1.0F
464d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#include "swrast/s_spantemp.h"
465d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul
466d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul
467d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul/* 16-bit 5/6/5 RGB */
4689c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define NAME(PREFIX) PREFIX##_RGB_565
469d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define RB_TYPE GLubyte
4709c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define SPAN_VARS \
4719c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   const OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
4729c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define INIT_PIXEL_PTR(P, X, Y) \
4739c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   GLushort *P = (GLushort *) osmesa->rowaddr[Y] + (X)
4749c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define INC_PIXEL_PTR(P) P += 1
475e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul#define STORE_PIXEL(DST, X, Y, VALUE) \
476e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   *DST = ( (((VALUE[RCOMP]) & 0xf8) << 8) | (((VALUE[GCOMP]) & 0xfc) << 3) | ((VALUE[BCOMP]) >> 3) )
477e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul#define FETCH_PIXEL(DST, SRC) \
478e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   DST[RCOMP] = ( (((*SRC) >> 8) & 0xf8) | (((*SRC) >> 11) & 0x7) ); \
479e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   DST[GCOMP] = ( (((*SRC) >> 3) & 0xfc) | (((*SRC) >>  5) & 0x3) ); \
480e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   DST[BCOMP] = ( (((*SRC) << 3) & 0xf8) | (((*SRC)      ) & 0x7) ); \
481e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   DST[ACOMP] = CHAN_MAX
482eae0439ae6027ba64fba49fe13360d105700905fBrian Paul#include "swrast/s_spantemp.h"
483d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul
4849c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul
4859c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul/* color index */
4869c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define NAME(PREFIX) PREFIX##_CI
487d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define CI_MODE
488d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define RB_TYPE GLubyte
4899c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define SPAN_VARS \
4909c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   const OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
4919c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define INIT_PIXEL_PTR(P, X, Y) \
4925704b8e57a0c618ddf51502e99e9dbd48cc3e685Brian Paul   GLubyte *P = (GLubyte *) osmesa->rowaddr[Y] + (X)
4939c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define INC_PIXEL_PTR(P) P += 1
494e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul#define STORE_PIXEL(DST, X, Y, VALUE) \
495e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   *DST = VALUE[0]
496e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul#define FETCH_PIXEL(DST, SRC) \
497e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   DST = SRC[0]
498eae0439ae6027ba64fba49fe13360d105700905fBrian Paul#include "swrast/s_spantemp.h"
499e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul
500e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul
5011e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell
5021e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell
50320215ecc7ded503d7d9cb6e8ba2f7a9c1621dd15Brian Paul/**
50420215ecc7ded503d7d9cb6e8ba2f7a9c1621dd15Brian Paul * Macros for optimized line/triangle rendering.
50520215ecc7ded503d7d9cb6e8ba2f7a9c1621dd15Brian Paul * Only for 8-bit channel, RGBA, BGRA, ARGB formats.
50620215ecc7ded503d7d9cb6e8ba2f7a9c1621dd15Brian Paul */
507afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
5089c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define PACK_RGBA(DST, R, G, B, A)	\
5099c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Pauldo {					\
5109c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   (DST)[osmesa->rInd] = R;		\
5119c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   (DST)[osmesa->gInd] = G;		\
5129c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   (DST)[osmesa->bInd] = B;		\
5139c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   (DST)[osmesa->aInd] = A;		\
5149c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul} while (0)
5159c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul
516d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define PIXELADDR4(X,Y)  ((GLchan *) osmesa->rowaddr[Y] + 4 * (X))
517afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
5182bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul
51920215ecc7ded503d7d9cb6e8ba2f7a9c1621dd15Brian Paul/**
5209c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * Draw a flat-shaded, RGB line into an osmesa buffer.
521afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */
52222a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul#define NAME flat_rgba_line
52322a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul#define CLIP_HACK 1
52422a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul#define SETUP_CODE						\
52522a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul   const OSMesaContext osmesa = OSMESA_CONTEXT(ctx);		\
5269c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   const GLchan *color = vert1->color;
527709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell
5289c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define PLOT(X, Y)						\
5299c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Pauldo {								\
5309c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   GLchan *p = PIXELADDR4(X, Y);				\
5319c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   PACK_RGBA(p, color[0], color[1], color[2], color[3]);	\
5329c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul} while (0)
533afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
5349c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#ifdef WIN32
5359c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#include "..\swrast\s_linetemp.h"
5369c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#else
5379c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#include "swrast/s_linetemp.h"
5389c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#endif
53922a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul
540afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
541afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
54220215ecc7ded503d7d9cb6e8ba2f7a9c1621dd15Brian Paul/**
5439c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * Draw a flat-shaded, Z-less, RGB line into an osmesa buffer.
544afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */
54522a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul#define NAME flat_rgba_z_line
54622a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul#define CLIP_HACK 1
5479c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define INTERP_Z 1
5489c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE
54922a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul#define SETUP_CODE					\
55022a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul   const OSMesaContext osmesa = OSMESA_CONTEXT(ctx);	\
55122a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul   const GLchan *color = vert1->color;
55222a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul
5539c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define PLOT(X, Y)					\
5549c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Pauldo {							\
5559c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   if (Z < *zPtr) {					\
5569c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      GLchan *p = PIXELADDR4(X, Y);			\
5579c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      PACK_RGBA(p, color[RCOMP], color[GCOMP],		\
5589c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul                   color[BCOMP], color[ACOMP]);		\
5599c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      *zPtr = Z;					\
5609c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   }							\
5619c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul} while (0)
56274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul
5639c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#ifdef WIN32
5649c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#include "..\swrast\s_linetemp.h"
5659c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#else
5669c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#include "swrast/s_linetemp.h"
5679c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#endif
568206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul
569afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
570afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
571d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul/**
5729c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * Analyze context state to see if we can provide a fast line drawing
573d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul * function.  Otherwise, return NULL.
5749c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul */
5759c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paulstatic swrast_line_func
5769c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paulosmesa_choose_line_function( GLcontext *ctx )
577afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
5789c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   const OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
5799c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   const SWcontext *swrast = SWRAST_CONTEXT(ctx);
580afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
581544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul   if (osmesa->rb->DataType != GL_UNSIGNED_BYTE)
582544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul      return NULL;
583544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul
5849c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   if (ctx->RenderMode != GL_RENDER)      return NULL;
5859c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   if (ctx->Line.SmoothFlag)              return NULL;
5869c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   if (ctx->Texture._EnabledUnits)        return NULL;
5879c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   if (ctx->Light.ShadeModel != GL_FLAT)  return NULL;
5889c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   if (ctx->Line.Width != 1.0F)           return NULL;
5899c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   if (ctx->Line.StippleFlag)             return NULL;
5909c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   if (ctx->Line.SmoothFlag)              return NULL;
5919c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   if (osmesa->format != OSMESA_RGBA &&
5929c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul       osmesa->format != OSMESA_BGRA &&
5939c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul       osmesa->format != OSMESA_ARGB)     return NULL;
5949c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul
5959c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   if (swrast->_RasterMask==DEPTH_BIT
5969c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul       && ctx->Depth.Func==GL_LESS
5979c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul       && ctx->Depth.Mask==GL_TRUE
5989c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul       && ctx->Visual.depthBits == DEFAULT_SOFTWARE_DEPTH_BITS) {
5999c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      return (swrast_line_func) flat_rgba_z_line;
600afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
601afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
6029c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   if (swrast->_RasterMask == 0) {
6039c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      return (swrast_line_func) flat_rgba_line;
604afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
6059c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul
6069c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   return (swrast_line_func) NULL;
607afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
608afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
6099c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul
6109c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul/**********************************************************************/
6119c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul/*****                 Optimized triangle rendering               *****/
6129c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul/**********************************************************************/
6139c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul
6149c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul
61523ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank/*
6169c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * Smooth-shaded, z-less triangle, RGBA color.
61723ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank */
6189c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define NAME smooth_rgba_z_triangle
6199c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define INTERP_Z 1
6209c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE
6219c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define INTERP_RGB 1
6229c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define INTERP_ALPHA 1
6239c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define SETUP_CODE \
6249c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   const OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
6255bdec89da520f763b6d0faad1781f64566a97fddKarl Schultz#define RENDER_SPAN( span ) {					\
6269c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   GLuint i;							\
6279c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   GLchan *img = PIXELADDR4(span.x, span.y); 			\
6289c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   for (i = 0; i < span.end; i++, img += 4) {			\
6294092fbd55ac92a59d09d5167ced328683bed049cBrian Paul      const GLuint z = FixedToDepth(span.z);			\
6309c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      if (z < zRow[i]) {					\
6319c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         PACK_RGBA(img, FixedToChan(span.red),			\
6329c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul            FixedToChan(span.green), FixedToChan(span.blue),	\
6339c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul            FixedToChan(span.alpha));				\
6349c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         zRow[i] = z;						\
6359c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      }								\
6369c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      span.red += span.redStep;					\
6379c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      span.green += span.greenStep;				\
6389c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      span.blue += span.blueStep;				\
6399c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      span.alpha += span.alphaStep;				\
6409c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      span.z += span.zStep;					\
6415bdec89da520f763b6d0faad1781f64566a97fddKarl Schultz   }                                                            \
6425bdec89da520f763b6d0faad1781f64566a97fddKarl Schultz}
6439c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#ifdef WIN32
6449c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#include "..\swrast\s_tritemp.h"
6459c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#else
6469c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#include "swrast/s_tritemp.h"
6479c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#endif
64801dc182ee86922845ba0b17a2cda9af19150c93aBrian Paul
649afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
650afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
651afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/*
6529c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * Flat-shaded, z-less triangle, RGBA color.
653afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */
6549c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define NAME flat_rgba_z_triangle
6559c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define INTERP_Z 1
6569c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE
6579c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define SETUP_CODE						\
6589c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   const OSMesaContext osmesa = OSMESA_CONTEXT(ctx);		\
6599c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   GLuint pixel;						\
6609c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   PACK_RGBA((GLchan *) &pixel, v2->color[0], v2->color[1],	\
6619c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul                                v2->color[2], v2->color[3]);
662afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
6635bdec89da520f763b6d0faad1781f64566a97fddKarl Schultz#define RENDER_SPAN( span ) {				\
6649c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   GLuint i;						\
6659c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   GLuint *img = (GLuint *) PIXELADDR4(span.x, span.y);	\
6669c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   for (i = 0; i < span.end; i++) {			\
6674092fbd55ac92a59d09d5167ced328683bed049cBrian Paul      const GLuint z = FixedToDepth(span.z);		\
6689c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      if (z < zRow[i]) {				\
6699c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         img[i] = pixel;				\
6709c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         zRow[i] = z;					\
6719c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      }							\
6729c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      span.z += span.zStep;				\
6735bdec89da520f763b6d0faad1781f64566a97fddKarl Schultz   }                                                    \
6745bdec89da520f763b6d0faad1781f64566a97fddKarl Schultz}
6759c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#ifdef WIN32
6769c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#include "..\swrast\s_tritemp.h"
6774336c28c843923db3d9c8dc0a0cb2440ba94f064Brian Paul#else
6789c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#include "swrast/s_tritemp.h"
6794336c28c843923db3d9c8dc0a0cb2440ba94f064Brian Paul#endif
68074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul
681afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
682afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
683d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul/**
684d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul * Return pointer to an optimized triangle function if possible.
6859c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul */
6869c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paulstatic swrast_tri_func
6879c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paulosmesa_choose_triangle_function( GLcontext *ctx )
688afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
6899c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   const OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
6909c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   const SWcontext *swrast = SWRAST_CONTEXT(ctx);
691dd020f13a6d520b46aefd4453dae6b6edcc427f6Brian Paul
692544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul   if (osmesa->rb->DataType != GL_UNSIGNED_BYTE)
693544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul      return (swrast_tri_func) NULL;
694544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul
6959c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   if (ctx->RenderMode != GL_RENDER)    return (swrast_tri_func) NULL;
6969c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   if (ctx->Polygon.SmoothFlag)         return (swrast_tri_func) NULL;
6979c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   if (ctx->Polygon.StippleFlag)        return (swrast_tri_func) NULL;
6989c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   if (ctx->Texture._EnabledUnits)      return (swrast_tri_func) NULL;
6999c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   if (osmesa->format != OSMESA_RGBA &&
7009c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul       osmesa->format != OSMESA_BGRA &&
7019c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul       osmesa->format != OSMESA_ARGB)   return (swrast_tri_func) NULL;
7029c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   if (ctx->Polygon.CullFlag &&
7039c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul       ctx->Polygon.CullFaceMode == GL_FRONT_AND_BACK)
7049c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul                                        return (swrast_tri_func) NULL;
70574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul
7069c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   if (swrast->_RasterMask == DEPTH_BIT &&
7079c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul       ctx->Depth.Func == GL_LESS &&
7089c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul       ctx->Depth.Mask == GL_TRUE &&
7099c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul       ctx->Visual.depthBits == DEFAULT_SOFTWARE_DEPTH_BITS) {
7109c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      if (ctx->Light.ShadeModel == GL_SMOOTH) {
7119c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         return (swrast_tri_func) smooth_rgba_z_triangle;
7129c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      }
7139c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      else {
7149c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         return (swrast_tri_func) flat_rgba_z_triangle;
715afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
716afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
7179c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   return (swrast_tri_func) NULL;
718afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
719afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
720afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
721afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
7229c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul/* Override for the swrast triangle-selection function.  Try to use one
7239c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * of our internal triangle functions, otherwise fall back to the
7249c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * standard swrast functions.
7259c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul */
7269c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paulstatic void
7279c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paulosmesa_choose_triangle( GLcontext *ctx )
728afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
7299c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   SWcontext *swrast = SWRAST_CONTEXT(ctx);
730afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
7319c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   swrast->Triangle = osmesa_choose_triangle_function( ctx );
7329c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   if (!swrast->Triangle)
7339c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      _swrast_choose_triangle( ctx );
7349c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul}
735afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
73674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void
7379c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paulosmesa_choose_line( GLcontext *ctx )
738afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
7399c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   SWcontext *swrast = SWRAST_CONTEXT(ctx);
7409c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul
7419c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   swrast->Line = osmesa_choose_line_function( ctx );
7429c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   if (!swrast->Line)
7439c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      _swrast_choose_line( ctx );
744afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
745afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
746afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
747544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul
748544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul/**
749544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul * Recompute the values of the context's rowaddr array.
750544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul */
751544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paulstatic void
752544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paulcompute_row_addresses( OSMesaContext osmesa )
753544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul{
754544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul   GLint bytesPerPixel, bytesPerRow, i;
755544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul   GLubyte *origin = (GLubyte *) osmesa->rb->Data;
756544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul   GLint bpc; /* bytes per channel */
757544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul   GLint rowlength; /* in pixels */
758544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul   GLint height = osmesa->rb->Height;
759544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul
760544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul   if (osmesa->userRowLength)
761544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul      rowlength = osmesa->userRowLength;
762544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul   else
763544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul      rowlength = osmesa->rb->Width;
764544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul
765544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul   if (osmesa->rb->DataType == GL_UNSIGNED_BYTE)
766544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul      bpc = 1;
767544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul   else if (osmesa->rb->DataType == GL_UNSIGNED_SHORT)
768544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul      bpc = 2;
769544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul   else if (osmesa->rb->DataType == GL_FLOAT)
770544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul      bpc = 4;
771544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul   else {
772544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul      _mesa_problem(&osmesa->mesa,
773544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul                    "Unexpected datatype in osmesa::compute_row_addresses");
774544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul      return;
775544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul   }
776544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul
777544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul   if (osmesa->format == OSMESA_COLOR_INDEX) {
778544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul      /* CI mode */
779544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul      bytesPerPixel = 1 * sizeof(GLubyte);
780544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul   }
781544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul   else if ((osmesa->format == OSMESA_RGB) || (osmesa->format == OSMESA_BGR)) {
782544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul      /* RGB mode */
783544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul      bytesPerPixel = 3 * bpc;
784544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul   }
785544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul   else if (osmesa->format == OSMESA_RGB_565) {
786544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul      /* 5/6/5 RGB pixel in 16 bits */
787544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul      bytesPerPixel = 2;
788544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul   }
789544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul   else {
790544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul      /* RGBA mode */
791544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul      bytesPerPixel = 4 * bpc;
792544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul   }
793544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul
794544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul   bytesPerRow = rowlength * bytesPerPixel;
795544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul
796544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul   if (osmesa->yup) {
797544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul      /* Y=0 is bottom line of window */
798544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul      for (i = 0; i < height; i++) {
799544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul         osmesa->rowaddr[i] = (GLvoid *) ((GLubyte *) origin + i * bytesPerRow);
800544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul      }
801544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul   }
802544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul   else {
803544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul      /* Y=0 is top line of window */
804544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul      for (i = 0; i < height; i++) {
805544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul         GLint j = height - i - 1;
806544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul         osmesa->rowaddr[i] = (GLvoid *) ((GLubyte *) origin + j * bytesPerRow);
807544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul      }
808544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul   }
809544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul}
810544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul
811544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul
812544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul
813e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul/**
814e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul * Don't use _mesa_delete_renderbuffer since we can't free rb->Data.
815e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul */
81674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void
817e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paulosmesa_delete_renderbuffer(struct gl_renderbuffer *rb)
818afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
819e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   _mesa_free(rb);
820e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul}
821e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul
822e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul
823e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul/**
824e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul * Allocate renderbuffer storage.  We don't actually allocate any storage
825e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul * since we're using a user-provided buffer.
826e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul * Just set up all the gl_renderbuffer methods.
827e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul */
828e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paulstatic GLboolean
829e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paulosmesa_renderbuffer_storage(GLcontext *ctx, struct gl_renderbuffer *rb,
830e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul                            GLenum internalFormat, GLuint width, GLuint height)
831e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul{
832e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   const OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
833d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   GLint bpc; /* bits per channel */
834d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul
835d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   if (rb->DataType == GL_UNSIGNED_BYTE)
836d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul      bpc = 8;
837d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   else if (rb->DataType == GL_UNSIGNED_SHORT)
838d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul      bpc = 16;
839d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   else
840d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul      bpc = 32;
841e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul
842544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul   rb->RedBits =
843544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul   rb->GreenBits =
844544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul   rb->BlueBits =
845544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul   rb->AlphaBits = bpc;
846544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul
8479e81d6ae3a6db9831d6aea0fe4d92722176e9f74Brian Paul   /* Note: we can ignoring internalFormat for "window-system" renderbuffers */
8485bdc6fdebc0ab59a888fba15136eb4a0ee2790e1Brian Paul   (void) internalFormat;
8495bdc6fdebc0ab59a888fba15136eb4a0ee2790e1Brian Paul
850e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   if (osmesa->format == OSMESA_RGBA) {
851d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul      if (rb->DataType == GL_UNSIGNED_BYTE) {
852d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul         rb->GetRow = get_row_RGBA8;
853d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul         rb->GetValues = get_values_RGBA8;
854d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul         rb->PutRow = put_row_RGBA8;
855d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul         rb->PutRowRGB = put_row_rgb_RGBA8;
856d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul         rb->PutMonoRow = put_mono_row_RGBA8;
857d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul         rb->PutValues = put_values_RGBA8;
858d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul         rb->PutMonoValues = put_mono_values_RGBA8;
859d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul      }
860d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul      else if (rb->DataType == GL_UNSIGNED_SHORT) {
861d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul         rb->GetRow = get_row_RGBA16;
862d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul         rb->GetValues = get_values_RGBA16;
863d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul         rb->PutRow = put_row_RGBA16;
864d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul         rb->PutRowRGB = put_row_rgb_RGBA16;
865d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul         rb->PutMonoRow = put_mono_row_RGBA16;
866d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul         rb->PutValues = put_values_RGBA16;
867d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul         rb->PutMonoValues = put_mono_values_RGBA16;
868d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul      }
869d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul      else {
870d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul         rb->GetRow = get_row_RGBA32;
871d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul         rb->GetValues = get_values_RGBA32;
872d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul         rb->PutRow = put_row_RGBA32;
873d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul         rb->PutRowRGB = put_row_rgb_RGBA32;
874d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul         rb->PutMonoRow = put_mono_row_RGBA32;
875d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul         rb->PutValues = put_values_RGBA32;
876d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul         rb->PutMonoValues = put_mono_values_RGBA32;
877d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul      }
878d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul      rb->RedBits = rb->GreenBits = rb->BlueBits = rb->AlphaBits = bpc;
879e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   }
880e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   else if (osmesa->format == OSMESA_BGRA) {
881d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul      if (rb->DataType == GL_UNSIGNED_BYTE) {
882d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul         rb->GetRow = get_row_BGRA8;
883d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul         rb->GetValues = get_values_BGRA8;
884d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul         rb->PutRow = put_row_BGRA8;
885d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul         rb->PutRowRGB = put_row_rgb_BGRA8;
886d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul         rb->PutMonoRow = put_mono_row_BGRA8;
887d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul         rb->PutValues = put_values_BGRA8;
888d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul         rb->PutMonoValues = put_mono_values_BGRA8;
889d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul      }
890d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul      else if (rb->DataType == GL_UNSIGNED_SHORT) {
891d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul         rb->GetRow = get_row_BGRA16;
892d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul         rb->GetValues = get_values_BGRA16;
893d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul         rb->PutRow = put_row_BGRA16;
894d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul         rb->PutRowRGB = put_row_rgb_BGRA16;
895d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul         rb->PutMonoRow = put_mono_row_BGRA16;
896d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul         rb->PutValues = put_values_BGRA16;
897d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul         rb->PutMonoValues = put_mono_values_BGRA16;
898d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul      }
899d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul      else {
900d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul         rb->GetRow = get_row_BGRA32;
901d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul         rb->GetValues = get_values_BGRA32;
902d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul         rb->PutRow = put_row_BGRA32;
903d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul         rb->PutRowRGB = put_row_rgb_BGRA32;
904d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul         rb->PutMonoRow = put_mono_row_BGRA32;
905d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul         rb->PutValues = put_values_BGRA32;
906d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul         rb->PutMonoValues = put_mono_values_BGRA32;
907d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul      }
908d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul      rb->RedBits = rb->GreenBits = rb->BlueBits = rb->AlphaBits = bpc;
909e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   }
910e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   else if (osmesa->format == OSMESA_ARGB) {
911d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul      if (rb->DataType == GL_UNSIGNED_BYTE) {
912d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul         rb->GetRow = get_row_ARGB8;
913d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul         rb->GetValues = get_values_ARGB8;
914d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul         rb->PutRow = put_row_ARGB8;
915d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul         rb->PutRowRGB = put_row_rgb_ARGB8;
916d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul         rb->PutMonoRow = put_mono_row_ARGB8;
917d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul         rb->PutValues = put_values_ARGB8;
918d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul         rb->PutMonoValues = put_mono_values_ARGB8;
919d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul      }
920d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul      else if (rb->DataType == GL_UNSIGNED_SHORT) {
921d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul         rb->GetRow = get_row_ARGB16;
922d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul         rb->GetValues = get_values_ARGB16;
923d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul         rb->PutRow = put_row_ARGB16;
924d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul         rb->PutRowRGB = put_row_rgb_ARGB16;
925d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul         rb->PutMonoRow = put_mono_row_ARGB16;
926d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul         rb->PutValues = put_values_ARGB16;
927d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul         rb->PutMonoValues = put_mono_values_ARGB16;
928d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul      }
929d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul      else {
930d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul         rb->GetRow = get_row_ARGB32;
931d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul         rb->GetValues = get_values_ARGB32;
932d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul         rb->PutRow = put_row_ARGB32;
933d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul         rb->PutRowRGB = put_row_rgb_ARGB32;
934d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul         rb->PutMonoRow = put_mono_row_ARGB32;
935d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul         rb->PutValues = put_values_ARGB32;
936d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul         rb->PutMonoValues = put_mono_values_ARGB32;
937d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul      }
938d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul      rb->RedBits = rb->GreenBits = rb->BlueBits = rb->AlphaBits = bpc;
939e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   }
940e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   else if (osmesa->format == OSMESA_RGB) {
941d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul      if (rb->DataType == GL_UNSIGNED_BYTE) {
942d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul         rb->GetRow = get_row_RGB8;
943d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul         rb->GetValues = get_values_RGB8;
944d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul         rb->PutRow = put_row_RGB8;
945d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul         rb->PutRowRGB = put_row_rgb_RGB8;
946d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul         rb->PutMonoRow = put_mono_row_RGB8;
947d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul         rb->PutValues = put_values_RGB8;
948d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul         rb->PutMonoValues = put_mono_values_RGB8;
949d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul      }
950d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul      else if (rb->DataType == GL_UNSIGNED_SHORT) {
951d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul         rb->GetRow = get_row_RGB16;
952d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul         rb->GetValues = get_values_RGB16;
953d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul         rb->PutRow = put_row_RGB16;
954d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul         rb->PutRowRGB = put_row_rgb_RGB16;
955d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul         rb->PutMonoRow = put_mono_row_RGB16;
956d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul         rb->PutValues = put_values_RGB16;
957d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul         rb->PutMonoValues = put_mono_values_RGB16;
958d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul      }
959d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul      else {
960d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul         rb->GetRow = get_row_RGB32;
961d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul         rb->GetValues = get_values_RGB32;
962d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul         rb->PutRow = put_row_RGB32;
963d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul         rb->PutRowRGB = put_row_rgb_RGB32;
964d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul         rb->PutMonoRow = put_mono_row_RGB32;
965d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul         rb->PutValues = put_values_RGB32;
966d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul         rb->PutMonoValues = put_mono_values_RGB32;
967d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul      }
968d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul      rb->RedBits = rb->GreenBits = rb->BlueBits = bpc;
969afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
9709c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   else if (osmesa->format == OSMESA_BGR) {
971d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul      if (rb->DataType == GL_UNSIGNED_BYTE) {
972d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul         rb->GetRow = get_row_BGR8;
973d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul         rb->GetValues = get_values_BGR8;
974d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul         rb->PutRow = put_row_BGR8;
975d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul         rb->PutRowRGB = put_row_rgb_BGR8;
976d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul         rb->PutMonoRow = put_mono_row_BGR8;
977d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul         rb->PutValues = put_values_BGR8;
978d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul         rb->PutMonoValues = put_mono_values_BGR8;
979d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul      }
980d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul      else if (rb->DataType == GL_UNSIGNED_SHORT) {
981d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul         rb->GetRow = get_row_BGR16;
982d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul         rb->GetValues = get_values_BGR16;
983d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul         rb->PutRow = put_row_BGR16;
984d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul         rb->PutRowRGB = put_row_rgb_BGR16;
985d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul         rb->PutMonoRow = put_mono_row_BGR16;
986d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul         rb->PutValues = put_values_BGR16;
987d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul         rb->PutMonoValues = put_mono_values_BGR16;
988d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul      }
989d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul      else {
990d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul         rb->GetRow = get_row_BGR32;
991d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul         rb->GetValues = get_values_BGR32;
992d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul         rb->PutRow = put_row_BGR32;
993d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul         rb->PutRowRGB = put_row_rgb_BGR32;
994d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul         rb->PutMonoRow = put_mono_row_BGR32;
995d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul         rb->PutValues = put_values_BGR32;
996d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul         rb->PutMonoValues = put_mono_values_BGR32;
997d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul      }
998d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul      rb->RedBits = rb->GreenBits = rb->BlueBits = bpc;
9999c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   }
10009c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   else if (osmesa->format == OSMESA_RGB_565) {
1001d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul      ASSERT(rb->DataType == GL_UNSIGNED_BYTE);
1002e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      rb->GetRow = get_row_RGB_565;
1003e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      rb->GetValues = get_values_RGB_565;
1004e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      rb->PutRow = put_row_RGB_565;
10050ad1bda7a1f7d88556dd458e532815ff28c898aeDaniel Borca      rb->PutRowRGB = put_row_rgb_RGB_565;
1006e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      rb->PutMonoRow = put_mono_row_RGB_565;
1007e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      rb->PutValues = put_values_RGB_565;
1008e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      rb->PutMonoValues = put_mono_values_RGB_565;
10099e81d6ae3a6db9831d6aea0fe4d92722176e9f74Brian Paul      rb->RedBits = 5;
10109e81d6ae3a6db9831d6aea0fe4d92722176e9f74Brian Paul      rb->GreenBits = 6;
10119e81d6ae3a6db9831d6aea0fe4d92722176e9f74Brian Paul      rb->BlueBits = 5;
10129c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   }
10139c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   else if (osmesa->format == OSMESA_COLOR_INDEX) {
1014e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      rb->GetRow = get_row_CI;
1015e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      rb->GetValues = get_values_CI;
1016e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      rb->PutRow = put_row_CI;
1017e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      rb->PutMonoRow = put_mono_row_CI;
1018e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      rb->PutValues = put_values_CI;
1019e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      rb->PutMonoValues = put_mono_values_CI;
10209e81d6ae3a6db9831d6aea0fe4d92722176e9f74Brian Paul      rb->IndexBits = 8;
10219c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   }
10229c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   else {
1023e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      _mesa_problem(ctx, "bad pixel format in osmesa renderbuffer_storage");
1024afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
1025afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1026b100484145d3518e4896d756b1ceccf61382c569Daniel Borca   rb->Width = width;
1027b100484145d3518e4896d756b1ceccf61382c569Daniel Borca   rb->Height = height;
1028b100484145d3518e4896d756b1ceccf61382c569Daniel Borca
1029544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul   compute_row_addresses( osmesa );
1030544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul
1031e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   return GL_TRUE;
1032afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
1033afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1034afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1035e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul/**
1036ed875a4cb3cf194637d696b2660b98fdc3b95b0fBrian Paul * Allocate a new renderbuffer to describe the user-provided color buffer.
1037e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul */
1038e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paulstatic struct gl_renderbuffer *
1039d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paulnew_osmesa_renderbuffer(GLcontext *ctx, GLenum format, GLenum type)
1040e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul{
1041d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   const GLuint name = 0;
1042d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   struct gl_renderbuffer *rb = _mesa_new_renderbuffer(ctx, name);
1043e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   if (rb) {
1044e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      rb->Delete = osmesa_delete_renderbuffer;
1045e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      rb->AllocStorage = osmesa_renderbuffer_storage;
1046e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul
1047e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      if (format == OSMESA_COLOR_INDEX) {
1048e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul         rb->InternalFormat = GL_COLOR_INDEX;
1049d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul         rb->_ActualFormat = GL_COLOR_INDEX8_EXT;
1050d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul         rb->_BaseFormat = GL_COLOR_INDEX;
1051e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul         rb->DataType = GL_UNSIGNED_BYTE;
1052e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      }
1053e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      else {
1054e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul         rb->InternalFormat = GL_RGBA;
1055d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul         rb->_ActualFormat = GL_RGBA;
1056d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul         rb->_BaseFormat = GL_RGBA;
1057d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul         rb->DataType = type;
1058e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      }
1059e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   }
1060e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   return rb;
1061e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul}
1062e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul
10639c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul
1064afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/**********************************************************************/
10659c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul/*****                    Public Functions                        *****/
1066afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/**********************************************************************/
1067afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1068afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1069d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul/**
10709c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * Create an Off-Screen Mesa rendering context.  The only attribute needed is
10719c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * an RGBA vs Color-Index mode flag.
10729c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul *
10739c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * Input:  format - either GL_RGBA or GL_COLOR_INDEX
10749c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul *         sharelist - specifies another OSMesaContext with which to share
10759c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul *                     display lists.  NULL indicates no sharing.
10769c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * Return:  an OSMesaContext or 0 if error
10779c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul */
10789c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian PaulGLAPI OSMesaContext GLAPIENTRY
10799c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian PaulOSMesaCreateContext( GLenum format, OSMesaContext sharelist )
1080afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
10814128d88b98e22676fa05ed586da1641c85a0bde2Brian Paul   const GLint accumBits = (format == OSMESA_COLOR_INDEX) ? 0 : 16;
10829c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   return OSMesaCreateContextExt(format, DEFAULT_SOFTWARE_DEPTH_BITS,
10835dce1e5c420872ae096854841a9665f8d3d649fbBrian Paul                                 8, accumBits, sharelist);
108474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul}
108574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul
108674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul
108774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul
1088d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul/**
10899c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * New in Mesa 3.5
10909c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul *
10919c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * Create context and specify size of ancillary buffers.
10929c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul */
10939c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian PaulGLAPI OSMesaContext GLAPIENTRY
10949c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian PaulOSMesaCreateContextExt( GLenum format, GLint depthBits, GLint stencilBits,
10959c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul                        GLint accumBits, OSMesaContext sharelist )
109674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul{
10979c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   OSMesaContext osmesa;
1098d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul   struct dd_function_table functions;
10999c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   GLint rind, gind, bind, aind;
11009c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   GLint indexBits = 0, redBits = 0, greenBits = 0, blueBits = 0, alphaBits =0;
11019c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   GLboolean rgbmode;
1102d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   GLenum type = CHAN_TYPE;
1103afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
11049c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   rind = gind = bind = aind = 0;
11059c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   if (format==OSMESA_COLOR_INDEX) {
11069c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      indexBits = 8;
11079c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      rgbmode = GL_FALSE;
110874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   }
11099c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   else if (format==OSMESA_RGBA) {
11109c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      indexBits = 0;
11119c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      redBits = CHAN_BITS;
11129c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      greenBits = CHAN_BITS;
11139c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      blueBits = CHAN_BITS;
11149c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      alphaBits = CHAN_BITS;
11159c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      rind = 0;
11169c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      gind = 1;
11179c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      bind = 2;
11189c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      aind = 3;
11199c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      rgbmode = GL_TRUE;
1120afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
11219c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   else if (format==OSMESA_BGRA) {
11229c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      indexBits = 0;
11239c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      redBits = CHAN_BITS;
11249c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      greenBits = CHAN_BITS;
11259c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      blueBits = CHAN_BITS;
11269c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      alphaBits = CHAN_BITS;
11279c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      bind = 0;
11289c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      gind = 1;
11299c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      rind = 2;
11309c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      aind = 3;
11319c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      rgbmode = GL_TRUE;
1132afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
11339c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   else if (format==OSMESA_ARGB) {
11349c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      indexBits = 0;
11359c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      redBits = CHAN_BITS;
11369c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      greenBits = CHAN_BITS;
11379c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      blueBits = CHAN_BITS;
11389c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      alphaBits = CHAN_BITS;
11399c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      aind = 0;
11409c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      rind = 1;
11419c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      gind = 2;
11429c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      bind = 3;
11439c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      rgbmode = GL_TRUE;
1144206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul   }
11459c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   else if (format==OSMESA_RGB) {
11469c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      indexBits = 0;
11479c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      redBits = CHAN_BITS;
11489c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      greenBits = CHAN_BITS;
11499c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      blueBits = CHAN_BITS;
11509c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      alphaBits = 0;
11519c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      rind = 0;
11529c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      gind = 1;
11539c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      bind = 2;
11549c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      rgbmode = GL_TRUE;
1155afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
11569c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   else if (format==OSMESA_BGR) {
11579c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      indexBits = 0;
11589c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      redBits = CHAN_BITS;
11599c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      greenBits = CHAN_BITS;
11609c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      blueBits = CHAN_BITS;
11619c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      alphaBits = 0;
11629c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      rind = 2;
11639c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      gind = 1;
11649c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      bind = 0;
11659c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      rgbmode = GL_TRUE;
1166afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
1167cc9464e082b82179e3c4b51ea460212c10b2bf0cBrian Paul#if CHAN_TYPE == GL_UNSIGNED_BYTE
11689c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   else if (format==OSMESA_RGB_565) {
11699c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      indexBits = 0;
11709c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      redBits = 5;
11719c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      greenBits = 6;
11729c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      blueBits = 5;
11739c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      alphaBits = 0;
11749c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      rind = 0; /* not used */
11759c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      gind = 0;
11769c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      bind = 0;
11779c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      rgbmode = GL_TRUE;
1178afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
1179cc9464e082b82179e3c4b51ea460212c10b2bf0cBrian Paul#endif
1180afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   else {
11819c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      return NULL;
1182afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
1183afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
11849c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   osmesa = (OSMesaContext) CALLOC_STRUCT(osmesa_context);
11859c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   if (osmesa) {
11869c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      osmesa->gl_visual = _mesa_create_visual( rgbmode,
11879c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul                                               GL_FALSE,    /* double buffer */
11889c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul                                               GL_FALSE,    /* stereo */
11899c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul                                               redBits,
11909c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul                                               greenBits,
11919c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul                                               blueBits,
11929c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul                                               alphaBits,
11939c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul                                               indexBits,
11949c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul                                               depthBits,
11959c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul                                               stencilBits,
11969c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul                                               accumBits,
11979c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul                                               accumBits,
11989c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul                                               accumBits,
11999c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul                                               alphaBits ? accumBits : 0,
12009c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul                                               1            /* num samples */
12019c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul                                               );
12029c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      if (!osmesa->gl_visual) {
1203d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul         _mesa_free(osmesa);
12049c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         return NULL;
1205afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
1206afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1207d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul      /* Initialize device driver function table */
1208d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul      _mesa_init_driver_functions(&functions);
1209d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul      /* override with our functions */
1210d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul      functions.GetString = get_string;
1211d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul      functions.UpdateState = osmesa_update_state;
1212544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul      functions.GetBufferSize = NULL;
12136fafc7ad19a8b7400e57a86b588766b6f3811a05Brian Paul
12146fafc7ad19a8b7400e57a86b588766b6f3811a05Brian Paul      if (!_mesa_initialize_context(&osmesa->mesa,
12159c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul                                    osmesa->gl_visual,
12166fafc7ad19a8b7400e57a86b588766b6f3811a05Brian Paul                                    sharelist ? &sharelist->mesa
12179c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul                                              : (GLcontext *) NULL,
1218d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul                                    &functions, (void *) osmesa)) {
12199c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         _mesa_destroy_visual( osmesa->gl_visual );
1220d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul         _mesa_free(osmesa);
12219c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         return NULL;
1222afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
122374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul
12246fafc7ad19a8b7400e57a86b588766b6f3811a05Brian Paul      _mesa_enable_sw_extensions(&(osmesa->mesa));
12256fafc7ad19a8b7400e57a86b588766b6f3811a05Brian Paul      _mesa_enable_1_3_extensions(&(osmesa->mesa));
12266fafc7ad19a8b7400e57a86b588766b6f3811a05Brian Paul      _mesa_enable_1_4_extensions(&(osmesa->mesa));
122784351999ec6ad07e0cfc31c0b3a8c86da4134bfeBrian Paul      _mesa_enable_1_5_extensions(&(osmesa->mesa));
122874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul
1229e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      osmesa->gl_buffer = _mesa_create_framebuffer(osmesa->gl_visual);
12309c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      if (!osmesa->gl_buffer) {
12319c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         _mesa_destroy_visual( osmesa->gl_visual );
12326fafc7ad19a8b7400e57a86b588766b6f3811a05Brian Paul         _mesa_free_context_data( &osmesa->mesa );
1233d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul         _mesa_free(osmesa);
12349c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         return NULL;
12359c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      }
1236e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul
1237fc3bc1ae14e7aa769fe01c007a1d68f2ff6db7b8Brian Paul      /* create front color buffer in user-provided memory (no back buffer) */
1238d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul      osmesa->rb = new_osmesa_renderbuffer(&osmesa->mesa, format, type);
1239d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul      _mesa_add_renderbuffer(osmesa->gl_buffer, BUFFER_FRONT_LEFT, osmesa->rb);
1240d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul
1241e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      _mesa_add_soft_renderbuffers(osmesa->gl_buffer,
1242e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul                                   GL_FALSE, /* color */
1243e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul                                   osmesa->gl_visual->haveDepthBuffer,
1244e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul                                   osmesa->gl_visual->haveStencilBuffer,
1245e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul                                   osmesa->gl_visual->haveAccumBuffer,
1246e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul                                   GL_FALSE, /* alpha */
1247e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul                                   GL_FALSE /* aux */ );
1248e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul
12499c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      osmesa->format = format;
12509c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      osmesa->userRowLength = 0;
12519c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      osmesa->yup = GL_TRUE;
12529c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      osmesa->rInd = rind;
12539c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      osmesa->gInd = gind;
12549c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      osmesa->bInd = bind;
12559c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      osmesa->aInd = aind;
125674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul
12579c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      /* Initialize the software rasterizer and helper modules. */
12589c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      {
12596fafc7ad19a8b7400e57a86b588766b6f3811a05Brian Paul	 GLcontext *ctx = &osmesa->mesa;
1260e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul         SWcontext *swrast;
1261e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul         TNLcontext *tnl;
1262afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1263c45b7364dab6c3daebc1f1d8d11124af4129074aBrian Paul	 if (!_swrast_CreateContext( ctx ) ||
1264c45b7364dab6c3daebc1f1d8d11124af4129074aBrian Paul             !_ac_CreateContext( ctx ) ||
1265c45b7364dab6c3daebc1f1d8d11124af4129074aBrian Paul             !_tnl_CreateContext( ctx ) ||
1266c45b7364dab6c3daebc1f1d8d11124af4129074aBrian Paul             !_swsetup_CreateContext( ctx )) {
1267c45b7364dab6c3daebc1f1d8d11124af4129074aBrian Paul            _mesa_destroy_visual(osmesa->gl_visual);
1268c45b7364dab6c3daebc1f1d8d11124af4129074aBrian Paul            _mesa_free_context_data(ctx);
1269c45b7364dab6c3daebc1f1d8d11124af4129074aBrian Paul            _mesa_free(osmesa);
1270c45b7364dab6c3daebc1f1d8d11124af4129074aBrian Paul            return NULL;
1271c45b7364dab6c3daebc1f1d8d11124af4129074aBrian Paul         }
12729c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul
12739c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul	 _swsetup_Wakeup( ctx );
1274e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul
1275e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul         /* use default TCL pipeline */
1276e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul         tnl = TNL_CONTEXT(ctx);
1277e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul         tnl->Driver.RunPipeline = _tnl_run_pipeline;
1278e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul
1279e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul         /* Extend the software rasterizer with our optimized line and triangle
1280e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul          * drawing functions.
1281e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul          */
1282e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul         swrast = SWRAST_CONTEXT( ctx );
1283e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul         swrast->choose_line = osmesa_choose_line;
1284e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul         swrast->choose_triangle = osmesa_choose_triangle;
12859c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      }
1286afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
12879c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   return osmesa;
1288afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
1289afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1290afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1291d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul/**
12929c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * Destroy an Off-Screen Mesa rendering context.
12939c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul *
1294d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul * \param osmesa  the context to destroy
1295afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */
12969c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian PaulGLAPI void GLAPIENTRY
1297d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian PaulOSMesaDestroyContext( OSMesaContext osmesa )
1298afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
1299d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   if (osmesa) {
1300d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul      _swsetup_DestroyContext( &osmesa->mesa );
1301d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul      _tnl_DestroyContext( &osmesa->mesa );
1302d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul      _ac_DestroyContext( &osmesa->mesa );
1303d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul      _swrast_DestroyContext( &osmesa->mesa );
1304d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul
1305d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul      _mesa_destroy_visual( osmesa->gl_visual );
1306d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul      _mesa_destroy_framebuffer( osmesa->gl_buffer );
1307d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul      _mesa_free_context_data( &osmesa->mesa );
1308d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul      _mesa_free( osmesa );
13099c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   }
13109c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul}
1311afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1312afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1313d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul/**
13149c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * Bind an OSMesaContext to an image buffer.  The image buffer is just a
13159c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * block of memory which the client provides.  Its size must be at least
13169c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * as large as width*height*sizeof(type).  Its address should be a multiple
13179c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * of 4 if using RGBA mode.
13189c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul *
13199c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * Image data is stored in the order of glDrawPixels:  row-major order
13209c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * with the lower-left image pixel stored in the first array position
13219c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * (ie. bottom-to-top).
13229c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul *
13239c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * If the context's viewport hasn't been initialized yet, it will now be
13249c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * initialized to (0,0,width,height).
13259c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul *
1326d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul * Input:  osmesa - the rendering context
13279c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul *         buffer - the image buffer memory
13289c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul *         type - data type for pixel components
13299c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul *            Normally, only GL_UNSIGNED_BYTE and GL_UNSIGNED_SHORT_5_6_5
13309c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul *            are supported.  But if Mesa's been compiled with CHAN_BITS==16
1331d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul *            then type may be GL_UNSIGNED_SHORT or GL_UNSIGNED_BYTE.  And if
1332d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul *            Mesa's been build with CHAN_BITS==32 then type may be GL_FLOAT,
1333d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul *            GL_UNSIGNED_SHORT or GL_UNSIGNED_BYTE.
13349c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul *         width, height - size of image buffer in pixels, at least 1
1335d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul * Return:  GL_TRUE if success, GL_FALSE if error because of invalid osmesa,
13369c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul *          invalid buffer address, invalid type, width<1, height<1,
13379c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul *          width>internal limit or height>internal limit.
1338afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */
13399c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian PaulGLAPI GLboolean GLAPIENTRY
1340d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian PaulOSMesaMakeCurrent( OSMesaContext osmesa, void *buffer, GLenum type,
13419c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul                   GLsizei width, GLsizei height )
1342afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
1343d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   if (!osmesa || !buffer ||
13449c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul       width < 1 || height < 1 ||
13459c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul       width > MAX_WIDTH || height > MAX_HEIGHT) {
13469c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      return GL_FALSE;
13479c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   }
134874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul
1349d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   if (osmesa->format == OSMESA_RGB_565 && type != GL_UNSIGNED_SHORT_5_6_5) {
1350d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul      return GL_FALSE;
1351afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
1352d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul
1353544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul#if 0
1354d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   if (!(type == GL_UNSIGNED_BYTE ||
1355d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul         (type == GL_UNSIGNED_SHORT && CHAN_BITS >= 16) ||
1356d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul         (type == GL_FLOAT && CHAN_BITS == 32))) {
1357d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul      /* i.e. is sizeof(type) * 8 > CHAN_BITS? */
13589c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      return GL_FALSE;
13599c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   }
1360544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul#endif
136158f4d67703381003c23fecbd3fe114ef9d1730c3Brian Paul
1362d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   osmesa_update_state( &osmesa->mesa, 0 );
1363c6c0f947142c0cc82626c238804a68b4e8f53945Brian Paul
1364c6c0f947142c0cc82626c238804a68b4e8f53945Brian Paul   /* Call this periodically to detect when the user has begun using
1365c6c0f947142c0cc82626c238804a68b4e8f53945Brian Paul    * GL rendering from multiple threads.
1366c6c0f947142c0cc82626c238804a68b4e8f53945Brian Paul    */
1367c6c0f947142c0cc82626c238804a68b4e8f53945Brian Paul   _glapi_check_multithread();
1368c6c0f947142c0cc82626c238804a68b4e8f53945Brian Paul
1369544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul   /* Set renderbuffer fields.  Set width/height = 0 to force
1370544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul    * osmesa_renderbuffer_storage() being called by _mesa_resize_framebuffer()
1371544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul    */
1372544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul   osmesa->rb->Data = buffer;
1373544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul   osmesa->rb->DataType = type;
1374544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul   osmesa->rb->Width = osmesa->rb->Height = 0;
1375544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul
13769cbe0e24ac3772ec5db303e532166351affc91c9Brian Paul   /* Set the framebuffer's size.  This causes the
13779cbe0e24ac3772ec5db303e532166351affc91c9Brian Paul    * osmesa_renderbuffer_storage() function to get called.
13789cbe0e24ac3772ec5db303e532166351affc91c9Brian Paul    */
13799cbe0e24ac3772ec5db303e532166351affc91c9Brian Paul   _mesa_resize_framebuffer(&osmesa->mesa, osmesa->gl_buffer, width, height);
13809cbe0e24ac3772ec5db303e532166351affc91c9Brian Paul   osmesa->gl_buffer->Initialized = GL_TRUE; /* XXX TEMPORARY? */
13819cbe0e24ac3772ec5db303e532166351affc91c9Brian Paul
1382d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   _mesa_make_current( &osmesa->mesa, osmesa->gl_buffer, osmesa->gl_buffer );
138358f4d67703381003c23fecbd3fe114ef9d1730c3Brian Paul
138489ffca52ac18103ebaa754241a882ea8438ff9c4Brian Paul   /* Remove renderbuffer attachment, then re-add.  This installs the
1385544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul    * renderbuffer adaptor/wrapper if needed (for bpp conversion).
1386d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul    */
138789ffca52ac18103ebaa754241a882ea8438ff9c4Brian Paul   _mesa_remove_renderbuffer(osmesa->gl_buffer, BUFFER_FRONT_LEFT);
1388d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   _mesa_add_renderbuffer(osmesa->gl_buffer, BUFFER_FRONT_LEFT, osmesa->rb);
138974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul
139089ffca52ac18103ebaa754241a882ea8438ff9c4Brian Paul
1391d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   /* this updates the visual's red/green/blue/alphaBits fields */
1392d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   _mesa_update_framebuffer_visual(osmesa->gl_buffer);
1393d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul
1394d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   /* update the framebuffer size */
1395d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   _mesa_resize_framebuffer(&osmesa->mesa, osmesa->gl_buffer, width, height);
139674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul
13979c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   return GL_TRUE;
1398afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
1399afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
14001e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell
14011e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell
1402c5f9aa7750633e2989a6a139c283419d536ee3f7Brian PaulGLAPI OSMesaContext GLAPIENTRY
1403c5f9aa7750633e2989a6a139c283419d536ee3f7Brian PaulOSMesaGetCurrentContext( void )
14049c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul{
14059c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   GLcontext *ctx = _mesa_get_current_context();
14069c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   if (ctx)
14079c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      return (OSMesaContext) ctx;
14089c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   else
14099c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      return NULL;
14109c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul}
14112d595d70202bad560c27ea81ec71b740415b3355Brian Paul
14121e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell
14131e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell
1414c5f9aa7750633e2989a6a139c283419d536ee3f7Brian PaulGLAPI void GLAPIENTRY
1415c5f9aa7750633e2989a6a139c283419d536ee3f7Brian PaulOSMesaPixelStore( GLint pname, GLint value )
14161e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell{
14179c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   OSMesaContext osmesa = OSMesaGetCurrentContext();
1418dbd1e2b5990a3689bf718296c57c14fc3ba38db5Jouk Jansen
14199c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   switch (pname) {
14209c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      case OSMESA_ROW_LENGTH:
14219c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         if (value<0) {
14226fafc7ad19a8b7400e57a86b588766b6f3811a05Brian Paul            _mesa_error( &osmesa->mesa, GL_INVALID_VALUE,
14239c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul                      "OSMesaPixelStore(value)" );
14249c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul            return;
14259c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         }
14269c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         osmesa->userRowLength = value;
14279c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         break;
14289c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      case OSMESA_Y_UP:
14299c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         osmesa->yup = value ? GL_TRUE : GL_FALSE;
14309c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         break;
14319c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      default:
14326fafc7ad19a8b7400e57a86b588766b6f3811a05Brian Paul         _mesa_error( &osmesa->mesa, GL_INVALID_ENUM, "OSMesaPixelStore(pname)" );
14339c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         return;
14349c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   }
1435dbd1e2b5990a3689bf718296c57c14fc3ba38db5Jouk Jansen
14369c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   compute_row_addresses( osmesa );
14371e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell}
1438ed30dfa1264ec8875a3162c3c8778bc703bf11d5Brian Paul
1439ed30dfa1264ec8875a3162c3c8778bc703bf11d5Brian Paul
1440c5f9aa7750633e2989a6a139c283419d536ee3f7Brian PaulGLAPI void GLAPIENTRY
1441c5f9aa7750633e2989a6a139c283419d536ee3f7Brian PaulOSMesaGetIntegerv( GLint pname, GLint *value )
1442afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
14439c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   OSMesaContext osmesa = OSMesaGetCurrentContext();
14449c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul
14459c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   switch (pname) {
14469c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      case OSMESA_WIDTH:
1447544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul         if (osmesa->gl_buffer)
1448544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul            *value = osmesa->gl_buffer->Width;
1449544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul         else
1450544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul            *value = 0;
14519c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         return;
14529c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      case OSMESA_HEIGHT:
1453544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul         if (osmesa->gl_buffer)
1454544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul            *value = osmesa->gl_buffer->Height;
1455544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul         else
1456544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul            *value = 0;
14579c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         return;
14589c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      case OSMESA_FORMAT:
14599c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         *value = osmesa->format;
14609c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         return;
14619c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      case OSMESA_TYPE:
1462d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul         /* current color buffer's data type */
1463d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul         if (osmesa->rb) {
1464d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul            *value = osmesa->rb->DataType;
1465d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul         }
1466d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul         else {
1467d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul            *value = 0;
1468d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul         }
14699c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         return;
14709c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      case OSMESA_ROW_LENGTH:
14719c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         *value = osmesa->userRowLength;
14729c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         return;
14739c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      case OSMESA_Y_UP:
14749c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         *value = osmesa->yup;
14759c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         return;
14769c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      case OSMESA_MAX_WIDTH:
14779c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         *value = MAX_WIDTH;
14789c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         return;
14799c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      case OSMESA_MAX_HEIGHT:
14809c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         *value = MAX_HEIGHT;
14819c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         return;
1482afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      default:
14836fafc7ad19a8b7400e57a86b588766b6f3811a05Brian Paul         _mesa_error(&osmesa->mesa, GL_INVALID_ENUM, "OSMesaGetIntergerv(pname)");
14849c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         return;
1485afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
1486afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
1487afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1488d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul
1489d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul/**
14909c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * Return the depth buffer associated with an OSMesa context.
14919c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * Input:  c - the OSMesa context
14929c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * Output:  width, height - size of buffer in pixels
14939c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul *          bytesPerValue - bytes per depth value (2 or 4)
14949c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul *          buffer - pointer to depth buffer values
14959c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * Return:  GL_TRUE or GL_FALSE to indicate success or failure.
14969c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul */
14979c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian PaulGLAPI GLboolean GLAPIENTRY
14989c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian PaulOSMesaGetDepthBuffer( OSMesaContext c, GLint *width, GLint *height,
14999c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul                      GLint *bytesPerValue, void **buffer )
1500afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
1501e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   struct gl_renderbuffer *rb = NULL;
1502e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul
1503e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   if (c->gl_buffer)
1504e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      rb = c->gl_buffer->Attachment[BUFFER_DEPTH].Renderbuffer;
1505e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul
1506e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   if (!rb || !rb->Data) {
15079c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      *width = 0;
15089c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      *height = 0;
15099c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      *bytesPerValue = 0;
15109c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      *buffer = 0;
15119c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      return GL_FALSE;
151274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   }
15139c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   else {
1514544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul      *width = rb->Width;
1515544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul      *height = rb->Height;
15169c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      if (c->gl_visual->depthBits <= 16)
15179c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         *bytesPerValue = sizeof(GLushort);
15189c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      else
15199c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         *bytesPerValue = sizeof(GLuint);
1520e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      *buffer = rb->Data;
15219c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      return GL_TRUE;
1522afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
15239c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul}
15249c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul
1525d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul
1526d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul/**
15279c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * Return the color buffer associated with an OSMesa context.
15289c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * Input:  c - the OSMesa context
15299c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * Output:  width, height - size of buffer in pixels
15309c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul *          format - the pixel format (OSMESA_FORMAT)
15319c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul *          buffer - pointer to color buffer values
15329c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * Return:  GL_TRUE or GL_FALSE to indicate success or failure.
15339c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul */
15349c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian PaulGLAPI GLboolean GLAPIENTRY
1535d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian PaulOSMesaGetColorBuffer( OSMesaContext osmesa, GLint *width,
15369c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul                      GLint *height, GLint *format, void **buffer )
15379c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul{
1538d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   if (osmesa->rb && osmesa->rb->Data) {
1539d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul      *width = osmesa->rb->Width;
1540d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul      *height = osmesa->rb->Height;
1541d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul      *format = osmesa->format;
1542d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul      *buffer = osmesa->rb->Data;
1543d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul      return GL_TRUE;
1544d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   }
1545d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   else {
15469c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      *width = 0;
15479c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      *height = 0;
15489c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      *format = 0;
15499c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      *buffer = 0;
15509c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      return GL_FALSE;
1551206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul   }
15529c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul}
1553afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1554709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell
1555c5f9aa7750633e2989a6a139c283419d536ee3f7Brian Paulstruct name_function
1556c5f9aa7750633e2989a6a139c283419d536ee3f7Brian Paul{
15579c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   const char *Name;
15584d880987d248ff078845027cc21ba437564ac07dBrian Paul   OSMESAproc Function;
15599c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul};
15609c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul
1561c5f9aa7750633e2989a6a139c283419d536ee3f7Brian Paulstatic struct name_function functions[] = {
15624d880987d248ff078845027cc21ba437564ac07dBrian Paul   { "OSMesaCreateContext", (OSMESAproc) OSMesaCreateContext },
15634d880987d248ff078845027cc21ba437564ac07dBrian Paul   { "OSMesaCreateContextExt", (OSMESAproc) OSMesaCreateContextExt },
15644d880987d248ff078845027cc21ba437564ac07dBrian Paul   { "OSMesaDestroyContext", (OSMESAproc) OSMesaDestroyContext },
15654d880987d248ff078845027cc21ba437564ac07dBrian Paul   { "OSMesaMakeCurrent", (OSMESAproc) OSMesaMakeCurrent },
15664d880987d248ff078845027cc21ba437564ac07dBrian Paul   { "OSMesaGetCurrentContext", (OSMESAproc) OSMesaGetCurrentContext },
15674d880987d248ff078845027cc21ba437564ac07dBrian Paul   { "OSMesaPixelsStore", (OSMESAproc) OSMesaPixelStore },
15684d880987d248ff078845027cc21ba437564ac07dBrian Paul   { "OSMesaGetIntegerv", (OSMESAproc) OSMesaGetIntegerv },
15694d880987d248ff078845027cc21ba437564ac07dBrian Paul   { "OSMesaGetDepthBuffer", (OSMESAproc) OSMesaGetDepthBuffer },
15704d880987d248ff078845027cc21ba437564ac07dBrian Paul   { "OSMesaGetColorBuffer", (OSMESAproc) OSMesaGetColorBuffer },
15714d880987d248ff078845027cc21ba437564ac07dBrian Paul   { "OSMesaGetProcAddress", (OSMESAproc) OSMesaGetProcAddress },
15729c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   { NULL, NULL }
15739c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul};
15749c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul
15754d880987d248ff078845027cc21ba437564ac07dBrian Paul
15764d880987d248ff078845027cc21ba437564ac07dBrian PaulGLAPI OSMESAproc GLAPIENTRY
15779c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian PaulOSMesaGetProcAddress( const char *funcName )
15789c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul{
15799c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   int i;
15809c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   for (i = 0; functions[i].Name; i++) {
15819c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      if (_mesa_strcmp(functions[i].Name, funcName) == 0)
15824d880987d248ff078845027cc21ba437564ac07dBrian Paul         return functions[i].Function;
15839c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   }
15844d880987d248ff078845027cc21ba437564ac07dBrian Paul   return _glapi_get_proc_address(funcName);
1585afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
1586ba3da6154c324cc916845bc5de3de077d0b59ffcBrian Paul
1587ba3da6154c324cc916845bc5de3de077d0b59ffcBrian Paul
1588ba3da6154c324cc916845bc5de3de077d0b59ffcBrian PaulGLAPI void GLAPIENTRY
1589ba3da6154c324cc916845bc5de3de077d0b59ffcBrian PaulOSMesaColorClamp(GLboolean enable)
1590ba3da6154c324cc916845bc5de3de077d0b59ffcBrian Paul{
1591ba3da6154c324cc916845bc5de3de077d0b59ffcBrian Paul   OSMesaContext osmesa = OSMesaGetCurrentContext();
1592ba3da6154c324cc916845bc5de3de077d0b59ffcBrian Paul
1593ba3da6154c324cc916845bc5de3de077d0b59ffcBrian Paul   if (enable == GL_TRUE) {
1594ba3da6154c324cc916845bc5de3de077d0b59ffcBrian Paul      osmesa->mesa.Color.ClampFragmentColor = GL_TRUE;
1595ba3da6154c324cc916845bc5de3de077d0b59ffcBrian Paul   }
1596ba3da6154c324cc916845bc5de3de077d0b59ffcBrian Paul   else {
1597ba3da6154c324cc916845bc5de3de077d0b59ffcBrian Paul      osmesa->mesa.Color.ClampFragmentColor = GL_FIXED_ONLY_ARB;
1598ba3da6154c324cc916845bc5de3de077d0b59ffcBrian Paul   }
1599ba3da6154c324cc916845bc5de3de077d0b59ffcBrian Paul}
1600ba3da6154c324cc916845bc5de3de077d0b59ffcBrian Paul
1601ba3da6154c324cc916845bc5de3de077d0b59ffcBrian Paul
1602