osmesa.c revision 36b3a8bd5a317ab297f44b19fd14c7e76ec2fc77
1afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/* 2afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Mesa 3-D graphics library 3216eb81c53908c9ac774a378425691aa66205a88Brian * Version: 6.5.3 4dbd1e2b5990a3689bf718296c57c14fc3ba38db5Jouk Jansen * 5216eb81c53908c9ac774a378425691aa66205a88Brian * Copyright (C) 1999-2007 Brian Paul All Rights Reserved. 6dbd1e2b5990a3689bf718296c57c14fc3ba38db5Jouk Jansen * 7afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Permission is hereby granted, free of charge, to any person obtaining a 8afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * copy of this software and associated documentation files (the "Software"), 9afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * to deal in the Software without restriction, including without limitation 10afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * the rights to use, copy, modify, merge, publish, distribute, sublicense, 11afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * and/or sell copies of the Software, and to permit persons to whom the 12afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Software is furnished to do so, subject to the following conditions: 13dbd1e2b5990a3689bf718296c57c14fc3ba38db5Jouk Jansen * 14afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * The above copyright notice and this permission notice shall be included 15afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * in all copies or substantial portions of the Software. 16dbd1e2b5990a3689bf718296c57c14fc3ba38db5Jouk Jansen * 17afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 18afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 19afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 20afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN 21afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 22afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 23afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */ 24afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 25afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 26afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/* 27afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Off-Screen Mesa rendering / Rendering into client memory space 28d3c070ca6a36daa765b1ad7f44e03e6671ad0490Brian Paul * 29d3c070ca6a36daa765b1ad7f44e03e6671ad0490Brian Paul * Note on thread safety: this driver is thread safe. All 30d3c070ca6a36daa765b1ad7f44e03e6671ad0490Brian Paul * functions are reentrant. The notion of current context is 31b1394fa92aaaf859ce9efc8b5fc194397921320cBrian Paul * managed by the core _mesa_make_current() and _mesa_get_current_context() 32d3c070ca6a36daa765b1ad7f44e03e6671ad0490Brian Paul * functions. Those functions are thread-safe. 33afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */ 34afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 35afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 3691b491debea274cc4dfc12130624935d4ebd9728Brian Paul#include "main/glheader.h" 37afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#include "GL/osmesa.h" 3891b491debea274cc4dfc12130624935d4ebd9728Brian Paul#include "main/context.h" 3991b491debea274cc4dfc12130624935d4ebd9728Brian Paul#include "main/extensions.h" 4045e76d2665b38ba3787548310efc59e969124c01Brian Paul#include "main/formats.h" 4191b491debea274cc4dfc12130624935d4ebd9728Brian Paul#include "main/framebuffer.h" 4291b491debea274cc4dfc12130624935d4ebd9728Brian Paul#include "main/imports.h" 4391b491debea274cc4dfc12130624935d4ebd9728Brian Paul#include "main/mtypes.h" 4491b491debea274cc4dfc12130624935d4ebd9728Brian Paul#include "main/renderbuffer.h" 451e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell#include "swrast/swrast.h" 461e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell#include "swrast_setup/swrast_setup.h" 471e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell#include "swrast/s_context.h" 481e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell#include "swrast/s_lines.h" 491e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell#include "swrast/s_triangle.h" 505a9026c65d260dc185e072163999f5d810015108Brian Paul#include "tnl/tnl.h" 51709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell#include "tnl/t_context.h" 52bc69de5f21ebb4d6e1c65bf5652d17a9fc87dda7Keith Whitwell#include "tnl/t_pipeline.h" 53d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul#include "drivers/common/driverfuncs.h" 541741bc1a79b6a243e841bca704f1a720b028124aBrian Paul#include "drivers/common/meta.h" 5548f5deab94be832a782a440f55a7bc742d50a62fKeith Whitwell#include "vbo/vbo.h" 56afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 57724abeb058ca9372c5a9b9e38ee43dde1accaa41Keith Whitwell 58724abeb058ca9372c5a9b9e38ee43dde1accaa41Keith Whitwell 59d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul/** 60d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul * OSMesa rendering context, derived from core Mesa GLcontext. 61304357dcd496f7ebf499fd9c77b4eba83a75abd5Brian Paul */ 62d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paulstruct osmesa_context 63d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul{ 64d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul GLcontext mesa; /*< Base class - this must be first */ 65d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul GLvisual *gl_visual; /*< Describes the buffers */ 66d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul struct gl_renderbuffer *rb; /*< The user's colorbuffer */ 67d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul GLframebuffer *gl_buffer; /*< The framebuffer, containing user's rb */ 68d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul GLenum format; /*< User-specified context format */ 69d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul GLint userRowLength; /*< user-specified number of pixels per row */ 70d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul GLint rInd, gInd, bInd, aInd;/*< index offsets for RGBA formats */ 71d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul GLvoid *rowaddr[MAX_HEIGHT]; /*< address of first pixel in each image row */ 72d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul GLboolean yup; /*< TRUE -> Y increases upward */ 73d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul /*< FALSE -> Y increases downward */ 74afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}; 75afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 76afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 77d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paulstatic INLINE OSMesaContext 78d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian PaulOSMESA_CONTEXT(GLcontext *ctx) 79d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul{ 80d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul /* Just cast, since we're using structure containment */ 81d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul return (OSMesaContext) ctx; 82d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul} 83c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul 84c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul 85afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/**********************************************************************/ 869c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul/*** Private Device Driver Functions ***/ 87afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/**********************************************************************/ 88afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 89afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 909c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paulstatic const GLubyte * 919c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paulget_string( GLcontext *ctx, GLenum name ) 92afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 939c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul (void) ctx; 949c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul switch (name) { 959c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul case GL_RENDERER: 969c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#if CHAN_BITS == 32 979c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul return (const GLubyte *) "Mesa OffScreen32"; 989c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#elif CHAN_BITS == 16 999c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul return (const GLubyte *) "Mesa OffScreen16"; 1009c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#else 1019c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul return (const GLubyte *) "Mesa OffScreen"; 1029c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#endif 1039c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul default: 1049c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul return NULL; 1059c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul } 1062bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul} 1072bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul 1082bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul 1099c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paulstatic void 1109c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paulosmesa_update_state( GLcontext *ctx, GLuint new_state ) 1119c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul{ 1129c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul /* easy - just propogate */ 1139c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul _swrast_InvalidateState( ctx, new_state ); 1149c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul _swsetup_InvalidateState( ctx, new_state ); 1159c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul _tnl_InvalidateState( ctx, new_state ); 11648f5deab94be832a782a440f55a7bc742d50a62fKeith Whitwell _vbo_InvalidateState( ctx, new_state ); 1179c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul} 1189c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul 1192bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul 1209c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul 1219c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul/**********************************************************************/ 1229c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul/***** Read/write spans/arrays of pixels *****/ 1239c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul/**********************************************************************/ 1245a9026c65d260dc185e072163999f5d810015108Brian Paul 125d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul/* 8-bit RGBA */ 126d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define NAME(PREFIX) PREFIX##_RGBA8 127d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define RB_TYPE GLubyte 1289c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define SPAN_VARS \ 1299c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul const OSMesaContext osmesa = OSMESA_CONTEXT(ctx); 1309c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define INIT_PIXEL_PTR(P, X, Y) \ 131d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul GLubyte *P = (GLubyte *) osmesa->rowaddr[Y] + 4 * (X) 1329c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define INC_PIXEL_PTR(P) P += 4 133e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul#define STORE_PIXEL(DST, X, Y, VALUE) \ 134d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul DST[0] = VALUE[RCOMP]; \ 135d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul DST[1] = VALUE[GCOMP]; \ 136d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul DST[2] = VALUE[BCOMP]; \ 137d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul DST[3] = VALUE[ACOMP] 138286c4cc201390e868c4f9b5ebe14c40db2d74a5dBrian Paul#define STORE_PIXEL_RGB(DST, X, Y, VALUE) \ 139d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul DST[0] = VALUE[RCOMP]; \ 140d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul DST[1] = VALUE[GCOMP]; \ 141d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul DST[2] = VALUE[BCOMP]; \ 142d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul DST[3] = 255 143d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define FETCH_PIXEL(DST, SRC) \ 144d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul DST[RCOMP] = SRC[0]; \ 145d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul DST[GCOMP] = SRC[1]; \ 146d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul DST[BCOMP] = SRC[2]; \ 147d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul DST[ACOMP] = SRC[3] 148d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#include "swrast/s_spantemp.h" 149d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul 150d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul/* 16-bit RGBA */ 151d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define NAME(PREFIX) PREFIX##_RGBA16 152d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define RB_TYPE GLushort 153d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define SPAN_VARS \ 154d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul const OSMesaContext osmesa = OSMESA_CONTEXT(ctx); 155d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define INIT_PIXEL_PTR(P, X, Y) \ 156d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul GLushort *P = (GLushort *) osmesa->rowaddr[Y] + 4 * (X) 157d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define INC_PIXEL_PTR(P) P += 4 158e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul#define STORE_PIXEL(DST, X, Y, VALUE) \ 159e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul DST[0] = VALUE[RCOMP]; \ 160e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul DST[1] = VALUE[GCOMP]; \ 161e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul DST[2] = VALUE[BCOMP]; \ 162e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul DST[3] = VALUE[ACOMP] 163286c4cc201390e868c4f9b5ebe14c40db2d74a5dBrian Paul#define STORE_PIXEL_RGB(DST, X, Y, VALUE) \ 164286c4cc201390e868c4f9b5ebe14c40db2d74a5dBrian Paul DST[0] = VALUE[RCOMP]; \ 165286c4cc201390e868c4f9b5ebe14c40db2d74a5dBrian Paul DST[1] = VALUE[GCOMP]; \ 166286c4cc201390e868c4f9b5ebe14c40db2d74a5dBrian Paul DST[2] = VALUE[BCOMP]; \ 167d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul DST[3] = 65535 168d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define FETCH_PIXEL(DST, SRC) \ 169d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul DST[RCOMP] = SRC[0]; \ 170d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul DST[GCOMP] = SRC[1]; \ 171d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul DST[BCOMP] = SRC[2]; \ 172d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul DST[ACOMP] = SRC[3] 173d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#include "swrast/s_spantemp.h" 174d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul 175d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul/* 32-bit RGBA */ 176d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define NAME(PREFIX) PREFIX##_RGBA32 177d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define RB_TYPE GLfloat 178d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define SPAN_VARS \ 179d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul const OSMesaContext osmesa = OSMESA_CONTEXT(ctx); 180d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define INIT_PIXEL_PTR(P, X, Y) \ 181d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul GLfloat *P = (GLfloat *) osmesa->rowaddr[Y] + 4 * (X) 182d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define INC_PIXEL_PTR(P) P += 4 183d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define STORE_PIXEL(DST, X, Y, VALUE) \ 184d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul DST[0] = MAX2((VALUE[RCOMP]), 0.0F); \ 185d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul DST[1] = MAX2((VALUE[GCOMP]), 0.0F); \ 186d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul DST[2] = MAX2((VALUE[BCOMP]), 0.0F); \ 187d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul DST[3] = CLAMP((VALUE[ACOMP]), 0.0F, 1.0F) 188d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define STORE_PIXEL_RGB(DST, X, Y, VALUE) \ 189d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul DST[0] = MAX2((VALUE[RCOMP]), 0.0F); \ 190d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul DST[1] = MAX2((VALUE[GCOMP]), 0.0F); \ 191d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul DST[2] = MAX2((VALUE[BCOMP]), 0.0F); \ 192d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul DST[3] = 1.0F 193e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul#define FETCH_PIXEL(DST, SRC) \ 194e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul DST[RCOMP] = SRC[0]; \ 195e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul DST[GCOMP] = SRC[1]; \ 196e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul DST[BCOMP] = SRC[2]; \ 19722652f952fbd3968f3d5a3db7898911508d76145Brian Paul DST[ACOMP] = SRC[3] 198eae0439ae6027ba64fba49fe13360d105700905fBrian Paul#include "swrast/s_spantemp.h" 1994c44d63f01a01f134d7e4456d4209edee97f9ef5Brian Paul 200d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul 201d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul/* 8-bit BGRA */ 202d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define NAME(PREFIX) PREFIX##_BGRA8 203d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define RB_TYPE GLubyte 204d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define SPAN_VARS \ 205d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul const OSMesaContext osmesa = OSMESA_CONTEXT(ctx); 206d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define INIT_PIXEL_PTR(P, X, Y) \ 207d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul GLubyte *P = (GLubyte *) osmesa->rowaddr[Y] + 4 * (X) 208d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define INC_PIXEL_PTR(P) P += 4 209d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define STORE_PIXEL(DST, X, Y, VALUE) \ 210d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul DST[2] = VALUE[RCOMP]; \ 211d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul DST[1] = VALUE[GCOMP]; \ 212d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul DST[0] = VALUE[BCOMP]; \ 213d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul DST[3] = VALUE[ACOMP] 214d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define STORE_PIXEL_RGB(DST, X, Y, VALUE) \ 215d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul DST[2] = VALUE[RCOMP]; \ 216d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul DST[1] = VALUE[GCOMP]; \ 217d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul DST[0] = VALUE[BCOMP]; \ 218d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul DST[3] = 255 219d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define FETCH_PIXEL(DST, SRC) \ 220d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul DST[RCOMP] = SRC[2]; \ 221d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul DST[GCOMP] = SRC[1]; \ 222d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul DST[BCOMP] = SRC[0]; \ 223d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul DST[ACOMP] = SRC[3] 224d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#include "swrast/s_spantemp.h" 225d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul 226d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul/* 16-bit BGRA */ 227d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define NAME(PREFIX) PREFIX##_BGRA16 228d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define RB_TYPE GLushort 2299c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define SPAN_VARS \ 2309c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul const OSMesaContext osmesa = OSMESA_CONTEXT(ctx); 2319c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define INIT_PIXEL_PTR(P, X, Y) \ 232d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul GLushort *P = (GLushort *) osmesa->rowaddr[Y] + 4 * (X) 2339c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define INC_PIXEL_PTR(P) P += 4 234e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul#define STORE_PIXEL(DST, X, Y, VALUE) \ 235e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul DST[2] = VALUE[RCOMP]; \ 236e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul DST[1] = VALUE[GCOMP]; \ 237e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul DST[0] = VALUE[BCOMP]; \ 238e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul DST[3] = VALUE[ACOMP] 239286c4cc201390e868c4f9b5ebe14c40db2d74a5dBrian Paul#define STORE_PIXEL_RGB(DST, X, Y, VALUE) \ 240286c4cc201390e868c4f9b5ebe14c40db2d74a5dBrian Paul DST[2] = VALUE[RCOMP]; \ 241286c4cc201390e868c4f9b5ebe14c40db2d74a5dBrian Paul DST[1] = VALUE[GCOMP]; \ 242286c4cc201390e868c4f9b5ebe14c40db2d74a5dBrian Paul DST[0] = VALUE[BCOMP]; \ 243d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul DST[3] = 65535 244e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul#define FETCH_PIXEL(DST, SRC) \ 245e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul DST[RCOMP] = SRC[2]; \ 246e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul DST[GCOMP] = SRC[1]; \ 247e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul DST[BCOMP] = SRC[0]; \ 24822652f952fbd3968f3d5a3db7898911508d76145Brian Paul DST[ACOMP] = SRC[3] 249eae0439ae6027ba64fba49fe13360d105700905fBrian Paul#include "swrast/s_spantemp.h" 2509c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul 251d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul/* 32-bit BGRA */ 252d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define NAME(PREFIX) PREFIX##_BGRA32 253d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define RB_TYPE GLfloat 2549c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define SPAN_VARS \ 2559c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul const OSMesaContext osmesa = OSMESA_CONTEXT(ctx); 2569c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define INIT_PIXEL_PTR(P, X, Y) \ 257d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul GLfloat *P = (GLfloat *) osmesa->rowaddr[Y] + 4 * (X) 258d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define INC_PIXEL_PTR(P) P += 4 259d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define STORE_PIXEL(DST, X, Y, VALUE) \ 260d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul DST[2] = VALUE[RCOMP]; \ 261d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul DST[1] = VALUE[GCOMP]; \ 262d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul DST[0] = VALUE[BCOMP]; \ 263d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul DST[3] = VALUE[ACOMP] 264d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define STORE_PIXEL_RGB(DST, X, Y, VALUE) \ 265d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul DST[2] = VALUE[RCOMP]; \ 266d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul DST[1] = VALUE[GCOMP]; \ 267d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul DST[0] = VALUE[BCOMP]; \ 268d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul DST[3] = 1.0F 269d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define FETCH_PIXEL(DST, SRC) \ 270d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul DST[RCOMP] = SRC[2]; \ 271d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul DST[GCOMP] = SRC[1]; \ 272d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul DST[BCOMP] = SRC[0]; \ 273d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul DST[ACOMP] = SRC[3] 274d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#include "swrast/s_spantemp.h" 275d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul 276d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul 277d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul/* 8-bit ARGB */ 278d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define NAME(PREFIX) PREFIX##_ARGB8 279d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define RB_TYPE GLubyte 280d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define SPAN_VARS \ 281d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul const OSMesaContext osmesa = OSMESA_CONTEXT(ctx); 282d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define INIT_PIXEL_PTR(P, X, Y) \ 283d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul GLubyte *P = (GLubyte *) osmesa->rowaddr[Y] + 4 * (X) 284d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define INC_PIXEL_PTR(P) P += 4 285d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define STORE_PIXEL(DST, X, Y, VALUE) \ 286d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul DST[1] = VALUE[RCOMP]; \ 287d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul DST[2] = VALUE[GCOMP]; \ 288d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul DST[3] = VALUE[BCOMP]; \ 289d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul DST[0] = VALUE[ACOMP] 290d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define STORE_PIXEL_RGB(DST, X, Y, VALUE) \ 291d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul DST[1] = VALUE[RCOMP]; \ 292d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul DST[2] = VALUE[GCOMP]; \ 293d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul DST[3] = VALUE[BCOMP]; \ 294d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul DST[0] = 255 295d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define FETCH_PIXEL(DST, SRC) \ 296d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul DST[RCOMP] = SRC[1]; \ 297d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul DST[GCOMP] = SRC[2]; \ 298d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul DST[BCOMP] = SRC[3]; \ 299d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul DST[ACOMP] = SRC[0] 300d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#include "swrast/s_spantemp.h" 301d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul 302d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul/* 16-bit ARGB */ 303d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define NAME(PREFIX) PREFIX##_ARGB16 304d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define RB_TYPE GLushort 305d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define SPAN_VARS \ 306d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul const OSMesaContext osmesa = OSMESA_CONTEXT(ctx); 307d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define INIT_PIXEL_PTR(P, X, Y) \ 308d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul GLushort *P = (GLushort *) osmesa->rowaddr[Y] + 4 * (X) 3099c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define INC_PIXEL_PTR(P) P += 4 310e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul#define STORE_PIXEL(DST, X, Y, VALUE) \ 311e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul DST[1] = VALUE[RCOMP]; \ 312e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul DST[2] = VALUE[GCOMP]; \ 313e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul DST[3] = VALUE[BCOMP]; \ 314e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul DST[0] = VALUE[ACOMP] 315286c4cc201390e868c4f9b5ebe14c40db2d74a5dBrian Paul#define STORE_PIXEL_RGB(DST, X, Y, VALUE) \ 316286c4cc201390e868c4f9b5ebe14c40db2d74a5dBrian Paul DST[1] = VALUE[RCOMP]; \ 317286c4cc201390e868c4f9b5ebe14c40db2d74a5dBrian Paul DST[2] = VALUE[GCOMP]; \ 318286c4cc201390e868c4f9b5ebe14c40db2d74a5dBrian Paul DST[3] = VALUE[BCOMP]; \ 319d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul DST[0] = 65535 320e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul#define FETCH_PIXEL(DST, SRC) \ 321e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul DST[RCOMP] = SRC[1]; \ 322e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul DST[GCOMP] = SRC[2]; \ 323e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul DST[BCOMP] = SRC[3]; \ 32422652f952fbd3968f3d5a3db7898911508d76145Brian Paul DST[ACOMP] = SRC[0] 325eae0439ae6027ba64fba49fe13360d105700905fBrian Paul#include "swrast/s_spantemp.h" 3269c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul 327d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul/* 32-bit ARGB */ 328d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define NAME(PREFIX) PREFIX##_ARGB32 329d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define RB_TYPE GLfloat 3309c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define SPAN_VARS \ 3319c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul const OSMesaContext osmesa = OSMESA_CONTEXT(ctx); 3329c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define INIT_PIXEL_PTR(P, X, Y) \ 333d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul GLfloat *P = (GLfloat *) osmesa->rowaddr[Y] + 4 * (X) 334d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define INC_PIXEL_PTR(P) P += 4 335d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define STORE_PIXEL(DST, X, Y, VALUE) \ 336d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul DST[1] = VALUE[RCOMP]; \ 337d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul DST[2] = VALUE[GCOMP]; \ 338d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul DST[3] = VALUE[BCOMP]; \ 339d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul DST[0] = VALUE[ACOMP] 340d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define STORE_PIXEL_RGB(DST, X, Y, VALUE) \ 341d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul DST[1] = VALUE[RCOMP]; \ 342d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul DST[2] = VALUE[GCOMP]; \ 343d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul DST[3] = VALUE[BCOMP]; \ 344d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul DST[0] = 1.0F 345d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define FETCH_PIXEL(DST, SRC) \ 346d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul DST[RCOMP] = SRC[1]; \ 347d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul DST[GCOMP] = SRC[2]; \ 348d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul DST[BCOMP] = SRC[3]; \ 349d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul DST[ACOMP] = SRC[0] 350d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#include "swrast/s_spantemp.h" 351d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul 352d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul 353d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul/* 8-bit RGB */ 354d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define NAME(PREFIX) PREFIX##_RGB8 355d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define RB_TYPE GLubyte 356d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define SPAN_VARS \ 357d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul const OSMesaContext osmesa = OSMESA_CONTEXT(ctx); 358d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define INIT_PIXEL_PTR(P, X, Y) \ 359d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul GLubyte *P = (GLubyte *) osmesa->rowaddr[Y] + 3 * (X) 3603340a9ea9ea31e6bd7f37d5c1f25ffcc97f20a6bBrian Paul#define INC_PIXEL_PTR(P) P += 3 361e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul#define STORE_PIXEL(DST, X, Y, VALUE) \ 362e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul DST[0] = VALUE[RCOMP]; \ 363e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul DST[1] = VALUE[GCOMP]; \ 364e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul DST[2] = VALUE[BCOMP] 365e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul#define FETCH_PIXEL(DST, SRC) \ 366e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul DST[RCOMP] = SRC[0]; \ 367e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul DST[GCOMP] = SRC[1]; \ 368e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul DST[BCOMP] = SRC[2]; \ 369d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul DST[ACOMP] = 255 370eae0439ae6027ba64fba49fe13360d105700905fBrian Paul#include "swrast/s_spantemp.h" 3719c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul 372d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul/* 16-bit RGB */ 373d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define NAME(PREFIX) PREFIX##_RGB16 374d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define RB_TYPE GLushort 375d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define SPAN_VARS \ 376d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul const OSMesaContext osmesa = OSMESA_CONTEXT(ctx); 377d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define INIT_PIXEL_PTR(P, X, Y) \ 378d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul GLushort *P = (GLushort *) osmesa->rowaddr[Y] + 3 * (X) 379d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define INC_PIXEL_PTR(P) P += 3 380d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define STORE_PIXEL(DST, X, Y, VALUE) \ 381d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul DST[0] = VALUE[RCOMP]; \ 382d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul DST[1] = VALUE[GCOMP]; \ 383d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul DST[2] = VALUE[BCOMP] 384d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define FETCH_PIXEL(DST, SRC) \ 385d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul DST[RCOMP] = SRC[0]; \ 386d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul DST[GCOMP] = SRC[1]; \ 387d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul DST[BCOMP] = SRC[2]; \ 388d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul DST[ACOMP] = 65535U 389d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#include "swrast/s_spantemp.h" 390d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul 391d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul/* 32-bit RGB */ 392d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define NAME(PREFIX) PREFIX##_RGB32 393d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define RB_TYPE GLfloat 394d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define SPAN_VARS \ 395d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul const OSMesaContext osmesa = OSMESA_CONTEXT(ctx); 396d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define INIT_PIXEL_PTR(P, X, Y) \ 397d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul GLfloat *P = (GLfloat *) osmesa->rowaddr[Y] + 3 * (X) 398d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define INC_PIXEL_PTR(P) P += 3 399d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define STORE_PIXEL(DST, X, Y, VALUE) \ 400d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul DST[0] = VALUE[RCOMP]; \ 401d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul DST[1] = VALUE[GCOMP]; \ 402d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul DST[2] = VALUE[BCOMP] 403d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define FETCH_PIXEL(DST, SRC) \ 404d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul DST[RCOMP] = SRC[0]; \ 405d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul DST[GCOMP] = SRC[1]; \ 406d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul DST[BCOMP] = SRC[2]; \ 407d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul DST[ACOMP] = 1.0F 408d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#include "swrast/s_spantemp.h" 409d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul 410d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul 411d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul/* 8-bit BGR */ 412d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define NAME(PREFIX) PREFIX##_BGR8 413d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define RB_TYPE GLubyte 4149c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define SPAN_VARS \ 4159c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul const OSMesaContext osmesa = OSMESA_CONTEXT(ctx); 4169c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define INIT_PIXEL_PTR(P, X, Y) \ 417d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul GLubyte *P = (GLubyte *) osmesa->rowaddr[Y] + 3 * (X) 4183340a9ea9ea31e6bd7f37d5c1f25ffcc97f20a6bBrian Paul#define INC_PIXEL_PTR(P) P += 3 419e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul#define STORE_PIXEL(DST, X, Y, VALUE) \ 420e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul DST[2] = VALUE[RCOMP]; \ 421e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul DST[1] = VALUE[GCOMP]; \ 422e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul DST[0] = VALUE[BCOMP] 423e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul#define FETCH_PIXEL(DST, SRC) \ 424e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul DST[RCOMP] = SRC[2]; \ 425e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul DST[GCOMP] = SRC[1]; \ 426e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul DST[BCOMP] = SRC[0]; \ 427d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul DST[ACOMP] = 255 428eae0439ae6027ba64fba49fe13360d105700905fBrian Paul#include "swrast/s_spantemp.h" 4299c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul 430d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul/* 16-bit BGR */ 431d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define NAME(PREFIX) PREFIX##_BGR16 432d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define RB_TYPE GLushort 433d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define SPAN_VARS \ 434d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul const OSMesaContext osmesa = OSMESA_CONTEXT(ctx); 435d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define INIT_PIXEL_PTR(P, X, Y) \ 436d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul GLushort *P = (GLushort *) osmesa->rowaddr[Y] + 3 * (X) 437d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define INC_PIXEL_PTR(P) P += 3 438d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define STORE_PIXEL(DST, X, Y, VALUE) \ 439d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul DST[2] = VALUE[RCOMP]; \ 440d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul DST[1] = VALUE[GCOMP]; \ 441d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul DST[0] = VALUE[BCOMP] 442d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define FETCH_PIXEL(DST, SRC) \ 443d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul DST[RCOMP] = SRC[2]; \ 444d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul DST[GCOMP] = SRC[1]; \ 445d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul DST[BCOMP] = SRC[0]; \ 446d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul DST[ACOMP] = 65535 447d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#include "swrast/s_spantemp.h" 448d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul 449d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul/* 32-bit BGR */ 450d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define NAME(PREFIX) PREFIX##_BGR32 451d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define RB_TYPE GLfloat 452d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define SPAN_VARS \ 453d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul const OSMesaContext osmesa = OSMESA_CONTEXT(ctx); 454d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define INIT_PIXEL_PTR(P, X, Y) \ 455d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul GLfloat *P = (GLfloat *) osmesa->rowaddr[Y] + 3 * (X) 456d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define INC_PIXEL_PTR(P) P += 3 457d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define STORE_PIXEL(DST, X, Y, VALUE) \ 458d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul DST[2] = VALUE[RCOMP]; \ 459d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul DST[1] = VALUE[GCOMP]; \ 460d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul DST[0] = VALUE[BCOMP] 461d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define FETCH_PIXEL(DST, SRC) \ 462d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul DST[RCOMP] = SRC[2]; \ 463d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul DST[GCOMP] = SRC[1]; \ 464d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul DST[BCOMP] = SRC[0]; \ 465d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul DST[ACOMP] = 1.0F 466d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#include "swrast/s_spantemp.h" 467d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul 468d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul 469d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul/* 16-bit 5/6/5 RGB */ 4709c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define NAME(PREFIX) PREFIX##_RGB_565 471d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define RB_TYPE GLubyte 4729c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define SPAN_VARS \ 4739c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul const OSMesaContext osmesa = OSMESA_CONTEXT(ctx); 4749c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define INIT_PIXEL_PTR(P, X, Y) \ 4759c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul GLushort *P = (GLushort *) osmesa->rowaddr[Y] + (X) 4769c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define INC_PIXEL_PTR(P) P += 1 477e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul#define STORE_PIXEL(DST, X, Y, VALUE) \ 478e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul *DST = ( (((VALUE[RCOMP]) & 0xf8) << 8) | (((VALUE[GCOMP]) & 0xfc) << 3) | ((VALUE[BCOMP]) >> 3) ) 479e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul#define FETCH_PIXEL(DST, SRC) \ 480e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul DST[RCOMP] = ( (((*SRC) >> 8) & 0xf8) | (((*SRC) >> 11) & 0x7) ); \ 481e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul DST[GCOMP] = ( (((*SRC) >> 3) & 0xfc) | (((*SRC) >> 5) & 0x3) ); \ 482e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul DST[BCOMP] = ( (((*SRC) << 3) & 0xf8) | (((*SRC) ) & 0x7) ); \ 483e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul DST[ACOMP] = CHAN_MAX 484eae0439ae6027ba64fba49fe13360d105700905fBrian Paul#include "swrast/s_spantemp.h" 485d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul 4869c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul 48720215ecc7ded503d7d9cb6e8ba2f7a9c1621dd15Brian Paul/** 48820215ecc7ded503d7d9cb6e8ba2f7a9c1621dd15Brian Paul * Macros for optimized line/triangle rendering. 48920215ecc7ded503d7d9cb6e8ba2f7a9c1621dd15Brian Paul * Only for 8-bit channel, RGBA, BGRA, ARGB formats. 49020215ecc7ded503d7d9cb6e8ba2f7a9c1621dd15Brian Paul */ 491afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 4929c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define PACK_RGBA(DST, R, G, B, A) \ 4939c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Pauldo { \ 4949c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul (DST)[osmesa->rInd] = R; \ 4959c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul (DST)[osmesa->gInd] = G; \ 4969c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul (DST)[osmesa->bInd] = B; \ 4979c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul (DST)[osmesa->aInd] = A; \ 4989c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul} while (0) 4999c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul 500d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul#define PIXELADDR4(X,Y) ((GLchan *) osmesa->rowaddr[Y] + 4 * (X)) 501afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 5022bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul 50320215ecc7ded503d7d9cb6e8ba2f7a9c1621dd15Brian Paul/** 5049c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * Draw a flat-shaded, RGB line into an osmesa buffer. 505afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */ 50622a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul#define NAME flat_rgba_line 50722a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul#define CLIP_HACK 1 50822a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul#define SETUP_CODE \ 50922a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul const OSMesaContext osmesa = OSMESA_CONTEXT(ctx); \ 5109c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul const GLchan *color = vert1->color; 511709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell 5129c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define PLOT(X, Y) \ 5139c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Pauldo { \ 5149c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul GLchan *p = PIXELADDR4(X, Y); \ 5159c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul PACK_RGBA(p, color[0], color[1], color[2], color[3]); \ 5169c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul} while (0) 517afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 5189c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#ifdef WIN32 5199c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#include "..\swrast\s_linetemp.h" 5209c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#else 5219c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#include "swrast/s_linetemp.h" 5229c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#endif 52322a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul 524afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 525afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 52620215ecc7ded503d7d9cb6e8ba2f7a9c1621dd15Brian Paul/** 5279c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * Draw a flat-shaded, Z-less, RGB line into an osmesa buffer. 528afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */ 52922a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul#define NAME flat_rgba_z_line 53022a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul#define CLIP_HACK 1 5319c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define INTERP_Z 1 5329c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE 53322a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul#define SETUP_CODE \ 53422a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul const OSMesaContext osmesa = OSMESA_CONTEXT(ctx); \ 53522a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul const GLchan *color = vert1->color; 53622a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul 5379c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define PLOT(X, Y) \ 5389c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Pauldo { \ 5399c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul if (Z < *zPtr) { \ 5409c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul GLchan *p = PIXELADDR4(X, Y); \ 5419c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul PACK_RGBA(p, color[RCOMP], color[GCOMP], \ 5429c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul color[BCOMP], color[ACOMP]); \ 5439c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul *zPtr = Z; \ 5449c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul } \ 5459c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul} while (0) 54674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul 5479c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#ifdef WIN32 5489c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#include "..\swrast\s_linetemp.h" 5499c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#else 5509c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#include "swrast/s_linetemp.h" 5519c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#endif 552206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul 553afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 554afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 555d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul/** 5569c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * Analyze context state to see if we can provide a fast line drawing 557d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul * function. Otherwise, return NULL. 5589c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul */ 5599c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paulstatic swrast_line_func 5609c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paulosmesa_choose_line_function( GLcontext *ctx ) 561afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 5629c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul const OSMesaContext osmesa = OSMESA_CONTEXT(ctx); 5639c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul const SWcontext *swrast = SWRAST_CONTEXT(ctx); 564afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 565544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul if (osmesa->rb->DataType != GL_UNSIGNED_BYTE) 566544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul return NULL; 567544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul 5689c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul if (ctx->RenderMode != GL_RENDER) return NULL; 5699c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul if (ctx->Line.SmoothFlag) return NULL; 5709c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul if (ctx->Texture._EnabledUnits) return NULL; 5719c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul if (ctx->Light.ShadeModel != GL_FLAT) return NULL; 5729c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul if (ctx->Line.Width != 1.0F) return NULL; 5739c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul if (ctx->Line.StippleFlag) return NULL; 5749c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul if (ctx->Line.SmoothFlag) return NULL; 5759c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul if (osmesa->format != OSMESA_RGBA && 5769c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul osmesa->format != OSMESA_BGRA && 5779c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul osmesa->format != OSMESA_ARGB) return NULL; 5789c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul 5799c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul if (swrast->_RasterMask==DEPTH_BIT 5809c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul && ctx->Depth.Func==GL_LESS 5819c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul && ctx->Depth.Mask==GL_TRUE 5829c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul && ctx->Visual.depthBits == DEFAULT_SOFTWARE_DEPTH_BITS) { 5839c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul return (swrast_line_func) flat_rgba_z_line; 584afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 585afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 5869c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul if (swrast->_RasterMask == 0) { 5879c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul return (swrast_line_func) flat_rgba_line; 588afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 5899c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul 5909c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul return (swrast_line_func) NULL; 591afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 592afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 5939c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul 5949c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul/**********************************************************************/ 5959c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul/***** Optimized triangle rendering *****/ 5969c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul/**********************************************************************/ 5979c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul 5989c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul 59923ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank/* 6009c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * Smooth-shaded, z-less triangle, RGBA color. 60123ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank */ 6029c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define NAME smooth_rgba_z_triangle 6039c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define INTERP_Z 1 6049c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE 6059c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define INTERP_RGB 1 6069c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define INTERP_ALPHA 1 6079c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define SETUP_CODE \ 6089c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul const OSMesaContext osmesa = OSMESA_CONTEXT(ctx); 6095bdec89da520f763b6d0faad1781f64566a97fddKarl Schultz#define RENDER_SPAN( span ) { \ 6109c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul GLuint i; \ 6119c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul GLchan *img = PIXELADDR4(span.x, span.y); \ 6129c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul for (i = 0; i < span.end; i++, img += 4) { \ 6134092fbd55ac92a59d09d5167ced328683bed049cBrian Paul const GLuint z = FixedToDepth(span.z); \ 6149c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul if (z < zRow[i]) { \ 6159c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul PACK_RGBA(img, FixedToChan(span.red), \ 6169c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul FixedToChan(span.green), FixedToChan(span.blue), \ 6179c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul FixedToChan(span.alpha)); \ 6189c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul zRow[i] = z; \ 6199c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul } \ 6209c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul span.red += span.redStep; \ 6219c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul span.green += span.greenStep; \ 6229c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul span.blue += span.blueStep; \ 6239c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul span.alpha += span.alphaStep; \ 6249c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul span.z += span.zStep; \ 6255bdec89da520f763b6d0faad1781f64566a97fddKarl Schultz } \ 6265bdec89da520f763b6d0faad1781f64566a97fddKarl Schultz} 6279c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#ifdef WIN32 6289c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#include "..\swrast\s_tritemp.h" 6299c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#else 6309c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#include "swrast/s_tritemp.h" 6319c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#endif 63201dc182ee86922845ba0b17a2cda9af19150c93aBrian Paul 633afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 634afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 635afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/* 6369c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * Flat-shaded, z-less triangle, RGBA color. 637afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */ 6389c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define NAME flat_rgba_z_triangle 6399c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define INTERP_Z 1 6409c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE 6419c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#define SETUP_CODE \ 6429c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul const OSMesaContext osmesa = OSMESA_CONTEXT(ctx); \ 6439c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul GLuint pixel; \ 6449c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul PACK_RGBA((GLchan *) &pixel, v2->color[0], v2->color[1], \ 6459c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul v2->color[2], v2->color[3]); 646afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 6475bdec89da520f763b6d0faad1781f64566a97fddKarl Schultz#define RENDER_SPAN( span ) { \ 6489c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul GLuint i; \ 6499c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul GLuint *img = (GLuint *) PIXELADDR4(span.x, span.y); \ 6509c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul for (i = 0; i < span.end; i++) { \ 6514092fbd55ac92a59d09d5167ced328683bed049cBrian Paul const GLuint z = FixedToDepth(span.z); \ 6529c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul if (z < zRow[i]) { \ 6539c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul img[i] = pixel; \ 6549c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul zRow[i] = z; \ 6559c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul } \ 6569c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul span.z += span.zStep; \ 6575bdec89da520f763b6d0faad1781f64566a97fddKarl Schultz } \ 6585bdec89da520f763b6d0faad1781f64566a97fddKarl Schultz} 6599c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#ifdef WIN32 6609c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#include "..\swrast\s_tritemp.h" 6614336c28c843923db3d9c8dc0a0cb2440ba94f064Brian Paul#else 6629c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul#include "swrast/s_tritemp.h" 6634336c28c843923db3d9c8dc0a0cb2440ba94f064Brian Paul#endif 66474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul 665afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 666afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 667d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul/** 668d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul * Return pointer to an optimized triangle function if possible. 6699c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul */ 6709c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paulstatic swrast_tri_func 6719c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paulosmesa_choose_triangle_function( GLcontext *ctx ) 672afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 6739c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul const OSMesaContext osmesa = OSMESA_CONTEXT(ctx); 6749c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul const SWcontext *swrast = SWRAST_CONTEXT(ctx); 675dd020f13a6d520b46aefd4453dae6b6edcc427f6Brian Paul 676544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul if (osmesa->rb->DataType != GL_UNSIGNED_BYTE) 677544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul return (swrast_tri_func) NULL; 678544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul 6799c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul if (ctx->RenderMode != GL_RENDER) return (swrast_tri_func) NULL; 6809c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul if (ctx->Polygon.SmoothFlag) return (swrast_tri_func) NULL; 6819c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul if (ctx->Polygon.StippleFlag) return (swrast_tri_func) NULL; 6829c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul if (ctx->Texture._EnabledUnits) return (swrast_tri_func) NULL; 6839c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul if (osmesa->format != OSMESA_RGBA && 6849c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul osmesa->format != OSMESA_BGRA && 6859c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul osmesa->format != OSMESA_ARGB) return (swrast_tri_func) NULL; 6869c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul if (ctx->Polygon.CullFlag && 6879c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul ctx->Polygon.CullFaceMode == GL_FRONT_AND_BACK) 6889c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul return (swrast_tri_func) NULL; 68974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul 6909c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul if (swrast->_RasterMask == DEPTH_BIT && 6919c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul ctx->Depth.Func == GL_LESS && 6929c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul ctx->Depth.Mask == GL_TRUE && 6939c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul ctx->Visual.depthBits == DEFAULT_SOFTWARE_DEPTH_BITS) { 6949c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul if (ctx->Light.ShadeModel == GL_SMOOTH) { 6959c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul return (swrast_tri_func) smooth_rgba_z_triangle; 6969c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul } 6979c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul else { 6989c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul return (swrast_tri_func) flat_rgba_z_triangle; 699afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 700afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 7019c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul return (swrast_tri_func) NULL; 702afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 703afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 704afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 705afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 7069c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul/* Override for the swrast triangle-selection function. Try to use one 7079c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * of our internal triangle functions, otherwise fall back to the 7089c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * standard swrast functions. 7099c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul */ 7109c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paulstatic void 7119c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paulosmesa_choose_triangle( GLcontext *ctx ) 712afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 7139c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul SWcontext *swrast = SWRAST_CONTEXT(ctx); 714afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 7159c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul swrast->Triangle = osmesa_choose_triangle_function( ctx ); 7169c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul if (!swrast->Triangle) 7179c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul _swrast_choose_triangle( ctx ); 7189c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul} 719afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 72074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void 7219c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paulosmesa_choose_line( GLcontext *ctx ) 722afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 7239c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul SWcontext *swrast = SWRAST_CONTEXT(ctx); 7249c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul 7259c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul swrast->Line = osmesa_choose_line_function( ctx ); 7269c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul if (!swrast->Line) 7279c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul _swrast_choose_line( ctx ); 728afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 729afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 730afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 731544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul 732544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul/** 733544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul * Recompute the values of the context's rowaddr array. 734544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul */ 735544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paulstatic void 736544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paulcompute_row_addresses( OSMesaContext osmesa ) 737544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul{ 738544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul GLint bytesPerPixel, bytesPerRow, i; 739544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul GLubyte *origin = (GLubyte *) osmesa->rb->Data; 740544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul GLint bpc; /* bytes per channel */ 741544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul GLint rowlength; /* in pixels */ 742544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul GLint height = osmesa->rb->Height; 743544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul 744544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul if (osmesa->userRowLength) 745544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul rowlength = osmesa->userRowLength; 746544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul else 747544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul rowlength = osmesa->rb->Width; 748544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul 749544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul if (osmesa->rb->DataType == GL_UNSIGNED_BYTE) 750544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul bpc = 1; 751544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul else if (osmesa->rb->DataType == GL_UNSIGNED_SHORT) 752544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul bpc = 2; 753544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul else if (osmesa->rb->DataType == GL_FLOAT) 754544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul bpc = 4; 755544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul else { 756544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul _mesa_problem(&osmesa->mesa, 757544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul "Unexpected datatype in osmesa::compute_row_addresses"); 758544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul return; 759544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul } 760544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul 761641705f0329c038079650089a664d76abfc5a937Ian Romanick if ((osmesa->format == OSMESA_RGB) || (osmesa->format == OSMESA_BGR)) { 762544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul /* RGB mode */ 763544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul bytesPerPixel = 3 * bpc; 764544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul } 765544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul else if (osmesa->format == OSMESA_RGB_565) { 766544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul /* 5/6/5 RGB pixel in 16 bits */ 767544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul bytesPerPixel = 2; 768544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul } 769544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul else { 770544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul /* RGBA mode */ 771544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul bytesPerPixel = 4 * bpc; 772544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul } 773544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul 774544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul bytesPerRow = rowlength * bytesPerPixel; 775544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul 776544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul if (osmesa->yup) { 777544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul /* Y=0 is bottom line of window */ 778544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul for (i = 0; i < height; i++) { 779544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul osmesa->rowaddr[i] = (GLvoid *) ((GLubyte *) origin + i * bytesPerRow); 780544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul } 781544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul } 782544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul else { 783544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul /* Y=0 is top line of window */ 784544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul for (i = 0; i < height; i++) { 785544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul GLint j = height - i - 1; 786544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul osmesa->rowaddr[i] = (GLvoid *) ((GLubyte *) origin + j * bytesPerRow); 787544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul } 788544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul } 789544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul} 790544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul 791544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul 792544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul 793e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul/** 794e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul * Don't use _mesa_delete_renderbuffer since we can't free rb->Data. 795e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul */ 79674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void 797e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paulosmesa_delete_renderbuffer(struct gl_renderbuffer *rb) 798afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 79932f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg free(rb); 800e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul} 801e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul 802e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul 803e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul/** 804e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul * Allocate renderbuffer storage. We don't actually allocate any storage 805e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul * since we're using a user-provided buffer. 806e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul * Just set up all the gl_renderbuffer methods. 807e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul */ 808e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paulstatic GLboolean 809e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paulosmesa_renderbuffer_storage(GLcontext *ctx, struct gl_renderbuffer *rb, 810e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul GLenum internalFormat, GLuint width, GLuint height) 811e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul{ 812e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul const OSMesaContext osmesa = OSMESA_CONTEXT(ctx); 813d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul GLint bpc; /* bits per channel */ 814d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul 815d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul if (rb->DataType == GL_UNSIGNED_BYTE) 816d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul bpc = 8; 817d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul else if (rb->DataType == GL_UNSIGNED_SHORT) 818d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul bpc = 16; 819d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul else 820d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul bpc = 32; 821e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul 8229e81d6ae3a6db9831d6aea0fe4d92722176e9f74Brian Paul /* Note: we can ignoring internalFormat for "window-system" renderbuffers */ 8235bdc6fdebc0ab59a888fba15136eb4a0ee2790e1Brian Paul (void) internalFormat; 8245bdc6fdebc0ab59a888fba15136eb4a0ee2790e1Brian Paul 825e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul if (osmesa->format == OSMESA_RGBA) { 826d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul if (rb->DataType == GL_UNSIGNED_BYTE) { 827d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul rb->GetRow = get_row_RGBA8; 828d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul rb->GetValues = get_values_RGBA8; 829d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul rb->PutRow = put_row_RGBA8; 830d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul rb->PutRowRGB = put_row_rgb_RGBA8; 831d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul rb->PutMonoRow = put_mono_row_RGBA8; 832d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul rb->PutValues = put_values_RGBA8; 833d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul rb->PutMonoValues = put_mono_values_RGBA8; 834d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul } 835d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul else if (rb->DataType == GL_UNSIGNED_SHORT) { 836d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul rb->GetRow = get_row_RGBA16; 837d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul rb->GetValues = get_values_RGBA16; 838d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul rb->PutRow = put_row_RGBA16; 839d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul rb->PutRowRGB = put_row_rgb_RGBA16; 840d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul rb->PutMonoRow = put_mono_row_RGBA16; 841d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul rb->PutValues = put_values_RGBA16; 842d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul rb->PutMonoValues = put_mono_values_RGBA16; 843d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul } 844d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul else { 845d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul rb->GetRow = get_row_RGBA32; 846d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul rb->GetValues = get_values_RGBA32; 847d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul rb->PutRow = put_row_RGBA32; 848d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul rb->PutRowRGB = put_row_rgb_RGBA32; 849d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul rb->PutMonoRow = put_mono_row_RGBA32; 850d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul rb->PutValues = put_values_RGBA32; 851d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul rb->PutMonoValues = put_mono_values_RGBA32; 852d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul } 853e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul } 854e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul else if (osmesa->format == OSMESA_BGRA) { 855d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul if (rb->DataType == GL_UNSIGNED_BYTE) { 856d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul rb->GetRow = get_row_BGRA8; 857d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul rb->GetValues = get_values_BGRA8; 858d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul rb->PutRow = put_row_BGRA8; 859d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul rb->PutRowRGB = put_row_rgb_BGRA8; 860d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul rb->PutMonoRow = put_mono_row_BGRA8; 861d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul rb->PutValues = put_values_BGRA8; 862d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul rb->PutMonoValues = put_mono_values_BGRA8; 863d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul } 864d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul else if (rb->DataType == GL_UNSIGNED_SHORT) { 865d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul rb->GetRow = get_row_BGRA16; 866d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul rb->GetValues = get_values_BGRA16; 867d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul rb->PutRow = put_row_BGRA16; 868d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul rb->PutRowRGB = put_row_rgb_BGRA16; 869d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul rb->PutMonoRow = put_mono_row_BGRA16; 870d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul rb->PutValues = put_values_BGRA16; 871d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul rb->PutMonoValues = put_mono_values_BGRA16; 872d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul } 873d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul else { 874d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul rb->GetRow = get_row_BGRA32; 875d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul rb->GetValues = get_values_BGRA32; 876d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul rb->PutRow = put_row_BGRA32; 877d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul rb->PutRowRGB = put_row_rgb_BGRA32; 878d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul rb->PutMonoRow = put_mono_row_BGRA32; 879d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul rb->PutValues = put_values_BGRA32; 880d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul rb->PutMonoValues = put_mono_values_BGRA32; 881d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul } 882e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul } 883e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul else if (osmesa->format == OSMESA_ARGB) { 884d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul if (rb->DataType == GL_UNSIGNED_BYTE) { 885d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul rb->GetRow = get_row_ARGB8; 886d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul rb->GetValues = get_values_ARGB8; 887d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul rb->PutRow = put_row_ARGB8; 888d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul rb->PutRowRGB = put_row_rgb_ARGB8; 889d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul rb->PutMonoRow = put_mono_row_ARGB8; 890d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul rb->PutValues = put_values_ARGB8; 891d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul rb->PutMonoValues = put_mono_values_ARGB8; 892d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul } 893d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul else if (rb->DataType == GL_UNSIGNED_SHORT) { 894d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul rb->GetRow = get_row_ARGB16; 895d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul rb->GetValues = get_values_ARGB16; 896d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul rb->PutRow = put_row_ARGB16; 897d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul rb->PutRowRGB = put_row_rgb_ARGB16; 898d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul rb->PutMonoRow = put_mono_row_ARGB16; 899d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul rb->PutValues = put_values_ARGB16; 900d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul rb->PutMonoValues = put_mono_values_ARGB16; 901d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul } 902d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul else { 903d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul rb->GetRow = get_row_ARGB32; 904d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul rb->GetValues = get_values_ARGB32; 905d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul rb->PutRow = put_row_ARGB32; 906d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul rb->PutRowRGB = put_row_rgb_ARGB32; 907d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul rb->PutMonoRow = put_mono_row_ARGB32; 908d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul rb->PutValues = put_values_ARGB32; 909d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul rb->PutMonoValues = put_mono_values_ARGB32; 910d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul } 911e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul } 912e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul else if (osmesa->format == OSMESA_RGB) { 913d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul if (rb->DataType == GL_UNSIGNED_BYTE) { 914d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul rb->GetRow = get_row_RGB8; 915d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul rb->GetValues = get_values_RGB8; 916d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul rb->PutRow = put_row_RGB8; 917d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul rb->PutRowRGB = put_row_rgb_RGB8; 918d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul rb->PutMonoRow = put_mono_row_RGB8; 919d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul rb->PutValues = put_values_RGB8; 920d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul rb->PutMonoValues = put_mono_values_RGB8; 921d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul } 922d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul else if (rb->DataType == GL_UNSIGNED_SHORT) { 923d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul rb->GetRow = get_row_RGB16; 924d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul rb->GetValues = get_values_RGB16; 925d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul rb->PutRow = put_row_RGB16; 926d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul rb->PutRowRGB = put_row_rgb_RGB16; 927d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul rb->PutMonoRow = put_mono_row_RGB16; 928d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul rb->PutValues = put_values_RGB16; 929d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul rb->PutMonoValues = put_mono_values_RGB16; 930d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul } 931d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul else { 932d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul rb->GetRow = get_row_RGB32; 933d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul rb->GetValues = get_values_RGB32; 934d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul rb->PutRow = put_row_RGB32; 935d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul rb->PutRowRGB = put_row_rgb_RGB32; 936d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul rb->PutMonoRow = put_mono_row_RGB32; 937d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul rb->PutValues = put_values_RGB32; 938d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul rb->PutMonoValues = put_mono_values_RGB32; 939d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul } 940afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 9419c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul else if (osmesa->format == OSMESA_BGR) { 942d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul if (rb->DataType == GL_UNSIGNED_BYTE) { 943d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul rb->GetRow = get_row_BGR8; 944d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul rb->GetValues = get_values_BGR8; 945d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul rb->PutRow = put_row_BGR8; 946d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul rb->PutRowRGB = put_row_rgb_BGR8; 947d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul rb->PutMonoRow = put_mono_row_BGR8; 948d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul rb->PutValues = put_values_BGR8; 949d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul rb->PutMonoValues = put_mono_values_BGR8; 950d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul } 951d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul else if (rb->DataType == GL_UNSIGNED_SHORT) { 952d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul rb->GetRow = get_row_BGR16; 953d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul rb->GetValues = get_values_BGR16; 954d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul rb->PutRow = put_row_BGR16; 955d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul rb->PutRowRGB = put_row_rgb_BGR16; 956d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul rb->PutMonoRow = put_mono_row_BGR16; 957d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul rb->PutValues = put_values_BGR16; 958d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul rb->PutMonoValues = put_mono_values_BGR16; 959d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul } 960d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul else { 961d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul rb->GetRow = get_row_BGR32; 962d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul rb->GetValues = get_values_BGR32; 963d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul rb->PutRow = put_row_BGR32; 964d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul rb->PutRowRGB = put_row_rgb_BGR32; 965d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul rb->PutMonoRow = put_mono_row_BGR32; 966d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul rb->PutValues = put_values_BGR32; 967d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul rb->PutMonoValues = put_mono_values_BGR32; 968d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul } 9699c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul } 9709c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul else if (osmesa->format == OSMESA_RGB_565) { 971d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul ASSERT(rb->DataType == GL_UNSIGNED_BYTE); 972e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul rb->GetRow = get_row_RGB_565; 973e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul rb->GetValues = get_values_RGB_565; 974e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul rb->PutRow = put_row_RGB_565; 9750ad1bda7a1f7d88556dd458e532815ff28c898aeDaniel Borca rb->PutRowRGB = put_row_rgb_RGB_565; 976e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul rb->PutMonoRow = put_mono_row_RGB_565; 977e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul rb->PutValues = put_values_RGB_565; 978e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul rb->PutMonoValues = put_mono_values_RGB_565; 9799c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul } 9809c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul else { 981e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul _mesa_problem(ctx, "bad pixel format in osmesa renderbuffer_storage"); 982afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 983afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 984b100484145d3518e4896d756b1ceccf61382c569Daniel Borca rb->Width = width; 985b100484145d3518e4896d756b1ceccf61382c569Daniel Borca rb->Height = height; 986b100484145d3518e4896d756b1ceccf61382c569Daniel Borca 987544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul compute_row_addresses( osmesa ); 988544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul 989e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul return GL_TRUE; 990afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 991afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 992afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 993e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul/** 994ed875a4cb3cf194637d696b2660b98fdc3b95b0fBrian Paul * Allocate a new renderbuffer to describe the user-provided color buffer. 995e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul */ 996e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paulstatic struct gl_renderbuffer * 997d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paulnew_osmesa_renderbuffer(GLcontext *ctx, GLenum format, GLenum type) 998e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul{ 999d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul const GLuint name = 0; 1000d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul struct gl_renderbuffer *rb = _mesa_new_renderbuffer(ctx, name); 1001e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul if (rb) { 1002216eb81c53908c9ac774a378425691aa66205a88Brian rb->RefCount = 1; 1003e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul rb->Delete = osmesa_delete_renderbuffer; 1004e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul rb->AllocStorage = osmesa_renderbuffer_storage; 1005e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul 1006641705f0329c038079650089a664d76abfc5a937Ian Romanick rb->InternalFormat = GL_RGBA; 100736b3a8bd5a317ab297f44b19fd14c7e76ec2fc77Brian Paul switch (type) { 100836b3a8bd5a317ab297f44b19fd14c7e76ec2fc77Brian Paul case GL_UNSIGNED_BYTE: 100936b3a8bd5a317ab297f44b19fd14c7e76ec2fc77Brian Paul rb->Format = MESA_FORMAT_RGBA8888; 101036b3a8bd5a317ab297f44b19fd14c7e76ec2fc77Brian Paul break; 101136b3a8bd5a317ab297f44b19fd14c7e76ec2fc77Brian Paul case GL_UNSIGNED_SHORT: 101236b3a8bd5a317ab297f44b19fd14c7e76ec2fc77Brian Paul rb->Format = MESA_FORMAT_SIGNED_RGBA_16; 101336b3a8bd5a317ab297f44b19fd14c7e76ec2fc77Brian Paul break; 101436b3a8bd5a317ab297f44b19fd14c7e76ec2fc77Brian Paul case GL_FLOAT: 101536b3a8bd5a317ab297f44b19fd14c7e76ec2fc77Brian Paul rb->Format = MESA_FORMAT_RGBA_FLOAT32; 101636b3a8bd5a317ab297f44b19fd14c7e76ec2fc77Brian Paul break; 101736b3a8bd5a317ab297f44b19fd14c7e76ec2fc77Brian Paul default: 101836b3a8bd5a317ab297f44b19fd14c7e76ec2fc77Brian Paul assert(0 && "Unexpected type in new_osmesa_renderbuffer()"); 101936b3a8bd5a317ab297f44b19fd14c7e76ec2fc77Brian Paul rb->Format = MESA_FORMAT_RGBA8888; 102036b3a8bd5a317ab297f44b19fd14c7e76ec2fc77Brian Paul } 1021641705f0329c038079650089a664d76abfc5a937Ian Romanick rb->_BaseFormat = GL_RGBA; 1022641705f0329c038079650089a664d76abfc5a937Ian Romanick rb->DataType = type; 1023e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul } 1024e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul return rb; 1025e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul} 1026e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul 10279c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul 1028afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/**********************************************************************/ 10299c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul/***** Public Functions *****/ 1030afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/**********************************************************************/ 1031afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1032afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1033d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul/** 10349c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * Create an Off-Screen Mesa rendering context. The only attribute needed is 10359c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * an RGBA vs Color-Index mode flag. 10369c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * 1037641705f0329c038079650089a664d76abfc5a937Ian Romanick * Input: format - Must be GL_RGBA 10389c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * sharelist - specifies another OSMesaContext with which to share 10399c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * display lists. NULL indicates no sharing. 10409c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * Return: an OSMesaContext or 0 if error 10419c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul */ 10429c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian PaulGLAPI OSMesaContext GLAPIENTRY 10439c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian PaulOSMesaCreateContext( GLenum format, OSMesaContext sharelist ) 1044afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 10459c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul return OSMesaCreateContextExt(format, DEFAULT_SOFTWARE_DEPTH_BITS, 1046641705f0329c038079650089a664d76abfc5a937Ian Romanick 8, 0, sharelist); 104774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul} 104874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul 104974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul 105074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul 1051d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul/** 10529c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * New in Mesa 3.5 10539c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * 10549c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * Create context and specify size of ancillary buffers. 10559c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul */ 10569c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian PaulGLAPI OSMesaContext GLAPIENTRY 10579c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian PaulOSMesaCreateContextExt( GLenum format, GLint depthBits, GLint stencilBits, 10589c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul GLint accumBits, OSMesaContext sharelist ) 105974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul{ 10609c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul OSMesaContext osmesa; 1061d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul struct dd_function_table functions; 10629c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul GLint rind, gind, bind, aind; 1063641705f0329c038079650089a664d76abfc5a937Ian Romanick GLint redBits = 0, greenBits = 0, blueBits = 0, alphaBits =0; 1064d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul GLenum type = CHAN_TYPE; 1065afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 10669c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul rind = gind = bind = aind = 0; 1067641705f0329c038079650089a664d76abfc5a937Ian Romanick if (format==OSMESA_RGBA) { 10689c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul redBits = CHAN_BITS; 10699c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul greenBits = CHAN_BITS; 10709c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul blueBits = CHAN_BITS; 10719c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul alphaBits = CHAN_BITS; 10729c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul rind = 0; 10739c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul gind = 1; 10749c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul bind = 2; 10759c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul aind = 3; 1076afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 10779c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul else if (format==OSMESA_BGRA) { 10789c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul redBits = CHAN_BITS; 10799c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul greenBits = CHAN_BITS; 10809c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul blueBits = CHAN_BITS; 10819c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul alphaBits = CHAN_BITS; 10829c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul bind = 0; 10839c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul gind = 1; 10849c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul rind = 2; 10859c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul aind = 3; 1086afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 10879c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul else if (format==OSMESA_ARGB) { 10889c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul redBits = CHAN_BITS; 10899c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul greenBits = CHAN_BITS; 10909c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul blueBits = CHAN_BITS; 10919c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul alphaBits = CHAN_BITS; 10929c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul aind = 0; 10939c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul rind = 1; 10949c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul gind = 2; 10959c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul bind = 3; 1096206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul } 10979c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul else if (format==OSMESA_RGB) { 10989c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul redBits = CHAN_BITS; 10999c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul greenBits = CHAN_BITS; 11009c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul blueBits = CHAN_BITS; 11019c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul alphaBits = 0; 11029c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul rind = 0; 11039c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul gind = 1; 11049c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul bind = 2; 1105afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 11069c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul else if (format==OSMESA_BGR) { 11079c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul redBits = CHAN_BITS; 11089c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul greenBits = CHAN_BITS; 11099c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul blueBits = CHAN_BITS; 11109c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul alphaBits = 0; 11119c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul rind = 2; 11129c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul gind = 1; 11139c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul bind = 0; 1114afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1115cc9464e082b82179e3c4b51ea460212c10b2bf0cBrian Paul#if CHAN_TYPE == GL_UNSIGNED_BYTE 11169c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul else if (format==OSMESA_RGB_565) { 11179c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul redBits = 5; 11189c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul greenBits = 6; 11199c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul blueBits = 5; 11209c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul alphaBits = 0; 11219c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul rind = 0; /* not used */ 11229c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul gind = 0; 11239c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul bind = 0; 1124afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1125cc9464e082b82179e3c4b51ea460212c10b2bf0cBrian Paul#endif 1126afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg else { 11279c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul return NULL; 1128afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1129afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 11309c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul osmesa = (OSMesaContext) CALLOC_STRUCT(osmesa_context); 11319c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul if (osmesa) { 1132fcf438e9e03f6e75bca4a49ad372fe7c4b1abbf8Ian Romanick osmesa->gl_visual = _mesa_create_visual( GL_FALSE, /* double buffer */ 11339c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul GL_FALSE, /* stereo */ 11349c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul redBits, 11359c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul greenBits, 11369c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul blueBits, 11379c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul alphaBits, 11389c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul depthBits, 11399c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul stencilBits, 11409c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul accumBits, 11419c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul accumBits, 11429c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul accumBits, 11439c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul alphaBits ? accumBits : 0, 11449c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul 1 /* num samples */ 11459c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul ); 11469c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul if (!osmesa->gl_visual) { 114732f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg free(osmesa); 11489c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul return NULL; 1149afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1150afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1151d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul /* Initialize device driver function table */ 1152d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul _mesa_init_driver_functions(&functions); 1153d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul /* override with our functions */ 1154d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul functions.GetString = get_string; 1155d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul functions.UpdateState = osmesa_update_state; 1156544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul functions.GetBufferSize = NULL; 11576fafc7ad19a8b7400e57a86b588766b6f3811a05Brian Paul 11586fafc7ad19a8b7400e57a86b588766b6f3811a05Brian Paul if (!_mesa_initialize_context(&osmesa->mesa, 11599c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul osmesa->gl_visual, 11606fafc7ad19a8b7400e57a86b588766b6f3811a05Brian Paul sharelist ? &sharelist->mesa 11619c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul : (GLcontext *) NULL, 1162d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul &functions, (void *) osmesa)) { 11639c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul _mesa_destroy_visual( osmesa->gl_visual ); 116432f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg free(osmesa); 11659c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul return NULL; 1166afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 116774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul 11686fafc7ad19a8b7400e57a86b588766b6f3811a05Brian Paul _mesa_enable_sw_extensions(&(osmesa->mesa)); 11696fafc7ad19a8b7400e57a86b588766b6f3811a05Brian Paul _mesa_enable_1_3_extensions(&(osmesa->mesa)); 11706fafc7ad19a8b7400e57a86b588766b6f3811a05Brian Paul _mesa_enable_1_4_extensions(&(osmesa->mesa)); 117184351999ec6ad07e0cfc31c0b3a8c86da4134bfeBrian Paul _mesa_enable_1_5_extensions(&(osmesa->mesa)); 11725c4ca968fab1b0b993fabeb73e3a5d92cbaadaf1Brian _mesa_enable_2_0_extensions(&(osmesa->mesa)); 11735c4ca968fab1b0b993fabeb73e3a5d92cbaadaf1Brian _mesa_enable_2_1_extensions(&(osmesa->mesa)); 117474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul 1175e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul osmesa->gl_buffer = _mesa_create_framebuffer(osmesa->gl_visual); 11769c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul if (!osmesa->gl_buffer) { 11779c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul _mesa_destroy_visual( osmesa->gl_visual ); 11786fafc7ad19a8b7400e57a86b588766b6f3811a05Brian Paul _mesa_free_context_data( &osmesa->mesa ); 117932f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg free(osmesa); 11809c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul return NULL; 11819c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul } 1182e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul 118336b3a8bd5a317ab297f44b19fd14c7e76ec2fc77Brian Paul /* Create depth/stencil/accum buffers. We'll create the color 118436b3a8bd5a317ab297f44b19fd14c7e76ec2fc77Brian Paul * buffer later in OSMesaMakeCurrent(). 118536b3a8bd5a317ab297f44b19fd14c7e76ec2fc77Brian Paul */ 1186e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul _mesa_add_soft_renderbuffers(osmesa->gl_buffer, 1187e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul GL_FALSE, /* color */ 1188e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul osmesa->gl_visual->haveDepthBuffer, 1189e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul osmesa->gl_visual->haveStencilBuffer, 1190e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul osmesa->gl_visual->haveAccumBuffer, 1191e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul GL_FALSE, /* alpha */ 1192e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul GL_FALSE /* aux */ ); 1193e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul 11949c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul osmesa->format = format; 11959c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul osmesa->userRowLength = 0; 11969c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul osmesa->yup = GL_TRUE; 11979c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul osmesa->rInd = rind; 11989c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul osmesa->gInd = gind; 11999c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul osmesa->bInd = bind; 12009c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul osmesa->aInd = aind; 120174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul 12021741bc1a79b6a243e841bca704f1a720b028124aBrian Paul _mesa_meta_init(&osmesa->mesa); 12031741bc1a79b6a243e841bca704f1a720b028124aBrian Paul 12049c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul /* Initialize the software rasterizer and helper modules. */ 12059c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul { 12066fafc7ad19a8b7400e57a86b588766b6f3811a05Brian Paul GLcontext *ctx = &osmesa->mesa; 1207e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul SWcontext *swrast; 1208e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul TNLcontext *tnl; 1209afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1210c45b7364dab6c3daebc1f1d8d11124af4129074aBrian Paul if (!_swrast_CreateContext( ctx ) || 12110a0fb5e0b3cfe61749af41d4200d42982b551cefKeith Whitwell !_vbo_CreateContext( ctx ) || 1212c45b7364dab6c3daebc1f1d8d11124af4129074aBrian Paul !_tnl_CreateContext( ctx ) || 1213c45b7364dab6c3daebc1f1d8d11124af4129074aBrian Paul !_swsetup_CreateContext( ctx )) { 1214c45b7364dab6c3daebc1f1d8d11124af4129074aBrian Paul _mesa_destroy_visual(osmesa->gl_visual); 1215c45b7364dab6c3daebc1f1d8d11124af4129074aBrian Paul _mesa_free_context_data(ctx); 121632f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg free(osmesa); 1217c45b7364dab6c3daebc1f1d8d11124af4129074aBrian Paul return NULL; 1218c45b7364dab6c3daebc1f1d8d11124af4129074aBrian Paul } 12199c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul 12209c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul _swsetup_Wakeup( ctx ); 1221e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul 1222e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul /* use default TCL pipeline */ 1223e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul tnl = TNL_CONTEXT(ctx); 1224e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul tnl->Driver.RunPipeline = _tnl_run_pipeline; 1225e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul 1226e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul /* Extend the software rasterizer with our optimized line and triangle 1227e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul * drawing functions. 1228e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul */ 1229e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul swrast = SWRAST_CONTEXT( ctx ); 1230e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul swrast->choose_line = osmesa_choose_line; 1231e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul swrast->choose_triangle = osmesa_choose_triangle; 12329c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul } 1233afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 12349c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul return osmesa; 1235afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 1236afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1237afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1238d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul/** 12399c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * Destroy an Off-Screen Mesa rendering context. 12409c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * 1241d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul * \param osmesa the context to destroy 1242afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */ 12439c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian PaulGLAPI void GLAPIENTRY 1244d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian PaulOSMesaDestroyContext( OSMesaContext osmesa ) 1245afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 1246d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul if (osmesa) { 1247216eb81c53908c9ac774a378425691aa66205a88Brian if (osmesa->rb) 1248216eb81c53908c9ac774a378425691aa66205a88Brian _mesa_reference_renderbuffer(&osmesa->rb, NULL); 1249216eb81c53908c9ac774a378425691aa66205a88Brian 12501741bc1a79b6a243e841bca704f1a720b028124aBrian Paul _mesa_meta_free( &osmesa->mesa ); 12511741bc1a79b6a243e841bca704f1a720b028124aBrian Paul 1252d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul _swsetup_DestroyContext( &osmesa->mesa ); 1253d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul _tnl_DestroyContext( &osmesa->mesa ); 12540a0fb5e0b3cfe61749af41d4200d42982b551cefKeith Whitwell _vbo_DestroyContext( &osmesa->mesa ); 1255d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul _swrast_DestroyContext( &osmesa->mesa ); 1256d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul 1257d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul _mesa_destroy_visual( osmesa->gl_visual ); 12587eb5a2892d3d89f4b1800311babb40af1ec7d4e5Brian Paul _mesa_reference_framebuffer( &osmesa->gl_buffer, NULL ); 1259a510bc3ee1a696da120c09ee4ec33dc033f671acBrian 1260d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul _mesa_free_context_data( &osmesa->mesa ); 126132f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg free( osmesa ); 12629c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul } 12639c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul} 1264afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1265afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1266d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul/** 12679c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * Bind an OSMesaContext to an image buffer. The image buffer is just a 12689c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * block of memory which the client provides. Its size must be at least 12699c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * as large as width*height*sizeof(type). Its address should be a multiple 12709c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * of 4 if using RGBA mode. 12719c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * 12729c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * Image data is stored in the order of glDrawPixels: row-major order 12739c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * with the lower-left image pixel stored in the first array position 12749c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * (ie. bottom-to-top). 12759c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * 12769c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * If the context's viewport hasn't been initialized yet, it will now be 12779c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * initialized to (0,0,width,height). 12789c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * 1279d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul * Input: osmesa - the rendering context 12809c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * buffer - the image buffer memory 12819c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * type - data type for pixel components 12829c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * Normally, only GL_UNSIGNED_BYTE and GL_UNSIGNED_SHORT_5_6_5 12839c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * are supported. But if Mesa's been compiled with CHAN_BITS==16 1284d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul * then type may be GL_UNSIGNED_SHORT or GL_UNSIGNED_BYTE. And if 1285d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul * Mesa's been build with CHAN_BITS==32 then type may be GL_FLOAT, 1286d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul * GL_UNSIGNED_SHORT or GL_UNSIGNED_BYTE. 12879c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * width, height - size of image buffer in pixels, at least 1 1288d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul * Return: GL_TRUE if success, GL_FALSE if error because of invalid osmesa, 12899c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * invalid buffer address, invalid type, width<1, height<1, 12909c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * width>internal limit or height>internal limit. 1291afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */ 12929c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian PaulGLAPI GLboolean GLAPIENTRY 1293d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian PaulOSMesaMakeCurrent( OSMesaContext osmesa, void *buffer, GLenum type, 12949c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul GLsizei width, GLsizei height ) 1295afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 1296d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul if (!osmesa || !buffer || 12979c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul width < 1 || height < 1 || 12989c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul width > MAX_WIDTH || height > MAX_HEIGHT) { 12999c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul return GL_FALSE; 13009c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul } 130174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul 1302d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul if (osmesa->format == OSMESA_RGB_565 && type != GL_UNSIGNED_SHORT_5_6_5) { 1303d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul return GL_FALSE; 1304afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1305d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul 1306544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul#if 0 1307d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul if (!(type == GL_UNSIGNED_BYTE || 1308d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul (type == GL_UNSIGNED_SHORT && CHAN_BITS >= 16) || 1309d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul (type == GL_FLOAT && CHAN_BITS == 32))) { 1310d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul /* i.e. is sizeof(type) * 8 > CHAN_BITS? */ 13119c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul return GL_FALSE; 13129c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul } 1313544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul#endif 131458f4d67703381003c23fecbd3fe114ef9d1730c3Brian Paul 1315d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul osmesa_update_state( &osmesa->mesa, 0 ); 1316c6c0f947142c0cc82626c238804a68b4e8f53945Brian Paul 1317c6c0f947142c0cc82626c238804a68b4e8f53945Brian Paul /* Call this periodically to detect when the user has begun using 1318c6c0f947142c0cc82626c238804a68b4e8f53945Brian Paul * GL rendering from multiple threads. 1319c6c0f947142c0cc82626c238804a68b4e8f53945Brian Paul */ 1320c6c0f947142c0cc82626c238804a68b4e8f53945Brian Paul _glapi_check_multithread(); 1321c6c0f947142c0cc82626c238804a68b4e8f53945Brian Paul 132236b3a8bd5a317ab297f44b19fd14c7e76ec2fc77Brian Paul 132336b3a8bd5a317ab297f44b19fd14c7e76ec2fc77Brian Paul /* Create a front/left color buffer which wraps the user-provided buffer. 132436b3a8bd5a317ab297f44b19fd14c7e76ec2fc77Brian Paul * There is no back color buffer. 132536b3a8bd5a317ab297f44b19fd14c7e76ec2fc77Brian Paul * If the user tries to use a 8, 16 or 32-bit/channel buffer that 132636b3a8bd5a317ab297f44b19fd14c7e76ec2fc77Brian Paul * doesn't match what Mesa was compiled for (CHAN_BITS) the 132736b3a8bd5a317ab297f44b19fd14c7e76ec2fc77Brian Paul * _mesa_add_renderbuffer() function will create a "wrapper" renderbuffer 132836b3a8bd5a317ab297f44b19fd14c7e76ec2fc77Brian Paul * that converts rendering from CHAN_BITS to the user-requested channel 132936b3a8bd5a317ab297f44b19fd14c7e76ec2fc77Brian Paul * size. 133036b3a8bd5a317ab297f44b19fd14c7e76ec2fc77Brian Paul */ 133136b3a8bd5a317ab297f44b19fd14c7e76ec2fc77Brian Paul osmesa->rb = new_osmesa_renderbuffer(&osmesa->mesa, osmesa->format, type); 133236b3a8bd5a317ab297f44b19fd14c7e76ec2fc77Brian Paul _mesa_add_renderbuffer(osmesa->gl_buffer, BUFFER_FRONT_LEFT, osmesa->rb); 133336b3a8bd5a317ab297f44b19fd14c7e76ec2fc77Brian Paul assert(osmesa->rb->RefCount == 2); 133436b3a8bd5a317ab297f44b19fd14c7e76ec2fc77Brian Paul 1335544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul /* Set renderbuffer fields. Set width/height = 0 to force 1336544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul * osmesa_renderbuffer_storage() being called by _mesa_resize_framebuffer() 1337544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul */ 1338544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul osmesa->rb->Data = buffer; 1339544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul osmesa->rb->Width = osmesa->rb->Height = 0; 1340544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul 13419cbe0e24ac3772ec5db303e532166351affc91c9Brian Paul /* Set the framebuffer's size. This causes the 13429cbe0e24ac3772ec5db303e532166351affc91c9Brian Paul * osmesa_renderbuffer_storage() function to get called. 13439cbe0e24ac3772ec5db303e532166351affc91c9Brian Paul */ 13449cbe0e24ac3772ec5db303e532166351affc91c9Brian Paul _mesa_resize_framebuffer(&osmesa->mesa, osmesa->gl_buffer, width, height); 13459cbe0e24ac3772ec5db303e532166351affc91c9Brian Paul osmesa->gl_buffer->Initialized = GL_TRUE; /* XXX TEMPORARY? */ 13469cbe0e24ac3772ec5db303e532166351affc91c9Brian Paul 1347d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul _mesa_make_current( &osmesa->mesa, osmesa->gl_buffer, osmesa->gl_buffer ); 134858f4d67703381003c23fecbd3fe114ef9d1730c3Brian Paul 134989ffca52ac18103ebaa754241a882ea8438ff9c4Brian Paul /* Remove renderbuffer attachment, then re-add. This installs the 1350544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul * renderbuffer adaptor/wrapper if needed (for bpp conversion). 1351d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul */ 135289ffca52ac18103ebaa754241a882ea8438ff9c4Brian Paul _mesa_remove_renderbuffer(osmesa->gl_buffer, BUFFER_FRONT_LEFT); 1353d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul _mesa_add_renderbuffer(osmesa->gl_buffer, BUFFER_FRONT_LEFT, osmesa->rb); 135474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul 135589ffca52ac18103ebaa754241a882ea8438ff9c4Brian Paul 1356d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul /* this updates the visual's red/green/blue/alphaBits fields */ 1357d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul _mesa_update_framebuffer_visual(osmesa->gl_buffer); 1358d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul 1359d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul /* update the framebuffer size */ 1360d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul _mesa_resize_framebuffer(&osmesa->mesa, osmesa->gl_buffer, width, height); 136174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul 13629c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul return GL_TRUE; 1363afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 1364afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 13651e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell 13661e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell 1367c5f9aa7750633e2989a6a139c283419d536ee3f7Brian PaulGLAPI OSMesaContext GLAPIENTRY 1368c5f9aa7750633e2989a6a139c283419d536ee3f7Brian PaulOSMesaGetCurrentContext( void ) 13699c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul{ 13709c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul GLcontext *ctx = _mesa_get_current_context(); 13719c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul if (ctx) 13729c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul return (OSMesaContext) ctx; 13739c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul else 13749c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul return NULL; 13759c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul} 13762d595d70202bad560c27ea81ec71b740415b3355Brian Paul 13771e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell 13781e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell 1379c5f9aa7750633e2989a6a139c283419d536ee3f7Brian PaulGLAPI void GLAPIENTRY 1380c5f9aa7750633e2989a6a139c283419d536ee3f7Brian PaulOSMesaPixelStore( GLint pname, GLint value ) 13811e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell{ 13829c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul OSMesaContext osmesa = OSMesaGetCurrentContext(); 1383dbd1e2b5990a3689bf718296c57c14fc3ba38db5Jouk Jansen 13849c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul switch (pname) { 13859c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul case OSMESA_ROW_LENGTH: 13869c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul if (value<0) { 13876fafc7ad19a8b7400e57a86b588766b6f3811a05Brian Paul _mesa_error( &osmesa->mesa, GL_INVALID_VALUE, 13889c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul "OSMesaPixelStore(value)" ); 13899c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul return; 13909c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul } 13919c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul osmesa->userRowLength = value; 13929c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul break; 13939c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul case OSMESA_Y_UP: 13949c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul osmesa->yup = value ? GL_TRUE : GL_FALSE; 13959c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul break; 13969c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul default: 13976fafc7ad19a8b7400e57a86b588766b6f3811a05Brian Paul _mesa_error( &osmesa->mesa, GL_INVALID_ENUM, "OSMesaPixelStore(pname)" ); 13989c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul return; 13999c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul } 1400dbd1e2b5990a3689bf718296c57c14fc3ba38db5Jouk Jansen 14019c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul compute_row_addresses( osmesa ); 14021e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell} 1403ed30dfa1264ec8875a3162c3c8778bc703bf11d5Brian Paul 1404ed30dfa1264ec8875a3162c3c8778bc703bf11d5Brian Paul 1405c5f9aa7750633e2989a6a139c283419d536ee3f7Brian PaulGLAPI void GLAPIENTRY 1406c5f9aa7750633e2989a6a139c283419d536ee3f7Brian PaulOSMesaGetIntegerv( GLint pname, GLint *value ) 1407afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 14089c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul OSMesaContext osmesa = OSMesaGetCurrentContext(); 14099c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul 14109c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul switch (pname) { 14119c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul case OSMESA_WIDTH: 1412544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul if (osmesa->gl_buffer) 1413544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul *value = osmesa->gl_buffer->Width; 1414544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul else 1415544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul *value = 0; 14169c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul return; 14179c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul case OSMESA_HEIGHT: 1418544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul if (osmesa->gl_buffer) 1419544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul *value = osmesa->gl_buffer->Height; 1420544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul else 1421544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul *value = 0; 14229c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul return; 14239c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul case OSMESA_FORMAT: 14249c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul *value = osmesa->format; 14259c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul return; 14269c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul case OSMESA_TYPE: 1427d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul /* current color buffer's data type */ 1428d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul if (osmesa->rb) { 1429d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul *value = osmesa->rb->DataType; 1430d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul } 1431d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul else { 1432d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul *value = 0; 1433d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul } 14349c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul return; 14359c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul case OSMESA_ROW_LENGTH: 14369c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul *value = osmesa->userRowLength; 14379c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul return; 14389c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul case OSMESA_Y_UP: 14399c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul *value = osmesa->yup; 14409c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul return; 14419c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul case OSMESA_MAX_WIDTH: 14429c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul *value = MAX_WIDTH; 14439c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul return; 14449c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul case OSMESA_MAX_HEIGHT: 14459c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul *value = MAX_HEIGHT; 14469c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul return; 1447afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg default: 14486fafc7ad19a8b7400e57a86b588766b6f3811a05Brian Paul _mesa_error(&osmesa->mesa, GL_INVALID_ENUM, "OSMesaGetIntergerv(pname)"); 14499c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul return; 1450afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1451afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 1452afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1453d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul 1454d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul/** 14559c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * Return the depth buffer associated with an OSMesa context. 14569c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * Input: c - the OSMesa context 14579c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * Output: width, height - size of buffer in pixels 14589c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * bytesPerValue - bytes per depth value (2 or 4) 14599c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * buffer - pointer to depth buffer values 14609c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * Return: GL_TRUE or GL_FALSE to indicate success or failure. 14619c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul */ 14629c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian PaulGLAPI GLboolean GLAPIENTRY 14639c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian PaulOSMesaGetDepthBuffer( OSMesaContext c, GLint *width, GLint *height, 14649c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul GLint *bytesPerValue, void **buffer ) 1465afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 1466e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul struct gl_renderbuffer *rb = NULL; 1467e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul 1468e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul if (c->gl_buffer) 1469e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul rb = c->gl_buffer->Attachment[BUFFER_DEPTH].Renderbuffer; 1470e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul 1471e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul if (!rb || !rb->Data) { 14729c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul *width = 0; 14739c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul *height = 0; 14749c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul *bytesPerValue = 0; 14759c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul *buffer = 0; 14769c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul return GL_FALSE; 147774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul } 14789c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul else { 1479544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul *width = rb->Width; 1480544b94e15617fb69f77ebd57b1be49aafe2f64e6Brian Paul *height = rb->Height; 14819c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul if (c->gl_visual->depthBits <= 16) 14829c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul *bytesPerValue = sizeof(GLushort); 14839c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul else 14849c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul *bytesPerValue = sizeof(GLuint); 1485e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul *buffer = rb->Data; 14869c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul return GL_TRUE; 1487afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 14889c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul} 14899c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul 1490d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul 1491d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul/** 14929c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * Return the color buffer associated with an OSMesa context. 14939c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * Input: c - the OSMesa context 14949c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * Output: width, height - size of buffer in pixels 14959c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * format - the pixel format (OSMESA_FORMAT) 14969c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * buffer - pointer to color buffer values 14979c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul * Return: GL_TRUE or GL_FALSE to indicate success or failure. 14989c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul */ 14999c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian PaulGLAPI GLboolean GLAPIENTRY 1500d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian PaulOSMesaGetColorBuffer( OSMesaContext osmesa, GLint *width, 15019c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul GLint *height, GLint *format, void **buffer ) 15029c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul{ 1503d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul if (osmesa->rb && osmesa->rb->Data) { 1504d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul *width = osmesa->rb->Width; 1505d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul *height = osmesa->rb->Height; 1506d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul *format = osmesa->format; 1507d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul *buffer = osmesa->rb->Data; 1508d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul return GL_TRUE; 1509d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul } 1510d44248ca00ad404cfc18c2c1f4c1817936ee4eacBrian Paul else { 15119c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul *width = 0; 15129c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul *height = 0; 15139c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul *format = 0; 15149c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul *buffer = 0; 15159c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul return GL_FALSE; 1516206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul } 15179c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul} 1518afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1519709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell 1520c5f9aa7750633e2989a6a139c283419d536ee3f7Brian Paulstruct name_function 1521c5f9aa7750633e2989a6a139c283419d536ee3f7Brian Paul{ 15229c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul const char *Name; 15234d880987d248ff078845027cc21ba437564ac07dBrian Paul OSMESAproc Function; 15249c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul}; 15259c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul 1526c5f9aa7750633e2989a6a139c283419d536ee3f7Brian Paulstatic struct name_function functions[] = { 15274d880987d248ff078845027cc21ba437564ac07dBrian Paul { "OSMesaCreateContext", (OSMESAproc) OSMesaCreateContext }, 15284d880987d248ff078845027cc21ba437564ac07dBrian Paul { "OSMesaCreateContextExt", (OSMESAproc) OSMesaCreateContextExt }, 15294d880987d248ff078845027cc21ba437564ac07dBrian Paul { "OSMesaDestroyContext", (OSMESAproc) OSMesaDestroyContext }, 15304d880987d248ff078845027cc21ba437564ac07dBrian Paul { "OSMesaMakeCurrent", (OSMESAproc) OSMesaMakeCurrent }, 15314d880987d248ff078845027cc21ba437564ac07dBrian Paul { "OSMesaGetCurrentContext", (OSMESAproc) OSMesaGetCurrentContext }, 15324d880987d248ff078845027cc21ba437564ac07dBrian Paul { "OSMesaPixelsStore", (OSMESAproc) OSMesaPixelStore }, 15334d880987d248ff078845027cc21ba437564ac07dBrian Paul { "OSMesaGetIntegerv", (OSMESAproc) OSMesaGetIntegerv }, 15344d880987d248ff078845027cc21ba437564ac07dBrian Paul { "OSMesaGetDepthBuffer", (OSMESAproc) OSMesaGetDepthBuffer }, 15354d880987d248ff078845027cc21ba437564ac07dBrian Paul { "OSMesaGetColorBuffer", (OSMESAproc) OSMesaGetColorBuffer }, 15364d880987d248ff078845027cc21ba437564ac07dBrian Paul { "OSMesaGetProcAddress", (OSMESAproc) OSMesaGetProcAddress }, 1537ad766b5785c728e988e25509604c08fc347aba23Alan Hourihane { "OSMesaColorClamp", (OSMESAproc) OSMesaColorClamp }, 15389c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul { NULL, NULL } 15399c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul}; 15409c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul 15414d880987d248ff078845027cc21ba437564ac07dBrian Paul 15424d880987d248ff078845027cc21ba437564ac07dBrian PaulGLAPI OSMESAproc GLAPIENTRY 15439c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian PaulOSMesaGetProcAddress( const char *funcName ) 15449c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul{ 15459c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul int i; 15469c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul for (i = 0; functions[i].Name; i++) { 15478d73aa6d1ae6e89bb2cd8f52f5586d569a4b6eebKenneth Graunke if (strcmp(functions[i].Name, funcName) == 0) 15484d880987d248ff078845027cc21ba437564ac07dBrian Paul return functions[i].Function; 15499c799cdc49e9200f5a1c7c7d9787d5729b5b0082Brian Paul } 15504d880987d248ff078845027cc21ba437564ac07dBrian Paul return _glapi_get_proc_address(funcName); 1551afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 1552ba3da6154c324cc916845bc5de3de077d0b59ffcBrian Paul 1553ba3da6154c324cc916845bc5de3de077d0b59ffcBrian Paul 1554ba3da6154c324cc916845bc5de3de077d0b59ffcBrian PaulGLAPI void GLAPIENTRY 1555ba3da6154c324cc916845bc5de3de077d0b59ffcBrian PaulOSMesaColorClamp(GLboolean enable) 1556ba3da6154c324cc916845bc5de3de077d0b59ffcBrian Paul{ 1557ba3da6154c324cc916845bc5de3de077d0b59ffcBrian Paul OSMesaContext osmesa = OSMesaGetCurrentContext(); 1558ba3da6154c324cc916845bc5de3de077d0b59ffcBrian Paul 1559ba3da6154c324cc916845bc5de3de077d0b59ffcBrian Paul if (enable == GL_TRUE) { 1560ba3da6154c324cc916845bc5de3de077d0b59ffcBrian Paul osmesa->mesa.Color.ClampFragmentColor = GL_TRUE; 1561ba3da6154c324cc916845bc5de3de077d0b59ffcBrian Paul } 1562ba3da6154c324cc916845bc5de3de077d0b59ffcBrian Paul else { 1563ba3da6154c324cc916845bc5de3de077d0b59ffcBrian Paul osmesa->mesa.Color.ClampFragmentColor = GL_FIXED_ONLY_ARB; 1564ba3da6154c324cc916845bc5de3de077d0b59ffcBrian Paul } 1565ba3da6154c324cc916845bc5de3de077d0b59ffcBrian Paul} 1566ba3da6154c324cc916845bc5de3de077d0b59ffcBrian Paul 1567ba3da6154c324cc916845bc5de3de077d0b59ffcBrian Paul 1568