1afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/*
2afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Mesa 3-D graphics library
3216eb81c53908c9ac774a378425691aa66205a88Brian * Version:  6.5.3
4dbd1e2b5990a3689bf718296c57c14fc3ba38db5Jouk Jansen *
5216eb81c53908c9ac774a378425691aa66205a88Brian * Copyright (C) 1999-2007  Brian Paul   All Rights Reserved.
6dbd1e2b5990a3689bf718296c57c14fc3ba38db5Jouk Jansen *
7afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Permission is hereby granted, free of charge, to any person obtaining a
8afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * copy of this software and associated documentation files (the "Software"),
9afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * to deal in the Software without restriction, including without limitation
10afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * the rights to use, copy, modify, merge, publish, distribute, sublicense,
11afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * and/or sell copies of the Software, and to permit persons to whom the
12afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Software is furnished to do so, subject to the following conditions:
13dbd1e2b5990a3689bf718296c57c14fc3ba38db5Jouk Jansen *
14afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * The above copyright notice and this permission notice shall be included
15afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * in all copies or substantial portions of the Software.
16dbd1e2b5990a3689bf718296c57c14fc3ba38db5Jouk Jansen *
17afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
18afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
20afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
21afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
22afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
23afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */
24afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
25afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
26afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/*
27afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Off-Screen Mesa rendering / Rendering into client memory space
28d3c070ca6a36daa765b1ad7f44e03e6671ad0490Brian Paul *
29d3c070ca6a36daa765b1ad7f44e03e6671ad0490Brian Paul * Note on thread safety:  this driver is thread safe.  All
30d3c070ca6a36daa765b1ad7f44e03e6671ad0490Brian Paul * functions are reentrant.  The notion of current context is
31b1394fa92aaaf859ce9efc8b5fc194397921320cBrian Paul * managed by the core _mesa_make_current() and _mesa_get_current_context()
32d3c070ca6a36daa765b1ad7f44e03e6671ad0490Brian Paul * functions.  Those functions are thread-safe.
33afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */
34afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
35afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
3691b491debea274cc4dfc12130624935d4ebd9728Brian Paul#include "main/glheader.h"
37afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#include "GL/osmesa.h"
3891b491debea274cc4dfc12130624935d4ebd9728Brian Paul#include "main/context.h"
3991b491debea274cc4dfc12130624935d4ebd9728Brian Paul#include "main/extensions.h"
4045e76d2665b38ba3787548310efc59e969124c01Brian Paul#include "main/formats.h"
4191b491debea274cc4dfc12130624935d4ebd9728Brian Paul#include "main/framebuffer.h"
4291b491debea274cc4dfc12130624935d4ebd9728Brian Paul#include "main/imports.h"
432873555a76a7358db053c3a7b121b489f8df9bb1Brian Paul#include "main/macros.h"
448d38c7229827cf76a29f942725e1d907fd335dc1Brian Paul#include "main/mipmap.h"
4591b491debea274cc4dfc12130624935d4ebd9728Brian Paul#include "main/mtypes.h"
4691b491debea274cc4dfc12130624935d4ebd9728Brian Paul#include "main/renderbuffer.h"
471e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell#include "swrast/swrast.h"
481e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell#include "swrast_setup/swrast_setup.h"
491e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell#include "swrast/s_context.h"
501e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell#include "swrast/s_lines.h"
51d0dc75c000d5af92648c7de901756400672b8447Brian Paul#include "swrast/s_renderbuffer.h"
521e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell#include "swrast/s_triangle.h"
535a9026c65d260dc185e072163999f5d810015108Brian Paul#include "tnl/tnl.h"
54709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell#include "tnl/t_context.h"
55bc69de5f21ebb4d6e1c65bf5652d17a9fc87dda7Keith Whitwell#include "tnl/t_pipeline.h"
56d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul#include "drivers/common/driverfuncs.h"
571741bc1a79b6a243e841bca704f1a720b028124aBrian Paul#include "drivers/common/meta.h"
5848f5deab94be832a782a440f55a7bc742d50a62fKeith Whitwell#include "vbo/vbo.h"
59afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
60724abeb058ca9372c5a9b9e38ee43dde1accaa41Keith Whitwell
61cb254b75d7d971b3f1baab45a82cedf0bd6c36c4Brian Paul#define OSMESA_RENDERBUFFER_CLASS 0x053
62cb254b75d7d971b3f1baab45a82cedf0bd6c36c4Brian Paul
63724abeb058ca9372c5a9b9e38ee43dde1accaa41Keith Whitwell
64d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul/**
65f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg * OSMesa rendering context, derived from core Mesa struct gl_context.
66304357dcd496f7ebf499fd9c77b4eba83a75abd5Brian Paul */
67d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paulstruct osmesa_context
68d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul{
69f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg   struct gl_context mesa;		/*< Base class - this must be first */
70d3491e775fb07f891463b2185d74bbad62f3ed24Kristian Høgsberg   struct gl_config *gl_visual;		/*< Describes the buffers */
71797c18be1f907337ebd85b18ce43dfa0b056f492Brian Paul   struct swrast_renderbuffer *srb;     /*< The user's colorbuffer */
7231aca27c08d6a385c595d34fe4ee06390bf5b0e8Kristian Høgsberg   struct gl_framebuffer *gl_buffer;	/*< The framebuffer, containing user's rb */
73d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   GLenum format;		/*< User-specified context format */
74d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   GLint userRowLength;		/*< user-specified number of pixels per row */
75d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   GLint rInd, gInd, bInd, aInd;/*< index offsets for RGBA formats */
76a3b2c3a4211f72b82d1061a94447cdbc1321ab8eBrian Paul   GLvoid *rowaddr[SWRAST_MAX_HEIGHT];	/*< address of first pixel in each image row */
77d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   GLboolean yup;		/*< TRUE  -> Y increases upward */
78d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul				/*< FALSE -> Y increases downward */
79136791ebc1fb91ef20dc65722a34f093d2947849Vinson Lee   GLenum DataType;
80afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg};
81afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
82afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
83d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paulstatic INLINE OSMesaContext
84f9995b30756140724f41daf963fa06167912be7fKristian HøgsbergOSMESA_CONTEXT(struct gl_context *ctx)
85d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul{
86d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   /* Just cast, since we're using structure containment */
87d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   return (OSMesaContext) ctx;
88d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul}
89c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul
90c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul
91afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/**********************************************************************/
929c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul/*** Private Device Driver Functions                                ***/
93afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/**********************************************************************/
94afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
95afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
969c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paulstatic const GLubyte *
97f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergget_string( struct gl_context *ctx, GLenum name )
98afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
999c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   (void) ctx;
1009c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   switch (name) {
1019c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      case GL_RENDERER:
1029c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#if CHAN_BITS == 32
1039c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         return (const GLubyte *) "Mesa OffScreen32";
1049c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#elif CHAN_BITS == 16
1059c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         return (const GLubyte *) "Mesa OffScreen16";
1069c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#else
1079c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         return (const GLubyte *) "Mesa OffScreen";
1089c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#endif
1099c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      default:
1109c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         return NULL;
1119c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   }
1122bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul}
1132bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul
1142bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul
1159c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paulstatic void
116f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergosmesa_update_state( struct gl_context *ctx, GLuint new_state )
1179c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul{
1189c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   /* easy - just propogate */
1199c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   _swrast_InvalidateState( ctx, new_state );
1209c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   _swsetup_InvalidateState( ctx, new_state );
1219c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   _tnl_InvalidateState( ctx, new_state );
12248f5deab94be832a782a440f55a7bc742d50a62fKeith Whitwell   _vbo_InvalidateState( ctx, new_state );
1239c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul}
1249c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul
1252bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul
1269c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul
12720215ecc7ded503d7d9cb6e8ba2f7a9c1621dd15Brian Paul/**
12820215ecc7ded503d7d9cb6e8ba2f7a9c1621dd15Brian Paul * Macros for optimized line/triangle rendering.
12920215ecc7ded503d7d9cb6e8ba2f7a9c1621dd15Brian Paul * Only for 8-bit channel, RGBA, BGRA, ARGB formats.
13020215ecc7ded503d7d9cb6e8ba2f7a9c1621dd15Brian Paul */
131afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1329c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define PACK_RGBA(DST, R, G, B, A)	\
1339c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Pauldo {					\
1349c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   (DST)[osmesa->rInd] = R;		\
1359c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   (DST)[osmesa->gInd] = G;		\
1369c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   (DST)[osmesa->bInd] = B;		\
1379c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   (DST)[osmesa->aInd] = A;		\
1389c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul} while (0)
1399c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul
140d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define PIXELADDR4(X,Y)  ((GLchan *) osmesa->rowaddr[Y] + 4 * (X))
141afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1422bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul
14320215ecc7ded503d7d9cb6e8ba2f7a9c1621dd15Brian Paul/**
1449c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * Draw a flat-shaded, RGB line into an osmesa buffer.
145afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */
14622a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul#define NAME flat_rgba_line
14722a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul#define CLIP_HACK 1
14822a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul#define SETUP_CODE						\
14922a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul   const OSMesaContext osmesa = OSMESA_CONTEXT(ctx);		\
1509c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   const GLchan *color = vert1->color;
151709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell
1529c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define PLOT(X, Y)						\
1539c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Pauldo {								\
1549c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   GLchan *p = PIXELADDR4(X, Y);				\
1559c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   PACK_RGBA(p, color[0], color[1], color[2], color[3]);	\
1569c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul} while (0)
157afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1589c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#include "swrast/s_linetemp.h"
15922a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul
160afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
161afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
16220215ecc7ded503d7d9cb6e8ba2f7a9c1621dd15Brian Paul/**
1639c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * Draw a flat-shaded, Z-less, RGB line into an osmesa buffer.
164afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */
16522a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul#define NAME flat_rgba_z_line
16622a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul#define CLIP_HACK 1
1679c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define INTERP_Z 1
1689c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE
16922a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul#define SETUP_CODE					\
17022a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul   const OSMesaContext osmesa = OSMESA_CONTEXT(ctx);	\
17122a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul   const GLchan *color = vert1->color;
17222a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul
1739c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define PLOT(X, Y)					\
1749c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Pauldo {							\
1759c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   if (Z < *zPtr) {					\
1769c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      GLchan *p = PIXELADDR4(X, Y);			\
1779c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      PACK_RGBA(p, color[RCOMP], color[GCOMP],		\
1789c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul                   color[BCOMP], color[ACOMP]);		\
1799c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      *zPtr = Z;					\
1809c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   }							\
1819c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul} while (0)
18274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul
1839c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#include "swrast/s_linetemp.h"
184206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul
185afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
186afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
187d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul/**
1889c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * Analyze context state to see if we can provide a fast line drawing
189d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul * function.  Otherwise, return NULL.
1909c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul */
1919c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paulstatic swrast_line_func
192f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergosmesa_choose_line_function( struct gl_context *ctx )
193afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
1949c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   const OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
1959c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   const SWcontext *swrast = SWRAST_CONTEXT(ctx);
196afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1979c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   if (ctx->RenderMode != GL_RENDER)      return NULL;
1989c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   if (ctx->Line.SmoothFlag)              return NULL;
1999c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   if (ctx->Texture._EnabledUnits)        return NULL;
2009c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   if (ctx->Light.ShadeModel != GL_FLAT)  return NULL;
2019c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   if (ctx->Line.Width != 1.0F)           return NULL;
2029c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   if (ctx->Line.StippleFlag)             return NULL;
2039c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   if (ctx->Line.SmoothFlag)              return NULL;
2049c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   if (osmesa->format != OSMESA_RGBA &&
2059c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul       osmesa->format != OSMESA_BGRA &&
2069c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul       osmesa->format != OSMESA_ARGB)     return NULL;
2079c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul
2089c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   if (swrast->_RasterMask==DEPTH_BIT
2099c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul       && ctx->Depth.Func==GL_LESS
2109c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul       && ctx->Depth.Mask==GL_TRUE
2119c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul       && ctx->Visual.depthBits == DEFAULT_SOFTWARE_DEPTH_BITS) {
2129c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      return (swrast_line_func) flat_rgba_z_line;
213afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
214afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
2159c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   if (swrast->_RasterMask == 0) {
2169c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      return (swrast_line_func) flat_rgba_line;
217afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
2189c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul
2199c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   return (swrast_line_func) NULL;
220afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
221afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
2229c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul
2239c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul/**********************************************************************/
2249c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul/*****                 Optimized triangle rendering               *****/
2259c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul/**********************************************************************/
2269c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul
2279c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul
22823ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank/*
2299c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * Smooth-shaded, z-less triangle, RGBA color.
23023ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank */
2319c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define NAME smooth_rgba_z_triangle
2329c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define INTERP_Z 1
2339c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE
2349c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define INTERP_RGB 1
2359c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define INTERP_ALPHA 1
2369c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define SETUP_CODE \
2379c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   const OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
2385bdec89da520f763b6d0faad1781f64566a97fddKarl Schultz#define RENDER_SPAN( span ) {					\
2399c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   GLuint i;							\
2409c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   GLchan *img = PIXELADDR4(span.x, span.y); 			\
2419c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   for (i = 0; i < span.end; i++, img += 4) {			\
2424092fbd55ac92a59d09d5167ced328683bed049cBrian Paul      const GLuint z = FixedToDepth(span.z);			\
2439c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      if (z < zRow[i]) {					\
2449c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         PACK_RGBA(img, FixedToChan(span.red),			\
2459c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul            FixedToChan(span.green), FixedToChan(span.blue),	\
2469c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul            FixedToChan(span.alpha));				\
2479c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         zRow[i] = z;						\
2489c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      }								\
2499c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      span.red += span.redStep;					\
2509c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      span.green += span.greenStep;				\
2519c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      span.blue += span.blueStep;				\
2529c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      span.alpha += span.alphaStep;				\
2539c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      span.z += span.zStep;					\
2545bdec89da520f763b6d0faad1781f64566a97fddKarl Schultz   }                                                            \
2555bdec89da520f763b6d0faad1781f64566a97fddKarl Schultz}
2569c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#include "swrast/s_tritemp.h"
25701dc182ee86922845ba0b17a2cda9af19150c93aBrian Paul
258afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
259afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
260afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/*
2619c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * Flat-shaded, z-less triangle, RGBA color.
262afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */
2639c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define NAME flat_rgba_z_triangle
2649c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define INTERP_Z 1
2659c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE
2669c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define SETUP_CODE						\
2679c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   const OSMesaContext osmesa = OSMESA_CONTEXT(ctx);		\
2689c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   GLuint pixel;						\
2699c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   PACK_RGBA((GLchan *) &pixel, v2->color[0], v2->color[1],	\
2709c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul                                v2->color[2], v2->color[3]);
271afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
2725bdec89da520f763b6d0faad1781f64566a97fddKarl Schultz#define RENDER_SPAN( span ) {				\
2739c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   GLuint i;						\
2749c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   GLuint *img = (GLuint *) PIXELADDR4(span.x, span.y);	\
2759c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   for (i = 0; i < span.end; i++) {			\
2764092fbd55ac92a59d09d5167ced328683bed049cBrian Paul      const GLuint z = FixedToDepth(span.z);		\
2779c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      if (z < zRow[i]) {				\
2789c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         img[i] = pixel;				\
2799c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         zRow[i] = z;					\
2809c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      }							\
2819c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      span.z += span.zStep;				\
2825bdec89da520f763b6d0faad1781f64566a97fddKarl Schultz   }                                                    \
2835bdec89da520f763b6d0faad1781f64566a97fddKarl Schultz}
2844c92f3fa6ebe01628546617f91da3b3c10572b16José Fonseca
2859c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#include "swrast/s_tritemp.h"
28674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul
287afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
288afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
289d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul/**
290d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul * Return pointer to an optimized triangle function if possible.
2919c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul */
2929c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paulstatic swrast_tri_func
293f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergosmesa_choose_triangle_function( struct gl_context *ctx )
294afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
2959c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   const OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
2969c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   const SWcontext *swrast = SWRAST_CONTEXT(ctx);
297dd020f13a6d520b46aefd4453dae6b6edcc427f6Brian Paul
2989c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   if (ctx->RenderMode != GL_RENDER)    return (swrast_tri_func) NULL;
2999c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   if (ctx->Polygon.SmoothFlag)         return (swrast_tri_func) NULL;
3009c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   if (ctx->Polygon.StippleFlag)        return (swrast_tri_func) NULL;
3019c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   if (ctx->Texture._EnabledUnits)      return (swrast_tri_func) NULL;
3029c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   if (osmesa->format != OSMESA_RGBA &&
3039c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul       osmesa->format != OSMESA_BGRA &&
3049c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul       osmesa->format != OSMESA_ARGB)   return (swrast_tri_func) NULL;
3059c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   if (ctx->Polygon.CullFlag &&
3069c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul       ctx->Polygon.CullFaceMode == GL_FRONT_AND_BACK)
3079c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul                                        return (swrast_tri_func) NULL;
30874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul
3099c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   if (swrast->_RasterMask == DEPTH_BIT &&
3109c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul       ctx->Depth.Func == GL_LESS &&
3119c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul       ctx->Depth.Mask == GL_TRUE &&
3129c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul       ctx->Visual.depthBits == DEFAULT_SOFTWARE_DEPTH_BITS) {
3139c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      if (ctx->Light.ShadeModel == GL_SMOOTH) {
3149c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         return (swrast_tri_func) smooth_rgba_z_triangle;
3159c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      }
3169c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      else {
3179c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         return (swrast_tri_func) flat_rgba_z_triangle;
318afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
319afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
3209c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   return (swrast_tri_func) NULL;
321afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
322afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
323afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
324afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
3259c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul/* Override for the swrast triangle-selection function.  Try to use one
3269c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * of our internal triangle functions, otherwise fall back to the
3279c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * standard swrast functions.
3289c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul */
3299c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paulstatic void
330f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergosmesa_choose_triangle( struct gl_context *ctx )
331afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
3329c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   SWcontext *swrast = SWRAST_CONTEXT(ctx);
333afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
3349c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   swrast->Triangle = osmesa_choose_triangle_function( ctx );
3359c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   if (!swrast->Triangle)
3369c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      _swrast_choose_triangle( ctx );
3379c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul}
338afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
33974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void
340f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergosmesa_choose_line( struct gl_context *ctx )
341afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
3429c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   SWcontext *swrast = SWRAST_CONTEXT(ctx);
3439c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul
3449c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   swrast->Line = osmesa_choose_line_function( ctx );
3459c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   if (!swrast->Line)
3469c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      _swrast_choose_line( ctx );
347afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
348afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
349afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
350544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul
351544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul/**
352544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul * Recompute the values of the context's rowaddr array.
353544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul */
354544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paulstatic void
355544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paulcompute_row_addresses( OSMesaContext osmesa )
356544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul{
357540a8b2cfdedbf5a635f33c720aa795fae74e08bBrian Paul   GLint bytesPerRow, i;
358797c18be1f907337ebd85b18ce43dfa0b056f492Brian Paul   GLubyte *origin = (GLubyte *) osmesa->srb->Buffer;
359544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul   GLint rowlength; /* in pixels */
360797c18be1f907337ebd85b18ce43dfa0b056f492Brian Paul   GLint height = osmesa->srb->Base.Height;
361544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul
362544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul   if (osmesa->userRowLength)
363544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul      rowlength = osmesa->userRowLength;
364544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul   else
365797c18be1f907337ebd85b18ce43dfa0b056f492Brian Paul      rowlength = osmesa->srb->Base.Width;
366544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul
367797c18be1f907337ebd85b18ce43dfa0b056f492Brian Paul   bytesPerRow = rowlength * _mesa_get_format_bytes(osmesa->srb->Base.Format);
368544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul
369544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul   if (osmesa->yup) {
370544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul      /* Y=0 is bottom line of window */
371544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul      for (i = 0; i < height; i++) {
372544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul         osmesa->rowaddr[i] = (GLvoid *) ((GLubyte *) origin + i * bytesPerRow);
373544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul      }
374544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul   }
375544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul   else {
376544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul      /* Y=0 is top line of window */
377544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul      for (i = 0; i < height; i++) {
378544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul         GLint j = height - i - 1;
379544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul         osmesa->rowaddr[i] = (GLvoid *) ((GLubyte *) origin + j * bytesPerRow);
380544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul      }
381544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul   }
382544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul}
383544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul
384544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul
385544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul
386e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul/**
3877a36345f70a0b8ac2d480bb52eb2c74c2be5a978Brian Paul * Don't use _mesa_delete_renderbuffer since we can't free rb->Buffer.
388e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul */
38974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void
3909d4ab9a663d4088ec553edaae0eeafb746d2490dBrian Paulosmesa_delete_renderbuffer(struct gl_context *ctx, struct gl_renderbuffer *rb)
391afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
3929d4ab9a663d4088ec553edaae0eeafb746d2490dBrian Paul   _mesa_delete_renderbuffer(ctx, rb);
393e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul}
394e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul
395e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul
396e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul/**
397e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul * Allocate renderbuffer storage.  We don't actually allocate any storage
398e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul * since we're using a user-provided buffer.
399e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul * Just set up all the gl_renderbuffer methods.
400e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul */
401e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paulstatic GLboolean
402f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergosmesa_renderbuffer_storage(struct gl_context *ctx, struct gl_renderbuffer *rb,
403e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul                            GLenum internalFormat, GLuint width, GLuint height)
404e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul{
405e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   const OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
406e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul
4079e81d6ae3a6db9831d6aea0fe4d92722176e9f74Brian Paul   /* Note: we can ignoring internalFormat for "window-system" renderbuffers */
4085bdc6fdebc0ab59a888fba15136eb4a0ee2790e1Brian Paul   (void) internalFormat;
4095bdc6fdebc0ab59a888fba15136eb4a0ee2790e1Brian Paul
410540a8b2cfdedbf5a635f33c720aa795fae74e08bBrian Paul   /* Given the user-provided format and type, figure out which MESA_FORMAT_x
411540a8b2cfdedbf5a635f33c720aa795fae74e08bBrian Paul    * to use.
412540a8b2cfdedbf5a635f33c720aa795fae74e08bBrian Paul    * XXX There aren't Mesa formats for all the possible combinations here!
413540a8b2cfdedbf5a635f33c720aa795fae74e08bBrian Paul    * XXX Specifically, there's only RGBA-order 16-bit/channel and float
414540a8b2cfdedbf5a635f33c720aa795fae74e08bBrian Paul    * XXX formats.
415540a8b2cfdedbf5a635f33c720aa795fae74e08bBrian Paul    * XXX The 8-bit/channel formats should all be OK.
416540a8b2cfdedbf5a635f33c720aa795fae74e08bBrian Paul    */
417e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   if (osmesa->format == OSMESA_RGBA) {
418f9874feef4d8952df5054bd8e8f4e0deda4ef44fBrian Paul      if (osmesa->DataType == GL_UNSIGNED_BYTE) {
419540a8b2cfdedbf5a635f33c720aa795fae74e08bBrian Paul         if (_mesa_little_endian())
420540a8b2cfdedbf5a635f33c720aa795fae74e08bBrian Paul            rb->Format = MESA_FORMAT_RGBA8888_REV;
421540a8b2cfdedbf5a635f33c720aa795fae74e08bBrian Paul         else
422540a8b2cfdedbf5a635f33c720aa795fae74e08bBrian Paul            rb->Format = MESA_FORMAT_RGBA8888;
423d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul      }
424f9874feef4d8952df5054bd8e8f4e0deda4ef44fBrian Paul      else if (osmesa->DataType == GL_UNSIGNED_SHORT) {
425540a8b2cfdedbf5a635f33c720aa795fae74e08bBrian Paul         rb->Format = MESA_FORMAT_RGBA_16;
426d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul      }
427d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul      else {
428540a8b2cfdedbf5a635f33c720aa795fae74e08bBrian Paul         rb->Format = MESA_FORMAT_RGBA_FLOAT32;
429d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul      }
430e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   }
431e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   else if (osmesa->format == OSMESA_BGRA) {
432f9874feef4d8952df5054bd8e8f4e0deda4ef44fBrian Paul      if (osmesa->DataType == GL_UNSIGNED_BYTE) {
433540a8b2cfdedbf5a635f33c720aa795fae74e08bBrian Paul         if (_mesa_little_endian())
434540a8b2cfdedbf5a635f33c720aa795fae74e08bBrian Paul            rb->Format = MESA_FORMAT_ARGB8888;
435540a8b2cfdedbf5a635f33c720aa795fae74e08bBrian Paul         else
436540a8b2cfdedbf5a635f33c720aa795fae74e08bBrian Paul            rb->Format = MESA_FORMAT_ARGB8888_REV;
437d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul      }
438f9874feef4d8952df5054bd8e8f4e0deda4ef44fBrian Paul      else if (osmesa->DataType == GL_UNSIGNED_SHORT) {
439540a8b2cfdedbf5a635f33c720aa795fae74e08bBrian Paul         _mesa_warning(ctx, "Unsupported OSMesa format BGRA/GLushort");
440540a8b2cfdedbf5a635f33c720aa795fae74e08bBrian Paul         rb->Format = MESA_FORMAT_RGBA_16; /* not exactly right */
441d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul      }
442d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul      else {
443540a8b2cfdedbf5a635f33c720aa795fae74e08bBrian Paul         _mesa_warning(ctx, "Unsupported OSMesa format BGRA/GLfloat");
444540a8b2cfdedbf5a635f33c720aa795fae74e08bBrian Paul         rb->Format = MESA_FORMAT_RGBA_FLOAT32; /* not exactly right */
445d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul      }
446e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   }
447e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   else if (osmesa->format == OSMESA_ARGB) {
448f9874feef4d8952df5054bd8e8f4e0deda4ef44fBrian Paul      if (osmesa->DataType == GL_UNSIGNED_BYTE) {
449540a8b2cfdedbf5a635f33c720aa795fae74e08bBrian Paul         if (_mesa_little_endian())
450540a8b2cfdedbf5a635f33c720aa795fae74e08bBrian Paul            rb->Format = MESA_FORMAT_ARGB8888_REV;
451540a8b2cfdedbf5a635f33c720aa795fae74e08bBrian Paul         else
452540a8b2cfdedbf5a635f33c720aa795fae74e08bBrian Paul            rb->Format = MESA_FORMAT_ARGB8888;
453d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul      }
454f9874feef4d8952df5054bd8e8f4e0deda4ef44fBrian Paul      else if (osmesa->DataType == GL_UNSIGNED_SHORT) {
455540a8b2cfdedbf5a635f33c720aa795fae74e08bBrian Paul         _mesa_warning(ctx, "Unsupported OSMesa format ARGB/GLushort");
456540a8b2cfdedbf5a635f33c720aa795fae74e08bBrian Paul         rb->Format = MESA_FORMAT_RGBA_16; /* not exactly right */
457d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul      }
458d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul      else {
459540a8b2cfdedbf5a635f33c720aa795fae74e08bBrian Paul         _mesa_warning(ctx, "Unsupported OSMesa format ARGB/GLfloat");
460540a8b2cfdedbf5a635f33c720aa795fae74e08bBrian Paul         rb->Format = MESA_FORMAT_RGBA_FLOAT32; /* not exactly right */
461d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul      }
462e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   }
463e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   else if (osmesa->format == OSMESA_RGB) {
464f9874feef4d8952df5054bd8e8f4e0deda4ef44fBrian Paul      if (osmesa->DataType == GL_UNSIGNED_BYTE) {
465540a8b2cfdedbf5a635f33c720aa795fae74e08bBrian Paul         rb->Format = MESA_FORMAT_RGB888;
466d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul      }
467f9874feef4d8952df5054bd8e8f4e0deda4ef44fBrian Paul      else if (osmesa->DataType == GL_UNSIGNED_SHORT) {
468540a8b2cfdedbf5a635f33c720aa795fae74e08bBrian Paul         _mesa_warning(ctx, "Unsupported OSMesa format RGB/GLushort");
469540a8b2cfdedbf5a635f33c720aa795fae74e08bBrian Paul         rb->Format = MESA_FORMAT_RGBA_16; /* not exactly right */
470d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul      }
471d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul      else {
472540a8b2cfdedbf5a635f33c720aa795fae74e08bBrian Paul         _mesa_warning(ctx, "Unsupported OSMesa format RGB/GLfloat");
473540a8b2cfdedbf5a635f33c720aa795fae74e08bBrian Paul         rb->Format = MESA_FORMAT_RGBA_FLOAT32; /* not exactly right */
474d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul      }
475afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
4769c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   else if (osmesa->format == OSMESA_BGR) {
477f9874feef4d8952df5054bd8e8f4e0deda4ef44fBrian Paul      if (osmesa->DataType == GL_UNSIGNED_BYTE) {
478540a8b2cfdedbf5a635f33c720aa795fae74e08bBrian Paul         rb->Format = MESA_FORMAT_BGR888;
479d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul      }
480f9874feef4d8952df5054bd8e8f4e0deda4ef44fBrian Paul      else if (osmesa->DataType == GL_UNSIGNED_SHORT) {
481540a8b2cfdedbf5a635f33c720aa795fae74e08bBrian Paul         _mesa_warning(ctx, "Unsupported OSMesa format BGR/GLushort");
482540a8b2cfdedbf5a635f33c720aa795fae74e08bBrian Paul         rb->Format = MESA_FORMAT_RGBA_16; /* not exactly right */
483d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul      }
484d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul      else {
485540a8b2cfdedbf5a635f33c720aa795fae74e08bBrian Paul         _mesa_warning(ctx, "Unsupported OSMesa format BGR/GLfloat");
486540a8b2cfdedbf5a635f33c720aa795fae74e08bBrian Paul         rb->Format = MESA_FORMAT_RGBA_FLOAT32; /* not exactly right */
487d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul      }
4889c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   }
4899c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   else if (osmesa->format == OSMESA_RGB_565) {
490f9874feef4d8952df5054bd8e8f4e0deda4ef44fBrian Paul      ASSERT(osmesa->DataType == GL_UNSIGNED_BYTE);
491540a8b2cfdedbf5a635f33c720aa795fae74e08bBrian Paul      rb->Format = MESA_FORMAT_RGB565;
4929c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   }
4939c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   else {
494e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      _mesa_problem(ctx, "bad pixel format in osmesa renderbuffer_storage");
495afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
496afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
497b100484145d3518e4896d756b1ceccf61382c569Daniel Borca   rb->Width = width;
498b100484145d3518e4896d756b1ceccf61382c569Daniel Borca   rb->Height = height;
499b100484145d3518e4896d756b1ceccf61382c569Daniel Borca
500544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul   compute_row_addresses( osmesa );
501544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul
502e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   return GL_TRUE;
503afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
504afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
505afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
506e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul/**
507ed875a4cb3cf194637d696b2660b98fdc3b95b0fBrian Paul * Allocate a new renderbuffer to describe the user-provided color buffer.
508e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul */
509797c18be1f907337ebd85b18ce43dfa0b056f492Brian Paulstatic struct swrast_renderbuffer *
510f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergnew_osmesa_renderbuffer(struct gl_context *ctx, GLenum format, GLenum type)
511e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul{
512d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   const GLuint name = 0;
513797c18be1f907337ebd85b18ce43dfa0b056f492Brian Paul   struct swrast_renderbuffer *srb = CALLOC_STRUCT(swrast_renderbuffer);
514797c18be1f907337ebd85b18ce43dfa0b056f492Brian Paul
515797c18be1f907337ebd85b18ce43dfa0b056f492Brian Paul   if (srb) {
516797c18be1f907337ebd85b18ce43dfa0b056f492Brian Paul      _mesa_init_renderbuffer(&srb->Base, name);
517797c18be1f907337ebd85b18ce43dfa0b056f492Brian Paul
518797c18be1f907337ebd85b18ce43dfa0b056f492Brian Paul      srb->Base.ClassID = OSMESA_RENDERBUFFER_CLASS;
5193fc6e4e0254c0bfb643439952f2ceb55193010e7Brian Paul      srb->Base.RefCount = 1;
520797c18be1f907337ebd85b18ce43dfa0b056f492Brian Paul      srb->Base.Delete = osmesa_delete_renderbuffer;
521797c18be1f907337ebd85b18ce43dfa0b056f492Brian Paul      srb->Base.AllocStorage = osmesa_renderbuffer_storage;
522797c18be1f907337ebd85b18ce43dfa0b056f492Brian Paul
523797c18be1f907337ebd85b18ce43dfa0b056f492Brian Paul      srb->Base.InternalFormat = GL_RGBA;
524797c18be1f907337ebd85b18ce43dfa0b056f492Brian Paul      srb->Base._BaseFormat = GL_RGBA;
525797c18be1f907337ebd85b18ce43dfa0b056f492Brian Paul
526797c18be1f907337ebd85b18ce43dfa0b056f492Brian Paul      return srb;
527e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   }
528797c18be1f907337ebd85b18ce43dfa0b056f492Brian Paul   return NULL;
529e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul}
530e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul
5319c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul
532cb254b75d7d971b3f1baab45a82cedf0bd6c36c4Brian Paul
533cb254b75d7d971b3f1baab45a82cedf0bd6c36c4Brian Paulstatic void
534cb254b75d7d971b3f1baab45a82cedf0bd6c36c4Brian Paulosmesa_MapRenderbuffer(struct gl_context *ctx,
535cb254b75d7d971b3f1baab45a82cedf0bd6c36c4Brian Paul                       struct gl_renderbuffer *rb,
536cb254b75d7d971b3f1baab45a82cedf0bd6c36c4Brian Paul                       GLuint x, GLuint y, GLuint w, GLuint h,
537cb254b75d7d971b3f1baab45a82cedf0bd6c36c4Brian Paul                       GLbitfield mode,
538cb254b75d7d971b3f1baab45a82cedf0bd6c36c4Brian Paul                       GLubyte **mapOut, GLint *rowStrideOut)
539cb254b75d7d971b3f1baab45a82cedf0bd6c36c4Brian Paul{
540cb254b75d7d971b3f1baab45a82cedf0bd6c36c4Brian Paul   const OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
541cb254b75d7d971b3f1baab45a82cedf0bd6c36c4Brian Paul
542cb254b75d7d971b3f1baab45a82cedf0bd6c36c4Brian Paul   if (rb->ClassID == OSMESA_RENDERBUFFER_CLASS) {
543cb254b75d7d971b3f1baab45a82cedf0bd6c36c4Brian Paul      /* this is an OSMesa renderbuffer which wraps user memory */
544797c18be1f907337ebd85b18ce43dfa0b056f492Brian Paul      struct swrast_renderbuffer *srb = swrast_renderbuffer(rb);
545cb254b75d7d971b3f1baab45a82cedf0bd6c36c4Brian Paul      const GLuint bpp = _mesa_get_format_bytes(rb->Format);
546cb254b75d7d971b3f1baab45a82cedf0bd6c36c4Brian Paul      GLint rowStride; /* in bytes */
547cb254b75d7d971b3f1baab45a82cedf0bd6c36c4Brian Paul
548cb254b75d7d971b3f1baab45a82cedf0bd6c36c4Brian Paul      if (osmesa->userRowLength)
549cb254b75d7d971b3f1baab45a82cedf0bd6c36c4Brian Paul         rowStride = osmesa->userRowLength * bpp;
550cb254b75d7d971b3f1baab45a82cedf0bd6c36c4Brian Paul      else
551cb254b75d7d971b3f1baab45a82cedf0bd6c36c4Brian Paul         rowStride = rb->Width * bpp;
552cb254b75d7d971b3f1baab45a82cedf0bd6c36c4Brian Paul
553cb254b75d7d971b3f1baab45a82cedf0bd6c36c4Brian Paul      if (!osmesa->yup) {
554cb254b75d7d971b3f1baab45a82cedf0bd6c36c4Brian Paul         /* Y=0 is top line of window */
555cb254b75d7d971b3f1baab45a82cedf0bd6c36c4Brian Paul         y = rb->Height - y - 1;
556cb254b75d7d971b3f1baab45a82cedf0bd6c36c4Brian Paul         *rowStrideOut = -rowStride;
557cb254b75d7d971b3f1baab45a82cedf0bd6c36c4Brian Paul      }
558cb254b75d7d971b3f1baab45a82cedf0bd6c36c4Brian Paul      else {
559cb254b75d7d971b3f1baab45a82cedf0bd6c36c4Brian Paul         *rowStrideOut = rowStride;
560cb254b75d7d971b3f1baab45a82cedf0bd6c36c4Brian Paul      }
561cb254b75d7d971b3f1baab45a82cedf0bd6c36c4Brian Paul
562797c18be1f907337ebd85b18ce43dfa0b056f492Brian Paul      *mapOut = (GLubyte *) srb->Buffer + y * rowStride + x * bpp;
563cb254b75d7d971b3f1baab45a82cedf0bd6c36c4Brian Paul   }
564cb254b75d7d971b3f1baab45a82cedf0bd6c36c4Brian Paul   else {
565cb254b75d7d971b3f1baab45a82cedf0bd6c36c4Brian Paul      _swrast_map_soft_renderbuffer(ctx, rb, x, y, w, h, mode,
566cb254b75d7d971b3f1baab45a82cedf0bd6c36c4Brian Paul                                    mapOut, rowStrideOut);
567cb254b75d7d971b3f1baab45a82cedf0bd6c36c4Brian Paul   }
568cb254b75d7d971b3f1baab45a82cedf0bd6c36c4Brian Paul}
569cb254b75d7d971b3f1baab45a82cedf0bd6c36c4Brian Paul
570cb254b75d7d971b3f1baab45a82cedf0bd6c36c4Brian Paul
571cb254b75d7d971b3f1baab45a82cedf0bd6c36c4Brian Paulstatic void
572cb254b75d7d971b3f1baab45a82cedf0bd6c36c4Brian Paulosmesa_UnmapRenderbuffer(struct gl_context *ctx, struct gl_renderbuffer *rb)
573cb254b75d7d971b3f1baab45a82cedf0bd6c36c4Brian Paul{
574cb254b75d7d971b3f1baab45a82cedf0bd6c36c4Brian Paul   if (rb->ClassID == OSMESA_RENDERBUFFER_CLASS) {
575cb254b75d7d971b3f1baab45a82cedf0bd6c36c4Brian Paul      /* no-op */
576cb254b75d7d971b3f1baab45a82cedf0bd6c36c4Brian Paul   }
577cb254b75d7d971b3f1baab45a82cedf0bd6c36c4Brian Paul   else {
578cb254b75d7d971b3f1baab45a82cedf0bd6c36c4Brian Paul      _swrast_unmap_soft_renderbuffer(ctx, rb);
579cb254b75d7d971b3f1baab45a82cedf0bd6c36c4Brian Paul   }
580cb254b75d7d971b3f1baab45a82cedf0bd6c36c4Brian Paul}
581cb254b75d7d971b3f1baab45a82cedf0bd6c36c4Brian Paul
582cb254b75d7d971b3f1baab45a82cedf0bd6c36c4Brian Paul
583afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/**********************************************************************/
5849c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul/*****                    Public Functions                        *****/
585afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/**********************************************************************/
586afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
587afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
588d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul/**
5899c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * Create an Off-Screen Mesa rendering context.  The only attribute needed is
5909c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * an RGBA vs Color-Index mode flag.
5919c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul *
592641705f0329c038079650089a664d76abfc5a937Ian Romanick * Input:  format - Must be GL_RGBA
5939c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul *         sharelist - specifies another OSMesaContext with which to share
5949c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul *                     display lists.  NULL indicates no sharing.
5959c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * Return:  an OSMesaContext or 0 if error
5969c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul */
5979c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian PaulGLAPI OSMesaContext GLAPIENTRY
5989c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian PaulOSMesaCreateContext( GLenum format, OSMesaContext sharelist )
599afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
6009c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   return OSMesaCreateContextExt(format, DEFAULT_SOFTWARE_DEPTH_BITS,
601641705f0329c038079650089a664d76abfc5a937Ian Romanick                                 8, 0, sharelist);
60274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul}
60374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul
60474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul
60574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul
606d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul/**
6079c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * New in Mesa 3.5
6089c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul *
6099c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * Create context and specify size of ancillary buffers.
6109c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul */
6119c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian PaulGLAPI OSMesaContext GLAPIENTRY
6129c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian PaulOSMesaCreateContextExt( GLenum format, GLint depthBits, GLint stencilBits,
6139c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul                        GLint accumBits, OSMesaContext sharelist )
61474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul{
6159c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   OSMesaContext osmesa;
616d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul   struct dd_function_table functions;
6179c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   GLint rind, gind, bind, aind;
618641705f0329c038079650089a664d76abfc5a937Ian Romanick   GLint redBits = 0, greenBits = 0, blueBits = 0, alphaBits =0;
619afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
6209c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   rind = gind = bind = aind = 0;
621641705f0329c038079650089a664d76abfc5a937Ian Romanick   if (format==OSMESA_RGBA) {
6229c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      redBits = CHAN_BITS;
6239c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      greenBits = CHAN_BITS;
6249c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      blueBits = CHAN_BITS;
6259c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      alphaBits = CHAN_BITS;
6269c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      rind = 0;
6279c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      gind = 1;
6289c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      bind = 2;
6299c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      aind = 3;
630afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
6319c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   else if (format==OSMESA_BGRA) {
6329c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      redBits = CHAN_BITS;
6339c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      greenBits = CHAN_BITS;
6349c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      blueBits = CHAN_BITS;
6359c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      alphaBits = CHAN_BITS;
6369c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      bind = 0;
6379c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      gind = 1;
6389c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      rind = 2;
6399c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      aind = 3;
640afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
6419c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   else if (format==OSMESA_ARGB) {
6429c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      redBits = CHAN_BITS;
6439c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      greenBits = CHAN_BITS;
6449c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      blueBits = CHAN_BITS;
6459c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      alphaBits = CHAN_BITS;
6469c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      aind = 0;
6479c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      rind = 1;
6489c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      gind = 2;
6499c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      bind = 3;
650206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul   }
6519c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   else if (format==OSMESA_RGB) {
6529c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      redBits = CHAN_BITS;
6539c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      greenBits = CHAN_BITS;
6549c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      blueBits = CHAN_BITS;
6559c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      alphaBits = 0;
6569c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      rind = 0;
6579c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      gind = 1;
6589c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      bind = 2;
659afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
6609c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   else if (format==OSMESA_BGR) {
6619c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      redBits = CHAN_BITS;
6629c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      greenBits = CHAN_BITS;
6639c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      blueBits = CHAN_BITS;
6649c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      alphaBits = 0;
6659c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      rind = 2;
6669c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      gind = 1;
6679c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      bind = 0;
668afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
669cc9464e082b82179e3c4b51ea460212c10b2bf0cBrian Paul#if CHAN_TYPE == GL_UNSIGNED_BYTE
6709c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   else if (format==OSMESA_RGB_565) {
6719c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      redBits = 5;
6729c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      greenBits = 6;
6739c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      blueBits = 5;
6749c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      alphaBits = 0;
6759c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      rind = 0; /* not used */
6769c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      gind = 0;
6779c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      bind = 0;
678afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
679cc9464e082b82179e3c4b51ea460212c10b2bf0cBrian Paul#endif
680afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   else {
6819c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      return NULL;
682afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
683afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
6849c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   osmesa = (OSMesaContext) CALLOC_STRUCT(osmesa_context);
6859c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   if (osmesa) {
686fcf438e9e03f6e75bca4a49ad372fe7c4b1abbf8Ian Romanick      osmesa->gl_visual = _mesa_create_visual( GL_FALSE,    /* double buffer */
6879c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul                                               GL_FALSE,    /* stereo */
6889c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul                                               redBits,
6899c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul                                               greenBits,
6909c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul                                               blueBits,
6919c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul                                               alphaBits,
6929c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul                                               depthBits,
6939c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul                                               stencilBits,
6949c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul                                               accumBits,
6959c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul                                               accumBits,
6969c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul                                               accumBits,
6979c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul                                               alphaBits ? accumBits : 0,
6989c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul                                               1            /* num samples */
6999c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul                                               );
7009c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      if (!osmesa->gl_visual) {
70132f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg         free(osmesa);
7029c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         return NULL;
703afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
704afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
705d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul      /* Initialize device driver function table */
706d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul      _mesa_init_driver_functions(&functions);
707d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul      /* override with our functions */
708d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul      functions.GetString = get_string;
709d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul      functions.UpdateState = osmesa_update_state;
710544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul      functions.GetBufferSize = NULL;
7116fafc7ad19a8b7400e57a86b588766b6f3811a05Brian Paul
7126fafc7ad19a8b7400e57a86b588766b6f3811a05Brian Paul      if (!_mesa_initialize_context(&osmesa->mesa,
7135e4ca1ccc9029fd75bb7676dc128e33d12da9665Brian Paul                                    API_OPENGL,
7149c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul                                    osmesa->gl_visual,
7156fafc7ad19a8b7400e57a86b588766b6f3811a05Brian Paul                                    sharelist ? &sharelist->mesa
716f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg                                              : (struct gl_context *) NULL,
717d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul                                    &functions, (void *) osmesa)) {
7189c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         _mesa_destroy_visual( osmesa->gl_visual );
71932f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg         free(osmesa);
7209c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         return NULL;
721afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
72274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul
7236fafc7ad19a8b7400e57a86b588766b6f3811a05Brian Paul      _mesa_enable_sw_extensions(&(osmesa->mesa));
7246fafc7ad19a8b7400e57a86b588766b6f3811a05Brian Paul      _mesa_enable_1_3_extensions(&(osmesa->mesa));
7256fafc7ad19a8b7400e57a86b588766b6f3811a05Brian Paul      _mesa_enable_1_4_extensions(&(osmesa->mesa));
72684351999ec6ad07e0cfc31c0b3a8c86da4134bfeBrian Paul      _mesa_enable_1_5_extensions(&(osmesa->mesa));
7275c4ca968fab1b0b993fabeb73e3a5d92cbaadaf1Brian      _mesa_enable_2_0_extensions(&(osmesa->mesa));
7285c4ca968fab1b0b993fabeb73e3a5d92cbaadaf1Brian      _mesa_enable_2_1_extensions(&(osmesa->mesa));
72974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul
730e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      osmesa->gl_buffer = _mesa_create_framebuffer(osmesa->gl_visual);
7319c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      if (!osmesa->gl_buffer) {
7329c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         _mesa_destroy_visual( osmesa->gl_visual );
7336fafc7ad19a8b7400e57a86b588766b6f3811a05Brian Paul         _mesa_free_context_data( &osmesa->mesa );
73432f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg         free(osmesa);
7359c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         return NULL;
7369c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      }
737e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul
73836b3a8bd5a317ab297f44b19fd14c7e76ec2fc77Brian Paul      /* Create depth/stencil/accum buffers.  We'll create the color
73936b3a8bd5a317ab297f44b19fd14c7e76ec2fc77Brian Paul       * buffer later in OSMesaMakeCurrent().
74036b3a8bd5a317ab297f44b19fd14c7e76ec2fc77Brian Paul       */
741d0dc75c000d5af92648c7de901756400672b8447Brian Paul      _swrast_add_soft_renderbuffers(osmesa->gl_buffer,
742d0dc75c000d5af92648c7de901756400672b8447Brian Paul                                     GL_FALSE, /* color */
743d0dc75c000d5af92648c7de901756400672b8447Brian Paul                                     osmesa->gl_visual->haveDepthBuffer,
744d0dc75c000d5af92648c7de901756400672b8447Brian Paul                                     osmesa->gl_visual->haveStencilBuffer,
745d0dc75c000d5af92648c7de901756400672b8447Brian Paul                                     osmesa->gl_visual->haveAccumBuffer,
746d0dc75c000d5af92648c7de901756400672b8447Brian Paul                                     GL_FALSE, /* alpha */
747d0dc75c000d5af92648c7de901756400672b8447Brian Paul                                     GL_FALSE /* aux */ );
748e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul
7499c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      osmesa->format = format;
7509c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      osmesa->userRowLength = 0;
7519c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      osmesa->yup = GL_TRUE;
7529c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      osmesa->rInd = rind;
7539c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      osmesa->gInd = gind;
7549c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      osmesa->bInd = bind;
7559c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      osmesa->aInd = aind;
75674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul
7571741bc1a79b6a243e841bca704f1a720b028124aBrian Paul      _mesa_meta_init(&osmesa->mesa);
7581741bc1a79b6a243e841bca704f1a720b028124aBrian Paul
7599c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      /* Initialize the software rasterizer and helper modules. */
7609c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      {
761f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg	 struct gl_context *ctx = &osmesa->mesa;
762e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul         SWcontext *swrast;
763e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul         TNLcontext *tnl;
764afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
765c45b7364dab6c3daebc1f1d8d11124af4129074aBrian Paul	 if (!_swrast_CreateContext( ctx ) ||
7660a0fb5e0b3cfe61749af41d4200d42982b551cefKeith Whitwell             !_vbo_CreateContext( ctx ) ||
767c45b7364dab6c3daebc1f1d8d11124af4129074aBrian Paul             !_tnl_CreateContext( ctx ) ||
768c45b7364dab6c3daebc1f1d8d11124af4129074aBrian Paul             !_swsetup_CreateContext( ctx )) {
769c45b7364dab6c3daebc1f1d8d11124af4129074aBrian Paul            _mesa_destroy_visual(osmesa->gl_visual);
770c45b7364dab6c3daebc1f1d8d11124af4129074aBrian Paul            _mesa_free_context_data(ctx);
77132f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg            free(osmesa);
772c45b7364dab6c3daebc1f1d8d11124af4129074aBrian Paul            return NULL;
773c45b7364dab6c3daebc1f1d8d11124af4129074aBrian Paul         }
7749c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul
7759c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul	 _swsetup_Wakeup( ctx );
776e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul
777e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul         /* use default TCL pipeline */
778e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul         tnl = TNL_CONTEXT(ctx);
779e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul         tnl->Driver.RunPipeline = _tnl_run_pipeline;
780e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul
781cb254b75d7d971b3f1baab45a82cedf0bd6c36c4Brian Paul         ctx->Driver.MapRenderbuffer = osmesa_MapRenderbuffer;
782cb254b75d7d971b3f1baab45a82cedf0bd6c36c4Brian Paul         ctx->Driver.UnmapRenderbuffer = osmesa_UnmapRenderbuffer;
783cb254b75d7d971b3f1baab45a82cedf0bd6c36c4Brian Paul
7848d38c7229827cf76a29f942725e1d907fd335dc1Brian Paul         ctx->Driver.GenerateMipmap = _mesa_generate_mipmap;
7858d38c7229827cf76a29f942725e1d907fd335dc1Brian Paul
786e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul         /* Extend the software rasterizer with our optimized line and triangle
787e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul          * drawing functions.
788e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul          */
789e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul         swrast = SWRAST_CONTEXT( ctx );
790e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul         swrast->choose_line = osmesa_choose_line;
791e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul         swrast->choose_triangle = osmesa_choose_triangle;
7929c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      }
793afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
7949c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   return osmesa;
795afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
796afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
797afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
798d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul/**
7999c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * Destroy an Off-Screen Mesa rendering context.
8009c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul *
801d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul * \param osmesa  the context to destroy
802afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */
8039c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian PaulGLAPI void GLAPIENTRY
804d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian PaulOSMesaDestroyContext( OSMesaContext osmesa )
805afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
806d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   if (osmesa) {
807797c18be1f907337ebd85b18ce43dfa0b056f492Brian Paul      if (osmesa->srb)
808797c18be1f907337ebd85b18ce43dfa0b056f492Brian Paul         _mesa_reference_renderbuffer((struct gl_renderbuffer **) &osmesa->srb, NULL);
809216eb81c53908c9ac774a378425691aa66205a88Brian
8101741bc1a79b6a243e841bca704f1a720b028124aBrian Paul      _mesa_meta_free( &osmesa->mesa );
8111741bc1a79b6a243e841bca704f1a720b028124aBrian Paul
812d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul      _swsetup_DestroyContext( &osmesa->mesa );
813d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul      _tnl_DestroyContext( &osmesa->mesa );
8140a0fb5e0b3cfe61749af41d4200d42982b551cefKeith Whitwell      _vbo_DestroyContext( &osmesa->mesa );
815d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul      _swrast_DestroyContext( &osmesa->mesa );
816d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul
817d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul      _mesa_destroy_visual( osmesa->gl_visual );
8187eb5a2892d3d89f4b1800311babb40af1ec7d4e5Brian Paul      _mesa_reference_framebuffer( &osmesa->gl_buffer, NULL );
819a510bc3ee1a696da120c09ee4ec33dc033f671acBrian
820d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul      _mesa_free_context_data( &osmesa->mesa );
82132f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg      free( osmesa );
8229c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   }
8239c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul}
824afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
825afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
826d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul/**
8279c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * Bind an OSMesaContext to an image buffer.  The image buffer is just a
8289c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * block of memory which the client provides.  Its size must be at least
8299c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * as large as width*height*sizeof(type).  Its address should be a multiple
8309c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * of 4 if using RGBA mode.
8319c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul *
8329c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * Image data is stored in the order of glDrawPixels:  row-major order
8339c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * with the lower-left image pixel stored in the first array position
8349c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * (ie. bottom-to-top).
8359c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul *
8369c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * If the context's viewport hasn't been initialized yet, it will now be
8379c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * initialized to (0,0,width,height).
8389c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul *
839d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul * Input:  osmesa - the rendering context
8409c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul *         buffer - the image buffer memory
8419c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul *         type - data type for pixel components
8429c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul *            Normally, only GL_UNSIGNED_BYTE and GL_UNSIGNED_SHORT_5_6_5
8439c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul *            are supported.  But if Mesa's been compiled with CHAN_BITS==16
844d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul *            then type may be GL_UNSIGNED_SHORT or GL_UNSIGNED_BYTE.  And if
845d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul *            Mesa's been build with CHAN_BITS==32 then type may be GL_FLOAT,
846d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul *            GL_UNSIGNED_SHORT or GL_UNSIGNED_BYTE.
8479c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul *         width, height - size of image buffer in pixels, at least 1
848d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul * Return:  GL_TRUE if success, GL_FALSE if error because of invalid osmesa,
8499c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul *          invalid buffer address, invalid type, width<1, height<1,
8509c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul *          width>internal limit or height>internal limit.
851afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */
8529c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian PaulGLAPI GLboolean GLAPIENTRY
853d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian PaulOSMesaMakeCurrent( OSMesaContext osmesa, void *buffer, GLenum type,
8549c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul                   GLsizei width, GLsizei height )
855afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
856d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   if (!osmesa || !buffer ||
8579c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul       width < 1 || height < 1 ||
858a3b2c3a4211f72b82d1061a94447cdbc1321ab8eBrian Paul       width > SWRAST_MAX_WIDTH || height > SWRAST_MAX_HEIGHT) {
8599c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      return GL_FALSE;
8609c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   }
86174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul
862d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   if (osmesa->format == OSMESA_RGB_565 && type != GL_UNSIGNED_SHORT_5_6_5) {
863d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul      return GL_FALSE;
864afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
865d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul
866544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul#if 0
867d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   if (!(type == GL_UNSIGNED_BYTE ||
868d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul         (type == GL_UNSIGNED_SHORT && CHAN_BITS >= 16) ||
869d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul         (type == GL_FLOAT && CHAN_BITS == 32))) {
870d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul      /* i.e. is sizeof(type) * 8 > CHAN_BITS? */
8719c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      return GL_FALSE;
8729c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   }
873544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul#endif
87458f4d67703381003c23fecbd3fe114ef9d1730c3Brian Paul
875d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   osmesa_update_state( &osmesa->mesa, 0 );
876c6c0f947142c0cc82626c238804a68b4e8f53945Brian Paul
877c6c0f947142c0cc82626c238804a68b4e8f53945Brian Paul   /* Call this periodically to detect when the user has begun using
878c6c0f947142c0cc82626c238804a68b4e8f53945Brian Paul    * GL rendering from multiple threads.
879c6c0f947142c0cc82626c238804a68b4e8f53945Brian Paul    */
880c6c0f947142c0cc82626c238804a68b4e8f53945Brian Paul   _glapi_check_multithread();
881c6c0f947142c0cc82626c238804a68b4e8f53945Brian Paul
88236b3a8bd5a317ab297f44b19fd14c7e76ec2fc77Brian Paul
88336b3a8bd5a317ab297f44b19fd14c7e76ec2fc77Brian Paul   /* Create a front/left color buffer which wraps the user-provided buffer.
88436b3a8bd5a317ab297f44b19fd14c7e76ec2fc77Brian Paul    * There is no back color buffer.
88536b3a8bd5a317ab297f44b19fd14c7e76ec2fc77Brian Paul    * If the user tries to use a 8, 16 or 32-bit/channel buffer that
88636b3a8bd5a317ab297f44b19fd14c7e76ec2fc77Brian Paul    * doesn't match what Mesa was compiled for (CHAN_BITS) the
88736b3a8bd5a317ab297f44b19fd14c7e76ec2fc77Brian Paul    * _mesa_add_renderbuffer() function will create a "wrapper" renderbuffer
88836b3a8bd5a317ab297f44b19fd14c7e76ec2fc77Brian Paul    * that converts rendering from CHAN_BITS to the user-requested channel
88936b3a8bd5a317ab297f44b19fd14c7e76ec2fc77Brian Paul    * size.
89036b3a8bd5a317ab297f44b19fd14c7e76ec2fc77Brian Paul    */
891797c18be1f907337ebd85b18ce43dfa0b056f492Brian Paul   if (!osmesa->srb) {
892797c18be1f907337ebd85b18ce43dfa0b056f492Brian Paul      osmesa->srb = new_osmesa_renderbuffer(&osmesa->mesa, osmesa->format, type);
8939c2b4814d0b7dc67777099ea249c09bcf9ee46ebBrian Paul      _mesa_remove_renderbuffer(osmesa->gl_buffer, BUFFER_FRONT_LEFT);
894797c18be1f907337ebd85b18ce43dfa0b056f492Brian Paul      _mesa_add_renderbuffer(osmesa->gl_buffer, BUFFER_FRONT_LEFT,
895797c18be1f907337ebd85b18ce43dfa0b056f492Brian Paul                             &osmesa->srb->Base);
896797c18be1f907337ebd85b18ce43dfa0b056f492Brian Paul      assert(osmesa->srb->Base.RefCount == 2);
8979c2b4814d0b7dc67777099ea249c09bcf9ee46ebBrian Paul   }
89836b3a8bd5a317ab297f44b19fd14c7e76ec2fc77Brian Paul
899f9874feef4d8952df5054bd8e8f4e0deda4ef44fBrian Paul   osmesa->DataType = type;
900f9874feef4d8952df5054bd8e8f4e0deda4ef44fBrian Paul
901544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul   /* Set renderbuffer fields.  Set width/height = 0 to force
902544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul    * osmesa_renderbuffer_storage() being called by _mesa_resize_framebuffer()
903544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul    */
904797c18be1f907337ebd85b18ce43dfa0b056f492Brian Paul   osmesa->srb->Buffer = buffer;
905797c18be1f907337ebd85b18ce43dfa0b056f492Brian Paul   osmesa->srb->Base.Width = osmesa->srb->Base.Height = 0;
906544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul
9079cbe0e24ac3772ec5db303e532166351affc91c9Brian Paul   /* Set the framebuffer's size.  This causes the
9089cbe0e24ac3772ec5db303e532166351affc91c9Brian Paul    * osmesa_renderbuffer_storage() function to get called.
9099cbe0e24ac3772ec5db303e532166351affc91c9Brian Paul    */
9109cbe0e24ac3772ec5db303e532166351affc91c9Brian Paul   _mesa_resize_framebuffer(&osmesa->mesa, osmesa->gl_buffer, width, height);
9119cbe0e24ac3772ec5db303e532166351affc91c9Brian Paul   osmesa->gl_buffer->Initialized = GL_TRUE; /* XXX TEMPORARY? */
9129cbe0e24ac3772ec5db303e532166351affc91c9Brian Paul
913d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   _mesa_make_current( &osmesa->mesa, osmesa->gl_buffer, osmesa->gl_buffer );
91458f4d67703381003c23fecbd3fe114ef9d1730c3Brian Paul
91589ffca52ac18103ebaa754241a882ea8438ff9c4Brian Paul   /* Remove renderbuffer attachment, then re-add.  This installs the
916544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul    * renderbuffer adaptor/wrapper if needed (for bpp conversion).
917d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul    */
91889ffca52ac18103ebaa754241a882ea8438ff9c4Brian Paul   _mesa_remove_renderbuffer(osmesa->gl_buffer, BUFFER_FRONT_LEFT);
919797c18be1f907337ebd85b18ce43dfa0b056f492Brian Paul   _mesa_add_renderbuffer(osmesa->gl_buffer, BUFFER_FRONT_LEFT,
920797c18be1f907337ebd85b18ce43dfa0b056f492Brian Paul                          &osmesa->srb->Base);
92174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul
92289ffca52ac18103ebaa754241a882ea8438ff9c4Brian Paul
923d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   /* this updates the visual's red/green/blue/alphaBits fields */
924c8a6a8bf2c8c530edfea737ab0f316ae7b1e42eeBrian Paul   _mesa_update_framebuffer_visual(&osmesa->mesa, osmesa->gl_buffer);
925d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul
926d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   /* update the framebuffer size */
927d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   _mesa_resize_framebuffer(&osmesa->mesa, osmesa->gl_buffer, width, height);
92874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul
9299c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   return GL_TRUE;
930afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
931afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
9321e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell
9331e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell
934c5f9aa7750633e2989a6a139c283419d536ee3f7Brian PaulGLAPI OSMesaContext GLAPIENTRY
935c5f9aa7750633e2989a6a139c283419d536ee3f7Brian PaulOSMesaGetCurrentContext( void )
9369c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul{
937f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg   struct gl_context *ctx = _mesa_get_current_context();
9389c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   if (ctx)
9399c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      return (OSMesaContext) ctx;
9409c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   else
9419c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      return NULL;
9429c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul}
9432d595d70202bad560c27ea81ec71b740415b3355Brian Paul
9441e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell
9451e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell
946c5f9aa7750633e2989a6a139c283419d536ee3f7Brian PaulGLAPI void GLAPIENTRY
947c5f9aa7750633e2989a6a139c283419d536ee3f7Brian PaulOSMesaPixelStore( GLint pname, GLint value )
9481e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell{
9499c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   OSMesaContext osmesa = OSMesaGetCurrentContext();
950dbd1e2b5990a3689bf718296c57c14fc3ba38db5Jouk Jansen
9519c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   switch (pname) {
9529c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      case OSMESA_ROW_LENGTH:
9539c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         if (value<0) {
9546fafc7ad19a8b7400e57a86b588766b6f3811a05Brian Paul            _mesa_error( &osmesa->mesa, GL_INVALID_VALUE,
9559c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul                      "OSMesaPixelStore(value)" );
9569c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul            return;
9579c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         }
9589c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         osmesa->userRowLength = value;
9599c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         break;
9609c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      case OSMESA_Y_UP:
9619c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         osmesa->yup = value ? GL_TRUE : GL_FALSE;
9629c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         break;
9639c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      default:
9646fafc7ad19a8b7400e57a86b588766b6f3811a05Brian Paul         _mesa_error( &osmesa->mesa, GL_INVALID_ENUM, "OSMesaPixelStore(pname)" );
9659c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         return;
9669c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   }
967dbd1e2b5990a3689bf718296c57c14fc3ba38db5Jouk Jansen
9689c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   compute_row_addresses( osmesa );
9691e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell}
970ed30dfa1264ec8875a3162c3c8778bc703bf11d5Brian Paul
971ed30dfa1264ec8875a3162c3c8778bc703bf11d5Brian Paul
972c5f9aa7750633e2989a6a139c283419d536ee3f7Brian PaulGLAPI void GLAPIENTRY
973c5f9aa7750633e2989a6a139c283419d536ee3f7Brian PaulOSMesaGetIntegerv( GLint pname, GLint *value )
974afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
9759c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   OSMesaContext osmesa = OSMesaGetCurrentContext();
9769c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul
9779c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   switch (pname) {
9789c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      case OSMESA_WIDTH:
979544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul         if (osmesa->gl_buffer)
980544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul            *value = osmesa->gl_buffer->Width;
981544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul         else
982544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul            *value = 0;
9839c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         return;
9849c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      case OSMESA_HEIGHT:
985544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul         if (osmesa->gl_buffer)
986544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul            *value = osmesa->gl_buffer->Height;
987544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul         else
988544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul            *value = 0;
9899c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         return;
9909c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      case OSMESA_FORMAT:
9919c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         *value = osmesa->format;
9929c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         return;
9939c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      case OSMESA_TYPE:
994d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul         /* current color buffer's data type */
995797c18be1f907337ebd85b18ce43dfa0b056f492Brian Paul         *value = osmesa->DataType;
9969c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         return;
9979c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      case OSMESA_ROW_LENGTH:
9989c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         *value = osmesa->userRowLength;
9999c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         return;
10009c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      case OSMESA_Y_UP:
10019c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         *value = osmesa->yup;
10029c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         return;
10039c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      case OSMESA_MAX_WIDTH:
1004a3b2c3a4211f72b82d1061a94447cdbc1321ab8eBrian Paul         *value = SWRAST_MAX_WIDTH;
10059c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         return;
10069c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      case OSMESA_MAX_HEIGHT:
1007a3b2c3a4211f72b82d1061a94447cdbc1321ab8eBrian Paul         *value = SWRAST_MAX_HEIGHT;
10089c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         return;
1009afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      default:
10106fafc7ad19a8b7400e57a86b588766b6f3811a05Brian Paul         _mesa_error(&osmesa->mesa, GL_INVALID_ENUM, "OSMesaGetIntergerv(pname)");
10119c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         return;
1012afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
1013afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
1014afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1015d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul
1016d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul/**
10179c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * Return the depth buffer associated with an OSMesa context.
10189c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * Input:  c - the OSMesa context
10199c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * Output:  width, height - size of buffer in pixels
10209c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul *          bytesPerValue - bytes per depth value (2 or 4)
10219c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul *          buffer - pointer to depth buffer values
10229c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * Return:  GL_TRUE or GL_FALSE to indicate success or failure.
10239c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul */
10249c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian PaulGLAPI GLboolean GLAPIENTRY
10259c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian PaulOSMesaGetDepthBuffer( OSMesaContext c, GLint *width, GLint *height,
10269c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul                      GLint *bytesPerValue, void **buffer )
1027afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
1028797c18be1f907337ebd85b18ce43dfa0b056f492Brian Paul   struct swrast_renderbuffer *srb = NULL;
1029e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul
1030e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   if (c->gl_buffer)
1031797c18be1f907337ebd85b18ce43dfa0b056f492Brian Paul      srb = swrast_renderbuffer(c->gl_buffer->
1032797c18be1f907337ebd85b18ce43dfa0b056f492Brian Paul                                Attachment[BUFFER_DEPTH].Renderbuffer);
1033e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul
1034797c18be1f907337ebd85b18ce43dfa0b056f492Brian Paul   if (!srb || !srb->Buffer) {
10359c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      *width = 0;
10369c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      *height = 0;
10379c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      *bytesPerValue = 0;
10389c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      *buffer = 0;
10399c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      return GL_FALSE;
104074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   }
10419c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   else {
1042797c18be1f907337ebd85b18ce43dfa0b056f492Brian Paul      *width = srb->Base.Width;
1043797c18be1f907337ebd85b18ce43dfa0b056f492Brian Paul      *height = srb->Base.Height;
10449c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      if (c->gl_visual->depthBits <= 16)
10459c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         *bytesPerValue = sizeof(GLushort);
10469c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      else
10479c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul         *bytesPerValue = sizeof(GLuint);
1048797c18be1f907337ebd85b18ce43dfa0b056f492Brian Paul      *buffer = (void *) srb->Buffer;
10499c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      return GL_TRUE;
1050afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
10519c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul}
10529c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul
1053d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul
1054d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul/**
10559c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * Return the color buffer associated with an OSMesa context.
10569c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * Input:  c - the OSMesa context
10579c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * Output:  width, height - size of buffer in pixels
10589c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul *          format - the pixel format (OSMESA_FORMAT)
10599c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul *          buffer - pointer to color buffer values
10609c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * Return:  GL_TRUE or GL_FALSE to indicate success or failure.
10619c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul */
10629c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian PaulGLAPI GLboolean GLAPIENTRY
1063d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian PaulOSMesaGetColorBuffer( OSMesaContext osmesa, GLint *width,
10649c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul                      GLint *height, GLint *format, void **buffer )
10659c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul{
1066797c18be1f907337ebd85b18ce43dfa0b056f492Brian Paul   if (osmesa->srb && osmesa->srb->Buffer) {
1067797c18be1f907337ebd85b18ce43dfa0b056f492Brian Paul      *width = osmesa->srb->Base.Width;
1068797c18be1f907337ebd85b18ce43dfa0b056f492Brian Paul      *height = osmesa->srb->Base.Height;
1069d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul      *format = osmesa->format;
1070797c18be1f907337ebd85b18ce43dfa0b056f492Brian Paul      *buffer = (void *) osmesa->srb->Buffer;
1071d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul      return GL_TRUE;
1072d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   }
1073d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul   else {
10749c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      *width = 0;
10759c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      *height = 0;
10769c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      *format = 0;
10779c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      *buffer = 0;
10789c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul      return GL_FALSE;
1079206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul   }
10809c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul}
1081afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1082709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell
1083c5f9aa7750633e2989a6a139c283419d536ee3f7Brian Paulstruct name_function
1084c5f9aa7750633e2989a6a139c283419d536ee3f7Brian Paul{
10859c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   const char *Name;
10864d880987d248ff078845027cc21ba437564ac07dBrian Paul   OSMESAproc Function;
10879c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul};
10889c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul
1089c5f9aa7750633e2989a6a139c283419d536ee3f7Brian Paulstatic struct name_function functions[] = {
10904d880987d248ff078845027cc21ba437564ac07dBrian Paul   { "OSMesaCreateContext", (OSMESAproc) OSMesaCreateContext },
10914d880987d248ff078845027cc21ba437564ac07dBrian Paul   { "OSMesaCreateContextExt", (OSMESAproc) OSMesaCreateContextExt },
10924d880987d248ff078845027cc21ba437564ac07dBrian Paul   { "OSMesaDestroyContext", (OSMESAproc) OSMesaDestroyContext },
10934d880987d248ff078845027cc21ba437564ac07dBrian Paul   { "OSMesaMakeCurrent", (OSMESAproc) OSMesaMakeCurrent },
10944d880987d248ff078845027cc21ba437564ac07dBrian Paul   { "OSMesaGetCurrentContext", (OSMESAproc) OSMesaGetCurrentContext },
10954d880987d248ff078845027cc21ba437564ac07dBrian Paul   { "OSMesaPixelsStore", (OSMESAproc) OSMesaPixelStore },
10964d880987d248ff078845027cc21ba437564ac07dBrian Paul   { "OSMesaGetIntegerv", (OSMESAproc) OSMesaGetIntegerv },
10974d880987d248ff078845027cc21ba437564ac07dBrian Paul   { "OSMesaGetDepthBuffer", (OSMESAproc) OSMesaGetDepthBuffer },
10984d880987d248ff078845027cc21ba437564ac07dBrian Paul   { "OSMesaGetColorBuffer", (OSMESAproc) OSMesaGetColorBuffer },
10994d880987d248ff078845027cc21ba437564ac07dBrian Paul   { "OSMesaGetProcAddress", (OSMESAproc) OSMesaGetProcAddress },
1100ad766b5785c728e988e25509604c08fc347aba23Alan Hourihane   { "OSMesaColorClamp", (OSMESAproc) OSMesaColorClamp },
11019c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   { NULL, NULL }
11029c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul};
11039c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul
11044d880987d248ff078845027cc21ba437564ac07dBrian Paul
11054d880987d248ff078845027cc21ba437564ac07dBrian PaulGLAPI OSMESAproc GLAPIENTRY
11069c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian PaulOSMesaGetProcAddress( const char *funcName )
11079c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul{
11089c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   int i;
11099c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   for (i = 0; functions[i].Name; i++) {
11108d73aa6d1ae6e89bb2cd8f52f5586d569a4b6eebKenneth Graunke      if (strcmp(functions[i].Name, funcName) == 0)
11114d880987d248ff078845027cc21ba437564ac07dBrian Paul         return functions[i].Function;
11129c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul   }
11134d880987d248ff078845027cc21ba437564ac07dBrian Paul   return _glapi_get_proc_address(funcName);
1114afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
1115ba3da6154c324cc916845bc5de3de077d0b59ffcBrian Paul
1116ba3da6154c324cc916845bc5de3de077d0b59ffcBrian Paul
1117ba3da6154c324cc916845bc5de3de077d0b59ffcBrian PaulGLAPI void GLAPIENTRY
1118ba3da6154c324cc916845bc5de3de077d0b59ffcBrian PaulOSMesaColorClamp(GLboolean enable)
1119ba3da6154c324cc916845bc5de3de077d0b59ffcBrian Paul{
1120ba3da6154c324cc916845bc5de3de077d0b59ffcBrian Paul   OSMesaContext osmesa = OSMesaGetCurrentContext();
1121ba3da6154c324cc916845bc5de3de077d0b59ffcBrian Paul
1122ba3da6154c324cc916845bc5de3de077d0b59ffcBrian Paul   if (enable == GL_TRUE) {
1123ba3da6154c324cc916845bc5de3de077d0b59ffcBrian Paul      osmesa->mesa.Color.ClampFragmentColor = GL_TRUE;
1124ba3da6154c324cc916845bc5de3de077d0b59ffcBrian Paul   }
1125ba3da6154c324cc916845bc5de3de077d0b59ffcBrian Paul   else {
1126ba3da6154c324cc916845bc5de3de077d0b59ffcBrian Paul      osmesa->mesa.Color.ClampFragmentColor = GL_FIXED_ONLY_ARB;
1127ba3da6154c324cc916845bc5de3de077d0b59ffcBrian Paul   }
1128ba3da6154c324cc916845bc5de3de077d0b59ffcBrian Paul}
1129ba3da6154c324cc916845bc5de3de077d0b59ffcBrian Paul
1130ba3da6154c324cc916845bc5de3de077d0b59ffcBrian Paul
11310e8d045bf8bc930576cc69b9de8a31a4c973dc7cJeremy Huddleston/**
11320e8d045bf8bc930576cc69b9de8a31a4c973dc7cJeremy Huddleston * When GLX_INDIRECT_RENDERING is defined, some symbols are missing in
11330e8d045bf8bc930576cc69b9de8a31a4c973dc7cJeremy Huddleston * libglapi.a.  We need to define them here.
11340e8d045bf8bc930576cc69b9de8a31a4c973dc7cJeremy Huddleston */
11350e8d045bf8bc930576cc69b9de8a31a4c973dc7cJeremy Huddleston#ifdef GLX_INDIRECT_RENDERING
11360e8d045bf8bc930576cc69b9de8a31a4c973dc7cJeremy Huddleston
11370e8d045bf8bc930576cc69b9de8a31a4c973dc7cJeremy Huddleston#define GL_GLEXT_PROTOTYPES
11380e8d045bf8bc930576cc69b9de8a31a4c973dc7cJeremy Huddleston#include "GL/gl.h"
11390e8d045bf8bc930576cc69b9de8a31a4c973dc7cJeremy Huddleston#include "glapi/glapi.h"
11400e8d045bf8bc930576cc69b9de8a31a4c973dc7cJeremy Huddleston#include "glapi/glapitable.h"
11410e8d045bf8bc930576cc69b9de8a31a4c973dc7cJeremy Huddleston
11420e8d045bf8bc930576cc69b9de8a31a4c973dc7cJeremy Huddleston#if defined(USE_MGL_NAMESPACE)
11430e8d045bf8bc930576cc69b9de8a31a4c973dc7cJeremy Huddleston#define NAME(func)  mgl##func
11440e8d045bf8bc930576cc69b9de8a31a4c973dc7cJeremy Huddleston#else
11450e8d045bf8bc930576cc69b9de8a31a4c973dc7cJeremy Huddleston#define NAME(func)  gl##func
11460e8d045bf8bc930576cc69b9de8a31a4c973dc7cJeremy Huddleston#endif
11470e8d045bf8bc930576cc69b9de8a31a4c973dc7cJeremy Huddleston
11480e8d045bf8bc930576cc69b9de8a31a4c973dc7cJeremy Huddleston#define DISPATCH(FUNC, ARGS, MESSAGE)		\
11490e8d045bf8bc930576cc69b9de8a31a4c973dc7cJeremy Huddleston   GET_DISPATCH()->FUNC ARGS
11500e8d045bf8bc930576cc69b9de8a31a4c973dc7cJeremy Huddleston
11510e8d045bf8bc930576cc69b9de8a31a4c973dc7cJeremy Huddleston#define RETURN_DISPATCH(FUNC, ARGS, MESSAGE) 	\
11520e8d045bf8bc930576cc69b9de8a31a4c973dc7cJeremy Huddleston   return GET_DISPATCH()->FUNC ARGS
11530e8d045bf8bc930576cc69b9de8a31a4c973dc7cJeremy Huddleston
11540e8d045bf8bc930576cc69b9de8a31a4c973dc7cJeremy Huddleston/* skip normal ones */
11550e8d045bf8bc930576cc69b9de8a31a4c973dc7cJeremy Huddleston#define _GLAPI_SKIP_NORMAL_ENTRY_POINTS
11560e8d045bf8bc930576cc69b9de8a31a4c973dc7cJeremy Huddleston#include "glapi/glapitemp.h"
11570e8d045bf8bc930576cc69b9de8a31a4c973dc7cJeremy Huddleston
11580e8d045bf8bc930576cc69b9de8a31a4c973dc7cJeremy Huddleston#endif /* GLX_INDIRECT_RENDERING */
1159