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