osmesa.c revision 5bdc6fdebc0ab59a888fba15136eb4a0ee2790e1
1afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/*
2afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Mesa 3-D graphics library
35704b8e57a0c618ddf51502e99e9dbd48cc3e685Brian Paul * Version:  6.5
4dbd1e2b5990a3689bf718296c57c14fc3ba38db5Jouk Jansen *
5c6c0f947142c0cc82626c238804a68b4e8f53945Brian Paul * Copyright (C) 1999-2006  Brian Paul   All Rights Reserved.
6dbd1e2b5990a3689bf718296c57c14fc3ba38db5Jouk Jansen *
7afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Permission is hereby granted, free of charge, to any person obtaining a
8afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * copy of this software and associated documentation files (the "Software"),
9afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * to deal in the Software without restriction, including without limitation
10afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * the rights to use, copy, modify, merge, publish, distribute, sublicense,
11afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * and/or sell copies of the Software, and to permit persons to whom the
12afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Software is furnished to do so, subject to the following conditions:
13dbd1e2b5990a3689bf718296c57c14fc3ba38db5Jouk Jansen *
14afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * The above copyright notice and this permission notice shall be included
15afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * in all copies or substantial portions of the Software.
16dbd1e2b5990a3689bf718296c57c14fc3ba38db5Jouk Jansen *
17afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
18afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
20afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
21afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
22afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
23afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */
24afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
25afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
26afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/*
27afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Off-Screen Mesa rendering / Rendering into client memory space
28d3c070ca6a36daa765b1ad7f44e03e6671ad0490Brian Paul *
29d3c070ca6a36daa765b1ad7f44e03e6671ad0490Brian Paul * Note on thread safety:  this driver is thread safe.  All
30d3c070ca6a36daa765b1ad7f44e03e6671ad0490Brian Paul * functions are reentrant.  The notion of current context is
31b1394fa92aaaf859ce9efc8b5fc194397921320cBrian Paul * managed by the core _mesa_make_current() and _mesa_get_current_context()
32d3c070ca6a36daa765b1ad7f44e03e6671ad0490Brian Paul * functions.  Those functions are thread-safe.
33afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */
34afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
35afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
36eed6f691991ed0d64752fa712c83f67eb700b9adBrian Paul#include "glheader.h"
37afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#include "GL/osmesa.h"
38afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#include "context.h"
398e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul#include "extensions.h"
40e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul#include "framebuffer.h"
41e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul#include "fbobject.h"
429a33a11d714c90162d32781ebbd2c1dfab52cfd1Brian Paul#include "imports.h"
43dbd1e2b5990a3689bf718296c57c14fc3ba38db5Jouk Jansen#include "mtypes.h"
44e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul#include "renderbuffer.h"
458e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul#include "array_cache/acache.h"
461e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell#include "swrast/swrast.h"
471e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell#include "swrast_setup/swrast_setup.h"
481e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell#include "swrast/s_context.h"
49724abeb058ca9372c5a9b9e38ee43dde1accaa41Keith Whitwell#include "swrast/s_depth.h"
501e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell#include "swrast/s_lines.h"
511e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell#include "swrast/s_triangle.h"
525a9026c65d260dc185e072163999f5d810015108Brian Paul#include "tnl/tnl.h"
53709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell#include "tnl/t_context.h"
54bc69de5f21ebb4d6e1c65bf5652d17a9fc87dda7Keith Whitwell#include "tnl/t_pipeline.h"
55d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul#include "drivers/common/driverfuncs.h"
56afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
57724abeb058ca9372c5a9b9e38ee43dde1accaa41Keith Whitwell
58724abeb058ca9372c5a9b9e38ee43dde1accaa41Keith Whitwell
59304357dcd496f7ebf499fd9c77b4eba83a75abd5Brian Paul/*
60304357dcd496f7ebf499fd9c77b4eba83a75abd5Brian Paul * This is the OS/Mesa context struct.
61304357dcd496f7ebf499fd9c77b4eba83a75abd5Brian Paul * Notice how it includes a GLcontext.  By doing this we're mimicking
62304357dcd496f7ebf499fd9c77b4eba83a75abd5Brian Paul * C++ inheritance/derivation.
63304357dcd496f7ebf499fd9c77b4eba83a75abd5Brian Paul * Later, we can cast a GLcontext pointer into an OSMesaContext pointer
64304357dcd496f7ebf499fd9c77b4eba83a75abd5Brian Paul * or vice versa.
65304357dcd496f7ebf499fd9c77b4eba83a75abd5Brian Paul */
66afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgstruct osmesa_context {
676fafc7ad19a8b7400e57a86b588766b6f3811a05Brian Paul   GLcontext mesa;		/* The core GL/Mesa context */
68afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLvisual *gl_visual;		/* Describes the buffers */
69afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLframebuffer *gl_buffer;	/* Depth, stencil, accum, etc buffers */
70afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLenum format;		/* either GL_RGBA or GL_COLOR_INDEX */
71afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   void *buffer;		/* the image buffer */
72afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLint width, height;		/* size of image buffer */
73afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLint rowlength;		/* number of pixels per row */
74afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLint userRowLength;		/* user-specified number of pixels per row */
7574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   GLint rInd, gInd, bInd, aInd;/* index offsets for RGBA formats */
7674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   GLchan *rowaddr[MAX_HEIGHT];	/* address of first pixel in each image row */
77afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLboolean yup;		/* TRUE  -> Y increases upward */
78afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg				/* FALSE -> Y increases downward */
79afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg};
80afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
81afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
826fafc7ad19a8b7400e57a86b588766b6f3811a05Brian Paul/* Just cast, since we're using structure containment */
83c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul#define OSMESA_CONTEXT(ctx)  ((OSMesaContext) (ctx->DriverCtx))
84c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul
85c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul
86c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul
87afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/**********************************************************************/
889c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul/*** Private Device Driver Functions                                ***/
89afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/**********************************************************************/
90afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
91afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
929c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paulstatic const GLubyte *
939c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paulget_string( GLcontext *ctx, GLenum name )
94afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
959c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   (void) ctx;
969c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   switch (name) {
979c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      case GL_RENDERER:
989c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#if CHAN_BITS == 32
999c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         return (const GLubyte *) "Mesa OffScreen32";
1009c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#elif CHAN_BITS == 16
1019c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         return (const GLubyte *) "Mesa OffScreen16";
1029c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#else
1039c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         return (const GLubyte *) "Mesa OffScreen";
1049c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#endif
1059c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      default:
1069c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         return NULL;
1079c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   }
1082bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul}
1092bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul
1102bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul
1119c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paulstatic void
1129c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paulosmesa_update_state( GLcontext *ctx, GLuint new_state )
1139c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul{
1149c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   /* easy - just propogate */
1159c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   _swrast_InvalidateState( ctx, new_state );
1169c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   _swsetup_InvalidateState( ctx, new_state );
1179c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   _ac_InvalidateState( ctx, new_state );
1189c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   _tnl_InvalidateState( ctx, new_state );
1199c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul}
1209c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul
1212bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul
122e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul/*
123e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul * Just return the current buffer size.
124e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul * There's no window to track the size of.
125e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul */
1269c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paulstatic void
1279c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paulget_buffer_size( GLframebuffer *buffer, GLuint *width, GLuint *height )
1289c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul{
1299c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   /* don't use GET_CURRENT_CONTEXT(ctx) here - it's a problem on Windows */
1309c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   GLcontext *ctx = (GLcontext *) _glapi_get_context();
1319c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   (void) buffer;
1329c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   if (ctx) {
1339c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
1349c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      *width = osmesa->width;
1359c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      *height = osmesa->height;
136afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
1379c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul}
1389c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul
1399c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul
1409c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul/**********************************************************************/
1419c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul/*****        Read/write spans/arrays of pixels                   *****/
1429c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul/**********************************************************************/
1435a9026c65d260dc185e072163999f5d810015108Brian Paul
1449c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul/* RGBA */
1459c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define NAME(PREFIX) PREFIX##_RGBA
146e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul#define FORMAT GL_RGBA
1479c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define SPAN_VARS \
1489c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   const OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
1499c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define INIT_PIXEL_PTR(P, X, Y) \
1509c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   GLchan *P = osmesa->rowaddr[Y] + 4 * (X)
1519c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define INC_PIXEL_PTR(P) P += 4
1529c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#if CHAN_TYPE == GL_FLOAT
153e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul#define STORE_PIXEL(DST, X, Y, VALUE) \
154e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   DST[0] = MAX2((VALUE[RCOMP]), 0.0F); \
155e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   DST[1] = MAX2((VALUE[GCOMP]), 0.0F); \
156e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   DST[2] = MAX2((VALUE[BCOMP]), 0.0F); \
157e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   DST[3] = CLAMP((VALUE[ACOMP]), 0.0F, CHAN_MAXF)
158286c4cc201390e868c4f9b5ebe14c40db2d74a5dBrian Paul#define STORE_PIXEL_RGB(DST, X, Y, VALUE) \
159286c4cc201390e868c4f9b5ebe14c40db2d74a5dBrian Paul   DST[0] = MAX2((VALUE[RCOMP]), 0.0F); \
160286c4cc201390e868c4f9b5ebe14c40db2d74a5dBrian Paul   DST[1] = MAX2((VALUE[GCOMP]), 0.0F); \
161286c4cc201390e868c4f9b5ebe14c40db2d74a5dBrian Paul   DST[2] = MAX2((VALUE[BCOMP]), 0.0F); \
162286c4cc201390e868c4f9b5ebe14c40db2d74a5dBrian Paul   DST[3] = CHAN_MAXF
1639c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#else
164e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul#define STORE_PIXEL(DST, X, Y, VALUE) \
165e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   DST[0] = VALUE[RCOMP];  \
166e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   DST[1] = VALUE[GCOMP];  \
167e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   DST[2] = VALUE[BCOMP];  \
168e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   DST[3] = VALUE[ACOMP]
169286c4cc201390e868c4f9b5ebe14c40db2d74a5dBrian Paul#define STORE_PIXEL_RGB(DST, X, Y, VALUE) \
170286c4cc201390e868c4f9b5ebe14c40db2d74a5dBrian Paul   DST[0] = VALUE[RCOMP];  \
171286c4cc201390e868c4f9b5ebe14c40db2d74a5dBrian Paul   DST[1] = VALUE[GCOMP];  \
172286c4cc201390e868c4f9b5ebe14c40db2d74a5dBrian Paul   DST[2] = VALUE[BCOMP];  \
173286c4cc201390e868c4f9b5ebe14c40db2d74a5dBrian Paul   DST[3] = CHAN_MAX
1749c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#endif
175e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul#define FETCH_PIXEL(DST, SRC) \
176e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   DST[RCOMP] = SRC[0];  \
177e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   DST[GCOMP] = SRC[1];  \
178e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   DST[BCOMP] = SRC[2];  \
17922652f952fbd3968f3d5a3db7898911508d76145Brian Paul   DST[ACOMP] = SRC[3]
180eae0439ae6027ba64fba49fe13360d105700905fBrian Paul#include "swrast/s_spantemp.h"
1814c44d63f01a01f134d7e4456d4209edee97f9ef5Brian Paul
1829c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul/* BGRA */
1839c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define NAME(PREFIX) PREFIX##_BGRA
184e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul#define FORMAT GL_RGBA
1859c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define SPAN_VARS \
1869c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   const OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
1879c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define INIT_PIXEL_PTR(P, X, Y) \
1889c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   GLchan *P = osmesa->rowaddr[Y] + 4 * (X)
1899c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define INC_PIXEL_PTR(P) P += 4
190e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul#define STORE_PIXEL(DST, X, Y, VALUE) \
191e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   DST[2] = VALUE[RCOMP];  \
192e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   DST[1] = VALUE[GCOMP];  \
193e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   DST[0] = VALUE[BCOMP];  \
194e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   DST[3] = VALUE[ACOMP]
195286c4cc201390e868c4f9b5ebe14c40db2d74a5dBrian Paul#define STORE_PIXEL_RGB(DST, X, Y, VALUE) \
196286c4cc201390e868c4f9b5ebe14c40db2d74a5dBrian Paul   DST[2] = VALUE[RCOMP];  \
197286c4cc201390e868c4f9b5ebe14c40db2d74a5dBrian Paul   DST[1] = VALUE[GCOMP];  \
198286c4cc201390e868c4f9b5ebe14c40db2d74a5dBrian Paul   DST[0] = VALUE[BCOMP];  \
199286c4cc201390e868c4f9b5ebe14c40db2d74a5dBrian Paul   DST[3] = CHAN_MAX
200e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul#define FETCH_PIXEL(DST, SRC) \
201e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   DST[RCOMP] = SRC[2];  \
202e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   DST[GCOMP] = SRC[1];  \
203e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   DST[BCOMP] = SRC[0];  \
20422652f952fbd3968f3d5a3db7898911508d76145Brian Paul   DST[ACOMP] = SRC[3]
205eae0439ae6027ba64fba49fe13360d105700905fBrian Paul#include "swrast/s_spantemp.h"
2069c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul
2079c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul/* ARGB */
2089c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define NAME(PREFIX) PREFIX##_ARGB
209e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul#define FORMAT GL_RGBA
2109c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define SPAN_VARS \
2119c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   const OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
2129c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define INIT_PIXEL_PTR(P, X, Y) \
2139c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   GLchan *P = osmesa->rowaddr[Y] + 4 * (X)
2149c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define INC_PIXEL_PTR(P) P += 4
215e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul#define STORE_PIXEL(DST, X, Y, VALUE) \
216e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   DST[1] = VALUE[RCOMP];  \
217e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   DST[2] = VALUE[GCOMP];  \
218e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   DST[3] = VALUE[BCOMP];  \
219e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   DST[0] = VALUE[ACOMP]
220286c4cc201390e868c4f9b5ebe14c40db2d74a5dBrian Paul#define STORE_PIXEL_RGB(DST, X, Y, VALUE) \
221286c4cc201390e868c4f9b5ebe14c40db2d74a5dBrian Paul   DST[1] = VALUE[RCOMP];  \
222286c4cc201390e868c4f9b5ebe14c40db2d74a5dBrian Paul   DST[2] = VALUE[GCOMP];  \
223286c4cc201390e868c4f9b5ebe14c40db2d74a5dBrian Paul   DST[3] = VALUE[BCOMP];  \
224286c4cc201390e868c4f9b5ebe14c40db2d74a5dBrian Paul   DST[0] = CHAN_MAX
225e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul#define FETCH_PIXEL(DST, SRC) \
226e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   DST[RCOMP] = SRC[1];  \
227e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   DST[GCOMP] = SRC[2];  \
228e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   DST[BCOMP] = SRC[3];  \
22922652f952fbd3968f3d5a3db7898911508d76145Brian Paul   DST[ACOMP] = SRC[0]
230eae0439ae6027ba64fba49fe13360d105700905fBrian Paul#include "swrast/s_spantemp.h"
2319c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul
2329c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul/* RGB */
2339c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define NAME(PREFIX) PREFIX##_RGB
234e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul#define FORMAT GL_RGBA
2359c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define SPAN_VARS \
2369c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   const OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
2379c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define INIT_PIXEL_PTR(P, X, Y) \
238c61763b5d26fdde05d3f301b8c0bdb609cd5b16fDaniel Borca   GLchan *P = osmesa->rowaddr[Y] + 3 * (X)
2393340a9ea9ea31e6bd7f37d5c1f25ffcc97f20a6bBrian Paul#define INC_PIXEL_PTR(P) P += 3
240e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul#define STORE_PIXEL(DST, X, Y, VALUE) \
241e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   DST[0] = VALUE[RCOMP];  \
242e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   DST[1] = VALUE[GCOMP];  \
243e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   DST[2] = VALUE[BCOMP]
244e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul#define FETCH_PIXEL(DST, SRC) \
245e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   DST[RCOMP] = SRC[0];  \
246e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   DST[GCOMP] = SRC[1];  \
247e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   DST[BCOMP] = SRC[2];  \
24822652f952fbd3968f3d5a3db7898911508d76145Brian Paul   DST[ACOMP] = CHAN_MAX
249eae0439ae6027ba64fba49fe13360d105700905fBrian Paul#include "swrast/s_spantemp.h"
2509c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul
2519c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul/* BGR */
2529c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define NAME(PREFIX) PREFIX##_BGR
253e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul#define FORMAT GL_RGBA
2549c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define SPAN_VARS \
2559c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   const OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
2569c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define INIT_PIXEL_PTR(P, X, Y) \
257c61763b5d26fdde05d3f301b8c0bdb609cd5b16fDaniel Borca   GLchan *P = osmesa->rowaddr[Y] + 3 * (X)
2583340a9ea9ea31e6bd7f37d5c1f25ffcc97f20a6bBrian Paul#define INC_PIXEL_PTR(P) P += 3
259e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul#define STORE_PIXEL(DST, X, Y, VALUE) \
260e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   DST[2] = VALUE[RCOMP];  \
261e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   DST[1] = VALUE[GCOMP];  \
262e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   DST[0] = VALUE[BCOMP]
263e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul#define FETCH_PIXEL(DST, SRC) \
264e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   DST[RCOMP] = SRC[2];  \
265e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   DST[GCOMP] = SRC[1];  \
266e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   DST[BCOMP] = SRC[0];  \
26722652f952fbd3968f3d5a3db7898911508d76145Brian Paul   DST[ACOMP] = CHAN_MAX
268eae0439ae6027ba64fba49fe13360d105700905fBrian Paul#include "swrast/s_spantemp.h"
2699c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul
2706ce60beb28fa96eeac22a90f6ce6156919d24e3dBrian Paul/* 16-bit RGB */
271cc9464e082b82179e3c4b51ea460212c10b2bf0cBrian Paul#if CHAN_TYPE == GL_UNSIGNED_BYTE
2729c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define NAME(PREFIX) PREFIX##_RGB_565
273e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul#define FORMAT GL_RGBA
2749c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define SPAN_VARS \
2759c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   const OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
2769c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define INIT_PIXEL_PTR(P, X, Y) \
2779c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   GLushort *P = (GLushort *) osmesa->rowaddr[Y] + (X)
2789c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define INC_PIXEL_PTR(P) P += 1
279e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul#define STORE_PIXEL(DST, X, Y, VALUE) \
280e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   *DST = ( (((VALUE[RCOMP]) & 0xf8) << 8) | (((VALUE[GCOMP]) & 0xfc) << 3) | ((VALUE[BCOMP]) >> 3) )
281e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul#define FETCH_PIXEL(DST, SRC) \
282e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   DST[RCOMP] = ( (((*SRC) >> 8) & 0xf8) | (((*SRC) >> 11) & 0x7) ); \
283e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   DST[GCOMP] = ( (((*SRC) >> 3) & 0xfc) | (((*SRC) >>  5) & 0x3) ); \
284e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   DST[BCOMP] = ( (((*SRC) << 3) & 0xf8) | (((*SRC)      ) & 0x7) ); \
285e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   DST[ACOMP] = CHAN_MAX
286eae0439ae6027ba64fba49fe13360d105700905fBrian Paul#include "swrast/s_spantemp.h"
287e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul#endif /* CHAN_TYPE == GL_UNSIGNED_BYTE */
2889c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul
2899c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul/* color index */
2909c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define NAME(PREFIX) PREFIX##_CI
291e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul#define FORMAT GL_COLOR_INDEX8_EXT
2929c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define SPAN_VARS \
2939c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   const OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
2949c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define INIT_PIXEL_PTR(P, X, Y) \
2955704b8e57a0c618ddf51502e99e9dbd48cc3e685Brian Paul   GLubyte *P = (GLubyte *) osmesa->rowaddr[Y] + (X)
2969c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define INC_PIXEL_PTR(P) P += 1
297e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul#define STORE_PIXEL(DST, X, Y, VALUE) \
298e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   *DST = VALUE[0]
299e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul#define FETCH_PIXEL(DST, SRC) \
300e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   DST = SRC[0]
301eae0439ae6027ba64fba49fe13360d105700905fBrian Paul#include "swrast/s_spantemp.h"
302e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul
303e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul
3041e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell
3051e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell
3069c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul/**********************************************************************/
3079c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul/*****                   Optimized line rendering                 *****/
3089c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul/**********************************************************************/
3091e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell
310afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
3119c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#if CHAN_TYPE == GL_FLOAT
3129c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define PACK_RGBA(DST, R, G, B, A)	\
3139c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Pauldo {					\
3149c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   (DST)[0] = MAX2( R, 0.0F );		\
3159c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   (DST)[1] = MAX2( G, 0.0F );		\
3169c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   (DST)[2] = MAX2( B, 0.0F );		\
3179c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   (DST)[3] = CLAMP(A, 0.0F, CHAN_MAXF);\
3189c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul} while (0)
3199c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#else
3209c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define PACK_RGBA(DST, R, G, B, A)	\
3219c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Pauldo {					\
3229c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   (DST)[osmesa->rInd] = R;		\
3239c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   (DST)[osmesa->gInd] = G;		\
3249c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   (DST)[osmesa->bInd] = B;		\
3259c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   (DST)[osmesa->aInd] = A;		\
3269c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul} while (0)
3279c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#endif
3289c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul
3299c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define PACK_RGB(DST, R, G, B)  \
3309c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Pauldo {				\
3319c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   (DST)[0] = R;		\
3329c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   (DST)[1] = G;		\
3339c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   (DST)[2] = B;		\
3349c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul} while (0)
3359c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul
3369c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define PACK_BGR(DST, R, G, B)  \
3379c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Pauldo {				\
3389c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   (DST)[0] = B;		\
3399c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   (DST)[1] = G;		\
3409c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   (DST)[2] = R;		\
3419c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul} while (0)
3429c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul
3439c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define PACK_RGB_565(DST, R, G, B)					\
3449c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Pauldo {									\
3459c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   (DST) = (((int) (R) << 8) & 0xf800) | (((int) (G) << 3) & 0x7e0) | ((int) (B) >> 3);\
3469c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul} while (0)
3479c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul
3489c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define UNPACK_RED(P)      ( (P)[osmesa->rInd] )
3499c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define UNPACK_GREEN(P)    ( (P)[osmesa->gInd] )
3509c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define UNPACK_BLUE(P)     ( (P)[osmesa->bInd] )
3519c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define UNPACK_ALPHA(P)    ( (P)[osmesa->aInd] )
352afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
3539c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define PIXELADDR1(X,Y)  (osmesa->rowaddr[Y] + (X))
3549c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define PIXELADDR2(X,Y)  (osmesa->rowaddr[Y] + 2 * (X))
3559c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define PIXELADDR3(X,Y)  (osmesa->rowaddr[Y] + 3 * (X))
3569c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define PIXELADDR4(X,Y)  (osmesa->rowaddr[Y] + 4 * (X))
357afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
3582bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul
359afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/*
3609c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * Draw a flat-shaded, RGB line into an osmesa buffer.
361afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */
36222a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul#define NAME flat_rgba_line
36322a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul#define CLIP_HACK 1
36422a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul#define SETUP_CODE						\
36522a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul   const OSMesaContext osmesa = OSMESA_CONTEXT(ctx);		\
3669c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   const GLchan *color = vert1->color;
367709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell
3689c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define PLOT(X, Y)						\
3699c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Pauldo {								\
3709c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   GLchan *p = PIXELADDR4(X, Y);				\
3719c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   PACK_RGBA(p, color[0], color[1], color[2], color[3]);	\
3729c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul} while (0)
373afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
3749c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#ifdef WIN32
3759c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#include "..\swrast\s_linetemp.h"
3769c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#else
3779c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#include "swrast/s_linetemp.h"
3789c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#endif
37922a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul
380afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
381afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
382afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/*
3839c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * Draw a flat-shaded, Z-less, RGB line into an osmesa buffer.
384afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */
38522a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul#define NAME flat_rgba_z_line
38622a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul#define CLIP_HACK 1
3879c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define INTERP_Z 1
3889c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE
38922a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul#define SETUP_CODE					\
39022a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul   const OSMesaContext osmesa = OSMESA_CONTEXT(ctx);	\
39122a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul   const GLchan *color = vert1->color;
39222a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul
3939c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define PLOT(X, Y)					\
3949c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Pauldo {							\
3959c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   if (Z < *zPtr) {					\
3969c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      GLchan *p = PIXELADDR4(X, Y);			\
3979c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      PACK_RGBA(p, color[RCOMP], color[GCOMP],		\
3989c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul                   color[BCOMP], color[ACOMP]);		\
3999c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      *zPtr = Z;					\
4009c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   }							\
4019c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul} while (0)
40274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul
4039c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#ifdef WIN32
4049c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#include "..\swrast\s_linetemp.h"
4059c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#else
4069c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#include "swrast/s_linetemp.h"
4079c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#endif
408206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul
409afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
410afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
4119c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul/*
4129c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * Analyze context state to see if we can provide a fast line drawing
4139c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * function, like those in lines.c.  Otherwise, return NULL.
4149c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul */
4159c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paulstatic swrast_line_func
4169c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paulosmesa_choose_line_function( GLcontext *ctx )
417afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
4189c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   const OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
4199c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   const SWcontext *swrast = SWRAST_CONTEXT(ctx);
420afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
4219c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   if (CHAN_BITS != 8)                    return NULL;
4229c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   if (ctx->RenderMode != GL_RENDER)      return NULL;
4239c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   if (ctx->Line.SmoothFlag)              return NULL;
4249c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   if (ctx->Texture._EnabledUnits)        return NULL;
4259c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   if (ctx->Light.ShadeModel != GL_FLAT)  return NULL;
4269c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   if (ctx->Line.Width != 1.0F)           return NULL;
4279c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   if (ctx->Line.StippleFlag)             return NULL;
4289c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   if (ctx->Line.SmoothFlag)              return NULL;
4299c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   if (osmesa->format != OSMESA_RGBA &&
4309c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul       osmesa->format != OSMESA_BGRA &&
4319c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul       osmesa->format != OSMESA_ARGB)     return NULL;
4329c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul
4339c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   if (swrast->_RasterMask==DEPTH_BIT
4349c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul       && ctx->Depth.Func==GL_LESS
4359c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul       && ctx->Depth.Mask==GL_TRUE
4369c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul       && ctx->Visual.depthBits == DEFAULT_SOFTWARE_DEPTH_BITS) {
4379c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      return (swrast_line_func) flat_rgba_z_line;
438afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
439afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
4409c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   if (swrast->_RasterMask == 0) {
4419c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      return (swrast_line_func) flat_rgba_line;
442afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
4439c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul
4449c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   return (swrast_line_func) NULL;
445afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
446afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
4479c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul
4489c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul/**********************************************************************/
4499c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul/*****                 Optimized triangle rendering               *****/
4509c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul/**********************************************************************/
4519c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul
4529c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul
45323ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank/*
4549c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * Smooth-shaded, z-less triangle, RGBA color.
45523ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank */
4569c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define NAME smooth_rgba_z_triangle
4579c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define INTERP_Z 1
4589c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE
4599c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define INTERP_RGB 1
4609c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define INTERP_ALPHA 1
4619c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define SETUP_CODE \
4629c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   const OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
4635bdec89da520f763b6d0faad1781f64566a97fddKarl Schultz#define RENDER_SPAN( span ) {					\
4649c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   GLuint i;							\
4659c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   GLchan *img = PIXELADDR4(span.x, span.y); 			\
4669c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   for (i = 0; i < span.end; i++, img += 4) {			\
4674092fbd55ac92a59d09d5167ced328683bed049cBrian Paul      const GLuint z = FixedToDepth(span.z);			\
4689c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      if (z < zRow[i]) {					\
4699c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         PACK_RGBA(img, FixedToChan(span.red),			\
4709c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul            FixedToChan(span.green), FixedToChan(span.blue),	\
4719c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul            FixedToChan(span.alpha));				\
4729c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         zRow[i] = z;						\
4739c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      }								\
4749c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      span.red += span.redStep;					\
4759c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      span.green += span.greenStep;				\
4769c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      span.blue += span.blueStep;				\
4779c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      span.alpha += span.alphaStep;				\
4789c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      span.z += span.zStep;					\
4795bdec89da520f763b6d0faad1781f64566a97fddKarl Schultz   }                                                            \
4805bdec89da520f763b6d0faad1781f64566a97fddKarl Schultz}
4819c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#ifdef WIN32
4829c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#include "..\swrast\s_tritemp.h"
4839c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#else
4849c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#include "swrast/s_tritemp.h"
4859c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#endif
48601dc182ee86922845ba0b17a2cda9af19150c93aBrian Paul
487afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
488afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
489afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/*
4909c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * Flat-shaded, z-less triangle, RGBA color.
491afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */
4929c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define NAME flat_rgba_z_triangle
4939c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define INTERP_Z 1
4949c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE
4959c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define SETUP_CODE						\
4969c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   const OSMesaContext osmesa = OSMESA_CONTEXT(ctx);		\
4979c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   GLuint pixel;						\
4989c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   PACK_RGBA((GLchan *) &pixel, v2->color[0], v2->color[1],	\
4999c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul                                v2->color[2], v2->color[3]);
500afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
5015bdec89da520f763b6d0faad1781f64566a97fddKarl Schultz#define RENDER_SPAN( span ) {				\
5029c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   GLuint i;						\
5039c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   GLuint *img = (GLuint *) PIXELADDR4(span.x, span.y);	\
5049c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   for (i = 0; i < span.end; i++) {			\
5054092fbd55ac92a59d09d5167ced328683bed049cBrian Paul      const GLuint z = FixedToDepth(span.z);		\
5069c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      if (z < zRow[i]) {				\
5079c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         img[i] = pixel;				\
5089c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         zRow[i] = z;					\
5099c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      }							\
5109c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      span.z += span.zStep;				\
5115bdec89da520f763b6d0faad1781f64566a97fddKarl Schultz   }                                                    \
5125bdec89da520f763b6d0faad1781f64566a97fddKarl Schultz}
5139c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#ifdef WIN32
5149c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#include "..\swrast\s_tritemp.h"
5154336c28c843923db3d9c8dc0a0cb2440ba94f064Brian Paul#else
5169c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#include "swrast/s_tritemp.h"
5174336c28c843923db3d9c8dc0a0cb2440ba94f064Brian Paul#endif
51874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul
519afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
520afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
5219c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul/*
5229c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * Return pointer to an accelerated triangle function if possible.
5239c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul */
5249c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paulstatic swrast_tri_func
5259c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paulosmesa_choose_triangle_function( GLcontext *ctx )
526afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
5279c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   const OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
5289c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   const SWcontext *swrast = SWRAST_CONTEXT(ctx);
529dd020f13a6d520b46aefd4453dae6b6edcc427f6Brian Paul
5309c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   if (CHAN_BITS != 8)                  return (swrast_tri_func) NULL;
5319c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   if (ctx->RenderMode != GL_RENDER)    return (swrast_tri_func) NULL;
5329c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   if (ctx->Polygon.SmoothFlag)         return (swrast_tri_func) NULL;
5339c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   if (ctx->Polygon.StippleFlag)        return (swrast_tri_func) NULL;
5349c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   if (ctx->Texture._EnabledUnits)      return (swrast_tri_func) NULL;
5359c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   if (osmesa->format != OSMESA_RGBA &&
5369c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul       osmesa->format != OSMESA_BGRA &&
5379c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul       osmesa->format != OSMESA_ARGB)   return (swrast_tri_func) NULL;
5389c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   if (ctx->Polygon.CullFlag &&
5399c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul       ctx->Polygon.CullFaceMode == GL_FRONT_AND_BACK)
5409c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul                                        return (swrast_tri_func) NULL;
54174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul
5429c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   if (swrast->_RasterMask == DEPTH_BIT &&
5439c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul       ctx->Depth.Func == GL_LESS &&
5449c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul       ctx->Depth.Mask == GL_TRUE &&
5459c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul       ctx->Visual.depthBits == DEFAULT_SOFTWARE_DEPTH_BITS) {
5469c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      if (ctx->Light.ShadeModel == GL_SMOOTH) {
5479c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         return (swrast_tri_func) smooth_rgba_z_triangle;
5489c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      }
5499c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      else {
5509c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         return (swrast_tri_func) flat_rgba_z_triangle;
551afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
552afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
5539c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   return (swrast_tri_func) NULL;
554afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
555afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
556afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
557afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
5589c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul/* Override for the swrast triangle-selection function.  Try to use one
5599c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * of our internal triangle functions, otherwise fall back to the
5609c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * standard swrast functions.
5619c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul */
5629c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paulstatic void
5639c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paulosmesa_choose_triangle( GLcontext *ctx )
564afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
5659c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   SWcontext *swrast = SWRAST_CONTEXT(ctx);
566afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
5679c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   swrast->Triangle = osmesa_choose_triangle_function( ctx );
5689c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   if (!swrast->Triangle)
5699c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      _swrast_choose_triangle( ctx );
5709c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul}
571afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
57274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void
5739c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paulosmesa_choose_line( GLcontext *ctx )
574afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
5759c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   SWcontext *swrast = SWRAST_CONTEXT(ctx);
5769c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul
5779c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   swrast->Line = osmesa_choose_line_function( ctx );
5789c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   if (!swrast->Line)
5799c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      _swrast_choose_line( ctx );
580afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
581afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
582afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
583e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul/**
584e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul * Don't use _mesa_delete_renderbuffer since we can't free rb->Data.
585e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul */
58674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void
587e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paulosmesa_delete_renderbuffer(struct gl_renderbuffer *rb)
588afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
589e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   _mesa_free(rb);
590e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul}
591e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul
592e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul
593e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul/**
594e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul * Allocate renderbuffer storage.  We don't actually allocate any storage
595e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul * since we're using a user-provided buffer.
596e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul * Just set up all the gl_renderbuffer methods.
597e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul */
598e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paulstatic GLboolean
599e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paulosmesa_renderbuffer_storage(GLcontext *ctx, struct gl_renderbuffer *rb,
600e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul                            GLenum internalFormat, GLuint width, GLuint height)
601e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul{
602e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   const OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
603e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul
6049e81d6ae3a6db9831d6aea0fe4d92722176e9f74Brian Paul   /* Note: we can ignoring internalFormat for "window-system" renderbuffers */
6055bdc6fdebc0ab59a888fba15136eb4a0ee2790e1Brian Paul   (void) internalFormat;
6065bdc6fdebc0ab59a888fba15136eb4a0ee2790e1Brian Paul
607e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   if (osmesa->format == OSMESA_RGBA) {
608e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      rb->GetRow = get_row_RGBA;
609e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      rb->GetValues = get_values_RGBA;
610e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      rb->PutRow = put_row_RGBA;
611286c4cc201390e868c4f9b5ebe14c40db2d74a5dBrian Paul      rb->PutRowRGB = put_row_rgb_RGBA;
612e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      rb->PutMonoRow = put_mono_row_RGBA;
613e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      rb->PutValues = put_values_RGBA;
614e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      rb->PutMonoValues = put_mono_values_RGBA;
6159e81d6ae3a6db9831d6aea0fe4d92722176e9f74Brian Paul      rb->RedBits =
6169e81d6ae3a6db9831d6aea0fe4d92722176e9f74Brian Paul      rb->GreenBits =
6179e81d6ae3a6db9831d6aea0fe4d92722176e9f74Brian Paul      rb->BlueBits =
6189e81d6ae3a6db9831d6aea0fe4d92722176e9f74Brian Paul      rb->AlphaBits = 8 * sizeof(GLchan);
619e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   }
620e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   else if (osmesa->format == OSMESA_BGRA) {
621e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      rb->GetRow = get_row_BGRA;
622e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      rb->GetValues = get_values_BGRA;
623e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      rb->PutRow = put_row_BGRA;
624286c4cc201390e868c4f9b5ebe14c40db2d74a5dBrian Paul      rb->PutRowRGB = put_row_rgb_BGRA;
625e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      rb->PutMonoRow = put_mono_row_BGRA;
626e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      rb->PutValues = put_values_BGRA;
627e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      rb->PutMonoValues = put_mono_values_BGRA;
6289e81d6ae3a6db9831d6aea0fe4d92722176e9f74Brian Paul      rb->RedBits =
6299e81d6ae3a6db9831d6aea0fe4d92722176e9f74Brian Paul      rb->GreenBits =
6309e81d6ae3a6db9831d6aea0fe4d92722176e9f74Brian Paul      rb->BlueBits =
6319e81d6ae3a6db9831d6aea0fe4d92722176e9f74Brian Paul      rb->AlphaBits = 8 * sizeof(GLchan);
632e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   }
633e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   else if (osmesa->format == OSMESA_ARGB) {
634e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      rb->GetRow = get_row_ARGB;
635e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      rb->GetValues = get_values_ARGB;
636e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      rb->PutRow = put_row_ARGB;
637286c4cc201390e868c4f9b5ebe14c40db2d74a5dBrian Paul      rb->PutRowRGB = put_row_rgb_ARGB;
638e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      rb->PutMonoRow = put_mono_row_ARGB;
639e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      rb->PutValues = put_values_ARGB;
640e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      rb->PutMonoValues = put_mono_values_ARGB;
6419e81d6ae3a6db9831d6aea0fe4d92722176e9f74Brian Paul      rb->RedBits =
6429e81d6ae3a6db9831d6aea0fe4d92722176e9f74Brian Paul      rb->GreenBits =
6439e81d6ae3a6db9831d6aea0fe4d92722176e9f74Brian Paul      rb->BlueBits =
6449e81d6ae3a6db9831d6aea0fe4d92722176e9f74Brian Paul      rb->AlphaBits = 8 * sizeof(GLchan);
645e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   }
646e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   else if (osmesa->format == OSMESA_RGB) {
647e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      rb->GetRow = get_row_RGB;
648e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      rb->GetValues = get_values_RGB;
649e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      rb->PutRow = put_row_RGB;
650286c4cc201390e868c4f9b5ebe14c40db2d74a5dBrian Paul      rb->PutRowRGB = put_row_rgb_RGB;
651e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      rb->PutMonoRow = put_mono_row_RGB;
652e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      rb->PutValues = put_values_RGB;
653e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      rb->PutMonoValues = put_mono_values_RGB;
6549e81d6ae3a6db9831d6aea0fe4d92722176e9f74Brian Paul      rb->RedBits =
6559e81d6ae3a6db9831d6aea0fe4d92722176e9f74Brian Paul      rb->GreenBits =
6569e81d6ae3a6db9831d6aea0fe4d92722176e9f74Brian Paul      rb->BlueBits = 8 * sizeof(GLchan);
657afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
6589c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   else if (osmesa->format == OSMESA_BGR) {
659e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      rb->GetRow = get_row_BGR;
660e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      rb->GetValues = get_values_BGR;
661e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      rb->PutRow = put_row_BGR;
662286c4cc201390e868c4f9b5ebe14c40db2d74a5dBrian Paul      rb->PutRowRGB = put_row_rgb_BGR;
663e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      rb->PutMonoRow = put_mono_row_BGR;
664e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      rb->PutValues = put_values_BGR;
665e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      rb->PutMonoValues = put_mono_values_BGR;
6669e81d6ae3a6db9831d6aea0fe4d92722176e9f74Brian Paul      rb->RedBits =
6679e81d6ae3a6db9831d6aea0fe4d92722176e9f74Brian Paul      rb->GreenBits =
6689e81d6ae3a6db9831d6aea0fe4d92722176e9f74Brian Paul      rb->BlueBits = 8 * sizeof(GLchan);
6699c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   }
670cc9464e082b82179e3c4b51ea460212c10b2bf0cBrian Paul#if CHAN_TYPE == GL_UNSIGNED_BYTE
6719c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   else if (osmesa->format == OSMESA_RGB_565) {
672e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      rb->GetRow = get_row_RGB_565;
673e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      rb->GetValues = get_values_RGB_565;
674e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      rb->PutRow = put_row_RGB_565;
6750ad1bda7a1f7d88556dd458e532815ff28c898aeDaniel Borca      rb->PutRowRGB = put_row_rgb_RGB_565;
676e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      rb->PutMonoRow = put_mono_row_RGB_565;
677e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      rb->PutValues = put_values_RGB_565;
678e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      rb->PutMonoValues = put_mono_values_RGB_565;
6799e81d6ae3a6db9831d6aea0fe4d92722176e9f74Brian Paul      rb->RedBits = 5;
6809e81d6ae3a6db9831d6aea0fe4d92722176e9f74Brian Paul      rb->GreenBits = 6;
6819e81d6ae3a6db9831d6aea0fe4d92722176e9f74Brian Paul      rb->BlueBits = 5;
6829c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   }
683cc9464e082b82179e3c4b51ea460212c10b2bf0cBrian Paul#endif
6849c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   else if (osmesa->format == OSMESA_COLOR_INDEX) {
685e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      rb->GetRow = get_row_CI;
686e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      rb->GetValues = get_values_CI;
687e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      rb->PutRow = put_row_CI;
688e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      rb->PutMonoRow = put_mono_row_CI;
689e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      rb->PutValues = put_values_CI;
690e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      rb->PutMonoValues = put_mono_values_CI;
6919e81d6ae3a6db9831d6aea0fe4d92722176e9f74Brian Paul      rb->IndexBits = 8;
6929c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   }
6939c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   else {
694e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      _mesa_problem(ctx, "bad pixel format in osmesa renderbuffer_storage");
695afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
696afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
697b100484145d3518e4896d756b1ceccf61382c569Daniel Borca   rb->Width = width;
698b100484145d3518e4896d756b1ceccf61382c569Daniel Borca   rb->Height = height;
699b100484145d3518e4896d756b1ceccf61382c569Daniel Borca
700e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   return GL_TRUE;
701afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
702afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
703afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
704e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul/**
705e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul * Allocate a new renderbuffer tpo describe the user-provided color buffer.
706e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul */
707e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paulstatic struct gl_renderbuffer *
708e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paulnew_osmesa_renderbuffer(GLenum format)
709e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul{
710e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   struct gl_renderbuffer *rb = CALLOC_STRUCT(gl_renderbuffer);
711e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   if (rb) {
712e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      const GLuint name = 0;
713e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      _mesa_init_renderbuffer(rb, name);
714e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul
715e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      rb->Delete = osmesa_delete_renderbuffer;
716e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      rb->AllocStorage = osmesa_renderbuffer_storage;
717e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul
718e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      if (format == OSMESA_COLOR_INDEX) {
719e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul         rb->_BaseFormat = GL_COLOR_INDEX;
720e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul         rb->InternalFormat = GL_COLOR_INDEX;
721e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul         rb->DataType = GL_UNSIGNED_BYTE;
722e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      }
723e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      else {
724e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul         rb->_BaseFormat = GL_RGBA;
725e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul         rb->InternalFormat = GL_RGBA;
726e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul         rb->DataType = CHAN_TYPE;
727e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      }
728e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   }
729e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   return rb;
730e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul}
731e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul
7329c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul
733afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
734afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/**********************************************************************/
7359c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul/*****                    Public Functions                        *****/
736afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/**********************************************************************/
737afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
738afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
7399c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul/*
7409c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * Create an Off-Screen Mesa rendering context.  The only attribute needed is
7419c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * an RGBA vs Color-Index mode flag.
7429c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul *
7439c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * Input:  format - either GL_RGBA or GL_COLOR_INDEX
7449c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul *         sharelist - specifies another OSMesaContext with which to share
7459c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul *                     display lists.  NULL indicates no sharing.
7469c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * Return:  an OSMesaContext or 0 if error
7479c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul */
7489c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian PaulGLAPI OSMesaContext GLAPIENTRY
7499c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian PaulOSMesaCreateContext( GLenum format, OSMesaContext sharelist )
750afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
7514128d88b98e22676fa05ed586da1641c85a0bde2Brian Paul   const GLint accumBits = (format == OSMESA_COLOR_INDEX) ? 0 : 16;
7529c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   return OSMesaCreateContextExt(format, DEFAULT_SOFTWARE_DEPTH_BITS,
7535dce1e5c420872ae096854841a9665f8d3d649fbBrian Paul                                 8, accumBits, sharelist);
75474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul}
75574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul
75674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul
75774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul
7589c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul/*
7599c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * New in Mesa 3.5
7609c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul *
7619c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * Create context and specify size of ancillary buffers.
7629c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul */
7639c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian PaulGLAPI OSMesaContext GLAPIENTRY
7649c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian PaulOSMesaCreateContextExt( GLenum format, GLint depthBits, GLint stencilBits,
7659c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul                        GLint accumBits, OSMesaContext sharelist )
76674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul{
7679c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   OSMesaContext osmesa;
768d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul   struct dd_function_table functions;
7699c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   GLint rind, gind, bind, aind;
7709c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   GLint indexBits = 0, redBits = 0, greenBits = 0, blueBits = 0, alphaBits =0;
7719c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   GLboolean rgbmode;
772afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
7739c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   rind = gind = bind = aind = 0;
7749c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   if (format==OSMESA_COLOR_INDEX) {
7759c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      indexBits = 8;
7769c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      rgbmode = GL_FALSE;
77774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   }
7789c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   else if (format==OSMESA_RGBA) {
7799c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      indexBits = 0;
7809c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      redBits = CHAN_BITS;
7819c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      greenBits = CHAN_BITS;
7829c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      blueBits = CHAN_BITS;
7839c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      alphaBits = CHAN_BITS;
7849c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      rind = 0;
7859c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      gind = 1;
7869c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      bind = 2;
7879c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      aind = 3;
7889c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      rgbmode = GL_TRUE;
789afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
7909c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   else if (format==OSMESA_BGRA) {
7919c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      indexBits = 0;
7929c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      redBits = CHAN_BITS;
7939c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      greenBits = CHAN_BITS;
7949c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      blueBits = CHAN_BITS;
7959c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      alphaBits = CHAN_BITS;
7969c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      bind = 0;
7979c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      gind = 1;
7989c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      rind = 2;
7999c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      aind = 3;
8009c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      rgbmode = GL_TRUE;
801afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
8029c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   else if (format==OSMESA_ARGB) {
8039c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      indexBits = 0;
8049c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      redBits = CHAN_BITS;
8059c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      greenBits = CHAN_BITS;
8069c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      blueBits = CHAN_BITS;
8079c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      alphaBits = CHAN_BITS;
8089c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      aind = 0;
8099c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      rind = 1;
8109c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      gind = 2;
8119c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      bind = 3;
8129c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      rgbmode = GL_TRUE;
813206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul   }
8149c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   else if (format==OSMESA_RGB) {
8159c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      indexBits = 0;
8169c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      redBits = CHAN_BITS;
8179c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      greenBits = CHAN_BITS;
8189c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      blueBits = CHAN_BITS;
8199c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      alphaBits = 0;
8209c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      rind = 0;
8219c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      gind = 1;
8229c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      bind = 2;
8239c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      rgbmode = GL_TRUE;
824afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
8259c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   else if (format==OSMESA_BGR) {
8269c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      indexBits = 0;
8279c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      redBits = CHAN_BITS;
8289c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      greenBits = CHAN_BITS;
8299c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      blueBits = CHAN_BITS;
8309c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      alphaBits = 0;
8319c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      rind = 2;
8329c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      gind = 1;
8339c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      bind = 0;
8349c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      rgbmode = GL_TRUE;
835afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
836cc9464e082b82179e3c4b51ea460212c10b2bf0cBrian Paul#if CHAN_TYPE == GL_UNSIGNED_BYTE
8379c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   else if (format==OSMESA_RGB_565) {
8389c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      indexBits = 0;
8399c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      redBits = 5;
8409c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      greenBits = 6;
8419c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      blueBits = 5;
8429c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      alphaBits = 0;
8439c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      rind = 0; /* not used */
8449c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      gind = 0;
8459c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      bind = 0;
8469c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      rgbmode = GL_TRUE;
847afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
848cc9464e082b82179e3c4b51ea460212c10b2bf0cBrian Paul#endif
849afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   else {
8509c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      return NULL;
851afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
852afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
8539c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   osmesa = (OSMesaContext) CALLOC_STRUCT(osmesa_context);
8549c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   if (osmesa) {
8559c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      osmesa->gl_visual = _mesa_create_visual( rgbmode,
8569c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul                                               GL_FALSE,    /* double buffer */
8579c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul                                               GL_FALSE,    /* stereo */
8589c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul                                               redBits,
8599c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul                                               greenBits,
8609c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul                                               blueBits,
8619c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul                                               alphaBits,
8629c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul                                               indexBits,
8639c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul                                               depthBits,
8649c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul                                               stencilBits,
8659c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul                                               accumBits,
8669c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul                                               accumBits,
8679c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul                                               accumBits,
8689c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul                                               alphaBits ? accumBits : 0,
8699c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul                                               1            /* num samples */
8709c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul                                               );
8719c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      if (!osmesa->gl_visual) {
8729c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         FREE(osmesa);
8739c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         return NULL;
874afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
875afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
876d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul      /* Initialize device driver function table */
877d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul      _mesa_init_driver_functions(&functions);
878d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul      /* override with our functions */
879d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul      functions.GetString = get_string;
880d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul      functions.UpdateState = osmesa_update_state;
881d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul      functions.GetBufferSize = get_buffer_size;
8826fafc7ad19a8b7400e57a86b588766b6f3811a05Brian Paul
8836fafc7ad19a8b7400e57a86b588766b6f3811a05Brian Paul      if (!_mesa_initialize_context(&osmesa->mesa,
8849c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul                                    osmesa->gl_visual,
8856fafc7ad19a8b7400e57a86b588766b6f3811a05Brian Paul                                    sharelist ? &sharelist->mesa
8869c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul                                              : (GLcontext *) NULL,
887d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul                                    &functions, (void *) osmesa)) {
8889c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         _mesa_destroy_visual( osmesa->gl_visual );
8899c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         FREE(osmesa);
8909c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         return NULL;
891afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
89274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul
8936fafc7ad19a8b7400e57a86b588766b6f3811a05Brian Paul      _mesa_enable_sw_extensions(&(osmesa->mesa));
8946fafc7ad19a8b7400e57a86b588766b6f3811a05Brian Paul      _mesa_enable_1_3_extensions(&(osmesa->mesa));
8956fafc7ad19a8b7400e57a86b588766b6f3811a05Brian Paul      _mesa_enable_1_4_extensions(&(osmesa->mesa));
89684351999ec6ad07e0cfc31c0b3a8c86da4134bfeBrian Paul      _mesa_enable_1_5_extensions(&(osmesa->mesa));
89774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul
898e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      osmesa->gl_buffer = _mesa_create_framebuffer(osmesa->gl_visual);
8999c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      if (!osmesa->gl_buffer) {
9009c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         _mesa_destroy_visual( osmesa->gl_visual );
9016fafc7ad19a8b7400e57a86b588766b6f3811a05Brian Paul         _mesa_free_context_data( &osmesa->mesa );
9029c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         FREE(osmesa);
9039c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         return NULL;
9049c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      }
905e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul
906fc3bc1ae14e7aa769fe01c007a1d68f2ff6db7b8Brian Paul      /* create front color buffer in user-provided memory (no back buffer) */
907e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      _mesa_add_renderbuffer(osmesa->gl_buffer, BUFFER_FRONT_LEFT,
908e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul                             new_osmesa_renderbuffer(format));
909e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      _mesa_add_soft_renderbuffers(osmesa->gl_buffer,
910e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul                                   GL_FALSE, /* color */
911e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul                                   osmesa->gl_visual->haveDepthBuffer,
912e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul                                   osmesa->gl_visual->haveStencilBuffer,
913e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul                                   osmesa->gl_visual->haveAccumBuffer,
914e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul                                   GL_FALSE, /* alpha */
915e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul                                   GL_FALSE /* aux */ );
916e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul
9179c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      osmesa->format = format;
9189c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      osmesa->buffer = NULL;
9199c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      osmesa->width = 0;
9209c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      osmesa->height = 0;
9219c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      osmesa->userRowLength = 0;
9229c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      osmesa->rowlength = 0;
9239c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      osmesa->yup = GL_TRUE;
9249c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      osmesa->rInd = rind;
9259c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      osmesa->gInd = gind;
9269c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      osmesa->bInd = bind;
9279c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      osmesa->aInd = aind;
92874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul
9299c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      /* Initialize the software rasterizer and helper modules. */
9309c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      {
9316fafc7ad19a8b7400e57a86b588766b6f3811a05Brian Paul	 GLcontext *ctx = &osmesa->mesa;
932e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul         SWcontext *swrast;
933e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul         TNLcontext *tnl;
934afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
935c45b7364dab6c3daebc1f1d8d11124af4129074aBrian Paul	 if (!_swrast_CreateContext( ctx ) ||
936c45b7364dab6c3daebc1f1d8d11124af4129074aBrian Paul             !_ac_CreateContext( ctx ) ||
937c45b7364dab6c3daebc1f1d8d11124af4129074aBrian Paul             !_tnl_CreateContext( ctx ) ||
938c45b7364dab6c3daebc1f1d8d11124af4129074aBrian Paul             !_swsetup_CreateContext( ctx )) {
939c45b7364dab6c3daebc1f1d8d11124af4129074aBrian Paul            _mesa_destroy_visual(osmesa->gl_visual);
940c45b7364dab6c3daebc1f1d8d11124af4129074aBrian Paul            _mesa_free_context_data(ctx);
941c45b7364dab6c3daebc1f1d8d11124af4129074aBrian Paul            _mesa_free(osmesa);
942c45b7364dab6c3daebc1f1d8d11124af4129074aBrian Paul            return NULL;
943c45b7364dab6c3daebc1f1d8d11124af4129074aBrian Paul         }
9449c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul
9459c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul	 _swsetup_Wakeup( ctx );
946e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul
947e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul         /* use default TCL pipeline */
948e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul         tnl = TNL_CONTEXT(ctx);
949e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul         tnl->Driver.RunPipeline = _tnl_run_pipeline;
950e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul
951e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul         /* Extend the software rasterizer with our optimized line and triangle
952e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul          * drawing functions.
953e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul          */
954e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul         swrast = SWRAST_CONTEXT( ctx );
955e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul         swrast->choose_line = osmesa_choose_line;
956e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul         swrast->choose_triangle = osmesa_choose_triangle;
9579c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      }
958afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
9599c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   return osmesa;
960afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
961afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
962afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
963afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/*
9649c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * Destroy an Off-Screen Mesa rendering context.
9659c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul *
9669c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * Input:  ctx - the context to destroy
967afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */
9689c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian PaulGLAPI void GLAPIENTRY
9699c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian PaulOSMesaDestroyContext( OSMesaContext ctx )
970afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
9719c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   if (ctx) {
9726fafc7ad19a8b7400e57a86b588766b6f3811a05Brian Paul      _swsetup_DestroyContext( &ctx->mesa );
9736fafc7ad19a8b7400e57a86b588766b6f3811a05Brian Paul      _tnl_DestroyContext( &ctx->mesa );
9746fafc7ad19a8b7400e57a86b588766b6f3811a05Brian Paul      _ac_DestroyContext( &ctx->mesa );
9756fafc7ad19a8b7400e57a86b588766b6f3811a05Brian Paul      _swrast_DestroyContext( &ctx->mesa );
9769bf68ad963ba92b5d1e725f965979042495a5313Brian Paul
9779c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      _mesa_destroy_visual( ctx->gl_visual );
9789c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      _mesa_destroy_framebuffer( ctx->gl_buffer );
9796fafc7ad19a8b7400e57a86b588766b6f3811a05Brian Paul      _mesa_free_context_data( &ctx->mesa );
9809c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      FREE( ctx );
9819c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   }
982afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
983afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
984afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
985afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/*
9869c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * Recompute the values of the context's rowaddr array.
987afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */
9889c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paulstatic void
9899c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paulcompute_row_addresses( OSMesaContext ctx )
990afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
9919c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   GLint bytesPerPixel, bytesPerRow, i;
9929c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   GLubyte *origin = (GLubyte *) ctx->buffer;
99374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul
9949c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   if (ctx->format == OSMESA_COLOR_INDEX) {
9959c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      /* CI mode */
9965704b8e57a0c618ddf51502e99e9dbd48cc3e685Brian Paul      bytesPerPixel = 1 * sizeof(GLubyte);
9979c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   }
9989c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   else if ((ctx->format == OSMESA_RGB) || (ctx->format == OSMESA_BGR)) {
9999c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      /* RGB mode */
10009c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      bytesPerPixel = 3 * sizeof(GLchan);
10019c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   }
10029c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   else if (ctx->format == OSMESA_RGB_565) {
10039c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      /* 5/6/5 RGB pixel in 16 bits */
10049c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      bytesPerPixel = 2;
10059c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   }
10069c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   else {
10079c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      /* RGBA mode */
10089c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      bytesPerPixel = 4 * sizeof(GLchan);
10099bf68ad963ba92b5d1e725f965979042495a5313Brian Paul   }
10109bf68ad963ba92b5d1e725f965979042495a5313Brian Paul
10119c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   bytesPerRow = ctx->rowlength * bytesPerPixel;
1012afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
10139c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   if (ctx->yup) {
10149c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      /* Y=0 is bottom line of window */
10159c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      for (i = 0; i < MAX_HEIGHT; i++) {
10169c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         ctx->rowaddr[i] = (GLchan *) ((GLubyte *) origin + i * bytesPerRow);
10179c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      }
10189c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   }
10199c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   else {
10209c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      /* Y=0 is top line of window */
10219c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      for (i = 0; i < MAX_HEIGHT; i++) {
10229c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         GLint j = ctx->height - i - 1;
10239c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         ctx->rowaddr[i] = (GLchan *) ((GLubyte *) origin + j * bytesPerRow);
10249c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      }
10259c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   }
10269c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul}
1027afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1028afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1029afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/*
10309c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * Bind an OSMesaContext to an image buffer.  The image buffer is just a
10319c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * block of memory which the client provides.  Its size must be at least
10329c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * as large as width*height*sizeof(type).  Its address should be a multiple
10339c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * of 4 if using RGBA mode.
10349c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul *
10359c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * Image data is stored in the order of glDrawPixels:  row-major order
10369c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * with the lower-left image pixel stored in the first array position
10379c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * (ie. bottom-to-top).
10389c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul *
10399c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * If the context's viewport hasn't been initialized yet, it will now be
10409c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * initialized to (0,0,width,height).
10419c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul *
10429c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * Input:  ctx - the rendering context
10439c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul *         buffer - the image buffer memory
10449c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul *         type - data type for pixel components
10459c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul *            Normally, only GL_UNSIGNED_BYTE and GL_UNSIGNED_SHORT_5_6_5
10469c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul *            are supported.  But if Mesa's been compiled with CHAN_BITS==16
10479c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul *            then type must be GL_UNSIGNED_SHORT.  And if Mesa's been build
10489c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul *            with CHAN_BITS==32 then type must be GL_FLOAT.
10499c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul *         width, height - size of image buffer in pixels, at least 1
10509c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * Return:  GL_TRUE if success, GL_FALSE if error because of invalid ctx,
10519c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul *          invalid buffer address, invalid type, width<1, height<1,
10529c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul *          width>internal limit or height>internal limit.
1053afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */
10549c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian PaulGLAPI GLboolean GLAPIENTRY
10559c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian PaulOSMesaMakeCurrent( OSMesaContext ctx, void *buffer, GLenum type,
10569c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul                   GLsizei width, GLsizei height )
1057afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
10589c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   if (!ctx || !buffer ||
10599c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul       width < 1 || height < 1 ||
10609c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul       width > MAX_WIDTH || height > MAX_HEIGHT) {
10619c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      return GL_FALSE;
10629c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   }
106374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul
10649c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   if (ctx->format == OSMESA_RGB_565) {
10659c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      if (type != GL_UNSIGNED_SHORT_5_6_5)
10669c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         return GL_FALSE;
1067afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
10689c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   else if (type != CHAN_TYPE) {
10699c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      return GL_FALSE;
10709c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   }
10719c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul
107258f4d67703381003c23fecbd3fe114ef9d1730c3Brian Paul   /* Need to set these before calling _mesa_make_current() since the first
107358f4d67703381003c23fecbd3fe114ef9d1730c3Brian Paul    * time the context is bound, _mesa_make_current() will call our
107458f4d67703381003c23fecbd3fe114ef9d1730c3Brian Paul    * get_buffer_size() function to initialize the viewport.  These are the
107558f4d67703381003c23fecbd3fe114ef9d1730c3Brian Paul    * values returned by get_buffer_size():
107658f4d67703381003c23fecbd3fe114ef9d1730c3Brian Paul    */
10779c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   ctx->buffer = buffer;
10789c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   ctx->width = width;
10799c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   ctx->height = height;
108058f4d67703381003c23fecbd3fe114ef9d1730c3Brian Paul
108158f4d67703381003c23fecbd3fe114ef9d1730c3Brian Paul   osmesa_update_state( &ctx->mesa, 0 );
1082c6c0f947142c0cc82626c238804a68b4e8f53945Brian Paul
1083c6c0f947142c0cc82626c238804a68b4e8f53945Brian Paul   /* Call this periodically to detect when the user has begun using
1084c6c0f947142c0cc82626c238804a68b4e8f53945Brian Paul    * GL rendering from multiple threads.
1085c6c0f947142c0cc82626c238804a68b4e8f53945Brian Paul    */
1086c6c0f947142c0cc82626c238804a68b4e8f53945Brian Paul   _glapi_check_multithread();
1087c6c0f947142c0cc82626c238804a68b4e8f53945Brian Paul
1088e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   _mesa_make_current( &ctx->mesa, ctx->gl_buffer, ctx->gl_buffer );
108958f4d67703381003c23fecbd3fe114ef9d1730c3Brian Paul
10909c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   if (ctx->userRowLength)
10919c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      ctx->rowlength = ctx->userRowLength;
10929c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   else
10939c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      ctx->rowlength = width;
10941e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell
10959c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   compute_row_addresses( ctx );
109674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul
109758f4d67703381003c23fecbd3fe114ef9d1730c3Brian Paul   /* this will make ensure we recognize the new buffer size */
1098e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   _mesa_resize_framebuffer(&ctx->mesa, ctx->gl_buffer, width, height);
109974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul
11009c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   return GL_TRUE;
1101afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
1102afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
11031e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell
11041e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell
1105c5f9aa7750633e2989a6a139c283419d536ee3f7Brian PaulGLAPI OSMesaContext GLAPIENTRY
1106c5f9aa7750633e2989a6a139c283419d536ee3f7Brian PaulOSMesaGetCurrentContext( void )
11079c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul{
11089c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   GLcontext *ctx = _mesa_get_current_context();
11099c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   if (ctx)
11109c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      return (OSMesaContext) ctx;
11119c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   else
11129c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      return NULL;
11139c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul}
11142d595d70202bad560c27ea81ec71b740415b3355Brian Paul
11151e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell
11161e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell
1117c5f9aa7750633e2989a6a139c283419d536ee3f7Brian PaulGLAPI void GLAPIENTRY
1118c5f9aa7750633e2989a6a139c283419d536ee3f7Brian PaulOSMesaPixelStore( GLint pname, GLint value )
11191e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell{
11209c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   OSMesaContext osmesa = OSMesaGetCurrentContext();
1121dbd1e2b5990a3689bf718296c57c14fc3ba38db5Jouk Jansen
11229c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   switch (pname) {
11239c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      case OSMESA_ROW_LENGTH:
11249c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         if (value<0) {
11256fafc7ad19a8b7400e57a86b588766b6f3811a05Brian Paul            _mesa_error( &osmesa->mesa, GL_INVALID_VALUE,
11269c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul                      "OSMesaPixelStore(value)" );
11279c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul            return;
11289c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         }
11299c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         osmesa->userRowLength = value;
11309c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         osmesa->rowlength = value ? value : osmesa->width;
11319c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         break;
11329c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      case OSMESA_Y_UP:
11339c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         osmesa->yup = value ? GL_TRUE : GL_FALSE;
11349c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         break;
11359c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      default:
11366fafc7ad19a8b7400e57a86b588766b6f3811a05Brian Paul         _mesa_error( &osmesa->mesa, GL_INVALID_ENUM, "OSMesaPixelStore(pname)" );
11379c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         return;
11389c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   }
1139dbd1e2b5990a3689bf718296c57c14fc3ba38db5Jouk Jansen
11409c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   compute_row_addresses( osmesa );
11411e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell}
1142ed30dfa1264ec8875a3162c3c8778bc703bf11d5Brian Paul
1143ed30dfa1264ec8875a3162c3c8778bc703bf11d5Brian Paul
1144c5f9aa7750633e2989a6a139c283419d536ee3f7Brian PaulGLAPI void GLAPIENTRY
1145c5f9aa7750633e2989a6a139c283419d536ee3f7Brian PaulOSMesaGetIntegerv( GLint pname, GLint *value )
1146afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
11479c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   OSMesaContext osmesa = OSMesaGetCurrentContext();
11489c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul
11499c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   switch (pname) {
11509c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      case OSMESA_WIDTH:
11519c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         *value = osmesa->width;
11529c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         return;
11539c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      case OSMESA_HEIGHT:
11549c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         *value = osmesa->height;
11559c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         return;
11569c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      case OSMESA_FORMAT:
11579c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         *value = osmesa->format;
11589c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         return;
11599c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      case OSMESA_TYPE:
11609c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         *value = CHAN_TYPE;
11619c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         return;
11629c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      case OSMESA_ROW_LENGTH:
11639c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         *value = osmesa->userRowLength;
11649c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         return;
11659c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      case OSMESA_Y_UP:
11669c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         *value = osmesa->yup;
11679c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         return;
11689c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      case OSMESA_MAX_WIDTH:
11699c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         *value = MAX_WIDTH;
11709c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         return;
11719c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      case OSMESA_MAX_HEIGHT:
11729c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         *value = MAX_HEIGHT;
11739c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         return;
1174afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      default:
11756fafc7ad19a8b7400e57a86b588766b6f3811a05Brian Paul         _mesa_error(&osmesa->mesa, GL_INVALID_ENUM, "OSMesaGetIntergerv(pname)");
11769c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         return;
1177afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
1178afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
1179afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
11809c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul/*
11819c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * Return the depth buffer associated with an OSMesa context.
11829c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * Input:  c - the OSMesa context
11839c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * Output:  width, height - size of buffer in pixels
11849c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul *          bytesPerValue - bytes per depth value (2 or 4)
11859c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul *          buffer - pointer to depth buffer values
11869c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * Return:  GL_TRUE or GL_FALSE to indicate success or failure.
11879c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul */
11889c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian PaulGLAPI GLboolean GLAPIENTRY
11899c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian PaulOSMesaGetDepthBuffer( OSMesaContext c, GLint *width, GLint *height,
11909c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul                      GLint *bytesPerValue, void **buffer )
1191afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
1192e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   struct gl_renderbuffer *rb = NULL;
1193e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul
1194e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   if (c->gl_buffer)
1195e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      rb = c->gl_buffer->Attachment[BUFFER_DEPTH].Renderbuffer;
1196e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul
1197e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   if (!rb || !rb->Data) {
1198e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      /*if ((!c->gl_buffer) || (!c->gl_buffer->DepthBuffer)) {*/
11999c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      *width = 0;
12009c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      *height = 0;
12019c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      *bytesPerValue = 0;
12029c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      *buffer = 0;
12039c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      return GL_FALSE;
120474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   }
12059c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   else {
12069c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      *width = c->gl_buffer->Width;
12079c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      *height = c->gl_buffer->Height;
12089c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      if (c->gl_visual->depthBits <= 16)
12099c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         *bytesPerValue = sizeof(GLushort);
12109c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      else
12119c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         *bytesPerValue = sizeof(GLuint);
1212e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      *buffer = rb->Data;
12139c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      return GL_TRUE;
1214afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
12159c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul}
12169c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul
12179c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul/*
12189c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * Return the color buffer associated with an OSMesa context.
12199c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * Input:  c - the OSMesa context
12209c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * Output:  width, height - size of buffer in pixels
12219c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul *          format - the pixel format (OSMESA_FORMAT)
12229c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul *          buffer - pointer to color buffer values
12239c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * Return:  GL_TRUE or GL_FALSE to indicate success or failure.
12249c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul */
12259c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian PaulGLAPI GLboolean GLAPIENTRY
12269c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian PaulOSMesaGetColorBuffer( OSMesaContext c, GLint *width,
12279c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul                      GLint *height, GLint *format, void **buffer )
12289c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul{
12299c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   if (!c->buffer) {
12309c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      *width = 0;
12319c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      *height = 0;
12329c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      *format = 0;
12339c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      *buffer = 0;
12349c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      return GL_FALSE;
1235206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul   }
1236afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   else {
12379c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      *width = c->width;
12389c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      *height = c->height;
12399c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      *format = c->format;
12409c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      *buffer = c->buffer;
12419c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      return GL_TRUE;
1242afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
12439c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul}
1244afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1245709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell
1246c5f9aa7750633e2989a6a139c283419d536ee3f7Brian Paulstruct name_function
1247c5f9aa7750633e2989a6a139c283419d536ee3f7Brian Paul{
12489c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   const char *Name;
12494d880987d248ff078845027cc21ba437564ac07dBrian Paul   OSMESAproc Function;
12509c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul};
12519c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul
1252c5f9aa7750633e2989a6a139c283419d536ee3f7Brian Paulstatic struct name_function functions[] = {
12534d880987d248ff078845027cc21ba437564ac07dBrian Paul   { "OSMesaCreateContext", (OSMESAproc) OSMesaCreateContext },
12544d880987d248ff078845027cc21ba437564ac07dBrian Paul   { "OSMesaCreateContextExt", (OSMESAproc) OSMesaCreateContextExt },
12554d880987d248ff078845027cc21ba437564ac07dBrian Paul   { "OSMesaDestroyContext", (OSMESAproc) OSMesaDestroyContext },
12564d880987d248ff078845027cc21ba437564ac07dBrian Paul   { "OSMesaMakeCurrent", (OSMESAproc) OSMesaMakeCurrent },
12574d880987d248ff078845027cc21ba437564ac07dBrian Paul   { "OSMesaGetCurrentContext", (OSMESAproc) OSMesaGetCurrentContext },
12584d880987d248ff078845027cc21ba437564ac07dBrian Paul   { "OSMesaPixelsStore", (OSMESAproc) OSMesaPixelStore },
12594d880987d248ff078845027cc21ba437564ac07dBrian Paul   { "OSMesaGetIntegerv", (OSMESAproc) OSMesaGetIntegerv },
12604d880987d248ff078845027cc21ba437564ac07dBrian Paul   { "OSMesaGetDepthBuffer", (OSMESAproc) OSMesaGetDepthBuffer },
12614d880987d248ff078845027cc21ba437564ac07dBrian Paul   { "OSMesaGetColorBuffer", (OSMESAproc) OSMesaGetColorBuffer },
12624d880987d248ff078845027cc21ba437564ac07dBrian Paul   { "OSMesaGetProcAddress", (OSMESAproc) OSMesaGetProcAddress },
12639c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   { NULL, NULL }
12649c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul};
12659c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul
12664d880987d248ff078845027cc21ba437564ac07dBrian Paul
12674d880987d248ff078845027cc21ba437564ac07dBrian PaulGLAPI OSMESAproc GLAPIENTRY
12689c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian PaulOSMesaGetProcAddress( const char *funcName )
12699c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul{
12709c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   int i;
12719c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   for (i = 0; functions[i].Name; i++) {
12729c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      if (_mesa_strcmp(functions[i].Name, funcName) == 0)
12734d880987d248ff078845027cc21ba437564ac07dBrian Paul         return functions[i].Function;
12749c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   }
12754d880987d248ff078845027cc21ba437564ac07dBrian Paul   return _glapi_get_proc_address(funcName);
1276afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
1277ba3da6154c324cc916845bc5de3de077d0b59ffcBrian Paul
1278ba3da6154c324cc916845bc5de3de077d0b59ffcBrian Paul
1279ba3da6154c324cc916845bc5de3de077d0b59ffcBrian PaulGLAPI void GLAPIENTRY
1280ba3da6154c324cc916845bc5de3de077d0b59ffcBrian PaulOSMesaColorClamp(GLboolean enable)
1281ba3da6154c324cc916845bc5de3de077d0b59ffcBrian Paul{
1282ba3da6154c324cc916845bc5de3de077d0b59ffcBrian Paul   OSMesaContext osmesa = OSMesaGetCurrentContext();
1283ba3da6154c324cc916845bc5de3de077d0b59ffcBrian Paul
1284ba3da6154c324cc916845bc5de3de077d0b59ffcBrian Paul   if (enable == GL_TRUE) {
1285ba3da6154c324cc916845bc5de3de077d0b59ffcBrian Paul      osmesa->mesa.Color.ClampFragmentColor = GL_TRUE;
1286ba3da6154c324cc916845bc5de3de077d0b59ffcBrian Paul   }
1287ba3da6154c324cc916845bc5de3de077d0b59ffcBrian Paul   else {
1288ba3da6154c324cc916845bc5de3de077d0b59ffcBrian Paul      osmesa->mesa.Color.ClampFragmentColor = GL_FIXED_ONLY_ARB;
1289ba3da6154c324cc916845bc5de3de077d0b59ffcBrian Paul   }
1290ba3da6154c324cc916845bc5de3de077d0b59ffcBrian Paul}
1291ba3da6154c324cc916845bc5de3de077d0b59ffcBrian Paul
1292ba3da6154c324cc916845bc5de3de077d0b59ffcBrian Paul
1293