osmesa.c revision 709892459922a32096fe9dd8261d0d92337bb02f
1709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell/* $Id: osmesa.c,v 1.51 2001/03/19 02:25:35 keithw 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 38eed6f691991ed0d64752fa712c83f67eb700b9adBrian Paul#include "glheader.h" 39afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#include "GL/osmesa.h" 40afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#include "context.h" 4174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul#include "colormac.h" 42afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#include "depth.h" 438e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul#include "extensions.h" 44ebb248aa5c018dc676d389221d76ed329059789eBrian Paul#include "macros.h" 45afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#include "matrix.h" 468e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul#include "mem.h" 473041d05bbcccfddba01a1eeaba01e5da0e1e99afBrian Paul#include "mmath.h" 48dbd1e2b5990a3689bf718296c57c14fc3ba38db5Jouk Jansen#include "mtypes.h" 498e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul#include "texstore.h" 508e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul#include "array_cache/acache.h" 511e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell#include "swrast/swrast.h" 521e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell#include "swrast_setup/swrast_setup.h" 531e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell#include "swrast/s_context.h" 54724abeb058ca9372c5a9b9e38ee43dde1accaa41Keith Whitwell#include "swrast/s_depth.h" 551e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell#include "swrast/s_lines.h" 561e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell#include "swrast/s_triangle.h" 575a9026c65d260dc185e072163999f5d810015108Brian Paul#include "tnl/tnl.h" 58709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell#include "tnl/t_context.h" 59afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 60724abeb058ca9372c5a9b9e38ee43dde1accaa41Keith Whitwell 61724abeb058ca9372c5a9b9e38ee43dde1accaa41Keith Whitwell 62304357dcd496f7ebf499fd9c77b4eba83a75abd5Brian Paul/* 63304357dcd496f7ebf499fd9c77b4eba83a75abd5Brian Paul * This is the OS/Mesa context struct. 64304357dcd496f7ebf499fd9c77b4eba83a75abd5Brian Paul * Notice how it includes a GLcontext. By doing this we're mimicking 65304357dcd496f7ebf499fd9c77b4eba83a75abd5Brian Paul * C++ inheritance/derivation. 66304357dcd496f7ebf499fd9c77b4eba83a75abd5Brian Paul * Later, we can cast a GLcontext pointer into an OSMesaContext pointer 67304357dcd496f7ebf499fd9c77b4eba83a75abd5Brian Paul * or vice versa. 68304357dcd496f7ebf499fd9c77b4eba83a75abd5Brian Paul */ 69afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgstruct osmesa_context { 70304357dcd496f7ebf499fd9c77b4eba83a75abd5Brian Paul GLcontext gl_ctx; /* The core GL/Mesa context */ 71afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLvisual *gl_visual; /* Describes the buffers */ 72afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLframebuffer *gl_buffer; /* Depth, stencil, accum, etc buffers */ 73afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLenum format; /* either GL_RGBA or GL_COLOR_INDEX */ 74afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg void *buffer; /* the image buffer */ 75afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLint width, height; /* size of image buffer */ 76afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLint rowlength; /* number of pixels per row */ 77afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLint userRowLength; /* user-specified number of pixels per row */ 78afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLint rshift, gshift; /* bit shifts for RGBA formats */ 79afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLint bshift, ashift; 8074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul GLint rInd, gInd, bInd, aInd;/* index offsets for RGBA formats */ 8174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul GLchan *rowaddr[MAX_HEIGHT]; /* address of first pixel in each image row */ 82afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLboolean yup; /* TRUE -> Y increases upward */ 83afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg /* FALSE -> Y increases downward */ 84afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}; 85afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 86afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 87afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 88afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/* A forward declaration: */ 89cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwellstatic void osmesa_update_state( GLcontext *ctx, GLuint newstate ); 901e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwellstatic void osmesa_register_swrast_functions( GLcontext *ctx ); 91afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 92afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 93afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 94c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul#define OSMESA_CONTEXT(ctx) ((OSMesaContext) (ctx->DriverCtx)) 95c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul 96c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul 97c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul 98afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/**********************************************************************/ 99afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/***** Public Functions *****/ 100afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/**********************************************************************/ 101afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 102afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 103afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/* 104afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Create an Off-Screen Mesa rendering context. The only attribute needed is 105afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * an RGBA vs Color-Index mode flag. 106afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * 107afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Input: format - either GL_RGBA or GL_COLOR_INDEX 108afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * sharelist - specifies another OSMesaContext with which to share 109afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * display lists. NULL indicates no sharing. 110afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Return: an OSMesaContext or 0 if error 111afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */ 112d3c070ca6a36daa765b1ad7f44e03e6671ad0490Brian PaulOSMesaContext GLAPIENTRY 113d3c070ca6a36daa765b1ad7f44e03e6671ad0490Brian PaulOSMesaCreateContext( GLenum format, OSMesaContext sharelist ) 114afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 1152bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul return OSMesaCreateContextExt(format, DEFAULT_SOFTWARE_DEPTH_BITS, 1162bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul 8, 16, sharelist); 1172bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul} 1182bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul 1192bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul 1202bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul 1212bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul/* 1222bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul * New in Mesa 3.5 1232bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul * 1242bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul * Create context and specify size of ancillary buffers. 1252bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul */ 1262bf5d9470d3232763cb49b5589209940d4d5398dBrian PaulOSMesaContext GLAPIENTRY 1272bf5d9470d3232763cb49b5589209940d4d5398dBrian PaulOSMesaCreateContextExt( GLenum format, GLint depthBits, GLint stencilBits, 1282bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul GLint accumBits, OSMesaContext sharelist ) 1292bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul{ 130afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg OSMesaContext osmesa; 131afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLint rshift, gshift, bshift, ashift; 13274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul GLint rind, gind, bind, aind; 1332bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul GLint indexBits, redBits, greenBits, blueBits, alphaBits; 134afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLboolean rgbmode; 135afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLboolean swalpha; 13674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const GLuint i4 = 1; 13774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const GLubyte *i1 = (GLubyte *) &i4; 13874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const GLint little_endian = *i1; 139afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 140afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg swalpha = GL_FALSE; 14174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul rind = gind = bind = aind = 0; 142afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (format==OSMESA_COLOR_INDEX) { 143afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg indexBits = 8; 144afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg rshift = gshift = bshift = ashift = 0; 145afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg rgbmode = GL_FALSE; 146afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 147afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg else if (format==OSMESA_RGBA) { 148afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg indexBits = 0; 14901915e90e6912f06d43d443a09157f7bbc96ddc5Brian Paul redBits = CHAN_BITS; 15001915e90e6912f06d43d443a09157f7bbc96ddc5Brian Paul greenBits = CHAN_BITS; 15101915e90e6912f06d43d443a09157f7bbc96ddc5Brian Paul blueBits = CHAN_BITS; 15201915e90e6912f06d43d443a09157f7bbc96ddc5Brian Paul alphaBits = CHAN_BITS; 15374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul rind = 0; 15474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul gind = 1; 15574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul bind = 2; 15674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul aind = 3; 157afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (little_endian) { 158afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg rshift = 0; 159afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg gshift = 8; 160afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg bshift = 16; 161afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ashift = 24; 162afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 163afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg else { 164afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg rshift = 24; 165afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg gshift = 16; 166afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg bshift = 8; 167afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ashift = 0; 168afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 169afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg rgbmode = GL_TRUE; 170afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 171afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg else if (format==OSMESA_BGRA) { 172afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg indexBits = 0; 17301915e90e6912f06d43d443a09157f7bbc96ddc5Brian Paul redBits = CHAN_BITS; 17401915e90e6912f06d43d443a09157f7bbc96ddc5Brian Paul greenBits = CHAN_BITS; 17501915e90e6912f06d43d443a09157f7bbc96ddc5Brian Paul blueBits = CHAN_BITS; 17601915e90e6912f06d43d443a09157f7bbc96ddc5Brian Paul alphaBits = CHAN_BITS; 17774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul rind = 2; 17874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul gind = 1; 17974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul bind = 0; 18074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul aind = 3; 181afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (little_endian) { 182afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ashift = 0; 183afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg rshift = 8; 184afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg gshift = 16; 185afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg bshift = 24; 186afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 187afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg else { 188afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg bshift = 24; 189afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg gshift = 16; 190afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg rshift = 8; 191afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ashift = 0; 192afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 193afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg rgbmode = GL_TRUE; 194afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 195afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg else if (format==OSMESA_ARGB) { 196afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg indexBits = 0; 19701915e90e6912f06d43d443a09157f7bbc96ddc5Brian Paul redBits = CHAN_BITS; 19801915e90e6912f06d43d443a09157f7bbc96ddc5Brian Paul greenBits = CHAN_BITS; 19901915e90e6912f06d43d443a09157f7bbc96ddc5Brian Paul blueBits = CHAN_BITS; 20001915e90e6912f06d43d443a09157f7bbc96ddc5Brian Paul alphaBits = CHAN_BITS; 20174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul rind = 1; 20274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul gind = 2; 20374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul bind = 3; 20474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul aind = 0; 205afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (little_endian) { 206afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg bshift = 0; 207afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg gshift = 8; 208afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg rshift = 16; 209afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ashift = 24; 210afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 211afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg else { 212afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ashift = 24; 213afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg rshift = 16; 214afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg gshift = 8; 215afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg bshift = 0; 216afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 217afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg rgbmode = GL_TRUE; 218afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 219afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg else if (format==OSMESA_RGB) { 220afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg indexBits = 0; 22101915e90e6912f06d43d443a09157f7bbc96ddc5Brian Paul redBits = CHAN_BITS; 22201915e90e6912f06d43d443a09157f7bbc96ddc5Brian Paul greenBits = CHAN_BITS; 22301915e90e6912f06d43d443a09157f7bbc96ddc5Brian Paul blueBits = CHAN_BITS; 224afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg alphaBits = 0; 225afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg bshift = 0; 226afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg gshift = 8; 227afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg rshift = 16; 228afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ashift = 24; 229afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg rind = 0; 23074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul gind = 1; 23174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul bind = 2; 232afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg rgbmode = GL_TRUE; 233afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg swalpha = GL_TRUE; 234afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 235afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg else if (format==OSMESA_BGR) { 236afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg indexBits = 0; 23701915e90e6912f06d43d443a09157f7bbc96ddc5Brian Paul redBits = CHAN_BITS; 23801915e90e6912f06d43d443a09157f7bbc96ddc5Brian Paul greenBits = CHAN_BITS; 23901915e90e6912f06d43d443a09157f7bbc96ddc5Brian Paul blueBits = CHAN_BITS; 240afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg alphaBits = 0; 241afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg bshift = 0; 242afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg gshift = 8; 243afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg rshift = 16; 244afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ashift = 24; 245afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg rind = 2; 24674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul gind = 1; 24774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul bind = 0; 248afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg rgbmode = GL_TRUE; 249afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg swalpha = GL_TRUE; 250afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 251afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg else { 252afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return NULL; 253afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 254afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 255afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 256bd5cdaf4442872d3cd2ff94eeafadd481d27fcfbBrian Paul osmesa = (OSMesaContext) CALLOC_STRUCT(osmesa_context); 257afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (osmesa) { 2582bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul osmesa->gl_visual = _mesa_create_visual( rgbmode, 2592bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul GL_FALSE, /* double buffer */ 2602bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul GL_FALSE, /* stereo */ 2612bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul redBits, 2622bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul greenBits, 2632bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul blueBits, 2642bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul alphaBits, 2652bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul indexBits, 2662bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul depthBits, 2672bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul stencilBits, 2682bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul accumBits, 2692bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul accumBits, 2702bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul accumBits, 2712bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul alphaBits ? accumBits : 0, 2722bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul 1 /* num samples */ 2732bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul ); 274afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (!osmesa->gl_visual) { 275941dcc797e1a6317808c1ec43476817286d576baBrian Paul FREE(osmesa); 276afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return NULL; 277afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 278afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 279df81387dfae199a71bc55138ea5856dc05eacf24Brian Paul if (!_mesa_initialize_context(&osmesa->gl_ctx, 280df81387dfae199a71bc55138ea5856dc05eacf24Brian Paul osmesa->gl_visual, 281df81387dfae199a71bc55138ea5856dc05eacf24Brian Paul sharelist ? &sharelist->gl_ctx 282df81387dfae199a71bc55138ea5856dc05eacf24Brian Paul : (GLcontext *) NULL, 283df81387dfae199a71bc55138ea5856dc05eacf24Brian Paul (void *) osmesa, GL_TRUE )) { 284df81387dfae199a71bc55138ea5856dc05eacf24Brian Paul _mesa_destroy_visual( osmesa->gl_visual ); 285bd5cdaf4442872d3cd2ff94eeafadd481d27fcfbBrian Paul FREE(osmesa); 286afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return NULL; 287afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 2885a9026c65d260dc185e072163999f5d810015108Brian Paul 2895a9026c65d260dc185e072163999f5d810015108Brian Paul _mesa_enable_sw_extensions(&(osmesa->gl_ctx)); 290304357dcd496f7ebf499fd9c77b4eba83a75abd5Brian Paul 291b1394fa92aaaf859ce9efc8b5fc194397921320cBrian Paul osmesa->gl_buffer = _mesa_create_framebuffer( osmesa->gl_visual, 292b6bcae5698df88f7730d40004ce7ce0462e97a20Brian Paul osmesa->gl_visual->depthBits > 0, 293b6bcae5698df88f7730d40004ce7ce0462e97a20Brian Paul osmesa->gl_visual->stencilBits > 0, 294b6bcae5698df88f7730d40004ce7ce0462e97a20Brian Paul osmesa->gl_visual->accumRedBits > 0, 295b6bcae5698df88f7730d40004ce7ce0462e97a20Brian Paul osmesa->gl_visual->alphaBits > 0 ); 2964c44d63f01a01f134d7e4456d4209edee97f9ef5Brian Paul 297afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (!osmesa->gl_buffer) { 298b1394fa92aaaf859ce9efc8b5fc194397921320cBrian Paul _mesa_destroy_visual( osmesa->gl_visual ); 299b1394fa92aaaf859ce9efc8b5fc194397921320cBrian Paul _mesa_free_context_data( &osmesa->gl_ctx ); 300bd5cdaf4442872d3cd2ff94eeafadd481d27fcfbBrian Paul FREE(osmesa); 301afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return NULL; 302afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 303afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg osmesa->format = format; 304afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg osmesa->buffer = NULL; 305afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg osmesa->width = 0; 306afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg osmesa->height = 0; 307afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg osmesa->userRowLength = 0; 308afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg osmesa->rowlength = 0; 309afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg osmesa->yup = GL_TRUE; 310afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg osmesa->rshift = rshift; 311afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg osmesa->gshift = gshift; 312afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg osmesa->bshift = bshift; 313afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg osmesa->ashift = ashift; 31474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul osmesa->rInd = rind; 31574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul osmesa->gInd = gind; 31674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul osmesa->bInd = bind; 31774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul osmesa->aInd = aind; 3181e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell 3191e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell 3201e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell /* Initialize the software rasterizer and helper modules. 3211e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell */ 3221e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell { 3231e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell GLcontext *ctx = &osmesa->gl_ctx; 3241e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell 3251e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell _swrast_CreateContext( ctx ); 32658e991705392a2e17a1c8b034f4083a0adaf1943Keith Whitwell _ac_CreateContext( ctx ); 32723caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell _tnl_CreateContext( ctx ); 328cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell _swsetup_CreateContext( ctx ); 329dbd1e2b5990a3689bf718296c57c14fc3ba38db5Jouk Jansen 3301e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell osmesa_register_swrast_functions( ctx ); 3311e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell } 332afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 333afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return osmesa; 334afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 335afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 336afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 337afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 3382bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul 339afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/* 340afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Destroy an Off-Screen Mesa rendering context. 341afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * 342afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Input: ctx - the context to destroy 343afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */ 344afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgvoid GLAPIENTRY OSMesaDestroyContext( OSMesaContext ctx ) 345afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 346afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (ctx) { 347709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell _swsetup_DestroyContext( &ctx->gl_ctx ); 348709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell _tnl_DestroyContext( &ctx->gl_ctx ); 349709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell _ac_DestroyContext( &ctx->gl_ctx ); 350709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell _swrast_DestroyContext( &ctx->gl_ctx ); 351709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell 352b1394fa92aaaf859ce9efc8b5fc194397921320cBrian Paul _mesa_destroy_visual( ctx->gl_visual ); 353b1394fa92aaaf859ce9efc8b5fc194397921320cBrian Paul _mesa_destroy_framebuffer( ctx->gl_buffer ); 354b1394fa92aaaf859ce9efc8b5fc194397921320cBrian Paul _mesa_free_context_data( &ctx->gl_ctx ); 355bd5cdaf4442872d3cd2ff94eeafadd481d27fcfbBrian Paul FREE( ctx ); 356afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 357afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 358afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 359afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 360afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 361afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/* 362afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Recompute the values of the context's rowaddr array. 363afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */ 364afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgstatic void compute_row_addresses( OSMesaContext ctx ) 365afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 36674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul GLint bytesPerPixel, bytesPerRow, i; 36774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul GLubyte *origin = (GLubyte *) ctx->buffer; 36874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul 36974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul if (ctx->format == OSMESA_COLOR_INDEX) { 37074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul /* CI mode */ 37174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul bytesPerPixel = 1 * sizeof(GLchan); 37274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul } 37374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul else if ((ctx->format == OSMESA_RGB) || (ctx->format == OSMESA_BGR)) { 37474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul /* RGB mode */ 37574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul bytesPerPixel = 3 * sizeof(GLchan); 37674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul } 37774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul else { 37874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul /* RGBA mode */ 37974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul bytesPerPixel = 4 * sizeof(GLchan); 38074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul } 38174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul 38274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul bytesPerRow = ctx->rowlength * bytesPerPixel; 383afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 384afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (ctx->yup) { 385afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg /* Y=0 is bottom line of window */ 38674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul for (i = 0; i < MAX_HEIGHT; i++) { 38774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul ctx->rowaddr[i] = (GLchan *) ((GLubyte *) origin + i * bytesPerRow); 388afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 389afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 390afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg else { 391afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg /* Y=0 is top line of window */ 39274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul for (i = 0; i < MAX_HEIGHT; i++) { 39374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul GLint j = ctx->height - i - 1; 39474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul ctx->rowaddr[i] = (GLchan *) ((GLubyte *) origin + j * bytesPerRow); 395afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 396afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 397afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 398afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 399afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 400afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/* 401afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Bind an OSMesaContext to an image buffer. The image buffer is just a 402afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * block of memory which the client provides. Its size must be at least 403afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * as large as width*height*sizeof(type). Its address should be a multiple 404afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * of 4 if using RGBA mode. 405afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * 406afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Image data is stored in the order of glDrawPixels: row-major order 407afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * with the lower-left image pixel stored in the first array position 408afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * (ie. bottom-to-top). 409afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * 410afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Since the only type initially supported is GL_UNSIGNED_BYTE, if the 411afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * context is in RGBA mode, each pixel will be stored as a 4-byte RGBA 412afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * value. If the context is in color indexed mode, each pixel will be 413afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * stored as a 1-byte value. 414afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * 415afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * If the context's viewport hasn't been initialized yet, it will now be 416afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * initialized to (0,0,width,height). 417afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * 418afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Input: ctx - the rendering context 419afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * buffer - the image buffer memory 420afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * type - data type for pixel components, only GL_UNSIGNED_BYTE 421afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * supported now 422afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * width, height - size of image buffer in pixels, at least 1 423afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Return: GL_TRUE if success, GL_FALSE if error because of invalid ctx, 424afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * invalid buffer address, type!=GL_UNSIGNED_BYTE, width<1, height<1, 425afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * width>internal limit or height>internal limit. 426afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */ 427d3c070ca6a36daa765b1ad7f44e03e6671ad0490Brian PaulGLboolean GLAPIENTRY 428d3c070ca6a36daa765b1ad7f44e03e6671ad0490Brian PaulOSMesaMakeCurrent( OSMesaContext ctx, void *buffer, GLenum type, 429d3c070ca6a36daa765b1ad7f44e03e6671ad0490Brian Paul GLsizei width, GLsizei height ) 430afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 43174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul if (!ctx || !buffer || type != CHAN_TYPE || 43274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul width < 1 || height < 1 || 43374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul width > MAX_WIDTH || height > MAX_HEIGHT) { 434afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return GL_FALSE; 435afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 436afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 437cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell osmesa_update_state( &ctx->gl_ctx, 0 ); 438b1394fa92aaaf859ce9efc8b5fc194397921320cBrian Paul _mesa_make_current( &ctx->gl_ctx, ctx->gl_buffer ); 439afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 440afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ctx->buffer = buffer; 441afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ctx->width = width; 442afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ctx->height = height; 443afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (ctx->userRowLength) 444afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ctx->rowlength = ctx->userRowLength; 445afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg else 446afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ctx->rowlength = width; 447afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 448afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg compute_row_addresses( ctx ); 449afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 450afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg /* init viewport */ 451304357dcd496f7ebf499fd9c77b4eba83a75abd5Brian Paul if (ctx->gl_ctx.Viewport.Width==0) { 452afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg /* initialize viewport and scissor box to buffer size */ 453cb5ecb883eb3be842ef44c61df8d4b527877c858Brian Paul _mesa_Viewport( 0, 0, width, height ); 454304357dcd496f7ebf499fd9c77b4eba83a75abd5Brian Paul ctx->gl_ctx.Scissor.Width = width; 455304357dcd496f7ebf499fd9c77b4eba83a75abd5Brian Paul ctx->gl_ctx.Scissor.Height = height; 456afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 457afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 458afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return GL_TRUE; 459afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 460afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 461afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 462afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 463afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgOSMesaContext GLAPIENTRY OSMesaGetCurrentContext( void ) 464afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 465b1394fa92aaaf859ce9efc8b5fc194397921320cBrian Paul GLcontext *ctx = _mesa_get_current_context(); 466d3c070ca6a36daa765b1ad7f44e03e6671ad0490Brian Paul if (ctx) 467304357dcd496f7ebf499fd9c77b4eba83a75abd5Brian Paul return (OSMesaContext) ctx; 468d3c070ca6a36daa765b1ad7f44e03e6671ad0490Brian Paul else 469d3c070ca6a36daa765b1ad7f44e03e6671ad0490Brian Paul return NULL; 470afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 471afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 472afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 473afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 474afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgvoid GLAPIENTRY OSMesaPixelStore( GLint pname, GLint value ) 475afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 476afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg OSMesaContext ctx = OSMesaGetCurrentContext(); 477afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 478afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg switch (pname) { 479afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case OSMESA_ROW_LENGTH: 480afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (value<0) { 48108836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul _mesa_error( &ctx->gl_ctx, GL_INVALID_VALUE, 482afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg "OSMesaPixelStore(value)" ); 483afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return; 484afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 485afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ctx->userRowLength = value; 486afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ctx->rowlength = value; 487afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg break; 488afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case OSMESA_Y_UP: 489afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ctx->yup = value ? GL_TRUE : GL_FALSE; 490afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg break; 491afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg default: 49208836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul _mesa_error( &ctx->gl_ctx, GL_INVALID_ENUM, "OSMesaPixelStore(pname)" ); 493afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return; 494afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 495afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 496afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg compute_row_addresses( ctx ); 497afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 498afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 499afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 500afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgvoid GLAPIENTRY OSMesaGetIntegerv( GLint pname, GLint *value ) 501afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 502afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg OSMesaContext ctx = OSMesaGetCurrentContext(); 503afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 504afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg switch (pname) { 505afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case OSMESA_WIDTH: 506afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg *value = ctx->width; 507afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return; 508afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case OSMESA_HEIGHT: 509afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg *value = ctx->height; 510afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return; 511afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case OSMESA_FORMAT: 512afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg *value = ctx->format; 513afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return; 514afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case OSMESA_TYPE: 51501915e90e6912f06d43d443a09157f7bbc96ddc5Brian Paul *value = CHAN_TYPE; 516afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return; 517afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case OSMESA_ROW_LENGTH: 518afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg *value = ctx->rowlength; 519afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return; 520afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case OSMESA_Y_UP: 521afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg *value = ctx->yup; 522afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return; 523afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg default: 52408836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul _mesa_error(&ctx->gl_ctx, GL_INVALID_ENUM, "OSMesaGetIntergerv(pname)"); 525afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return; 526afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 527afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 528afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 529afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/* 530afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Return the depth buffer associated with an OSMesa context. 531afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Input: c - the OSMesa context 532afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Output: width, height - size of buffer in pixels 533afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * bytesPerValue - bytes per depth value (2 or 4) 534afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * buffer - pointer to depth buffer values 535afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Return: GL_TRUE or GL_FALSE to indicate success or failure. 536afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */ 5377e67fb41fb54e050f6983b4de09ed3a317d6148fBrian PaulGLboolean GLAPIENTRY 5387e67fb41fb54e050f6983b4de09ed3a317d6148fBrian PaulOSMesaGetDepthBuffer( OSMesaContext c, GLint *width, GLint *height, 5397e67fb41fb54e050f6983b4de09ed3a317d6148fBrian Paul GLint *bytesPerValue, void **buffer ) 540afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 541650cb74bcb913d2589355d56a14da1ab0307d1fcBrian Paul if ((!c->gl_buffer) || (!c->gl_buffer->DepthBuffer)) { 542afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg *width = 0; 543afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg *height = 0; 544afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg *bytesPerValue = 0; 545afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg *buffer = 0; 546afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return GL_FALSE; 547afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 548afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg else { 549afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg *width = c->gl_buffer->Width; 550afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg *height = c->gl_buffer->Height; 5519db3f95acea5622573803890afd506ebcdaab3b3Brian Paul if (c->gl_visual->depthBits <= 16) 5529db3f95acea5622573803890afd506ebcdaab3b3Brian Paul *bytesPerValue = sizeof(GLushort); 5539db3f95acea5622573803890afd506ebcdaab3b3Brian Paul else 5549db3f95acea5622573803890afd506ebcdaab3b3Brian Paul *bytesPerValue = sizeof(GLuint); 555650cb74bcb913d2589355d56a14da1ab0307d1fcBrian Paul *buffer = c->gl_buffer->DepthBuffer; 556afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return GL_TRUE; 557afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 558afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 559afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 56023ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank/* 56123ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank * Return the color buffer associated with an OSMesa context. 56223ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank * Input: c - the OSMesa context 56323ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank * Output: width, height - size of buffer in pixels 56423ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank * format - the pixel format (OSMESA_FORMAT) 56523ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank * buffer - pointer to color buffer values 56623ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank * Return: GL_TRUE or GL_FALSE to indicate success or failure. 56723ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank */ 5687e67fb41fb54e050f6983b4de09ed3a317d6148fBrian PaulGLboolean GLAPIENTRY 5697e67fb41fb54e050f6983b4de09ed3a317d6148fBrian PaulOSMesaGetColorBuffer( OSMesaContext c, GLint *width, 5707e67fb41fb54e050f6983b4de09ed3a317d6148fBrian Paul GLint *height, GLint *format, void **buffer ) 57123ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank{ 57223ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank if (!c->buffer) { 57323ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank *width = 0; 57423ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank *height = 0; 57523ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank *format = 0; 57623ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank *buffer = 0; 57723ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank return GL_FALSE; 5787e67fb41fb54e050f6983b4de09ed3a317d6148fBrian Paul } 5797e67fb41fb54e050f6983b4de09ed3a317d6148fBrian Paul else { 58023ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank *width = c->width; 58123ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank *height = c->height; 58223ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank *format = c->format; 58323ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank *buffer = c->buffer; 58423ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank return GL_TRUE; 58523ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank } 58623ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank} 587afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 588afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/**********************************************************************/ 589afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/*** Device Driver Functions ***/ 590afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/**********************************************************************/ 591afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 592afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 593afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/* 594afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Useful macros: 595afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */ 596afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 59774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul#define PACK_RGBA(DST, R, G, B, A) \ 59874b493a5e61237de081a438e774e5d8139d4c6b7Brian Pauldo { \ 59974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul (DST)[osmesa->rInd] = R; \ 60074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul (DST)[osmesa->gInd] = G; \ 60174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul (DST)[osmesa->bInd] = B; \ 60274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul (DST)[osmesa->aInd] = A; \ 60374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul} while (0) 60474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul 60574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul#define PACK_RGB(DST, R, G, B) \ 60674b493a5e61237de081a438e774e5d8139d4c6b7Brian Pauldo { \ 60774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul (DST)[0] = R; \ 60874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul (DST)[1] = G; \ 60974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul (DST)[2] = B; \ 61074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul} while (0) 611afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 61274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul#define PACK_BGR(DST, R, G, B) \ 61374b493a5e61237de081a438e774e5d8139d4c6b7Brian Pauldo { \ 61474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul (DST)[0] = B; \ 61574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul (DST)[1] = G; \ 61674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul (DST)[2] = R; \ 61774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul} while (0) 618afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 619afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 62001915e90e6912f06d43d443a09157f7bbc96ddc5Brian Paul#define UNPACK_RED(P) ( (P)[osmesa->rInd] ) 62101915e90e6912f06d43d443a09157f7bbc96ddc5Brian Paul#define UNPACK_GREEN(P) ( (P)[osmesa->gInd] ) 62201915e90e6912f06d43d443a09157f7bbc96ddc5Brian Paul#define UNPACK_BLUE(P) ( (P)[osmesa->bInd] ) 62301915e90e6912f06d43d443a09157f7bbc96ddc5Brian Paul#define UNPACK_ALPHA(P) ( (P)[osmesa->aInd] ) 62474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul 62574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul 62674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul#define PIXELADDR1(X,Y) (osmesa->rowaddr[Y] + (X)) 62774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul#define PIXELADDR3(X,Y) (osmesa->rowaddr[Y] + 3 * (X)) 62874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul#define PIXELADDR4(X,Y) (osmesa->rowaddr[Y] + 4 * (X)) 629afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 630afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 631afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 632cea0e8e6700e871bb9bcb334cb75fbfbfcdfd702Brian Paulstatic GLboolean set_draw_buffer( GLcontext *ctx, GLenum mode ) 633afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 634afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg (void) ctx; 635afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (mode==GL_FRONT_LEFT) { 636afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return GL_TRUE; 637afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 638afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg else { 639afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return GL_FALSE; 640afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 641afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 642afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 643afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 644cea0e8e6700e871bb9bcb334cb75fbfbfcdfd702Brian Paulstatic void set_read_buffer( GLcontext *ctx, GLframebuffer *buffer, GLenum mode ) 645cea0e8e6700e871bb9bcb334cb75fbfbfcdfd702Brian Paul{ 646cea0e8e6700e871bb9bcb334cb75fbfbfcdfd702Brian Paul /* separate read buffer not supported */ 647cea0e8e6700e871bb9bcb334cb75fbfbfcdfd702Brian Paul ASSERT(buffer == ctx->DrawBuffer); 648cea0e8e6700e871bb9bcb334cb75fbfbfcdfd702Brian Paul ASSERT(mode == GL_FRONT_LEFT); 649cea0e8e6700e871bb9bcb334cb75fbfbfcdfd702Brian Paul} 650cea0e8e6700e871bb9bcb334cb75fbfbfcdfd702Brian Paul 651cea0e8e6700e871bb9bcb334cb75fbfbfcdfd702Brian Paul 652d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwellstatic void clear( GLcontext *ctx, GLbitfield mask, GLboolean all, 653d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell GLint x, GLint y, GLint width, GLint height ) 654afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 655c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul OSMesaContext osmesa = OSMESA_CONTEXT(ctx); 656dd020f13a6d520b46aefd4453dae6b6edcc427f6Brian Paul const GLuint *colorMask = (GLuint *) &ctx->Color.ColorMask; 657dd020f13a6d520b46aefd4453dae6b6edcc427f6Brian Paul 658dd020f13a6d520b46aefd4453dae6b6edcc427f6Brian Paul /* sanity check - we only have a front-left buffer */ 659dd020f13a6d520b46aefd4453dae6b6edcc427f6Brian Paul ASSERT((mask & (DD_FRONT_RIGHT_BIT | DD_BACK_LEFT_BIT | DD_BACK_RIGHT_BIT)) == 0); 660d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell if (*colorMask == 0xffffffff && ctx->Color.IndexMask == 0xffffffff) { 661d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell if (mask & DD_FRONT_LEFT_BIT) { 662d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell if (osmesa->format == OSMESA_COLOR_INDEX) { 663d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell if (all) { 664d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell /* Clear whole CI buffer */ 66574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul#if CHAN_TYPE == GL_UNSIGNED_BYTE 666d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell MEMSET(osmesa->buffer, ctx->Color.ClearIndex, 667d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell osmesa->rowlength * osmesa->height); 66874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul#else 669d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell const GLint n = osmesa->rowlength * osmesa->height; 670d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell GLchan *buffer = (GLchan *) osmesa->buffer; 671d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell GLint i; 672d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell for (i = 0; i < n; i ++) { 673d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell buffer[i] = ctx->Color.ClearIndex; 674d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell } 67574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul#endif 676d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell } 677d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell else { 678d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell /* Clear part of CI buffer */ 679d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell const GLchan clearIndex = (GLchan) ctx->Color.ClearIndex; 680d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell GLint i, j; 681d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell for (i = 0; i < height; i++) { 682d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell GLchan *ptr1 = PIXELADDR1(x, (y + i)); 683d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell for (j = 0; j < width; j++) { 684d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell *ptr1++ = clearIndex; 685d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell } 686d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell } 687d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell } 688d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell } 689d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell else if (osmesa->format == OSMESA_RGB) { 690d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell const GLchan r = ctx->Color.ClearColor[0]; 691d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell const GLchan g = ctx->Color.ClearColor[1]; 692d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell const GLchan b = ctx->Color.ClearColor[2]; 693d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell if (all) { 694d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell /* Clear whole RGB buffer */ 695d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell GLuint n = osmesa->rowlength * osmesa->height; 696d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell GLchan *ptr3 = (GLchan *) osmesa->buffer; 697d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell GLuint i; 698d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell for (i = 0; i < n; i++) { 699d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell PACK_RGB(ptr3, r, g, b); 700d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell ptr3 += 3; 701d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell } 702d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell } 703d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell else { 704d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell /* Clear part of RGB buffer */ 705d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell GLint i, j; 706d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell for (i = 0; i < height; i++) { 707d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell GLchan *ptr3 = PIXELADDR3(x, (y + i)); 708d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell for (j = 0; j < width; j++) { 709d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell PACK_RGB(ptr3, r, g, b); 710d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell ptr3 += 3; 711d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell } 712d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell } 713d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell } 714d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell } 715d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell else if (osmesa->format == OSMESA_BGR) { 716d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell const GLchan r = ctx->Color.ClearColor[0]; 717d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell const GLchan g = ctx->Color.ClearColor[1]; 718d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell const GLchan b = ctx->Color.ClearColor[2]; 719d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell if (all) { 720d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell /* Clear whole RGB buffer */ 721d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell const GLint n = osmesa->rowlength * osmesa->height; 722d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell GLchan *ptr3 = (GLchan *) osmesa->buffer; 723d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell GLint i; 724d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell for (i = 0; i < n; i++) { 725d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell PACK_BGR(ptr3, r, g, b); 726d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell ptr3 += 3; 727d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell } 728d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell } 729d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell else { 730d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell /* Clear part of RGB buffer */ 731d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell GLint i, j; 732d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell for (i = 0; i < height; i++) { 733d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell GLchan *ptr3 = PIXELADDR3(x, (y + i)); 734d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell for (j = 0; j < width; j++) { 735d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell PACK_BGR(ptr3, r, g, b); 736d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell ptr3 += 3; 737d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell } 738d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell } 739d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell } 740d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell } 741d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell else { 74274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul#if CHAN_TYPE == GL_UNSIGNED_BYTE 743d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell /* 4-byte pixel value */ 744d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell GLuint clearPixel; 745d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell GLchan *clr = (GLchan *) &clearPixel; 746d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell clr[osmesa->rInd] = ctx->Color.ClearColor[0]; 747d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell clr[osmesa->gInd] = ctx->Color.ClearColor[1]; 748d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell clr[osmesa->bInd] = ctx->Color.ClearColor[2]; 749d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell clr[osmesa->aInd] = ctx->Color.ClearColor[3]; 750d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell if (all) { 751d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell /* Clear whole RGBA buffer */ 752d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell const GLuint n = osmesa->rowlength * osmesa->height; 753d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell GLuint *ptr4 = (GLuint *) osmesa->buffer; 754d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell GLuint i; 755d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell if (clearPixel) { 756d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell for (i = 0; i < n; i++) { 757d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell *ptr4++ = clearPixel; 758d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell } 759d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell } 760d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell else { 761d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell BZERO(ptr4, n * sizeof(GLuint)); 762d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell } 763d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell } 764d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell else { 765d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell /* Clear part of RGBA buffer */ 766d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell GLint i, j; 767d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell for (i = 0; i < height; i++) { 768d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell GLuint *ptr4 = (GLuint *) PIXELADDR4(x, (y + i)); 769d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell for (j = 0; j < width; j++) { 770d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell *ptr4++ = clearPixel; 771d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell } 772d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell } 773d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell } 77474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul#else 775d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell const GLchan r = ctx->Color.ClearColor[0]; 776d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell const GLchan g = ctx->Color.ClearColor[1]; 777d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell const GLchan b = ctx->Color.ClearColor[2]; 778d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell const GLchan a = ctx->Color.ClearColor[3]; 779d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell if (all) { 780d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell /* Clear whole RGBA buffer */ 781d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell const GLuint n = osmesa->rowlength * osmesa->height; 782d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell GLchan *p = (GLchan *) osmesa->buffer; 783d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell GLuint i; 784d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell for (i = 0; i < n; i++) { 785d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell PACK_RGBA(p, r, g, b, a); 786d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell p += 4; 787d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell } 788d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell } 789d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell else { 790d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell /* Clear part of RGBA buffer */ 791d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell GLint i, j; 792d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell for (i = 0; i < height; i++) { 793d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell GLchan *p = PIXELADDR4(x, (y + i)); 794d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell for (j = 0; j < width; j++) { 795d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell PACK_RGBA(p, r, g, b, a); 796d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell p += 4; 797d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell } 798d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell } 799d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell } 80074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul 80174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul#endif 802d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell } 803d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell mask &= ~DD_FRONT_LEFT_BIT; 804afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 805afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 806d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell 807d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell if (mask) 808d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell _swrast_Clear( ctx, mask, all, x, y, width, height ); 809afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 810afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 811afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 812afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 813afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgstatic void buffer_size( GLcontext *ctx, GLuint *width, GLuint *height ) 814afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 815c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul OSMesaContext osmesa = OSMESA_CONTEXT(ctx); 816afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg *width = osmesa->width; 817afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg *height = osmesa->height; 818afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 819afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 820afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 821afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/**********************************************************************/ 822afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/***** Read/write spans/arrays of RGBA pixels *****/ 823afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/**********************************************************************/ 824afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 825afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/* Write RGBA pixels to an RGBA (or permuted) buffer. */ 82674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void 82774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulwrite_rgba_span( const GLcontext *ctx, GLuint n, GLint x, GLint y, 82874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul CONST GLchan rgba[][4], const GLubyte mask[] ) 829afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 83074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const OSMesaContext osmesa = OSMESA_CONTEXT(ctx); 83174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul GLchan *p = PIXELADDR4(x, y); 832afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLuint i; 833afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (mask) { 83474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul for (i = 0; i < n; i++, p += 4) { 835afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (mask[i]) { 83674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul PACK_RGBA(p, rgba[i][RCOMP], rgba[i][GCOMP], 83774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul rgba[i][BCOMP], rgba[i][ACOMP]); 838afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 839afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 840afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 841afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg else { 84274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul for (i = 0; i < n; i++, p += 4) { 84374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul PACK_RGBA(p, rgba[i][RCOMP], rgba[i][GCOMP], 84474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul rgba[i][BCOMP], rgba[i][ACOMP]); 845afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 846afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 847afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 848afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 849afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 850afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/* Write RGBA pixels to an RGBA buffer. This is the fastest span-writer. */ 85174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void 85274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulwrite_rgba_span_rgba( const GLcontext *ctx, GLuint n, GLint x, GLint y, 85374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul CONST GLchan rgba[][4], const GLubyte mask[] ) 854afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 855c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul OSMesaContext osmesa = OSMESA_CONTEXT(ctx); 85674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul GLuint *ptr4 = (GLuint *) PIXELADDR4(x, y); 857afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg const GLuint *rgba4 = (const GLuint *) rgba; 858afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLuint i; 85974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul ASSERT(CHAN_TYPE == GL_UNSIGNED_BYTE); 860afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (mask) { 86174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul for (i = 0; i < n; i++) { 862afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (mask[i]) { 863afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ptr4[i] = rgba4[i]; 864afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 865afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 866afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 867afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg else { 868afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg MEMCPY( ptr4, rgba4, n * 4 ); 869afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 870afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 871afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 872afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 873afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/* Write RGB pixels to an RGBA (or permuted) buffer. */ 87474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void 87574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulwrite_rgb_span( const GLcontext *ctx, GLuint n, GLint x, GLint y, 87674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul CONST GLchan rgb[][3], const GLubyte mask[] ) 877afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 87874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const OSMesaContext osmesa = OSMESA_CONTEXT(ctx); 87974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul GLchan *p = PIXELADDR4(x, y); 880afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLuint i; 881afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (mask) { 88274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul for (i = 0; i < n; i++, p+=4) { 883afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (mask[i]) { 88474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul PACK_RGBA(p, rgb[i][RCOMP], rgb[i][GCOMP], rgb[i][BCOMP], 255); 885afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 886afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 887afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 888afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg else { 88974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul for (i = 0; i < n; i++, p+=4) { 89074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul PACK_RGBA(p, rgb[i][RCOMP], rgb[i][GCOMP], rgb[i][BCOMP], 255); 891afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 892afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 893afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 894afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 895afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 896afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 89774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void 89874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulwrite_monocolor_span( const GLcontext *ctx, GLuint n, GLint x, GLint y, 89974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const GLchan color[4], const GLubyte mask[] ) 900afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 901c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul const OSMesaContext osmesa = OSMESA_CONTEXT(ctx); 90274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul GLchan *p = PIXELADDR4(x, y); 903afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLuint i; 90474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul for (i = 0; i < n; i++, p += 4) { 905afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (mask[i]) { 90674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul PACK_RGBA(p, color[RCOMP], color[GCOMP], color[BCOMP], color[ACOMP]); 907afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 908afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 909afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 910afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 911afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 912afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 91374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void 91474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulwrite_rgba_pixels( const GLcontext *ctx, GLuint n, 91574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const GLint x[], const GLint y[], 91674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul CONST GLchan rgba[][4], const GLubyte mask[] ) 917afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 91874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const OSMesaContext osmesa = OSMESA_CONTEXT(ctx); 919afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLuint i; 92074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul for (i = 0; i < n; i++) { 921afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (mask[i]) { 92274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul GLchan *p = PIXELADDR4(x[i], y[i]); 92374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul PACK_RGBA(p, rgba[i][RCOMP], rgba[i][GCOMP], 92474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul rgba[i][BCOMP], rgba[i][ACOMP]); 925afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 926afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 927afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 928afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 929afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 930afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 93174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void 93274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulwrite_monocolor_pixels( const GLcontext *ctx, GLuint n, 93374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const GLint x[], const GLint y[], 93474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const GLchan color[4], const GLubyte mask[] ) 935afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 93674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const OSMesaContext osmesa = OSMESA_CONTEXT(ctx); 937afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLuint i; 93874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul for (i = 0; i < n; i++) { 939afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (mask[i]) { 94074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul GLchan *p = PIXELADDR4(x[i], y[i]); 94174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul PACK_RGBA(p, color[RCOMP], color[GCOMP], color[BCOMP], color[ACOMP]); 942afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 943afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 944afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 945afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 946afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 94774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void 94874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulread_rgba_span( const GLcontext *ctx, GLuint n, GLint x, GLint y, 94974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul GLchan rgba[][4] ) 950afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 95174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const OSMesaContext osmesa = OSMESA_CONTEXT(ctx); 952afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLuint i; 95374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul GLchan *p = PIXELADDR4(x, y); 95474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul for (i = 0; i < n; i++, p += 4) { 95574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul rgba[i][RCOMP] = UNPACK_RED(p); 95674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul rgba[i][GCOMP] = UNPACK_GREEN(p); 95774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul rgba[i][BCOMP] = UNPACK_BLUE(p); 95874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul rgba[i][ACOMP] = UNPACK_ALPHA(p); 959afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 960afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 961afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 962afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 963afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/* Read RGBA pixels from an RGBA buffer */ 96474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void 96574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulread_rgba_span_rgba( const GLcontext *ctx, GLuint n, GLint x, GLint y, 96674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul GLchan rgba[][4] ) 967afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 968c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul OSMesaContext osmesa = OSMESA_CONTEXT(ctx); 96974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul GLuint *ptr4 = (GLuint *) PIXELADDR4(x, y); 9709499e017b7e05411a32b3e4fa94885eaec0d7277Brian Paul MEMCPY( rgba, ptr4, n * 4 * sizeof(GLchan) ); 971afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 972afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 973afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 97474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void 97574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulread_rgba_pixels( const GLcontext *ctx, 97674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul GLuint n, const GLint x[], const GLint y[], 97774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul GLchan rgba[][4], const GLubyte mask[] ) 978afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 97974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const OSMesaContext osmesa = OSMESA_CONTEXT(ctx); 980afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLuint i; 98174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul for (i = 0; i < n; i++) { 982afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (mask[i]) { 98374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const GLchan *p = PIXELADDR4(x[i], y[i]); 98474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul rgba[i][RCOMP] = UNPACK_RED(p); 98574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul rgba[i][GCOMP] = UNPACK_GREEN(p); 98674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul rgba[i][BCOMP] = UNPACK_BLUE(p); 98774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul rgba[i][ACOMP] = UNPACK_ALPHA(p); 988afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 989afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 990afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 991afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 992afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/**********************************************************************/ 993afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/***** 3 byte RGB pixel support funcs *****/ 994afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/**********************************************************************/ 995afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 99674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul/* Write RGBA pixels to an RGB buffer. */ 99774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void 99874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulwrite_rgba_span_RGB( const GLcontext *ctx, GLuint n, GLint x, GLint y, 99974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul CONST GLchan rgba[][4], const GLubyte mask[] ) 1000afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 100174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const OSMesaContext osmesa = OSMESA_CONTEXT(ctx); 100274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul GLchan *p = PIXELADDR3(x, y); 1003afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLuint i; 1004afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (mask) { 100574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul for (i = 0; i < n; i++, p += 3) { 1006afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (mask[i]) { 100774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul PACK_RGB(p, rgba[i][RCOMP], rgba[i][GCOMP], rgba[i][BCOMP]); 1008afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1009afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1010afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1011afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg else { 101274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul for (i = 0; i < n; i++, p += 3) { 101374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul PACK_RGB(p, rgba[i][RCOMP], rgba[i][GCOMP], rgba[i][BCOMP]); 1014afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1015afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1016afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 1017afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 101874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul/* Write RGBA pixels to an BGR buffer. */ 101974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void 102074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulwrite_rgba_span_BGR( const GLcontext *ctx, GLuint n, GLint x, GLint y, 102174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul CONST GLchan rgba[][4], const GLubyte mask[] ) 1022afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 1023c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul const OSMesaContext osmesa = OSMESA_CONTEXT(ctx); 102474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul GLchan *p = PIXELADDR3(x, y); 1025afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLuint i; 1026afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (mask) { 102774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul for (i = 0; i < n; i++, p += 3) { 1028afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (mask[i]) { 102974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul PACK_BGR(p, rgba[i][RCOMP], rgba[i][GCOMP], rgba[i][BCOMP]); 1030afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1031afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1032afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1033afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg else { 103474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul for (i = 0; i < n; i++, p += 3) { 103574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul PACK_BGR(p, rgba[i][RCOMP], rgba[i][GCOMP], rgba[i][BCOMP]); 1036afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1037afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1038afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 1039afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 104074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul/* Write RGB pixels to an RGB buffer. */ 104174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void 104274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulwrite_rgb_span_RGB( const GLcontext *ctx, GLuint n, GLint x, GLint y, 104374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul CONST GLchan rgb[][3], const GLubyte mask[] ) 104474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul{ 104574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const OSMesaContext osmesa = OSMESA_CONTEXT(ctx); 104674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul GLchan *p = PIXELADDR3(x, y); 104774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul GLuint i; 104874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul if (mask) { 104974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul for (i = 0; i < n; i++, p += 3) { 105074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul if (mask[i]) { 105174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul PACK_RGB(p, rgb[i][RCOMP], rgb[i][GCOMP], rgb[i][BCOMP]); 105274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul } 105374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul } 105474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul } 105574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul else { 105674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul for (i = 0; i < n; i++, p += 3) { 105774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul PACK_RGB(p, rgb[i][RCOMP], rgb[i][GCOMP], rgb[i][BCOMP]); 105874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul } 105974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul } 106074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul} 1061afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 106274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul/* Write RGB pixels to an BGR buffer. */ 106374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void 106474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulwrite_rgb_span_BGR( const GLcontext *ctx, GLuint n, GLint x, GLint y, 106574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul CONST GLchan rgb[][3], const GLubyte mask[] ) 1066afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 1067c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul const OSMesaContext osmesa = OSMESA_CONTEXT(ctx); 106874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul GLchan *p = PIXELADDR3(x, y); 1069afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLuint i; 107074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul if (mask) { 107174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul for (i = 0; i < n; i++, p += 3) { 107274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul if (mask[i]) { 107374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul PACK_BGR(p, rgb[i][RCOMP], rgb[i][GCOMP], rgb[i][BCOMP]); 107474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul } 107574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul } 107674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul } 107774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul else { 107874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul for (i = 0; i < n; i++, p += 3) { 107974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul PACK_BGR(p, rgb[i][RCOMP], rgb[i][GCOMP], rgb[i][BCOMP]); 108074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul } 108174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul } 108274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul} 108374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul 108474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul 108574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void 108674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulwrite_monocolor_span_RGB( const GLcontext *ctx, GLuint n, GLint x, GLint y, 108774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const GLchan color[4], const GLubyte mask[] ) 108874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul{ 108974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const OSMesaContext osmesa = OSMESA_CONTEXT(ctx); 109074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul GLchan *p = PIXELADDR3(x, y); 109174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul GLuint i; 109274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul for (i = 0; i < n; i++, p += 3) { 109374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul if (mask[i]) { 109474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul PACK_RGB(p, color[RCOMP], color[GCOMP], color[BCOMP]); 109574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul } 109674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul } 109774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul} 109874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul 109974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void 110074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulwrite_monocolor_span_BGR( const GLcontext *ctx, GLuint n, GLint x, GLint y, 110174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const GLchan color[4], const GLubyte mask[] ) 110274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul{ 110374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const OSMesaContext osmesa = OSMESA_CONTEXT(ctx); 110474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul GLchan *p = PIXELADDR3(x, y); 110574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul GLuint i; 110674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul for (i = 0; i < n; i++, p += 3) { 1107afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (mask[i]) { 110874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul PACK_BGR(p, color[RCOMP], color[GCOMP], color[BCOMP]); 1109afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1110afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1111afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 1112afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 111374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void 111474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulwrite_rgba_pixels_RGB( const GLcontext *ctx, GLuint n, 111574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const GLint x[], const GLint y[], 111674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul CONST GLchan rgba[][4], const GLubyte mask[] ) 1117afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 1118c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul const OSMesaContext osmesa = (const OSMesaContext) ctx; 1119afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLuint i; 112074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul for (i = 0; i < n; i++) { 112174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul if (mask[i]) { 112274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul GLchan *p = PIXELADDR3(x[i], y[i]); 112374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul PACK_RGB(p, rgba[i][RCOMP], rgba[i][GCOMP], rgba[i][BCOMP]); 112474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul } 112574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul } 112674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul} 112774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul 112874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void 112974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulwrite_rgba_pixels_BGR( const GLcontext *ctx, GLuint n, 113074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const GLint x[], const GLint y[], 113174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul CONST GLchan rgba[][4], const GLubyte mask[] ) 113274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul{ 113374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const OSMesaContext osmesa = (const OSMesaContext) ctx; 113474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul GLuint i; 113574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul for (i = 0; i < n; i++) { 1136afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (mask[i]) { 113774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul GLchan *p = PIXELADDR3(x[i], y[i]); 113874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul PACK_BGR(p, rgba[i][RCOMP], rgba[i][GCOMP], rgba[i][BCOMP]); 1139afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1140afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1141afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 1142afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 114374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void 114474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulwrite_monocolor_pixels_RGB( const GLcontext *ctx, 114574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul GLuint n, const GLint x[], const GLint y[], 114674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const GLchan color[4], const GLubyte mask[] ) 1147afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 1148c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul const OSMesaContext osmesa = OSMESA_CONTEXT(ctx); 1149afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLuint i; 115074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul for (i = 0; i < n; i++) { 1151afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (mask[i]) { 115274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul GLchan *p = PIXELADDR3(x[i], y[i]); 115374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul PACK_RGB(p, color[RCOMP], color[GCOMP], color[BCOMP]); 1154afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1155afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1156afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 1157afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 115874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void 115974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulwrite_monocolor_pixels_BGR( const GLcontext *ctx, 116074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul GLuint n, const GLint x[], const GLint y[], 116174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const GLchan color[4], const GLubyte mask[] ) 1162afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 116374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const OSMesaContext osmesa = OSMESA_CONTEXT(ctx); 116474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul GLuint i; 116574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul for (i = 0; i < n; i++) { 116674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul if (mask[i]) { 116774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul GLchan *p = PIXELADDR3(x[i], y[i]); 116874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul PACK_BGR(p, color[RCOMP], color[GCOMP], color[BCOMP]); 116974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul } 117074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul } 117174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul} 117274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul 117374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void 117474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulread_rgba_span3( const GLcontext *ctx, GLuint n, GLint x, GLint y, 117574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul GLchan rgba[][4] ) 117674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul{ 117774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const OSMesaContext osmesa = OSMESA_CONTEXT(ctx); 1178afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLuint i; 117974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const GLchan *p = PIXELADDR3(x, y); 118074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul for (i = 0; i < n; i++, p += 3) { 118174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul rgba[i][RCOMP] = UNPACK_RED(p); 118274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul rgba[i][GCOMP] = UNPACK_GREEN(p); 118374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul rgba[i][BCOMP] = UNPACK_BLUE(p); 118474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul rgba[i][ACOMP] = 255; 1185afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1186afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 1187afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 118874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void 118974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulread_rgba_pixels3( const GLcontext *ctx, 119074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul GLuint n, const GLint x[], const GLint y[], 119174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul GLchan rgba[][4], const GLubyte mask[] ) 1192afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 119374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const OSMesaContext osmesa = OSMESA_CONTEXT(ctx); 1194afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLuint i; 119574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul for (i = 0; i < n; i++) { 1196afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (mask[i]) { 119774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const GLchan *p = PIXELADDR3(x[i], y[i]); 119874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul rgba[i][RCOMP] = UNPACK_RED(p); 119974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul rgba[i][GCOMP] = UNPACK_GREEN(p); 120074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul rgba[i][BCOMP] = UNPACK_BLUE(p); 120174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul rgba[i][ACOMP] = 255; 1202afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1203afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1204afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 1205afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1206afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1207afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/**********************************************************************/ 1208afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/***** Read/write spans/arrays of CI pixels *****/ 1209afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/**********************************************************************/ 1210afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1211afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/* Write 32-bit color index to buffer */ 121274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void 121374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulwrite_index32_span( const GLcontext *ctx, GLuint n, GLint x, GLint y, 121474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const GLuint index[], const GLubyte mask[] ) 1215afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 121674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const OSMesaContext osmesa = OSMESA_CONTEXT(ctx); 121774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul GLchan *ptr1 = PIXELADDR1(x, y); 1218afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLuint i; 1219afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (mask) { 1220afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg for (i=0;i<n;i++,ptr1++) { 1221afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (mask[i]) { 122274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul *ptr1 = (GLchan) index[i]; 1223afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1224afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1225afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1226afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg else { 1227afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg for (i=0;i<n;i++,ptr1++) { 122874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul *ptr1 = (GLchan) index[i]; 1229afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1230afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1231afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 1232afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1233afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1234afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/* Write 8-bit color index to buffer */ 123574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void 123674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulwrite_index8_span( const GLcontext *ctx, GLuint n, GLint x, GLint y, 123774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const GLubyte index[], const GLubyte mask[] ) 1238afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 123974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const OSMesaContext osmesa = OSMESA_CONTEXT(ctx); 124074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul GLchan *ptr1 = PIXELADDR1(x, y); 1241afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLuint i; 1242afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (mask) { 1243afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg for (i=0;i<n;i++,ptr1++) { 1244afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (mask[i]) { 124574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul *ptr1 = (GLchan) index[i]; 1246afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1247afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1248afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1249afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg else { 125074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul MEMCPY(ptr1, index, n * sizeof(GLchan)); 1251afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1252afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 1253afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1254afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 125574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void 125674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulwrite_monoindex_span( const GLcontext *ctx, GLuint n, GLint x, GLint y, 125774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul GLuint colorIndex, const GLubyte mask[] ) 1258afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 125974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const OSMesaContext osmesa = OSMESA_CONTEXT(ctx); 126074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul GLchan *ptr1 = PIXELADDR1(x, y); 1261afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLuint i; 1262afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg for (i=0;i<n;i++,ptr1++) { 1263afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (mask[i]) { 126474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul *ptr1 = (GLchan) colorIndex; 1265afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1266afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1267afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 1268afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1269afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 127074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void 127174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulwrite_index_pixels( const GLcontext *ctx, 127274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul GLuint n, const GLint x[], const GLint y[], 127374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const GLuint index[], const GLubyte mask[] ) 1274afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 127574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const OSMesaContext osmesa = OSMESA_CONTEXT(ctx); 1276afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLuint i; 1277afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg for (i=0;i<n;i++) { 1278afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (mask[i]) { 127974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul GLchan *ptr1 = PIXELADDR1(x[i], y[i]); 128074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul *ptr1 = (GLchan) index[i]; 1281afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1282afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1283afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 1284afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1285afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 128674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void 128774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulwrite_monoindex_pixels( const GLcontext *ctx, 128874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul GLuint n, const GLint x[], const GLint y[], 128974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul GLuint colorIndex, const GLubyte mask[] ) 1290afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 129174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const OSMesaContext osmesa = OSMESA_CONTEXT(ctx); 1292afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLuint i; 1293afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg for (i=0;i<n;i++) { 1294afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (mask[i]) { 129574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul GLchan *ptr1 = PIXELADDR1(x[i], y[i]); 129674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul *ptr1 = (GLchan) colorIndex; 1297afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1298afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1299afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 1300afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1301afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 130274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void 130374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulread_index_span( const GLcontext *ctx, 130474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul GLuint n, GLint x, GLint y, GLuint index[] ) 1305afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 130674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const OSMesaContext osmesa = OSMESA_CONTEXT(ctx); 1307afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLuint i; 130874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const GLchan *ptr1 = (const GLchan *) PIXELADDR1(x, y); 1309afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg for (i=0;i<n;i++,ptr1++) { 1310afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg index[i] = (GLuint) *ptr1; 1311afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1312afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 1313afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1314afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 131574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void 131674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulread_index_pixels( const GLcontext *ctx, 131774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul GLuint n, const GLint x[], const GLint y[], 131874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul GLuint index[], const GLubyte mask[] ) 1319afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 132074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const OSMesaContext osmesa = OSMESA_CONTEXT(ctx); 1321afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLuint i; 1322afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg for (i=0;i<n;i++) { 1323afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (mask[i] ) { 132474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const GLchan *ptr1 = PIXELADDR1(x[i], y[i]); 1325afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg index[i] = (GLuint) *ptr1; 1326afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1327afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1328afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 1329afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1330afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1331afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1332afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/**********************************************************************/ 1333afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/***** Optimized line rendering *****/ 1334afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/**********************************************************************/ 1335afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1336afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1337afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/* 1338afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Draw a flat-shaded, RGB line into an osmesa buffer. 1339afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */ 134074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void 134174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulflat_rgba_line( GLcontext *ctx, const SWvertex *vert0, const SWvertex *vert1 ) 1342afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 134374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const OSMesaContext osmesa = OSMESA_CONTEXT(ctx); 134474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const GLchan *color = vert0->color; 1345afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1346afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#define INTERP_XY 1 1347afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#define CLIP_HACK 1 134874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul#define PLOT(X, Y) \ 134974b493a5e61237de081a438e774e5d8139d4c6b7Brian Pauldo { \ 135074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul GLchan *p = PIXELADDR4(X, Y); \ 135174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul PACK_RGBA(p, color[0], color[1], color[2], color[3]); \ 135274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul} while (0) 1353afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1354afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#ifdef WIN32 1355724abeb058ca9372c5a9b9e38ee43dde1accaa41Keith Whitwell#include "..\swrast\s_linetemp.h" 1356afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#else 1357724abeb058ca9372c5a9b9e38ee43dde1accaa41Keith Whitwell#include "swrast/s_linetemp.h" 1358afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#endif 1359afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 1360afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1361afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1362afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/* 1363afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Draw a flat-shaded, Z-less, RGB line into an osmesa buffer. 1364afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */ 136574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void 136674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulflat_rgba_z_line(GLcontext *ctx, const SWvertex *vert0, const SWvertex *vert1) 1367afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 136874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const OSMesaContext osmesa = OSMESA_CONTEXT(ctx); 136974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const GLchan *color = vert0->color; 1370afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1371afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#define INTERP_XY 1 1372afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#define INTERP_Z 1 1373ed30dfa1264ec8875a3162c3c8778bc703bf11d5Brian Paul#define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE 1374afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#define CLIP_HACK 1 137574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul#define PLOT(X, Y) \ 137674b493a5e61237de081a438e774e5d8139d4c6b7Brian Pauldo { \ 137774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul if (Z < *zPtr) { \ 137874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul GLchan *p = PIXELADDR4(X, Y); \ 137974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul PACK_RGBA(p, color[RCOMP], color[GCOMP], \ 138074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul color[BCOMP], color[ACOMP]); \ 138174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul *zPtr = Z; \ 138274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul } \ 138374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul} while (0) 138474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul 1385afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1386afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#ifdef WIN32 1387724abeb058ca9372c5a9b9e38ee43dde1accaa41Keith Whitwell#include "..\swrast\s_linetemp.h" 1388afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#else 1389724abeb058ca9372c5a9b9e38ee43dde1accaa41Keith Whitwell#include "swrast/s_linetemp.h" 1390afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#endif 1391afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 1392afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1393afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1394afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/* 1395afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Draw a flat-shaded, alpha-blended, RGB line into an osmesa buffer. 139674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul * XXX update for GLchan 1397afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */ 139874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void 139974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulflat_blend_rgba_line( GLcontext *ctx, 140074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const SWvertex *vert0, const SWvertex *vert1 ) 1401afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 140274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const OSMesaContext osmesa = OSMESA_CONTEXT(ctx); 140374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const GLint rshift = osmesa->rshift; 140474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const GLint gshift = osmesa->gshift; 140574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const GLint bshift = osmesa->bshift; 140674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const GLint avalue = vert0->color[3]; 140774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const GLint msavalue = 255 - avalue; 140874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const GLint rvalue = vert0->color[0]*avalue; 140974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const GLint gvalue = vert0->color[1]*avalue; 141074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const GLint bvalue = vert0->color[2]*avalue; 1411afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1412afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#define INTERP_XY 1 1413afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#define CLIP_HACK 1 1414afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#define PLOT(X,Y) \ 141574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul { GLuint *ptr4 = (GLuint *) PIXELADDR4(X, Y); \ 14167e67fb41fb54e050f6983b4de09ed3a317d6148fBrian Paul GLuint pixel = 0; \ 1417afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg pixel |=((((((*ptr4) >> rshift) & 0xff)*msavalue+rvalue)>>8) << rshift);\ 1418afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg pixel |=((((((*ptr4) >> gshift) & 0xff)*msavalue+gvalue)>>8) << gshift);\ 1419afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg pixel |=((((((*ptr4) >> bshift) & 0xff)*msavalue+bvalue)>>8) << bshift);\ 14207e67fb41fb54e050f6983b4de09ed3a317d6148fBrian Paul *ptr4 = pixel; \ 1421afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1422afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1423afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#ifdef WIN32 1424724abeb058ca9372c5a9b9e38ee43dde1accaa41Keith Whitwell#include "..\swrast\s_linetemp.h" 1425afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#else 1426724abeb058ca9372c5a9b9e38ee43dde1accaa41Keith Whitwell#include "swrast/s_linetemp.h" 1427afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#endif 1428afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 1429afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1430ed30dfa1264ec8875a3162c3c8778bc703bf11d5Brian Paul 1431afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/* 1432afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Draw a flat-shaded, Z-less, alpha-blended, RGB line into an osmesa buffer. 143374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul * XXX update for GLchan 1434afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */ 143574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void 143674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulflat_blend_rgba_z_line( GLcontext *ctx, 143774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const SWvertex *vert0, const SWvertex *vert1 ) 1438afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 143974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const OSMesaContext osmesa = OSMESA_CONTEXT(ctx); 144074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const GLint rshift = osmesa->rshift; 144174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const GLint gshift = osmesa->gshift; 144274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const GLint bshift = osmesa->bshift; 144374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const GLint avalue = vert0->color[3]; 144474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const GLint msavalue = 256 - avalue; 144574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const GLint rvalue = vert0->color[0]*avalue; 144674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const GLint gvalue = vert0->color[1]*avalue; 144774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const GLint bvalue = vert0->color[2]*avalue; 1448afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1449afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#define INTERP_XY 1 1450afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#define INTERP_Z 1 1451ed30dfa1264ec8875a3162c3c8778bc703bf11d5Brian Paul#define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE 1452afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#define CLIP_HACK 1 14537e67fb41fb54e050f6983b4de09ed3a317d6148fBrian Paul#define PLOT(X,Y) \ 14547e67fb41fb54e050f6983b4de09ed3a317d6148fBrian Paul if (Z < *zPtr) { \ 145574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul GLuint *ptr4 = (GLuint *) PIXELADDR4(X, Y); \ 14567e67fb41fb54e050f6983b4de09ed3a317d6148fBrian Paul GLuint pixel = 0; \ 1457ed30dfa1264ec8875a3162c3c8778bc703bf11d5Brian Paul pixel |=((((((*ptr4) >> rshift) & 0xff)*msavalue+rvalue)>>8) << rshift); \ 1458ed30dfa1264ec8875a3162c3c8778bc703bf11d5Brian Paul pixel |=((((((*ptr4) >> gshift) & 0xff)*msavalue+gvalue)>>8) << gshift); \ 1459ed30dfa1264ec8875a3162c3c8778bc703bf11d5Brian Paul pixel |=((((((*ptr4) >> bshift) & 0xff)*msavalue+bvalue)>>8) << bshift); \ 14607e67fb41fb54e050f6983b4de09ed3a317d6148fBrian Paul *ptr4 = pixel; \ 1461afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1462afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1463afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#ifdef WIN32 1464724abeb058ca9372c5a9b9e38ee43dde1accaa41Keith Whitwell#include "..\swrast\s_linetemp.h" 1465afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#else 1466724abeb058ca9372c5a9b9e38ee43dde1accaa41Keith Whitwell#include "swrast/s_linetemp.h" 1467afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#endif 1468afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 1469afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1470ed30dfa1264ec8875a3162c3c8778bc703bf11d5Brian Paul 1471afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/* 1472afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Draw a flat-shaded, Z-less, alpha-blended, RGB line into an osmesa buffer. 147374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul * XXX update for GLchan 1474afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */ 147574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void 147674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulflat_blend_rgba_z_line_write( GLcontext *ctx, 147774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const SWvertex *vert0, const SWvertex *vert1 ) 1478afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 147974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const OSMesaContext osmesa = OSMESA_CONTEXT(ctx); 148074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const GLint rshift = osmesa->rshift; 148174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const GLint gshift = osmesa->gshift; 148274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const GLint bshift = osmesa->bshift; 148374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const GLint avalue = vert0->color[3]; 148474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const GLint msavalue = 256 - avalue; 148574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const GLint rvalue = vert0->color[0]*avalue; 148674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const GLint gvalue = vert0->color[1]*avalue; 148774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const GLint bvalue = vert0->color[2]*avalue; 1488afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1489afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#define INTERP_XY 1 1490afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#define INTERP_Z 1 1491ed30dfa1264ec8875a3162c3c8778bc703bf11d5Brian Paul#define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE 1492afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#define CLIP_HACK 1 14937e67fb41fb54e050f6983b4de09ed3a317d6148fBrian Paul#define PLOT(X,Y) \ 14947e67fb41fb54e050f6983b4de09ed3a317d6148fBrian Paul if (Z < *zPtr) { \ 149574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul GLuint *ptr4 = (GLuint *) PIXELADDR4(X, Y); \ 14967e67fb41fb54e050f6983b4de09ed3a317d6148fBrian Paul GLuint pixel = 0; \ 1497ed30dfa1264ec8875a3162c3c8778bc703bf11d5Brian Paul pixel |=((((((*ptr4) >> rshift) & 0xff)*msavalue+rvalue)>>8) << rshift); \ 1498ed30dfa1264ec8875a3162c3c8778bc703bf11d5Brian Paul pixel |=((((((*ptr4) >> gshift) & 0xff)*msavalue+gvalue)>>8) << gshift); \ 1499ed30dfa1264ec8875a3162c3c8778bc703bf11d5Brian Paul pixel |=((((((*ptr4) >> bshift) & 0xff)*msavalue+bvalue)>>8) << bshift); \ 15007e67fb41fb54e050f6983b4de09ed3a317d6148fBrian Paul *ptr4 = pixel; \ 15017e67fb41fb54e050f6983b4de09ed3a317d6148fBrian Paul *zPtr = Z; \ 1502afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1503afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1504afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#ifdef WIN32 1505724abeb058ca9372c5a9b9e38ee43dde1accaa41Keith Whitwell#include "..\swrast\s_linetemp.h" 1506afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#else 1507724abeb058ca9372c5a9b9e38ee43dde1accaa41Keith Whitwell#include "swrast/s_linetemp.h" 1508afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#endif 1509afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 1510afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1511afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1512afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/* 1513afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Analyze context state to see if we can provide a fast line drawing 1514afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * function, like those in lines.c. Otherwise, return NULL. 1515afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */ 1516dbd1e2b5990a3689bf718296c57c14fc3ba38db5Jouk Jansenstatic swrast_line_func 15171e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwellosmesa_choose_line_function( GLcontext *ctx ) 1518afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 151974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const OSMesaContext osmesa = OSMESA_CONTEXT(ctx); 152074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const SWcontext *swrast = SWRAST_CONTEXT(ctx); 1521afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 152274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul if (CHAN_BITS != 8) return NULL; 15232d595d70202bad560c27ea81ec71b740415b3355Brian Paul if (ctx->RenderMode != GL_RENDER) return NULL; 1524afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (ctx->Line.SmoothFlag) return NULL; 15252d595d70202bad560c27ea81ec71b740415b3355Brian Paul if (ctx->Texture._ReallyEnabled) return NULL; 152674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul if (ctx->Light.ShadeModel != GL_FLAT) return NULL; 152774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul if (ctx->Line.Width != 1.0F) return NULL; 152874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul if (ctx->Line.StippleFlag) return NULL; 152974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul if (ctx->Line.SmoothFlag) return NULL; 153074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul if (osmesa->format != OSMESA_RGBA && 153174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul osmesa->format != OSMESA_BGRA && 153274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul osmesa->format != OSMESA_ARGB) return NULL; 153374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul 153474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul if (swrast->_RasterMask==DEPTH_BIT 153574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul && ctx->Depth.Func==GL_LESS 153674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul && ctx->Depth.Mask==GL_TRUE 153774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul && ctx->Visual.depthBits == DEFAULT_SOFTWARE_DEPTH_BITS) { 153874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul return flat_rgba_z_line; 153974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul } 154074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul 154174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul if (swrast->_RasterMask == 0) { 154274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul return flat_rgba_line; 154374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul } 154474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul 154574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul if (swrast->_RasterMask==(DEPTH_BIT|BLEND_BIT) 154674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul && ctx->Depth.Func==GL_LESS 154774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul && ctx->Depth.Mask==GL_TRUE 154874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul && ctx->Visual.depthBits == DEFAULT_SOFTWARE_DEPTH_BITS 154974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul && ctx->Color.BlendSrcRGB==GL_SRC_ALPHA 155074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul && ctx->Color.BlendDstRGB==GL_ONE_MINUS_SRC_ALPHA 155174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul && ctx->Color.BlendSrcA==GL_SRC_ALPHA 155274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul && ctx->Color.BlendDstA==GL_ONE_MINUS_SRC_ALPHA 155374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul && ctx->Color.BlendEquation==GL_FUNC_ADD_EXT) { 155474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul return flat_blend_rgba_z_line_write; 155574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul } 155674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul 155774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul if (swrast->_RasterMask==(DEPTH_BIT|BLEND_BIT) 155874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul && ctx->Depth.Func==GL_LESS 155974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul && ctx->Depth.Mask==GL_FALSE 156074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul && ctx->Visual.depthBits == DEFAULT_SOFTWARE_DEPTH_BITS 156174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul && ctx->Color.BlendSrcRGB==GL_SRC_ALPHA 156274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul && ctx->Color.BlendDstRGB==GL_ONE_MINUS_SRC_ALPHA 156374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul && ctx->Color.BlendSrcA==GL_SRC_ALPHA 156474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul && ctx->Color.BlendDstA==GL_ONE_MINUS_SRC_ALPHA 156574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul && ctx->Color.BlendEquation==GL_FUNC_ADD_EXT) { 156674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul return flat_blend_rgba_z_line; 156774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul } 1568afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 156974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul if (swrast->_RasterMask==BLEND_BIT 157074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul && ctx->Color.BlendSrcRGB==GL_SRC_ALPHA 157174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul && ctx->Color.BlendDstRGB==GL_ONE_MINUS_SRC_ALPHA 157274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul && ctx->Color.BlendSrcA==GL_SRC_ALPHA 157374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul && ctx->Color.BlendDstA==GL_ONE_MINUS_SRC_ALPHA 157474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul && ctx->Color.BlendEquation==GL_FUNC_ADD_EXT) { 157574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul return flat_blend_rgba_line; 1576afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 157774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul 1578afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return NULL; 1579afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 1580afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1581afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1582afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/**********************************************************************/ 1583afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/***** Optimized triangle rendering *****/ 1584afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/**********************************************************************/ 1585afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1586afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1587afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/* 1588afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Smooth-shaded, z-less triangle, RGBA color. 1589afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */ 1590dbd1e2b5990a3689bf718296c57c14fc3ba38db5Jouk Jansenstatic void smooth_rgba_z_triangle( GLcontext *ctx, 1591a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul const SWvertex *v0, 1592a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul const SWvertex *v1, 1593a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul const SWvertex *v2 ) 1594afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 159574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const OSMesaContext osmesa = OSMESA_CONTEXT(ctx); 159623ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank 1597afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#define INTERP_Z 1 1598ed30dfa1264ec8875a3162c3c8778bc703bf11d5Brian Paul#define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE 1599afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#define INTERP_RGB 1 1600afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#define INTERP_ALPHA 1 1601afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#define INNER_LOOP( LEFT, RIGHT, Y ) \ 1602afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ \ 1603afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLint i, len = RIGHT-LEFT; \ 160474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul GLchan *img = PIXELADDR4(LEFT, Y); \ 160574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul for (i = 0; i < len; i++, img += 4) { \ 1606afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLdepth z = FixedToDepth(ffz); \ 1607afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (z < zRow[i]) { \ 160874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul PACK_RGBA(img, FixedToInt(ffr), FixedToInt(ffg), \ 160974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul FixedToInt(ffb), FixedToInt(ffa)); \ 1610afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg zRow[i] = z; \ 1611afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } \ 1612afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ffr += fdrdx; ffg += fdgdx; ffb += fdbdx; ffa += fdadx;\ 1613afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ffz += fdzdx; \ 1614afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } \ 1615afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 1616afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#ifdef WIN32 1617724abeb058ca9372c5a9b9e38ee43dde1accaa41Keith Whitwell#include "..\swrast\s_tritemp.h" 1618afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#else 1619724abeb058ca9372c5a9b9e38ee43dde1accaa41Keith Whitwell#include "swrast/s_tritemp.h" 1620afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#endif 1621afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 1622afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1623afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1624afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1625afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1626afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/* 1627afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Flat-shaded, z-less triangle, RGBA color. 1628afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */ 1629dbd1e2b5990a3689bf718296c57c14fc3ba38db5Jouk Jansenstatic void flat_rgba_z_triangle( GLcontext *ctx, 1630a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul const SWvertex *v0, 1631a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul const SWvertex *v1, 1632a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul const SWvertex *v2 ) 1633afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 163474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const OSMesaContext osmesa = OSMESA_CONTEXT(ctx); 1635afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#define INTERP_Z 1 1636ed30dfa1264ec8875a3162c3c8778bc703bf11d5Brian Paul#define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE 163774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul#define SETUP_CODE \ 163874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul GLuint pixel; \ 163974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul PACK_RGBA((GLchan *) &pixel, v0->color[0], v0->color[1], \ 164074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul v0->color[2], v0->color[3]); 164174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul 164274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul#define INNER_LOOP( LEFT, RIGHT, Y ) \ 164374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul{ \ 164474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul GLint i, len = RIGHT-LEFT; \ 164574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul GLuint *img = (GLuint *) PIXELADDR4(LEFT, Y); \ 164674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul for (i=0;i<len;i++) { \ 164774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul GLdepth z = FixedToDepth(ffz); \ 164874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul if (z < zRow[i]) { \ 164974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul img[i] = pixel; \ 165074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul zRow[i] = z; \ 165174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul } \ 165274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul ffz += fdzdx; \ 165374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul } \ 1654afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 1655afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#ifdef WIN32 1656724abeb058ca9372c5a9b9e38ee43dde1accaa41Keith Whitwell#include "..\swrast\s_tritemp.h" 1657afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#else 1658724abeb058ca9372c5a9b9e38ee43dde1accaa41Keith Whitwell#include "swrast/s_tritemp.h" 1659afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#endif 1660afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 1661afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1662afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1663afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1664afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/* 1665afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Return pointer to an accelerated triangle function if possible. 1666afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */ 1667dbd1e2b5990a3689bf718296c57c14fc3ba38db5Jouk Jansenstatic swrast_tri_func 16681e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwellosmesa_choose_triangle_function( GLcontext *ctx ) 1669afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 167074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const OSMesaContext osmesa = OSMESA_CONTEXT(ctx); 167174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const SWcontext *swrast = SWRAST_CONTEXT(ctx); 167274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul 167374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul if (CHAN_BITS != 8) return (swrast_tri_func) NULL; 167474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul if (ctx->RenderMode != GL_RENDER) return (swrast_tri_func) NULL; 167574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul if (ctx->Polygon.SmoothFlag) return (swrast_tri_func) NULL; 167674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul if (ctx->Polygon.StippleFlag) return (swrast_tri_func) NULL; 167774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul if (ctx->Texture._ReallyEnabled) return (swrast_tri_func) NULL; 167874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul if (osmesa->format != OSMESA_RGBA && 167974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul osmesa->format != OSMESA_BGRA && 168074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul osmesa->format != OSMESA_ARGB) return (swrast_tri_func) NULL; 168174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul 168274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul if (swrast->_RasterMask == DEPTH_BIT && 168374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul ctx->Depth.Func == GL_LESS && 168474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul ctx->Depth.Mask == GL_TRUE && 168574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul ctx->Visual.depthBits == DEFAULT_SOFTWARE_DEPTH_BITS) { 168674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul if (ctx->Light.ShadeModel == GL_SMOOTH) { 1687afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return smooth_rgba_z_triangle; 1688afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1689afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg else { 1690afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return flat_rgba_z_triangle; 1691afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1692afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 169374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul return (swrast_tri_func) NULL; 16941e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell} 16951e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell 169674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul 169774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul 16981e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell/* Override for the swrast triangle-selection function. Try to use one 16991e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell * of our internal triangle functions, otherwise fall back to the 1700dbd1e2b5990a3689bf718296c57c14fc3ba38db5Jouk Jansen * standard swrast functions. 17011e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell */ 17021e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwellstatic void osmesa_choose_triangle( GLcontext *ctx ) 17031e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell{ 17041e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell SWcontext *swrast = SWRAST_CONTEXT(ctx); 17051e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell 17061e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell swrast->Triangle = osmesa_choose_triangle_function( ctx ); 17071e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell if (!swrast->Triangle) 17081e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell _swrast_choose_triangle( ctx ); 1709afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 1710afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 17111e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwellstatic void osmesa_choose_line( GLcontext *ctx ) 17121e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell{ 17131e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell SWcontext *swrast = SWRAST_CONTEXT(ctx); 17141e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell 17151e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell swrast->Line = osmesa_choose_line_function( ctx ); 17161e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell if (!swrast->Line) 17171e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell _swrast_choose_line( ctx ); 17181e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell} 17191e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell 17201e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell 17212d595d70202bad560c27ea81ec71b740415b3355Brian Paul#define OSMESA_NEW_LINE (_NEW_LINE | \ 17222d595d70202bad560c27ea81ec71b740415b3355Brian Paul _NEW_TEXTURE | \ 17232d595d70202bad560c27ea81ec71b740415b3355Brian Paul _NEW_LIGHT | \ 17242d595d70202bad560c27ea81ec71b740415b3355Brian Paul _NEW_DEPTH | \ 17252d595d70202bad560c27ea81ec71b740415b3355Brian Paul _NEW_RENDERMODE | \ 1726dbd1e2b5990a3689bf718296c57c14fc3ba38db5Jouk Jansen _SWRAST_NEW_RASTERMASK) 17272d595d70202bad560c27ea81ec71b740415b3355Brian Paul 17282d595d70202bad560c27ea81ec71b740415b3355Brian Paul#define OSMESA_NEW_TRIANGLE (_NEW_POLYGON | \ 17292d595d70202bad560c27ea81ec71b740415b3355Brian Paul _NEW_TEXTURE | \ 17302d595d70202bad560c27ea81ec71b740415b3355Brian Paul _NEW_LIGHT | \ 17312d595d70202bad560c27ea81ec71b740415b3355Brian Paul _NEW_DEPTH | \ 17322d595d70202bad560c27ea81ec71b740415b3355Brian Paul _NEW_RENDERMODE | \ 17332d595d70202bad560c27ea81ec71b740415b3355Brian Paul _SWRAST_NEW_RASTERMASK) 17341e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell 17351e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell 1736dbd1e2b5990a3689bf718296c57c14fc3ba38db5Jouk Jansen/* Extend the software rasterizer with our line and triangle 17371e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell * functions. 17381e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell */ 17391e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwellstatic void osmesa_register_swrast_functions( GLcontext *ctx ) 17401e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell{ 17411e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell SWcontext *swrast = SWRAST_CONTEXT( ctx ); 1742dbd1e2b5990a3689bf718296c57c14fc3ba38db5Jouk Jansen 17431e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell swrast->choose_line = osmesa_choose_line; 17441e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell swrast->choose_triangle = osmesa_choose_triangle; 1745dbd1e2b5990a3689bf718296c57c14fc3ba38db5Jouk Jansen 17461e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell swrast->invalidate_line |= OSMESA_NEW_LINE; 17471e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell swrast->invalidate_triangle |= OSMESA_NEW_TRIANGLE; 17481e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell} 1749ed30dfa1264ec8875a3162c3c8778bc703bf11d5Brian Paul 1750ed30dfa1264ec8875a3162c3c8778bc703bf11d5Brian Paul 1751afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgstatic const GLubyte *get_string( GLcontext *ctx, GLenum name ) 1752afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 1753afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg (void) ctx; 1754afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg switch (name) { 1755afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_RENDERER: 1756afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return (const GLubyte *) "Mesa OffScreen"; 1757afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg default: 1758afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return NULL; 1759afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1760afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 1761afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1762afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1763cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwellstatic void osmesa_update_state( GLcontext *ctx, GLuint new_state ) 1764afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 1765c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul OSMesaContext osmesa = OSMESA_CONTEXT(ctx); 1766709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell struct swrast_device_driver *swdd = _swrast_GetDeviceDriverReference( ctx ); 1767709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell TNLcontext *tnl = TNL_CONTEXT(ctx); 1768304357dcd496f7ebf499fd9c77b4eba83a75abd5Brian Paul 1769304357dcd496f7ebf499fd9c77b4eba83a75abd5Brian Paul ASSERT((void *) osmesa == (void *) ctx->DriverCtx); 1770afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 177174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul /* 177274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul * XXX these function pointers could be initialized just once during 177374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul * context creation since they don't depend on any state changes. 177474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul */ 177574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul 1776afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ctx->Driver.GetString = get_string; 1777afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ctx->Driver.UpdateState = osmesa_update_state; 1778cea0e8e6700e871bb9bcb334cb75fbfbfcdfd702Brian Paul ctx->Driver.SetDrawBuffer = set_draw_buffer; 1779a81b3532f7c984878ba1d4b38f796abf731f76b1Brian Paul ctx->Driver.ResizeBuffersMESA = _swrast_alloc_buffers; 1780a81b3532f7c984878ba1d4b38f796abf731f76b1Brian Paul ctx->Driver.GetBufferSize = buffer_size; 1781a81b3532f7c984878ba1d4b38f796abf731f76b1Brian Paul 17825c1e7fa6ee72f4403d9ec9d12830dd689b966e71Keith Whitwell ctx->Driver.Accum = _swrast_Accum; 17835c1e7fa6ee72f4403d9ec9d12830dd689b966e71Keith Whitwell ctx->Driver.Bitmap = _swrast_Bitmap; 1784afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ctx->Driver.Clear = clear; 17855c1e7fa6ee72f4403d9ec9d12830dd689b966e71Keith Whitwell ctx->Driver.CopyPixels = _swrast_CopyPixels; 17865c1e7fa6ee72f4403d9ec9d12830dd689b966e71Keith Whitwell ctx->Driver.DrawPixels = _swrast_DrawPixels; 17875c1e7fa6ee72f4403d9ec9d12830dd689b966e71Keith Whitwell ctx->Driver.ReadPixels = _swrast_ReadPixels; 1788afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 17898e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul ctx->Driver.TexImage1D = _mesa_store_teximage1d; 17908e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul ctx->Driver.TexImage2D = _mesa_store_teximage2d; 17918e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul ctx->Driver.TexImage3D = _mesa_store_teximage3d; 17928e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul ctx->Driver.TexSubImage1D = _mesa_store_texsubimage1d; 17938e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul ctx->Driver.TexSubImage2D = _mesa_store_texsubimage2d; 17948e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul ctx->Driver.TexSubImage3D = _mesa_store_texsubimage3d; 17958e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul ctx->Driver.TestProxyTexImage = _mesa_test_proxy_teximage; 17968e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul 1797709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell ctx->Driver.CopyTexImage1D = _swrast_copy_teximage1d; 1798709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell ctx->Driver.CopyTexImage2D = _swrast_copy_teximage2d; 1799709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell ctx->Driver.CopyTexSubImage1D = _swrast_copy_texsubimage1d; 1800709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell ctx->Driver.CopyTexSubImage2D = _swrast_copy_texsubimage2d; 1801709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell ctx->Driver.CopyTexSubImage3D = _swrast_copy_texsubimage3d; 1802709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell ctx->Driver.CopyColorTable = _swrast_CopyColorTable; 1803709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell ctx->Driver.CopyColorSubTable = _swrast_CopyColorSubTable; 1804709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell ctx->Driver.CopyConvolutionFilter1D = _swrast_CopyConvolutionFilter1D; 1805709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell ctx->Driver.CopyConvolutionFilter2D = _swrast_CopyConvolutionFilter2D; 1806709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell 1807afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1808afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg /* RGB(A) span/pixel functions */ 180974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul if (osmesa->format == OSMESA_RGB) { 1810709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell swdd->WriteRGBASpan = write_rgba_span_RGB; 1811709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell swdd->WriteRGBSpan = write_rgb_span_RGB; 1812709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell swdd->WriteMonoRGBASpan = write_monocolor_span_RGB; 1813709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell swdd->WriteRGBAPixels = write_rgba_pixels_RGB; 1814709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell swdd->WriteMonoRGBAPixels = write_monocolor_pixels_RGB; 1815709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell swdd->ReadRGBASpan = read_rgba_span3; 1816709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell swdd->ReadRGBAPixels = read_rgba_pixels3; 181774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul } 181874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul else if (osmesa->format == OSMESA_BGR) { 1819709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell swdd->WriteRGBASpan = write_rgba_span_BGR; 1820709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell swdd->WriteRGBSpan = write_rgb_span_BGR; 1821709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell swdd->WriteMonoRGBASpan = write_monocolor_span_BGR; 1822709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell swdd->WriteRGBAPixels = write_rgba_pixels_BGR; 1823709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell swdd->WriteMonoRGBAPixels = write_monocolor_pixels_BGR; 1824709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell swdd->ReadRGBASpan = read_rgba_span3; 1825709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell swdd->ReadRGBAPixels = read_rgba_pixels3; 1826afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1827afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg else { 1828afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg /* 4 bytes / pixel in frame buffer */ 1829709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell swdd->WriteRGBSpan = write_rgb_span; 1830709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell swdd->WriteRGBAPixels = write_rgba_pixels; 1831709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell swdd->WriteMonoRGBASpan = write_monocolor_span; 1832709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell swdd->WriteMonoRGBAPixels = write_monocolor_pixels; 183374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul if (osmesa->format == OSMESA_RGBA && 183474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul CHAN_TYPE == GL_UNSIGNED_BYTE && 183574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul RCOMP==0 && GCOMP==1 && BCOMP==2 && ACOMP==3) { 183674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul /* special, fast case */ 1837709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell swdd->WriteRGBASpan = write_rgba_span_rgba; 1838709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell swdd->ReadRGBASpan = read_rgba_span_rgba; 183974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul } 184074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul else { 1841709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell swdd->WriteRGBASpan = write_rgba_span; 1842709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell swdd->ReadRGBASpan = read_rgba_span; 184374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul } 1844709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell swdd->ReadRGBAPixels = read_rgba_pixels; 1845afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1846afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1847afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg /* CI span/pixel functions */ 1848709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell swdd->WriteCI32Span = write_index32_span; 1849709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell swdd->WriteCI8Span = write_index8_span; 1850709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell swdd->WriteMonoCISpan = write_monoindex_span; 1851709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell swdd->WriteCI32Pixels = write_index_pixels; 1852709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell swdd->WriteMonoCIPixels = write_monoindex_pixels; 1853709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell swdd->ReadCI32Span = read_index_span; 1854709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell swdd->ReadCI32Pixels = read_index_pixels; 1855709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell 1856709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell swdd->SetReadBuffer = set_read_buffer; 1857709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell 1858709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell tnl->Driver.RenderStart = _swsetup_RenderStart; 1859709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell tnl->Driver.RenderFinish = _swsetup_RenderFinish; 1860709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell tnl->Driver.BuildProjectedVertices = _swsetup_BuildProjectedVertices; 1861709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell tnl->Driver.RenderPrimitive = _swsetup_RenderPrimitive; 1862709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell tnl->Driver.PointsFunc = _swsetup_Points; 1863709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell tnl->Driver.LineFunc = _swsetup_Line; 1864709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell tnl->Driver.TriangleFunc = _swsetup_Triangle; 1865709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell tnl->Driver.QuadFunc = _swsetup_Quad; 1866709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell tnl->Driver.ResetLineStipple = _swrast_ResetLineStipple; 1867709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell tnl->Driver.RenderInterp = _swsetup_RenderInterp; 1868709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell tnl->Driver.RenderCopyPV = _swsetup_RenderCopyPV; 1869709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell tnl->Driver.RenderClippedLine = _swsetup_RenderClippedLine; 1870709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell tnl->Driver.RenderClippedPolygon = _swsetup_RenderClippedPolygon; 1871709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell 187223caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell 1873cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell _swrast_InvalidateState( ctx, new_state ); 1874cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell _swsetup_InvalidateState( ctx, new_state ); 187558e991705392a2e17a1c8b034f4083a0adaf1943Keith Whitwell _ac_InvalidateState( ctx, new_state ); 1876cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell _tnl_InvalidateState( ctx, new_state ); 1877afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 1878