osmesa.c revision 9e81d6ae3a6db9831d6aea0fe4d92722176e9f74
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 */
605e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   if (osmesa->format == OSMESA_RGBA) {
606e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      rb->GetRow = get_row_RGBA;
607e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      rb->GetValues = get_values_RGBA;
608e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      rb->PutRow = put_row_RGBA;
609286c4cc201390e868c4f9b5ebe14c40db2d74a5dBrian Paul      rb->PutRowRGB = put_row_rgb_RGBA;
610e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      rb->PutMonoRow = put_mono_row_RGBA;
611e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      rb->PutValues = put_values_RGBA;
612e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      rb->PutMonoValues = put_mono_values_RGBA;
6139e81d6ae3a6db9831d6aea0fe4d92722176e9f74Brian Paul      rb->RedBits =
6149e81d6ae3a6db9831d6aea0fe4d92722176e9f74Brian Paul      rb->GreenBits =
6159e81d6ae3a6db9831d6aea0fe4d92722176e9f74Brian Paul      rb->BlueBits =
6169e81d6ae3a6db9831d6aea0fe4d92722176e9f74Brian Paul      rb->AlphaBits = 8 * sizeof(GLchan);
617e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   }
618e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   else if (osmesa->format == OSMESA_BGRA) {
619e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      rb->GetRow = get_row_BGRA;
620e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      rb->GetValues = get_values_BGRA;
621e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      rb->PutRow = put_row_BGRA;
622286c4cc201390e868c4f9b5ebe14c40db2d74a5dBrian Paul      rb->PutRowRGB = put_row_rgb_BGRA;
623e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      rb->PutMonoRow = put_mono_row_BGRA;
624e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      rb->PutValues = put_values_BGRA;
625e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      rb->PutMonoValues = put_mono_values_BGRA;
6269e81d6ae3a6db9831d6aea0fe4d92722176e9f74Brian Paul      rb->RedBits =
6279e81d6ae3a6db9831d6aea0fe4d92722176e9f74Brian Paul      rb->GreenBits =
6289e81d6ae3a6db9831d6aea0fe4d92722176e9f74Brian Paul      rb->BlueBits =
6299e81d6ae3a6db9831d6aea0fe4d92722176e9f74Brian Paul      rb->AlphaBits = 8 * sizeof(GLchan);
630e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   }
631e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   else if (osmesa->format == OSMESA_ARGB) {
632e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      rb->GetRow = get_row_ARGB;
633e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      rb->GetValues = get_values_ARGB;
634e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      rb->PutRow = put_row_ARGB;
635286c4cc201390e868c4f9b5ebe14c40db2d74a5dBrian Paul      rb->PutRowRGB = put_row_rgb_ARGB;
636e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      rb->PutMonoRow = put_mono_row_ARGB;
637e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      rb->PutValues = put_values_ARGB;
638e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      rb->PutMonoValues = put_mono_values_ARGB;
6399e81d6ae3a6db9831d6aea0fe4d92722176e9f74Brian Paul      rb->RedBits =
6409e81d6ae3a6db9831d6aea0fe4d92722176e9f74Brian Paul      rb->GreenBits =
6419e81d6ae3a6db9831d6aea0fe4d92722176e9f74Brian Paul      rb->BlueBits =
6429e81d6ae3a6db9831d6aea0fe4d92722176e9f74Brian Paul      rb->AlphaBits = 8 * sizeof(GLchan);
643e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   }
644e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   else if (osmesa->format == OSMESA_RGB) {
645e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      rb->GetRow = get_row_RGB;
646e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      rb->GetValues = get_values_RGB;
647e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      rb->PutRow = put_row_RGB;
648286c4cc201390e868c4f9b5ebe14c40db2d74a5dBrian Paul      rb->PutRowRGB = put_row_rgb_RGB;
649e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      rb->PutMonoRow = put_mono_row_RGB;
650e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      rb->PutValues = put_values_RGB;
651e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      rb->PutMonoValues = put_mono_values_RGB;
6529e81d6ae3a6db9831d6aea0fe4d92722176e9f74Brian Paul      rb->RedBits =
6539e81d6ae3a6db9831d6aea0fe4d92722176e9f74Brian Paul      rb->GreenBits =
6549e81d6ae3a6db9831d6aea0fe4d92722176e9f74Brian Paul      rb->BlueBits = 8 * sizeof(GLchan);
655afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
6569c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   else if (osmesa->format == OSMESA_BGR) {
657e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      rb->GetRow = get_row_BGR;
658e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      rb->GetValues = get_values_BGR;
659e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      rb->PutRow = put_row_BGR;
660286c4cc201390e868c4f9b5ebe14c40db2d74a5dBrian Paul      rb->PutRowRGB = put_row_rgb_BGR;
661e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      rb->PutMonoRow = put_mono_row_BGR;
662e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      rb->PutValues = put_values_BGR;
663e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      rb->PutMonoValues = put_mono_values_BGR;
6649e81d6ae3a6db9831d6aea0fe4d92722176e9f74Brian Paul      rb->RedBits =
6659e81d6ae3a6db9831d6aea0fe4d92722176e9f74Brian Paul      rb->GreenBits =
6669e81d6ae3a6db9831d6aea0fe4d92722176e9f74Brian Paul      rb->BlueBits = 8 * sizeof(GLchan);
6679c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   }
668cc9464e082b82179e3c4b51ea460212c10b2bf0cBrian Paul#if CHAN_TYPE == GL_UNSIGNED_BYTE
6699c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   else if (osmesa->format == OSMESA_RGB_565) {
670e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      rb->GetRow = get_row_RGB_565;
671e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      rb->GetValues = get_values_RGB_565;
672e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      rb->PutRow = put_row_RGB_565;
6730ad1bda7a1f7d88556dd458e532815ff28c898aeDaniel Borca      rb->PutRowRGB = put_row_rgb_RGB_565;
674e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      rb->PutMonoRow = put_mono_row_RGB_565;
675e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      rb->PutValues = put_values_RGB_565;
676e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      rb->PutMonoValues = put_mono_values_RGB_565;
6779e81d6ae3a6db9831d6aea0fe4d92722176e9f74Brian Paul      rb->RedBits = 5;
6789e81d6ae3a6db9831d6aea0fe4d92722176e9f74Brian Paul      rb->GreenBits = 6;
6799e81d6ae3a6db9831d6aea0fe4d92722176e9f74Brian Paul      rb->BlueBits = 5;
6809c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   }
681cc9464e082b82179e3c4b51ea460212c10b2bf0cBrian Paul#endif
6829c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   else if (osmesa->format == OSMESA_COLOR_INDEX) {
683e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      rb->GetRow = get_row_CI;
684e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      rb->GetValues = get_values_CI;
685e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      rb->PutRow = put_row_CI;
686e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      rb->PutMonoRow = put_mono_row_CI;
687e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      rb->PutValues = put_values_CI;
688e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      rb->PutMonoValues = put_mono_values_CI;
6899e81d6ae3a6db9831d6aea0fe4d92722176e9f74Brian Paul      rb->IndexBits = 8;
6909c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   }
6919c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   else {
692e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      _mesa_problem(ctx, "bad pixel format in osmesa renderbuffer_storage");
693afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
694afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
695e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   return GL_TRUE;
696afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
697afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
698afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
699e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul/**
700e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul * Allocate a new renderbuffer tpo describe the user-provided color buffer.
701e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul */
702e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paulstatic struct gl_renderbuffer *
703e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paulnew_osmesa_renderbuffer(GLenum format)
704e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul{
705e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   struct gl_renderbuffer *rb = CALLOC_STRUCT(gl_renderbuffer);
706e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   if (rb) {
707e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      const GLuint name = 0;
708e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      _mesa_init_renderbuffer(rb, name);
709e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul
710e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      rb->Delete = osmesa_delete_renderbuffer;
711e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      rb->AllocStorage = osmesa_renderbuffer_storage;
712e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul
713e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      if (format == OSMESA_COLOR_INDEX) {
714e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul         rb->_BaseFormat = GL_COLOR_INDEX;
715e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul         rb->InternalFormat = GL_COLOR_INDEX;
716e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul         rb->DataType = GL_UNSIGNED_BYTE;
717e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      }
718e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      else {
719e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul         rb->_BaseFormat = GL_RGBA;
720e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul         rb->InternalFormat = GL_RGBA;
721e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul         rb->DataType = CHAN_TYPE;
722e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      }
723e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   }
724e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   return rb;
725e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul}
726e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul
7279c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul
728afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
729afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/**********************************************************************/
7309c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul/*****                    Public Functions                        *****/
731afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/**********************************************************************/
732afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
733afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
7349c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul/*
7359c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * Create an Off-Screen Mesa rendering context.  The only attribute needed is
7369c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * an RGBA vs Color-Index mode flag.
7379c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul *
7389c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * Input:  format - either GL_RGBA or GL_COLOR_INDEX
7399c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul *         sharelist - specifies another OSMesaContext with which to share
7409c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul *                     display lists.  NULL indicates no sharing.
7419c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * Return:  an OSMesaContext or 0 if error
7429c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul */
7439c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian PaulGLAPI OSMesaContext GLAPIENTRY
7449c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian PaulOSMesaCreateContext( GLenum format, OSMesaContext sharelist )
745afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
7464128d88b98e22676fa05ed586da1641c85a0bde2Brian Paul   const GLint accumBits = (format == OSMESA_COLOR_INDEX) ? 0 : 16;
7479c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   return OSMesaCreateContextExt(format, DEFAULT_SOFTWARE_DEPTH_BITS,
7485dce1e5c420872ae096854841a9665f8d3d649fbBrian Paul                                 8, accumBits, sharelist);
74974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul}
75074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul
75174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul
75274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul
7539c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul/*
7549c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * New in Mesa 3.5
7559c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul *
7569c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * Create context and specify size of ancillary buffers.
7579c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul */
7589c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian PaulGLAPI OSMesaContext GLAPIENTRY
7599c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian PaulOSMesaCreateContextExt( GLenum format, GLint depthBits, GLint stencilBits,
7609c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul                        GLint accumBits, OSMesaContext sharelist )
76174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul{
7629c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   OSMesaContext osmesa;
763d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul   struct dd_function_table functions;
7649c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   GLint rind, gind, bind, aind;
7659c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   GLint indexBits = 0, redBits = 0, greenBits = 0, blueBits = 0, alphaBits =0;
7669c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   GLboolean rgbmode;
767afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
7689c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   rind = gind = bind = aind = 0;
7699c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   if (format==OSMESA_COLOR_INDEX) {
7709c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      indexBits = 8;
7719c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      rgbmode = GL_FALSE;
77274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   }
7739c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   else if (format==OSMESA_RGBA) {
7749c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      indexBits = 0;
7759c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      redBits = CHAN_BITS;
7769c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      greenBits = CHAN_BITS;
7779c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      blueBits = CHAN_BITS;
7789c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      alphaBits = CHAN_BITS;
7799c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      rind = 0;
7809c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      gind = 1;
7819c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      bind = 2;
7829c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      aind = 3;
7839c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      rgbmode = GL_TRUE;
784afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
7859c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   else if (format==OSMESA_BGRA) {
7869c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      indexBits = 0;
7879c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      redBits = CHAN_BITS;
7889c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      greenBits = CHAN_BITS;
7899c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      blueBits = CHAN_BITS;
7909c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      alphaBits = CHAN_BITS;
7919c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      bind = 0;
7929c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      gind = 1;
7939c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      rind = 2;
7949c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      aind = 3;
7959c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      rgbmode = GL_TRUE;
796afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
7979c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   else if (format==OSMESA_ARGB) {
7989c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      indexBits = 0;
7999c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      redBits = CHAN_BITS;
8009c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      greenBits = CHAN_BITS;
8019c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      blueBits = CHAN_BITS;
8029c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      alphaBits = CHAN_BITS;
8039c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      aind = 0;
8049c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      rind = 1;
8059c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      gind = 2;
8069c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      bind = 3;
8079c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      rgbmode = GL_TRUE;
808206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul   }
8099c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   else if (format==OSMESA_RGB) {
8109c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      indexBits = 0;
8119c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      redBits = CHAN_BITS;
8129c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      greenBits = CHAN_BITS;
8139c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      blueBits = CHAN_BITS;
8149c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      alphaBits = 0;
8159c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      rind = 0;
8169c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      gind = 1;
8179c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      bind = 2;
8189c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      rgbmode = GL_TRUE;
819afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
8209c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   else if (format==OSMESA_BGR) {
8219c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      indexBits = 0;
8229c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      redBits = CHAN_BITS;
8239c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      greenBits = CHAN_BITS;
8249c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      blueBits = CHAN_BITS;
8259c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      alphaBits = 0;
8269c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      rind = 2;
8279c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      gind = 1;
8289c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      bind = 0;
8299c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      rgbmode = GL_TRUE;
830afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
831cc9464e082b82179e3c4b51ea460212c10b2bf0cBrian Paul#if CHAN_TYPE == GL_UNSIGNED_BYTE
8329c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   else if (format==OSMESA_RGB_565) {
8339c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      indexBits = 0;
8349c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      redBits = 5;
8359c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      greenBits = 6;
8369c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      blueBits = 5;
8379c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      alphaBits = 0;
8389c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      rind = 0; /* not used */
8399c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      gind = 0;
8409c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      bind = 0;
8419c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      rgbmode = GL_TRUE;
842afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
843cc9464e082b82179e3c4b51ea460212c10b2bf0cBrian Paul#endif
844afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   else {
8459c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      return NULL;
846afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
847afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
8489c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   osmesa = (OSMesaContext) CALLOC_STRUCT(osmesa_context);
8499c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   if (osmesa) {
8509c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      osmesa->gl_visual = _mesa_create_visual( rgbmode,
8519c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul                                               GL_FALSE,    /* double buffer */
8529c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul                                               GL_FALSE,    /* stereo */
8539c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul                                               redBits,
8549c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul                                               greenBits,
8559c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul                                               blueBits,
8569c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul                                               alphaBits,
8579c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul                                               indexBits,
8589c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul                                               depthBits,
8599c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul                                               stencilBits,
8609c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul                                               accumBits,
8619c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul                                               accumBits,
8629c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul                                               accumBits,
8639c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul                                               alphaBits ? accumBits : 0,
8649c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul                                               1            /* num samples */
8659c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul                                               );
8669c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      if (!osmesa->gl_visual) {
8679c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         FREE(osmesa);
8689c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         return NULL;
869afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
870afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
871d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul      /* Initialize device driver function table */
872d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul      _mesa_init_driver_functions(&functions);
873d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul      /* override with our functions */
874d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul      functions.GetString = get_string;
875d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul      functions.UpdateState = osmesa_update_state;
876d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul      functions.GetBufferSize = get_buffer_size;
8776fafc7ad19a8b7400e57a86b588766b6f3811a05Brian Paul
8786fafc7ad19a8b7400e57a86b588766b6f3811a05Brian Paul      if (!_mesa_initialize_context(&osmesa->mesa,
8799c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul                                    osmesa->gl_visual,
8806fafc7ad19a8b7400e57a86b588766b6f3811a05Brian Paul                                    sharelist ? &sharelist->mesa
8819c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul                                              : (GLcontext *) NULL,
882d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul                                    &functions, (void *) osmesa)) {
8839c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         _mesa_destroy_visual( osmesa->gl_visual );
8849c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         FREE(osmesa);
8859c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         return NULL;
886afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
88774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul
8886fafc7ad19a8b7400e57a86b588766b6f3811a05Brian Paul      _mesa_enable_sw_extensions(&(osmesa->mesa));
8896fafc7ad19a8b7400e57a86b588766b6f3811a05Brian Paul      _mesa_enable_1_3_extensions(&(osmesa->mesa));
8906fafc7ad19a8b7400e57a86b588766b6f3811a05Brian Paul      _mesa_enable_1_4_extensions(&(osmesa->mesa));
89184351999ec6ad07e0cfc31c0b3a8c86da4134bfeBrian Paul      _mesa_enable_1_5_extensions(&(osmesa->mesa));
89274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul
893e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      osmesa->gl_buffer = _mesa_create_framebuffer(osmesa->gl_visual);
8949c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      if (!osmesa->gl_buffer) {
8959c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         _mesa_destroy_visual( osmesa->gl_visual );
8966fafc7ad19a8b7400e57a86b588766b6f3811a05Brian Paul         _mesa_free_context_data( &osmesa->mesa );
8979c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         FREE(osmesa);
8989c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         return NULL;
8999c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      }
900e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul
901fc3bc1ae14e7aa769fe01c007a1d68f2ff6db7b8Brian Paul      /* create front color buffer in user-provided memory (no back buffer) */
902e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      _mesa_add_renderbuffer(osmesa->gl_buffer, BUFFER_FRONT_LEFT,
903e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul                             new_osmesa_renderbuffer(format));
904e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      _mesa_add_soft_renderbuffers(osmesa->gl_buffer,
905e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul                                   GL_FALSE, /* color */
906e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul                                   osmesa->gl_visual->haveDepthBuffer,
907e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul                                   osmesa->gl_visual->haveStencilBuffer,
908e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul                                   osmesa->gl_visual->haveAccumBuffer,
909e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul                                   GL_FALSE, /* alpha */
910e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul                                   GL_FALSE /* aux */ );
911e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul
9129c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      osmesa->format = format;
9139c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      osmesa->buffer = NULL;
9149c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      osmesa->width = 0;
9159c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      osmesa->height = 0;
9169c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      osmesa->userRowLength = 0;
9179c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      osmesa->rowlength = 0;
9189c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      osmesa->yup = GL_TRUE;
9199c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      osmesa->rInd = rind;
9209c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      osmesa->gInd = gind;
9219c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      osmesa->bInd = bind;
9229c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      osmesa->aInd = aind;
92374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul
9249c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      /* Initialize the software rasterizer and helper modules. */
9259c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      {
9266fafc7ad19a8b7400e57a86b588766b6f3811a05Brian Paul	 GLcontext *ctx = &osmesa->mesa;
927e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul         SWcontext *swrast;
928e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul         TNLcontext *tnl;
929afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
930c45b7364dab6c3daebc1f1d8d11124af4129074aBrian Paul	 if (!_swrast_CreateContext( ctx ) ||
931c45b7364dab6c3daebc1f1d8d11124af4129074aBrian Paul             !_ac_CreateContext( ctx ) ||
932c45b7364dab6c3daebc1f1d8d11124af4129074aBrian Paul             !_tnl_CreateContext( ctx ) ||
933c45b7364dab6c3daebc1f1d8d11124af4129074aBrian Paul             !_swsetup_CreateContext( ctx )) {
934c45b7364dab6c3daebc1f1d8d11124af4129074aBrian Paul            _mesa_destroy_visual(osmesa->gl_visual);
935c45b7364dab6c3daebc1f1d8d11124af4129074aBrian Paul            _mesa_free_context_data(ctx);
936c45b7364dab6c3daebc1f1d8d11124af4129074aBrian Paul            _mesa_free(osmesa);
937c45b7364dab6c3daebc1f1d8d11124af4129074aBrian Paul            return NULL;
938c45b7364dab6c3daebc1f1d8d11124af4129074aBrian Paul         }
9399c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul
9409c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul	 _swsetup_Wakeup( ctx );
941e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul
942e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul         /* use default TCL pipeline */
943e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul         tnl = TNL_CONTEXT(ctx);
944e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul         tnl->Driver.RunPipeline = _tnl_run_pipeline;
945e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul
946e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul         /* Extend the software rasterizer with our optimized line and triangle
947e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul          * drawing functions.
948e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul          */
949e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul         swrast = SWRAST_CONTEXT( ctx );
950e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul         swrast->choose_line = osmesa_choose_line;
951e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul         swrast->choose_triangle = osmesa_choose_triangle;
9529c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      }
953afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
9549c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   return osmesa;
955afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
956afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
957afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
958afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/*
9599c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * Destroy an Off-Screen Mesa rendering context.
9609c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul *
9619c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * Input:  ctx - the context to destroy
962afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */
9639c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian PaulGLAPI void GLAPIENTRY
9649c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian PaulOSMesaDestroyContext( OSMesaContext ctx )
965afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
9669c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   if (ctx) {
9676fafc7ad19a8b7400e57a86b588766b6f3811a05Brian Paul      _swsetup_DestroyContext( &ctx->mesa );
9686fafc7ad19a8b7400e57a86b588766b6f3811a05Brian Paul      _tnl_DestroyContext( &ctx->mesa );
9696fafc7ad19a8b7400e57a86b588766b6f3811a05Brian Paul      _ac_DestroyContext( &ctx->mesa );
9706fafc7ad19a8b7400e57a86b588766b6f3811a05Brian Paul      _swrast_DestroyContext( &ctx->mesa );
9719bf68ad963ba92b5d1e725f965979042495a5313Brian Paul
9729c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      _mesa_destroy_visual( ctx->gl_visual );
9739c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      _mesa_destroy_framebuffer( ctx->gl_buffer );
9746fafc7ad19a8b7400e57a86b588766b6f3811a05Brian Paul      _mesa_free_context_data( &ctx->mesa );
9759c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      FREE( ctx );
9769c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   }
977afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
978afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
979afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
980afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/*
9819c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * Recompute the values of the context's rowaddr array.
982afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */
9839c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paulstatic void
9849c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paulcompute_row_addresses( OSMesaContext ctx )
985afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
9869c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   GLint bytesPerPixel, bytesPerRow, i;
9879c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   GLubyte *origin = (GLubyte *) ctx->buffer;
98874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul
9899c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   if (ctx->format == OSMESA_COLOR_INDEX) {
9909c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      /* CI mode */
9915704b8e57a0c618ddf51502e99e9dbd48cc3e685Brian Paul      bytesPerPixel = 1 * sizeof(GLubyte);
9929c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   }
9939c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   else if ((ctx->format == OSMESA_RGB) || (ctx->format == OSMESA_BGR)) {
9949c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      /* RGB mode */
9959c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      bytesPerPixel = 3 * sizeof(GLchan);
9969c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   }
9979c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   else if (ctx->format == OSMESA_RGB_565) {
9989c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      /* 5/6/5 RGB pixel in 16 bits */
9999c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      bytesPerPixel = 2;
10009c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   }
10019c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   else {
10029c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      /* RGBA mode */
10039c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      bytesPerPixel = 4 * sizeof(GLchan);
10049bf68ad963ba92b5d1e725f965979042495a5313Brian Paul   }
10059bf68ad963ba92b5d1e725f965979042495a5313Brian Paul
10069c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   bytesPerRow = ctx->rowlength * bytesPerPixel;
1007afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
10089c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   if (ctx->yup) {
10099c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      /* Y=0 is bottom line of window */
10109c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      for (i = 0; i < MAX_HEIGHT; i++) {
10119c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         ctx->rowaddr[i] = (GLchan *) ((GLubyte *) origin + i * bytesPerRow);
10129c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      }
10139c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   }
10149c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   else {
10159c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      /* Y=0 is top line of window */
10169c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      for (i = 0; i < MAX_HEIGHT; i++) {
10179c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         GLint j = ctx->height - i - 1;
10189c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         ctx->rowaddr[i] = (GLchan *) ((GLubyte *) origin + j * bytesPerRow);
10199c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      }
10209c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   }
10219c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul}
1022afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1023afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1024afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/*
10259c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * Bind an OSMesaContext to an image buffer.  The image buffer is just a
10269c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * block of memory which the client provides.  Its size must be at least
10279c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * as large as width*height*sizeof(type).  Its address should be a multiple
10289c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * of 4 if using RGBA mode.
10299c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul *
10309c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * Image data is stored in the order of glDrawPixels:  row-major order
10319c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * with the lower-left image pixel stored in the first array position
10329c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * (ie. bottom-to-top).
10339c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul *
10349c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * If the context's viewport hasn't been initialized yet, it will now be
10359c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * initialized to (0,0,width,height).
10369c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul *
10379c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * Input:  ctx - the rendering context
10389c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul *         buffer - the image buffer memory
10399c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul *         type - data type for pixel components
10409c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul *            Normally, only GL_UNSIGNED_BYTE and GL_UNSIGNED_SHORT_5_6_5
10419c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul *            are supported.  But if Mesa's been compiled with CHAN_BITS==16
10429c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul *            then type must be GL_UNSIGNED_SHORT.  And if Mesa's been build
10439c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul *            with CHAN_BITS==32 then type must be GL_FLOAT.
10449c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul *         width, height - size of image buffer in pixels, at least 1
10459c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * Return:  GL_TRUE if success, GL_FALSE if error because of invalid ctx,
10469c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul *          invalid buffer address, invalid type, width<1, height<1,
10479c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul *          width>internal limit or height>internal limit.
1048afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */
10499c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian PaulGLAPI GLboolean GLAPIENTRY
10509c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian PaulOSMesaMakeCurrent( OSMesaContext ctx, void *buffer, GLenum type,
10519c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul                   GLsizei width, GLsizei height )
1052afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
10539c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   if (!ctx || !buffer ||
10549c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul       width < 1 || height < 1 ||
10559c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul       width > MAX_WIDTH || height > MAX_HEIGHT) {
10569c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      return GL_FALSE;
10579c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   }
105874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul
10599c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   if (ctx->format == OSMESA_RGB_565) {
10609c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      if (type != GL_UNSIGNED_SHORT_5_6_5)
10619c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         return GL_FALSE;
1062afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
10639c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   else if (type != CHAN_TYPE) {
10649c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      return GL_FALSE;
10659c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   }
10669c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul
106758f4d67703381003c23fecbd3fe114ef9d1730c3Brian Paul   /* Need to set these before calling _mesa_make_current() since the first
106858f4d67703381003c23fecbd3fe114ef9d1730c3Brian Paul    * time the context is bound, _mesa_make_current() will call our
106958f4d67703381003c23fecbd3fe114ef9d1730c3Brian Paul    * get_buffer_size() function to initialize the viewport.  These are the
107058f4d67703381003c23fecbd3fe114ef9d1730c3Brian Paul    * values returned by get_buffer_size():
107158f4d67703381003c23fecbd3fe114ef9d1730c3Brian Paul    */
10729c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   ctx->buffer = buffer;
10739c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   ctx->width = width;
10749c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   ctx->height = height;
107558f4d67703381003c23fecbd3fe114ef9d1730c3Brian Paul
107658f4d67703381003c23fecbd3fe114ef9d1730c3Brian Paul   osmesa_update_state( &ctx->mesa, 0 );
1077c6c0f947142c0cc82626c238804a68b4e8f53945Brian Paul
1078c6c0f947142c0cc82626c238804a68b4e8f53945Brian Paul   /* Call this periodically to detect when the user has begun using
1079c6c0f947142c0cc82626c238804a68b4e8f53945Brian Paul    * GL rendering from multiple threads.
1080c6c0f947142c0cc82626c238804a68b4e8f53945Brian Paul    */
1081c6c0f947142c0cc82626c238804a68b4e8f53945Brian Paul   _glapi_check_multithread();
1082c6c0f947142c0cc82626c238804a68b4e8f53945Brian Paul
1083e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   _mesa_make_current( &ctx->mesa, ctx->gl_buffer, ctx->gl_buffer );
108458f4d67703381003c23fecbd3fe114ef9d1730c3Brian Paul
10859c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   if (ctx->userRowLength)
10869c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      ctx->rowlength = ctx->userRowLength;
10879c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   else
10889c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      ctx->rowlength = width;
10891e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell
10909c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   compute_row_addresses( ctx );
109174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul
109258f4d67703381003c23fecbd3fe114ef9d1730c3Brian Paul   /* this will make ensure we recognize the new buffer size */
1093e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   _mesa_resize_framebuffer(&ctx->mesa, ctx->gl_buffer, width, height);
109474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul
10959c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   return GL_TRUE;
1096afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
1097afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
10981e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell
10991e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell
1100c5f9aa7750633e2989a6a139c283419d536ee3f7Brian PaulGLAPI OSMesaContext GLAPIENTRY
1101c5f9aa7750633e2989a6a139c283419d536ee3f7Brian PaulOSMesaGetCurrentContext( void )
11029c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul{
11039c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   GLcontext *ctx = _mesa_get_current_context();
11049c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   if (ctx)
11059c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      return (OSMesaContext) ctx;
11069c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   else
11079c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      return NULL;
11089c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul}
11092d595d70202bad560c27ea81ec71b740415b3355Brian Paul
11101e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell
11111e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell
1112c5f9aa7750633e2989a6a139c283419d536ee3f7Brian PaulGLAPI void GLAPIENTRY
1113c5f9aa7750633e2989a6a139c283419d536ee3f7Brian PaulOSMesaPixelStore( GLint pname, GLint value )
11141e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell{
11159c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   OSMesaContext osmesa = OSMesaGetCurrentContext();
1116dbd1e2b5990a3689bf718296c57c14fc3ba38db5Jouk Jansen
11179c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   switch (pname) {
11189c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      case OSMESA_ROW_LENGTH:
11199c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         if (value<0) {
11206fafc7ad19a8b7400e57a86b588766b6f3811a05Brian Paul            _mesa_error( &osmesa->mesa, GL_INVALID_VALUE,
11219c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul                      "OSMesaPixelStore(value)" );
11229c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul            return;
11239c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         }
11249c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         osmesa->userRowLength = value;
11259c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         osmesa->rowlength = value ? value : osmesa->width;
11269c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         break;
11279c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      case OSMESA_Y_UP:
11289c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         osmesa->yup = value ? GL_TRUE : GL_FALSE;
11299c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         break;
11309c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      default:
11316fafc7ad19a8b7400e57a86b588766b6f3811a05Brian Paul         _mesa_error( &osmesa->mesa, GL_INVALID_ENUM, "OSMesaPixelStore(pname)" );
11329c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         return;
11339c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   }
1134dbd1e2b5990a3689bf718296c57c14fc3ba38db5Jouk Jansen
11359c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   compute_row_addresses( osmesa );
11361e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell}
1137ed30dfa1264ec8875a3162c3c8778bc703bf11d5Brian Paul
1138ed30dfa1264ec8875a3162c3c8778bc703bf11d5Brian Paul
1139c5f9aa7750633e2989a6a139c283419d536ee3f7Brian PaulGLAPI void GLAPIENTRY
1140c5f9aa7750633e2989a6a139c283419d536ee3f7Brian PaulOSMesaGetIntegerv( GLint pname, GLint *value )
1141afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
11429c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   OSMesaContext osmesa = OSMesaGetCurrentContext();
11439c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul
11449c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   switch (pname) {
11459c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      case OSMESA_WIDTH:
11469c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         *value = osmesa->width;
11479c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         return;
11489c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      case OSMESA_HEIGHT:
11499c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         *value = osmesa->height;
11509c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         return;
11519c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      case OSMESA_FORMAT:
11529c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         *value = osmesa->format;
11539c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         return;
11549c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      case OSMESA_TYPE:
11559c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         *value = CHAN_TYPE;
11569c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         return;
11579c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      case OSMESA_ROW_LENGTH:
11589c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         *value = osmesa->userRowLength;
11599c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         return;
11609c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      case OSMESA_Y_UP:
11619c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         *value = osmesa->yup;
11629c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         return;
11639c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      case OSMESA_MAX_WIDTH:
11649c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         *value = MAX_WIDTH;
11659c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         return;
11669c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      case OSMESA_MAX_HEIGHT:
11679c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         *value = MAX_HEIGHT;
11689c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         return;
1169afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      default:
11706fafc7ad19a8b7400e57a86b588766b6f3811a05Brian Paul         _mesa_error(&osmesa->mesa, GL_INVALID_ENUM, "OSMesaGetIntergerv(pname)");
11719c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         return;
1172afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
1173afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
1174afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
11759c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul/*
11769c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * Return the depth buffer associated with an OSMesa context.
11779c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * Input:  c - the OSMesa context
11789c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * Output:  width, height - size of buffer in pixels
11799c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul *          bytesPerValue - bytes per depth value (2 or 4)
11809c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul *          buffer - pointer to depth buffer values
11819c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * Return:  GL_TRUE or GL_FALSE to indicate success or failure.
11829c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul */
11839c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian PaulGLAPI GLboolean GLAPIENTRY
11849c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian PaulOSMesaGetDepthBuffer( OSMesaContext c, GLint *width, GLint *height,
11859c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul                      GLint *bytesPerValue, void **buffer )
1186afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
1187e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   struct gl_renderbuffer *rb = NULL;
1188e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul
1189e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   if (c->gl_buffer)
1190e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      rb = c->gl_buffer->Attachment[BUFFER_DEPTH].Renderbuffer;
1191e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul
1192e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   if (!rb || !rb->Data) {
1193e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      /*if ((!c->gl_buffer) || (!c->gl_buffer->DepthBuffer)) {*/
11949c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      *width = 0;
11959c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      *height = 0;
11969c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      *bytesPerValue = 0;
11979c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      *buffer = 0;
11989c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      return GL_FALSE;
119974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   }
12009c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   else {
12019c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      *width = c->gl_buffer->Width;
12029c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      *height = c->gl_buffer->Height;
12039c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      if (c->gl_visual->depthBits <= 16)
12049c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         *bytesPerValue = sizeof(GLushort);
12059c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      else
12069c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         *bytesPerValue = sizeof(GLuint);
1207e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      *buffer = rb->Data;
12089c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      return GL_TRUE;
1209afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
12109c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul}
12119c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul
12129c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul/*
12139c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * Return the color buffer associated with an OSMesa context.
12149c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * Input:  c - the OSMesa context
12159c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * Output:  width, height - size of buffer in pixels
12169c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul *          format - the pixel format (OSMESA_FORMAT)
12179c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul *          buffer - pointer to color buffer values
12189c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * Return:  GL_TRUE or GL_FALSE to indicate success or failure.
12199c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul */
12209c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian PaulGLAPI GLboolean GLAPIENTRY
12219c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian PaulOSMesaGetColorBuffer( OSMesaContext c, GLint *width,
12229c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul                      GLint *height, GLint *format, void **buffer )
12239c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul{
12249c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   if (!c->buffer) {
12259c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      *width = 0;
12269c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      *height = 0;
12279c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      *format = 0;
12289c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      *buffer = 0;
12299c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      return GL_FALSE;
1230206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul   }
1231afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   else {
12329c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      *width = c->width;
12339c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      *height = c->height;
12349c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      *format = c->format;
12359c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      *buffer = c->buffer;
12369c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      return GL_TRUE;
1237afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
12389c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul}
1239afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1240709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell
1241c5f9aa7750633e2989a6a139c283419d536ee3f7Brian Paulstruct name_function
1242c5f9aa7750633e2989a6a139c283419d536ee3f7Brian Paul{
12439c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   const char *Name;
12444d880987d248ff078845027cc21ba437564ac07dBrian Paul   OSMESAproc Function;
12459c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul};
12469c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul
1247c5f9aa7750633e2989a6a139c283419d536ee3f7Brian Paulstatic struct name_function functions[] = {
12484d880987d248ff078845027cc21ba437564ac07dBrian Paul   { "OSMesaCreateContext", (OSMESAproc) OSMesaCreateContext },
12494d880987d248ff078845027cc21ba437564ac07dBrian Paul   { "OSMesaCreateContextExt", (OSMESAproc) OSMesaCreateContextExt },
12504d880987d248ff078845027cc21ba437564ac07dBrian Paul   { "OSMesaDestroyContext", (OSMESAproc) OSMesaDestroyContext },
12514d880987d248ff078845027cc21ba437564ac07dBrian Paul   { "OSMesaMakeCurrent", (OSMESAproc) OSMesaMakeCurrent },
12524d880987d248ff078845027cc21ba437564ac07dBrian Paul   { "OSMesaGetCurrentContext", (OSMESAproc) OSMesaGetCurrentContext },
12534d880987d248ff078845027cc21ba437564ac07dBrian Paul   { "OSMesaPixelsStore", (OSMESAproc) OSMesaPixelStore },
12544d880987d248ff078845027cc21ba437564ac07dBrian Paul   { "OSMesaGetIntegerv", (OSMESAproc) OSMesaGetIntegerv },
12554d880987d248ff078845027cc21ba437564ac07dBrian Paul   { "OSMesaGetDepthBuffer", (OSMESAproc) OSMesaGetDepthBuffer },
12564d880987d248ff078845027cc21ba437564ac07dBrian Paul   { "OSMesaGetColorBuffer", (OSMESAproc) OSMesaGetColorBuffer },
12574d880987d248ff078845027cc21ba437564ac07dBrian Paul   { "OSMesaGetProcAddress", (OSMESAproc) OSMesaGetProcAddress },
12589c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   { NULL, NULL }
12599c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul};
12609c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul
12614d880987d248ff078845027cc21ba437564ac07dBrian Paul
12624d880987d248ff078845027cc21ba437564ac07dBrian PaulGLAPI OSMESAproc GLAPIENTRY
12639c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian PaulOSMesaGetProcAddress( const char *funcName )
12649c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul{
12659c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   int i;
12669c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   for (i = 0; functions[i].Name; i++) {
12679c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      if (_mesa_strcmp(functions[i].Name, funcName) == 0)
12684d880987d248ff078845027cc21ba437564ac07dBrian Paul         return functions[i].Function;
12699c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   }
12704d880987d248ff078845027cc21ba437564ac07dBrian Paul   return _glapi_get_proc_address(funcName);
1271afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
1272ba3da6154c324cc916845bc5de3de077d0b59ffcBrian Paul
1273ba3da6154c324cc916845bc5de3de077d0b59ffcBrian Paul
1274ba3da6154c324cc916845bc5de3de077d0b59ffcBrian PaulGLAPI void GLAPIENTRY
1275ba3da6154c324cc916845bc5de3de077d0b59ffcBrian PaulOSMesaColorClamp(GLboolean enable)
1276ba3da6154c324cc916845bc5de3de077d0b59ffcBrian Paul{
1277ba3da6154c324cc916845bc5de3de077d0b59ffcBrian Paul   OSMesaContext osmesa = OSMesaGetCurrentContext();
1278ba3da6154c324cc916845bc5de3de077d0b59ffcBrian Paul
1279ba3da6154c324cc916845bc5de3de077d0b59ffcBrian Paul   if (enable == GL_TRUE) {
1280ba3da6154c324cc916845bc5de3de077d0b59ffcBrian Paul      osmesa->mesa.Color.ClampFragmentColor = GL_TRUE;
1281ba3da6154c324cc916845bc5de3de077d0b59ffcBrian Paul   }
1282ba3da6154c324cc916845bc5de3de077d0b59ffcBrian Paul   else {
1283ba3da6154c324cc916845bc5de3de077d0b59ffcBrian Paul      osmesa->mesa.Color.ClampFragmentColor = GL_FIXED_ONLY_ARB;
1284ba3da6154c324cc916845bc5de3de077d0b59ffcBrian Paul   }
1285ba3da6154c324cc916845bc5de3de077d0b59ffcBrian Paul}
1286ba3da6154c324cc916845bc5de3de077d0b59ffcBrian Paul
1287ba3da6154c324cc916845bc5de3de077d0b59ffcBrian Paul
1288