osmesa.c revision 74b493a5e61237de081a438e774e5d8139d4c6b7
174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul/* $Id: osmesa.c,v 1.41 2001/01/24 00:04:58 brianp Exp $ */ 2afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 3afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/* 4afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Mesa 3-D graphics library 574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul * Version: 3.5 6dbd1e2b5990a3689bf718296c57c14fc3ba38db5Jouk Jansen * 774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul * Copyright (C) 1999-2001 Brian Paul All Rights Reserved. 8dbd1e2b5990a3689bf718296c57c14fc3ba38db5Jouk Jansen * 9afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Permission is hereby granted, free of charge, to any person obtaining a 10afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * copy of this software and associated documentation files (the "Software"), 11afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * to deal in the Software without restriction, including without limitation 12afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * the rights to use, copy, modify, merge, publish, distribute, sublicense, 13afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * and/or sell copies of the Software, and to permit persons to whom the 14afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Software is furnished to do so, subject to the following conditions: 15dbd1e2b5990a3689bf718296c57c14fc3ba38db5Jouk Jansen * 16afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * The above copyright notice and this permission notice shall be included 17afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * in all copies or substantial portions of the Software. 18dbd1e2b5990a3689bf718296c57c14fc3ba38db5Jouk Jansen * 19afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 20afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 21afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 22afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN 23afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 24afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 25afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */ 26afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 27afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 28afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/* 29afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Off-Screen Mesa rendering / Rendering into client memory space 30d3c070ca6a36daa765b1ad7f44e03e6671ad0490Brian Paul * 31d3c070ca6a36daa765b1ad7f44e03e6671ad0490Brian Paul * Note on thread safety: this driver is thread safe. All 32d3c070ca6a36daa765b1ad7f44e03e6671ad0490Brian Paul * functions are reentrant. The notion of current context is 33b1394fa92aaaf859ce9efc8b5fc194397921320cBrian Paul * managed by the core _mesa_make_current() and _mesa_get_current_context() 34d3c070ca6a36daa765b1ad7f44e03e6671ad0490Brian Paul * functions. Those functions are thread-safe. 35afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */ 36afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 37afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 38afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#ifdef PC_HEADER 39afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#include "all.h" 40afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#else 41eed6f691991ed0d64752fa712c83f67eb700b9adBrian Paul#include "glheader.h" 42afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#include "GL/osmesa.h" 43afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#include "context.h" 4474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul#include "colormac.h" 45afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#include "depth.h" 46ebb248aa5c018dc676d389221d76ed329059789eBrian Paul#include "macros.h" 47cb5ecb883eb3be842ef44c61df8d4b527877c858Brian Paul#include "mem.h" 48afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#include "matrix.h" 493041d05bbcccfddba01a1eeaba01e5da0e1e99afBrian Paul#include "mmath.h" 50dbd1e2b5990a3689bf718296c57c14fc3ba38db5Jouk Jansen#include "mtypes.h" 5123ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank#include "extensions.h" 521e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell#include "swrast/swrast.h" 531e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell#include "swrast_setup/swrast_setup.h" 541e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell#include "swrast/s_context.h" 55724abeb058ca9372c5a9b9e38ee43dde1accaa41Keith Whitwell#include "swrast/s_depth.h" 561e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell#include "swrast/s_lines.h" 571e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell#include "swrast/s_triangle.h" 585a9026c65d260dc185e072163999f5d810015108Brian Paul#include "tnl/tnl.h" 5958e991705392a2e17a1c8b034f4083a0adaf1943Keith Whitwell#include "array_cache/acache.h" 60afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#endif 61afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 62afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 63724abeb058ca9372c5a9b9e38ee43dde1accaa41Keith Whitwell 64724abeb058ca9372c5a9b9e38ee43dde1accaa41Keith Whitwell 65304357dcd496f7ebf499fd9c77b4eba83a75abd5Brian Paul/* 66304357dcd496f7ebf499fd9c77b4eba83a75abd5Brian Paul * This is the OS/Mesa context struct. 67304357dcd496f7ebf499fd9c77b4eba83a75abd5Brian Paul * Notice how it includes a GLcontext. By doing this we're mimicking 68304357dcd496f7ebf499fd9c77b4eba83a75abd5Brian Paul * C++ inheritance/derivation. 69304357dcd496f7ebf499fd9c77b4eba83a75abd5Brian Paul * Later, we can cast a GLcontext pointer into an OSMesaContext pointer 70304357dcd496f7ebf499fd9c77b4eba83a75abd5Brian Paul * or vice versa. 71304357dcd496f7ebf499fd9c77b4eba83a75abd5Brian Paul */ 72afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgstruct osmesa_context { 73304357dcd496f7ebf499fd9c77b4eba83a75abd5Brian Paul GLcontext gl_ctx; /* The core GL/Mesa context */ 74afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLvisual *gl_visual; /* Describes the buffers */ 75afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLframebuffer *gl_buffer; /* Depth, stencil, accum, etc buffers */ 76afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLenum format; /* either GL_RGBA or GL_COLOR_INDEX */ 77afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg void *buffer; /* the image buffer */ 78afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLint width, height; /* size of image buffer */ 79afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLint rowlength; /* number of pixels per row */ 80afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLint userRowLength; /* user-specified number of pixels per row */ 81afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLint rshift, gshift; /* bit shifts for RGBA formats */ 82afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLint bshift, ashift; 8374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul GLint rInd, gInd, bInd, aInd;/* index offsets for RGBA formats */ 8474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul GLchan *rowaddr[MAX_HEIGHT]; /* address of first pixel in each image row */ 85afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLboolean yup; /* TRUE -> Y increases upward */ 86afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg /* FALSE -> Y increases downward */ 87afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}; 88afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 89afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 90afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 91afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/* A forward declaration: */ 92cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwellstatic void osmesa_update_state( GLcontext *ctx, GLuint newstate ); 931e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwellstatic void osmesa_register_swrast_functions( GLcontext *ctx ); 94afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 95afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 96afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 97c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul#define OSMESA_CONTEXT(ctx) ((OSMesaContext) (ctx->DriverCtx)) 98c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul 99c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul 100c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul 101afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/**********************************************************************/ 102afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/***** Public Functions *****/ 103afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/**********************************************************************/ 104afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 105afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 106afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/* 107afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Create an Off-Screen Mesa rendering context. The only attribute needed is 108afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * an RGBA vs Color-Index mode flag. 109afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * 110afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Input: format - either GL_RGBA or GL_COLOR_INDEX 111afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * sharelist - specifies another OSMesaContext with which to share 112afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * display lists. NULL indicates no sharing. 113afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Return: an OSMesaContext or 0 if error 114afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */ 115d3c070ca6a36daa765b1ad7f44e03e6671ad0490Brian PaulOSMesaContext GLAPIENTRY 116d3c070ca6a36daa765b1ad7f44e03e6671ad0490Brian PaulOSMesaCreateContext( GLenum format, OSMesaContext sharelist ) 117afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 1182bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul return OSMesaCreateContextExt(format, DEFAULT_SOFTWARE_DEPTH_BITS, 1192bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul 8, 16, sharelist); 1202bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul} 1212bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul 1222bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul 1232bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul 1242bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul/* 1252bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul * New in Mesa 3.5 1262bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul * 1272bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul * Create context and specify size of ancillary buffers. 1282bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul */ 1292bf5d9470d3232763cb49b5589209940d4d5398dBrian PaulOSMesaContext GLAPIENTRY 1302bf5d9470d3232763cb49b5589209940d4d5398dBrian PaulOSMesaCreateContextExt( GLenum format, GLint depthBits, GLint stencilBits, 1312bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul GLint accumBits, OSMesaContext sharelist ) 1322bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul{ 133afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg OSMesaContext osmesa; 134afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLint rshift, gshift, bshift, ashift; 13574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul GLint rind, gind, bind, aind; 1362bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul GLint indexBits, redBits, greenBits, blueBits, alphaBits; 137afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLboolean rgbmode; 138afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLboolean swalpha; 13974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const GLuint i4 = 1; 14074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const GLubyte *i1 = (GLubyte *) &i4; 14174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const GLint little_endian = *i1; 142afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 143afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg swalpha = GL_FALSE; 14474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul rind = gind = bind = aind = 0; 145afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (format==OSMESA_COLOR_INDEX) { 146afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg indexBits = 8; 147afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg rshift = gshift = bshift = ashift = 0; 148afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg rgbmode = GL_FALSE; 149afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 150afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg else if (format==OSMESA_RGBA) { 151afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg indexBits = 0; 1522bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul redBits = 8; 1532bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul greenBits = 8; 1542bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul blueBits = 8; 155afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg alphaBits = 8; 15674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul rind = 0; 15774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul gind = 1; 15874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul bind = 2; 15974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul aind = 3; 160afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (little_endian) { 161afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg rshift = 0; 162afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg gshift = 8; 163afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg bshift = 16; 164afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ashift = 24; 165afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 166afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg else { 167afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg rshift = 24; 168afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg gshift = 16; 169afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg bshift = 8; 170afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ashift = 0; 171afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 172afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg rgbmode = GL_TRUE; 173afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 174afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg else if (format==OSMESA_BGRA) { 175afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg indexBits = 0; 1762bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul redBits = 8; 1772bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul greenBits = 8; 1782bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul blueBits = 8; 179afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg alphaBits = 8; 18074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul rind = 2; 18174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul gind = 1; 18274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul bind = 0; 18374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul aind = 3; 184afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (little_endian) { 185afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ashift = 0; 186afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg rshift = 8; 187afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg gshift = 16; 188afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg bshift = 24; 189afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 190afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg else { 191afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg bshift = 24; 192afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg gshift = 16; 193afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg rshift = 8; 194afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ashift = 0; 195afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 196afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg rgbmode = GL_TRUE; 197afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 198afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg else if (format==OSMESA_ARGB) { 199afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg indexBits = 0; 2002bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul redBits = 8; 2012bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul greenBits = 8; 2022bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul blueBits = 8; 203afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg alphaBits = 8; 20474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul rind = 1; 20574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul gind = 2; 20674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul bind = 3; 20774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul aind = 0; 208afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (little_endian) { 209afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg bshift = 0; 210afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg gshift = 8; 211afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg rshift = 16; 212afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ashift = 24; 213afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 214afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg else { 215afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ashift = 24; 216afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg rshift = 16; 217afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg gshift = 8; 218afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg bshift = 0; 219afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 220afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg rgbmode = GL_TRUE; 221afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 222afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg else if (format==OSMESA_RGB) { 223afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg indexBits = 0; 2242bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul redBits = 8; 2252bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul greenBits = 8; 2262bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul blueBits = 8; 227afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg alphaBits = 0; 228afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg bshift = 0; 229afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg gshift = 8; 230afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg rshift = 16; 231afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ashift = 24; 232afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg rind = 0; 23374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul gind = 1; 23474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul bind = 2; 235afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg rgbmode = GL_TRUE; 236afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg swalpha = GL_TRUE; 237afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 238afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg else if (format==OSMESA_BGR) { 239afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg indexBits = 0; 2402bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul redBits = 8; 2412bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul greenBits = 8; 2422bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul blueBits = 8; 243afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg alphaBits = 0; 244afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg bshift = 0; 245afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg gshift = 8; 246afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg rshift = 16; 247afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ashift = 24; 248afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg rind = 2; 24974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul gind = 1; 25074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul bind = 0; 251afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg rgbmode = GL_TRUE; 252afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg swalpha = GL_TRUE; 253afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 254afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg else { 255afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return NULL; 256afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 257afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 258afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 259bd5cdaf4442872d3cd2ff94eeafadd481d27fcfbBrian Paul osmesa = (OSMesaContext) CALLOC_STRUCT(osmesa_context); 260afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (osmesa) { 2612bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul osmesa->gl_visual = _mesa_create_visual( rgbmode, 2622bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul GL_FALSE, /* double buffer */ 2632bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul GL_FALSE, /* stereo */ 2642bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul redBits, 2652bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul greenBits, 2662bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul blueBits, 2672bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul alphaBits, 2682bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul indexBits, 2692bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul depthBits, 2702bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul stencilBits, 2712bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul accumBits, 2722bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul accumBits, 2732bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul accumBits, 2742bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul alphaBits ? accumBits : 0, 2752bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul 1 /* num samples */ 2762bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul ); 277afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (!osmesa->gl_visual) { 278941dcc797e1a6317808c1ec43476817286d576baBrian Paul FREE(osmesa); 279afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return NULL; 280afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 281afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 282df81387dfae199a71bc55138ea5856dc05eacf24Brian Paul if (!_mesa_initialize_context(&osmesa->gl_ctx, 283df81387dfae199a71bc55138ea5856dc05eacf24Brian Paul osmesa->gl_visual, 284df81387dfae199a71bc55138ea5856dc05eacf24Brian Paul sharelist ? &sharelist->gl_ctx 285df81387dfae199a71bc55138ea5856dc05eacf24Brian Paul : (GLcontext *) NULL, 286df81387dfae199a71bc55138ea5856dc05eacf24Brian Paul (void *) osmesa, GL_TRUE )) { 287df81387dfae199a71bc55138ea5856dc05eacf24Brian Paul _mesa_destroy_visual( osmesa->gl_visual ); 288bd5cdaf4442872d3cd2ff94eeafadd481d27fcfbBrian Paul FREE(osmesa); 289afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return NULL; 290afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 2915a9026c65d260dc185e072163999f5d810015108Brian Paul 2925a9026c65d260dc185e072163999f5d810015108Brian Paul _mesa_enable_sw_extensions(&(osmesa->gl_ctx)); 293304357dcd496f7ebf499fd9c77b4eba83a75abd5Brian Paul 294b1394fa92aaaf859ce9efc8b5fc194397921320cBrian Paul osmesa->gl_buffer = _mesa_create_framebuffer( osmesa->gl_visual, 295b6bcae5698df88f7730d40004ce7ce0462e97a20Brian Paul osmesa->gl_visual->depthBits > 0, 296b6bcae5698df88f7730d40004ce7ce0462e97a20Brian Paul osmesa->gl_visual->stencilBits > 0, 297b6bcae5698df88f7730d40004ce7ce0462e97a20Brian Paul osmesa->gl_visual->accumRedBits > 0, 298b6bcae5698df88f7730d40004ce7ce0462e97a20Brian Paul osmesa->gl_visual->alphaBits > 0 ); 2994c44d63f01a01f134d7e4456d4209edee97f9ef5Brian Paul 300afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (!osmesa->gl_buffer) { 301b1394fa92aaaf859ce9efc8b5fc194397921320cBrian Paul _mesa_destroy_visual( osmesa->gl_visual ); 302b1394fa92aaaf859ce9efc8b5fc194397921320cBrian Paul _mesa_free_context_data( &osmesa->gl_ctx ); 303bd5cdaf4442872d3cd2ff94eeafadd481d27fcfbBrian Paul FREE(osmesa); 304afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return NULL; 305afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 306afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg osmesa->format = format; 307afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg osmesa->buffer = NULL; 308afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg osmesa->width = 0; 309afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg osmesa->height = 0; 310afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg osmesa->userRowLength = 0; 311afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg osmesa->rowlength = 0; 312afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg osmesa->yup = GL_TRUE; 313afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg osmesa->rshift = rshift; 314afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg osmesa->gshift = gshift; 315afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg osmesa->bshift = bshift; 316afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg osmesa->ashift = ashift; 31774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul osmesa->rInd = rind; 31874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul osmesa->gInd = gind; 31974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul osmesa->bInd = bind; 32074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul osmesa->aInd = aind; 3211e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell 3221e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell 3231e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell /* Initialize the software rasterizer and helper modules. 3241e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell */ 3251e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell { 3261e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell GLcontext *ctx = &osmesa->gl_ctx; 3271e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell 3281e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell _swrast_CreateContext( ctx ); 32958e991705392a2e17a1c8b034f4083a0adaf1943Keith Whitwell _ac_CreateContext( ctx ); 33023caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell _tnl_CreateContext( ctx ); 331cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell _swsetup_CreateContext( ctx ); 332dbd1e2b5990a3689bf718296c57c14fc3ba38db5Jouk Jansen 3331e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell osmesa_register_swrast_functions( ctx ); 3341e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell } 335afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 336afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return osmesa; 337afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 338afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 339afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 340afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 3412bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul 342afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/* 343afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Destroy an Off-Screen Mesa rendering context. 344afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * 345afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Input: ctx - the context to destroy 346afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */ 347afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgvoid GLAPIENTRY OSMesaDestroyContext( OSMesaContext ctx ) 348afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 349afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (ctx) { 350b1394fa92aaaf859ce9efc8b5fc194397921320cBrian Paul _mesa_destroy_visual( ctx->gl_visual ); 351b1394fa92aaaf859ce9efc8b5fc194397921320cBrian Paul _mesa_destroy_framebuffer( ctx->gl_buffer ); 352b1394fa92aaaf859ce9efc8b5fc194397921320cBrian Paul _mesa_free_context_data( &ctx->gl_ctx ); 353bd5cdaf4442872d3cd2ff94eeafadd481d27fcfbBrian Paul FREE( ctx ); 354afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 355afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 356afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 357afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 358afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 359afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/* 360afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Recompute the values of the context's rowaddr array. 361afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */ 362afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgstatic void compute_row_addresses( OSMesaContext ctx ) 363afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 36474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul GLint bytesPerPixel, bytesPerRow, i; 36574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul GLubyte *origin = (GLubyte *) ctx->buffer; 36674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul 36774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul if (ctx->format == OSMESA_COLOR_INDEX) { 36874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul /* CI mode */ 36974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul bytesPerPixel = 1 * sizeof(GLchan); 37074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul } 37174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul else if ((ctx->format == OSMESA_RGB) || (ctx->format == OSMESA_BGR)) { 37274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul /* RGB mode */ 37374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul bytesPerPixel = 3 * sizeof(GLchan); 37474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul } 37574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul else { 37674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul /* RGBA mode */ 37774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul bytesPerPixel = 4 * sizeof(GLchan); 37874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul } 37974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul 38074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul bytesPerRow = ctx->rowlength * bytesPerPixel; 381afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 382afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (ctx->yup) { 383afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg /* Y=0 is bottom line of window */ 38474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul for (i = 0; i < MAX_HEIGHT; i++) { 38574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul ctx->rowaddr[i] = (GLchan *) ((GLubyte *) origin + i * bytesPerRow); 386afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 387afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 388afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg else { 389afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg /* Y=0 is top line of window */ 39074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul for (i = 0; i < MAX_HEIGHT; i++) { 39174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul GLint j = ctx->height - i - 1; 39274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul ctx->rowaddr[i] = (GLchan *) ((GLubyte *) origin + j * bytesPerRow); 393afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 394afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 395afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 396afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 397afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 398afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/* 399afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Bind an OSMesaContext to an image buffer. The image buffer is just a 400afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * block of memory which the client provides. Its size must be at least 401afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * as large as width*height*sizeof(type). Its address should be a multiple 402afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * of 4 if using RGBA mode. 403afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * 404afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Image data is stored in the order of glDrawPixels: row-major order 405afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * with the lower-left image pixel stored in the first array position 406afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * (ie. bottom-to-top). 407afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * 408afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Since the only type initially supported is GL_UNSIGNED_BYTE, if the 409afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * context is in RGBA mode, each pixel will be stored as a 4-byte RGBA 410afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * value. If the context is in color indexed mode, each pixel will be 411afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * stored as a 1-byte value. 412afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * 413afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * If the context's viewport hasn't been initialized yet, it will now be 414afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * initialized to (0,0,width,height). 415afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * 416afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Input: ctx - the rendering context 417afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * buffer - the image buffer memory 418afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * type - data type for pixel components, only GL_UNSIGNED_BYTE 419afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * supported now 420afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * width, height - size of image buffer in pixels, at least 1 421afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Return: GL_TRUE if success, GL_FALSE if error because of invalid ctx, 422afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * invalid buffer address, type!=GL_UNSIGNED_BYTE, width<1, height<1, 423afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * width>internal limit or height>internal limit. 424afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */ 425d3c070ca6a36daa765b1ad7f44e03e6671ad0490Brian PaulGLboolean GLAPIENTRY 426d3c070ca6a36daa765b1ad7f44e03e6671ad0490Brian PaulOSMesaMakeCurrent( OSMesaContext ctx, void *buffer, GLenum type, 427d3c070ca6a36daa765b1ad7f44e03e6671ad0490Brian Paul GLsizei width, GLsizei height ) 428afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 42974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul if (!ctx || !buffer || type != CHAN_TYPE || 43074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul width < 1 || height < 1 || 43174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul width > MAX_WIDTH || height > MAX_HEIGHT) { 432afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return GL_FALSE; 433afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 434afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 435cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell osmesa_update_state( &ctx->gl_ctx, 0 ); 436b1394fa92aaaf859ce9efc8b5fc194397921320cBrian Paul _mesa_make_current( &ctx->gl_ctx, ctx->gl_buffer ); 437afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 438afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ctx->buffer = buffer; 439afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ctx->width = width; 440afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ctx->height = height; 441afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (ctx->userRowLength) 442afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ctx->rowlength = ctx->userRowLength; 443afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg else 444afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ctx->rowlength = width; 445afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 446afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg compute_row_addresses( ctx ); 447afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 448afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg /* init viewport */ 449304357dcd496f7ebf499fd9c77b4eba83a75abd5Brian Paul if (ctx->gl_ctx.Viewport.Width==0) { 450afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg /* initialize viewport and scissor box to buffer size */ 451cb5ecb883eb3be842ef44c61df8d4b527877c858Brian Paul _mesa_Viewport( 0, 0, width, height ); 452304357dcd496f7ebf499fd9c77b4eba83a75abd5Brian Paul ctx->gl_ctx.Scissor.Width = width; 453304357dcd496f7ebf499fd9c77b4eba83a75abd5Brian Paul ctx->gl_ctx.Scissor.Height = height; 454afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 455afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 456afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return GL_TRUE; 457afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 458afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 459afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 460afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 461afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgOSMesaContext GLAPIENTRY OSMesaGetCurrentContext( void ) 462afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 463b1394fa92aaaf859ce9efc8b5fc194397921320cBrian Paul GLcontext *ctx = _mesa_get_current_context(); 464d3c070ca6a36daa765b1ad7f44e03e6671ad0490Brian Paul if (ctx) 465304357dcd496f7ebf499fd9c77b4eba83a75abd5Brian Paul return (OSMesaContext) ctx; 466d3c070ca6a36daa765b1ad7f44e03e6671ad0490Brian Paul else 467d3c070ca6a36daa765b1ad7f44e03e6671ad0490Brian Paul return NULL; 468afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 469afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 470afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 471afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 472afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgvoid GLAPIENTRY OSMesaPixelStore( GLint pname, GLint value ) 473afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 474afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg OSMesaContext ctx = OSMesaGetCurrentContext(); 475afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 476afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg switch (pname) { 477afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case OSMESA_ROW_LENGTH: 478afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (value<0) { 479304357dcd496f7ebf499fd9c77b4eba83a75abd5Brian Paul gl_error( &ctx->gl_ctx, GL_INVALID_VALUE, 480afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg "OSMesaPixelStore(value)" ); 481afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return; 482afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 483afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ctx->userRowLength = value; 484afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ctx->rowlength = value; 485afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg break; 486afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case OSMESA_Y_UP: 487afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ctx->yup = value ? GL_TRUE : GL_FALSE; 488afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg break; 489afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg default: 490304357dcd496f7ebf499fd9c77b4eba83a75abd5Brian Paul gl_error( &ctx->gl_ctx, GL_INVALID_ENUM, "OSMesaPixelStore(pname)" ); 491afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return; 492afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 493afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 494afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg compute_row_addresses( ctx ); 495afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 496afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 497afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 498afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgvoid GLAPIENTRY OSMesaGetIntegerv( GLint pname, GLint *value ) 499afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 500afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg OSMesaContext ctx = OSMesaGetCurrentContext(); 501afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 502afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg switch (pname) { 503afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case OSMESA_WIDTH: 504afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg *value = ctx->width; 505afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return; 506afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case OSMESA_HEIGHT: 507afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg *value = ctx->height; 508afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return; 509afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case OSMESA_FORMAT: 510afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg *value = ctx->format; 511afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return; 512afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case OSMESA_TYPE: 513afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg *value = GL_UNSIGNED_BYTE; 514afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return; 515afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case OSMESA_ROW_LENGTH: 516afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg *value = ctx->rowlength; 517afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return; 518afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case OSMESA_Y_UP: 519afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg *value = ctx->yup; 520afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return; 521afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg default: 522304357dcd496f7ebf499fd9c77b4eba83a75abd5Brian Paul gl_error(&ctx->gl_ctx, GL_INVALID_ENUM, "OSMesaGetIntergerv(pname)"); 523afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return; 524afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 525afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 526afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 527afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/* 528afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Return the depth buffer associated with an OSMesa context. 529afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Input: c - the OSMesa context 530afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Output: width, height - size of buffer in pixels 531afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * bytesPerValue - bytes per depth value (2 or 4) 532afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * buffer - pointer to depth buffer values 533afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Return: GL_TRUE or GL_FALSE to indicate success or failure. 534afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */ 5357e67fb41fb54e050f6983b4de09ed3a317d6148fBrian PaulGLboolean GLAPIENTRY 5367e67fb41fb54e050f6983b4de09ed3a317d6148fBrian PaulOSMesaGetDepthBuffer( OSMesaContext c, GLint *width, GLint *height, 5377e67fb41fb54e050f6983b4de09ed3a317d6148fBrian Paul GLint *bytesPerValue, void **buffer ) 538afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 539650cb74bcb913d2589355d56a14da1ab0307d1fcBrian Paul if ((!c->gl_buffer) || (!c->gl_buffer->DepthBuffer)) { 540afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg *width = 0; 541afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg *height = 0; 542afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg *bytesPerValue = 0; 543afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg *buffer = 0; 544afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return GL_FALSE; 545afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 546afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg else { 547afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg *width = c->gl_buffer->Width; 548afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg *height = c->gl_buffer->Height; 549afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg *bytesPerValue = sizeof(GLdepth); 550650cb74bcb913d2589355d56a14da1ab0307d1fcBrian Paul *buffer = c->gl_buffer->DepthBuffer; 551afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return GL_TRUE; 552afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 553afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 554afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 55523ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank/* 55623ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank * Return the color buffer associated with an OSMesa context. 55723ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank * Input: c - the OSMesa context 55823ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank * Output: width, height - size of buffer in pixels 55923ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank * format - the pixel format (OSMESA_FORMAT) 56023ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank * buffer - pointer to color buffer values 56123ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank * Return: GL_TRUE or GL_FALSE to indicate success or failure. 56223ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank */ 5637e67fb41fb54e050f6983b4de09ed3a317d6148fBrian PaulGLboolean GLAPIENTRY 5647e67fb41fb54e050f6983b4de09ed3a317d6148fBrian PaulOSMesaGetColorBuffer( OSMesaContext c, GLint *width, 5657e67fb41fb54e050f6983b4de09ed3a317d6148fBrian Paul GLint *height, GLint *format, void **buffer ) 56623ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank{ 56723ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank if (!c->buffer) { 56823ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank *width = 0; 56923ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank *height = 0; 57023ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank *format = 0; 57123ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank *buffer = 0; 57223ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank return GL_FALSE; 5737e67fb41fb54e050f6983b4de09ed3a317d6148fBrian Paul } 5747e67fb41fb54e050f6983b4de09ed3a317d6148fBrian Paul else { 57523ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank *width = c->width; 57623ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank *height = c->height; 57723ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank *format = c->format; 57823ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank *buffer = c->buffer; 57923ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank return GL_TRUE; 58023ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank } 58123ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank} 582afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 583afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/**********************************************************************/ 584afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/*** Device Driver Functions ***/ 585afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/**********************************************************************/ 586afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 587afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 588afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/* 589afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Useful macros: 590afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */ 591afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 59274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul#define PACK_RGBA(DST, R, G, B, A) \ 59374b493a5e61237de081a438e774e5d8139d4c6b7Brian Pauldo { \ 59474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul (DST)[osmesa->rInd] = R; \ 59574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul (DST)[osmesa->gInd] = G; \ 59674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul (DST)[osmesa->bInd] = B; \ 59774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul (DST)[osmesa->aInd] = A; \ 59874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul} while (0) 59974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul 60074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul#define PACK_RGB(DST, R, G, B) \ 60174b493a5e61237de081a438e774e5d8139d4c6b7Brian Pauldo { \ 60274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul (DST)[0] = R; \ 60374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul (DST)[1] = G; \ 60474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul (DST)[2] = B; \ 60574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul} while (0) 606afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 60774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul#define PACK_BGR(DST, R, G, B) \ 60874b493a5e61237de081a438e774e5d8139d4c6b7Brian Pauldo { \ 60974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul (DST)[0] = B; \ 61074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul (DST)[1] = G; \ 61174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul (DST)[2] = R; \ 61274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul} while (0) 613afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 614afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 61574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul#define UNPACK_RED(P) ( ((GLchan *) &(P))[osmesa->rInd] ) 61674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul#define UNPACK_GREEN(P) ( ((GLchan *) &(P))[osmesa->gInd] ) 61774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul#define UNPACK_BLUE(P) ( ((GLchan *) &(P))[osmesa->bInd] ) 61874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul#define UNPACK_ALPHA(P) ( ((GLchan *) &(P))[osmesa->aInd] ) 61974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul 62074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul 62174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul#define PIXELADDR1(X,Y) (osmesa->rowaddr[Y] + (X)) 62274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul#define PIXELADDR3(X,Y) (osmesa->rowaddr[Y] + 3 * (X)) 62374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul#define PIXELADDR4(X,Y) (osmesa->rowaddr[Y] + 4 * (X)) 624afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 625afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 626afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 627cea0e8e6700e871bb9bcb334cb75fbfbfcdfd702Brian Paulstatic GLboolean set_draw_buffer( GLcontext *ctx, GLenum mode ) 628afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 629afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg (void) ctx; 630afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (mode==GL_FRONT_LEFT) { 631afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return GL_TRUE; 632afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 633afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg else { 634afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return GL_FALSE; 635afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 636afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 637afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 638afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 639cea0e8e6700e871bb9bcb334cb75fbfbfcdfd702Brian Paulstatic void set_read_buffer( GLcontext *ctx, GLframebuffer *buffer, GLenum mode ) 640cea0e8e6700e871bb9bcb334cb75fbfbfcdfd702Brian Paul{ 641cea0e8e6700e871bb9bcb334cb75fbfbfcdfd702Brian Paul /* separate read buffer not supported */ 642cea0e8e6700e871bb9bcb334cb75fbfbfcdfd702Brian Paul ASSERT(buffer == ctx->DrawBuffer); 643cea0e8e6700e871bb9bcb334cb75fbfbfcdfd702Brian Paul ASSERT(mode == GL_FRONT_LEFT); 644cea0e8e6700e871bb9bcb334cb75fbfbfcdfd702Brian Paul} 645cea0e8e6700e871bb9bcb334cb75fbfbfcdfd702Brian Paul 646cea0e8e6700e871bb9bcb334cb75fbfbfcdfd702Brian Paul 647afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgstatic GLbitfield clear( GLcontext *ctx, GLbitfield mask, GLboolean all, 648afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLint x, GLint y, GLint width, GLint height ) 649afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 650c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul OSMesaContext osmesa = OSMESA_CONTEXT(ctx); 651dd020f13a6d520b46aefd4453dae6b6edcc427f6Brian Paul const GLuint *colorMask = (GLuint *) &ctx->Color.ColorMask; 652dd020f13a6d520b46aefd4453dae6b6edcc427f6Brian Paul 653dd020f13a6d520b46aefd4453dae6b6edcc427f6Brian Paul /* we can't handle color or index masking */ 654dd020f13a6d520b46aefd4453dae6b6edcc427f6Brian Paul if (*colorMask != 0xffffffff || ctx->Color.IndexMask != 0xffffffff) 655dd020f13a6d520b46aefd4453dae6b6edcc427f6Brian Paul return mask; 656dd020f13a6d520b46aefd4453dae6b6edcc427f6Brian Paul 657dd020f13a6d520b46aefd4453dae6b6edcc427f6Brian Paul /* sanity check - we only have a front-left buffer */ 658dd020f13a6d520b46aefd4453dae6b6edcc427f6Brian Paul ASSERT((mask & (DD_FRONT_RIGHT_BIT | DD_BACK_LEFT_BIT | DD_BACK_RIGHT_BIT)) == 0); 659dd020f13a6d520b46aefd4453dae6b6edcc427f6Brian Paul 660dd020f13a6d520b46aefd4453dae6b6edcc427f6Brian Paul if (mask & DD_FRONT_LEFT_BIT) { 66174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul if (osmesa->format == OSMESA_COLOR_INDEX) { 662afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (all) { 663afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg /* Clear whole CI buffer */ 66474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul#if CHAN_TYPE == GL_UNSIGNED_BYTE 66574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul MEMSET(osmesa->buffer, ctx->Color.ClearIndex, 666afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg osmesa->rowlength * osmesa->height); 66774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul#else 66874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const GLint n = osmesa->rowlength * osmesa->height; 66974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul GLchan *buffer = (GLchan *) osmesa->buffer; 67074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul GLint i; 67174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul for (i = 0; i < n; i ++) { 67274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul buffer[i] = ctx->Color.ClearIndex; 67374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul } 67474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul#endif 675afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 676afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg else { 677afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg /* Clear part of CI buffer */ 67874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const GLchan clearIndex = (GLchan) ctx->Color.ClearIndex; 679afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLint i, j; 68074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul for (i = 0; i < height; i++) { 68174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul GLchan *ptr1 = PIXELADDR1(x, (y + i)); 68274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul for (j = 0; j < width; j++) { 68374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul *ptr1++ = clearIndex; 684afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 685afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 686afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 687afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 68874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul else if (osmesa->format == OSMESA_RGB) { 68974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const GLchan r = ctx->Color.ClearColor[0]; 69074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const GLchan g = ctx->Color.ClearColor[1]; 69174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const GLchan b = ctx->Color.ClearColor[2]; 692afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (all) { 693afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg /* Clear whole RGB buffer */ 69474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul GLuint n = osmesa->rowlength * osmesa->height; 69574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul GLchan *ptr3 = (GLchan *) osmesa->buffer; 69674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul GLuint i; 69774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul for (i = 0; i < n; i++) { 69874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul PACK_RGB(ptr3, r, g, b); 699afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ptr3 += 3; 700afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 701afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 702afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg else { 703afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg /* Clear part of RGB buffer */ 704afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLint i, j; 70574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul for (i = 0; i < height; i++) { 70674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul GLchan *ptr3 = PIXELADDR3(x, (y + i)); 70774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul for (j = 0; j < width; j++) { 70874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul PACK_RGB(ptr3, r, g, b); 70974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul ptr3 += 3; 71074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul } 71174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul } 71274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul } 71374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul } 71474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul else if (osmesa->format == OSMESA_BGR) { 71574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const GLchan r = ctx->Color.ClearColor[0]; 71674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const GLchan g = ctx->Color.ClearColor[1]; 71774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const GLchan b = ctx->Color.ClearColor[2]; 71874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul if (all) { 71974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul /* Clear whole RGB buffer */ 72074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const GLint n = osmesa->rowlength * osmesa->height; 72174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul GLchan *ptr3 = (GLchan *) osmesa->buffer; 72274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul GLint i; 72374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul for (i = 0; i < n; i++) { 72474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul PACK_BGR(ptr3, r, g, b); 72574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul ptr3 += 3; 72674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul } 72774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul } 72874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul else { 72974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul /* Clear part of RGB buffer */ 73074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul GLint i, j; 73174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul for (i = 0; i < height; i++) { 73274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul GLchan *ptr3 = PIXELADDR3(x, (y + i)); 73374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul for (j = 0; j < width; j++) { 73474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul PACK_BGR(ptr3, r, g, b); 735afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ptr3 += 3; 736afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 737afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 738afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 739afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 740afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg else { 74174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul#if CHAN_TYPE == GL_UNSIGNED_BYTE 74274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul /* 4-byte pixel value */ 74374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul GLuint clearPixel; 74474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul GLchan *clr = (GLchan *) &clearPixel; 74574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul clr[osmesa->rInd] = ctx->Color.ClearColor[0]; 74674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul clr[osmesa->gInd] = ctx->Color.ClearColor[1]; 74774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul clr[osmesa->bInd] = ctx->Color.ClearColor[2]; 74874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul clr[osmesa->aInd] = ctx->Color.ClearColor[3]; 749afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (all) { 750afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg /* Clear whole RGBA buffer */ 75174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const GLuint n = osmesa->rowlength * osmesa->height; 75274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul GLuint *ptr4 = (GLuint *) osmesa->buffer; 75374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul GLuint i; 75474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul if (clearPixel) { 75574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul for (i = 0; i < n; i++) { 75674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul *ptr4++ = clearPixel; 757941dcc797e1a6317808c1ec43476817286d576baBrian Paul } 758941dcc797e1a6317808c1ec43476817286d576baBrian Paul } 759941dcc797e1a6317808c1ec43476817286d576baBrian Paul else { 760941dcc797e1a6317808c1ec43476817286d576baBrian Paul BZERO(ptr4, n * sizeof(GLuint)); 761afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 762afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 763afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg else { 764afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg /* Clear part of RGBA buffer */ 765afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLint i, j; 76674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul for (i = 0; i < height; i++) { 76774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul GLuint *ptr4 = (GLuint *) PIXELADDR4(x, (y + i)); 76874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul for (j = 0; j < width; j++) { 76974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul *ptr4++ = clearPixel; 77074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul } 77174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul } 77274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul } 77374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul#else 77474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const GLchan r = ctx->Color.ClearColor[0]; 77574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const GLchan g = ctx->Color.ClearColor[1]; 77674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const GLchan b = ctx->Color.ClearColor[2]; 77774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const GLchan a = ctx->Color.ClearColor[3]; 77874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul if (all) { 77974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul /* Clear whole RGBA buffer */ 78074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const GLuint n = osmesa->rowlength * osmesa->height; 78174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul GLchan *p = (GLchan *) osmesa->buffer; 78274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul GLuint i; 78374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul for (i = 0; i < n; i++) { 78474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul PACK_RGBA(p, r, g, b, a); 78574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul p += 4; 78674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul } 78774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul } 78874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul else { 78974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul /* Clear part of RGBA buffer */ 79074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul GLint i, j; 79174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul for (i = 0; i < height; i++) { 79274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul GLchan *p = PIXELADDR4(x, (y + i)); 79374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul for (j = 0; j < width; j++) { 79474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul PACK_RGBA(p, r, g, b, a); 79574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul p += 4; 796afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 797afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 798afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 79974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul 80074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul#endif 801afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 802afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 803dd020f13a6d520b46aefd4453dae6b6edcc427f6Brian Paul /* have Mesa clear all other buffers */ 804dd020f13a6d520b46aefd4453dae6b6edcc427f6Brian Paul return mask & (~DD_FRONT_LEFT_BIT); 805afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 806afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 807afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 808afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 809afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgstatic void buffer_size( GLcontext *ctx, GLuint *width, GLuint *height ) 810afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 811c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul OSMesaContext osmesa = OSMESA_CONTEXT(ctx); 812afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg *width = osmesa->width; 813afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg *height = osmesa->height; 814afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 815afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 816afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 817afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/**********************************************************************/ 818afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/***** Read/write spans/arrays of RGBA pixels *****/ 819afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/**********************************************************************/ 820afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 821afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/* Write RGBA pixels to an RGBA (or permuted) buffer. */ 82274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void 82374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulwrite_rgba_span( const GLcontext *ctx, GLuint n, GLint x, GLint y, 82474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul CONST GLchan rgba[][4], const GLubyte mask[] ) 825afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 82674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const OSMesaContext osmesa = OSMESA_CONTEXT(ctx); 82774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul GLchan *p = PIXELADDR4(x, y); 828afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLuint i; 829afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (mask) { 83074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul for (i = 0; i < n; i++, p += 4) { 831afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (mask[i]) { 83274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul PACK_RGBA(p, rgba[i][RCOMP], rgba[i][GCOMP], 83374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul rgba[i][BCOMP], rgba[i][ACOMP]); 834afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 835afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 836afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 837afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg else { 83874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul for (i = 0; i < n; i++, p += 4) { 83974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul PACK_RGBA(p, rgba[i][RCOMP], rgba[i][GCOMP], 84074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul rgba[i][BCOMP], rgba[i][ACOMP]); 841afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 842afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 843afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 844afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 845afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 846afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/* Write RGBA pixels to an RGBA buffer. This is the fastest span-writer. */ 84774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void 84874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulwrite_rgba_span_rgba( const GLcontext *ctx, GLuint n, GLint x, GLint y, 84974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul CONST GLchan rgba[][4], const GLubyte mask[] ) 850afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 851c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul OSMesaContext osmesa = OSMESA_CONTEXT(ctx); 85274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul GLuint *ptr4 = (GLuint *) PIXELADDR4(x, y); 853afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg const GLuint *rgba4 = (const GLuint *) rgba; 854afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLuint i; 85574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul ASSERT(CHAN_TYPE == GL_UNSIGNED_BYTE); 856afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (mask) { 85774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul for (i = 0; i < n; i++) { 858afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (mask[i]) { 859afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ptr4[i] = rgba4[i]; 860afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 861afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 862afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 863afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg else { 864afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg MEMCPY( ptr4, rgba4, n * 4 ); 865afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 866afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 867afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 868afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 869afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/* Write RGB pixels to an RGBA (or permuted) buffer. */ 87074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void 87174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulwrite_rgb_span( const GLcontext *ctx, GLuint n, GLint x, GLint y, 87274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul CONST GLchan rgb[][3], const GLubyte mask[] ) 873afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 87474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const OSMesaContext osmesa = OSMESA_CONTEXT(ctx); 87574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul GLchan *p = PIXELADDR4(x, y); 876afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLuint i; 877afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (mask) { 87874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul for (i = 0; i < n; i++, p+=4) { 879afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (mask[i]) { 88074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul PACK_RGBA(p, rgb[i][RCOMP], rgb[i][GCOMP], rgb[i][BCOMP], 255); 881afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 882afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 883afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 884afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg else { 88574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul for (i = 0; i < n; i++, p+=4) { 88674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul PACK_RGBA(p, rgb[i][RCOMP], rgb[i][GCOMP], rgb[i][BCOMP], 255); 887afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 888afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 889afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 890afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 891afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 892afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 89374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void 89474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulwrite_monocolor_span( const GLcontext *ctx, GLuint n, GLint x, GLint y, 89574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const GLchan color[4], const GLubyte mask[] ) 896afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 897c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul const OSMesaContext osmesa = OSMESA_CONTEXT(ctx); 89874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul GLchan *p = PIXELADDR4(x, y); 899afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLuint i; 90074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul for (i = 0; i < n; i++, p += 4) { 901afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (mask[i]) { 90274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul PACK_RGBA(p, color[RCOMP], color[GCOMP], color[BCOMP], color[ACOMP]); 903afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 904afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 905afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 906afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 907afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 908afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 90974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void 91074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulwrite_rgba_pixels( const GLcontext *ctx, GLuint n, 91174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const GLint x[], const GLint y[], 91274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul CONST GLchan rgba[][4], const GLubyte mask[] ) 913afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 91474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const OSMesaContext osmesa = OSMESA_CONTEXT(ctx); 915afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLuint i; 91674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul for (i = 0; i < n; i++) { 917afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (mask[i]) { 91874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul GLchan *p = PIXELADDR4(x[i], y[i]); 91974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul PACK_RGBA(p, rgba[i][RCOMP], rgba[i][GCOMP], 92074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul rgba[i][BCOMP], rgba[i][ACOMP]); 921afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 922afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 923afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 924afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 925afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 926afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 92774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void 92874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulwrite_monocolor_pixels( const GLcontext *ctx, GLuint n, 92974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const GLint x[], const GLint y[], 93074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const GLchan color[4], const GLubyte mask[] ) 931afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 93274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const OSMesaContext osmesa = OSMESA_CONTEXT(ctx); 933afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLuint i; 93474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul for (i = 0; i < n; i++) { 935afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (mask[i]) { 93674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul GLchan *p = PIXELADDR4(x[i], y[i]); 93774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul PACK_RGBA(p, color[RCOMP], color[GCOMP], color[BCOMP], color[ACOMP]); 938afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 939afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 940afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 941afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 942afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 94374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void 94474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulread_rgba_span( const GLcontext *ctx, GLuint n, GLint x, GLint y, 94574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul GLchan rgba[][4] ) 946afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 94774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const OSMesaContext osmesa = OSMESA_CONTEXT(ctx); 948afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLuint i; 94974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul GLchan *p = PIXELADDR4(x, y); 95074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul for (i = 0; i < n; i++, p += 4) { 95174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul rgba[i][RCOMP] = UNPACK_RED(p); 95274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul rgba[i][GCOMP] = UNPACK_GREEN(p); 95374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul rgba[i][BCOMP] = UNPACK_BLUE(p); 95474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul rgba[i][ACOMP] = UNPACK_ALPHA(p); 955afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 956afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 957afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 958afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 959afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/* Read RGBA pixels from an RGBA buffer */ 96074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void 96174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulread_rgba_span_rgba( const GLcontext *ctx, GLuint n, GLint x, GLint y, 96274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul GLchan rgba[][4] ) 963afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 964c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul OSMesaContext osmesa = OSMESA_CONTEXT(ctx); 96574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul GLuint *ptr4 = (GLuint *) PIXELADDR4(x, y); 9669499e017b7e05411a32b3e4fa94885eaec0d7277Brian Paul MEMCPY( rgba, ptr4, n * 4 * sizeof(GLchan) ); 967afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 968afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 969afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 97074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void 97174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulread_rgba_pixels( const GLcontext *ctx, 97274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul GLuint n, const GLint x[], const GLint y[], 97374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul GLchan rgba[][4], const GLubyte mask[] ) 974afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 97574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const OSMesaContext osmesa = OSMESA_CONTEXT(ctx); 976afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLuint i; 97774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul for (i = 0; i < n; i++) { 978afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (mask[i]) { 97974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const GLchan *p = PIXELADDR4(x[i], y[i]); 98074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul rgba[i][RCOMP] = UNPACK_RED(p); 98174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul rgba[i][GCOMP] = UNPACK_GREEN(p); 98274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul rgba[i][BCOMP] = UNPACK_BLUE(p); 98374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul rgba[i][ACOMP] = UNPACK_ALPHA(p); 984afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 985afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 986afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 987afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 988afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/**********************************************************************/ 989afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/***** 3 byte RGB pixel support funcs *****/ 990afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/**********************************************************************/ 991afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 99274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul/* Write RGBA pixels to an RGB buffer. */ 99374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void 99474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulwrite_rgba_span_RGB( const GLcontext *ctx, GLuint n, GLint x, GLint y, 99574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul CONST GLchan rgba[][4], const GLubyte mask[] ) 996afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 99774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const OSMesaContext osmesa = OSMESA_CONTEXT(ctx); 99874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul GLchan *p = PIXELADDR3(x, y); 999afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLuint i; 1000afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (mask) { 100174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul for (i = 0; i < n; i++, p += 3) { 1002afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (mask[i]) { 100374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul PACK_RGB(p, rgba[i][RCOMP], rgba[i][GCOMP], rgba[i][BCOMP]); 1004afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1005afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1006afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1007afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg else { 100874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul for (i = 0; i < n; i++, p += 3) { 100974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul PACK_RGB(p, rgba[i][RCOMP], rgba[i][GCOMP], rgba[i][BCOMP]); 1010afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1011afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1012afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 1013afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 101474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul/* Write RGBA pixels to an BGR buffer. */ 101574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void 101674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulwrite_rgba_span_BGR( const GLcontext *ctx, GLuint n, GLint x, GLint y, 101774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul CONST GLchan rgba[][4], const GLubyte mask[] ) 1018afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 1019c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul const OSMesaContext osmesa = OSMESA_CONTEXT(ctx); 102074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul GLchan *p = PIXELADDR3(x, y); 1021afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLuint i; 1022afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (mask) { 102374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul for (i = 0; i < n; i++, p += 3) { 1024afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (mask[i]) { 102574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul PACK_BGR(p, rgba[i][RCOMP], rgba[i][GCOMP], rgba[i][BCOMP]); 1026afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1027afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1028afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1029afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg else { 103074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul for (i = 0; i < n; i++, p += 3) { 103174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul PACK_BGR(p, rgba[i][RCOMP], rgba[i][GCOMP], rgba[i][BCOMP]); 1032afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1033afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1034afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 1035afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 103674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul/* Write RGB pixels to an RGB buffer. */ 103774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void 103874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulwrite_rgb_span_RGB( const GLcontext *ctx, GLuint n, GLint x, GLint y, 103974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul CONST GLchan rgb[][3], const GLubyte mask[] ) 104074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul{ 104174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const OSMesaContext osmesa = OSMESA_CONTEXT(ctx); 104274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul GLchan *p = PIXELADDR3(x, y); 104374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul GLuint i; 104474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul if (mask) { 104574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul for (i = 0; i < n; i++, p += 3) { 104674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul if (mask[i]) { 104774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul PACK_RGB(p, rgb[i][RCOMP], rgb[i][GCOMP], rgb[i][BCOMP]); 104874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul } 104974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul } 105074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul } 105174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul else { 105274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul for (i = 0; i < n; i++, p += 3) { 105374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul PACK_RGB(p, rgb[i][RCOMP], rgb[i][GCOMP], rgb[i][BCOMP]); 105474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul } 105574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul } 105674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul} 1057afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 105874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul/* Write RGB pixels to an BGR buffer. */ 105974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void 106074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulwrite_rgb_span_BGR( const GLcontext *ctx, GLuint n, GLint x, GLint y, 106174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul CONST GLchan rgb[][3], const GLubyte mask[] ) 1062afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 1063c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul const OSMesaContext osmesa = OSMESA_CONTEXT(ctx); 106474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul GLchan *p = PIXELADDR3(x, y); 1065afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLuint i; 106674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul if (mask) { 106774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul for (i = 0; i < n; i++, p += 3) { 106874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul if (mask[i]) { 106974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul PACK_BGR(p, rgb[i][RCOMP], rgb[i][GCOMP], rgb[i][BCOMP]); 107074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul } 107174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul } 107274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul } 107374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul else { 107474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul for (i = 0; i < n; i++, p += 3) { 107574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul PACK_BGR(p, rgb[i][RCOMP], rgb[i][GCOMP], rgb[i][BCOMP]); 107674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul } 107774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul } 107874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul} 107974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul 108074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul 108174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void 108274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulwrite_monocolor_span_RGB( const GLcontext *ctx, GLuint n, GLint x, GLint y, 108374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const GLchan color[4], const GLubyte mask[] ) 108474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul{ 108574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const OSMesaContext osmesa = OSMESA_CONTEXT(ctx); 108674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul GLchan *p = PIXELADDR3(x, y); 108774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul GLuint i; 108874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul for (i = 0; i < n; i++, p += 3) { 108974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul if (mask[i]) { 109074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul PACK_RGB(p, color[RCOMP], color[GCOMP], color[BCOMP]); 109174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul } 109274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul } 109374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul} 109474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul 109574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void 109674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulwrite_monocolor_span_BGR( const GLcontext *ctx, GLuint n, GLint x, GLint y, 109774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const GLchan color[4], const GLubyte mask[] ) 109874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul{ 109974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const OSMesaContext osmesa = OSMESA_CONTEXT(ctx); 110074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul GLchan *p = PIXELADDR3(x, y); 110174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul GLuint i; 110274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul for (i = 0; i < n; i++, p += 3) { 1103afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (mask[i]) { 110474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul PACK_BGR(p, color[RCOMP], color[GCOMP], color[BCOMP]); 1105afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1106afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1107afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 1108afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 110974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void 111074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulwrite_rgba_pixels_RGB( const GLcontext *ctx, GLuint n, 111174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const GLint x[], const GLint y[], 111274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul CONST GLchan rgba[][4], const GLubyte mask[] ) 1113afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 1114c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul const OSMesaContext osmesa = (const OSMesaContext) ctx; 1115afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLuint i; 111674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul for (i = 0; i < n; i++) { 111774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul if (mask[i]) { 111874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul GLchan *p = PIXELADDR3(x[i], y[i]); 111974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul PACK_RGB(p, rgba[i][RCOMP], rgba[i][GCOMP], rgba[i][BCOMP]); 112074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul } 112174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul } 112274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul} 112374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul 112474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void 112574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulwrite_rgba_pixels_BGR( const GLcontext *ctx, GLuint n, 112674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const GLint x[], const GLint y[], 112774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul CONST GLchan rgba[][4], const GLubyte mask[] ) 112874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul{ 112974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const OSMesaContext osmesa = (const OSMesaContext) ctx; 113074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul GLuint i; 113174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul for (i = 0; i < n; i++) { 1132afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (mask[i]) { 113374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul GLchan *p = PIXELADDR3(x[i], y[i]); 113474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul PACK_BGR(p, rgba[i][RCOMP], rgba[i][GCOMP], rgba[i][BCOMP]); 1135afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1136afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1137afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 1138afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 113974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void 114074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulwrite_monocolor_pixels_RGB( const GLcontext *ctx, 114174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul GLuint n, const GLint x[], const GLint y[], 114274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const GLchan color[4], const GLubyte mask[] ) 1143afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 1144c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul const OSMesaContext osmesa = OSMESA_CONTEXT(ctx); 1145afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLuint i; 114674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul for (i = 0; i < n; i++) { 1147afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (mask[i]) { 114874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul GLchan *p = PIXELADDR3(x[i], y[i]); 114974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul PACK_RGB(p, color[RCOMP], color[GCOMP], color[BCOMP]); 1150afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1151afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1152afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 1153afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 115474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void 115574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulwrite_monocolor_pixels_BGR( const GLcontext *ctx, 115674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul GLuint n, const GLint x[], const GLint y[], 115774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const GLchan color[4], const GLubyte mask[] ) 1158afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 115974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const OSMesaContext osmesa = OSMESA_CONTEXT(ctx); 116074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul GLuint i; 116174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul for (i = 0; i < n; i++) { 116274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul if (mask[i]) { 116374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul GLchan *p = PIXELADDR3(x[i], y[i]); 116474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul PACK_BGR(p, color[RCOMP], color[GCOMP], color[BCOMP]); 116574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul } 116674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul } 116774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul} 116874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul 116974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void 117074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulread_rgba_span3( const GLcontext *ctx, GLuint n, GLint x, GLint y, 117174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul GLchan rgba[][4] ) 117274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul{ 117374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const OSMesaContext osmesa = OSMESA_CONTEXT(ctx); 1174afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLuint i; 117574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const GLchan *p = PIXELADDR3(x, y); 117674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul for (i = 0; i < n; i++, p += 3) { 117774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul rgba[i][RCOMP] = UNPACK_RED(p); 117874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul rgba[i][GCOMP] = UNPACK_GREEN(p); 117974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul rgba[i][BCOMP] = UNPACK_BLUE(p); 118074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul rgba[i][ACOMP] = 255; 1181afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1182afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 1183afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 118474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void 118574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulread_rgba_pixels3( const GLcontext *ctx, 118674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul GLuint n, const GLint x[], const GLint y[], 118774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul GLchan rgba[][4], const GLubyte mask[] ) 1188afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 118974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const OSMesaContext osmesa = OSMESA_CONTEXT(ctx); 1190afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLuint i; 119174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul for (i = 0; i < n; i++) { 1192afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (mask[i]) { 119374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const GLchan *p = PIXELADDR3(x[i], y[i]); 119474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul rgba[i][RCOMP] = UNPACK_RED(p); 119574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul rgba[i][GCOMP] = UNPACK_GREEN(p); 119674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul rgba[i][BCOMP] = UNPACK_BLUE(p); 119774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul rgba[i][ACOMP] = 255; 1198afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1199afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1200afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 1201afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1202afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1203afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/**********************************************************************/ 1204afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/***** Read/write spans/arrays of CI pixels *****/ 1205afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/**********************************************************************/ 1206afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1207afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/* Write 32-bit color index to buffer */ 120874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void 120974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulwrite_index32_span( const GLcontext *ctx, GLuint n, GLint x, GLint y, 121074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const GLuint index[], const GLubyte mask[] ) 1211afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 121274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const OSMesaContext osmesa = OSMESA_CONTEXT(ctx); 121374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul GLchan *ptr1 = PIXELADDR1(x, y); 1214afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLuint i; 1215afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (mask) { 1216afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg for (i=0;i<n;i++,ptr1++) { 1217afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (mask[i]) { 121874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul *ptr1 = (GLchan) index[i]; 1219afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1220afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1221afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1222afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg else { 1223afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg for (i=0;i<n;i++,ptr1++) { 122474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul *ptr1 = (GLchan) index[i]; 1225afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1226afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1227afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 1228afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1229afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1230afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/* Write 8-bit color index to buffer */ 123174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void 123274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulwrite_index8_span( const GLcontext *ctx, GLuint n, GLint x, GLint y, 123374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const GLubyte index[], const GLubyte mask[] ) 1234afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 123574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const OSMesaContext osmesa = OSMESA_CONTEXT(ctx); 123674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul GLchan *ptr1 = PIXELADDR1(x, y); 1237afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLuint i; 1238afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (mask) { 1239afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg for (i=0;i<n;i++,ptr1++) { 1240afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (mask[i]) { 124174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul *ptr1 = (GLchan) index[i]; 1242afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1243afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1244afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1245afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg else { 124674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul MEMCPY(ptr1, index, n * sizeof(GLchan)); 1247afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1248afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 1249afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1250afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 125174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void 125274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulwrite_monoindex_span( const GLcontext *ctx, GLuint n, GLint x, GLint y, 125374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul GLuint colorIndex, const GLubyte mask[] ) 1254afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 125574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const OSMesaContext osmesa = OSMESA_CONTEXT(ctx); 125674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul GLchan *ptr1 = PIXELADDR1(x, y); 1257afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLuint i; 1258afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg for (i=0;i<n;i++,ptr1++) { 1259afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (mask[i]) { 126074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul *ptr1 = (GLchan) colorIndex; 1261afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1262afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1263afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 1264afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1265afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 126674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void 126774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulwrite_index_pixels( const GLcontext *ctx, 126874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul GLuint n, const GLint x[], const GLint y[], 126974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const GLuint index[], const GLubyte mask[] ) 1270afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 127174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const OSMesaContext osmesa = OSMESA_CONTEXT(ctx); 1272afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLuint i; 1273afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg for (i=0;i<n;i++) { 1274afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (mask[i]) { 127574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul GLchan *ptr1 = PIXELADDR1(x[i], y[i]); 127674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul *ptr1 = (GLchan) index[i]; 1277afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1278afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1279afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 1280afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1281afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 128274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void 128374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulwrite_monoindex_pixels( const GLcontext *ctx, 128474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul GLuint n, const GLint x[], const GLint y[], 128574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul GLuint colorIndex, const GLubyte mask[] ) 1286afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 128774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const OSMesaContext osmesa = OSMESA_CONTEXT(ctx); 1288afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLuint i; 1289afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg for (i=0;i<n;i++) { 1290afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (mask[i]) { 129174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul GLchan *ptr1 = PIXELADDR1(x[i], y[i]); 129274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul *ptr1 = (GLchan) colorIndex; 1293afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1294afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1295afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 1296afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1297afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 129874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void 129974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulread_index_span( const GLcontext *ctx, 130074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul GLuint n, GLint x, GLint y, GLuint index[] ) 1301afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 130274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const OSMesaContext osmesa = OSMESA_CONTEXT(ctx); 1303afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLuint i; 130474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const GLchan *ptr1 = (const GLchan *) PIXELADDR1(x, y); 1305afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg for (i=0;i<n;i++,ptr1++) { 1306afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg index[i] = (GLuint) *ptr1; 1307afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1308afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 1309afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1310afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 131174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void 131274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulread_index_pixels( const GLcontext *ctx, 131374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul GLuint n, const GLint x[], const GLint y[], 131474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul GLuint index[], const GLubyte mask[] ) 1315afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 131674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const OSMesaContext osmesa = OSMESA_CONTEXT(ctx); 1317afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLuint i; 1318afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg for (i=0;i<n;i++) { 1319afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (mask[i] ) { 132074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const GLchan *ptr1 = PIXELADDR1(x[i], y[i]); 1321afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg index[i] = (GLuint) *ptr1; 1322afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1323afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1324afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 1325afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1326afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1327afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1328afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/**********************************************************************/ 1329afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/***** Optimized line rendering *****/ 1330afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/**********************************************************************/ 1331afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1332afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1333afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/* 1334afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Draw a flat-shaded, RGB line into an osmesa buffer. 1335afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */ 133674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void 133774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulflat_rgba_line( GLcontext *ctx, const SWvertex *vert0, const SWvertex *vert1 ) 1338afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 133974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const OSMesaContext osmesa = OSMESA_CONTEXT(ctx); 134074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const GLchan *color = vert0->color; 1341afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1342afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#define INTERP_XY 1 1343afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#define CLIP_HACK 1 134474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul#define PLOT(X, Y) \ 134574b493a5e61237de081a438e774e5d8139d4c6b7Brian Pauldo { \ 134674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul GLchan *p = PIXELADDR4(X, Y); \ 134774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul PACK_RGBA(p, color[0], color[1], color[2], color[3]); \ 134874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul} while (0) 1349afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1350afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#ifdef WIN32 1351724abeb058ca9372c5a9b9e38ee43dde1accaa41Keith Whitwell#include "..\swrast\s_linetemp.h" 1352afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#else 1353724abeb058ca9372c5a9b9e38ee43dde1accaa41Keith Whitwell#include "swrast/s_linetemp.h" 1354afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#endif 1355afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 1356afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1357afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1358afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/* 1359afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Draw a flat-shaded, Z-less, RGB line into an osmesa buffer. 1360afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */ 136174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void 136274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulflat_rgba_z_line(GLcontext *ctx, const SWvertex *vert0, const SWvertex *vert1) 1363afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 136474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const OSMesaContext osmesa = OSMESA_CONTEXT(ctx); 136574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const GLchan *color = vert0->color; 1366afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1367afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#define INTERP_XY 1 1368afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#define INTERP_Z 1 1369ed30dfa1264ec8875a3162c3c8778bc703bf11d5Brian Paul#define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE 1370afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#define CLIP_HACK 1 137174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul#define PLOT(X, Y) \ 137274b493a5e61237de081a438e774e5d8139d4c6b7Brian Pauldo { \ 137374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul if (Z < *zPtr) { \ 137474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul GLchan *p = PIXELADDR4(X, Y); \ 137574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul PACK_RGBA(p, color[RCOMP], color[GCOMP], \ 137674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul color[BCOMP], color[ACOMP]); \ 137774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul *zPtr = Z; \ 137874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul } \ 137974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul} while (0) 138074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul 1381afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1382afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#ifdef WIN32 1383724abeb058ca9372c5a9b9e38ee43dde1accaa41Keith Whitwell#include "..\swrast\s_linetemp.h" 1384afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#else 1385724abeb058ca9372c5a9b9e38ee43dde1accaa41Keith Whitwell#include "swrast/s_linetemp.h" 1386afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#endif 1387afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 1388afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1389afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1390afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/* 1391afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Draw a flat-shaded, alpha-blended, RGB line into an osmesa buffer. 139274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul * XXX update for GLchan 1393afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */ 139474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void 139574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulflat_blend_rgba_line( GLcontext *ctx, 139674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const SWvertex *vert0, const SWvertex *vert1 ) 1397afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 139874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const OSMesaContext osmesa = OSMESA_CONTEXT(ctx); 139974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const GLint rshift = osmesa->rshift; 140074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const GLint gshift = osmesa->gshift; 140174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const GLint bshift = osmesa->bshift; 140274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const GLint avalue = vert0->color[3]; 140374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const GLint msavalue = 255 - avalue; 140474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const GLint rvalue = vert0->color[0]*avalue; 140574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const GLint gvalue = vert0->color[1]*avalue; 140674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const GLint bvalue = vert0->color[2]*avalue; 1407afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1408afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#define INTERP_XY 1 1409afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#define CLIP_HACK 1 1410afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#define PLOT(X,Y) \ 141174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul { GLuint *ptr4 = (GLuint *) PIXELADDR4(X, Y); \ 14127e67fb41fb54e050f6983b4de09ed3a317d6148fBrian Paul GLuint pixel = 0; \ 1413afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg pixel |=((((((*ptr4) >> rshift) & 0xff)*msavalue+rvalue)>>8) << rshift);\ 1414afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg pixel |=((((((*ptr4) >> gshift) & 0xff)*msavalue+gvalue)>>8) << gshift);\ 1415afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg pixel |=((((((*ptr4) >> bshift) & 0xff)*msavalue+bvalue)>>8) << bshift);\ 14167e67fb41fb54e050f6983b4de09ed3a317d6148fBrian Paul *ptr4 = pixel; \ 1417afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1418afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1419afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#ifdef WIN32 1420724abeb058ca9372c5a9b9e38ee43dde1accaa41Keith Whitwell#include "..\swrast\s_linetemp.h" 1421afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#else 1422724abeb058ca9372c5a9b9e38ee43dde1accaa41Keith Whitwell#include "swrast/s_linetemp.h" 1423afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#endif 1424afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 1425afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1426ed30dfa1264ec8875a3162c3c8778bc703bf11d5Brian Paul 1427afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/* 1428afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Draw a flat-shaded, Z-less, alpha-blended, RGB line into an osmesa buffer. 142974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul * XXX update for GLchan 1430afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */ 143174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void 143274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulflat_blend_rgba_z_line( GLcontext *ctx, 143374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const SWvertex *vert0, const SWvertex *vert1 ) 1434afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 143574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const OSMesaContext osmesa = OSMESA_CONTEXT(ctx); 143674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const GLint rshift = osmesa->rshift; 143774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const GLint gshift = osmesa->gshift; 143874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const GLint bshift = osmesa->bshift; 143974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const GLint avalue = vert0->color[3]; 144074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const GLint msavalue = 256 - avalue; 144174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const GLint rvalue = vert0->color[0]*avalue; 144274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const GLint gvalue = vert0->color[1]*avalue; 144374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const GLint bvalue = vert0->color[2]*avalue; 1444afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1445afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#define INTERP_XY 1 1446afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#define INTERP_Z 1 1447ed30dfa1264ec8875a3162c3c8778bc703bf11d5Brian Paul#define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE 1448afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#define CLIP_HACK 1 14497e67fb41fb54e050f6983b4de09ed3a317d6148fBrian Paul#define PLOT(X,Y) \ 14507e67fb41fb54e050f6983b4de09ed3a317d6148fBrian Paul if (Z < *zPtr) { \ 145174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul GLuint *ptr4 = (GLuint *) PIXELADDR4(X, Y); \ 14527e67fb41fb54e050f6983b4de09ed3a317d6148fBrian Paul GLuint pixel = 0; \ 1453ed30dfa1264ec8875a3162c3c8778bc703bf11d5Brian Paul pixel |=((((((*ptr4) >> rshift) & 0xff)*msavalue+rvalue)>>8) << rshift); \ 1454ed30dfa1264ec8875a3162c3c8778bc703bf11d5Brian Paul pixel |=((((((*ptr4) >> gshift) & 0xff)*msavalue+gvalue)>>8) << gshift); \ 1455ed30dfa1264ec8875a3162c3c8778bc703bf11d5Brian Paul pixel |=((((((*ptr4) >> bshift) & 0xff)*msavalue+bvalue)>>8) << bshift); \ 14567e67fb41fb54e050f6983b4de09ed3a317d6148fBrian Paul *ptr4 = pixel; \ 1457afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1458afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1459afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#ifdef WIN32 1460724abeb058ca9372c5a9b9e38ee43dde1accaa41Keith Whitwell#include "..\swrast\s_linetemp.h" 1461afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#else 1462724abeb058ca9372c5a9b9e38ee43dde1accaa41Keith Whitwell#include "swrast/s_linetemp.h" 1463afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#endif 1464afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 1465afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1466ed30dfa1264ec8875a3162c3c8778bc703bf11d5Brian Paul 1467afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/* 1468afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Draw a flat-shaded, Z-less, alpha-blended, RGB line into an osmesa buffer. 146974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul * XXX update for GLchan 1470afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */ 147174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void 147274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulflat_blend_rgba_z_line_write( GLcontext *ctx, 147374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const SWvertex *vert0, const SWvertex *vert1 ) 1474afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 147574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const OSMesaContext osmesa = OSMESA_CONTEXT(ctx); 147674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const GLint rshift = osmesa->rshift; 147774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const GLint gshift = osmesa->gshift; 147874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const GLint bshift = osmesa->bshift; 147974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const GLint avalue = vert0->color[3]; 148074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const GLint msavalue = 256 - avalue; 148174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const GLint rvalue = vert0->color[0]*avalue; 148274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const GLint gvalue = vert0->color[1]*avalue; 148374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const GLint bvalue = vert0->color[2]*avalue; 1484afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1485afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#define INTERP_XY 1 1486afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#define INTERP_Z 1 1487ed30dfa1264ec8875a3162c3c8778bc703bf11d5Brian Paul#define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE 1488afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#define CLIP_HACK 1 14897e67fb41fb54e050f6983b4de09ed3a317d6148fBrian Paul#define PLOT(X,Y) \ 14907e67fb41fb54e050f6983b4de09ed3a317d6148fBrian Paul if (Z < *zPtr) { \ 149174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul GLuint *ptr4 = (GLuint *) PIXELADDR4(X, Y); \ 14927e67fb41fb54e050f6983b4de09ed3a317d6148fBrian Paul GLuint pixel = 0; \ 1493ed30dfa1264ec8875a3162c3c8778bc703bf11d5Brian Paul pixel |=((((((*ptr4) >> rshift) & 0xff)*msavalue+rvalue)>>8) << rshift); \ 1494ed30dfa1264ec8875a3162c3c8778bc703bf11d5Brian Paul pixel |=((((((*ptr4) >> gshift) & 0xff)*msavalue+gvalue)>>8) << gshift); \ 1495ed30dfa1264ec8875a3162c3c8778bc703bf11d5Brian Paul pixel |=((((((*ptr4) >> bshift) & 0xff)*msavalue+bvalue)>>8) << bshift); \ 14967e67fb41fb54e050f6983b4de09ed3a317d6148fBrian Paul *ptr4 = pixel; \ 14977e67fb41fb54e050f6983b4de09ed3a317d6148fBrian Paul *zPtr = Z; \ 1498afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1499afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1500afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#ifdef WIN32 1501724abeb058ca9372c5a9b9e38ee43dde1accaa41Keith Whitwell#include "..\swrast\s_linetemp.h" 1502afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#else 1503724abeb058ca9372c5a9b9e38ee43dde1accaa41Keith Whitwell#include "swrast/s_linetemp.h" 1504afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#endif 1505afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 1506afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1507afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1508afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/* 1509afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Analyze context state to see if we can provide a fast line drawing 1510afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * function, like those in lines.c. Otherwise, return NULL. 1511afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */ 1512dbd1e2b5990a3689bf718296c57c14fc3ba38db5Jouk Jansenstatic swrast_line_func 15131e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwellosmesa_choose_line_function( GLcontext *ctx ) 1514afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 151574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const OSMesaContext osmesa = OSMESA_CONTEXT(ctx); 151674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const SWcontext *swrast = SWRAST_CONTEXT(ctx); 1517afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 151874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul if (CHAN_BITS != 8) return NULL; 15192d595d70202bad560c27ea81ec71b740415b3355Brian Paul if (ctx->RenderMode != GL_RENDER) return NULL; 1520afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (ctx->Line.SmoothFlag) return NULL; 15212d595d70202bad560c27ea81ec71b740415b3355Brian Paul if (ctx->Texture._ReallyEnabled) return NULL; 152274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul if (ctx->Light.ShadeModel != GL_FLAT) return NULL; 152374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul if (ctx->Line.Width != 1.0F) return NULL; 152474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul if (ctx->Line.StippleFlag) return NULL; 152574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul if (ctx->Line.SmoothFlag) return NULL; 152674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul if (osmesa->format != OSMESA_RGBA && 152774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul osmesa->format != OSMESA_BGRA && 152874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul osmesa->format != OSMESA_ARGB) return NULL; 152974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul 153074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul if (swrast->_RasterMask==DEPTH_BIT 153174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul && ctx->Depth.Func==GL_LESS 153274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul && ctx->Depth.Mask==GL_TRUE 153374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul && ctx->Visual.depthBits == DEFAULT_SOFTWARE_DEPTH_BITS) { 153474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul return flat_rgba_z_line; 153574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul } 153674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul 153774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul if (swrast->_RasterMask == 0) { 153874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul return flat_rgba_line; 153974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul } 154074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul 154174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul if (swrast->_RasterMask==(DEPTH_BIT|BLEND_BIT) 154274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul && ctx->Depth.Func==GL_LESS 154374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul && ctx->Depth.Mask==GL_TRUE 154474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul && ctx->Visual.depthBits == DEFAULT_SOFTWARE_DEPTH_BITS 154574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul && ctx->Color.BlendSrcRGB==GL_SRC_ALPHA 154674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul && ctx->Color.BlendDstRGB==GL_ONE_MINUS_SRC_ALPHA 154774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul && ctx->Color.BlendSrcA==GL_SRC_ALPHA 154874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul && ctx->Color.BlendDstA==GL_ONE_MINUS_SRC_ALPHA 154974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul && ctx->Color.BlendEquation==GL_FUNC_ADD_EXT) { 155074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul return flat_blend_rgba_z_line_write; 155174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul } 155274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul 155374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul if (swrast->_RasterMask==(DEPTH_BIT|BLEND_BIT) 155474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul && ctx->Depth.Func==GL_LESS 155574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul && ctx->Depth.Mask==GL_FALSE 155674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul && ctx->Visual.depthBits == DEFAULT_SOFTWARE_DEPTH_BITS 155774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul && ctx->Color.BlendSrcRGB==GL_SRC_ALPHA 155874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul && ctx->Color.BlendDstRGB==GL_ONE_MINUS_SRC_ALPHA 155974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul && ctx->Color.BlendSrcA==GL_SRC_ALPHA 156074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul && ctx->Color.BlendDstA==GL_ONE_MINUS_SRC_ALPHA 156174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul && ctx->Color.BlendEquation==GL_FUNC_ADD_EXT) { 156274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul return flat_blend_rgba_z_line; 156374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul } 1564afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 156574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul if (swrast->_RasterMask==BLEND_BIT 156674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul && ctx->Color.BlendSrcRGB==GL_SRC_ALPHA 156774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul && ctx->Color.BlendDstRGB==GL_ONE_MINUS_SRC_ALPHA 156874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul && ctx->Color.BlendSrcA==GL_SRC_ALPHA 156974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul && ctx->Color.BlendDstA==GL_ONE_MINUS_SRC_ALPHA 157074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul && ctx->Color.BlendEquation==GL_FUNC_ADD_EXT) { 157174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul return flat_blend_rgba_line; 1572afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 157374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul 1574afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return NULL; 1575afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 1576afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1577afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1578afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/**********************************************************************/ 1579afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/***** Optimized triangle rendering *****/ 1580afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/**********************************************************************/ 1581afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1582afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1583afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/* 1584afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Smooth-shaded, z-less triangle, RGBA color. 1585afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */ 1586dbd1e2b5990a3689bf718296c57c14fc3ba38db5Jouk Jansenstatic void smooth_rgba_z_triangle( GLcontext *ctx, 1587a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul const SWvertex *v0, 1588a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul const SWvertex *v1, 1589a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul const SWvertex *v2 ) 1590afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 159174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const OSMesaContext osmesa = OSMESA_CONTEXT(ctx); 159223ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank 1593afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#define INTERP_Z 1 1594ed30dfa1264ec8875a3162c3c8778bc703bf11d5Brian Paul#define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE 1595afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#define INTERP_RGB 1 1596afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#define INTERP_ALPHA 1 1597afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#define INNER_LOOP( LEFT, RIGHT, Y ) \ 1598afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ \ 1599afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLint i, len = RIGHT-LEFT; \ 160074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul GLchan *img = PIXELADDR4(LEFT, Y); \ 160174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul (void) fffog; \ 160274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul for (i = 0; i < len; i++, img += 4) { \ 1603afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLdepth z = FixedToDepth(ffz); \ 1604afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (z < zRow[i]) { \ 160574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul PACK_RGBA(img, FixedToInt(ffr), FixedToInt(ffg), \ 160674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul FixedToInt(ffb), FixedToInt(ffa)); \ 1607afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg zRow[i] = z; \ 1608afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } \ 1609afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ffr += fdrdx; ffg += fdgdx; ffb += fdbdx; ffa += fdadx;\ 1610afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ffz += fdzdx; \ 1611afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } \ 1612afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 1613afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#ifdef WIN32 1614724abeb058ca9372c5a9b9e38ee43dde1accaa41Keith Whitwell#include "..\swrast\s_tritemp.h" 1615afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#else 1616724abeb058ca9372c5a9b9e38ee43dde1accaa41Keith Whitwell#include "swrast/s_tritemp.h" 1617afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#endif 1618afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 1619afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1620afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1621afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1622afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1623afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/* 1624afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Flat-shaded, z-less triangle, RGBA color. 1625afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */ 1626dbd1e2b5990a3689bf718296c57c14fc3ba38db5Jouk Jansenstatic void flat_rgba_z_triangle( GLcontext *ctx, 1627a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul const SWvertex *v0, 1628a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul const SWvertex *v1, 1629a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul const SWvertex *v2 ) 1630afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 163174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const OSMesaContext osmesa = OSMESA_CONTEXT(ctx); 1632afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#define INTERP_Z 1 1633ed30dfa1264ec8875a3162c3c8778bc703bf11d5Brian Paul#define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE 163474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul#define SETUP_CODE \ 163574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul GLuint pixel; \ 163674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul PACK_RGBA((GLchan *) &pixel, v0->color[0], v0->color[1], \ 163774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul v0->color[2], v0->color[3]); 163874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul 163974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul#define INNER_LOOP( LEFT, RIGHT, Y ) \ 164074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul{ \ 164174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul GLint i, len = RIGHT-LEFT; \ 164274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul GLuint *img = (GLuint *) PIXELADDR4(LEFT, Y); \ 164374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul (void) fffog; \ 164474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul for (i=0;i<len;i++) { \ 164574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul GLdepth z = FixedToDepth(ffz); \ 164674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul if (z < zRow[i]) { \ 164774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul img[i] = pixel; \ 164874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul zRow[i] = z; \ 164974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul } \ 165074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul ffz += fdzdx; \ 165174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul } \ 1652afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 1653afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#ifdef WIN32 1654724abeb058ca9372c5a9b9e38ee43dde1accaa41Keith Whitwell#include "..\swrast\s_tritemp.h" 1655afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#else 1656724abeb058ca9372c5a9b9e38ee43dde1accaa41Keith Whitwell#include "swrast/s_tritemp.h" 1657afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#endif 1658afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 1659afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1660afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1661afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1662afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/* 1663afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Return pointer to an accelerated triangle function if possible. 1664afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */ 1665dbd1e2b5990a3689bf718296c57c14fc3ba38db5Jouk Jansenstatic swrast_tri_func 16661e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwellosmesa_choose_triangle_function( GLcontext *ctx ) 1667afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 166874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const OSMesaContext osmesa = OSMESA_CONTEXT(ctx); 166974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const SWcontext *swrast = SWRAST_CONTEXT(ctx); 167074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul 167174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul if (CHAN_BITS != 8) return (swrast_tri_func) NULL; 167274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul if (ctx->RenderMode != GL_RENDER) return (swrast_tri_func) NULL; 167374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul if (ctx->Polygon.SmoothFlag) return (swrast_tri_func) NULL; 167474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul if (ctx->Polygon.StippleFlag) return (swrast_tri_func) NULL; 167574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul if (ctx->Texture._ReallyEnabled) return (swrast_tri_func) NULL; 167674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul if (osmesa->format != OSMESA_RGBA && 167774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul osmesa->format != OSMESA_BGRA && 167874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul osmesa->format != OSMESA_ARGB) return (swrast_tri_func) NULL; 167974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul 168074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul if (swrast->_RasterMask == DEPTH_BIT && 168174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul ctx->Depth.Func == GL_LESS && 168274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul ctx->Depth.Mask == GL_TRUE && 168374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul ctx->Visual.depthBits == DEFAULT_SOFTWARE_DEPTH_BITS) { 168474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul if (ctx->Light.ShadeModel == GL_SMOOTH) { 1685afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return smooth_rgba_z_triangle; 1686afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1687afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg else { 1688afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return flat_rgba_z_triangle; 1689afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1690afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 169174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul return (swrast_tri_func) NULL; 16921e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell} 16931e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell 169474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul 169574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul 16961e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell/* Override for the swrast triangle-selection function. Try to use one 16971e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell * of our internal triangle functions, otherwise fall back to the 1698dbd1e2b5990a3689bf718296c57c14fc3ba38db5Jouk Jansen * standard swrast functions. 16991e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell */ 17001e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwellstatic void osmesa_choose_triangle( GLcontext *ctx ) 17011e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell{ 17021e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell SWcontext *swrast = SWRAST_CONTEXT(ctx); 17031e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell 17041e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell swrast->Triangle = osmesa_choose_triangle_function( ctx ); 17051e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell if (!swrast->Triangle) 17061e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell _swrast_choose_triangle( ctx ); 1707afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 1708afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 17091e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwellstatic void osmesa_choose_line( GLcontext *ctx ) 17101e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell{ 17111e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell SWcontext *swrast = SWRAST_CONTEXT(ctx); 17121e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell 17131e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell swrast->Line = osmesa_choose_line_function( ctx ); 17141e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell if (!swrast->Line) 17151e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell _swrast_choose_line( ctx ); 17161e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell} 17171e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell 17181e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell 17192d595d70202bad560c27ea81ec71b740415b3355Brian Paul#define OSMESA_NEW_LINE (_NEW_LINE | \ 17202d595d70202bad560c27ea81ec71b740415b3355Brian Paul _NEW_TEXTURE | \ 17212d595d70202bad560c27ea81ec71b740415b3355Brian Paul _NEW_LIGHT | \ 17222d595d70202bad560c27ea81ec71b740415b3355Brian Paul _NEW_DEPTH | \ 17232d595d70202bad560c27ea81ec71b740415b3355Brian Paul _NEW_RENDERMODE | \ 1724dbd1e2b5990a3689bf718296c57c14fc3ba38db5Jouk Jansen _SWRAST_NEW_RASTERMASK) 17252d595d70202bad560c27ea81ec71b740415b3355Brian Paul 17262d595d70202bad560c27ea81ec71b740415b3355Brian Paul#define OSMESA_NEW_TRIANGLE (_NEW_POLYGON | \ 17272d595d70202bad560c27ea81ec71b740415b3355Brian Paul _NEW_TEXTURE | \ 17282d595d70202bad560c27ea81ec71b740415b3355Brian Paul _NEW_LIGHT | \ 17292d595d70202bad560c27ea81ec71b740415b3355Brian Paul _NEW_DEPTH | \ 17302d595d70202bad560c27ea81ec71b740415b3355Brian Paul _NEW_RENDERMODE | \ 17312d595d70202bad560c27ea81ec71b740415b3355Brian Paul _SWRAST_NEW_RASTERMASK) 17321e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell 17331e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell 1734dbd1e2b5990a3689bf718296c57c14fc3ba38db5Jouk Jansen/* Extend the software rasterizer with our line and triangle 17351e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell * functions. 17361e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell */ 17371e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwellstatic void osmesa_register_swrast_functions( GLcontext *ctx ) 17381e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell{ 17391e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell SWcontext *swrast = SWRAST_CONTEXT( ctx ); 1740dbd1e2b5990a3689bf718296c57c14fc3ba38db5Jouk Jansen 17411e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell swrast->choose_line = osmesa_choose_line; 17421e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell swrast->choose_triangle = osmesa_choose_triangle; 1743dbd1e2b5990a3689bf718296c57c14fc3ba38db5Jouk Jansen 17441e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell swrast->invalidate_line |= OSMESA_NEW_LINE; 17451e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell swrast->invalidate_triangle |= OSMESA_NEW_TRIANGLE; 17461e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell} 1747ed30dfa1264ec8875a3162c3c8778bc703bf11d5Brian Paul 1748ed30dfa1264ec8875a3162c3c8778bc703bf11d5Brian Paul 1749afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgstatic const GLubyte *get_string( GLcontext *ctx, GLenum name ) 1750afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 1751afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg (void) ctx; 1752afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg switch (name) { 1753afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_RENDERER: 1754afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return (const GLubyte *) "Mesa OffScreen"; 1755afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg default: 1756afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return NULL; 1757afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1758afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 1759afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1760afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1761cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwellstatic void osmesa_update_state( GLcontext *ctx, GLuint new_state ) 1762afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 1763c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul OSMesaContext osmesa = OSMESA_CONTEXT(ctx); 1764304357dcd496f7ebf499fd9c77b4eba83a75abd5Brian Paul 1765304357dcd496f7ebf499fd9c77b4eba83a75abd5Brian Paul ASSERT((void *) osmesa == (void *) ctx->DriverCtx); 1766afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 176774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul /* 176874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul * XXX these function pointers could be initialized just once during 176974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul * context creation since they don't depend on any state changes. 177074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul */ 177174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul 1772afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ctx->Driver.GetString = get_string; 1773afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ctx->Driver.UpdateState = osmesa_update_state; 1774afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1775cea0e8e6700e871bb9bcb334cb75fbfbfcdfd702Brian Paul ctx->Driver.SetDrawBuffer = set_draw_buffer; 1776cea0e8e6700e871bb9bcb334cb75fbfbfcdfd702Brian Paul ctx->Driver.SetReadBuffer = set_read_buffer; 1777f930330d5f8dbc61d449be65da9e6a951b18a909Brian Paul 1778afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ctx->Driver.Clear = clear; 1779afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1780afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ctx->Driver.GetBufferSize = buffer_size; 1781afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 17821e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell ctx->Driver.PointsFunc = _swsetup_Points; 17831e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell ctx->Driver.LineFunc = _swsetup_Line; 17841e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell ctx->Driver.TriangleFunc = _swsetup_Triangle; 17851e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell ctx->Driver.QuadFunc = _swsetup_Quad; 1786cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell ctx->Driver.BuildProjectedVertices = _swsetup_BuildProjectedVertices; 1787547bbcabffffad1a630c261830998c511efc2b96Brian Paul ctx->Driver.RenderPrimitive = _swsetup_RenderPrimitive; 1788547bbcabffffad1a630c261830998c511efc2b96Brian Paul ctx->Driver.RenderStart = _swsetup_RenderStart; 1789547bbcabffffad1a630c261830998c511efc2b96Brian Paul ctx->Driver.RenderFinish = _swsetup_RenderFinish; 1790afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1791afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg /* RGB(A) span/pixel functions */ 179274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul if (osmesa->format == OSMESA_RGB) { 179374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul ctx->Driver.WriteRGBASpan = write_rgba_span_RGB; 179474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul ctx->Driver.WriteRGBSpan = write_rgb_span_RGB; 179574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul ctx->Driver.WriteMonoRGBASpan = write_monocolor_span_RGB; 179674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul ctx->Driver.WriteRGBAPixels = write_rgba_pixels_RGB; 179774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul ctx->Driver.WriteMonoRGBAPixels = write_monocolor_pixels_RGB; 179874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul ctx->Driver.ReadRGBASpan = read_rgba_span3; 179974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul ctx->Driver.ReadRGBAPixels = read_rgba_pixels3; 180074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul } 180174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul else if (osmesa->format == OSMESA_BGR) { 180274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul ctx->Driver.WriteRGBASpan = write_rgba_span_BGR; 180374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul ctx->Driver.WriteRGBSpan = write_rgb_span_BGR; 180474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul ctx->Driver.WriteMonoRGBASpan = write_monocolor_span_BGR; 180574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul ctx->Driver.WriteRGBAPixels = write_rgba_pixels_BGR; 180674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul ctx->Driver.WriteMonoRGBAPixels = write_monocolor_pixels_BGR; 1807afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ctx->Driver.ReadRGBASpan = read_rgba_span3; 1808afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ctx->Driver.ReadRGBAPixels = read_rgba_pixels3; 1809afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1810afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg else { 1811afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg /* 4 bytes / pixel in frame buffer */ 1812afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ctx->Driver.WriteRGBSpan = write_rgb_span; 1813afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ctx->Driver.WriteRGBAPixels = write_rgba_pixels; 1814afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ctx->Driver.WriteMonoRGBASpan = write_monocolor_span; 1815afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ctx->Driver.WriteMonoRGBAPixels = write_monocolor_pixels; 181674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul if (osmesa->format == OSMESA_RGBA && 181774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul CHAN_TYPE == GL_UNSIGNED_BYTE && 181874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul RCOMP==0 && GCOMP==1 && BCOMP==2 && ACOMP==3) { 181974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul /* special, fast case */ 182074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul ctx->Driver.WriteRGBASpan = write_rgba_span_rgba; 1821afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ctx->Driver.ReadRGBASpan = read_rgba_span_rgba; 182274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul } 182374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul else { 182474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul ctx->Driver.WriteRGBASpan = write_rgba_span; 1825afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ctx->Driver.ReadRGBASpan = read_rgba_span; 182674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul } 1827afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ctx->Driver.ReadRGBAPixels = read_rgba_pixels; 1828afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1829afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1830afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg /* CI span/pixel functions */ 1831afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ctx->Driver.WriteCI32Span = write_index32_span; 1832afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ctx->Driver.WriteCI8Span = write_index8_span; 1833afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ctx->Driver.WriteMonoCISpan = write_monoindex_span; 1834afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ctx->Driver.WriteCI32Pixels = write_index_pixels; 1835afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ctx->Driver.WriteMonoCIPixels = write_monoindex_pixels; 1836afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ctx->Driver.ReadCI32Span = read_index_span; 1837afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ctx->Driver.ReadCI32Pixels = read_index_pixels; 183823caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell 1839cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell _swrast_InvalidateState( ctx, new_state ); 1840cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell _swsetup_InvalidateState( ctx, new_state ); 184158e991705392a2e17a1c8b034f4083a0adaf1943Keith Whitwell _ac_InvalidateState( ctx, new_state ); 1842cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell _tnl_InvalidateState( ctx, new_state ); 1843afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 1844