osmesa.c revision ad766b5785c728e988e25509604c08fc347aba23
1afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/* 2afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Mesa 3-D graphics library 3d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul * Version: 6.5.1 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" 419a33a11d714c90162d32781ebbd2c1dfab52cfd1Brian Paul#include "imports.h" 42dbd1e2b5990a3689bf718296c57c14fc3ba38db5Jouk Jansen#include "mtypes.h" 43e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul#include "renderbuffer.h" 441e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell#include "swrast/swrast.h" 451e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell#include "swrast_setup/swrast_setup.h" 461e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell#include "swrast/s_context.h" 471e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell#include "swrast/s_lines.h" 481e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell#include "swrast/s_triangle.h" 495a9026c65d260dc185e072163999f5d810015108Brian Paul#include "tnl/tnl.h" 50709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell#include "tnl/t_context.h" 51bc69de5f21ebb4d6e1c65bf5652d17a9fc87dda7Keith Whitwell#include "tnl/t_pipeline.h" 52d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul#include "drivers/common/driverfuncs.h" 5348f5deab94be832a782a440f55a7bc742d50a62fKeith Whitwell#include "vbo/vbo.h" 54afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 55724abeb058ca9372c5a9b9e38ee43dde1accaa41Keith Whitwell 56724abeb058ca9372c5a9b9e38ee43dde1accaa41Keith Whitwell 57d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul/** 58d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul * OSMesa rendering context, derived from core Mesa GLcontext. 59304357dcd496f7ebf499fd9c77b4eba83a75abd5Brian Paul */ 60d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paulstruct osmesa_context 61d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul{ 62d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul GLcontext mesa; /*< Base class - this must be first */ 63d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul GLvisual *gl_visual; /*< Describes the buffers */ 64d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul struct gl_renderbuffer *rb; /*< The user's colorbuffer */ 65d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul GLframebuffer *gl_buffer; /*< The framebuffer, containing user's rb */ 66d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul GLenum format; /*< User-specified context format */ 67d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul GLint userRowLength; /*< user-specified number of pixels per row */ 68d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul GLint rInd, gInd, bInd, aInd;/*< index offsets for RGBA formats */ 69d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul GLvoid *rowaddr[MAX_HEIGHT]; /*< address of first pixel in each image row */ 70d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul GLboolean yup; /*< TRUE -> Y increases upward */ 71d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul /*< FALSE -> Y increases downward */ 72afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}; 73afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 74afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 75d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paulstatic INLINE OSMesaContext 76d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian PaulOSMESA_CONTEXT(GLcontext *ctx) 77d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul{ 78d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul /* Just cast, since we're using structure containment */ 79d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul return (OSMesaContext) ctx; 80d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul} 81c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul 82c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul 83afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/**********************************************************************/ 849c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul/*** Private Device Driver Functions ***/ 85afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/**********************************************************************/ 86afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 87afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 889c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paulstatic const GLubyte * 899c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paulget_string( GLcontext *ctx, GLenum name ) 90afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 919c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul (void) ctx; 929c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul switch (name) { 939c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul case GL_RENDERER: 949c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#if CHAN_BITS == 32 959c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul return (const GLubyte *) "Mesa OffScreen32"; 969c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#elif CHAN_BITS == 16 979c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul return (const GLubyte *) "Mesa OffScreen16"; 989c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#else 999c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul return (const GLubyte *) "Mesa OffScreen"; 1009c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#endif 1019c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul default: 1029c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul return NULL; 1039c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul } 1042bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul} 1052bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul 1062bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul 1079c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paulstatic void 1089c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paulosmesa_update_state( GLcontext *ctx, GLuint new_state ) 1099c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul{ 1109c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul /* easy - just propogate */ 1119c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul _swrast_InvalidateState( ctx, new_state ); 1129c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul _swsetup_InvalidateState( ctx, new_state ); 1139c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul _tnl_InvalidateState( ctx, new_state ); 11448f5deab94be832a782a440f55a7bc742d50a62fKeith Whitwell _vbo_InvalidateState( ctx, new_state ); 1159c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul} 1169c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul 1172bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul 1189c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul 1199c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul/**********************************************************************/ 1209c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul/***** Read/write spans/arrays of pixels *****/ 1219c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul/**********************************************************************/ 1225a9026c65d260dc185e072163999f5d810015108Brian Paul 123d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul/* 8-bit RGBA */ 124d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define NAME(PREFIX) PREFIX##_RGBA8 125d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define RB_TYPE GLubyte 1269c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define SPAN_VARS \ 1279c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul const OSMesaContext osmesa = OSMESA_CONTEXT(ctx); 1289c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define INIT_PIXEL_PTR(P, X, Y) \ 129d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul GLubyte *P = (GLubyte *) osmesa->rowaddr[Y] + 4 * (X) 1309c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define INC_PIXEL_PTR(P) P += 4 131e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul#define STORE_PIXEL(DST, X, Y, VALUE) \ 132d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul DST[0] = VALUE[RCOMP]; \ 133d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul DST[1] = VALUE[GCOMP]; \ 134d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul DST[2] = VALUE[BCOMP]; \ 135d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul DST[3] = VALUE[ACOMP] 136286c4cc201390e868c4f9b5ebe14c40db2d74a5dBrian Paul#define STORE_PIXEL_RGB(DST, X, Y, VALUE) \ 137d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul DST[0] = VALUE[RCOMP]; \ 138d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul DST[1] = VALUE[GCOMP]; \ 139d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul DST[2] = VALUE[BCOMP]; \ 140d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul DST[3] = 255 141d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define FETCH_PIXEL(DST, SRC) \ 142d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul DST[RCOMP] = SRC[0]; \ 143d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul DST[GCOMP] = SRC[1]; \ 144d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul DST[BCOMP] = SRC[2]; \ 145d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul DST[ACOMP] = SRC[3] 146d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#include "swrast/s_spantemp.h" 147d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul 148d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul/* 16-bit RGBA */ 149d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define NAME(PREFIX) PREFIX##_RGBA16 150d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define RB_TYPE GLushort 151d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define SPAN_VARS \ 152d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul const OSMesaContext osmesa = OSMESA_CONTEXT(ctx); 153d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define INIT_PIXEL_PTR(P, X, Y) \ 154d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul GLushort *P = (GLushort *) osmesa->rowaddr[Y] + 4 * (X) 155d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define INC_PIXEL_PTR(P) P += 4 156e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul#define STORE_PIXEL(DST, X, Y, VALUE) \ 157e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul DST[0] = VALUE[RCOMP]; \ 158e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul DST[1] = VALUE[GCOMP]; \ 159e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul DST[2] = VALUE[BCOMP]; \ 160e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul DST[3] = VALUE[ACOMP] 161286c4cc201390e868c4f9b5ebe14c40db2d74a5dBrian Paul#define STORE_PIXEL_RGB(DST, X, Y, VALUE) \ 162286c4cc201390e868c4f9b5ebe14c40db2d74a5dBrian Paul DST[0] = VALUE[RCOMP]; \ 163286c4cc201390e868c4f9b5ebe14c40db2d74a5dBrian Paul DST[1] = VALUE[GCOMP]; \ 164286c4cc201390e868c4f9b5ebe14c40db2d74a5dBrian Paul DST[2] = VALUE[BCOMP]; \ 165d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul DST[3] = 65535 166d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define FETCH_PIXEL(DST, SRC) \ 167d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul DST[RCOMP] = SRC[0]; \ 168d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul DST[GCOMP] = SRC[1]; \ 169d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul DST[BCOMP] = SRC[2]; \ 170d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul DST[ACOMP] = SRC[3] 171d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#include "swrast/s_spantemp.h" 172d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul 173d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul/* 32-bit RGBA */ 174d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define NAME(PREFIX) PREFIX##_RGBA32 175d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define RB_TYPE GLfloat 176d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define SPAN_VARS \ 177d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul const OSMesaContext osmesa = OSMESA_CONTEXT(ctx); 178d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define INIT_PIXEL_PTR(P, X, Y) \ 179d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul GLfloat *P = (GLfloat *) osmesa->rowaddr[Y] + 4 * (X) 180d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define INC_PIXEL_PTR(P) P += 4 181d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define STORE_PIXEL(DST, X, Y, VALUE) \ 182d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul DST[0] = MAX2((VALUE[RCOMP]), 0.0F); \ 183d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul DST[1] = MAX2((VALUE[GCOMP]), 0.0F); \ 184d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul DST[2] = MAX2((VALUE[BCOMP]), 0.0F); \ 185d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul DST[3] = CLAMP((VALUE[ACOMP]), 0.0F, 1.0F) 186d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define STORE_PIXEL_RGB(DST, X, Y, VALUE) \ 187d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul DST[0] = MAX2((VALUE[RCOMP]), 0.0F); \ 188d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul DST[1] = MAX2((VALUE[GCOMP]), 0.0F); \ 189d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul DST[2] = MAX2((VALUE[BCOMP]), 0.0F); \ 190d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul DST[3] = 1.0F 191e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul#define FETCH_PIXEL(DST, SRC) \ 192e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul DST[RCOMP] = SRC[0]; \ 193e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul DST[GCOMP] = SRC[1]; \ 194e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul DST[BCOMP] = SRC[2]; \ 19522652f952fbd3968f3d5a3db7898911508d76145Brian Paul DST[ACOMP] = SRC[3] 196eae0439ae6027ba64fba49fe13360d105700905fBrian Paul#include "swrast/s_spantemp.h" 1974c44d63f01a01f134d7e4456d4209edee97f9ef5Brian Paul 198d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul 199d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul/* 8-bit BGRA */ 200d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define NAME(PREFIX) PREFIX##_BGRA8 201d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define RB_TYPE GLubyte 202d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define SPAN_VARS \ 203d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul const OSMesaContext osmesa = OSMESA_CONTEXT(ctx); 204d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define INIT_PIXEL_PTR(P, X, Y) \ 205d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul GLubyte *P = (GLubyte *) osmesa->rowaddr[Y] + 4 * (X) 206d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define INC_PIXEL_PTR(P) P += 4 207d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define STORE_PIXEL(DST, X, Y, VALUE) \ 208d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul DST[2] = VALUE[RCOMP]; \ 209d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul DST[1] = VALUE[GCOMP]; \ 210d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul DST[0] = VALUE[BCOMP]; \ 211d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul DST[3] = VALUE[ACOMP] 212d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define STORE_PIXEL_RGB(DST, X, Y, VALUE) \ 213d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul DST[2] = VALUE[RCOMP]; \ 214d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul DST[1] = VALUE[GCOMP]; \ 215d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul DST[0] = VALUE[BCOMP]; \ 216d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul DST[3] = 255 217d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define FETCH_PIXEL(DST, SRC) \ 218d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul DST[RCOMP] = SRC[2]; \ 219d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul DST[GCOMP] = SRC[1]; \ 220d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul DST[BCOMP] = SRC[0]; \ 221d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul DST[ACOMP] = SRC[3] 222d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#include "swrast/s_spantemp.h" 223d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul 224d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul/* 16-bit BGRA */ 225d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define NAME(PREFIX) PREFIX##_BGRA16 226d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define RB_TYPE GLushort 2279c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define SPAN_VARS \ 2289c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul const OSMesaContext osmesa = OSMESA_CONTEXT(ctx); 2299c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define INIT_PIXEL_PTR(P, X, Y) \ 230d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul GLushort *P = (GLushort *) osmesa->rowaddr[Y] + 4 * (X) 2319c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define INC_PIXEL_PTR(P) P += 4 232e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul#define STORE_PIXEL(DST, X, Y, VALUE) \ 233e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul DST[2] = VALUE[RCOMP]; \ 234e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul DST[1] = VALUE[GCOMP]; \ 235e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul DST[0] = VALUE[BCOMP]; \ 236e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul DST[3] = VALUE[ACOMP] 237286c4cc201390e868c4f9b5ebe14c40db2d74a5dBrian Paul#define STORE_PIXEL_RGB(DST, X, Y, VALUE) \ 238286c4cc201390e868c4f9b5ebe14c40db2d74a5dBrian Paul DST[2] = VALUE[RCOMP]; \ 239286c4cc201390e868c4f9b5ebe14c40db2d74a5dBrian Paul DST[1] = VALUE[GCOMP]; \ 240286c4cc201390e868c4f9b5ebe14c40db2d74a5dBrian Paul DST[0] = VALUE[BCOMP]; \ 241d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul DST[3] = 65535 242e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul#define FETCH_PIXEL(DST, SRC) \ 243e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul DST[RCOMP] = SRC[2]; \ 244e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul DST[GCOMP] = SRC[1]; \ 245e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul DST[BCOMP] = SRC[0]; \ 24622652f952fbd3968f3d5a3db7898911508d76145Brian Paul DST[ACOMP] = SRC[3] 247eae0439ae6027ba64fba49fe13360d105700905fBrian Paul#include "swrast/s_spantemp.h" 2489c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul 249d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul/* 32-bit BGRA */ 250d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define NAME(PREFIX) PREFIX##_BGRA32 251d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define RB_TYPE GLfloat 2529c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define SPAN_VARS \ 2539c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul const OSMesaContext osmesa = OSMESA_CONTEXT(ctx); 2549c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define INIT_PIXEL_PTR(P, X, Y) \ 255d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul GLfloat *P = (GLfloat *) osmesa->rowaddr[Y] + 4 * (X) 256d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define INC_PIXEL_PTR(P) P += 4 257d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define STORE_PIXEL(DST, X, Y, VALUE) \ 258d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul DST[2] = VALUE[RCOMP]; \ 259d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul DST[1] = VALUE[GCOMP]; \ 260d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul DST[0] = VALUE[BCOMP]; \ 261d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul DST[3] = VALUE[ACOMP] 262d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define STORE_PIXEL_RGB(DST, X, Y, VALUE) \ 263d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul DST[2] = VALUE[RCOMP]; \ 264d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul DST[1] = VALUE[GCOMP]; \ 265d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul DST[0] = VALUE[BCOMP]; \ 266d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul DST[3] = 1.0F 267d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define FETCH_PIXEL(DST, SRC) \ 268d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul DST[RCOMP] = SRC[2]; \ 269d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul DST[GCOMP] = SRC[1]; \ 270d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul DST[BCOMP] = SRC[0]; \ 271d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul DST[ACOMP] = SRC[3] 272d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#include "swrast/s_spantemp.h" 273d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul 274d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul 275d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul/* 8-bit ARGB */ 276d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define NAME(PREFIX) PREFIX##_ARGB8 277d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define RB_TYPE GLubyte 278d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define SPAN_VARS \ 279d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul const OSMesaContext osmesa = OSMESA_CONTEXT(ctx); 280d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define INIT_PIXEL_PTR(P, X, Y) \ 281d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul GLubyte *P = (GLubyte *) osmesa->rowaddr[Y] + 4 * (X) 282d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define INC_PIXEL_PTR(P) P += 4 283d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define STORE_PIXEL(DST, X, Y, VALUE) \ 284d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul DST[1] = VALUE[RCOMP]; \ 285d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul DST[2] = VALUE[GCOMP]; \ 286d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul DST[3] = VALUE[BCOMP]; \ 287d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul DST[0] = VALUE[ACOMP] 288d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define STORE_PIXEL_RGB(DST, X, Y, VALUE) \ 289d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul DST[1] = VALUE[RCOMP]; \ 290d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul DST[2] = VALUE[GCOMP]; \ 291d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul DST[3] = VALUE[BCOMP]; \ 292d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul DST[0] = 255 293d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define FETCH_PIXEL(DST, SRC) \ 294d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul DST[RCOMP] = SRC[1]; \ 295d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul DST[GCOMP] = SRC[2]; \ 296d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul DST[BCOMP] = SRC[3]; \ 297d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul DST[ACOMP] = SRC[0] 298d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#include "swrast/s_spantemp.h" 299d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul 300d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul/* 16-bit ARGB */ 301d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define NAME(PREFIX) PREFIX##_ARGB16 302d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define RB_TYPE GLushort 303d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define SPAN_VARS \ 304d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul const OSMesaContext osmesa = OSMESA_CONTEXT(ctx); 305d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define INIT_PIXEL_PTR(P, X, Y) \ 306d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul GLushort *P = (GLushort *) osmesa->rowaddr[Y] + 4 * (X) 3079c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define INC_PIXEL_PTR(P) P += 4 308e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul#define STORE_PIXEL(DST, X, Y, VALUE) \ 309e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul DST[1] = VALUE[RCOMP]; \ 310e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul DST[2] = VALUE[GCOMP]; \ 311e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul DST[3] = VALUE[BCOMP]; \ 312e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul DST[0] = VALUE[ACOMP] 313286c4cc201390e868c4f9b5ebe14c40db2d74a5dBrian Paul#define STORE_PIXEL_RGB(DST, X, Y, VALUE) \ 314286c4cc201390e868c4f9b5ebe14c40db2d74a5dBrian Paul DST[1] = VALUE[RCOMP]; \ 315286c4cc201390e868c4f9b5ebe14c40db2d74a5dBrian Paul DST[2] = VALUE[GCOMP]; \ 316286c4cc201390e868c4f9b5ebe14c40db2d74a5dBrian Paul DST[3] = VALUE[BCOMP]; \ 317d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul DST[0] = 65535 318e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul#define FETCH_PIXEL(DST, SRC) \ 319e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul DST[RCOMP] = SRC[1]; \ 320e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul DST[GCOMP] = SRC[2]; \ 321e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul DST[BCOMP] = SRC[3]; \ 32222652f952fbd3968f3d5a3db7898911508d76145Brian Paul DST[ACOMP] = SRC[0] 323eae0439ae6027ba64fba49fe13360d105700905fBrian Paul#include "swrast/s_spantemp.h" 3249c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul 325d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul/* 32-bit ARGB */ 326d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define NAME(PREFIX) PREFIX##_ARGB32 327d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define RB_TYPE GLfloat 3289c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define SPAN_VARS \ 3299c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul const OSMesaContext osmesa = OSMESA_CONTEXT(ctx); 3309c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define INIT_PIXEL_PTR(P, X, Y) \ 331d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul GLfloat *P = (GLfloat *) osmesa->rowaddr[Y] + 4 * (X) 332d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define INC_PIXEL_PTR(P) P += 4 333d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define STORE_PIXEL(DST, X, Y, VALUE) \ 334d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul DST[1] = VALUE[RCOMP]; \ 335d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul DST[2] = VALUE[GCOMP]; \ 336d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul DST[3] = VALUE[BCOMP]; \ 337d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul DST[0] = VALUE[ACOMP] 338d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define STORE_PIXEL_RGB(DST, X, Y, VALUE) \ 339d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul DST[1] = VALUE[RCOMP]; \ 340d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul DST[2] = VALUE[GCOMP]; \ 341d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul DST[3] = VALUE[BCOMP]; \ 342d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul DST[0] = 1.0F 343d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define FETCH_PIXEL(DST, SRC) \ 344d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul DST[RCOMP] = SRC[1]; \ 345d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul DST[GCOMP] = SRC[2]; \ 346d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul DST[BCOMP] = SRC[3]; \ 347d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul DST[ACOMP] = SRC[0] 348d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#include "swrast/s_spantemp.h" 349d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul 350d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul 351d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul/* 8-bit RGB */ 352d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define NAME(PREFIX) PREFIX##_RGB8 353d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define RB_TYPE GLubyte 354d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define SPAN_VARS \ 355d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul const OSMesaContext osmesa = OSMESA_CONTEXT(ctx); 356d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define INIT_PIXEL_PTR(P, X, Y) \ 357d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul GLubyte *P = (GLubyte *) osmesa->rowaddr[Y] + 3 * (X) 3583340a9ea9ea31e6bd7f37d5c1f25ffcc97f20a6bBrian Paul#define INC_PIXEL_PTR(P) P += 3 359e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul#define STORE_PIXEL(DST, X, Y, VALUE) \ 360e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul DST[0] = VALUE[RCOMP]; \ 361e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul DST[1] = VALUE[GCOMP]; \ 362e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul DST[2] = VALUE[BCOMP] 363e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul#define FETCH_PIXEL(DST, SRC) \ 364e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul DST[RCOMP] = SRC[0]; \ 365e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul DST[GCOMP] = SRC[1]; \ 366e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul DST[BCOMP] = SRC[2]; \ 367d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul DST[ACOMP] = 255 368eae0439ae6027ba64fba49fe13360d105700905fBrian Paul#include "swrast/s_spantemp.h" 3699c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul 370d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul/* 16-bit RGB */ 371d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define NAME(PREFIX) PREFIX##_RGB16 372d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define RB_TYPE GLushort 373d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define SPAN_VARS \ 374d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul const OSMesaContext osmesa = OSMESA_CONTEXT(ctx); 375d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define INIT_PIXEL_PTR(P, X, Y) \ 376d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul GLushort *P = (GLushort *) osmesa->rowaddr[Y] + 3 * (X) 377d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define INC_PIXEL_PTR(P) P += 3 378d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define STORE_PIXEL(DST, X, Y, VALUE) \ 379d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul DST[0] = VALUE[RCOMP]; \ 380d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul DST[1] = VALUE[GCOMP]; \ 381d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul DST[2] = VALUE[BCOMP] 382d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define FETCH_PIXEL(DST, SRC) \ 383d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul DST[RCOMP] = SRC[0]; \ 384d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul DST[GCOMP] = SRC[1]; \ 385d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul DST[BCOMP] = SRC[2]; \ 386d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul DST[ACOMP] = 65535U 387d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#include "swrast/s_spantemp.h" 388d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul 389d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul/* 32-bit RGB */ 390d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define NAME(PREFIX) PREFIX##_RGB32 391d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define RB_TYPE GLfloat 392d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define SPAN_VARS \ 393d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul const OSMesaContext osmesa = OSMESA_CONTEXT(ctx); 394d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define INIT_PIXEL_PTR(P, X, Y) \ 395d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul GLfloat *P = (GLfloat *) osmesa->rowaddr[Y] + 3 * (X) 396d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define INC_PIXEL_PTR(P) P += 3 397d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define STORE_PIXEL(DST, X, Y, VALUE) \ 398d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul DST[0] = VALUE[RCOMP]; \ 399d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul DST[1] = VALUE[GCOMP]; \ 400d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul DST[2] = VALUE[BCOMP] 401d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define FETCH_PIXEL(DST, SRC) \ 402d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul DST[RCOMP] = SRC[0]; \ 403d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul DST[GCOMP] = SRC[1]; \ 404d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul DST[BCOMP] = SRC[2]; \ 405d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul DST[ACOMP] = 1.0F 406d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#include "swrast/s_spantemp.h" 407d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul 408d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul 409d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul/* 8-bit BGR */ 410d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define NAME(PREFIX) PREFIX##_BGR8 411d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define RB_TYPE GLubyte 4129c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define SPAN_VARS \ 4139c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul const OSMesaContext osmesa = OSMESA_CONTEXT(ctx); 4149c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define INIT_PIXEL_PTR(P, X, Y) \ 415d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul GLubyte *P = (GLubyte *) osmesa->rowaddr[Y] + 3 * (X) 4163340a9ea9ea31e6bd7f37d5c1f25ffcc97f20a6bBrian Paul#define INC_PIXEL_PTR(P) P += 3 417e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul#define STORE_PIXEL(DST, X, Y, VALUE) \ 418e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul DST[2] = VALUE[RCOMP]; \ 419e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul DST[1] = VALUE[GCOMP]; \ 420e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul DST[0] = VALUE[BCOMP] 421e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul#define FETCH_PIXEL(DST, SRC) \ 422e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul DST[RCOMP] = SRC[2]; \ 423e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul DST[GCOMP] = SRC[1]; \ 424e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul DST[BCOMP] = SRC[0]; \ 425d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul DST[ACOMP] = 255 426eae0439ae6027ba64fba49fe13360d105700905fBrian Paul#include "swrast/s_spantemp.h" 4279c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul 428d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul/* 16-bit BGR */ 429d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define NAME(PREFIX) PREFIX##_BGR16 430d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define RB_TYPE GLushort 431d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define SPAN_VARS \ 432d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul const OSMesaContext osmesa = OSMESA_CONTEXT(ctx); 433d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define INIT_PIXEL_PTR(P, X, Y) \ 434d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul GLushort *P = (GLushort *) osmesa->rowaddr[Y] + 3 * (X) 435d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define INC_PIXEL_PTR(P) P += 3 436d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define STORE_PIXEL(DST, X, Y, VALUE) \ 437d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul DST[2] = VALUE[RCOMP]; \ 438d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul DST[1] = VALUE[GCOMP]; \ 439d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul DST[0] = VALUE[BCOMP] 440d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define FETCH_PIXEL(DST, SRC) \ 441d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul DST[RCOMP] = SRC[2]; \ 442d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul DST[GCOMP] = SRC[1]; \ 443d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul DST[BCOMP] = SRC[0]; \ 444d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul DST[ACOMP] = 65535 445d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#include "swrast/s_spantemp.h" 446d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul 447d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul/* 32-bit BGR */ 448d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define NAME(PREFIX) PREFIX##_BGR32 449d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define RB_TYPE GLfloat 450d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define SPAN_VARS \ 451d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul const OSMesaContext osmesa = OSMESA_CONTEXT(ctx); 452d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define INIT_PIXEL_PTR(P, X, Y) \ 453d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul GLfloat *P = (GLfloat *) osmesa->rowaddr[Y] + 3 * (X) 454d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define INC_PIXEL_PTR(P) P += 3 455d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define STORE_PIXEL(DST, X, Y, VALUE) \ 456d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul DST[2] = VALUE[RCOMP]; \ 457d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul DST[1] = VALUE[GCOMP]; \ 458d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul DST[0] = VALUE[BCOMP] 459d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define FETCH_PIXEL(DST, SRC) \ 460d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul DST[RCOMP] = SRC[2]; \ 461d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul DST[GCOMP] = SRC[1]; \ 462d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul DST[BCOMP] = SRC[0]; \ 463d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul DST[ACOMP] = 1.0F 464d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#include "swrast/s_spantemp.h" 465d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul 466d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul 467d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul/* 16-bit 5/6/5 RGB */ 4689c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define NAME(PREFIX) PREFIX##_RGB_565 469d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define RB_TYPE GLubyte 4709c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define SPAN_VARS \ 4719c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul const OSMesaContext osmesa = OSMESA_CONTEXT(ctx); 4729c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define INIT_PIXEL_PTR(P, X, Y) \ 4739c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul GLushort *P = (GLushort *) osmesa->rowaddr[Y] + (X) 4749c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define INC_PIXEL_PTR(P) P += 1 475e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul#define STORE_PIXEL(DST, X, Y, VALUE) \ 476e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul *DST = ( (((VALUE[RCOMP]) & 0xf8) << 8) | (((VALUE[GCOMP]) & 0xfc) << 3) | ((VALUE[BCOMP]) >> 3) ) 477e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul#define FETCH_PIXEL(DST, SRC) \ 478e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul DST[RCOMP] = ( (((*SRC) >> 8) & 0xf8) | (((*SRC) >> 11) & 0x7) ); \ 479e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul DST[GCOMP] = ( (((*SRC) >> 3) & 0xfc) | (((*SRC) >> 5) & 0x3) ); \ 480e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul DST[BCOMP] = ( (((*SRC) << 3) & 0xf8) | (((*SRC) ) & 0x7) ); \ 481e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul DST[ACOMP] = CHAN_MAX 482eae0439ae6027ba64fba49fe13360d105700905fBrian Paul#include "swrast/s_spantemp.h" 483d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul 4849c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul 4859c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul/* color index */ 4869c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define NAME(PREFIX) PREFIX##_CI 487d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define CI_MODE 488d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define RB_TYPE GLubyte 4899c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define SPAN_VARS \ 4909c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul const OSMesaContext osmesa = OSMESA_CONTEXT(ctx); 4919c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define INIT_PIXEL_PTR(P, X, Y) \ 4925704b8e57a0c618ddf51502e99e9dbd48cc3e685Brian Paul GLubyte *P = (GLubyte *) osmesa->rowaddr[Y] + (X) 4939c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define INC_PIXEL_PTR(P) P += 1 494e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul#define STORE_PIXEL(DST, X, Y, VALUE) \ 495e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul *DST = VALUE[0] 496e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul#define FETCH_PIXEL(DST, SRC) \ 497e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul DST = SRC[0] 498eae0439ae6027ba64fba49fe13360d105700905fBrian Paul#include "swrast/s_spantemp.h" 499e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul 500e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul 5011e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell 5021e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell 50320215ecc7ded503d7d9cb6e8ba2f7a9c1621dd15Brian Paul/** 50420215ecc7ded503d7d9cb6e8ba2f7a9c1621dd15Brian Paul * Macros for optimized line/triangle rendering. 50520215ecc7ded503d7d9cb6e8ba2f7a9c1621dd15Brian Paul * Only for 8-bit channel, RGBA, BGRA, ARGB formats. 50620215ecc7ded503d7d9cb6e8ba2f7a9c1621dd15Brian Paul */ 507afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 5089c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define PACK_RGBA(DST, R, G, B, A) \ 5099c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Pauldo { \ 5109c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul (DST)[osmesa->rInd] = R; \ 5119c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul (DST)[osmesa->gInd] = G; \ 5129c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul (DST)[osmesa->bInd] = B; \ 5139c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul (DST)[osmesa->aInd] = A; \ 5149c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul} while (0) 5159c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul 516d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define PIXELADDR4(X,Y) ((GLchan *) osmesa->rowaddr[Y] + 4 * (X)) 517afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 5182bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul 51920215ecc7ded503d7d9cb6e8ba2f7a9c1621dd15Brian Paul/** 5209c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * Draw a flat-shaded, RGB line into an osmesa buffer. 521afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */ 52222a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul#define NAME flat_rgba_line 52322a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul#define CLIP_HACK 1 52422a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul#define SETUP_CODE \ 52522a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul const OSMesaContext osmesa = OSMESA_CONTEXT(ctx); \ 5269c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul const GLchan *color = vert1->color; 527709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell 5289c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define PLOT(X, Y) \ 5299c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Pauldo { \ 5309c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul GLchan *p = PIXELADDR4(X, Y); \ 5319c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul PACK_RGBA(p, color[0], color[1], color[2], color[3]); \ 5329c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul} while (0) 533afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 5349c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#ifdef WIN32 5359c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#include "..\swrast\s_linetemp.h" 5369c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#else 5379c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#include "swrast/s_linetemp.h" 5389c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#endif 53922a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul 540afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 541afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 54220215ecc7ded503d7d9cb6e8ba2f7a9c1621dd15Brian Paul/** 5439c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * Draw a flat-shaded, Z-less, RGB line into an osmesa buffer. 544afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */ 54522a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul#define NAME flat_rgba_z_line 54622a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul#define CLIP_HACK 1 5479c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define INTERP_Z 1 5489c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE 54922a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul#define SETUP_CODE \ 55022a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul const OSMesaContext osmesa = OSMESA_CONTEXT(ctx); \ 55122a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul const GLchan *color = vert1->color; 55222a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul 5539c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define PLOT(X, Y) \ 5549c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Pauldo { \ 5559c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul if (Z < *zPtr) { \ 5569c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul GLchan *p = PIXELADDR4(X, Y); \ 5579c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul PACK_RGBA(p, color[RCOMP], color[GCOMP], \ 5589c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul color[BCOMP], color[ACOMP]); \ 5599c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul *zPtr = Z; \ 5609c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul } \ 5619c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul} while (0) 56274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul 5639c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#ifdef WIN32 5649c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#include "..\swrast\s_linetemp.h" 5659c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#else 5669c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#include "swrast/s_linetemp.h" 5679c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#endif 568206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul 569afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 570afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 571d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul/** 5729c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * Analyze context state to see if we can provide a fast line drawing 573d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul * function. Otherwise, return NULL. 5749c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul */ 5759c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paulstatic swrast_line_func 5769c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paulosmesa_choose_line_function( GLcontext *ctx ) 577afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 5789c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul const OSMesaContext osmesa = OSMESA_CONTEXT(ctx); 5799c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul const SWcontext *swrast = SWRAST_CONTEXT(ctx); 580afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 581544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul if (osmesa->rb->DataType != GL_UNSIGNED_BYTE) 582544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul return NULL; 583544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul 5849c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul if (ctx->RenderMode != GL_RENDER) return NULL; 5859c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul if (ctx->Line.SmoothFlag) return NULL; 5869c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul if (ctx->Texture._EnabledUnits) return NULL; 5879c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul if (ctx->Light.ShadeModel != GL_FLAT) return NULL; 5889c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul if (ctx->Line.Width != 1.0F) return NULL; 5899c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul if (ctx->Line.StippleFlag) return NULL; 5909c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul if (ctx->Line.SmoothFlag) return NULL; 5919c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul if (osmesa->format != OSMESA_RGBA && 5929c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul osmesa->format != OSMESA_BGRA && 5939c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul osmesa->format != OSMESA_ARGB) return NULL; 5949c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul 5959c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul if (swrast->_RasterMask==DEPTH_BIT 5969c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul && ctx->Depth.Func==GL_LESS 5979c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul && ctx->Depth.Mask==GL_TRUE 5989c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul && ctx->Visual.depthBits == DEFAULT_SOFTWARE_DEPTH_BITS) { 5999c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul return (swrast_line_func) flat_rgba_z_line; 600afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 601afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 6029c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul if (swrast->_RasterMask == 0) { 6039c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul return (swrast_line_func) flat_rgba_line; 604afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 6059c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul 6069c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul return (swrast_line_func) NULL; 607afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 608afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 6099c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul 6109c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul/**********************************************************************/ 6119c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul/***** Optimized triangle rendering *****/ 6129c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul/**********************************************************************/ 6139c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul 6149c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul 61523ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank/* 6169c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * Smooth-shaded, z-less triangle, RGBA color. 61723ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank */ 6189c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define NAME smooth_rgba_z_triangle 6199c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define INTERP_Z 1 6209c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE 6219c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define INTERP_RGB 1 6229c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define INTERP_ALPHA 1 6239c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define SETUP_CODE \ 6249c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul const OSMesaContext osmesa = OSMESA_CONTEXT(ctx); 6255bdec89da520f763b6d0faad1781f64566a97fddKarl Schultz#define RENDER_SPAN( span ) { \ 6269c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul GLuint i; \ 6279c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul GLchan *img = PIXELADDR4(span.x, span.y); \ 6289c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul for (i = 0; i < span.end; i++, img += 4) { \ 6294092fbd55ac92a59d09d5167ced328683bed049cBrian Paul const GLuint z = FixedToDepth(span.z); \ 6309c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul if (z < zRow[i]) { \ 6319c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul PACK_RGBA(img, FixedToChan(span.red), \ 6329c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul FixedToChan(span.green), FixedToChan(span.blue), \ 6339c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul FixedToChan(span.alpha)); \ 6349c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul zRow[i] = z; \ 6359c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul } \ 6369c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul span.red += span.redStep; \ 6379c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul span.green += span.greenStep; \ 6389c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul span.blue += span.blueStep; \ 6399c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul span.alpha += span.alphaStep; \ 6409c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul span.z += span.zStep; \ 6415bdec89da520f763b6d0faad1781f64566a97fddKarl Schultz } \ 6425bdec89da520f763b6d0faad1781f64566a97fddKarl Schultz} 6439c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#ifdef WIN32 6449c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#include "..\swrast\s_tritemp.h" 6459c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#else 6469c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#include "swrast/s_tritemp.h" 6479c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#endif 64801dc182ee86922845ba0b17a2cda9af19150c93aBrian Paul 649afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 650afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 651afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/* 6529c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * Flat-shaded, z-less triangle, RGBA color. 653afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */ 6549c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define NAME flat_rgba_z_triangle 6559c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define INTERP_Z 1 6569c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE 6579c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define SETUP_CODE \ 6589c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul const OSMesaContext osmesa = OSMESA_CONTEXT(ctx); \ 6599c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul GLuint pixel; \ 6609c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul PACK_RGBA((GLchan *) &pixel, v2->color[0], v2->color[1], \ 6619c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul v2->color[2], v2->color[3]); 662afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 6635bdec89da520f763b6d0faad1781f64566a97fddKarl Schultz#define RENDER_SPAN( span ) { \ 6649c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul GLuint i; \ 6659c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul GLuint *img = (GLuint *) PIXELADDR4(span.x, span.y); \ 6669c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul for (i = 0; i < span.end; i++) { \ 6674092fbd55ac92a59d09d5167ced328683bed049cBrian Paul const GLuint z = FixedToDepth(span.z); \ 6689c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul if (z < zRow[i]) { \ 6699c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul img[i] = pixel; \ 6709c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul zRow[i] = z; \ 6719c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul } \ 6729c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul span.z += span.zStep; \ 6735bdec89da520f763b6d0faad1781f64566a97fddKarl Schultz } \ 6745bdec89da520f763b6d0faad1781f64566a97fddKarl Schultz} 6759c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#ifdef WIN32 6769c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#include "..\swrast\s_tritemp.h" 6774336c28c843923db3d9c8dc0a0cb2440ba94f064Brian Paul#else 6789c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#include "swrast/s_tritemp.h" 6794336c28c843923db3d9c8dc0a0cb2440ba94f064Brian Paul#endif 68074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul 681afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 682afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 683d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul/** 684d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul * Return pointer to an optimized triangle function if possible. 6859c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul */ 6869c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paulstatic swrast_tri_func 6879c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paulosmesa_choose_triangle_function( GLcontext *ctx ) 688afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 6899c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul const OSMesaContext osmesa = OSMESA_CONTEXT(ctx); 6909c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul const SWcontext *swrast = SWRAST_CONTEXT(ctx); 691dd020f13a6d520b46aefd4453dae6b6edcc427f6Brian Paul 692544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul if (osmesa->rb->DataType != GL_UNSIGNED_BYTE) 693544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul return (swrast_tri_func) NULL; 694544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul 6959c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul if (ctx->RenderMode != GL_RENDER) return (swrast_tri_func) NULL; 6969c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul if (ctx->Polygon.SmoothFlag) return (swrast_tri_func) NULL; 6979c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul if (ctx->Polygon.StippleFlag) return (swrast_tri_func) NULL; 6989c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul if (ctx->Texture._EnabledUnits) return (swrast_tri_func) NULL; 6999c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul if (osmesa->format != OSMESA_RGBA && 7009c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul osmesa->format != OSMESA_BGRA && 7019c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul osmesa->format != OSMESA_ARGB) return (swrast_tri_func) NULL; 7029c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul if (ctx->Polygon.CullFlag && 7039c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul ctx->Polygon.CullFaceMode == GL_FRONT_AND_BACK) 7049c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul return (swrast_tri_func) NULL; 70574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul 7069c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul if (swrast->_RasterMask == DEPTH_BIT && 7079c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul ctx->Depth.Func == GL_LESS && 7089c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul ctx->Depth.Mask == GL_TRUE && 7099c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul ctx->Visual.depthBits == DEFAULT_SOFTWARE_DEPTH_BITS) { 7109c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul if (ctx->Light.ShadeModel == GL_SMOOTH) { 7119c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul return (swrast_tri_func) smooth_rgba_z_triangle; 7129c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul } 7139c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul else { 7149c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul return (swrast_tri_func) flat_rgba_z_triangle; 715afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 716afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 7179c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul return (swrast_tri_func) NULL; 718afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 719afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 720afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 721afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 7229c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul/* Override for the swrast triangle-selection function. Try to use one 7239c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * of our internal triangle functions, otherwise fall back to the 7249c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * standard swrast functions. 7259c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul */ 7269c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paulstatic void 7279c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paulosmesa_choose_triangle( GLcontext *ctx ) 728afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 7299c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul SWcontext *swrast = SWRAST_CONTEXT(ctx); 730afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 7319c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul swrast->Triangle = osmesa_choose_triangle_function( ctx ); 7329c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul if (!swrast->Triangle) 7339c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul _swrast_choose_triangle( ctx ); 7349c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul} 735afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 73674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void 7379c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paulosmesa_choose_line( GLcontext *ctx ) 738afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 7399c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul SWcontext *swrast = SWRAST_CONTEXT(ctx); 7409c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul 7419c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul swrast->Line = osmesa_choose_line_function( ctx ); 7429c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul if (!swrast->Line) 7439c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul _swrast_choose_line( ctx ); 744afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 745afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 746afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 747544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul 748544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul/** 749544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul * Recompute the values of the context's rowaddr array. 750544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul */ 751544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paulstatic void 752544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paulcompute_row_addresses( OSMesaContext osmesa ) 753544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul{ 754544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul GLint bytesPerPixel, bytesPerRow, i; 755544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul GLubyte *origin = (GLubyte *) osmesa->rb->Data; 756544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul GLint bpc; /* bytes per channel */ 757544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul GLint rowlength; /* in pixels */ 758544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul GLint height = osmesa->rb->Height; 759544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul 760544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul if (osmesa->userRowLength) 761544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul rowlength = osmesa->userRowLength; 762544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul else 763544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul rowlength = osmesa->rb->Width; 764544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul 765544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul if (osmesa->rb->DataType == GL_UNSIGNED_BYTE) 766544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul bpc = 1; 767544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul else if (osmesa->rb->DataType == GL_UNSIGNED_SHORT) 768544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul bpc = 2; 769544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul else if (osmesa->rb->DataType == GL_FLOAT) 770544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul bpc = 4; 771544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul else { 772544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul _mesa_problem(&osmesa->mesa, 773544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul "Unexpected datatype in osmesa::compute_row_addresses"); 774544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul return; 775544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul } 776544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul 777544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul if (osmesa->format == OSMESA_COLOR_INDEX) { 778544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul /* CI mode */ 779544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul bytesPerPixel = 1 * sizeof(GLubyte); 780544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul } 781544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul else if ((osmesa->format == OSMESA_RGB) || (osmesa->format == OSMESA_BGR)) { 782544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul /* RGB mode */ 783544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul bytesPerPixel = 3 * bpc; 784544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul } 785544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul else if (osmesa->format == OSMESA_RGB_565) { 786544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul /* 5/6/5 RGB pixel in 16 bits */ 787544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul bytesPerPixel = 2; 788544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul } 789544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul else { 790544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul /* RGBA mode */ 791544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul bytesPerPixel = 4 * bpc; 792544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul } 793544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul 794544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul bytesPerRow = rowlength * bytesPerPixel; 795544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul 796544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul if (osmesa->yup) { 797544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul /* Y=0 is bottom line of window */ 798544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul for (i = 0; i < height; i++) { 799544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul osmesa->rowaddr[i] = (GLvoid *) ((GLubyte *) origin + i * bytesPerRow); 800544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul } 801544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul } 802544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul else { 803544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul /* Y=0 is top line of window */ 804544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul for (i = 0; i < height; i++) { 805544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul GLint j = height - i - 1; 806544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul osmesa->rowaddr[i] = (GLvoid *) ((GLubyte *) origin + j * bytesPerRow); 807544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul } 808544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul } 809544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul} 810544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul 811544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul 812544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul 813e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul/** 814e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul * Don't use _mesa_delete_renderbuffer since we can't free rb->Data. 815e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul */ 81674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void 817e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paulosmesa_delete_renderbuffer(struct gl_renderbuffer *rb) 818afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 819e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul _mesa_free(rb); 820e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul} 821e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul 822e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul 823e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul/** 824e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul * Allocate renderbuffer storage. We don't actually allocate any storage 825e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul * since we're using a user-provided buffer. 826e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul * Just set up all the gl_renderbuffer methods. 827e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul */ 828e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paulstatic GLboolean 829e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paulosmesa_renderbuffer_storage(GLcontext *ctx, struct gl_renderbuffer *rb, 830e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul GLenum internalFormat, GLuint width, GLuint height) 831e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul{ 832e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul const OSMesaContext osmesa = OSMESA_CONTEXT(ctx); 833d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul GLint bpc; /* bits per channel */ 834d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul 835d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul if (rb->DataType == GL_UNSIGNED_BYTE) 836d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul bpc = 8; 837d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul else if (rb->DataType == GL_UNSIGNED_SHORT) 838d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul bpc = 16; 839d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul else 840d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul bpc = 32; 841e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul 842544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul rb->RedBits = 843544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul rb->GreenBits = 844544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul rb->BlueBits = 845544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul rb->AlphaBits = bpc; 846544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul 8479e81d6ae3a6db9831d6aea0fe4d92722176e9f74Brian Paul /* Note: we can ignoring internalFormat for "window-system" renderbuffers */ 8485bdc6fdebc0ab59a888fba15136eb4a0ee2790e1Brian Paul (void) internalFormat; 8495bdc6fdebc0ab59a888fba15136eb4a0ee2790e1Brian Paul 850e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul if (osmesa->format == OSMESA_RGBA) { 851d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul if (rb->DataType == GL_UNSIGNED_BYTE) { 852d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul rb->GetRow = get_row_RGBA8; 853d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul rb->GetValues = get_values_RGBA8; 854d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul rb->PutRow = put_row_RGBA8; 855d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul rb->PutRowRGB = put_row_rgb_RGBA8; 856d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul rb->PutMonoRow = put_mono_row_RGBA8; 857d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul rb->PutValues = put_values_RGBA8; 858d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul rb->PutMonoValues = put_mono_values_RGBA8; 859d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul } 860d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul else if (rb->DataType == GL_UNSIGNED_SHORT) { 861d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul rb->GetRow = get_row_RGBA16; 862d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul rb->GetValues = get_values_RGBA16; 863d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul rb->PutRow = put_row_RGBA16; 864d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul rb->PutRowRGB = put_row_rgb_RGBA16; 865d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul rb->PutMonoRow = put_mono_row_RGBA16; 866d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul rb->PutValues = put_values_RGBA16; 867d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul rb->PutMonoValues = put_mono_values_RGBA16; 868d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul } 869d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul else { 870d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul rb->GetRow = get_row_RGBA32; 871d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul rb->GetValues = get_values_RGBA32; 872d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul rb->PutRow = put_row_RGBA32; 873d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul rb->PutRowRGB = put_row_rgb_RGBA32; 874d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul rb->PutMonoRow = put_mono_row_RGBA32; 875d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul rb->PutValues = put_values_RGBA32; 876d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul rb->PutMonoValues = put_mono_values_RGBA32; 877d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul } 878d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul rb->RedBits = rb->GreenBits = rb->BlueBits = rb->AlphaBits = bpc; 879e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul } 880e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul else if (osmesa->format == OSMESA_BGRA) { 881d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul if (rb->DataType == GL_UNSIGNED_BYTE) { 882d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul rb->GetRow = get_row_BGRA8; 883d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul rb->GetValues = get_values_BGRA8; 884d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul rb->PutRow = put_row_BGRA8; 885d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul rb->PutRowRGB = put_row_rgb_BGRA8; 886d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul rb->PutMonoRow = put_mono_row_BGRA8; 887d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul rb->PutValues = put_values_BGRA8; 888d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul rb->PutMonoValues = put_mono_values_BGRA8; 889d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul } 890d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul else if (rb->DataType == GL_UNSIGNED_SHORT) { 891d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul rb->GetRow = get_row_BGRA16; 892d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul rb->GetValues = get_values_BGRA16; 893d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul rb->PutRow = put_row_BGRA16; 894d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul rb->PutRowRGB = put_row_rgb_BGRA16; 895d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul rb->PutMonoRow = put_mono_row_BGRA16; 896d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul rb->PutValues = put_values_BGRA16; 897d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul rb->PutMonoValues = put_mono_values_BGRA16; 898d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul } 899d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul else { 900d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul rb->GetRow = get_row_BGRA32; 901d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul rb->GetValues = get_values_BGRA32; 902d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul rb->PutRow = put_row_BGRA32; 903d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul rb->PutRowRGB = put_row_rgb_BGRA32; 904d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul rb->PutMonoRow = put_mono_row_BGRA32; 905d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul rb->PutValues = put_values_BGRA32; 906d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul rb->PutMonoValues = put_mono_values_BGRA32; 907d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul } 908d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul rb->RedBits = rb->GreenBits = rb->BlueBits = rb->AlphaBits = bpc; 909e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul } 910e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul else if (osmesa->format == OSMESA_ARGB) { 911d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul if (rb->DataType == GL_UNSIGNED_BYTE) { 912d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul rb->GetRow = get_row_ARGB8; 913d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul rb->GetValues = get_values_ARGB8; 914d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul rb->PutRow = put_row_ARGB8; 915d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul rb->PutRowRGB = put_row_rgb_ARGB8; 916d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul rb->PutMonoRow = put_mono_row_ARGB8; 917d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul rb->PutValues = put_values_ARGB8; 918d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul rb->PutMonoValues = put_mono_values_ARGB8; 919d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul } 920d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul else if (rb->DataType == GL_UNSIGNED_SHORT) { 921d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul rb->GetRow = get_row_ARGB16; 922d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul rb->GetValues = get_values_ARGB16; 923d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul rb->PutRow = put_row_ARGB16; 924d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul rb->PutRowRGB = put_row_rgb_ARGB16; 925d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul rb->PutMonoRow = put_mono_row_ARGB16; 926d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul rb->PutValues = put_values_ARGB16; 927d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul rb->PutMonoValues = put_mono_values_ARGB16; 928d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul } 929d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul else { 930d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul rb->GetRow = get_row_ARGB32; 931d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul rb->GetValues = get_values_ARGB32; 932d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul rb->PutRow = put_row_ARGB32; 933d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul rb->PutRowRGB = put_row_rgb_ARGB32; 934d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul rb->PutMonoRow = put_mono_row_ARGB32; 935d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul rb->PutValues = put_values_ARGB32; 936d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul rb->PutMonoValues = put_mono_values_ARGB32; 937d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul } 938d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul rb->RedBits = rb->GreenBits = rb->BlueBits = rb->AlphaBits = bpc; 939e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul } 940e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul else if (osmesa->format == OSMESA_RGB) { 941d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul if (rb->DataType == GL_UNSIGNED_BYTE) { 942d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul rb->GetRow = get_row_RGB8; 943d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul rb->GetValues = get_values_RGB8; 944d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul rb->PutRow = put_row_RGB8; 945d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul rb->PutRowRGB = put_row_rgb_RGB8; 946d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul rb->PutMonoRow = put_mono_row_RGB8; 947d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul rb->PutValues = put_values_RGB8; 948d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul rb->PutMonoValues = put_mono_values_RGB8; 949d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul } 950d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul else if (rb->DataType == GL_UNSIGNED_SHORT) { 951d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul rb->GetRow = get_row_RGB16; 952d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul rb->GetValues = get_values_RGB16; 953d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul rb->PutRow = put_row_RGB16; 954d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul rb->PutRowRGB = put_row_rgb_RGB16; 955d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul rb->PutMonoRow = put_mono_row_RGB16; 956d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul rb->PutValues = put_values_RGB16; 957d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul rb->PutMonoValues = put_mono_values_RGB16; 958d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul } 959d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul else { 960d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul rb->GetRow = get_row_RGB32; 961d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul rb->GetValues = get_values_RGB32; 962d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul rb->PutRow = put_row_RGB32; 963d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul rb->PutRowRGB = put_row_rgb_RGB32; 964d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul rb->PutMonoRow = put_mono_row_RGB32; 965d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul rb->PutValues = put_values_RGB32; 966d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul rb->PutMonoValues = put_mono_values_RGB32; 967d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul } 968d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul rb->RedBits = rb->GreenBits = rb->BlueBits = bpc; 969afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 9709c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul else if (osmesa->format == OSMESA_BGR) { 971d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul if (rb->DataType == GL_UNSIGNED_BYTE) { 972d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul rb->GetRow = get_row_BGR8; 973d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul rb->GetValues = get_values_BGR8; 974d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul rb->PutRow = put_row_BGR8; 975d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul rb->PutRowRGB = put_row_rgb_BGR8; 976d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul rb->PutMonoRow = put_mono_row_BGR8; 977d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul rb->PutValues = put_values_BGR8; 978d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul rb->PutMonoValues = put_mono_values_BGR8; 979d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul } 980d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul else if (rb->DataType == GL_UNSIGNED_SHORT) { 981d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul rb->GetRow = get_row_BGR16; 982d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul rb->GetValues = get_values_BGR16; 983d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul rb->PutRow = put_row_BGR16; 984d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul rb->PutRowRGB = put_row_rgb_BGR16; 985d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul rb->PutMonoRow = put_mono_row_BGR16; 986d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul rb->PutValues = put_values_BGR16; 987d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul rb->PutMonoValues = put_mono_values_BGR16; 988d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul } 989d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul else { 990d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul rb->GetRow = get_row_BGR32; 991d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul rb->GetValues = get_values_BGR32; 992d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul rb->PutRow = put_row_BGR32; 993d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul rb->PutRowRGB = put_row_rgb_BGR32; 994d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul rb->PutMonoRow = put_mono_row_BGR32; 995d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul rb->PutValues = put_values_BGR32; 996d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul rb->PutMonoValues = put_mono_values_BGR32; 997d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul } 998d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul rb->RedBits = rb->GreenBits = rb->BlueBits = bpc; 9999c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul } 10009c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul else if (osmesa->format == OSMESA_RGB_565) { 1001d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul ASSERT(rb->DataType == GL_UNSIGNED_BYTE); 1002e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul rb->GetRow = get_row_RGB_565; 1003e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul rb->GetValues = get_values_RGB_565; 1004e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul rb->PutRow = put_row_RGB_565; 10050ad1bda7a1f7d88556dd458e532815ff28c898aeDaniel Borca rb->PutRowRGB = put_row_rgb_RGB_565; 1006e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul rb->PutMonoRow = put_mono_row_RGB_565; 1007e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul rb->PutValues = put_values_RGB_565; 1008e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul rb->PutMonoValues = put_mono_values_RGB_565; 10099e81d6ae3a6db9831d6aea0fe4d92722176e9f74Brian Paul rb->RedBits = 5; 10109e81d6ae3a6db9831d6aea0fe4d92722176e9f74Brian Paul rb->GreenBits = 6; 10119e81d6ae3a6db9831d6aea0fe4d92722176e9f74Brian Paul rb->BlueBits = 5; 10129c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul } 10139c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul else if (osmesa->format == OSMESA_COLOR_INDEX) { 1014e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul rb->GetRow = get_row_CI; 1015e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul rb->GetValues = get_values_CI; 1016e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul rb->PutRow = put_row_CI; 1017e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul rb->PutMonoRow = put_mono_row_CI; 1018e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul rb->PutValues = put_values_CI; 1019e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul rb->PutMonoValues = put_mono_values_CI; 10209e81d6ae3a6db9831d6aea0fe4d92722176e9f74Brian Paul rb->IndexBits = 8; 10219c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul } 10229c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul else { 1023e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul _mesa_problem(ctx, "bad pixel format in osmesa renderbuffer_storage"); 1024afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1025afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1026b100484145d3518e4896d756b1ceccf61382c569Daniel Borca rb->Width = width; 1027b100484145d3518e4896d756b1ceccf61382c569Daniel Borca rb->Height = height; 1028b100484145d3518e4896d756b1ceccf61382c569Daniel Borca 1029544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul compute_row_addresses( osmesa ); 1030544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul 1031e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul return GL_TRUE; 1032afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 1033afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1034afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1035e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul/** 1036ed875a4cb3cf194637d696b2660b98fdc3b95b0fBrian Paul * Allocate a new renderbuffer to describe the user-provided color buffer. 1037e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul */ 1038e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paulstatic struct gl_renderbuffer * 1039d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paulnew_osmesa_renderbuffer(GLcontext *ctx, GLenum format, GLenum type) 1040e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul{ 1041d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul const GLuint name = 0; 1042d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul struct gl_renderbuffer *rb = _mesa_new_renderbuffer(ctx, name); 1043e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul if (rb) { 1044e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul rb->Delete = osmesa_delete_renderbuffer; 1045e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul rb->AllocStorage = osmesa_renderbuffer_storage; 1046e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul 1047e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul if (format == OSMESA_COLOR_INDEX) { 1048e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul rb->InternalFormat = GL_COLOR_INDEX; 1049d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul rb->_ActualFormat = GL_COLOR_INDEX8_EXT; 1050d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul rb->_BaseFormat = GL_COLOR_INDEX; 1051e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul rb->DataType = GL_UNSIGNED_BYTE; 1052e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul } 1053e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul else { 1054e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul rb->InternalFormat = GL_RGBA; 1055d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul rb->_ActualFormat = GL_RGBA; 1056d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul rb->_BaseFormat = GL_RGBA; 1057d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul rb->DataType = type; 1058e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul } 1059e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul } 1060e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul return rb; 1061e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul} 1062e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul 10639c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul 1064afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/**********************************************************************/ 10659c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul/***** Public Functions *****/ 1066afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/**********************************************************************/ 1067afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1068afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1069d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul/** 10709c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * Create an Off-Screen Mesa rendering context. The only attribute needed is 10719c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * an RGBA vs Color-Index mode flag. 10729c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * 10739c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * Input: format - either GL_RGBA or GL_COLOR_INDEX 10749c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * sharelist - specifies another OSMesaContext with which to share 10759c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * display lists. NULL indicates no sharing. 10769c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * Return: an OSMesaContext or 0 if error 10779c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul */ 10789c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian PaulGLAPI OSMesaContext GLAPIENTRY 10799c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian PaulOSMesaCreateContext( GLenum format, OSMesaContext sharelist ) 1080afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 10814128d88b98e22676fa05ed586da1641c85a0bde2Brian Paul const GLint accumBits = (format == OSMESA_COLOR_INDEX) ? 0 : 16; 10829c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul return OSMesaCreateContextExt(format, DEFAULT_SOFTWARE_DEPTH_BITS, 10835dce1e5c420872ae096854841a9665f8d3d649fbBrian Paul 8, accumBits, sharelist); 108474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul} 108574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul 108674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul 108774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul 1088d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul/** 10899c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * New in Mesa 3.5 10909c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * 10919c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * Create context and specify size of ancillary buffers. 10929c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul */ 10939c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian PaulGLAPI OSMesaContext GLAPIENTRY 10949c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian PaulOSMesaCreateContextExt( GLenum format, GLint depthBits, GLint stencilBits, 10959c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul GLint accumBits, OSMesaContext sharelist ) 109674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul{ 10979c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul OSMesaContext osmesa; 1098d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul struct dd_function_table functions; 10999c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul GLint rind, gind, bind, aind; 11009c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul GLint indexBits = 0, redBits = 0, greenBits = 0, blueBits = 0, alphaBits =0; 11019c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul GLboolean rgbmode; 1102d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul GLenum type = CHAN_TYPE; 1103afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 11049c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul rind = gind = bind = aind = 0; 11059c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul if (format==OSMESA_COLOR_INDEX) { 11069c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul indexBits = 8; 11079c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul rgbmode = GL_FALSE; 110874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul } 11099c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul else if (format==OSMESA_RGBA) { 11109c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul indexBits = 0; 11119c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul redBits = CHAN_BITS; 11129c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul greenBits = CHAN_BITS; 11139c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul blueBits = CHAN_BITS; 11149c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul alphaBits = CHAN_BITS; 11159c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul rind = 0; 11169c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul gind = 1; 11179c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul bind = 2; 11189c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul aind = 3; 11199c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul rgbmode = GL_TRUE; 1120afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 11219c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul else if (format==OSMESA_BGRA) { 11229c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul indexBits = 0; 11239c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul redBits = CHAN_BITS; 11249c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul greenBits = CHAN_BITS; 11259c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul blueBits = CHAN_BITS; 11269c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul alphaBits = CHAN_BITS; 11279c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul bind = 0; 11289c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul gind = 1; 11299c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul rind = 2; 11309c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul aind = 3; 11319c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul rgbmode = GL_TRUE; 1132afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 11339c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul else if (format==OSMESA_ARGB) { 11349c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul indexBits = 0; 11359c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul redBits = CHAN_BITS; 11369c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul greenBits = CHAN_BITS; 11379c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul blueBits = CHAN_BITS; 11389c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul alphaBits = CHAN_BITS; 11399c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul aind = 0; 11409c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul rind = 1; 11419c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul gind = 2; 11429c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul bind = 3; 11439c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul rgbmode = GL_TRUE; 1144206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul } 11459c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul else if (format==OSMESA_RGB) { 11469c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul indexBits = 0; 11479c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul redBits = CHAN_BITS; 11489c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul greenBits = CHAN_BITS; 11499c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul blueBits = CHAN_BITS; 11509c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul alphaBits = 0; 11519c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul rind = 0; 11529c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul gind = 1; 11539c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul bind = 2; 11549c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul rgbmode = GL_TRUE; 1155afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 11569c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul else if (format==OSMESA_BGR) { 11579c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul indexBits = 0; 11589c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul redBits = CHAN_BITS; 11599c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul greenBits = CHAN_BITS; 11609c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul blueBits = CHAN_BITS; 11619c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul alphaBits = 0; 11629c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul rind = 2; 11639c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul gind = 1; 11649c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul bind = 0; 11659c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul rgbmode = GL_TRUE; 1166afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1167cc9464e082b82179e3c4b51ea460212c10b2bf0cBrian Paul#if CHAN_TYPE == GL_UNSIGNED_BYTE 11689c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul else if (format==OSMESA_RGB_565) { 11699c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul indexBits = 0; 11709c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul redBits = 5; 11719c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul greenBits = 6; 11729c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul blueBits = 5; 11739c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul alphaBits = 0; 11749c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul rind = 0; /* not used */ 11759c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul gind = 0; 11769c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul bind = 0; 11779c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul rgbmode = GL_TRUE; 1178afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1179cc9464e082b82179e3c4b51ea460212c10b2bf0cBrian Paul#endif 1180afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg else { 11819c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul return NULL; 1182afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1183afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 11849c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul osmesa = (OSMesaContext) CALLOC_STRUCT(osmesa_context); 11859c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul if (osmesa) { 11869c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul osmesa->gl_visual = _mesa_create_visual( rgbmode, 11879c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul GL_FALSE, /* double buffer */ 11889c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul GL_FALSE, /* stereo */ 11899c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul redBits, 11909c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul greenBits, 11919c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul blueBits, 11929c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul alphaBits, 11939c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul indexBits, 11949c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul depthBits, 11959c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul stencilBits, 11969c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul accumBits, 11979c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul accumBits, 11989c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul accumBits, 11999c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul alphaBits ? accumBits : 0, 12009c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul 1 /* num samples */ 12019c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul ); 12029c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul if (!osmesa->gl_visual) { 1203d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul _mesa_free(osmesa); 12049c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul return NULL; 1205afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1206afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1207d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul /* Initialize device driver function table */ 1208d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul _mesa_init_driver_functions(&functions); 1209d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul /* override with our functions */ 1210d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul functions.GetString = get_string; 1211d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul functions.UpdateState = osmesa_update_state; 1212544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul functions.GetBufferSize = NULL; 12136fafc7ad19a8b7400e57a86b588766b6f3811a05Brian Paul 12146fafc7ad19a8b7400e57a86b588766b6f3811a05Brian Paul if (!_mesa_initialize_context(&osmesa->mesa, 12159c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul osmesa->gl_visual, 12166fafc7ad19a8b7400e57a86b588766b6f3811a05Brian Paul sharelist ? &sharelist->mesa 12179c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul : (GLcontext *) NULL, 1218d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul &functions, (void *) osmesa)) { 12199c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul _mesa_destroy_visual( osmesa->gl_visual ); 1220d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul _mesa_free(osmesa); 12219c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul return NULL; 1222afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 122374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul 12246fafc7ad19a8b7400e57a86b588766b6f3811a05Brian Paul _mesa_enable_sw_extensions(&(osmesa->mesa)); 12256fafc7ad19a8b7400e57a86b588766b6f3811a05Brian Paul _mesa_enable_1_3_extensions(&(osmesa->mesa)); 12266fafc7ad19a8b7400e57a86b588766b6f3811a05Brian Paul _mesa_enable_1_4_extensions(&(osmesa->mesa)); 122784351999ec6ad07e0cfc31c0b3a8c86da4134bfeBrian Paul _mesa_enable_1_5_extensions(&(osmesa->mesa)); 122874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul 1229e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul osmesa->gl_buffer = _mesa_create_framebuffer(osmesa->gl_visual); 12309c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul if (!osmesa->gl_buffer) { 12319c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul _mesa_destroy_visual( osmesa->gl_visual ); 12326fafc7ad19a8b7400e57a86b588766b6f3811a05Brian Paul _mesa_free_context_data( &osmesa->mesa ); 1233d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul _mesa_free(osmesa); 12349c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul return NULL; 12359c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul } 1236e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul 1237fc3bc1ae14e7aa769fe01c007a1d68f2ff6db7b8Brian Paul /* create front color buffer in user-provided memory (no back buffer) */ 1238d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul osmesa->rb = new_osmesa_renderbuffer(&osmesa->mesa, format, type); 1239d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul _mesa_add_renderbuffer(osmesa->gl_buffer, BUFFER_FRONT_LEFT, osmesa->rb); 1240d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul 1241e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul _mesa_add_soft_renderbuffers(osmesa->gl_buffer, 1242e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul GL_FALSE, /* color */ 1243e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul osmesa->gl_visual->haveDepthBuffer, 1244e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul osmesa->gl_visual->haveStencilBuffer, 1245e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul osmesa->gl_visual->haveAccumBuffer, 1246e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul GL_FALSE, /* alpha */ 1247e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul GL_FALSE /* aux */ ); 1248e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul 12499c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul osmesa->format = format; 12509c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul osmesa->userRowLength = 0; 12519c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul osmesa->yup = GL_TRUE; 12529c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul osmesa->rInd = rind; 12539c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul osmesa->gInd = gind; 12549c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul osmesa->bInd = bind; 12559c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul osmesa->aInd = aind; 125674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul 12579c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul /* Initialize the software rasterizer and helper modules. */ 12589c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul { 12596fafc7ad19a8b7400e57a86b588766b6f3811a05Brian Paul GLcontext *ctx = &osmesa->mesa; 1260e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul SWcontext *swrast; 1261e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul TNLcontext *tnl; 1262afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1263c45b7364dab6c3daebc1f1d8d11124af4129074aBrian Paul if (!_swrast_CreateContext( ctx ) || 12640a0fb5e0b3cfe61749af41d4200d42982b551cefKeith Whitwell !_vbo_CreateContext( ctx ) || 1265c45b7364dab6c3daebc1f1d8d11124af4129074aBrian Paul !_tnl_CreateContext( ctx ) || 1266c45b7364dab6c3daebc1f1d8d11124af4129074aBrian Paul !_swsetup_CreateContext( ctx )) { 1267c45b7364dab6c3daebc1f1d8d11124af4129074aBrian Paul _mesa_destroy_visual(osmesa->gl_visual); 1268c45b7364dab6c3daebc1f1d8d11124af4129074aBrian Paul _mesa_free_context_data(ctx); 1269c45b7364dab6c3daebc1f1d8d11124af4129074aBrian Paul _mesa_free(osmesa); 1270c45b7364dab6c3daebc1f1d8d11124af4129074aBrian Paul return NULL; 1271c45b7364dab6c3daebc1f1d8d11124af4129074aBrian Paul } 12729c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul 12739c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul _swsetup_Wakeup( ctx ); 1274e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul 1275e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul /* use default TCL pipeline */ 1276e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul tnl = TNL_CONTEXT(ctx); 1277e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul tnl->Driver.RunPipeline = _tnl_run_pipeline; 1278e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul 1279e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul /* Extend the software rasterizer with our optimized line and triangle 1280e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul * drawing functions. 1281e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul */ 1282e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul swrast = SWRAST_CONTEXT( ctx ); 1283e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul swrast->choose_line = osmesa_choose_line; 1284e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul swrast->choose_triangle = osmesa_choose_triangle; 12859c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul } 1286afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 12879c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul return osmesa; 1288afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 1289afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1290afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1291d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul/** 12929c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * Destroy an Off-Screen Mesa rendering context. 12939c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * 1294d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul * \param osmesa the context to destroy 1295afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */ 12969c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian PaulGLAPI void GLAPIENTRY 1297d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian PaulOSMesaDestroyContext( OSMesaContext osmesa ) 1298afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 1299d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul if (osmesa) { 1300d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul _swsetup_DestroyContext( &osmesa->mesa ); 1301d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul _tnl_DestroyContext( &osmesa->mesa ); 13020a0fb5e0b3cfe61749af41d4200d42982b551cefKeith Whitwell _vbo_DestroyContext( &osmesa->mesa ); 1303d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul _swrast_DestroyContext( &osmesa->mesa ); 1304d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul 1305d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul _mesa_destroy_visual( osmesa->gl_visual ); 1306a510bc3ee1a696da120c09ee4ec33dc033f671acBrian _mesa_unreference_framebuffer( &osmesa->gl_buffer ); 1307a510bc3ee1a696da120c09ee4ec33dc033f671acBrian 1308d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul _mesa_free_context_data( &osmesa->mesa ); 1309d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul _mesa_free( osmesa ); 13109c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul } 13119c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul} 1312afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1313afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1314d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul/** 13159c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * Bind an OSMesaContext to an image buffer. The image buffer is just a 13169c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * block of memory which the client provides. Its size must be at least 13179c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * as large as width*height*sizeof(type). Its address should be a multiple 13189c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * of 4 if using RGBA mode. 13199c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * 13209c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * Image data is stored in the order of glDrawPixels: row-major order 13219c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * with the lower-left image pixel stored in the first array position 13229c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * (ie. bottom-to-top). 13239c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * 13249c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * If the context's viewport hasn't been initialized yet, it will now be 13259c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * initialized to (0,0,width,height). 13269c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * 1327d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul * Input: osmesa - the rendering context 13289c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * buffer - the image buffer memory 13299c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * type - data type for pixel components 13309c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * Normally, only GL_UNSIGNED_BYTE and GL_UNSIGNED_SHORT_5_6_5 13319c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * are supported. But if Mesa's been compiled with CHAN_BITS==16 1332d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul * then type may be GL_UNSIGNED_SHORT or GL_UNSIGNED_BYTE. And if 1333d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul * Mesa's been build with CHAN_BITS==32 then type may be GL_FLOAT, 1334d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul * GL_UNSIGNED_SHORT or GL_UNSIGNED_BYTE. 13359c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * width, height - size of image buffer in pixels, at least 1 1336d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul * Return: GL_TRUE if success, GL_FALSE if error because of invalid osmesa, 13379c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * invalid buffer address, invalid type, width<1, height<1, 13389c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * width>internal limit or height>internal limit. 1339afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */ 13409c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian PaulGLAPI GLboolean GLAPIENTRY 1341d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian PaulOSMesaMakeCurrent( OSMesaContext osmesa, void *buffer, GLenum type, 13429c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul GLsizei width, GLsizei height ) 1343afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 1344d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul if (!osmesa || !buffer || 13459c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul width < 1 || height < 1 || 13469c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul width > MAX_WIDTH || height > MAX_HEIGHT) { 13479c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul return GL_FALSE; 13489c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul } 134974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul 1350d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul if (osmesa->format == OSMESA_RGB_565 && type != GL_UNSIGNED_SHORT_5_6_5) { 1351d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul return GL_FALSE; 1352afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1353d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul 1354544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul#if 0 1355d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul if (!(type == GL_UNSIGNED_BYTE || 1356d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul (type == GL_UNSIGNED_SHORT && CHAN_BITS >= 16) || 1357d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul (type == GL_FLOAT && CHAN_BITS == 32))) { 1358d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul /* i.e. is sizeof(type) * 8 > CHAN_BITS? */ 13599c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul return GL_FALSE; 13609c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul } 1361544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul#endif 136258f4d67703381003c23fecbd3fe114ef9d1730c3Brian Paul 1363d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul osmesa_update_state( &osmesa->mesa, 0 ); 1364c6c0f947142c0cc82626c238804a68b4e8f53945Brian Paul 1365c6c0f947142c0cc82626c238804a68b4e8f53945Brian Paul /* Call this periodically to detect when the user has begun using 1366c6c0f947142c0cc82626c238804a68b4e8f53945Brian Paul * GL rendering from multiple threads. 1367c6c0f947142c0cc82626c238804a68b4e8f53945Brian Paul */ 1368c6c0f947142c0cc82626c238804a68b4e8f53945Brian Paul _glapi_check_multithread(); 1369c6c0f947142c0cc82626c238804a68b4e8f53945Brian Paul 1370544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul /* Set renderbuffer fields. Set width/height = 0 to force 1371544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul * osmesa_renderbuffer_storage() being called by _mesa_resize_framebuffer() 1372544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul */ 1373544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul osmesa->rb->Data = buffer; 1374544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul osmesa->rb->DataType = type; 1375544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul osmesa->rb->Width = osmesa->rb->Height = 0; 1376544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul 13779cbe0e24ac3772ec5db303e532166351affc91c9Brian Paul /* Set the framebuffer's size. This causes the 13789cbe0e24ac3772ec5db303e532166351affc91c9Brian Paul * osmesa_renderbuffer_storage() function to get called. 13799cbe0e24ac3772ec5db303e532166351affc91c9Brian Paul */ 13809cbe0e24ac3772ec5db303e532166351affc91c9Brian Paul _mesa_resize_framebuffer(&osmesa->mesa, osmesa->gl_buffer, width, height); 13819cbe0e24ac3772ec5db303e532166351affc91c9Brian Paul osmesa->gl_buffer->Initialized = GL_TRUE; /* XXX TEMPORARY? */ 13829cbe0e24ac3772ec5db303e532166351affc91c9Brian Paul 1383d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul _mesa_make_current( &osmesa->mesa, osmesa->gl_buffer, osmesa->gl_buffer ); 138458f4d67703381003c23fecbd3fe114ef9d1730c3Brian Paul 138589ffca52ac18103ebaa754241a882ea8438ff9c4Brian Paul /* Remove renderbuffer attachment, then re-add. This installs the 1386544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul * renderbuffer adaptor/wrapper if needed (for bpp conversion). 1387d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul */ 138889ffca52ac18103ebaa754241a882ea8438ff9c4Brian Paul _mesa_remove_renderbuffer(osmesa->gl_buffer, BUFFER_FRONT_LEFT); 1389d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul _mesa_add_renderbuffer(osmesa->gl_buffer, BUFFER_FRONT_LEFT, osmesa->rb); 139074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul 139189ffca52ac18103ebaa754241a882ea8438ff9c4Brian Paul 1392d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul /* this updates the visual's red/green/blue/alphaBits fields */ 1393d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul _mesa_update_framebuffer_visual(osmesa->gl_buffer); 1394d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul 1395d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul /* update the framebuffer size */ 1396d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul _mesa_resize_framebuffer(&osmesa->mesa, osmesa->gl_buffer, width, height); 139774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul 13989c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul return GL_TRUE; 1399afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 1400afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 14011e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell 14021e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell 1403c5f9aa7750633e2989a6a139c283419d536ee3f7Brian PaulGLAPI OSMesaContext GLAPIENTRY 1404c5f9aa7750633e2989a6a139c283419d536ee3f7Brian PaulOSMesaGetCurrentContext( void ) 14059c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul{ 14069c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul GLcontext *ctx = _mesa_get_current_context(); 14079c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul if (ctx) 14089c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul return (OSMesaContext) ctx; 14099c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul else 14109c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul return NULL; 14119c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul} 14122d595d70202bad560c27ea81ec71b740415b3355Brian Paul 14131e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell 14141e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell 1415c5f9aa7750633e2989a6a139c283419d536ee3f7Brian PaulGLAPI void GLAPIENTRY 1416c5f9aa7750633e2989a6a139c283419d536ee3f7Brian PaulOSMesaPixelStore( GLint pname, GLint value ) 14171e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell{ 14189c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul OSMesaContext osmesa = OSMesaGetCurrentContext(); 1419dbd1e2b5990a3689bf718296c57c14fc3ba38db5Jouk Jansen 14209c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul switch (pname) { 14219c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul case OSMESA_ROW_LENGTH: 14229c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul if (value<0) { 14236fafc7ad19a8b7400e57a86b588766b6f3811a05Brian Paul _mesa_error( &osmesa->mesa, GL_INVALID_VALUE, 14249c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul "OSMesaPixelStore(value)" ); 14259c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul return; 14269c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul } 14279c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul osmesa->userRowLength = value; 14289c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul break; 14299c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul case OSMESA_Y_UP: 14309c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul osmesa->yup = value ? GL_TRUE : GL_FALSE; 14319c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul break; 14329c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul default: 14336fafc7ad19a8b7400e57a86b588766b6f3811a05Brian Paul _mesa_error( &osmesa->mesa, GL_INVALID_ENUM, "OSMesaPixelStore(pname)" ); 14349c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul return; 14359c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul } 1436dbd1e2b5990a3689bf718296c57c14fc3ba38db5Jouk Jansen 14379c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul compute_row_addresses( osmesa ); 14381e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell} 1439ed30dfa1264ec8875a3162c3c8778bc703bf11d5Brian Paul 1440ed30dfa1264ec8875a3162c3c8778bc703bf11d5Brian Paul 1441c5f9aa7750633e2989a6a139c283419d536ee3f7Brian PaulGLAPI void GLAPIENTRY 1442c5f9aa7750633e2989a6a139c283419d536ee3f7Brian PaulOSMesaGetIntegerv( GLint pname, GLint *value ) 1443afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 14449c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul OSMesaContext osmesa = OSMesaGetCurrentContext(); 14459c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul 14469c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul switch (pname) { 14479c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul case OSMESA_WIDTH: 1448544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul if (osmesa->gl_buffer) 1449544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul *value = osmesa->gl_buffer->Width; 1450544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul else 1451544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul *value = 0; 14529c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul return; 14539c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul case OSMESA_HEIGHT: 1454544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul if (osmesa->gl_buffer) 1455544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul *value = osmesa->gl_buffer->Height; 1456544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul else 1457544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul *value = 0; 14589c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul return; 14599c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul case OSMESA_FORMAT: 14609c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul *value = osmesa->format; 14619c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul return; 14629c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul case OSMESA_TYPE: 1463d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul /* current color buffer's data type */ 1464d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul if (osmesa->rb) { 1465d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul *value = osmesa->rb->DataType; 1466d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul } 1467d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul else { 1468d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul *value = 0; 1469d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul } 14709c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul return; 14719c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul case OSMESA_ROW_LENGTH: 14729c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul *value = osmesa->userRowLength; 14739c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul return; 14749c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul case OSMESA_Y_UP: 14759c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul *value = osmesa->yup; 14769c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul return; 14779c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul case OSMESA_MAX_WIDTH: 14789c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul *value = MAX_WIDTH; 14799c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul return; 14809c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul case OSMESA_MAX_HEIGHT: 14819c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul *value = MAX_HEIGHT; 14829c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul return; 1483afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg default: 14846fafc7ad19a8b7400e57a86b588766b6f3811a05Brian Paul _mesa_error(&osmesa->mesa, GL_INVALID_ENUM, "OSMesaGetIntergerv(pname)"); 14859c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul return; 1486afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1487afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 1488afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1489d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul 1490d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul/** 14919c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * Return the depth buffer associated with an OSMesa context. 14929c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * Input: c - the OSMesa context 14939c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * Output: width, height - size of buffer in pixels 14949c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * bytesPerValue - bytes per depth value (2 or 4) 14959c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * buffer - pointer to depth buffer values 14969c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * Return: GL_TRUE or GL_FALSE to indicate success or failure. 14979c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul */ 14989c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian PaulGLAPI GLboolean GLAPIENTRY 14999c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian PaulOSMesaGetDepthBuffer( OSMesaContext c, GLint *width, GLint *height, 15009c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul GLint *bytesPerValue, void **buffer ) 1501afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 1502e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul struct gl_renderbuffer *rb = NULL; 1503e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul 1504e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul if (c->gl_buffer) 1505e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul rb = c->gl_buffer->Attachment[BUFFER_DEPTH].Renderbuffer; 1506e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul 1507e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul if (!rb || !rb->Data) { 15089c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul *width = 0; 15099c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul *height = 0; 15109c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul *bytesPerValue = 0; 15119c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul *buffer = 0; 15129c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul return GL_FALSE; 151374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul } 15149c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul else { 1515544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul *width = rb->Width; 1516544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul *height = rb->Height; 15179c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul if (c->gl_visual->depthBits <= 16) 15189c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul *bytesPerValue = sizeof(GLushort); 15199c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul else 15209c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul *bytesPerValue = sizeof(GLuint); 1521e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul *buffer = rb->Data; 15229c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul return GL_TRUE; 1523afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 15249c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul} 15259c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul 1526d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul 1527d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul/** 15289c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * Return the color buffer associated with an OSMesa context. 15299c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * Input: c - the OSMesa context 15309c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * Output: width, height - size of buffer in pixels 15319c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * format - the pixel format (OSMESA_FORMAT) 15329c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * buffer - pointer to color buffer values 15339c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * Return: GL_TRUE or GL_FALSE to indicate success or failure. 15349c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul */ 15359c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian PaulGLAPI GLboolean GLAPIENTRY 1536d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian PaulOSMesaGetColorBuffer( OSMesaContext osmesa, GLint *width, 15379c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul GLint *height, GLint *format, void **buffer ) 15389c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul{ 1539d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul if (osmesa->rb && osmesa->rb->Data) { 1540d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul *width = osmesa->rb->Width; 1541d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul *height = osmesa->rb->Height; 1542d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul *format = osmesa->format; 1543d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul *buffer = osmesa->rb->Data; 1544d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul return GL_TRUE; 1545d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul } 1546d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul else { 15479c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul *width = 0; 15489c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul *height = 0; 15499c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul *format = 0; 15509c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul *buffer = 0; 15519c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul return GL_FALSE; 1552206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul } 15539c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul} 1554afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1555709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell 1556c5f9aa7750633e2989a6a139c283419d536ee3f7Brian Paulstruct name_function 1557c5f9aa7750633e2989a6a139c283419d536ee3f7Brian Paul{ 15589c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul const char *Name; 15594d880987d248ff078845027cc21ba437564ac07dBrian Paul OSMESAproc Function; 15609c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul}; 15619c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul 1562c5f9aa7750633e2989a6a139c283419d536ee3f7Brian Paulstatic struct name_function functions[] = { 15634d880987d248ff078845027cc21ba437564ac07dBrian Paul { "OSMesaCreateContext", (OSMESAproc) OSMesaCreateContext }, 15644d880987d248ff078845027cc21ba437564ac07dBrian Paul { "OSMesaCreateContextExt", (OSMESAproc) OSMesaCreateContextExt }, 15654d880987d248ff078845027cc21ba437564ac07dBrian Paul { "OSMesaDestroyContext", (OSMESAproc) OSMesaDestroyContext }, 15664d880987d248ff078845027cc21ba437564ac07dBrian Paul { "OSMesaMakeCurrent", (OSMESAproc) OSMesaMakeCurrent }, 15674d880987d248ff078845027cc21ba437564ac07dBrian Paul { "OSMesaGetCurrentContext", (OSMESAproc) OSMesaGetCurrentContext }, 15684d880987d248ff078845027cc21ba437564ac07dBrian Paul { "OSMesaPixelsStore", (OSMESAproc) OSMesaPixelStore }, 15694d880987d248ff078845027cc21ba437564ac07dBrian Paul { "OSMesaGetIntegerv", (OSMESAproc) OSMesaGetIntegerv }, 15704d880987d248ff078845027cc21ba437564ac07dBrian Paul { "OSMesaGetDepthBuffer", (OSMESAproc) OSMesaGetDepthBuffer }, 15714d880987d248ff078845027cc21ba437564ac07dBrian Paul { "OSMesaGetColorBuffer", (OSMESAproc) OSMesaGetColorBuffer }, 15724d880987d248ff078845027cc21ba437564ac07dBrian Paul { "OSMesaGetProcAddress", (OSMESAproc) OSMesaGetProcAddress }, 1573ad766b5785c728e988e25509604c08fc347aba23Alan Hourihane { "OSMesaColorClamp", (OSMESAproc) OSMesaColorClamp }, 15749c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul { NULL, NULL } 15759c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul}; 15769c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul 15774d880987d248ff078845027cc21ba437564ac07dBrian Paul 15784d880987d248ff078845027cc21ba437564ac07dBrian PaulGLAPI OSMESAproc GLAPIENTRY 15799c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian PaulOSMesaGetProcAddress( const char *funcName ) 15809c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul{ 15819c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul int i; 15829c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul for (i = 0; functions[i].Name; i++) { 15839c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul if (_mesa_strcmp(functions[i].Name, funcName) == 0) 15844d880987d248ff078845027cc21ba437564ac07dBrian Paul return functions[i].Function; 15859c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul } 15864d880987d248ff078845027cc21ba437564ac07dBrian Paul return _glapi_get_proc_address(funcName); 1587afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 1588ba3da6154c324cc916845bc5de3de077d0b59ffcBrian Paul 1589ba3da6154c324cc916845bc5de3de077d0b59ffcBrian Paul 1590ba3da6154c324cc916845bc5de3de077d0b59ffcBrian PaulGLAPI void GLAPIENTRY 1591ba3da6154c324cc916845bc5de3de077d0b59ffcBrian PaulOSMesaColorClamp(GLboolean enable) 1592ba3da6154c324cc916845bc5de3de077d0b59ffcBrian Paul{ 1593ba3da6154c324cc916845bc5de3de077d0b59ffcBrian Paul OSMesaContext osmesa = OSMesaGetCurrentContext(); 1594ba3da6154c324cc916845bc5de3de077d0b59ffcBrian Paul 1595ba3da6154c324cc916845bc5de3de077d0b59ffcBrian Paul if (enable == GL_TRUE) { 1596ba3da6154c324cc916845bc5de3de077d0b59ffcBrian Paul osmesa->mesa.Color.ClampFragmentColor = GL_TRUE; 1597ba3da6154c324cc916845bc5de3de077d0b59ffcBrian Paul } 1598ba3da6154c324cc916845bc5de3de077d0b59ffcBrian Paul else { 1599ba3da6154c324cc916845bc5de3de077d0b59ffcBrian Paul osmesa->mesa.Color.ClampFragmentColor = GL_FIXED_ONLY_ARB; 1600ba3da6154c324cc916845bc5de3de077d0b59ffcBrian Paul } 1601ba3da6154c324cc916845bc5de3de077d0b59ffcBrian Paul} 1602ba3da6154c324cc916845bc5de3de077d0b59ffcBrian Paul 1603ba3da6154c324cc916845bc5de3de077d0b59ffcBrian Paul 1604