osmesa.c revision cc9464e082b82179e3c4b51ea460212c10b2bf0c
1cc9464e082b82179e3c4b51ea460212c10b2bf0cBrian Paul/* $Id: osmesa.c,v 1.101 2003/03/04 19:16:47 brianp Exp $ */
2afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
3afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/*
4afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Mesa 3-D graphics library
522a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul * Version:  5.1
6dbd1e2b5990a3689bf718296c57c14fc3ba38db5Jouk Jansen *
727558a160a9fe91745728d7626995cd88f8fe339Brian Paul * Copyright (C) 1999-2003  Brian Paul   All Rights Reserved.
8dbd1e2b5990a3689bf718296c57c14fc3ba38db5Jouk Jansen *
9afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Permission is hereby granted, free of charge, to any person obtaining a
10afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * copy of this software and associated documentation files (the "Software"),
11afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * to deal in the Software without restriction, including without limitation
12afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * the rights to use, copy, modify, merge, publish, distribute, sublicense,
13afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * and/or sell copies of the Software, and to permit persons to whom the
14afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Software is furnished to do so, subject to the following conditions:
15dbd1e2b5990a3689bf718296c57c14fc3ba38db5Jouk Jansen *
16afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * The above copyright notice and this permission notice shall be included
17afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * in all copies or substantial portions of the Software.
18dbd1e2b5990a3689bf718296c57c14fc3ba38db5Jouk Jansen *
19afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
20afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
21afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
22afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
23afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
24afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
25afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */
26afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
27afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
28afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/*
29afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Off-Screen Mesa rendering / Rendering into client memory space
30d3c070ca6a36daa765b1ad7f44e03e6671ad0490Brian Paul *
31d3c070ca6a36daa765b1ad7f44e03e6671ad0490Brian Paul * Note on thread safety:  this driver is thread safe.  All
32d3c070ca6a36daa765b1ad7f44e03e6671ad0490Brian Paul * functions are reentrant.  The notion of current context is
33b1394fa92aaaf859ce9efc8b5fc194397921320cBrian Paul * managed by the core _mesa_make_current() and _mesa_get_current_context()
34d3c070ca6a36daa765b1ad7f44e03e6671ad0490Brian Paul * functions.  Those functions are thread-safe.
35afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */
36afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
37afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
38eed6f691991ed0d64752fa712c83f67eb700b9adBrian Paul#include "glheader.h"
39afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#include "GL/osmesa.h"
4002ee456248c75cfee324164ec6fd81a3b77ec2bfBrian Paul#include "buffers.h"
41afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#include "context.h"
4274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul#include "colormac.h"
43afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#include "depth.h"
448e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul#include "extensions.h"
459a33a11d714c90162d32781ebbd2c1dfab52cfd1Brian Paul#include "imports.h"
46ebb248aa5c018dc676d389221d76ed329059789eBrian Paul#include "macros.h"
47afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#include "matrix.h"
48dbd1e2b5990a3689bf718296c57c14fc3ba38db5Jouk Jansen#include "mtypes.h"
497d58f44f73be59bd3583e6dfeedf56c43f7fbd55Brian Paul#include "texformat.h"
508e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul#include "texstore.h"
518e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul#include "array_cache/acache.h"
521e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell#include "swrast/swrast.h"
531e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell#include "swrast_setup/swrast_setup.h"
541e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell#include "swrast/s_context.h"
55724abeb058ca9372c5a9b9e38ee43dde1accaa41Keith Whitwell#include "swrast/s_depth.h"
561e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell#include "swrast/s_lines.h"
571e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell#include "swrast/s_triangle.h"
585a9026c65d260dc185e072163999f5d810015108Brian Paul#include "tnl/tnl.h"
59709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell#include "tnl/t_context.h"
60bc69de5f21ebb4d6e1c65bf5652d17a9fc87dda7Keith Whitwell#include "tnl/t_pipeline.h"
61afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
62724abeb058ca9372c5a9b9e38ee43dde1accaa41Keith Whitwell
63724abeb058ca9372c5a9b9e38ee43dde1accaa41Keith Whitwell
64304357dcd496f7ebf499fd9c77b4eba83a75abd5Brian Paul/*
65304357dcd496f7ebf499fd9c77b4eba83a75abd5Brian Paul * This is the OS/Mesa context struct.
66304357dcd496f7ebf499fd9c77b4eba83a75abd5Brian Paul * Notice how it includes a GLcontext.  By doing this we're mimicking
67304357dcd496f7ebf499fd9c77b4eba83a75abd5Brian Paul * C++ inheritance/derivation.
68304357dcd496f7ebf499fd9c77b4eba83a75abd5Brian Paul * Later, we can cast a GLcontext pointer into an OSMesaContext pointer
69304357dcd496f7ebf499fd9c77b4eba83a75abd5Brian Paul * or vice versa.
70304357dcd496f7ebf499fd9c77b4eba83a75abd5Brian Paul */
71afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgstruct osmesa_context {
72304357dcd496f7ebf499fd9c77b4eba83a75abd5Brian Paul   GLcontext gl_ctx;		/* The core GL/Mesa context */
73afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLvisual *gl_visual;		/* Describes the buffers */
74afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLframebuffer *gl_buffer;	/* Depth, stencil, accum, etc buffers */
75afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLenum format;		/* either GL_RGBA or GL_COLOR_INDEX */
76afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   void *buffer;		/* the image buffer */
77afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLint width, height;		/* size of image buffer */
78afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLint rowlength;		/* number of pixels per row */
79afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLint userRowLength;		/* user-specified number of pixels per row */
80afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLint rshift, gshift;	/* bit shifts for RGBA formats */
81afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLint bshift, ashift;
8274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   GLint rInd, gInd, bInd, aInd;/* index offsets for RGBA formats */
8374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   GLchan *rowaddr[MAX_HEIGHT];	/* address of first pixel in each image row */
84afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLboolean yup;		/* TRUE  -> Y increases upward */
85afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg				/* FALSE -> Y increases downward */
86afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg};
87afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
88afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
89c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul#define OSMESA_CONTEXT(ctx)  ((OSMesaContext) (ctx->DriverCtx))
90c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul
91c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul
92c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul
93afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/**********************************************************************/
949c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul/*** Private Device Driver Functions                                ***/
95afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/**********************************************************************/
96afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
97afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
989c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paulstatic const GLubyte *
999c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paulget_string( GLcontext *ctx, GLenum name )
100afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
1019c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   (void) ctx;
1029c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   switch (name) {
1039c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      case GL_RENDERER:
1049c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#if CHAN_BITS == 32
1059c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         return (const GLubyte *) "Mesa OffScreen32";
1069c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#elif CHAN_BITS == 16
1079c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         return (const GLubyte *) "Mesa OffScreen16";
1089c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#else
1099c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         return (const GLubyte *) "Mesa OffScreen";
1109c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#endif
1119c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      default:
1129c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         return NULL;
1139c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   }
1142bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul}
1152bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul
1162bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul
1179c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paulstatic void
1189c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paulosmesa_update_state( GLcontext *ctx, GLuint new_state )
1199c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul{
1209c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   /* easy - just propogate */
1219c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   _swrast_InvalidateState( ctx, new_state );
1229c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   _swsetup_InvalidateState( ctx, new_state );
1239c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   _ac_InvalidateState( ctx, new_state );
1249c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   _tnl_InvalidateState( ctx, new_state );
1259c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul}
1269c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul
1272bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul
1289c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paulstatic void
1299c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paulset_buffer( GLcontext *ctx, GLframebuffer *buffer, GLuint bufferBit )
1302bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul{
1319c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   /* separate read buffer not supported */
1329c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   ASSERT(buffer == ctx->DrawBuffer);
1339c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   ASSERT(bufferBit == FRONT_LEFT_BIT);
1349c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul}
135afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1369c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul
1379c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paulstatic void
1389c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paulget_buffer_size( GLframebuffer *buffer, GLuint *width, GLuint *height )
1399c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul{
1409c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   /* don't use GET_CURRENT_CONTEXT(ctx) here - it's a problem on Windows */
1419c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   GLcontext *ctx = (GLcontext *) _glapi_get_context();
1429c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   (void) buffer;
1439c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   if (ctx) {
1449c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
1459c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      *width = osmesa->width;
1469c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      *height = osmesa->height;
147afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
1489c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul}
1499c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul
1509c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul
1519c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paulstatic void
1529c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paulclear( GLcontext *ctx, GLbitfield mask, GLboolean all,
1539c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul       GLint x, GLint y, GLint width, GLint height )
1549c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul{
1559c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
1569c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   const GLuint *colorMask = (GLuint *) &ctx->Color.ColorMask;
1579c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul
1589c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   /* sanity check - we only have a front-left buffer */
1599c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   ASSERT((mask & (DD_FRONT_RIGHT_BIT |
1609c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul                   DD_BACK_LEFT_BIT |
1619c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul                   DD_BACK_RIGHT_BIT)) == 0);
1629c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul
1639c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   /* use optimized clear for common cases (clear whole buffer to black) */
1649c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   if (mask & DD_FRONT_LEFT_BIT) {
1659c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      if (osmesa->format == OSMESA_COLOR_INDEX) {
1669c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         if (ctx->Color.ClearIndex == 0 &&
1674039cb8ca82d59451a6de8902fe35e693cdca3baBrian Paul             ctx->Color.IndexMask == (GLuint) ~0 &&
1689c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul             osmesa->rowlength == osmesa->width &&
1699c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul             all) {
1709c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul            /* clear whole buffer to zeros */
1719c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul            _mesa_bzero(osmesa->buffer,
1729c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul                        osmesa->width * osmesa->height * sizeof(GLchan));
1739c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul            mask &= ~DD_FRONT_LEFT_BIT;
1749c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         }
175afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
176afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      else {
1779c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         /* RGB[A] format */
1789c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         if (*colorMask == 0xffffffff &&
1799c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul             ctx->Color.ClearColor[0] == 0.0F &&
1809c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul             ctx->Color.ClearColor[1] == 0.0F &&
1819c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul             ctx->Color.ClearColor[2] == 0.0F &&
1829c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul             ctx->Color.ClearColor[3] == 0.0F &&
1839c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul             osmesa->rowlength == osmesa->width &&
1849c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul             all) {
1859c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul            GLint bytesPerPixel;
1869c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul            /* clear whole buffer to black */
1879c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul            if (osmesa->format == OSMESA_RGBA ||
1889c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul                osmesa->format == OSMESA_BGRA ||
1899c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul                osmesa->format == OSMESA_ARGB)
1909c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul               bytesPerPixel = 4 * sizeof(GLchan);
1919c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul            else if (osmesa->format == OSMESA_RGB ||
1929c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul                     osmesa->format == OSMESA_BGR)
1939c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul               bytesPerPixel = 3 * sizeof(GLchan);
1949c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul            else if (osmesa->format == OSMESA_RGB_565)
1959c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul               bytesPerPixel = sizeof(GLushort);
1969c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul            else {
1979c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul               _mesa_problem(ctx, "bad pixel format in osmesa_clear()");
1989c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul               return;
1999c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul            }
2009c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul            _mesa_bzero(osmesa->buffer,
2019c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul                        bytesPerPixel * osmesa->width * osmesa->height);
2029c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul            mask &= ~DD_FRONT_LEFT_BIT;
2039c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         }
204afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
205afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
206afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
2079c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   if (mask) {
2089c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      /* software fallback (spans) for everything else. */
2099c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      _swrast_Clear(ctx, mask, all, x, y, width, height);
2109c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   }
2119c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul}
212afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
213afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
2149c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul/**********************************************************************/
2159c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul/*****        Read/write spans/arrays of pixels                   *****/
2169c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul/**********************************************************************/
2175a9026c65d260dc185e072163999f5d810015108Brian Paul
218304357dcd496f7ebf499fd9c77b4eba83a75abd5Brian Paul
2199c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul/* RGBA */
2209c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define NAME(PREFIX) PREFIX##_RGBA
2219c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define SPAN_VARS \
2229c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   const OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
2239c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define INIT_PIXEL_PTR(P, X, Y) \
2249c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   GLchan *P = osmesa->rowaddr[Y] + 4 * (X)
2259c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define INC_PIXEL_PTR(P) P += 4
2269c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#if CHAN_TYPE == GL_FLOAT
2279c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define STORE_RGB_PIXEL(P, R, G, B) \
228cc9464e082b82179e3c4b51ea460212c10b2bf0cBrian Paul   P[0] = MAX2((R), 0.0F); \
229cc9464e082b82179e3c4b51ea460212c10b2bf0cBrian Paul   P[1] = MAX2((G), 0.0F); \
230cc9464e082b82179e3c4b51ea460212c10b2bf0cBrian Paul   P[2] = MAX2((B), 0.0F); \
2319c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   P[3] = CHAN_MAXF
2329c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define STORE_RGBA_PIXEL(P, R, G, B, A) \
233cc9464e082b82179e3c4b51ea460212c10b2bf0cBrian Paul   P[0] = MAX2((R), 0.0F); \
234cc9464e082b82179e3c4b51ea460212c10b2bf0cBrian Paul   P[1] = MAX2((G), 0.0F); \
235cc9464e082b82179e3c4b51ea460212c10b2bf0cBrian Paul   P[2] = MAX2((B), 0.0F); \
2369c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   P[3] = CLAMP((A), 0.0F, CHAN_MAXF)
2379c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#else
2389c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define STORE_RGB_PIXEL(P, R, G, B) \
2399c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   P[0] = R;  P[1] = G;  P[2] = B;  P[3] = CHAN_MAX
2409c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define STORE_RGBA_PIXEL(P, R, G, B, A) \
2419c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   P[0] = R;  P[1] = G;  P[2] = B;  P[3] = A
2429c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#endif
2439c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define FETCH_RGBA_PIXEL(R, G, B, A, P) \
2449c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   R = P[0];  G = P[1];  B = P[2];  A = P[3]
2459c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#include "swrast/s_spantemp.h"
2464c44d63f01a01f134d7e4456d4209edee97f9ef5Brian Paul
2479c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul/* BGRA */
2489c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define NAME(PREFIX) PREFIX##_BGRA
2499c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define SPAN_VARS \
2509c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   const OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
2519c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define INIT_PIXEL_PTR(P, X, Y) \
2529c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   GLchan *P = osmesa->rowaddr[Y] + 4 * (X)
2539c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define INC_PIXEL_PTR(P) P += 4
2549c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define STORE_RGB_PIXEL(P, R, G, B) \
2559c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   P[2] = R;  P[1] = G;  P[0] = B;  P[3] = CHAN_MAX
2569c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define STORE_RGBA_PIXEL(P, R, G, B, A) \
2579c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   P[2] = R;  P[1] = G;  P[0] = B;  P[3] = A
2589c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define FETCH_RGBA_PIXEL(R, G, B, A, P) \
2599c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   R = P[2];  G = P[1];  B = P[0];  A = P[3]
2609c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#include "swrast/s_spantemp.h"
2619c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul
2629c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul/* ARGB */
2639c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define NAME(PREFIX) PREFIX##_ARGB
2649c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define SPAN_VARS \
2659c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   const OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
2669c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define INIT_PIXEL_PTR(P, X, Y) \
2679c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   GLchan *P = osmesa->rowaddr[Y] + 4 * (X)
2689c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define INC_PIXEL_PTR(P) P += 4
2699c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define STORE_RGB_PIXEL(P, R, G, B) \
2709c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   P[1] = R;  P[2] = G;  P[3] = B;  P[0] = CHAN_MAX
2719c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define STORE_RGBA_PIXEL(P, R, G, B, A) \
2729c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   P[1] = R;  P[2] = G;  P[3] = B;  P[0] = A
2739c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define FETCH_RGBA_PIXEL(R, G, B, A, P) \
2749c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   R = P[1];  G = P[2];  B = P[3];  A = P[0]
2759c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#include "swrast/s_spantemp.h"
2769c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul
2779c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul/* RGB */
2789c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define NAME(PREFIX) PREFIX##_RGB
2799c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define SPAN_VARS \
2809c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   const OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
2819c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define INIT_PIXEL_PTR(P, X, Y) \
2829c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   GLchan *P = osmesa->rowaddr[Y] + 4 * (X)
2839c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define INC_PIXEL_PTR(P) P += 4
2849c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define STORE_RGB_PIXEL(P, R, G, B) \
2859c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   P[0] = R;  P[1] = G;  P[2] = B
2869c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define STORE_RGBA_PIXEL(P, R, G, B, A) \
2879c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   P[0] = R;  P[1] = G;  P[2] = B
2889c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define FETCH_RGBA_PIXEL(R, G, B, A, P) \
2899c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   R = P[0];  G = P[1];  B = P[2];  A = CHAN_MAX
2909c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#include "swrast/s_spantemp.h"
2919c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul
2929c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul/* BGR */
2939c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define NAME(PREFIX) PREFIX##_BGR
2949c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define SPAN_VARS \
2959c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   const OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
2969c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define INIT_PIXEL_PTR(P, X, Y) \
2979c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   GLchan *P = osmesa->rowaddr[Y] + 4 * (X)
2989c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define INC_PIXEL_PTR(P) P += 4
2999c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define STORE_RGB_PIXEL(P, R, G, B) \
3009c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   P[0] = B;  P[1] = G;  P[2] = R
3019c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define STORE_RGBA_PIXEL(P, R, G, B, A) \
3029c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   P[0] = B;  P[1] = G;  P[2] = R
3039c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define FETCH_RGBA_PIXEL(R, G, B, A, P) \
3049c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   B = P[0];  G = P[1];  R = P[2];  A = CHAN_MAX
3059c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#include "swrast/s_spantemp.h"
3069c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul
3079c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul/* 16-bit BGR */
308cc9464e082b82179e3c4b51ea460212c10b2bf0cBrian Paul#if CHAN_TYPE == GL_UNSIGNED_BYTE
3099c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define NAME(PREFIX) PREFIX##_RGB_565
3109c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define SPAN_VARS \
3119c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   const OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
3129c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define INIT_PIXEL_PTR(P, X, Y) \
3139c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   GLushort *P = (GLushort *) osmesa->rowaddr[Y] + (X)
3149c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define INC_PIXEL_PTR(P) P += 1
3159c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define STORE_RGB_PIXEL(P, R, G, B) \
3169c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   *P = ( (((R) & 0xf8) << 8) | (((G) & 0xfc) << 3) | ((B) >> 3) )
3179c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define STORE_RGBA_PIXEL(P, R, G, B, A) \
3189c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   *P = ( (((R) & 0xf8) << 8) | (((G) & 0xfc) << 3) | ((B) >> 3) )
3199c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define FETCH_RGBA_PIXEL(R, G, B, A, P) \
3209c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   R = ( (((*P) >> 8) & 0xf8) | (((*P) >> 11) & 0x7) ); \
3219c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   G = ( (((*P) >> 3) & 0xfc) | (((*P) >>  5) & 0x3) ); \
3229c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   B = ( (((*P) << 3) & 0xf8) | (((*P)      ) & 0x7) ); \
3239c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   A = CHAN_MAX
3249c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#include "swrast/s_spantemp.h"
325cc9464e082b82179e3c4b51ea460212c10b2bf0cBrian Paul#endif
3269c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul
3279c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul/* color index */
3289c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define NAME(PREFIX) PREFIX##_CI
3299c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define SPAN_VARS \
3309c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   const OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
3319c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define INIT_PIXEL_PTR(P, X, Y) \
3329c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   GLchan *P = osmesa->rowaddr[Y] + (X)
3339c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define INC_PIXEL_PTR(P) P += 1
3349c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define STORE_CI_PIXEL(P, CI) \
3359c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   P[0] = CI
3369c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define FETCH_CI_PIXEL(CI, P) \
3379c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   CI = P[0]
3389c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#include "swrast/s_spantemp.h"
3391e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell
3401e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell
3419c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul/**********************************************************************/
3429c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul/*****                   Optimized line rendering                 *****/
3439c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul/**********************************************************************/
3441e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell
345afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
3469c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#if CHAN_TYPE == GL_FLOAT
3479c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define PACK_RGBA(DST, R, G, B, A)	\
3489c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Pauldo {					\
3499c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   (DST)[0] = MAX2( R, 0.0F );		\
3509c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   (DST)[1] = MAX2( G, 0.0F );		\
3519c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   (DST)[2] = MAX2( B, 0.0F );		\
3529c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   (DST)[3] = CLAMP(A, 0.0F, CHAN_MAXF);\
3539c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul} while (0)
3549c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#else
3559c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define PACK_RGBA(DST, R, G, B, A)	\
3569c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Pauldo {					\
3579c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   (DST)[osmesa->rInd] = R;		\
3589c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   (DST)[osmesa->gInd] = G;		\
3599c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   (DST)[osmesa->bInd] = B;		\
3609c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   (DST)[osmesa->aInd] = A;		\
3619c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul} while (0)
3629c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#endif
3639c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul
3649c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define PACK_RGB(DST, R, G, B)  \
3659c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Pauldo {				\
3669c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   (DST)[0] = R;		\
3679c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   (DST)[1] = G;		\
3689c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   (DST)[2] = B;		\
3699c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul} while (0)
3709c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul
3719c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define PACK_BGR(DST, R, G, B)  \
3729c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Pauldo {				\
3739c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   (DST)[0] = B;		\
3749c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   (DST)[1] = G;		\
3759c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   (DST)[2] = R;		\
3769c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul} while (0)
3779c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul
3789c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define PACK_RGB_565(DST, R, G, B)					\
3799c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Pauldo {									\
3809c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   (DST) = (((int) (R) << 8) & 0xf800) | (((int) (G) << 3) & 0x7e0) | ((int) (B) >> 3);\
3819c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul} while (0)
3829c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul
3839c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define UNPACK_RED(P)      ( (P)[osmesa->rInd] )
3849c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define UNPACK_GREEN(P)    ( (P)[osmesa->gInd] )
3859c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define UNPACK_BLUE(P)     ( (P)[osmesa->bInd] )
3869c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define UNPACK_ALPHA(P)    ( (P)[osmesa->aInd] )
387afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
3889c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define PIXELADDR1(X,Y)  (osmesa->rowaddr[Y] + (X))
3899c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define PIXELADDR2(X,Y)  (osmesa->rowaddr[Y] + 2 * (X))
3909c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define PIXELADDR3(X,Y)  (osmesa->rowaddr[Y] + 3 * (X))
3919c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define PIXELADDR4(X,Y)  (osmesa->rowaddr[Y] + 4 * (X))
392afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
3932bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul
394afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/*
3959c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * Draw a flat-shaded, RGB line into an osmesa buffer.
396afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */
39722a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul#define NAME flat_rgba_line
39822a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul#define CLIP_HACK 1
39922a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul#define SETUP_CODE						\
40022a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul   const OSMesaContext osmesa = OSMESA_CONTEXT(ctx);		\
4019c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   const GLchan *color = vert1->color;
402709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell
4039c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define PLOT(X, Y)						\
4049c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Pauldo {								\
4059c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   GLchan *p = PIXELADDR4(X, Y);				\
4069c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   PACK_RGBA(p, color[0], color[1], color[2], color[3]);	\
4079c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul} while (0)
408afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
4099c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#ifdef WIN32
4109c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#include "..\swrast\s_linetemp.h"
4119c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#else
4129c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#include "swrast/s_linetemp.h"
4139c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#endif
41422a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul
415afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
416afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
417afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/*
4189c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * Draw a flat-shaded, Z-less, RGB line into an osmesa buffer.
419afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */
42022a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul#define NAME flat_rgba_z_line
42122a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul#define CLIP_HACK 1
4229c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define INTERP_Z 1
4239c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE
42422a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul#define SETUP_CODE					\
42522a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul   const OSMesaContext osmesa = OSMESA_CONTEXT(ctx);	\
42622a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul   const GLchan *color = vert1->color;
42722a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul
4289c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define PLOT(X, Y)					\
4299c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Pauldo {							\
4309c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   if (Z < *zPtr) {					\
4319c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      GLchan *p = PIXELADDR4(X, Y);			\
4329c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      PACK_RGBA(p, color[RCOMP], color[GCOMP],		\
4339c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul                   color[BCOMP], color[ACOMP]);		\
4349c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      *zPtr = Z;					\
4359c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   }							\
4369c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul} while (0)
43774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul
4389c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#ifdef WIN32
4399c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#include "..\swrast\s_linetemp.h"
4409c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#else
4419c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#include "swrast/s_linetemp.h"
4429c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#endif
443206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul
444afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
445afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
4469c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul/*
4479c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * Analyze context state to see if we can provide a fast line drawing
4489c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * function, like those in lines.c.  Otherwise, return NULL.
4499c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul */
4509c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paulstatic swrast_line_func
4519c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paulosmesa_choose_line_function( GLcontext *ctx )
452afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
4539c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   const OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
4549c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   const SWcontext *swrast = SWRAST_CONTEXT(ctx);
455afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
4569c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   if (CHAN_BITS != 8)                    return NULL;
4579c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   if (ctx->RenderMode != GL_RENDER)      return NULL;
4589c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   if (ctx->Line.SmoothFlag)              return NULL;
4599c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   if (ctx->Texture._EnabledUnits)        return NULL;
4609c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   if (ctx->Light.ShadeModel != GL_FLAT)  return NULL;
4619c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   if (ctx->Line.Width != 1.0F)           return NULL;
4629c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   if (ctx->Line.StippleFlag)             return NULL;
4639c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   if (ctx->Line.SmoothFlag)              return NULL;
4649c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   if (osmesa->format != OSMESA_RGBA &&
4659c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul       osmesa->format != OSMESA_BGRA &&
4669c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul       osmesa->format != OSMESA_ARGB)     return NULL;
4679c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul
4689c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   if (swrast->_RasterMask==DEPTH_BIT
4699c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul       && ctx->Depth.Func==GL_LESS
4709c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul       && ctx->Depth.Mask==GL_TRUE
4719c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul       && ctx->Visual.depthBits == DEFAULT_SOFTWARE_DEPTH_BITS) {
4729c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      return (swrast_line_func) flat_rgba_z_line;
473afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
474afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
4759c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   if (swrast->_RasterMask == 0) {
4769c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      return (swrast_line_func) flat_rgba_line;
477afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
4789c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul
4799c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   return (swrast_line_func) NULL;
480afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
481afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
4829c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul
4839c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul/**********************************************************************/
4849c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul/*****                 Optimized triangle rendering               *****/
4859c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul/**********************************************************************/
4869c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul
4879c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul
48823ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank/*
4899c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * Smooth-shaded, z-less triangle, RGBA color.
49023ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank */
4919c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define NAME smooth_rgba_z_triangle
4929c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define INTERP_Z 1
4939c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE
4949c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define INTERP_RGB 1
4959c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define INTERP_ALPHA 1
4969c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define SETUP_CODE \
4979c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   const OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
4989c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define RENDER_SPAN( span )					\
4999c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   GLuint i;							\
5009c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   GLchan *img = PIXELADDR4(span.x, span.y); 			\
5019c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   for (i = 0; i < span.end; i++, img += 4) {			\
5029c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      const GLdepth z = FixedToDepth(span.z);			\
5039c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      if (z < zRow[i]) {					\
5049c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         PACK_RGBA(img, FixedToChan(span.red),			\
5059c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul            FixedToChan(span.green), FixedToChan(span.blue),	\
5069c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul            FixedToChan(span.alpha));				\
5079c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         zRow[i] = z;						\
5089c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      }								\
5099c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      span.red += span.redStep;					\
5109c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      span.green += span.greenStep;				\
5119c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      span.blue += span.blueStep;				\
5129c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      span.alpha += span.alphaStep;				\
5139c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      span.z += span.zStep;					\
51401dc182ee86922845ba0b17a2cda9af19150c93aBrian Paul   }
5159c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#ifdef WIN32
5169c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#include "..\swrast\s_tritemp.h"
5179c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#else
5189c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#include "swrast/s_tritemp.h"
5199c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#endif
52001dc182ee86922845ba0b17a2cda9af19150c93aBrian Paul
521afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
522afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
523afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/*
5249c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * Flat-shaded, z-less triangle, RGBA color.
525afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */
5269c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define NAME flat_rgba_z_triangle
5279c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define INTERP_Z 1
5289c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE
5299c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define SETUP_CODE						\
5309c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   const OSMesaContext osmesa = OSMESA_CONTEXT(ctx);		\
5319c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   GLuint pixel;						\
5329c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   PACK_RGBA((GLchan *) &pixel, v2->color[0], v2->color[1],	\
5339c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul                                v2->color[2], v2->color[3]);
534afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
5359c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define RENDER_SPAN( span )				\
5369c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   GLuint i;						\
5379c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   GLuint *img = (GLuint *) PIXELADDR4(span.x, span.y);	\
5389c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   for (i = 0; i < span.end; i++) {			\
5399c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      const GLdepth z = FixedToDepth(span.z);		\
5409c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      if (z < zRow[i]) {				\
5419c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         img[i] = pixel;				\
5429c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         zRow[i] = z;					\
5439c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      }							\
5449c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      span.z += span.zStep;				\
5459c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   }
5469c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#ifdef WIN32
5479c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#include "..\swrast\s_tritemp.h"
5484336c28c843923db3d9c8dc0a0cb2440ba94f064Brian Paul#else
5499c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#include "swrast/s_tritemp.h"
5504336c28c843923db3d9c8dc0a0cb2440ba94f064Brian Paul#endif
55174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul
552afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
553afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
5549c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul/*
5559c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * Return pointer to an accelerated triangle function if possible.
5569c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul */
5579c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paulstatic swrast_tri_func
5589c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paulosmesa_choose_triangle_function( GLcontext *ctx )
559afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
5609c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   const OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
5619c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   const SWcontext *swrast = SWRAST_CONTEXT(ctx);
562dd020f13a6d520b46aefd4453dae6b6edcc427f6Brian Paul
5639c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   if (CHAN_BITS != 8)                  return (swrast_tri_func) NULL;
5649c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   if (ctx->RenderMode != GL_RENDER)    return (swrast_tri_func) NULL;
5659c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   if (ctx->Polygon.SmoothFlag)         return (swrast_tri_func) NULL;
5669c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   if (ctx->Polygon.StippleFlag)        return (swrast_tri_func) NULL;
5679c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   if (ctx->Texture._EnabledUnits)      return (swrast_tri_func) NULL;
5689c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   if (osmesa->format != OSMESA_RGBA &&
5699c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul       osmesa->format != OSMESA_BGRA &&
5709c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul       osmesa->format != OSMESA_ARGB)   return (swrast_tri_func) NULL;
5719c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   if (ctx->Polygon.CullFlag &&
5729c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul       ctx->Polygon.CullFaceMode == GL_FRONT_AND_BACK)
5739c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul                                        return (swrast_tri_func) NULL;
57474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul
5759c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   if (swrast->_RasterMask == DEPTH_BIT &&
5769c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul       ctx->Depth.Func == GL_LESS &&
5779c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul       ctx->Depth.Mask == GL_TRUE &&
5789c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul       ctx->Visual.depthBits == DEFAULT_SOFTWARE_DEPTH_BITS) {
5799c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      if (ctx->Light.ShadeModel == GL_SMOOTH) {
5809c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         return (swrast_tri_func) smooth_rgba_z_triangle;
5819c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      }
5829c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      else {
5839c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         return (swrast_tri_func) flat_rgba_z_triangle;
584afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
585afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
5869c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   return (swrast_tri_func) NULL;
587afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
588afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
589afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
590afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
5919c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul/* Override for the swrast triangle-selection function.  Try to use one
5929c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * of our internal triangle functions, otherwise fall back to the
5939c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * standard swrast functions.
5949c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul */
5959c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paulstatic void
5969c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paulosmesa_choose_triangle( GLcontext *ctx )
597afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
5989c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   SWcontext *swrast = SWRAST_CONTEXT(ctx);
599afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
6009c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   swrast->Triangle = osmesa_choose_triangle_function( ctx );
6019c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   if (!swrast->Triangle)
6029c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      _swrast_choose_triangle( ctx );
6039c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul}
604afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
60574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void
6069c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paulosmesa_choose_line( GLcontext *ctx )
607afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
6089c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   SWcontext *swrast = SWRAST_CONTEXT(ctx);
6099c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul
6109c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   swrast->Line = osmesa_choose_line_function( ctx );
6119c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   if (!swrast->Line)
6129c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      _swrast_choose_line( ctx );
613afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
614afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
615afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
6169c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define OSMESA_NEW_LINE   (_NEW_LINE | \
6179c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul                           _NEW_TEXTURE | \
6189c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul                           _NEW_LIGHT | \
6199c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul                           _NEW_DEPTH | \
6209c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul                           _NEW_RENDERMODE | \
6219c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul                           _SWRAST_NEW_RASTERMASK)
6229c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul
6239c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define OSMESA_NEW_TRIANGLE (_NEW_POLYGON | \
6249c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul                             _NEW_TEXTURE | \
6259c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul                             _NEW_LIGHT | \
6269c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul                             _NEW_DEPTH | \
6279c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul                             _NEW_RENDERMODE | \
6289c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul                             _SWRAST_NEW_RASTERMASK)
6299c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul
6309c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul/* one-time, per-context initialization */
63174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void
6329c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paulhook_in_driver_functions( GLcontext *ctx )
633afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
634c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul   OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
6359c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   SWcontext *swrast = SWRAST_CONTEXT( ctx );
6369c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   struct swrast_device_driver *swdd = _swrast_GetDeviceDriverReference( ctx );
6379c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   TNLcontext *tnl = TNL_CONTEXT(ctx);
638afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
6399c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   ASSERT((void *) osmesa == (void *) ctx->DriverCtx);
640afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
6419c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   /* use default TCL pipeline */
6429c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   tnl->Driver.RunPipeline = _tnl_run_pipeline;
643afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
6449c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   ctx->Driver.GetString = get_string;
6459c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   ctx->Driver.UpdateState = osmesa_update_state;
6469c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   ctx->Driver.ResizeBuffers = _swrast_alloc_buffers;
6479c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   ctx->Driver.GetBufferSize = get_buffer_size;
648afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
6499c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   ctx->Driver.Accum = _swrast_Accum;
6509c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   ctx->Driver.Bitmap = _swrast_Bitmap;
6519c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   ctx->Driver.Clear = clear;  /* = _swrast_Clear */
6529c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   ctx->Driver.CopyPixels = _swrast_CopyPixels;
6539c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   ctx->Driver.DrawPixels = _swrast_DrawPixels;
6549c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   ctx->Driver.ReadPixels = _swrast_ReadPixels;
6559c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   ctx->Driver.DrawBuffer = _swrast_DrawBuffer;
656afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
6579c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   ctx->Driver.ChooseTextureFormat = _mesa_choose_tex_format;
6589c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   ctx->Driver.TexImage1D = _mesa_store_teximage1d;
6599c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   ctx->Driver.TexImage2D = _mesa_store_teximage2d;
6609c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   ctx->Driver.TexImage3D = _mesa_store_teximage3d;
6619c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   ctx->Driver.TexSubImage1D = _mesa_store_texsubimage1d;
6629c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   ctx->Driver.TexSubImage2D = _mesa_store_texsubimage2d;
6639c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   ctx->Driver.TexSubImage3D = _mesa_store_texsubimage3d;
6649c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   ctx->Driver.TestProxyTexImage = _mesa_test_proxy_teximage;
665afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
6669c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   ctx->Driver.CompressedTexImage1D = _mesa_store_compressed_teximage1d;
6679c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   ctx->Driver.CompressedTexImage2D = _mesa_store_compressed_teximage2d;
6689c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   ctx->Driver.CompressedTexImage3D = _mesa_store_compressed_teximage3d;
6699c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   ctx->Driver.CompressedTexSubImage1D = _mesa_store_compressed_texsubimage1d;
6709c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   ctx->Driver.CompressedTexSubImage2D = _mesa_store_compressed_texsubimage2d;
6719c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   ctx->Driver.CompressedTexSubImage3D = _mesa_store_compressed_texsubimage3d;
672afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
6739c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   ctx->Driver.CopyTexImage1D = _swrast_copy_teximage1d;
6749c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   ctx->Driver.CopyTexImage2D = _swrast_copy_teximage2d;
6759c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   ctx->Driver.CopyTexSubImage1D = _swrast_copy_texsubimage1d;
6769c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   ctx->Driver.CopyTexSubImage2D = _swrast_copy_texsubimage2d;
6779c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   ctx->Driver.CopyTexSubImage3D = _swrast_copy_texsubimage3d;
6789c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   ctx->Driver.CopyColorTable = _swrast_CopyColorTable;
6799c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   ctx->Driver.CopyColorSubTable = _swrast_CopyColorSubTable;
6809c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   ctx->Driver.CopyConvolutionFilter1D = _swrast_CopyConvolutionFilter1D;
6819c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   ctx->Driver.CopyConvolutionFilter2D = _swrast_CopyConvolutionFilter2D;
682afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
6839c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   swdd->SetBuffer = set_buffer;
684afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
6859c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   /* RGB(A) span/pixel functions */
6869c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   if (osmesa->format == OSMESA_RGB) {
6879c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      swdd->WriteRGBASpan = write_rgba_span_RGB;
6889c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      swdd->WriteRGBSpan = write_rgb_span_RGB;
6899c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      swdd->WriteMonoRGBASpan = write_monorgba_span_RGB;
6909c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      swdd->WriteRGBAPixels = write_rgba_pixels_RGB;
6919c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      swdd->WriteMonoRGBAPixels = write_monorgba_pixels_RGB;
6929c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      swdd->ReadRGBASpan = read_rgba_span_RGB;
6939c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      swdd->ReadRGBAPixels = read_rgba_pixels_RGB;
694afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
6959c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   else if (osmesa->format == OSMESA_BGR) {
6969c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      swdd->WriteRGBASpan = write_rgba_span_BGR;
6979c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      swdd->WriteRGBSpan = write_rgb_span_BGR;
6989c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      swdd->WriteMonoRGBASpan = write_monorgba_span_BGR;
6999c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      swdd->WriteRGBAPixels = write_rgba_pixels_BGR;
7009c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      swdd->WriteMonoRGBAPixels = write_monorgba_pixels_BGR;
7019c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      swdd->ReadRGBASpan = read_rgba_span_BGR;
7029c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      swdd->ReadRGBAPixels = read_rgba_pixels_BGR;
7039c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   }
704cc9464e082b82179e3c4b51ea460212c10b2bf0cBrian Paul#if CHAN_TYPE == GL_UNSIGNED_BYTE
7059c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   else if (osmesa->format == OSMESA_RGB_565) {
7069c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      swdd->WriteRGBASpan = write_rgba_span_RGB_565;
7079c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      swdd->WriteRGBSpan = write_rgb_span_RGB_565;
7089c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      swdd->WriteMonoRGBASpan = write_monorgba_span_RGB_565;
7099c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      swdd->WriteRGBAPixels = write_rgba_pixels_RGB_565;
7109c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      swdd->WriteMonoRGBAPixels = write_monorgba_pixels_RGB_565;
7119c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      swdd->ReadRGBASpan = read_rgba_span_RGB_565;
7129c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      swdd->ReadRGBAPixels = read_rgba_pixels_RGB_565;
7139c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   }
714cc9464e082b82179e3c4b51ea460212c10b2bf0cBrian Paul#endif
7159c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   else if (osmesa->format == OSMESA_RGBA) {
7169c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      swdd->WriteRGBASpan = write_rgba_span_RGBA;
7179c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      swdd->WriteRGBSpan = write_rgb_span_RGBA;
7189c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      swdd->WriteMonoRGBASpan = write_monorgba_span_RGBA;
7199c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      swdd->WriteRGBAPixels = write_rgba_pixels_RGBA;
7209c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      swdd->WriteMonoRGBAPixels = write_monorgba_pixels_RGBA;
7219c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      swdd->ReadRGBASpan = read_rgba_span_RGBA;
7229c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      swdd->ReadRGBAPixels = read_rgba_pixels_RGBA;
7239c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   }
7249c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   else if (osmesa->format == OSMESA_BGRA) {
7259c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      swdd->WriteRGBASpan = write_rgba_span_BGRA;
7269c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      swdd->WriteRGBSpan = write_rgb_span_BGRA;
7279c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      swdd->WriteMonoRGBASpan = write_monorgba_span_BGRA;
7289c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      swdd->WriteRGBAPixels = write_rgba_pixels_BGRA;
7299c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      swdd->WriteMonoRGBAPixels = write_monorgba_pixels_BGRA;
7309c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      swdd->ReadRGBASpan = read_rgba_span_BGRA;
7319c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      swdd->ReadRGBAPixels = read_rgba_pixels_BGRA;
7329c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   }
7339c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   else if (osmesa->format == OSMESA_ARGB) {
7349c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      swdd->WriteRGBASpan = write_rgba_span_ARGB;
7359c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      swdd->WriteRGBSpan = write_rgb_span_ARGB;
7369c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      swdd->WriteMonoRGBASpan = write_monorgba_span_ARGB;
7379c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      swdd->WriteRGBAPixels = write_rgba_pixels_ARGB;
7389c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      swdd->WriteMonoRGBAPixels = write_monorgba_pixels_ARGB;
7399c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      swdd->ReadRGBASpan = read_rgba_span_ARGB;
7409c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      swdd->ReadRGBAPixels = read_rgba_pixels_ARGB;
7419c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   }
7429c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   else if (osmesa->format == OSMESA_COLOR_INDEX) {
7439c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      swdd->WriteCI32Span = write_index32_span_CI;
7449c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      swdd->WriteCI8Span = write_index8_span_CI;
7459c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      swdd->WriteMonoCISpan = write_monoindex_span_CI;
7469c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      swdd->WriteCI32Pixels = write_index_pixels_CI;
7479c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      swdd->WriteMonoCIPixels = write_monoindex_pixels_CI;
7489c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      swdd->ReadCI32Span = read_index_span_CI;
7499c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      swdd->ReadCI32Pixels = read_index_pixels_CI;
7509c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   }
7519c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   else {
7529c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      _mesa_problem(ctx, "bad pixel format in osmesa_update_state!\n");
753afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
754afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
7559c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   /* Extend the software rasterizer with our optimized line and triangle
7569c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul    * drawin functions.
7579c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul    */
7589c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   swrast->choose_line = osmesa_choose_line;
7599c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   swrast->choose_triangle = osmesa_choose_triangle;
7609c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   swrast->invalidate_line |= OSMESA_NEW_LINE;
7619c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   swrast->invalidate_triangle |= OSMESA_NEW_TRIANGLE;
762afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
763afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
764afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
7659c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul
766afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
767afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/**********************************************************************/
7689c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul/*****                    Public Functions                        *****/
769afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/**********************************************************************/
770afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
771afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
7729c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul/*
7739c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * Create an Off-Screen Mesa rendering context.  The only attribute needed is
7749c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * an RGBA vs Color-Index mode flag.
7759c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul *
7769c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * Input:  format - either GL_RGBA or GL_COLOR_INDEX
7779c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul *         sharelist - specifies another OSMesaContext with which to share
7789c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul *                     display lists.  NULL indicates no sharing.
7799c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * Return:  an OSMesaContext or 0 if error
7809c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul */
7819c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian PaulGLAPI OSMesaContext GLAPIENTRY
7829c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian PaulOSMesaCreateContext( GLenum format, OSMesaContext sharelist )
783afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
7849c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   return OSMesaCreateContextExt(format, DEFAULT_SOFTWARE_DEPTH_BITS,
7859c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul                                 8, 16, sharelist);
78674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul}
78774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul
78874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul
78974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul
7909c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul/*
7919c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * New in Mesa 3.5
7929c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul *
7939c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * Create context and specify size of ancillary buffers.
7949c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul */
7959c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian PaulGLAPI OSMesaContext GLAPIENTRY
7969c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian PaulOSMesaCreateContextExt( GLenum format, GLint depthBits, GLint stencilBits,
7979c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul                        GLint accumBits, OSMesaContext sharelist )
79874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul{
7999c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   OSMesaContext osmesa;
8009c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   GLint rshift, gshift, bshift, ashift;
8019c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   GLint rind, gind, bind, aind;
8029c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   GLint indexBits = 0, redBits = 0, greenBits = 0, blueBits = 0, alphaBits =0;
8039c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   GLboolean rgbmode;
8049c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   const GLuint i4 = 1;
8059c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   const GLubyte *i1 = (GLubyte *) &i4;
8069c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   const GLint little_endian = *i1;
807afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
8089c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   rind = gind = bind = aind = 0;
8099c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   if (format==OSMESA_COLOR_INDEX) {
8109c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      indexBits = 8;
8119c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      rshift = gshift = bshift = ashift = 0;
8129c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      rgbmode = GL_FALSE;
81374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   }
8149c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   else if (format==OSMESA_RGBA) {
8159c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      indexBits = 0;
8169c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      redBits = CHAN_BITS;
8179c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      greenBits = CHAN_BITS;
8189c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      blueBits = CHAN_BITS;
8199c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      alphaBits = CHAN_BITS;
8209c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      rind = 0;
8219c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      gind = 1;
8229c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      bind = 2;
8239c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      aind = 3;
8249c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      if (little_endian) {
8259c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         rshift = 0;
8269c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         gshift = 8;
8279c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         bshift = 16;
8289c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         ashift = 24;
829afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
8309c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      else {
8319c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         rshift = 24;
8329c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         gshift = 16;
8339c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         bshift = 8;
8349c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         ashift = 0;
835afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
8369c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      rgbmode = GL_TRUE;
837afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
8389c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   else if (format==OSMESA_BGRA) {
8399c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      indexBits = 0;
8409c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      redBits = CHAN_BITS;
8419c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      greenBits = CHAN_BITS;
8429c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      blueBits = CHAN_BITS;
8439c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      alphaBits = CHAN_BITS;
8449c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      bind = 0;
8459c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      gind = 1;
8469c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      rind = 2;
8479c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      aind = 3;
8489c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      if (little_endian) {
8499c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         bshift = 0;
8509c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         gshift = 8;
8519c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         rshift = 16;
8529c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         ashift = 24;
85374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      }
8549c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      else {
8559c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         bshift = 24;
8569c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         gshift = 16;
8579c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         rshift = 8;
8589c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         ashift = 0;
859afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
8609c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      rgbmode = GL_TRUE;
861afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
8629c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   else if (format==OSMESA_ARGB) {
8639c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      indexBits = 0;
8649c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      redBits = CHAN_BITS;
8659c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      greenBits = CHAN_BITS;
8669c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      blueBits = CHAN_BITS;
8679c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      alphaBits = CHAN_BITS;
8689c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      aind = 0;
8699c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      rind = 1;
8709c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      gind = 2;
8719c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      bind = 3;
8729c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      if (little_endian) {
8739c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         ashift = 0;
8749c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         rshift = 8;
8759c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         gshift = 16;
8769c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         bshift = 24;
877206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul      }
8789c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      else {
8799c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         ashift = 24;
8809c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         rshift = 16;
8819c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         gshift = 8;
8829c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         bshift = 0;
883206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul      }
8849c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      rgbmode = GL_TRUE;
885206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul   }
8869c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   else if (format==OSMESA_RGB) {
8879c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      indexBits = 0;
8889c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      redBits = CHAN_BITS;
8899c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      greenBits = CHAN_BITS;
8909c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      blueBits = CHAN_BITS;
8919c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      alphaBits = 0;
8929c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      bshift = 0;
8939c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      gshift = 8;
8949c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      rshift = 16;
8959c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      ashift = 24;
8969c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      rind = 0;
8979c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      gind = 1;
8989c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      bind = 2;
8999c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      rgbmode = GL_TRUE;
900afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
9019c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   else if (format==OSMESA_BGR) {
9029c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      indexBits = 0;
9039c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      redBits = CHAN_BITS;
9049c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      greenBits = CHAN_BITS;
9059c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      blueBits = CHAN_BITS;
9069c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      alphaBits = 0;
9079c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      bshift = 0;
9089c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      gshift = 8;
9099c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      rshift = 16;
9109c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      ashift = 24;
9119c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      rind = 2;
9129c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      gind = 1;
9139c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      bind = 0;
9149c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      rgbmode = GL_TRUE;
915afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
916cc9464e082b82179e3c4b51ea460212c10b2bf0cBrian Paul#if CHAN_TYPE == GL_UNSIGNED_BYTE
9179c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   else if (format==OSMESA_RGB_565) {
9189c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      indexBits = 0;
9199c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      redBits = 5;
9209c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      greenBits = 6;
9219c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      blueBits = 5;
9229c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      alphaBits = 0;
9239c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      rshift = 11;
9249c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      gshift = 5;
9259c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      bshift = 0;
9269c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      ashift = 0;
9279c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      rind = 0; /* not used */
9289c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      gind = 0;
9299c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      bind = 0;
9309c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      rgbmode = GL_TRUE;
931afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
932cc9464e082b82179e3c4b51ea460212c10b2bf0cBrian Paul#endif
933afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   else {
9349c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      return NULL;
935afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
936afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
937afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
9389c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   osmesa = (OSMesaContext) CALLOC_STRUCT(osmesa_context);
9399c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   if (osmesa) {
9409c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      osmesa->gl_visual = _mesa_create_visual( rgbmode,
9419c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul                                               GL_FALSE,    /* double buffer */
9429c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul                                               GL_FALSE,    /* stereo */
9439c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul                                               redBits,
9449c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul                                               greenBits,
9459c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul                                               blueBits,
9469c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul                                               alphaBits,
9479c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul                                               indexBits,
9489c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul                                               depthBits,
9499c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul                                               stencilBits,
9509c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul                                               accumBits,
9519c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul                                               accumBits,
9529c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul                                               accumBits,
9539c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul                                               alphaBits ? accumBits : 0,
9549c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul                                               1            /* num samples */
9559c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul                                               );
9569c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      if (!osmesa->gl_visual) {
9579c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         FREE(osmesa);
9589c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         return NULL;
959afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
960afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
9619c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      if (!_mesa_initialize_context(&osmesa->gl_ctx,
9629c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul                                    osmesa->gl_visual,
9639c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul                                    sharelist ? &sharelist->gl_ctx
9649c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul                                              : (GLcontext *) NULL,
9659c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul                                    (void *) osmesa,
9669c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul                                    GL_FALSE)) {
9679c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         _mesa_destroy_visual( osmesa->gl_visual );
9689c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         FREE(osmesa);
9699c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         return NULL;
970afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
97174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul
9729c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      _mesa_enable_sw_extensions(&(osmesa->gl_ctx));
9739c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      _mesa_enable_1_3_extensions(&(osmesa->gl_ctx));
9749c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      /*_mesa_enable_1_4_extensions(&(osmesa->gl_ctx));*/
97574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul
9769c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      osmesa->gl_buffer = _mesa_create_framebuffer( osmesa->gl_visual,
9779c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul                           (GLboolean) ( osmesa->gl_visual->depthBits > 0 ),
9789c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul                           (GLboolean) ( osmesa->gl_visual->stencilBits > 0 ),
9799c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul                           (GLboolean) ( osmesa->gl_visual->accumRedBits > 0 ),
9809c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul                           GL_FALSE /* s/w alpha */ );
98174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul
9829c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      if (!osmesa->gl_buffer) {
9839c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         _mesa_destroy_visual( osmesa->gl_visual );
9849c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         _mesa_free_context_data( &osmesa->gl_ctx );
9859c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         FREE(osmesa);
9869c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         return NULL;
9879c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      }
9889c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      osmesa->format = format;
9899c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      osmesa->buffer = NULL;
9909c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      osmesa->width = 0;
9919c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      osmesa->height = 0;
9929c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      osmesa->userRowLength = 0;
9939c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      osmesa->rowlength = 0;
9949c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      osmesa->yup = GL_TRUE;
9959c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      osmesa->rshift = rshift;
9969c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      osmesa->gshift = gshift;
9979c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      osmesa->bshift = bshift;
9989c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      osmesa->ashift = ashift;
9999c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      osmesa->rInd = rind;
10009c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      osmesa->gInd = gind;
10019c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      osmesa->bInd = bind;
10029c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      osmesa->aInd = aind;
100374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul
10049c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      /* Initialize the software rasterizer and helper modules. */
10059c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      {
10069c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul	 GLcontext *ctx = &osmesa->gl_ctx;
1007afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
10089c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul	 _swrast_CreateContext( ctx );
10099c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul	 _ac_CreateContext( ctx );
10109c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul	 _tnl_CreateContext( ctx );
10119c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul	 _swsetup_CreateContext( ctx );
10129c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul
10139c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul	 _swsetup_Wakeup( ctx );
10149c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         hook_in_driver_functions( ctx );
10159c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      }
1016afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
10179c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   return osmesa;
1018afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
1019afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1020afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1021afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/*
10229c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * Destroy an Off-Screen Mesa rendering context.
10239c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul *
10249c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * Input:  ctx - the context to destroy
1025afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */
10269c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian PaulGLAPI void GLAPIENTRY
10279c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian PaulOSMesaDestroyContext( OSMesaContext ctx )
1028afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
10299c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   if (ctx) {
10309c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      _swsetup_DestroyContext( &ctx->gl_ctx );
10319c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      _tnl_DestroyContext( &ctx->gl_ctx );
10329c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      _ac_DestroyContext( &ctx->gl_ctx );
10339c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      _swrast_DestroyContext( &ctx->gl_ctx );
10349bf68ad963ba92b5d1e725f965979042495a5313Brian Paul
10359c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      _mesa_destroy_visual( ctx->gl_visual );
10369c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      _mesa_destroy_framebuffer( ctx->gl_buffer );
10379c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      _mesa_free_context_data( &ctx->gl_ctx );
10389c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      FREE( ctx );
10399c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   }
1040afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
1041afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1042afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1043afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/*
10449c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * Recompute the values of the context's rowaddr array.
1045afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */
10469c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paulstatic void
10479c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paulcompute_row_addresses( OSMesaContext ctx )
1048afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
10499c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   GLint bytesPerPixel, bytesPerRow, i;
10509c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   GLubyte *origin = (GLubyte *) ctx->buffer;
105174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul
10529c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   if (ctx->format == OSMESA_COLOR_INDEX) {
10539c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      /* CI mode */
10549c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      bytesPerPixel = 1 * sizeof(GLchan);
10559c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   }
10569c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   else if ((ctx->format == OSMESA_RGB) || (ctx->format == OSMESA_BGR)) {
10579c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      /* RGB mode */
10589c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      bytesPerPixel = 3 * sizeof(GLchan);
10599c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   }
10609c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   else if (ctx->format == OSMESA_RGB_565) {
10619c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      /* 5/6/5 RGB pixel in 16 bits */
10629c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      bytesPerPixel = 2;
10639c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   }
10649c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   else {
10659c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      /* RGBA mode */
10669c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      bytesPerPixel = 4 * sizeof(GLchan);
10679bf68ad963ba92b5d1e725f965979042495a5313Brian Paul   }
10689bf68ad963ba92b5d1e725f965979042495a5313Brian Paul
10699c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   bytesPerRow = ctx->rowlength * bytesPerPixel;
1070afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
10719c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   if (ctx->yup) {
10729c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      /* Y=0 is bottom line of window */
10739c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      for (i = 0; i < MAX_HEIGHT; i++) {
10749c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         ctx->rowaddr[i] = (GLchan *) ((GLubyte *) origin + i * bytesPerRow);
10759c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      }
10769c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   }
10779c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   else {
10789c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      /* Y=0 is top line of window */
10799c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      for (i = 0; i < MAX_HEIGHT; i++) {
10809c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         GLint j = ctx->height - i - 1;
10819c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         ctx->rowaddr[i] = (GLchan *) ((GLubyte *) origin + j * bytesPerRow);
10829c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      }
10839c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   }
10849c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul}
1085afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1086afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1087afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/*
10889c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * Bind an OSMesaContext to an image buffer.  The image buffer is just a
10899c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * block of memory which the client provides.  Its size must be at least
10909c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * as large as width*height*sizeof(type).  Its address should be a multiple
10919c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * of 4 if using RGBA mode.
10929c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul *
10939c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * Image data is stored in the order of glDrawPixels:  row-major order
10949c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * with the lower-left image pixel stored in the first array position
10959c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * (ie. bottom-to-top).
10969c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul *
10979c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * If the context's viewport hasn't been initialized yet, it will now be
10989c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * initialized to (0,0,width,height).
10999c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul *
11009c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * Input:  ctx - the rendering context
11019c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul *         buffer - the image buffer memory
11029c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul *         type - data type for pixel components
11039c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul *            Normally, only GL_UNSIGNED_BYTE and GL_UNSIGNED_SHORT_5_6_5
11049c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul *            are supported.  But if Mesa's been compiled with CHAN_BITS==16
11059c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul *            then type must be GL_UNSIGNED_SHORT.  And if Mesa's been build
11069c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul *            with CHAN_BITS==32 then type must be GL_FLOAT.
11079c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul *         width, height - size of image buffer in pixels, at least 1
11089c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * Return:  GL_TRUE if success, GL_FALSE if error because of invalid ctx,
11099c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul *          invalid buffer address, invalid type, width<1, height<1,
11109c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul *          width>internal limit or height>internal limit.
1111afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */
11129c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian PaulGLAPI GLboolean GLAPIENTRY
11139c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian PaulOSMesaMakeCurrent( OSMesaContext ctx, void *buffer, GLenum type,
11149c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul                   GLsizei width, GLsizei height )
1115afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
11169c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   if (!ctx || !buffer ||
11179c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul       width < 1 || height < 1 ||
11189c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul       width > MAX_WIDTH || height > MAX_HEIGHT) {
11199c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      return GL_FALSE;
11209c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   }
112174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul
11229c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   if (ctx->format == OSMESA_RGB_565) {
11239c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      if (type != GL_UNSIGNED_SHORT_5_6_5)
11249c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         return GL_FALSE;
1125afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
11269c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   else if (type != CHAN_TYPE) {
11279c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      return GL_FALSE;
11289c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   }
11299c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul
11309c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   osmesa_update_state( &ctx->gl_ctx, 0 );
11319c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   _mesa_make_current( &ctx->gl_ctx, ctx->gl_buffer );
11329c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul
11339c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   ctx->buffer = buffer;
11349c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   ctx->width = width;
11359c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   ctx->height = height;
11369c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   if (ctx->userRowLength)
11379c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      ctx->rowlength = ctx->userRowLength;
11389c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   else
11399c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      ctx->rowlength = width;
11401e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell
11419c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   compute_row_addresses( ctx );
114274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul
11439c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   /* init viewport */
11449c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   if (ctx->gl_ctx.Viewport.Width == 0) {
11459c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      /* initialize viewport and scissor box to buffer size */
11469c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      _mesa_Viewport( 0, 0, width, height );
11479c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      ctx->gl_ctx.Scissor.Width = width;
11489c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      ctx->gl_ctx.Scissor.Height = height;
11499c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   }
11509c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   else {
11519c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      /* this will make ensure we recognize the new buffer size */
11529c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      _mesa_ResizeBuffersMESA();
11539c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   }
115474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul
11559c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   /* Added by Gerk Huisma: */
11569c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   _tnl_MakeCurrent( &ctx->gl_ctx, ctx->gl_ctx.DrawBuffer,
11579c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul                     ctx->gl_ctx.ReadBuffer );
11581e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell
11599c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   return GL_TRUE;
1160afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
1161afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
11621e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell
11631e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell
11649c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian PaulGLAPI OSMesaContext GLAPIENTRY OSMesaGetCurrentContext( void )
11659c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul{
11669c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   GLcontext *ctx = _mesa_get_current_context();
11679c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   if (ctx)
11689c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      return (OSMesaContext) ctx;
11699c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   else
11709c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      return NULL;
11719c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul}
11722d595d70202bad560c27ea81ec71b740415b3355Brian Paul
11731e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell
11741e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell
11759c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian PaulGLAPI void GLAPIENTRY OSMesaPixelStore( GLint pname, GLint value )
11761e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell{
11779c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   OSMesaContext osmesa = OSMesaGetCurrentContext();
1178dbd1e2b5990a3689bf718296c57c14fc3ba38db5Jouk Jansen
11799c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   switch (pname) {
11809c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      case OSMESA_ROW_LENGTH:
11819c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         if (value<0) {
11829c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul            _mesa_error( &osmesa->gl_ctx, GL_INVALID_VALUE,
11839c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul                      "OSMesaPixelStore(value)" );
11849c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul            return;
11859c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         }
11869c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         osmesa->userRowLength = value;
11879c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         osmesa->rowlength = value ? value : osmesa->width;
11889c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         break;
11899c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      case OSMESA_Y_UP:
11909c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         osmesa->yup = value ? GL_TRUE : GL_FALSE;
11919c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         break;
11929c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      default:
11939c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         _mesa_error( &osmesa->gl_ctx, GL_INVALID_ENUM, "OSMesaPixelStore(pname)" );
11949c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         return;
11959c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   }
1196dbd1e2b5990a3689bf718296c57c14fc3ba38db5Jouk Jansen
11979c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   compute_row_addresses( osmesa );
11981e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell}
1199ed30dfa1264ec8875a3162c3c8778bc703bf11d5Brian Paul
1200ed30dfa1264ec8875a3162c3c8778bc703bf11d5Brian Paul
12019c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian PaulGLAPI void GLAPIENTRY OSMesaGetIntegerv( GLint pname, GLint *value )
1202afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
12039c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   OSMesaContext osmesa = OSMesaGetCurrentContext();
12049c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul
12059c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   switch (pname) {
12069c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      case OSMESA_WIDTH:
12079c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         *value = osmesa->width;
12089c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         return;
12099c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      case OSMESA_HEIGHT:
12109c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         *value = osmesa->height;
12119c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         return;
12129c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      case OSMESA_FORMAT:
12139c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         *value = osmesa->format;
12149c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         return;
12159c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      case OSMESA_TYPE:
12169c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         *value = CHAN_TYPE;
12179c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         return;
12189c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      case OSMESA_ROW_LENGTH:
12199c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         *value = osmesa->userRowLength;
12209c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         return;
12219c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      case OSMESA_Y_UP:
12229c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         *value = osmesa->yup;
12239c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         return;
12249c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      case OSMESA_MAX_WIDTH:
12259c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         *value = MAX_WIDTH;
12269c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         return;
12279c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      case OSMESA_MAX_HEIGHT:
12289c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         *value = MAX_HEIGHT;
12299c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         return;
1230afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      default:
12319c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         _mesa_error(&osmesa->gl_ctx, GL_INVALID_ENUM, "OSMesaGetIntergerv(pname)");
12329c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         return;
1233afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
1234afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
1235afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
12369c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul/*
12379c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * Return the depth buffer associated with an OSMesa context.
12389c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * Input:  c - the OSMesa context
12399c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * Output:  width, height - size of buffer in pixels
12409c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul *          bytesPerValue - bytes per depth value (2 or 4)
12419c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul *          buffer - pointer to depth buffer values
12429c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * Return:  GL_TRUE or GL_FALSE to indicate success or failure.
12439c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul */
12449c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian PaulGLAPI GLboolean GLAPIENTRY
12459c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian PaulOSMesaGetDepthBuffer( OSMesaContext c, GLint *width, GLint *height,
12469c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul                      GLint *bytesPerValue, void **buffer )
1247afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
12489c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   if ((!c->gl_buffer) || (!c->gl_buffer->DepthBuffer)) {
12499c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      *width = 0;
12509c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      *height = 0;
12519c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      *bytesPerValue = 0;
12529c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      *buffer = 0;
12539c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      return GL_FALSE;
125474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   }
12559c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   else {
12569c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      *width = c->gl_buffer->Width;
12579c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      *height = c->gl_buffer->Height;
12589c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      if (c->gl_visual->depthBits <= 16)
12599c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         *bytesPerValue = sizeof(GLushort);
12609c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      else
12619c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         *bytesPerValue = sizeof(GLuint);
12629c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      *buffer = c->gl_buffer->DepthBuffer;
12639c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      return GL_TRUE;
1264afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
12659c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul}
12669c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul
12679c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul/*
12689c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * Return the color buffer associated with an OSMesa context.
12699c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * Input:  c - the OSMesa context
12709c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * Output:  width, height - size of buffer in pixels
12719c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul *          format - the pixel format (OSMESA_FORMAT)
12729c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul *          buffer - pointer to color buffer values
12739c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * Return:  GL_TRUE or GL_FALSE to indicate success or failure.
12749c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul */
12759c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian PaulGLAPI GLboolean GLAPIENTRY
12769c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian PaulOSMesaGetColorBuffer( OSMesaContext c, GLint *width,
12779c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul                      GLint *height, GLint *format, void **buffer )
12789c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul{
12799c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   if (!c->buffer) {
12809c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      *width = 0;
12819c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      *height = 0;
12829c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      *format = 0;
12839c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      *buffer = 0;
12849c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      return GL_FALSE;
1285206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul   }
1286afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   else {
12879c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      *width = c->width;
12889c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      *height = c->height;
12899c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      *format = c->format;
12909c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      *buffer = c->buffer;
12919c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      return GL_TRUE;
1292afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
12939c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul}
1294afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1295709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell
129623caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell
12979c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paulstruct name_address {
12989c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   const char *Name;
12999c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   GLvoid *Address;
13009c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul};
13019c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul
13029c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paulstatic struct name_address functions[] = {
13039c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   { "OSMesaCreateContext", (void *) OSMesaCreateContext },
13049c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   { "OSMesaCreateContextExt", (void *) OSMesaCreateContextExt },
13059c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   { "OSMesaDestroyContext", (void *) OSMesaDestroyContext },
13069c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   { "OSMesaMakeCurrent", (void *) OSMesaMakeCurrent },
13079c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   { "OSMesaGetCurrentContext", (void *) OSMesaGetCurrentContext },
13089c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   { "OSMesaPixelsStore", (void *) OSMesaPixelStore },
13099c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   { "OSMesaGetIntegerv", (void *) OSMesaGetIntegerv },
13109c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   { "OSMesaGetDepthBuffer", (void *) OSMesaGetDepthBuffer },
13119c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   { "OSMesaGetColorBuffer", (void *) OSMesaGetColorBuffer },
13129c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   { "OSMesaGetProcAddress", (void *) OSMesaGetProcAddress },
13139c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   { NULL, NULL }
13149c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul};
13159c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul
13169c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian PaulGLAPI void * GLAPIENTRY
13179c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian PaulOSMesaGetProcAddress( const char *funcName )
13189c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul{
13199c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   int i;
13209c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   for (i = 0; functions[i].Name; i++) {
13219c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      if (_mesa_strcmp(functions[i].Name, funcName) == 0)
13229c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         return (void *) functions[i].Address;
13239c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   }
13249c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   return (void *) _glapi_get_proc_address(funcName);
1325afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
1326