osmesa.c revision 36b3a8bd5a317ab297f44b19fd14c7e76ec2fc77
1afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/*
2afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Mesa 3-D graphics library
3216eb81c53908c9ac774a378425691aa66205a88Brian * Version:  6.5.3
4dbd1e2b5990a3689bf718296c57c14fc3ba38db5Jouk Jansen *
5216eb81c53908c9ac774a378425691aa66205a88Brian * Copyright (C) 1999-2007  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
3691b491debea274cc4dfc12130624935d4ebd9728Brian Paul#include "main/glheader.h"
37afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#include "GL/osmesa.h"
3891b491debea274cc4dfc12130624935d4ebd9728Brian Paul#include "main/context.h"
3991b491debea274cc4dfc12130624935d4ebd9728Brian Paul#include "main/extensions.h"
4045e76d2665b38ba3787548310efc59e969124c01Brian Paul#include "main/formats.h"
4191b491debea274cc4dfc12130624935d4ebd9728Brian Paul#include "main/framebuffer.h"
4291b491debea274cc4dfc12130624935d4ebd9728Brian Paul#include "main/imports.h"
4391b491debea274cc4dfc12130624935d4ebd9728Brian Paul#include "main/mtypes.h"
4491b491debea274cc4dfc12130624935d4ebd9728Brian Paul#include "main/renderbuffer.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"
541741bc1a79b6a243e841bca704f1a720b028124aBrian Paul#include "drivers/common/meta.h"
5548f5deab94be832a782a440f55a7bc742d50a62fKeith Whitwell#include "vbo/vbo.h"
56afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
57724abeb058ca9372c5a9b9e38ee43dde1accaa41Keith Whitwell
58724abeb058ca9372c5a9b9e38ee43dde1accaa41Keith Whitwell
59d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul/**
60d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul * OSMesa rendering context, derived from core Mesa GLcontext.
61304357dcd496f7ebf499fd9c77b4eba83a75abd5Brian Paul */
62d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paulstruct osmesa_context
63d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul{
64d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   GLcontext mesa;		/*< Base class - this must be first */
65d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   GLvisual *gl_visual;		/*< Describes the buffers */
66d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   struct gl_renderbuffer *rb;  /*< The user's colorbuffer */
67d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   GLframebuffer *gl_buffer;	/*< The framebuffer, containing user's rb */
68d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   GLenum format;		/*< User-specified context format */
69d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   GLint userRowLength;		/*< user-specified number of pixels per row */
70d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   GLint rInd, gInd, bInd, aInd;/*< index offsets for RGBA formats */
71d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   GLvoid *rowaddr[MAX_HEIGHT];	/*< address of first pixel in each image row */
72d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   GLboolean yup;		/*< TRUE  -> Y increases upward */
73d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul				/*< FALSE -> Y increases downward */
74afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg};
75afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
76afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
77d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paulstatic INLINE OSMesaContext
78d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian PaulOSMESA_CONTEXT(GLcontext *ctx)
79d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul{
80d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   /* Just cast, since we're using structure containment */
81d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   return (OSMesaContext) ctx;
82d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul}
83c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul
84c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul
85afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/**********************************************************************/
869c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul/*** Private Device Driver Functions                                ***/
87afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/**********************************************************************/
88afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
89afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
909c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paulstatic const GLubyte *
919c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paulget_string( GLcontext *ctx, GLenum name )
92afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
939c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   (void) ctx;
949c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   switch (name) {
959c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      case GL_RENDERER:
969c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#if CHAN_BITS == 32
979c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         return (const GLubyte *) "Mesa OffScreen32";
989c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#elif CHAN_BITS == 16
999c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         return (const GLubyte *) "Mesa OffScreen16";
1009c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#else
1019c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         return (const GLubyte *) "Mesa OffScreen";
1029c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#endif
1039c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      default:
1049c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         return NULL;
1059c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   }
1062bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul}
1072bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul
1082bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul
1099c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paulstatic void
1109c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paulosmesa_update_state( GLcontext *ctx, GLuint new_state )
1119c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul{
1129c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   /* easy - just propogate */
1139c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   _swrast_InvalidateState( ctx, new_state );
1149c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   _swsetup_InvalidateState( ctx, new_state );
1159c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   _tnl_InvalidateState( ctx, new_state );
11648f5deab94be832a782a440f55a7bc742d50a62fKeith Whitwell   _vbo_InvalidateState( ctx, new_state );
1179c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul}
1189c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul
1192bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul
1209c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul
1219c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul/**********************************************************************/
1229c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul/*****        Read/write spans/arrays of pixels                   *****/
1239c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul/**********************************************************************/
1245a9026c65d260dc185e072163999f5d810015108Brian Paul
125d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul/* 8-bit RGBA */
126d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define NAME(PREFIX) PREFIX##_RGBA8
127d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define RB_TYPE GLubyte
1289c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define SPAN_VARS \
1299c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   const OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
1309c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define INIT_PIXEL_PTR(P, X, Y) \
131d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   GLubyte *P = (GLubyte *) osmesa->rowaddr[Y] + 4 * (X)
1329c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define INC_PIXEL_PTR(P) P += 4
133e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul#define STORE_PIXEL(DST, X, Y, VALUE) \
134d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   DST[0] = VALUE[RCOMP];  \
135d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   DST[1] = VALUE[GCOMP];  \
136d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   DST[2] = VALUE[BCOMP];  \
137d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   DST[3] = VALUE[ACOMP]
138286c4cc201390e868c4f9b5ebe14c40db2d74a5dBrian Paul#define STORE_PIXEL_RGB(DST, X, Y, VALUE) \
139d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   DST[0] = VALUE[RCOMP];  \
140d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   DST[1] = VALUE[GCOMP];  \
141d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   DST[2] = VALUE[BCOMP];  \
142d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   DST[3] = 255
143d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define FETCH_PIXEL(DST, SRC) \
144d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   DST[RCOMP] = SRC[0];  \
145d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   DST[GCOMP] = SRC[1];  \
146d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   DST[BCOMP] = SRC[2];  \
147d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   DST[ACOMP] = SRC[3]
148d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#include "swrast/s_spantemp.h"
149d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul
150d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul/* 16-bit RGBA */
151d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define NAME(PREFIX) PREFIX##_RGBA16
152d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define RB_TYPE GLushort
153d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define SPAN_VARS \
154d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   const OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
155d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define INIT_PIXEL_PTR(P, X, Y) \
156d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   GLushort *P = (GLushort *) osmesa->rowaddr[Y] + 4 * (X)
157d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define INC_PIXEL_PTR(P) P += 4
158e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul#define STORE_PIXEL(DST, X, Y, VALUE) \
159e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   DST[0] = VALUE[RCOMP];  \
160e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   DST[1] = VALUE[GCOMP];  \
161e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   DST[2] = VALUE[BCOMP];  \
162e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   DST[3] = VALUE[ACOMP]
163286c4cc201390e868c4f9b5ebe14c40db2d74a5dBrian Paul#define STORE_PIXEL_RGB(DST, X, Y, VALUE) \
164286c4cc201390e868c4f9b5ebe14c40db2d74a5dBrian Paul   DST[0] = VALUE[RCOMP];  \
165286c4cc201390e868c4f9b5ebe14c40db2d74a5dBrian Paul   DST[1] = VALUE[GCOMP];  \
166286c4cc201390e868c4f9b5ebe14c40db2d74a5dBrian Paul   DST[2] = VALUE[BCOMP];  \
167d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   DST[3] = 65535
168d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define FETCH_PIXEL(DST, SRC) \
169d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   DST[RCOMP] = SRC[0];  \
170d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   DST[GCOMP] = SRC[1];  \
171d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   DST[BCOMP] = SRC[2];  \
172d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   DST[ACOMP] = SRC[3]
173d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#include "swrast/s_spantemp.h"
174d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul
175d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul/* 32-bit RGBA */
176d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define NAME(PREFIX) PREFIX##_RGBA32
177d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define RB_TYPE GLfloat
178d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define SPAN_VARS \
179d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   const OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
180d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define INIT_PIXEL_PTR(P, X, Y) \
181d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   GLfloat *P = (GLfloat *) osmesa->rowaddr[Y] + 4 * (X)
182d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define INC_PIXEL_PTR(P) P += 4
183d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define STORE_PIXEL(DST, X, Y, VALUE) \
184d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   DST[0] = MAX2((VALUE[RCOMP]), 0.0F); \
185d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   DST[1] = MAX2((VALUE[GCOMP]), 0.0F); \
186d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   DST[2] = MAX2((VALUE[BCOMP]), 0.0F); \
187d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   DST[3] = CLAMP((VALUE[ACOMP]), 0.0F, 1.0F)
188d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define STORE_PIXEL_RGB(DST, X, Y, VALUE) \
189d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   DST[0] = MAX2((VALUE[RCOMP]), 0.0F); \
190d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   DST[1] = MAX2((VALUE[GCOMP]), 0.0F); \
191d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   DST[2] = MAX2((VALUE[BCOMP]), 0.0F); \
192d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   DST[3] = 1.0F
193e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul#define FETCH_PIXEL(DST, SRC) \
194e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   DST[RCOMP] = SRC[0];  \
195e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   DST[GCOMP] = SRC[1];  \
196e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   DST[BCOMP] = SRC[2];  \
19722652f952fbd3968f3d5a3db7898911508d76145Brian Paul   DST[ACOMP] = SRC[3]
198eae0439ae6027ba64fba49fe13360d105700905fBrian Paul#include "swrast/s_spantemp.h"
1994c44d63f01a01f134d7e4456d4209edee97f9ef5Brian Paul
200d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul
201d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul/* 8-bit BGRA */
202d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define NAME(PREFIX) PREFIX##_BGRA8
203d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define RB_TYPE GLubyte
204d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define SPAN_VARS \
205d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   const OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
206d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define INIT_PIXEL_PTR(P, X, Y) \
207d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   GLubyte *P = (GLubyte *) osmesa->rowaddr[Y] + 4 * (X)
208d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define INC_PIXEL_PTR(P) P += 4
209d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define STORE_PIXEL(DST, X, Y, VALUE) \
210d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   DST[2] = VALUE[RCOMP];  \
211d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   DST[1] = VALUE[GCOMP];  \
212d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   DST[0] = VALUE[BCOMP];  \
213d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   DST[3] = VALUE[ACOMP]
214d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define STORE_PIXEL_RGB(DST, X, Y, VALUE) \
215d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   DST[2] = VALUE[RCOMP];  \
216d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   DST[1] = VALUE[GCOMP];  \
217d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   DST[0] = VALUE[BCOMP];  \
218d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   DST[3] = 255
219d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define FETCH_PIXEL(DST, SRC) \
220d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   DST[RCOMP] = SRC[2];  \
221d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   DST[GCOMP] = SRC[1];  \
222d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   DST[BCOMP] = SRC[0];  \
223d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   DST[ACOMP] = SRC[3]
224d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#include "swrast/s_spantemp.h"
225d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul
226d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul/* 16-bit BGRA */
227d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define NAME(PREFIX) PREFIX##_BGRA16
228d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define RB_TYPE GLushort
2299c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define SPAN_VARS \
2309c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   const OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
2319c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define INIT_PIXEL_PTR(P, X, Y) \
232d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   GLushort *P = (GLushort *) osmesa->rowaddr[Y] + 4 * (X)
2339c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define INC_PIXEL_PTR(P) P += 4
234e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul#define STORE_PIXEL(DST, X, Y, VALUE) \
235e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   DST[2] = VALUE[RCOMP];  \
236e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   DST[1] = VALUE[GCOMP];  \
237e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   DST[0] = VALUE[BCOMP];  \
238e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   DST[3] = VALUE[ACOMP]
239286c4cc201390e868c4f9b5ebe14c40db2d74a5dBrian Paul#define STORE_PIXEL_RGB(DST, X, Y, VALUE) \
240286c4cc201390e868c4f9b5ebe14c40db2d74a5dBrian Paul   DST[2] = VALUE[RCOMP];  \
241286c4cc201390e868c4f9b5ebe14c40db2d74a5dBrian Paul   DST[1] = VALUE[GCOMP];  \
242286c4cc201390e868c4f9b5ebe14c40db2d74a5dBrian Paul   DST[0] = VALUE[BCOMP];  \
243d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   DST[3] = 65535
244e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul#define FETCH_PIXEL(DST, SRC) \
245e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   DST[RCOMP] = SRC[2];  \
246e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   DST[GCOMP] = SRC[1];  \
247e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   DST[BCOMP] = SRC[0];  \
24822652f952fbd3968f3d5a3db7898911508d76145Brian Paul   DST[ACOMP] = SRC[3]
249eae0439ae6027ba64fba49fe13360d105700905fBrian Paul#include "swrast/s_spantemp.h"
2509c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul
251d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul/* 32-bit BGRA */
252d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define NAME(PREFIX) PREFIX##_BGRA32
253d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define RB_TYPE GLfloat
2549c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define SPAN_VARS \
2559c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   const OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
2569c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define INIT_PIXEL_PTR(P, X, Y) \
257d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   GLfloat *P = (GLfloat *) osmesa->rowaddr[Y] + 4 * (X)
258d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define INC_PIXEL_PTR(P) P += 4
259d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define STORE_PIXEL(DST, X, Y, VALUE) \
260d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   DST[2] = VALUE[RCOMP];  \
261d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   DST[1] = VALUE[GCOMP];  \
262d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   DST[0] = VALUE[BCOMP];  \
263d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   DST[3] = VALUE[ACOMP]
264d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define STORE_PIXEL_RGB(DST, X, Y, VALUE) \
265d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   DST[2] = VALUE[RCOMP];  \
266d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   DST[1] = VALUE[GCOMP];  \
267d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   DST[0] = VALUE[BCOMP];  \
268d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   DST[3] = 1.0F
269d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define FETCH_PIXEL(DST, SRC) \
270d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   DST[RCOMP] = SRC[2];  \
271d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   DST[GCOMP] = SRC[1];  \
272d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   DST[BCOMP] = SRC[0];  \
273d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   DST[ACOMP] = SRC[3]
274d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#include "swrast/s_spantemp.h"
275d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul
276d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul
277d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul/* 8-bit ARGB */
278d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define NAME(PREFIX) PREFIX##_ARGB8
279d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define RB_TYPE GLubyte
280d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define SPAN_VARS \
281d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   const OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
282d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define INIT_PIXEL_PTR(P, X, Y) \
283d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   GLubyte *P = (GLubyte *) osmesa->rowaddr[Y] + 4 * (X)
284d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define INC_PIXEL_PTR(P) P += 4
285d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define STORE_PIXEL(DST, X, Y, VALUE) \
286d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   DST[1] = VALUE[RCOMP];  \
287d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   DST[2] = VALUE[GCOMP];  \
288d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   DST[3] = VALUE[BCOMP];  \
289d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   DST[0] = VALUE[ACOMP]
290d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define STORE_PIXEL_RGB(DST, X, Y, VALUE) \
291d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   DST[1] = VALUE[RCOMP];  \
292d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   DST[2] = VALUE[GCOMP];  \
293d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   DST[3] = VALUE[BCOMP];  \
294d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   DST[0] = 255
295d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define FETCH_PIXEL(DST, SRC) \
296d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   DST[RCOMP] = SRC[1];  \
297d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   DST[GCOMP] = SRC[2];  \
298d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   DST[BCOMP] = SRC[3];  \
299d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   DST[ACOMP] = SRC[0]
300d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#include "swrast/s_spantemp.h"
301d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul
302d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul/* 16-bit ARGB */
303d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define NAME(PREFIX) PREFIX##_ARGB16
304d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define RB_TYPE GLushort
305d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define SPAN_VARS \
306d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   const OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
307d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define INIT_PIXEL_PTR(P, X, Y) \
308d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   GLushort *P = (GLushort *) osmesa->rowaddr[Y] + 4 * (X)
3099c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define INC_PIXEL_PTR(P) P += 4
310e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul#define STORE_PIXEL(DST, X, Y, VALUE) \
311e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   DST[1] = VALUE[RCOMP];  \
312e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   DST[2] = VALUE[GCOMP];  \
313e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   DST[3] = VALUE[BCOMP];  \
314e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   DST[0] = VALUE[ACOMP]
315286c4cc201390e868c4f9b5ebe14c40db2d74a5dBrian Paul#define STORE_PIXEL_RGB(DST, X, Y, VALUE) \
316286c4cc201390e868c4f9b5ebe14c40db2d74a5dBrian Paul   DST[1] = VALUE[RCOMP];  \
317286c4cc201390e868c4f9b5ebe14c40db2d74a5dBrian Paul   DST[2] = VALUE[GCOMP];  \
318286c4cc201390e868c4f9b5ebe14c40db2d74a5dBrian Paul   DST[3] = VALUE[BCOMP];  \
319d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   DST[0] = 65535
320e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul#define FETCH_PIXEL(DST, SRC) \
321e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   DST[RCOMP] = SRC[1];  \
322e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   DST[GCOMP] = SRC[2];  \
323e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   DST[BCOMP] = SRC[3];  \
32422652f952fbd3968f3d5a3db7898911508d76145Brian Paul   DST[ACOMP] = SRC[0]
325eae0439ae6027ba64fba49fe13360d105700905fBrian Paul#include "swrast/s_spantemp.h"
3269c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul
327d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul/* 32-bit ARGB */
328d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define NAME(PREFIX) PREFIX##_ARGB32
329d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define RB_TYPE GLfloat
3309c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define SPAN_VARS \
3319c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   const OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
3329c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define INIT_PIXEL_PTR(P, X, Y) \
333d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   GLfloat *P = (GLfloat *) osmesa->rowaddr[Y] + 4 * (X)
334d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define INC_PIXEL_PTR(P) P += 4
335d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define STORE_PIXEL(DST, X, Y, VALUE) \
336d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   DST[1] = VALUE[RCOMP];  \
337d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   DST[2] = VALUE[GCOMP];  \
338d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   DST[3] = VALUE[BCOMP];  \
339d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   DST[0] = VALUE[ACOMP]
340d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define STORE_PIXEL_RGB(DST, X, Y, VALUE) \
341d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   DST[1] = VALUE[RCOMP];  \
342d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   DST[2] = VALUE[GCOMP];  \
343d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   DST[3] = VALUE[BCOMP];  \
344d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   DST[0] = 1.0F
345d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define FETCH_PIXEL(DST, SRC) \
346d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   DST[RCOMP] = SRC[1];  \
347d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   DST[GCOMP] = SRC[2];  \
348d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   DST[BCOMP] = SRC[3];  \
349d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   DST[ACOMP] = SRC[0]
350d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#include "swrast/s_spantemp.h"
351d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul
352d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul
353d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul/* 8-bit RGB */
354d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define NAME(PREFIX) PREFIX##_RGB8
355d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define RB_TYPE GLubyte
356d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define SPAN_VARS \
357d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   const OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
358d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define INIT_PIXEL_PTR(P, X, Y) \
359d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   GLubyte *P = (GLubyte *) osmesa->rowaddr[Y] + 3 * (X)
3603340a9ea9ea31e6bd7f37d5c1f25ffcc97f20a6bBrian Paul#define INC_PIXEL_PTR(P) P += 3
361e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul#define STORE_PIXEL(DST, X, Y, VALUE) \
362e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   DST[0] = VALUE[RCOMP];  \
363e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   DST[1] = VALUE[GCOMP];  \
364e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   DST[2] = VALUE[BCOMP]
365e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul#define FETCH_PIXEL(DST, SRC) \
366e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   DST[RCOMP] = SRC[0];  \
367e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   DST[GCOMP] = SRC[1];  \
368e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   DST[BCOMP] = SRC[2];  \
369d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   DST[ACOMP] = 255
370eae0439ae6027ba64fba49fe13360d105700905fBrian Paul#include "swrast/s_spantemp.h"
3719c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul
372d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul/* 16-bit RGB */
373d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define NAME(PREFIX) PREFIX##_RGB16
374d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define RB_TYPE GLushort
375d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define SPAN_VARS \
376d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   const OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
377d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define INIT_PIXEL_PTR(P, X, Y) \
378d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   GLushort *P = (GLushort *) osmesa->rowaddr[Y] + 3 * (X)
379d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define INC_PIXEL_PTR(P) P += 3
380d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define STORE_PIXEL(DST, X, Y, VALUE) \
381d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   DST[0] = VALUE[RCOMP];  \
382d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   DST[1] = VALUE[GCOMP];  \
383d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   DST[2] = VALUE[BCOMP]
384d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define FETCH_PIXEL(DST, SRC) \
385d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   DST[RCOMP] = SRC[0];  \
386d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   DST[GCOMP] = SRC[1];  \
387d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   DST[BCOMP] = SRC[2];  \
388d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   DST[ACOMP] = 65535U
389d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#include "swrast/s_spantemp.h"
390d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul
391d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul/* 32-bit RGB */
392d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define NAME(PREFIX) PREFIX##_RGB32
393d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define RB_TYPE GLfloat
394d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define SPAN_VARS \
395d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   const OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
396d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define INIT_PIXEL_PTR(P, X, Y) \
397d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   GLfloat *P = (GLfloat *) osmesa->rowaddr[Y] + 3 * (X)
398d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define INC_PIXEL_PTR(P) P += 3
399d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define STORE_PIXEL(DST, X, Y, VALUE) \
400d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   DST[0] = VALUE[RCOMP];  \
401d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   DST[1] = VALUE[GCOMP];  \
402d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   DST[2] = VALUE[BCOMP]
403d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define FETCH_PIXEL(DST, SRC) \
404d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   DST[RCOMP] = SRC[0];  \
405d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   DST[GCOMP] = SRC[1];  \
406d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   DST[BCOMP] = SRC[2];  \
407d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   DST[ACOMP] = 1.0F
408d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#include "swrast/s_spantemp.h"
409d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul
410d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul
411d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul/* 8-bit BGR */
412d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define NAME(PREFIX) PREFIX##_BGR8
413d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define RB_TYPE GLubyte
4149c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define SPAN_VARS \
4159c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   const OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
4169c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define INIT_PIXEL_PTR(P, X, Y) \
417d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   GLubyte *P = (GLubyte *) osmesa->rowaddr[Y] + 3 * (X)
4183340a9ea9ea31e6bd7f37d5c1f25ffcc97f20a6bBrian Paul#define INC_PIXEL_PTR(P) P += 3
419e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul#define STORE_PIXEL(DST, X, Y, VALUE) \
420e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   DST[2] = VALUE[RCOMP];  \
421e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   DST[1] = VALUE[GCOMP];  \
422e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   DST[0] = VALUE[BCOMP]
423e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul#define FETCH_PIXEL(DST, SRC) \
424e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   DST[RCOMP] = SRC[2];  \
425e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   DST[GCOMP] = SRC[1];  \
426e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   DST[BCOMP] = SRC[0];  \
427d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   DST[ACOMP] = 255
428eae0439ae6027ba64fba49fe13360d105700905fBrian Paul#include "swrast/s_spantemp.h"
4299c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul
430d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul/* 16-bit BGR */
431d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define NAME(PREFIX) PREFIX##_BGR16
432d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define RB_TYPE GLushort
433d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define SPAN_VARS \
434d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   const OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
435d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define INIT_PIXEL_PTR(P, X, Y) \
436d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   GLushort *P = (GLushort *) osmesa->rowaddr[Y] + 3 * (X)
437d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define INC_PIXEL_PTR(P) P += 3
438d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define STORE_PIXEL(DST, X, Y, VALUE) \
439d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   DST[2] = VALUE[RCOMP];  \
440d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   DST[1] = VALUE[GCOMP];  \
441d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   DST[0] = VALUE[BCOMP]
442d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define FETCH_PIXEL(DST, SRC) \
443d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   DST[RCOMP] = SRC[2];  \
444d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   DST[GCOMP] = SRC[1];  \
445d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   DST[BCOMP] = SRC[0];  \
446d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   DST[ACOMP] = 65535
447d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#include "swrast/s_spantemp.h"
448d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul
449d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul/* 32-bit BGR */
450d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define NAME(PREFIX) PREFIX##_BGR32
451d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define RB_TYPE GLfloat
452d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define SPAN_VARS \
453d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   const OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
454d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define INIT_PIXEL_PTR(P, X, Y) \
455d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   GLfloat *P = (GLfloat *) osmesa->rowaddr[Y] + 3 * (X)
456d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define INC_PIXEL_PTR(P) P += 3
457d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define STORE_PIXEL(DST, X, Y, VALUE) \
458d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   DST[2] = VALUE[RCOMP];  \
459d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   DST[1] = VALUE[GCOMP];  \
460d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   DST[0] = VALUE[BCOMP]
461d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define FETCH_PIXEL(DST, SRC) \
462d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   DST[RCOMP] = SRC[2];  \
463d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   DST[GCOMP] = SRC[1];  \
464d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   DST[BCOMP] = SRC[0];  \
465d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   DST[ACOMP] = 1.0F
466d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#include "swrast/s_spantemp.h"
467d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul
468d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul
469d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul/* 16-bit 5/6/5 RGB */
4709c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define NAME(PREFIX) PREFIX##_RGB_565
471d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define RB_TYPE GLubyte
4729c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define SPAN_VARS \
4739c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   const OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
4749c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define INIT_PIXEL_PTR(P, X, Y) \
4759c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   GLushort *P = (GLushort *) osmesa->rowaddr[Y] + (X)
4769c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define INC_PIXEL_PTR(P) P += 1
477e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul#define STORE_PIXEL(DST, X, Y, VALUE) \
478e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   *DST = ( (((VALUE[RCOMP]) & 0xf8) << 8) | (((VALUE[GCOMP]) & 0xfc) << 3) | ((VALUE[BCOMP]) >> 3) )
479e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul#define FETCH_PIXEL(DST, SRC) \
480e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   DST[RCOMP] = ( (((*SRC) >> 8) & 0xf8) | (((*SRC) >> 11) & 0x7) ); \
481e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   DST[GCOMP] = ( (((*SRC) >> 3) & 0xfc) | (((*SRC) >>  5) & 0x3) ); \
482e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   DST[BCOMP] = ( (((*SRC) << 3) & 0xf8) | (((*SRC)      ) & 0x7) ); \
483e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   DST[ACOMP] = CHAN_MAX
484eae0439ae6027ba64fba49fe13360d105700905fBrian Paul#include "swrast/s_spantemp.h"
485d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul
4869c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul
48720215ecc7ded503d7d9cb6e8ba2f7a9c1621dd15Brian Paul/**
48820215ecc7ded503d7d9cb6e8ba2f7a9c1621dd15Brian Paul * Macros for optimized line/triangle rendering.
48920215ecc7ded503d7d9cb6e8ba2f7a9c1621dd15Brian Paul * Only for 8-bit channel, RGBA, BGRA, ARGB formats.
49020215ecc7ded503d7d9cb6e8ba2f7a9c1621dd15Brian Paul */
491afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
4929c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define PACK_RGBA(DST, R, G, B, A)	\
4939c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Pauldo {					\
4949c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   (DST)[osmesa->rInd] = R;		\
4959c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   (DST)[osmesa->gInd] = G;		\
4969c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   (DST)[osmesa->bInd] = B;		\
4979c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   (DST)[osmesa->aInd] = A;		\
4989c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul} while (0)
4999c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul
500d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define PIXELADDR4(X,Y)  ((GLchan *) osmesa->rowaddr[Y] + 4 * (X))
501afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
5022bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul
50320215ecc7ded503d7d9cb6e8ba2f7a9c1621dd15Brian Paul/**
5049c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * Draw a flat-shaded, RGB line into an osmesa buffer.
505afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */
50622a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul#define NAME flat_rgba_line
50722a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul#define CLIP_HACK 1
50822a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul#define SETUP_CODE						\
50922a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul   const OSMesaContext osmesa = OSMESA_CONTEXT(ctx);		\
5109c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   const GLchan *color = vert1->color;
511709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell
5129c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define PLOT(X, Y)						\
5139c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Pauldo {								\
5149c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   GLchan *p = PIXELADDR4(X, Y);				\
5159c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   PACK_RGBA(p, color[0], color[1], color[2], color[3]);	\
5169c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul} while (0)
517afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
5189c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#ifdef WIN32
5199c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#include "..\swrast\s_linetemp.h"
5209c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#else
5219c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#include "swrast/s_linetemp.h"
5229c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#endif
52322a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul
524afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
525afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
52620215ecc7ded503d7d9cb6e8ba2f7a9c1621dd15Brian Paul/**
5279c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * Draw a flat-shaded, Z-less, RGB line into an osmesa buffer.
528afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */
52922a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul#define NAME flat_rgba_z_line
53022a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul#define CLIP_HACK 1
5319c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define INTERP_Z 1
5329c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE
53322a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul#define SETUP_CODE					\
53422a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul   const OSMesaContext osmesa = OSMESA_CONTEXT(ctx);	\
53522a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul   const GLchan *color = vert1->color;
53622a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul
5379c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define PLOT(X, Y)					\
5389c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Pauldo {							\
5399c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   if (Z < *zPtr) {					\
5409c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      GLchan *p = PIXELADDR4(X, Y);			\
5419c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      PACK_RGBA(p, color[RCOMP], color[GCOMP],		\
5429c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul                   color[BCOMP], color[ACOMP]);		\
5439c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      *zPtr = Z;					\
5449c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   }							\
5459c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul} while (0)
54674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul
5479c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#ifdef WIN32
5489c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#include "..\swrast\s_linetemp.h"
5499c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#else
5509c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#include "swrast/s_linetemp.h"
5519c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#endif
552206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul
553afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
554afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
555d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul/**
5569c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * Analyze context state to see if we can provide a fast line drawing
557d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul * function.  Otherwise, return NULL.
5589c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul */
5599c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paulstatic swrast_line_func
5609c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paulosmesa_choose_line_function( GLcontext *ctx )
561afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
5629c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   const OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
5639c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   const SWcontext *swrast = SWRAST_CONTEXT(ctx);
564afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
565544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul   if (osmesa->rb->DataType != GL_UNSIGNED_BYTE)
566544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul      return NULL;
567544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul
5689c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   if (ctx->RenderMode != GL_RENDER)      return NULL;
5699c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   if (ctx->Line.SmoothFlag)              return NULL;
5709c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   if (ctx->Texture._EnabledUnits)        return NULL;
5719c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   if (ctx->Light.ShadeModel != GL_FLAT)  return NULL;
5729c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   if (ctx->Line.Width != 1.0F)           return NULL;
5739c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   if (ctx->Line.StippleFlag)             return NULL;
5749c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   if (ctx->Line.SmoothFlag)              return NULL;
5759c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   if (osmesa->format != OSMESA_RGBA &&
5769c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul       osmesa->format != OSMESA_BGRA &&
5779c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul       osmesa->format != OSMESA_ARGB)     return NULL;
5789c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul
5799c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   if (swrast->_RasterMask==DEPTH_BIT
5809c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul       && ctx->Depth.Func==GL_LESS
5819c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul       && ctx->Depth.Mask==GL_TRUE
5829c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul       && ctx->Visual.depthBits == DEFAULT_SOFTWARE_DEPTH_BITS) {
5839c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      return (swrast_line_func) flat_rgba_z_line;
584afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
585afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
5869c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   if (swrast->_RasterMask == 0) {
5879c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      return (swrast_line_func) flat_rgba_line;
588afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
5899c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul
5909c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   return (swrast_line_func) NULL;
591afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
592afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
5939c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul
5949c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul/**********************************************************************/
5959c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul/*****                 Optimized triangle rendering               *****/
5969c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul/**********************************************************************/
5979c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul
5989c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul
59923ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank/*
6009c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * Smooth-shaded, z-less triangle, RGBA color.
60123ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank */
6029c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define NAME smooth_rgba_z_triangle
6039c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define INTERP_Z 1
6049c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE
6059c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define INTERP_RGB 1
6069c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define INTERP_ALPHA 1
6079c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define SETUP_CODE \
6089c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   const OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
6095bdec89da520f763b6d0faad1781f64566a97fddKarl Schultz#define RENDER_SPAN( span ) {					\
6109c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   GLuint i;							\
6119c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   GLchan *img = PIXELADDR4(span.x, span.y); 			\
6129c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   for (i = 0; i < span.end; i++, img += 4) {			\
6134092fbd55ac92a59d09d5167ced328683bed049cBrian Paul      const GLuint z = FixedToDepth(span.z);			\
6149c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      if (z < zRow[i]) {					\
6159c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         PACK_RGBA(img, FixedToChan(span.red),			\
6169c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul            FixedToChan(span.green), FixedToChan(span.blue),	\
6179c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul            FixedToChan(span.alpha));				\
6189c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         zRow[i] = z;						\
6199c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      }								\
6209c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      span.red += span.redStep;					\
6219c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      span.green += span.greenStep;				\
6229c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      span.blue += span.blueStep;				\
6239c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      span.alpha += span.alphaStep;				\
6249c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      span.z += span.zStep;					\
6255bdec89da520f763b6d0faad1781f64566a97fddKarl Schultz   }                                                            \
6265bdec89da520f763b6d0faad1781f64566a97fddKarl Schultz}
6279c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#ifdef WIN32
6289c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#include "..\swrast\s_tritemp.h"
6299c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#else
6309c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#include "swrast/s_tritemp.h"
6319c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#endif
63201dc182ee86922845ba0b17a2cda9af19150c93aBrian Paul
633afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
634afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
635afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/*
6369c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * Flat-shaded, z-less triangle, RGBA color.
637afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */
6389c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define NAME flat_rgba_z_triangle
6399c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define INTERP_Z 1
6409c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE
6419c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define SETUP_CODE						\
6429c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   const OSMesaContext osmesa = OSMESA_CONTEXT(ctx);		\
6439c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   GLuint pixel;						\
6449c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   PACK_RGBA((GLchan *) &pixel, v2->color[0], v2->color[1],	\
6459c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul                                v2->color[2], v2->color[3]);
646afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
6475bdec89da520f763b6d0faad1781f64566a97fddKarl Schultz#define RENDER_SPAN( span ) {				\
6489c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   GLuint i;						\
6499c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   GLuint *img = (GLuint *) PIXELADDR4(span.x, span.y);	\
6509c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   for (i = 0; i < span.end; i++) {			\
6514092fbd55ac92a59d09d5167ced328683bed049cBrian Paul      const GLuint z = FixedToDepth(span.z);		\
6529c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      if (z < zRow[i]) {				\
6539c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         img[i] = pixel;				\
6549c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         zRow[i] = z;					\
6559c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      }							\
6569c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      span.z += span.zStep;				\
6575bdec89da520f763b6d0faad1781f64566a97fddKarl Schultz   }                                                    \
6585bdec89da520f763b6d0faad1781f64566a97fddKarl Schultz}
6599c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#ifdef WIN32
6609c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#include "..\swrast\s_tritemp.h"
6614336c28c843923db3d9c8dc0a0cb2440ba94f064Brian Paul#else
6629c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#include "swrast/s_tritemp.h"
6634336c28c843923db3d9c8dc0a0cb2440ba94f064Brian Paul#endif
66474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul
665afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
666afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
667d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul/**
668d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul * Return pointer to an optimized triangle function if possible.
6699c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul */
6709c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paulstatic swrast_tri_func
6719c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paulosmesa_choose_triangle_function( GLcontext *ctx )
672afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
6739c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   const OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
6749c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   const SWcontext *swrast = SWRAST_CONTEXT(ctx);
675dd020f13a6d520b46aefd4453dae6b6edcc427f6Brian Paul
676544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul   if (osmesa->rb->DataType != GL_UNSIGNED_BYTE)
677544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul      return (swrast_tri_func) NULL;
678544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul
6799c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   if (ctx->RenderMode != GL_RENDER)    return (swrast_tri_func) NULL;
6809c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   if (ctx->Polygon.SmoothFlag)         return (swrast_tri_func) NULL;
6819c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   if (ctx->Polygon.StippleFlag)        return (swrast_tri_func) NULL;
6829c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   if (ctx->Texture._EnabledUnits)      return (swrast_tri_func) NULL;
6839c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   if (osmesa->format != OSMESA_RGBA &&
6849c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul       osmesa->format != OSMESA_BGRA &&
6859c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul       osmesa->format != OSMESA_ARGB)   return (swrast_tri_func) NULL;
6869c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   if (ctx->Polygon.CullFlag &&
6879c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul       ctx->Polygon.CullFaceMode == GL_FRONT_AND_BACK)
6889c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul                                        return (swrast_tri_func) NULL;
68974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul
6909c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   if (swrast->_RasterMask == DEPTH_BIT &&
6919c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul       ctx->Depth.Func == GL_LESS &&
6929c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul       ctx->Depth.Mask == GL_TRUE &&
6939c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul       ctx->Visual.depthBits == DEFAULT_SOFTWARE_DEPTH_BITS) {
6949c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      if (ctx->Light.ShadeModel == GL_SMOOTH) {
6959c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         return (swrast_tri_func) smooth_rgba_z_triangle;
6969c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      }
6979c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      else {
6989c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         return (swrast_tri_func) flat_rgba_z_triangle;
699afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
700afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
7019c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   return (swrast_tri_func) NULL;
702afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
703afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
704afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
705afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
7069c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul/* Override for the swrast triangle-selection function.  Try to use one
7079c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * of our internal triangle functions, otherwise fall back to the
7089c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * standard swrast functions.
7099c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul */
7109c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paulstatic void
7119c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paulosmesa_choose_triangle( GLcontext *ctx )
712afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
7139c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   SWcontext *swrast = SWRAST_CONTEXT(ctx);
714afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
7159c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   swrast->Triangle = osmesa_choose_triangle_function( ctx );
7169c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   if (!swrast->Triangle)
7179c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      _swrast_choose_triangle( ctx );
7189c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul}
719afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
72074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void
7219c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paulosmesa_choose_line( GLcontext *ctx )
722afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
7239c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   SWcontext *swrast = SWRAST_CONTEXT(ctx);
7249c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul
7259c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   swrast->Line = osmesa_choose_line_function( ctx );
7269c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   if (!swrast->Line)
7279c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      _swrast_choose_line( ctx );
728afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
729afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
730afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
731544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul
732544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul/**
733544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul * Recompute the values of the context's rowaddr array.
734544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul */
735544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paulstatic void
736544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paulcompute_row_addresses( OSMesaContext osmesa )
737544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul{
738544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul   GLint bytesPerPixel, bytesPerRow, i;
739544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul   GLubyte *origin = (GLubyte *) osmesa->rb->Data;
740544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul   GLint bpc; /* bytes per channel */
741544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul   GLint rowlength; /* in pixels */
742544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul   GLint height = osmesa->rb->Height;
743544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul
744544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul   if (osmesa->userRowLength)
745544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul      rowlength = osmesa->userRowLength;
746544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul   else
747544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul      rowlength = osmesa->rb->Width;
748544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul
749544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul   if (osmesa->rb->DataType == GL_UNSIGNED_BYTE)
750544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul      bpc = 1;
751544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul   else if (osmesa->rb->DataType == GL_UNSIGNED_SHORT)
752544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul      bpc = 2;
753544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul   else if (osmesa->rb->DataType == GL_FLOAT)
754544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul      bpc = 4;
755544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul   else {
756544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul      _mesa_problem(&osmesa->mesa,
757544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul                    "Unexpected datatype in osmesa::compute_row_addresses");
758544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul      return;
759544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul   }
760544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul
761641705f0329c038079650089a664d76abfc5a937Ian Romanick   if ((osmesa->format == OSMESA_RGB) || (osmesa->format == OSMESA_BGR)) {
762544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul      /* RGB mode */
763544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul      bytesPerPixel = 3 * bpc;
764544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul   }
765544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul   else if (osmesa->format == OSMESA_RGB_565) {
766544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul      /* 5/6/5 RGB pixel in 16 bits */
767544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul      bytesPerPixel = 2;
768544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul   }
769544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul   else {
770544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul      /* RGBA mode */
771544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul      bytesPerPixel = 4 * bpc;
772544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul   }
773544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul
774544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul   bytesPerRow = rowlength * bytesPerPixel;
775544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul
776544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul   if (osmesa->yup) {
777544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul      /* Y=0 is bottom line of window */
778544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul      for (i = 0; i < height; i++) {
779544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul         osmesa->rowaddr[i] = (GLvoid *) ((GLubyte *) origin + i * bytesPerRow);
780544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul      }
781544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul   }
782544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul   else {
783544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul      /* Y=0 is top line of window */
784544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul      for (i = 0; i < height; i++) {
785544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul         GLint j = height - i - 1;
786544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul         osmesa->rowaddr[i] = (GLvoid *) ((GLubyte *) origin + j * bytesPerRow);
787544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul      }
788544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul   }
789544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul}
790544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul
791544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul
792544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul
793e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul/**
794e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul * Don't use _mesa_delete_renderbuffer since we can't free rb->Data.
795e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul */
79674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void
797e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paulosmesa_delete_renderbuffer(struct gl_renderbuffer *rb)
798afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
79932f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg   free(rb);
800e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul}
801e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul
802e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul
803e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul/**
804e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul * Allocate renderbuffer storage.  We don't actually allocate any storage
805e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul * since we're using a user-provided buffer.
806e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul * Just set up all the gl_renderbuffer methods.
807e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul */
808e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paulstatic GLboolean
809e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paulosmesa_renderbuffer_storage(GLcontext *ctx, struct gl_renderbuffer *rb,
810e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul                            GLenum internalFormat, GLuint width, GLuint height)
811e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul{
812e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   const OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
813d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   GLint bpc; /* bits per channel */
814d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul
815d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   if (rb->DataType == GL_UNSIGNED_BYTE)
816d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul      bpc = 8;
817d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   else if (rb->DataType == GL_UNSIGNED_SHORT)
818d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul      bpc = 16;
819d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   else
820d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul      bpc = 32;
821e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul
8229e81d6ae3a6db9831d6aea0fe4d92722176e9f74Brian Paul   /* Note: we can ignoring internalFormat for "window-system" renderbuffers */
8235bdc6fdebc0ab59a888fba15136eb4a0ee2790e1Brian Paul   (void) internalFormat;
8245bdc6fdebc0ab59a888fba15136eb4a0ee2790e1Brian Paul
825e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   if (osmesa->format == OSMESA_RGBA) {
826d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul      if (rb->DataType == GL_UNSIGNED_BYTE) {
827d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul         rb->GetRow = get_row_RGBA8;
828d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul         rb->GetValues = get_values_RGBA8;
829d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul         rb->PutRow = put_row_RGBA8;
830d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul         rb->PutRowRGB = put_row_rgb_RGBA8;
831d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul         rb->PutMonoRow = put_mono_row_RGBA8;
832d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul         rb->PutValues = put_values_RGBA8;
833d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul         rb->PutMonoValues = put_mono_values_RGBA8;
834d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul      }
835d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul      else if (rb->DataType == GL_UNSIGNED_SHORT) {
836d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul         rb->GetRow = get_row_RGBA16;
837d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul         rb->GetValues = get_values_RGBA16;
838d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul         rb->PutRow = put_row_RGBA16;
839d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul         rb->PutRowRGB = put_row_rgb_RGBA16;
840d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul         rb->PutMonoRow = put_mono_row_RGBA16;
841d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul         rb->PutValues = put_values_RGBA16;
842d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul         rb->PutMonoValues = put_mono_values_RGBA16;
843d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul      }
844d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul      else {
845d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul         rb->GetRow = get_row_RGBA32;
846d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul         rb->GetValues = get_values_RGBA32;
847d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul         rb->PutRow = put_row_RGBA32;
848d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul         rb->PutRowRGB = put_row_rgb_RGBA32;
849d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul         rb->PutMonoRow = put_mono_row_RGBA32;
850d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul         rb->PutValues = put_values_RGBA32;
851d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul         rb->PutMonoValues = put_mono_values_RGBA32;
852d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul      }
853e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   }
854e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   else if (osmesa->format == OSMESA_BGRA) {
855d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul      if (rb->DataType == GL_UNSIGNED_BYTE) {
856d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul         rb->GetRow = get_row_BGRA8;
857d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul         rb->GetValues = get_values_BGRA8;
858d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul         rb->PutRow = put_row_BGRA8;
859d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul         rb->PutRowRGB = put_row_rgb_BGRA8;
860d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul         rb->PutMonoRow = put_mono_row_BGRA8;
861d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul         rb->PutValues = put_values_BGRA8;
862d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul         rb->PutMonoValues = put_mono_values_BGRA8;
863d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul      }
864d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul      else if (rb->DataType == GL_UNSIGNED_SHORT) {
865d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul         rb->GetRow = get_row_BGRA16;
866d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul         rb->GetValues = get_values_BGRA16;
867d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul         rb->PutRow = put_row_BGRA16;
868d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul         rb->PutRowRGB = put_row_rgb_BGRA16;
869d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul         rb->PutMonoRow = put_mono_row_BGRA16;
870d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul         rb->PutValues = put_values_BGRA16;
871d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul         rb->PutMonoValues = put_mono_values_BGRA16;
872d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul      }
873d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul      else {
874d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul         rb->GetRow = get_row_BGRA32;
875d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul         rb->GetValues = get_values_BGRA32;
876d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul         rb->PutRow = put_row_BGRA32;
877d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul         rb->PutRowRGB = put_row_rgb_BGRA32;
878d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul         rb->PutMonoRow = put_mono_row_BGRA32;
879d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul         rb->PutValues = put_values_BGRA32;
880d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul         rb->PutMonoValues = put_mono_values_BGRA32;
881d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul      }
882e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   }
883e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   else if (osmesa->format == OSMESA_ARGB) {
884d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul      if (rb->DataType == GL_UNSIGNED_BYTE) {
885d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul         rb->GetRow = get_row_ARGB8;
886d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul         rb->GetValues = get_values_ARGB8;
887d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul         rb->PutRow = put_row_ARGB8;
888d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul         rb->PutRowRGB = put_row_rgb_ARGB8;
889d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul         rb->PutMonoRow = put_mono_row_ARGB8;
890d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul         rb->PutValues = put_values_ARGB8;
891d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul         rb->PutMonoValues = put_mono_values_ARGB8;
892d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul      }
893d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul      else if (rb->DataType == GL_UNSIGNED_SHORT) {
894d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul         rb->GetRow = get_row_ARGB16;
895d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul         rb->GetValues = get_values_ARGB16;
896d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul         rb->PutRow = put_row_ARGB16;
897d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul         rb->PutRowRGB = put_row_rgb_ARGB16;
898d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul         rb->PutMonoRow = put_mono_row_ARGB16;
899d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul         rb->PutValues = put_values_ARGB16;
900d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul         rb->PutMonoValues = put_mono_values_ARGB16;
901d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul      }
902d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul      else {
903d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul         rb->GetRow = get_row_ARGB32;
904d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul         rb->GetValues = get_values_ARGB32;
905d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul         rb->PutRow = put_row_ARGB32;
906d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul         rb->PutRowRGB = put_row_rgb_ARGB32;
907d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul         rb->PutMonoRow = put_mono_row_ARGB32;
908d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul         rb->PutValues = put_values_ARGB32;
909d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul         rb->PutMonoValues = put_mono_values_ARGB32;
910d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul      }
911e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   }
912e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   else if (osmesa->format == OSMESA_RGB) {
913d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul      if (rb->DataType == GL_UNSIGNED_BYTE) {
914d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul         rb->GetRow = get_row_RGB8;
915d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul         rb->GetValues = get_values_RGB8;
916d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul         rb->PutRow = put_row_RGB8;
917d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul         rb->PutRowRGB = put_row_rgb_RGB8;
918d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul         rb->PutMonoRow = put_mono_row_RGB8;
919d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul         rb->PutValues = put_values_RGB8;
920d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul         rb->PutMonoValues = put_mono_values_RGB8;
921d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul      }
922d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul      else if (rb->DataType == GL_UNSIGNED_SHORT) {
923d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul         rb->GetRow = get_row_RGB16;
924d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul         rb->GetValues = get_values_RGB16;
925d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul         rb->PutRow = put_row_RGB16;
926d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul         rb->PutRowRGB = put_row_rgb_RGB16;
927d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul         rb->PutMonoRow = put_mono_row_RGB16;
928d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul         rb->PutValues = put_values_RGB16;
929d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul         rb->PutMonoValues = put_mono_values_RGB16;
930d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul      }
931d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul      else {
932d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul         rb->GetRow = get_row_RGB32;
933d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul         rb->GetValues = get_values_RGB32;
934d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul         rb->PutRow = put_row_RGB32;
935d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul         rb->PutRowRGB = put_row_rgb_RGB32;
936d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul         rb->PutMonoRow = put_mono_row_RGB32;
937d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul         rb->PutValues = put_values_RGB32;
938d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul         rb->PutMonoValues = put_mono_values_RGB32;
939d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul      }
940afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
9419c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   else if (osmesa->format == OSMESA_BGR) {
942d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul      if (rb->DataType == GL_UNSIGNED_BYTE) {
943d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul         rb->GetRow = get_row_BGR8;
944d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul         rb->GetValues = get_values_BGR8;
945d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul         rb->PutRow = put_row_BGR8;
946d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul         rb->PutRowRGB = put_row_rgb_BGR8;
947d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul         rb->PutMonoRow = put_mono_row_BGR8;
948d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul         rb->PutValues = put_values_BGR8;
949d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul         rb->PutMonoValues = put_mono_values_BGR8;
950d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul      }
951d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul      else if (rb->DataType == GL_UNSIGNED_SHORT) {
952d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul         rb->GetRow = get_row_BGR16;
953d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul         rb->GetValues = get_values_BGR16;
954d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul         rb->PutRow = put_row_BGR16;
955d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul         rb->PutRowRGB = put_row_rgb_BGR16;
956d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul         rb->PutMonoRow = put_mono_row_BGR16;
957d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul         rb->PutValues = put_values_BGR16;
958d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul         rb->PutMonoValues = put_mono_values_BGR16;
959d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul      }
960d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul      else {
961d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul         rb->GetRow = get_row_BGR32;
962d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul         rb->GetValues = get_values_BGR32;
963d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul         rb->PutRow = put_row_BGR32;
964d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul         rb->PutRowRGB = put_row_rgb_BGR32;
965d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul         rb->PutMonoRow = put_mono_row_BGR32;
966d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul         rb->PutValues = put_values_BGR32;
967d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul         rb->PutMonoValues = put_mono_values_BGR32;
968d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul      }
9699c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   }
9709c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   else if (osmesa->format == OSMESA_RGB_565) {
971d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul      ASSERT(rb->DataType == GL_UNSIGNED_BYTE);
972e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      rb->GetRow = get_row_RGB_565;
973e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      rb->GetValues = get_values_RGB_565;
974e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      rb->PutRow = put_row_RGB_565;
9750ad1bda7a1f7d88556dd458e532815ff28c898aeDaniel Borca      rb->PutRowRGB = put_row_rgb_RGB_565;
976e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      rb->PutMonoRow = put_mono_row_RGB_565;
977e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      rb->PutValues = put_values_RGB_565;
978e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      rb->PutMonoValues = put_mono_values_RGB_565;
9799c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   }
9809c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   else {
981e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      _mesa_problem(ctx, "bad pixel format in osmesa renderbuffer_storage");
982afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
983afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
984b100484145d3518e4896d756b1ceccf61382c569Daniel Borca   rb->Width = width;
985b100484145d3518e4896d756b1ceccf61382c569Daniel Borca   rb->Height = height;
986b100484145d3518e4896d756b1ceccf61382c569Daniel Borca
987544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul   compute_row_addresses( osmesa );
988544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul
989e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   return GL_TRUE;
990afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
991afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
992afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
993e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul/**
994ed875a4cb3cf194637d696b2660b98fdc3b95b0fBrian Paul * Allocate a new renderbuffer to describe the user-provided color buffer.
995e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul */
996e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paulstatic struct gl_renderbuffer *
997d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paulnew_osmesa_renderbuffer(GLcontext *ctx, GLenum format, GLenum type)
998e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul{
999d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   const GLuint name = 0;
1000d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   struct gl_renderbuffer *rb = _mesa_new_renderbuffer(ctx, name);
1001e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   if (rb) {
1002216eb81c53908c9ac774a378425691aa66205a88Brian      rb->RefCount = 1;
1003e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      rb->Delete = osmesa_delete_renderbuffer;
1004e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      rb->AllocStorage = osmesa_renderbuffer_storage;
1005e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul
1006641705f0329c038079650089a664d76abfc5a937Ian Romanick      rb->InternalFormat = GL_RGBA;
100736b3a8bd5a317ab297f44b19fd14c7e76ec2fc77Brian Paul      switch (type) {
100836b3a8bd5a317ab297f44b19fd14c7e76ec2fc77Brian Paul      case GL_UNSIGNED_BYTE:
100936b3a8bd5a317ab297f44b19fd14c7e76ec2fc77Brian Paul         rb->Format = MESA_FORMAT_RGBA8888;
101036b3a8bd5a317ab297f44b19fd14c7e76ec2fc77Brian Paul         break;
101136b3a8bd5a317ab297f44b19fd14c7e76ec2fc77Brian Paul      case GL_UNSIGNED_SHORT:
101236b3a8bd5a317ab297f44b19fd14c7e76ec2fc77Brian Paul         rb->Format = MESA_FORMAT_SIGNED_RGBA_16;
101336b3a8bd5a317ab297f44b19fd14c7e76ec2fc77Brian Paul         break;
101436b3a8bd5a317ab297f44b19fd14c7e76ec2fc77Brian Paul      case GL_FLOAT:
101536b3a8bd5a317ab297f44b19fd14c7e76ec2fc77Brian Paul         rb->Format = MESA_FORMAT_RGBA_FLOAT32;
101636b3a8bd5a317ab297f44b19fd14c7e76ec2fc77Brian Paul         break;
101736b3a8bd5a317ab297f44b19fd14c7e76ec2fc77Brian Paul      default:
101836b3a8bd5a317ab297f44b19fd14c7e76ec2fc77Brian Paul         assert(0 && "Unexpected type in new_osmesa_renderbuffer()");
101936b3a8bd5a317ab297f44b19fd14c7e76ec2fc77Brian Paul         rb->Format = MESA_FORMAT_RGBA8888;
102036b3a8bd5a317ab297f44b19fd14c7e76ec2fc77Brian Paul      }
1021641705f0329c038079650089a664d76abfc5a937Ian Romanick      rb->_BaseFormat = GL_RGBA;
1022641705f0329c038079650089a664d76abfc5a937Ian Romanick      rb->DataType = type;
1023e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   }
1024e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   return rb;
1025e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul}
1026e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul
10279c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul
1028afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/**********************************************************************/
10299c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul/*****                    Public Functions                        *****/
1030afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/**********************************************************************/
1031afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1032afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1033d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul/**
10349c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * Create an Off-Screen Mesa rendering context.  The only attribute needed is
10359c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * an RGBA vs Color-Index mode flag.
10369c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul *
1037641705f0329c038079650089a664d76abfc5a937Ian Romanick * Input:  format - Must be GL_RGBA
10389c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul *         sharelist - specifies another OSMesaContext with which to share
10399c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul *                     display lists.  NULL indicates no sharing.
10409c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * Return:  an OSMesaContext or 0 if error
10419c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul */
10429c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian PaulGLAPI OSMesaContext GLAPIENTRY
10439c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian PaulOSMesaCreateContext( GLenum format, OSMesaContext sharelist )
1044afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
10459c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   return OSMesaCreateContextExt(format, DEFAULT_SOFTWARE_DEPTH_BITS,
1046641705f0329c038079650089a664d76abfc5a937Ian Romanick                                 8, 0, sharelist);
104774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul}
104874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul
104974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul
105074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul
1051d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul/**
10529c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * New in Mesa 3.5
10539c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul *
10549c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * Create context and specify size of ancillary buffers.
10559c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul */
10569c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian PaulGLAPI OSMesaContext GLAPIENTRY
10579c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian PaulOSMesaCreateContextExt( GLenum format, GLint depthBits, GLint stencilBits,
10589c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul                        GLint accumBits, OSMesaContext sharelist )
105974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul{
10609c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   OSMesaContext osmesa;
1061d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul   struct dd_function_table functions;
10629c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   GLint rind, gind, bind, aind;
1063641705f0329c038079650089a664d76abfc5a937Ian Romanick   GLint redBits = 0, greenBits = 0, blueBits = 0, alphaBits =0;
1064d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   GLenum type = CHAN_TYPE;
1065afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
10669c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   rind = gind = bind = aind = 0;
1067641705f0329c038079650089a664d76abfc5a937Ian Romanick   if (format==OSMESA_RGBA) {
10689c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      redBits = CHAN_BITS;
10699c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      greenBits = CHAN_BITS;
10709c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      blueBits = CHAN_BITS;
10719c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      alphaBits = CHAN_BITS;
10729c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      rind = 0;
10739c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      gind = 1;
10749c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      bind = 2;
10759c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      aind = 3;
1076afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
10779c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   else if (format==OSMESA_BGRA) {
10789c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      redBits = CHAN_BITS;
10799c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      greenBits = CHAN_BITS;
10809c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      blueBits = CHAN_BITS;
10819c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      alphaBits = CHAN_BITS;
10829c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      bind = 0;
10839c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      gind = 1;
10849c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      rind = 2;
10859c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      aind = 3;
1086afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
10879c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   else if (format==OSMESA_ARGB) {
10889c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      redBits = CHAN_BITS;
10899c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      greenBits = CHAN_BITS;
10909c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      blueBits = CHAN_BITS;
10919c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      alphaBits = CHAN_BITS;
10929c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      aind = 0;
10939c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      rind = 1;
10949c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      gind = 2;
10959c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      bind = 3;
1096206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul   }
10979c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   else if (format==OSMESA_RGB) {
10989c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      redBits = CHAN_BITS;
10999c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      greenBits = CHAN_BITS;
11009c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      blueBits = CHAN_BITS;
11019c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      alphaBits = 0;
11029c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      rind = 0;
11039c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      gind = 1;
11049c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      bind = 2;
1105afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
11069c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   else if (format==OSMESA_BGR) {
11079c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      redBits = CHAN_BITS;
11089c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      greenBits = CHAN_BITS;
11099c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      blueBits = CHAN_BITS;
11109c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      alphaBits = 0;
11119c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      rind = 2;
11129c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      gind = 1;
11139c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      bind = 0;
1114afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
1115cc9464e082b82179e3c4b51ea460212c10b2bf0cBrian Paul#if CHAN_TYPE == GL_UNSIGNED_BYTE
11169c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   else if (format==OSMESA_RGB_565) {
11179c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      redBits = 5;
11189c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      greenBits = 6;
11199c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      blueBits = 5;
11209c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      alphaBits = 0;
11219c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      rind = 0; /* not used */
11229c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      gind = 0;
11239c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      bind = 0;
1124afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
1125cc9464e082b82179e3c4b51ea460212c10b2bf0cBrian Paul#endif
1126afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   else {
11279c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      return NULL;
1128afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
1129afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
11309c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   osmesa = (OSMesaContext) CALLOC_STRUCT(osmesa_context);
11319c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   if (osmesa) {
1132fcf438e9e03f6e75bca4a49ad372fe7c4b1abbf8Ian Romanick      osmesa->gl_visual = _mesa_create_visual( GL_FALSE,    /* double buffer */
11339c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul                                               GL_FALSE,    /* stereo */
11349c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul                                               redBits,
11359c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul                                               greenBits,
11369c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul                                               blueBits,
11379c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul                                               alphaBits,
11389c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul                                               depthBits,
11399c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul                                               stencilBits,
11409c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul                                               accumBits,
11419c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul                                               accumBits,
11429c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul                                               accumBits,
11439c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul                                               alphaBits ? accumBits : 0,
11449c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul                                               1            /* num samples */
11459c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul                                               );
11469c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      if (!osmesa->gl_visual) {
114732f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg         free(osmesa);
11489c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         return NULL;
1149afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
1150afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1151d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul      /* Initialize device driver function table */
1152d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul      _mesa_init_driver_functions(&functions);
1153d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul      /* override with our functions */
1154d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul      functions.GetString = get_string;
1155d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul      functions.UpdateState = osmesa_update_state;
1156544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul      functions.GetBufferSize = NULL;
11576fafc7ad19a8b7400e57a86b588766b6f3811a05Brian Paul
11586fafc7ad19a8b7400e57a86b588766b6f3811a05Brian Paul      if (!_mesa_initialize_context(&osmesa->mesa,
11599c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul                                    osmesa->gl_visual,
11606fafc7ad19a8b7400e57a86b588766b6f3811a05Brian Paul                                    sharelist ? &sharelist->mesa
11619c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul                                              : (GLcontext *) NULL,
1162d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul                                    &functions, (void *) osmesa)) {
11639c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         _mesa_destroy_visual( osmesa->gl_visual );
116432f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg         free(osmesa);
11659c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         return NULL;
1166afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
116774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul
11686fafc7ad19a8b7400e57a86b588766b6f3811a05Brian Paul      _mesa_enable_sw_extensions(&(osmesa->mesa));
11696fafc7ad19a8b7400e57a86b588766b6f3811a05Brian Paul      _mesa_enable_1_3_extensions(&(osmesa->mesa));
11706fafc7ad19a8b7400e57a86b588766b6f3811a05Brian Paul      _mesa_enable_1_4_extensions(&(osmesa->mesa));
117184351999ec6ad07e0cfc31c0b3a8c86da4134bfeBrian Paul      _mesa_enable_1_5_extensions(&(osmesa->mesa));
11725c4ca968fab1b0b993fabeb73e3a5d92cbaadaf1Brian      _mesa_enable_2_0_extensions(&(osmesa->mesa));
11735c4ca968fab1b0b993fabeb73e3a5d92cbaadaf1Brian      _mesa_enable_2_1_extensions(&(osmesa->mesa));
117474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul
1175e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      osmesa->gl_buffer = _mesa_create_framebuffer(osmesa->gl_visual);
11769c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      if (!osmesa->gl_buffer) {
11779c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         _mesa_destroy_visual( osmesa->gl_visual );
11786fafc7ad19a8b7400e57a86b588766b6f3811a05Brian Paul         _mesa_free_context_data( &osmesa->mesa );
117932f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg         free(osmesa);
11809c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         return NULL;
11819c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      }
1182e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul
118336b3a8bd5a317ab297f44b19fd14c7e76ec2fc77Brian Paul      /* Create depth/stencil/accum buffers.  We'll create the color
118436b3a8bd5a317ab297f44b19fd14c7e76ec2fc77Brian Paul       * buffer later in OSMesaMakeCurrent().
118536b3a8bd5a317ab297f44b19fd14c7e76ec2fc77Brian Paul       */
1186e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      _mesa_add_soft_renderbuffers(osmesa->gl_buffer,
1187e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul                                   GL_FALSE, /* color */
1188e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul                                   osmesa->gl_visual->haveDepthBuffer,
1189e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul                                   osmesa->gl_visual->haveStencilBuffer,
1190e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul                                   osmesa->gl_visual->haveAccumBuffer,
1191e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul                                   GL_FALSE, /* alpha */
1192e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul                                   GL_FALSE /* aux */ );
1193e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul
11949c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      osmesa->format = format;
11959c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      osmesa->userRowLength = 0;
11969c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      osmesa->yup = GL_TRUE;
11979c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      osmesa->rInd = rind;
11989c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      osmesa->gInd = gind;
11999c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      osmesa->bInd = bind;
12009c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      osmesa->aInd = aind;
120174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul
12021741bc1a79b6a243e841bca704f1a720b028124aBrian Paul      _mesa_meta_init(&osmesa->mesa);
12031741bc1a79b6a243e841bca704f1a720b028124aBrian Paul
12049c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      /* Initialize the software rasterizer and helper modules. */
12059c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      {
12066fafc7ad19a8b7400e57a86b588766b6f3811a05Brian Paul	 GLcontext *ctx = &osmesa->mesa;
1207e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul         SWcontext *swrast;
1208e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul         TNLcontext *tnl;
1209afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1210c45b7364dab6c3daebc1f1d8d11124af4129074aBrian Paul	 if (!_swrast_CreateContext( ctx ) ||
12110a0fb5e0b3cfe61749af41d4200d42982b551cefKeith Whitwell             !_vbo_CreateContext( ctx ) ||
1212c45b7364dab6c3daebc1f1d8d11124af4129074aBrian Paul             !_tnl_CreateContext( ctx ) ||
1213c45b7364dab6c3daebc1f1d8d11124af4129074aBrian Paul             !_swsetup_CreateContext( ctx )) {
1214c45b7364dab6c3daebc1f1d8d11124af4129074aBrian Paul            _mesa_destroy_visual(osmesa->gl_visual);
1215c45b7364dab6c3daebc1f1d8d11124af4129074aBrian Paul            _mesa_free_context_data(ctx);
121632f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg            free(osmesa);
1217c45b7364dab6c3daebc1f1d8d11124af4129074aBrian Paul            return NULL;
1218c45b7364dab6c3daebc1f1d8d11124af4129074aBrian Paul         }
12199c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul
12209c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul	 _swsetup_Wakeup( ctx );
1221e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul
1222e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul         /* use default TCL pipeline */
1223e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul         tnl = TNL_CONTEXT(ctx);
1224e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul         tnl->Driver.RunPipeline = _tnl_run_pipeline;
1225e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul
1226e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul         /* Extend the software rasterizer with our optimized line and triangle
1227e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul          * drawing functions.
1228e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul          */
1229e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul         swrast = SWRAST_CONTEXT( ctx );
1230e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul         swrast->choose_line = osmesa_choose_line;
1231e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul         swrast->choose_triangle = osmesa_choose_triangle;
12329c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      }
1233afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
12349c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   return osmesa;
1235afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
1236afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1237afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1238d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul/**
12399c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * Destroy an Off-Screen Mesa rendering context.
12409c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul *
1241d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul * \param osmesa  the context to destroy
1242afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */
12439c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian PaulGLAPI void GLAPIENTRY
1244d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian PaulOSMesaDestroyContext( OSMesaContext osmesa )
1245afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
1246d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   if (osmesa) {
1247216eb81c53908c9ac774a378425691aa66205a88Brian      if (osmesa->rb)
1248216eb81c53908c9ac774a378425691aa66205a88Brian         _mesa_reference_renderbuffer(&osmesa->rb, NULL);
1249216eb81c53908c9ac774a378425691aa66205a88Brian
12501741bc1a79b6a243e841bca704f1a720b028124aBrian Paul      _mesa_meta_free( &osmesa->mesa );
12511741bc1a79b6a243e841bca704f1a720b028124aBrian Paul
1252d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul      _swsetup_DestroyContext( &osmesa->mesa );
1253d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul      _tnl_DestroyContext( &osmesa->mesa );
12540a0fb5e0b3cfe61749af41d4200d42982b551cefKeith Whitwell      _vbo_DestroyContext( &osmesa->mesa );
1255d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul      _swrast_DestroyContext( &osmesa->mesa );
1256d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul
1257d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul      _mesa_destroy_visual( osmesa->gl_visual );
12587eb5a2892d3d89f4b1800311babb40af1ec7d4e5Brian Paul      _mesa_reference_framebuffer( &osmesa->gl_buffer, NULL );
1259a510bc3ee1a696da120c09ee4ec33dc033f671acBrian
1260d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul      _mesa_free_context_data( &osmesa->mesa );
126132f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg      free( osmesa );
12629c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   }
12639c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul}
1264afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1265afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1266d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul/**
12679c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * Bind an OSMesaContext to an image buffer.  The image buffer is just a
12689c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * block of memory which the client provides.  Its size must be at least
12699c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * as large as width*height*sizeof(type).  Its address should be a multiple
12709c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * of 4 if using RGBA mode.
12719c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul *
12729c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * Image data is stored in the order of glDrawPixels:  row-major order
12739c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * with the lower-left image pixel stored in the first array position
12749c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * (ie. bottom-to-top).
12759c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul *
12769c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * If the context's viewport hasn't been initialized yet, it will now be
12779c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * initialized to (0,0,width,height).
12789c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul *
1279d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul * Input:  osmesa - the rendering context
12809c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul *         buffer - the image buffer memory
12819c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul *         type - data type for pixel components
12829c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul *            Normally, only GL_UNSIGNED_BYTE and GL_UNSIGNED_SHORT_5_6_5
12839c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul *            are supported.  But if Mesa's been compiled with CHAN_BITS==16
1284d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul *            then type may be GL_UNSIGNED_SHORT or GL_UNSIGNED_BYTE.  And if
1285d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul *            Mesa's been build with CHAN_BITS==32 then type may be GL_FLOAT,
1286d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul *            GL_UNSIGNED_SHORT or GL_UNSIGNED_BYTE.
12879c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul *         width, height - size of image buffer in pixels, at least 1
1288d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul * Return:  GL_TRUE if success, GL_FALSE if error because of invalid osmesa,
12899c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul *          invalid buffer address, invalid type, width<1, height<1,
12909c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul *          width>internal limit or height>internal limit.
1291afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */
12929c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian PaulGLAPI GLboolean GLAPIENTRY
1293d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian PaulOSMesaMakeCurrent( OSMesaContext osmesa, void *buffer, GLenum type,
12949c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul                   GLsizei width, GLsizei height )
1295afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
1296d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   if (!osmesa || !buffer ||
12979c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul       width < 1 || height < 1 ||
12989c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul       width > MAX_WIDTH || height > MAX_HEIGHT) {
12999c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      return GL_FALSE;
13009c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   }
130174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul
1302d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   if (osmesa->format == OSMESA_RGB_565 && type != GL_UNSIGNED_SHORT_5_6_5) {
1303d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul      return GL_FALSE;
1304afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
1305d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul
1306544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul#if 0
1307d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   if (!(type == GL_UNSIGNED_BYTE ||
1308d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul         (type == GL_UNSIGNED_SHORT && CHAN_BITS >= 16) ||
1309d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul         (type == GL_FLOAT && CHAN_BITS == 32))) {
1310d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul      /* i.e. is sizeof(type) * 8 > CHAN_BITS? */
13119c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      return GL_FALSE;
13129c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   }
1313544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul#endif
131458f4d67703381003c23fecbd3fe114ef9d1730c3Brian Paul
1315d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   osmesa_update_state( &osmesa->mesa, 0 );
1316c6c0f947142c0cc82626c238804a68b4e8f53945Brian Paul
1317c6c0f947142c0cc82626c238804a68b4e8f53945Brian Paul   /* Call this periodically to detect when the user has begun using
1318c6c0f947142c0cc82626c238804a68b4e8f53945Brian Paul    * GL rendering from multiple threads.
1319c6c0f947142c0cc82626c238804a68b4e8f53945Brian Paul    */
1320c6c0f947142c0cc82626c238804a68b4e8f53945Brian Paul   _glapi_check_multithread();
1321c6c0f947142c0cc82626c238804a68b4e8f53945Brian Paul
132236b3a8bd5a317ab297f44b19fd14c7e76ec2fc77Brian Paul
132336b3a8bd5a317ab297f44b19fd14c7e76ec2fc77Brian Paul   /* Create a front/left color buffer which wraps the user-provided buffer.
132436b3a8bd5a317ab297f44b19fd14c7e76ec2fc77Brian Paul    * There is no back color buffer.
132536b3a8bd5a317ab297f44b19fd14c7e76ec2fc77Brian Paul    * If the user tries to use a 8, 16 or 32-bit/channel buffer that
132636b3a8bd5a317ab297f44b19fd14c7e76ec2fc77Brian Paul    * doesn't match what Mesa was compiled for (CHAN_BITS) the
132736b3a8bd5a317ab297f44b19fd14c7e76ec2fc77Brian Paul    * _mesa_add_renderbuffer() function will create a "wrapper" renderbuffer
132836b3a8bd5a317ab297f44b19fd14c7e76ec2fc77Brian Paul    * that converts rendering from CHAN_BITS to the user-requested channel
132936b3a8bd5a317ab297f44b19fd14c7e76ec2fc77Brian Paul    * size.
133036b3a8bd5a317ab297f44b19fd14c7e76ec2fc77Brian Paul    */
133136b3a8bd5a317ab297f44b19fd14c7e76ec2fc77Brian Paul   osmesa->rb = new_osmesa_renderbuffer(&osmesa->mesa, osmesa->format, type);
133236b3a8bd5a317ab297f44b19fd14c7e76ec2fc77Brian Paul   _mesa_add_renderbuffer(osmesa->gl_buffer, BUFFER_FRONT_LEFT, osmesa->rb);
133336b3a8bd5a317ab297f44b19fd14c7e76ec2fc77Brian Paul   assert(osmesa->rb->RefCount == 2);
133436b3a8bd5a317ab297f44b19fd14c7e76ec2fc77Brian Paul
1335544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul   /* Set renderbuffer fields.  Set width/height = 0 to force
1336544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul    * osmesa_renderbuffer_storage() being called by _mesa_resize_framebuffer()
1337544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul    */
1338544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul   osmesa->rb->Data = buffer;
1339544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul   osmesa->rb->Width = osmesa->rb->Height = 0;
1340544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul
13419cbe0e24ac3772ec5db303e532166351affc91c9Brian Paul   /* Set the framebuffer's size.  This causes the
13429cbe0e24ac3772ec5db303e532166351affc91c9Brian Paul    * osmesa_renderbuffer_storage() function to get called.
13439cbe0e24ac3772ec5db303e532166351affc91c9Brian Paul    */
13449cbe0e24ac3772ec5db303e532166351affc91c9Brian Paul   _mesa_resize_framebuffer(&osmesa->mesa, osmesa->gl_buffer, width, height);
13459cbe0e24ac3772ec5db303e532166351affc91c9Brian Paul   osmesa->gl_buffer->Initialized = GL_TRUE; /* XXX TEMPORARY? */
13469cbe0e24ac3772ec5db303e532166351affc91c9Brian Paul
1347d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   _mesa_make_current( &osmesa->mesa, osmesa->gl_buffer, osmesa->gl_buffer );
134858f4d67703381003c23fecbd3fe114ef9d1730c3Brian Paul
134989ffca52ac18103ebaa754241a882ea8438ff9c4Brian Paul   /* Remove renderbuffer attachment, then re-add.  This installs the
1350544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul    * renderbuffer adaptor/wrapper if needed (for bpp conversion).
1351d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul    */
135289ffca52ac18103ebaa754241a882ea8438ff9c4Brian Paul   _mesa_remove_renderbuffer(osmesa->gl_buffer, BUFFER_FRONT_LEFT);
1353d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   _mesa_add_renderbuffer(osmesa->gl_buffer, BUFFER_FRONT_LEFT, osmesa->rb);
135474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul
135589ffca52ac18103ebaa754241a882ea8438ff9c4Brian Paul
1356d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   /* this updates the visual's red/green/blue/alphaBits fields */
1357d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   _mesa_update_framebuffer_visual(osmesa->gl_buffer);
1358d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul
1359d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   /* update the framebuffer size */
1360d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   _mesa_resize_framebuffer(&osmesa->mesa, osmesa->gl_buffer, width, height);
136174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul
13629c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   return GL_TRUE;
1363afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
1364afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
13651e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell
13661e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell
1367c5f9aa7750633e2989a6a139c283419d536ee3f7Brian PaulGLAPI OSMesaContext GLAPIENTRY
1368c5f9aa7750633e2989a6a139c283419d536ee3f7Brian PaulOSMesaGetCurrentContext( void )
13699c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul{
13709c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   GLcontext *ctx = _mesa_get_current_context();
13719c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   if (ctx)
13729c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      return (OSMesaContext) ctx;
13739c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   else
13749c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      return NULL;
13759c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul}
13762d595d70202bad560c27ea81ec71b740415b3355Brian Paul
13771e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell
13781e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell
1379c5f9aa7750633e2989a6a139c283419d536ee3f7Brian PaulGLAPI void GLAPIENTRY
1380c5f9aa7750633e2989a6a139c283419d536ee3f7Brian PaulOSMesaPixelStore( GLint pname, GLint value )
13811e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell{
13829c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   OSMesaContext osmesa = OSMesaGetCurrentContext();
1383dbd1e2b5990a3689bf718296c57c14fc3ba38db5Jouk Jansen
13849c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   switch (pname) {
13859c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      case OSMESA_ROW_LENGTH:
13869c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         if (value<0) {
13876fafc7ad19a8b7400e57a86b588766b6f3811a05Brian Paul            _mesa_error( &osmesa->mesa, GL_INVALID_VALUE,
13889c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul                      "OSMesaPixelStore(value)" );
13899c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul            return;
13909c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         }
13919c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         osmesa->userRowLength = value;
13929c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         break;
13939c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      case OSMESA_Y_UP:
13949c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         osmesa->yup = value ? GL_TRUE : GL_FALSE;
13959c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         break;
13969c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      default:
13976fafc7ad19a8b7400e57a86b588766b6f3811a05Brian Paul         _mesa_error( &osmesa->mesa, GL_INVALID_ENUM, "OSMesaPixelStore(pname)" );
13989c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         return;
13999c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   }
1400dbd1e2b5990a3689bf718296c57c14fc3ba38db5Jouk Jansen
14019c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   compute_row_addresses( osmesa );
14021e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell}
1403ed30dfa1264ec8875a3162c3c8778bc703bf11d5Brian Paul
1404ed30dfa1264ec8875a3162c3c8778bc703bf11d5Brian Paul
1405c5f9aa7750633e2989a6a139c283419d536ee3f7Brian PaulGLAPI void GLAPIENTRY
1406c5f9aa7750633e2989a6a139c283419d536ee3f7Brian PaulOSMesaGetIntegerv( GLint pname, GLint *value )
1407afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
14089c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   OSMesaContext osmesa = OSMesaGetCurrentContext();
14099c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul
14109c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   switch (pname) {
14119c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      case OSMESA_WIDTH:
1412544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul         if (osmesa->gl_buffer)
1413544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul            *value = osmesa->gl_buffer->Width;
1414544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul         else
1415544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul            *value = 0;
14169c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         return;
14179c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      case OSMESA_HEIGHT:
1418544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul         if (osmesa->gl_buffer)
1419544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul            *value = osmesa->gl_buffer->Height;
1420544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul         else
1421544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul            *value = 0;
14229c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         return;
14239c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      case OSMESA_FORMAT:
14249c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         *value = osmesa->format;
14259c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         return;
14269c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      case OSMESA_TYPE:
1427d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul         /* current color buffer's data type */
1428d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul         if (osmesa->rb) {
1429d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul            *value = osmesa->rb->DataType;
1430d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul         }
1431d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul         else {
1432d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul            *value = 0;
1433d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul         }
14349c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         return;
14359c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      case OSMESA_ROW_LENGTH:
14369c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         *value = osmesa->userRowLength;
14379c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         return;
14389c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      case OSMESA_Y_UP:
14399c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         *value = osmesa->yup;
14409c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         return;
14419c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      case OSMESA_MAX_WIDTH:
14429c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         *value = MAX_WIDTH;
14439c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         return;
14449c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      case OSMESA_MAX_HEIGHT:
14459c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         *value = MAX_HEIGHT;
14469c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         return;
1447afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      default:
14486fafc7ad19a8b7400e57a86b588766b6f3811a05Brian Paul         _mesa_error(&osmesa->mesa, GL_INVALID_ENUM, "OSMesaGetIntergerv(pname)");
14499c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         return;
1450afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
1451afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
1452afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1453d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul
1454d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul/**
14559c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * Return the depth buffer associated with an OSMesa context.
14569c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * Input:  c - the OSMesa context
14579c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * Output:  width, height - size of buffer in pixels
14589c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul *          bytesPerValue - bytes per depth value (2 or 4)
14599c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul *          buffer - pointer to depth buffer values
14609c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * Return:  GL_TRUE or GL_FALSE to indicate success or failure.
14619c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul */
14629c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian PaulGLAPI GLboolean GLAPIENTRY
14639c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian PaulOSMesaGetDepthBuffer( OSMesaContext c, GLint *width, GLint *height,
14649c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul                      GLint *bytesPerValue, void **buffer )
1465afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
1466e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   struct gl_renderbuffer *rb = NULL;
1467e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul
1468e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   if (c->gl_buffer)
1469e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      rb = c->gl_buffer->Attachment[BUFFER_DEPTH].Renderbuffer;
1470e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul
1471e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   if (!rb || !rb->Data) {
14729c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      *width = 0;
14739c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      *height = 0;
14749c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      *bytesPerValue = 0;
14759c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      *buffer = 0;
14769c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      return GL_FALSE;
147774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   }
14789c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   else {
1479544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul      *width = rb->Width;
1480544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul      *height = rb->Height;
14819c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      if (c->gl_visual->depthBits <= 16)
14829c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         *bytesPerValue = sizeof(GLushort);
14839c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      else
14849c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         *bytesPerValue = sizeof(GLuint);
1485e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      *buffer = rb->Data;
14869c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      return GL_TRUE;
1487afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
14889c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul}
14899c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul
1490d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul
1491d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul/**
14929c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * Return the color buffer associated with an OSMesa context.
14939c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * Input:  c - the OSMesa context
14949c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * Output:  width, height - size of buffer in pixels
14959c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul *          format - the pixel format (OSMESA_FORMAT)
14969c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul *          buffer - pointer to color buffer values
14979c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * Return:  GL_TRUE or GL_FALSE to indicate success or failure.
14989c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul */
14999c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian PaulGLAPI GLboolean GLAPIENTRY
1500d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian PaulOSMesaGetColorBuffer( OSMesaContext osmesa, GLint *width,
15019c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul                      GLint *height, GLint *format, void **buffer )
15029c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul{
1503d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   if (osmesa->rb && osmesa->rb->Data) {
1504d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul      *width = osmesa->rb->Width;
1505d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul      *height = osmesa->rb->Height;
1506d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul      *format = osmesa->format;
1507d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul      *buffer = osmesa->rb->Data;
1508d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul      return GL_TRUE;
1509d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   }
1510d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   else {
15119c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      *width = 0;
15129c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      *height = 0;
15139c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      *format = 0;
15149c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      *buffer = 0;
15159c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      return GL_FALSE;
1516206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul   }
15179c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul}
1518afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1519709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell
1520c5f9aa7750633e2989a6a139c283419d536ee3f7Brian Paulstruct name_function
1521c5f9aa7750633e2989a6a139c283419d536ee3f7Brian Paul{
15229c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   const char *Name;
15234d880987d248ff078845027cc21ba437564ac07dBrian Paul   OSMESAproc Function;
15249c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul};
15259c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul
1526c5f9aa7750633e2989a6a139c283419d536ee3f7Brian Paulstatic struct name_function functions[] = {
15274d880987d248ff078845027cc21ba437564ac07dBrian Paul   { "OSMesaCreateContext", (OSMESAproc) OSMesaCreateContext },
15284d880987d248ff078845027cc21ba437564ac07dBrian Paul   { "OSMesaCreateContextExt", (OSMESAproc) OSMesaCreateContextExt },
15294d880987d248ff078845027cc21ba437564ac07dBrian Paul   { "OSMesaDestroyContext", (OSMESAproc) OSMesaDestroyContext },
15304d880987d248ff078845027cc21ba437564ac07dBrian Paul   { "OSMesaMakeCurrent", (OSMESAproc) OSMesaMakeCurrent },
15314d880987d248ff078845027cc21ba437564ac07dBrian Paul   { "OSMesaGetCurrentContext", (OSMESAproc) OSMesaGetCurrentContext },
15324d880987d248ff078845027cc21ba437564ac07dBrian Paul   { "OSMesaPixelsStore", (OSMESAproc) OSMesaPixelStore },
15334d880987d248ff078845027cc21ba437564ac07dBrian Paul   { "OSMesaGetIntegerv", (OSMESAproc) OSMesaGetIntegerv },
15344d880987d248ff078845027cc21ba437564ac07dBrian Paul   { "OSMesaGetDepthBuffer", (OSMESAproc) OSMesaGetDepthBuffer },
15354d880987d248ff078845027cc21ba437564ac07dBrian Paul   { "OSMesaGetColorBuffer", (OSMESAproc) OSMesaGetColorBuffer },
15364d880987d248ff078845027cc21ba437564ac07dBrian Paul   { "OSMesaGetProcAddress", (OSMESAproc) OSMesaGetProcAddress },
1537ad766b5785c728e988e25509604c08fc347aba23Alan Hourihane   { "OSMesaColorClamp", (OSMESAproc) OSMesaColorClamp },
15389c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   { NULL, NULL }
15399c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul};
15409c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul
15414d880987d248ff078845027cc21ba437564ac07dBrian Paul
15424d880987d248ff078845027cc21ba437564ac07dBrian PaulGLAPI OSMESAproc GLAPIENTRY
15439c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian PaulOSMesaGetProcAddress( const char *funcName )
15449c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul{
15459c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   int i;
15469c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   for (i = 0; functions[i].Name; i++) {
15478d73aa6d1ae6e89bb2cd8f52f5586d569a4b6eebKenneth Graunke      if (strcmp(functions[i].Name, funcName) == 0)
15484d880987d248ff078845027cc21ba437564ac07dBrian Paul         return functions[i].Function;
15499c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   }
15504d880987d248ff078845027cc21ba437564ac07dBrian Paul   return _glapi_get_proc_address(funcName);
1551afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
1552ba3da6154c324cc916845bc5de3de077d0b59ffcBrian Paul
1553ba3da6154c324cc916845bc5de3de077d0b59ffcBrian Paul
1554ba3da6154c324cc916845bc5de3de077d0b59ffcBrian PaulGLAPI void GLAPIENTRY
1555ba3da6154c324cc916845bc5de3de077d0b59ffcBrian PaulOSMesaColorClamp(GLboolean enable)
1556ba3da6154c324cc916845bc5de3de077d0b59ffcBrian Paul{
1557ba3da6154c324cc916845bc5de3de077d0b59ffcBrian Paul   OSMesaContext osmesa = OSMesaGetCurrentContext();
1558ba3da6154c324cc916845bc5de3de077d0b59ffcBrian Paul
1559ba3da6154c324cc916845bc5de3de077d0b59ffcBrian Paul   if (enable == GL_TRUE) {
1560ba3da6154c324cc916845bc5de3de077d0b59ffcBrian Paul      osmesa->mesa.Color.ClampFragmentColor = GL_TRUE;
1561ba3da6154c324cc916845bc5de3de077d0b59ffcBrian Paul   }
1562ba3da6154c324cc916845bc5de3de077d0b59ffcBrian Paul   else {
1563ba3da6154c324cc916845bc5de3de077d0b59ffcBrian Paul      osmesa->mesa.Color.ClampFragmentColor = GL_FIXED_ONLY_ARB;
1564ba3da6154c324cc916845bc5de3de077d0b59ffcBrian Paul   }
1565ba3da6154c324cc916845bc5de3de077d0b59ffcBrian Paul}
1566ba3da6154c324cc916845bc5de3de077d0b59ffcBrian Paul
1567ba3da6154c324cc916845bc5de3de077d0b59ffcBrian Paul
1568