osmesa.c revision 206eda8b69ab3c63e9597015189f49d1bda9356f
1206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul/* $Id: osmesa.c,v 1.59 2001/06/27 13:56:17 brianp Exp $ */ 2afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 3afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/* 4afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Mesa 3-D graphics library 574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul * Version: 3.5 6dbd1e2b5990a3689bf718296c57c14fc3ba38db5Jouk Jansen * 774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul * Copyright (C) 1999-2001 Brian Paul All Rights Reserved. 8dbd1e2b5990a3689bf718296c57c14fc3ba38db5Jouk Jansen * 9afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Permission is hereby granted, free of charge, to any person obtaining a 10afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * copy of this software and associated documentation files (the "Software"), 11afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * to deal in the Software without restriction, including without limitation 12afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * the rights to use, copy, modify, merge, publish, distribute, sublicense, 13afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * and/or sell copies of the Software, and to permit persons to whom the 14afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Software is furnished to do so, subject to the following conditions: 15dbd1e2b5990a3689bf718296c57c14fc3ba38db5Jouk Jansen * 16afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * The above copyright notice and this permission notice shall be included 17afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * in all copies or substantial portions of the Software. 18dbd1e2b5990a3689bf718296c57c14fc3ba38db5Jouk Jansen * 19afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 20afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 21afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 22afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN 23afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 24afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 25afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */ 26afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 27afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 28afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/* 29afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Off-Screen Mesa rendering / Rendering into client memory space 30d3c070ca6a36daa765b1ad7f44e03e6671ad0490Brian Paul * 31d3c070ca6a36daa765b1ad7f44e03e6671ad0490Brian Paul * Note on thread safety: this driver is thread safe. All 32d3c070ca6a36daa765b1ad7f44e03e6671ad0490Brian Paul * functions are reentrant. The notion of current context is 33b1394fa92aaaf859ce9efc8b5fc194397921320cBrian Paul * managed by the core _mesa_make_current() and _mesa_get_current_context() 34d3c070ca6a36daa765b1ad7f44e03e6671ad0490Brian Paul * functions. Those functions are thread-safe. 35afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */ 36afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 37afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 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" 497d58f44f73be59bd3583e6dfeedf56c43f7fbd55Brian Paul#include "texformat.h" 508e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul#include "texstore.h" 518e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul#include "array_cache/acache.h" 521e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell#include "swrast/swrast.h" 531e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell#include "swrast_setup/swrast_setup.h" 541e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell#include "swrast/s_context.h" 55724abeb058ca9372c5a9b9e38ee43dde1accaa41Keith Whitwell#include "swrast/s_depth.h" 561e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell#include "swrast/s_lines.h" 571e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell#include "swrast/s_triangle.h" 589bf68ad963ba92b5d1e725f965979042495a5313Brian Paul#include "swrast/s_trispan.h" 595a9026c65d260dc185e072163999f5d810015108Brian Paul#include "tnl/tnl.h" 60709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell#include "tnl/t_context.h" 61bc69de5f21ebb4d6e1c65bf5652d17a9fc87dda7Keith Whitwell#include "tnl/t_pipeline.h" 62afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 63724abeb058ca9372c5a9b9e38ee43dde1accaa41Keith Whitwell 64724abeb058ca9372c5a9b9e38ee43dde1accaa41Keith Whitwell 65304357dcd496f7ebf499fd9c77b4eba83a75abd5Brian Paul/* 66304357dcd496f7ebf499fd9c77b4eba83a75abd5Brian Paul * This is the OS/Mesa context struct. 67304357dcd496f7ebf499fd9c77b4eba83a75abd5Brian Paul * Notice how it includes a GLcontext. By doing this we're mimicking 68304357dcd496f7ebf499fd9c77b4eba83a75abd5Brian Paul * C++ inheritance/derivation. 69304357dcd496f7ebf499fd9c77b4eba83a75abd5Brian Paul * Later, we can cast a GLcontext pointer into an OSMesaContext pointer 70304357dcd496f7ebf499fd9c77b4eba83a75abd5Brian Paul * or vice versa. 71304357dcd496f7ebf499fd9c77b4eba83a75abd5Brian Paul */ 72afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgstruct osmesa_context { 73304357dcd496f7ebf499fd9c77b4eba83a75abd5Brian Paul GLcontext gl_ctx; /* The core GL/Mesa context */ 74afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLvisual *gl_visual; /* Describes the buffers */ 75afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLframebuffer *gl_buffer; /* Depth, stencil, accum, etc buffers */ 76afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLenum format; /* either GL_RGBA or GL_COLOR_INDEX */ 77afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg void *buffer; /* the image buffer */ 78afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLint width, height; /* size of image buffer */ 79afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLint rowlength; /* number of pixels per row */ 80afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLint userRowLength; /* user-specified number of pixels per row */ 81afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLint rshift, gshift; /* bit shifts for RGBA formats */ 82afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLint bshift, ashift; 8374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul GLint rInd, gInd, bInd, aInd;/* index offsets for RGBA formats */ 8474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul GLchan *rowaddr[MAX_HEIGHT]; /* address of first pixel in each image row */ 85afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLboolean yup; /* TRUE -> Y increases upward */ 86afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg /* FALSE -> Y increases downward */ 87afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}; 88afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 89afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 90afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 91afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/* A forward declaration: */ 92cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwellstatic void osmesa_update_state( GLcontext *ctx, GLuint newstate ); 931e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwellstatic void osmesa_register_swrast_functions( GLcontext *ctx ); 94afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 95afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 96afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 97c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul#define OSMESA_CONTEXT(ctx) ((OSMesaContext) (ctx->DriverCtx)) 98c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul 99c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul 100c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul 101afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/**********************************************************************/ 102afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/***** Public Functions *****/ 103afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/**********************************************************************/ 104afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 105afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 106afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/* 107afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Create an Off-Screen Mesa rendering context. The only attribute needed is 108afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * an RGBA vs Color-Index mode flag. 109afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * 110afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Input: format - either GL_RGBA or GL_COLOR_INDEX 111afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * sharelist - specifies another OSMesaContext with which to share 112afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * display lists. NULL indicates no sharing. 113afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Return: an OSMesaContext or 0 if error 114afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */ 115d3c070ca6a36daa765b1ad7f44e03e6671ad0490Brian PaulOSMesaContext GLAPIENTRY 116d3c070ca6a36daa765b1ad7f44e03e6671ad0490Brian PaulOSMesaCreateContext( GLenum format, OSMesaContext sharelist ) 117afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 1182bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul return OSMesaCreateContextExt(format, DEFAULT_SOFTWARE_DEPTH_BITS, 1192bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul 8, 16, sharelist); 1202bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul} 1212bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul 1222bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul 1232bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul 1242bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul/* 1252bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul * New in Mesa 3.5 1262bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul * 1272bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul * Create context and specify size of ancillary buffers. 1282bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul */ 1292bf5d9470d3232763cb49b5589209940d4d5398dBrian PaulOSMesaContext GLAPIENTRY 1302bf5d9470d3232763cb49b5589209940d4d5398dBrian PaulOSMesaCreateContextExt( GLenum format, GLint depthBits, GLint stencilBits, 1312bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul GLint accumBits, OSMesaContext sharelist ) 1322bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul{ 133afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg OSMesaContext osmesa; 134afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLint rshift, gshift, bshift, ashift; 13574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul GLint rind, gind, bind, aind; 1362780ed4b978b32a08be6eecb0e923250e7b907eeBrian Paul GLint indexBits = 0, redBits = 0, greenBits = 0, blueBits = 0, alphaBits =0; 137afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLboolean rgbmode; 138afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLboolean swalpha; 13974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const GLuint i4 = 1; 14074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const GLubyte *i1 = (GLubyte *) &i4; 14174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const GLint little_endian = *i1; 142afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 143afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg swalpha = GL_FALSE; 14474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul rind = gind = bind = aind = 0; 145afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (format==OSMESA_COLOR_INDEX) { 146afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg indexBits = 8; 147afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg rshift = gshift = bshift = ashift = 0; 148afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg rgbmode = GL_FALSE; 149afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 150afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg else if (format==OSMESA_RGBA) { 151afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg indexBits = 0; 15201915e90e6912f06d43d443a09157f7bbc96ddc5Brian Paul redBits = CHAN_BITS; 15301915e90e6912f06d43d443a09157f7bbc96ddc5Brian Paul greenBits = CHAN_BITS; 15401915e90e6912f06d43d443a09157f7bbc96ddc5Brian Paul blueBits = CHAN_BITS; 15501915e90e6912f06d43d443a09157f7bbc96ddc5Brian Paul alphaBits = CHAN_BITS; 15674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul rind = 0; 15774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul gind = 1; 15874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul bind = 2; 15974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul aind = 3; 160afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (little_endian) { 161afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg rshift = 0; 162afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg gshift = 8; 163afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg bshift = 16; 164afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ashift = 24; 165afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 166afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg else { 167afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg rshift = 24; 168afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg gshift = 16; 169afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg bshift = 8; 170afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ashift = 0; 171afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 172afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg rgbmode = GL_TRUE; 173afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 174afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg else if (format==OSMESA_BGRA) { 175afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg indexBits = 0; 17601915e90e6912f06d43d443a09157f7bbc96ddc5Brian Paul redBits = CHAN_BITS; 17701915e90e6912f06d43d443a09157f7bbc96ddc5Brian Paul greenBits = CHAN_BITS; 17801915e90e6912f06d43d443a09157f7bbc96ddc5Brian Paul blueBits = CHAN_BITS; 17901915e90e6912f06d43d443a09157f7bbc96ddc5Brian Paul alphaBits = CHAN_BITS; 18074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul rind = 2; 18174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul gind = 1; 18274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul bind = 0; 18374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul aind = 3; 184afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (little_endian) { 185afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ashift = 0; 186afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg rshift = 8; 187afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg gshift = 16; 188afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg bshift = 24; 189afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 190afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg else { 191afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg bshift = 24; 192afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg gshift = 16; 193afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg rshift = 8; 194afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ashift = 0; 195afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 196afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg rgbmode = GL_TRUE; 197afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 198afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg else if (format==OSMESA_ARGB) { 199afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg indexBits = 0; 20001915e90e6912f06d43d443a09157f7bbc96ddc5Brian Paul redBits = CHAN_BITS; 20101915e90e6912f06d43d443a09157f7bbc96ddc5Brian Paul greenBits = CHAN_BITS; 20201915e90e6912f06d43d443a09157f7bbc96ddc5Brian Paul blueBits = CHAN_BITS; 20301915e90e6912f06d43d443a09157f7bbc96ddc5Brian Paul alphaBits = CHAN_BITS; 20474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul rind = 1; 20574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul gind = 2; 20674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul bind = 3; 20774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul aind = 0; 208afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (little_endian) { 209afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg bshift = 0; 210afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg gshift = 8; 211afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg rshift = 16; 212afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ashift = 24; 213afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 214afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg else { 215afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ashift = 24; 216afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg rshift = 16; 217afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg gshift = 8; 218afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg bshift = 0; 219afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 220afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg rgbmode = GL_TRUE; 221afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 222afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg else if (format==OSMESA_RGB) { 223afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg indexBits = 0; 22401915e90e6912f06d43d443a09157f7bbc96ddc5Brian Paul redBits = CHAN_BITS; 22501915e90e6912f06d43d443a09157f7bbc96ddc5Brian Paul greenBits = CHAN_BITS; 22601915e90e6912f06d43d443a09157f7bbc96ddc5Brian Paul blueBits = CHAN_BITS; 227afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg alphaBits = 0; 228afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg bshift = 0; 229afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg gshift = 8; 230afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg rshift = 16; 231afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ashift = 24; 232afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg rind = 0; 23374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul gind = 1; 23474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul bind = 2; 235afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg rgbmode = GL_TRUE; 236afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg swalpha = GL_TRUE; 237afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 238afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg else if (format==OSMESA_BGR) { 239afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg indexBits = 0; 24001915e90e6912f06d43d443a09157f7bbc96ddc5Brian Paul redBits = CHAN_BITS; 24101915e90e6912f06d43d443a09157f7bbc96ddc5Brian Paul greenBits = CHAN_BITS; 24201915e90e6912f06d43d443a09157f7bbc96ddc5Brian Paul blueBits = CHAN_BITS; 243afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg alphaBits = 0; 244afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg bshift = 0; 245afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg gshift = 8; 246afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg rshift = 16; 247afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ashift = 24; 248afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg rind = 2; 24974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul gind = 1; 25074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul bind = 0; 251afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg rgbmode = GL_TRUE; 252afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg swalpha = GL_TRUE; 253afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 254206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul else if (format==OSMESA_RGB_565) { 255206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul indexBits = 0; 256206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul redBits = 5; 257206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul greenBits = 6; 258206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul blueBits = 5; 259206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul alphaBits = 0; 260206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul rshift = 11; 261206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul gshift = 5; 262206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul bshift = 0; 263206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul ashift = 0; 264206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul rind = 0; /* not used */ 265206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul gind = 0; 266206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul bind = 0; 267206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul rgbmode = GL_TRUE; 268206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul swalpha = GL_FALSE; 269206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul } 270afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg else { 271afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return NULL; 272afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 273afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 274afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 275bd5cdaf4442872d3cd2ff94eeafadd481d27fcfbBrian Paul osmesa = (OSMesaContext) CALLOC_STRUCT(osmesa_context); 276afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (osmesa) { 2772bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul osmesa->gl_visual = _mesa_create_visual( rgbmode, 2782bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul GL_FALSE, /* double buffer */ 2792bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul GL_FALSE, /* stereo */ 2802bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul redBits, 2812bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul greenBits, 2822bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul blueBits, 2832bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul alphaBits, 2842bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul indexBits, 2852bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul depthBits, 2862bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul stencilBits, 2872bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul accumBits, 2882bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul accumBits, 2892bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul accumBits, 2902bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul alphaBits ? accumBits : 0, 2912bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul 1 /* num samples */ 2922bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul ); 293afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (!osmesa->gl_visual) { 294941dcc797e1a6317808c1ec43476817286d576baBrian Paul FREE(osmesa); 295afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return NULL; 296afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 297afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 298df81387dfae199a71bc55138ea5856dc05eacf24Brian Paul if (!_mesa_initialize_context(&osmesa->gl_ctx, 299df81387dfae199a71bc55138ea5856dc05eacf24Brian Paul osmesa->gl_visual, 300df81387dfae199a71bc55138ea5856dc05eacf24Brian Paul sharelist ? &sharelist->gl_ctx 301df81387dfae199a71bc55138ea5856dc05eacf24Brian Paul : (GLcontext *) NULL, 302df81387dfae199a71bc55138ea5856dc05eacf24Brian Paul (void *) osmesa, GL_TRUE )) { 303df81387dfae199a71bc55138ea5856dc05eacf24Brian Paul _mesa_destroy_visual( osmesa->gl_visual ); 304bd5cdaf4442872d3cd2ff94eeafadd481d27fcfbBrian Paul FREE(osmesa); 305afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return NULL; 306afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 3075a9026c65d260dc185e072163999f5d810015108Brian Paul 3085a9026c65d260dc185e072163999f5d810015108Brian Paul _mesa_enable_sw_extensions(&(osmesa->gl_ctx)); 309304357dcd496f7ebf499fd9c77b4eba83a75abd5Brian Paul 310b1394fa92aaaf859ce9efc8b5fc194397921320cBrian Paul osmesa->gl_buffer = _mesa_create_framebuffer( osmesa->gl_visual, 311b6bcae5698df88f7730d40004ce7ce0462e97a20Brian Paul osmesa->gl_visual->depthBits > 0, 312b6bcae5698df88f7730d40004ce7ce0462e97a20Brian Paul osmesa->gl_visual->stencilBits > 0, 313b6bcae5698df88f7730d40004ce7ce0462e97a20Brian Paul osmesa->gl_visual->accumRedBits > 0, 314e715c4a62d57eacb4b5b3b94276f251b7a4e5d22Brian Paul swalpha ); 3154c44d63f01a01f134d7e4456d4209edee97f9ef5Brian Paul 316afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (!osmesa->gl_buffer) { 317b1394fa92aaaf859ce9efc8b5fc194397921320cBrian Paul _mesa_destroy_visual( osmesa->gl_visual ); 318b1394fa92aaaf859ce9efc8b5fc194397921320cBrian Paul _mesa_free_context_data( &osmesa->gl_ctx ); 319bd5cdaf4442872d3cd2ff94eeafadd481d27fcfbBrian Paul FREE(osmesa); 320afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return NULL; 321afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 322afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg osmesa->format = format; 323afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg osmesa->buffer = NULL; 324afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg osmesa->width = 0; 325afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg osmesa->height = 0; 326afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg osmesa->userRowLength = 0; 327afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg osmesa->rowlength = 0; 328afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg osmesa->yup = GL_TRUE; 329afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg osmesa->rshift = rshift; 330afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg osmesa->gshift = gshift; 331afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg osmesa->bshift = bshift; 332afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg osmesa->ashift = ashift; 33374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul osmesa->rInd = rind; 33474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul osmesa->gInd = gind; 33574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul osmesa->bInd = bind; 33674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul osmesa->aInd = aind; 3371e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell 3381e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell 3391e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell /* Initialize the software rasterizer and helper modules. 3401e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell */ 3411e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell { 3421e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell GLcontext *ctx = &osmesa->gl_ctx; 3431e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell 3441e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell _swrast_CreateContext( ctx ); 34558e991705392a2e17a1c8b034f4083a0adaf1943Keith Whitwell _ac_CreateContext( ctx ); 34623caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell _tnl_CreateContext( ctx ); 347cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell _swsetup_CreateContext( ctx ); 348dbd1e2b5990a3689bf718296c57c14fc3ba38db5Jouk Jansen 3491e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell osmesa_register_swrast_functions( ctx ); 3501e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell } 351afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 352afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return osmesa; 353afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 354afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 355afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 356afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 3572bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul 358afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/* 359afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Destroy an Off-Screen Mesa rendering context. 360afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * 361afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Input: ctx - the context to destroy 362afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */ 363afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgvoid GLAPIENTRY OSMesaDestroyContext( OSMesaContext ctx ) 364afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 365afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (ctx) { 366709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell _swsetup_DestroyContext( &ctx->gl_ctx ); 367709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell _tnl_DestroyContext( &ctx->gl_ctx ); 368709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell _ac_DestroyContext( &ctx->gl_ctx ); 369709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell _swrast_DestroyContext( &ctx->gl_ctx ); 370709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell 371b1394fa92aaaf859ce9efc8b5fc194397921320cBrian Paul _mesa_destroy_visual( ctx->gl_visual ); 372b1394fa92aaaf859ce9efc8b5fc194397921320cBrian Paul _mesa_destroy_framebuffer( ctx->gl_buffer ); 373b1394fa92aaaf859ce9efc8b5fc194397921320cBrian Paul _mesa_free_context_data( &ctx->gl_ctx ); 374bd5cdaf4442872d3cd2ff94eeafadd481d27fcfbBrian Paul FREE( ctx ); 375afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 376afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 377afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 378afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 379afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 380afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/* 381afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Recompute the values of the context's rowaddr array. 382afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */ 383afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgstatic void compute_row_addresses( OSMesaContext ctx ) 384afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 38574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul GLint bytesPerPixel, bytesPerRow, i; 38674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul GLubyte *origin = (GLubyte *) ctx->buffer; 38774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul 38874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul if (ctx->format == OSMESA_COLOR_INDEX) { 38974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul /* CI mode */ 39074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul bytesPerPixel = 1 * sizeof(GLchan); 39174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul } 39274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul else if ((ctx->format == OSMESA_RGB) || (ctx->format == OSMESA_BGR)) { 39374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul /* RGB mode */ 39474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul bytesPerPixel = 3 * sizeof(GLchan); 39574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul } 396206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul else if (ctx->format == OSMESA_RGB_565) { 397206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul /* 5/6/5 RGB pixel in 16 bits */ 398206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul bytesPerPixel = 2; 399206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul } 40074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul else { 40174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul /* RGBA mode */ 40274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul bytesPerPixel = 4 * sizeof(GLchan); 40374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul } 40474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul 40574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul bytesPerRow = ctx->rowlength * bytesPerPixel; 406afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 407afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (ctx->yup) { 408afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg /* Y=0 is bottom line of window */ 40974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul for (i = 0; i < MAX_HEIGHT; i++) { 41074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul ctx->rowaddr[i] = (GLchan *) ((GLubyte *) origin + i * bytesPerRow); 411afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 412afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 413afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg else { 414afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg /* Y=0 is top line of window */ 41574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul for (i = 0; i < MAX_HEIGHT; i++) { 41674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul GLint j = ctx->height - i - 1; 41774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul ctx->rowaddr[i] = (GLchan *) ((GLubyte *) origin + j * bytesPerRow); 418afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 419afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 420afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 421afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 422afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 423afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/* 424afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Bind an OSMesaContext to an image buffer. The image buffer is just a 425afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * block of memory which the client provides. Its size must be at least 426afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * as large as width*height*sizeof(type). Its address should be a multiple 427afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * of 4 if using RGBA mode. 428afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * 429afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Image data is stored in the order of glDrawPixels: row-major order 430afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * with the lower-left image pixel stored in the first array position 431afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * (ie. bottom-to-top). 432afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * 433afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Since the only type initially supported is GL_UNSIGNED_BYTE, if the 434afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * context is in RGBA mode, each pixel will be stored as a 4-byte RGBA 435afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * value. If the context is in color indexed mode, each pixel will be 436afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * stored as a 1-byte value. 437afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * 438afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * If the context's viewport hasn't been initialized yet, it will now be 439afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * initialized to (0,0,width,height). 440afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * 441afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Input: ctx - the rendering context 442afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * buffer - the image buffer memory 443afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * type - data type for pixel components, only GL_UNSIGNED_BYTE 444206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul * and GL_UNSIGNED_SHORT_5_6_5 supported now. 445afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * width, height - size of image buffer in pixels, at least 1 446afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Return: GL_TRUE if success, GL_FALSE if error because of invalid ctx, 447afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * invalid buffer address, type!=GL_UNSIGNED_BYTE, width<1, height<1, 448afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * width>internal limit or height>internal limit. 449afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */ 450d3c070ca6a36daa765b1ad7f44e03e6671ad0490Brian PaulGLboolean GLAPIENTRY 451d3c070ca6a36daa765b1ad7f44e03e6671ad0490Brian PaulOSMesaMakeCurrent( OSMesaContext ctx, void *buffer, GLenum type, 452d3c070ca6a36daa765b1ad7f44e03e6671ad0490Brian Paul GLsizei width, GLsizei height ) 453afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 454206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul if (!ctx || !buffer || 45574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul width < 1 || height < 1 || 45674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul width > MAX_WIDTH || height > MAX_HEIGHT) { 457afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return GL_FALSE; 458afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 459afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 460206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul if (ctx->format == OSMESA_RGB_565 && type != GL_UNSIGNED_SHORT_5_6_5) { 461206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul return GL_FALSE; 462206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul } 463206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul else if (type != CHAN_TYPE) { 464206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul return GL_FALSE; 465206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul } 466206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul 467cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell osmesa_update_state( &ctx->gl_ctx, 0 ); 468b1394fa92aaaf859ce9efc8b5fc194397921320cBrian Paul _mesa_make_current( &ctx->gl_ctx, ctx->gl_buffer ); 469afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 470afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ctx->buffer = buffer; 471afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ctx->width = width; 472afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ctx->height = height; 473afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (ctx->userRowLength) 474afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ctx->rowlength = ctx->userRowLength; 475afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg else 476afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ctx->rowlength = width; 477afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 478afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg compute_row_addresses( ctx ); 479afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 480afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg /* init viewport */ 481304357dcd496f7ebf499fd9c77b4eba83a75abd5Brian Paul if (ctx->gl_ctx.Viewport.Width==0) { 482afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg /* initialize viewport and scissor box to buffer size */ 483cb5ecb883eb3be842ef44c61df8d4b527877c858Brian Paul _mesa_Viewport( 0, 0, width, height ); 484304357dcd496f7ebf499fd9c77b4eba83a75abd5Brian Paul ctx->gl_ctx.Scissor.Width = width; 485304357dcd496f7ebf499fd9c77b4eba83a75abd5Brian Paul ctx->gl_ctx.Scissor.Height = height; 486afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 487afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 488afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return GL_TRUE; 489afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 490afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 491afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 492afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 493afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgOSMesaContext GLAPIENTRY OSMesaGetCurrentContext( void ) 494afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 495b1394fa92aaaf859ce9efc8b5fc194397921320cBrian Paul GLcontext *ctx = _mesa_get_current_context(); 496d3c070ca6a36daa765b1ad7f44e03e6671ad0490Brian Paul if (ctx) 497304357dcd496f7ebf499fd9c77b4eba83a75abd5Brian Paul return (OSMesaContext) ctx; 498d3c070ca6a36daa765b1ad7f44e03e6671ad0490Brian Paul else 499d3c070ca6a36daa765b1ad7f44e03e6671ad0490Brian Paul return NULL; 500afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 501afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 502afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 503afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 504afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgvoid GLAPIENTRY OSMesaPixelStore( GLint pname, GLint value ) 505afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 506afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg OSMesaContext ctx = OSMesaGetCurrentContext(); 507afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 508afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg switch (pname) { 509afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case OSMESA_ROW_LENGTH: 510afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (value<0) { 51108836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul _mesa_error( &ctx->gl_ctx, GL_INVALID_VALUE, 512afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg "OSMesaPixelStore(value)" ); 513afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return; 514afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 515afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ctx->userRowLength = value; 516afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ctx->rowlength = value; 517afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg break; 518afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case OSMESA_Y_UP: 519afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ctx->yup = value ? GL_TRUE : GL_FALSE; 520afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg break; 521afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg default: 52208836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul _mesa_error( &ctx->gl_ctx, GL_INVALID_ENUM, "OSMesaPixelStore(pname)" ); 523afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return; 524afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 525afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 526afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg compute_row_addresses( ctx ); 527afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 528afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 529afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 530afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgvoid GLAPIENTRY OSMesaGetIntegerv( GLint pname, GLint *value ) 531afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 532afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg OSMesaContext ctx = OSMesaGetCurrentContext(); 533afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 534afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg switch (pname) { 535afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case OSMESA_WIDTH: 536afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg *value = ctx->width; 537afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return; 538afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case OSMESA_HEIGHT: 539afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg *value = ctx->height; 540afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return; 541afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case OSMESA_FORMAT: 542afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg *value = ctx->format; 543afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return; 544afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case OSMESA_TYPE: 54501915e90e6912f06d43d443a09157f7bbc96ddc5Brian Paul *value = CHAN_TYPE; 546afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return; 547afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case OSMESA_ROW_LENGTH: 548afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg *value = ctx->rowlength; 549afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return; 550afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case OSMESA_Y_UP: 551afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg *value = ctx->yup; 552afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return; 553afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg default: 55408836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul _mesa_error(&ctx->gl_ctx, GL_INVALID_ENUM, "OSMesaGetIntergerv(pname)"); 555afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return; 556afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 557afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 558afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 559afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/* 560afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Return the depth buffer associated with an OSMesa context. 561afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Input: c - the OSMesa context 562afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Output: width, height - size of buffer in pixels 563afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * bytesPerValue - bytes per depth value (2 or 4) 564afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * buffer - pointer to depth buffer values 565afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Return: GL_TRUE or GL_FALSE to indicate success or failure. 566afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */ 5677e67fb41fb54e050f6983b4de09ed3a317d6148fBrian PaulGLboolean GLAPIENTRY 5687e67fb41fb54e050f6983b4de09ed3a317d6148fBrian PaulOSMesaGetDepthBuffer( OSMesaContext c, GLint *width, GLint *height, 5697e67fb41fb54e050f6983b4de09ed3a317d6148fBrian Paul GLint *bytesPerValue, void **buffer ) 570afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 571650cb74bcb913d2589355d56a14da1ab0307d1fcBrian Paul if ((!c->gl_buffer) || (!c->gl_buffer->DepthBuffer)) { 572afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg *width = 0; 573afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg *height = 0; 574afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg *bytesPerValue = 0; 575afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg *buffer = 0; 576afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return GL_FALSE; 577afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 578afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg else { 579afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg *width = c->gl_buffer->Width; 580afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg *height = c->gl_buffer->Height; 5819db3f95acea5622573803890afd506ebcdaab3b3Brian Paul if (c->gl_visual->depthBits <= 16) 5829db3f95acea5622573803890afd506ebcdaab3b3Brian Paul *bytesPerValue = sizeof(GLushort); 5839db3f95acea5622573803890afd506ebcdaab3b3Brian Paul else 5849db3f95acea5622573803890afd506ebcdaab3b3Brian Paul *bytesPerValue = sizeof(GLuint); 585650cb74bcb913d2589355d56a14da1ab0307d1fcBrian Paul *buffer = c->gl_buffer->DepthBuffer; 586afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return GL_TRUE; 587afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 588afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 589afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 59023ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank/* 59123ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank * Return the color buffer associated with an OSMesa context. 59223ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank * Input: c - the OSMesa context 59323ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank * Output: width, height - size of buffer in pixels 59423ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank * format - the pixel format (OSMESA_FORMAT) 59523ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank * buffer - pointer to color buffer values 59623ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank * Return: GL_TRUE or GL_FALSE to indicate success or failure. 59723ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank */ 5987e67fb41fb54e050f6983b4de09ed3a317d6148fBrian PaulGLboolean GLAPIENTRY 5997e67fb41fb54e050f6983b4de09ed3a317d6148fBrian PaulOSMesaGetColorBuffer( OSMesaContext c, GLint *width, 6007e67fb41fb54e050f6983b4de09ed3a317d6148fBrian Paul GLint *height, GLint *format, void **buffer ) 60123ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank{ 60223ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank if (!c->buffer) { 60323ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank *width = 0; 60423ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank *height = 0; 60523ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank *format = 0; 60623ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank *buffer = 0; 60723ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank return GL_FALSE; 6087e67fb41fb54e050f6983b4de09ed3a317d6148fBrian Paul } 6097e67fb41fb54e050f6983b4de09ed3a317d6148fBrian Paul else { 61023ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank *width = c->width; 61123ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank *height = c->height; 61223ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank *format = c->format; 61323ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank *buffer = c->buffer; 61423ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank return GL_TRUE; 61523ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank } 61623ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank} 617afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 618afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/**********************************************************************/ 619afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/*** Device Driver Functions ***/ 620afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/**********************************************************************/ 621afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 622afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 623afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/* 624afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Useful macros: 625afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */ 626afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 62774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul#define PACK_RGBA(DST, R, G, B, A) \ 62874b493a5e61237de081a438e774e5d8139d4c6b7Brian Pauldo { \ 62974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul (DST)[osmesa->rInd] = R; \ 63074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul (DST)[osmesa->gInd] = G; \ 63174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul (DST)[osmesa->bInd] = B; \ 63274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul (DST)[osmesa->aInd] = A; \ 63374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul} while (0) 63474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul 63574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul#define PACK_RGB(DST, R, G, B) \ 63674b493a5e61237de081a438e774e5d8139d4c6b7Brian Pauldo { \ 63774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul (DST)[0] = R; \ 63874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul (DST)[1] = G; \ 63974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul (DST)[2] = B; \ 64074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul} while (0) 641afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 64274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul#define PACK_BGR(DST, R, G, B) \ 64374b493a5e61237de081a438e774e5d8139d4c6b7Brian Pauldo { \ 64474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul (DST)[0] = B; \ 64574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul (DST)[1] = G; \ 64674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul (DST)[2] = R; \ 64774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul} while (0) 648afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 649206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul#define PACK_RGB_565(DST, R, G, B) \ 650206eda8b69ab3c63e9597015189f49d1bda9356fBrian Pauldo { \ 651206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul (DST) = (((R) << 8) & 0xf800) | (((G) << 3) & 0x7e0) | ((B) >> 3);\ 652206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul} while (0) 653206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul 654afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 65501915e90e6912f06d43d443a09157f7bbc96ddc5Brian Paul#define UNPACK_RED(P) ( (P)[osmesa->rInd] ) 65601915e90e6912f06d43d443a09157f7bbc96ddc5Brian Paul#define UNPACK_GREEN(P) ( (P)[osmesa->gInd] ) 65701915e90e6912f06d43d443a09157f7bbc96ddc5Brian Paul#define UNPACK_BLUE(P) ( (P)[osmesa->bInd] ) 65801915e90e6912f06d43d443a09157f7bbc96ddc5Brian Paul#define UNPACK_ALPHA(P) ( (P)[osmesa->aInd] ) 65974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul 66074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul 66174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul#define PIXELADDR1(X,Y) (osmesa->rowaddr[Y] + (X)) 662206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul#define PIXELADDR2(X,Y) (osmesa->rowaddr[Y] + 2 * (X)) 66374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul#define PIXELADDR3(X,Y) (osmesa->rowaddr[Y] + 3 * (X)) 66474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul#define PIXELADDR4(X,Y) (osmesa->rowaddr[Y] + 4 * (X)) 665afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 666afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 667afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 668cea0e8e6700e871bb9bcb334cb75fbfbfcdfd702Brian Paulstatic GLboolean set_draw_buffer( GLcontext *ctx, GLenum mode ) 669afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 670afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg (void) ctx; 671afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (mode==GL_FRONT_LEFT) { 672afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return GL_TRUE; 673afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 674afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg else { 675afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return GL_FALSE; 676afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 677afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 678afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 679afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 680cea0e8e6700e871bb9bcb334cb75fbfbfcdfd702Brian Paulstatic void set_read_buffer( GLcontext *ctx, GLframebuffer *buffer, GLenum mode ) 681cea0e8e6700e871bb9bcb334cb75fbfbfcdfd702Brian Paul{ 682cea0e8e6700e871bb9bcb334cb75fbfbfcdfd702Brian Paul /* separate read buffer not supported */ 683cea0e8e6700e871bb9bcb334cb75fbfbfcdfd702Brian Paul ASSERT(buffer == ctx->DrawBuffer); 684cea0e8e6700e871bb9bcb334cb75fbfbfcdfd702Brian Paul ASSERT(mode == GL_FRONT_LEFT); 685cea0e8e6700e871bb9bcb334cb75fbfbfcdfd702Brian Paul} 686cea0e8e6700e871bb9bcb334cb75fbfbfcdfd702Brian Paul 687cea0e8e6700e871bb9bcb334cb75fbfbfcdfd702Brian Paul 688d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwellstatic void clear( GLcontext *ctx, GLbitfield mask, GLboolean all, 689d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell GLint x, GLint y, GLint width, GLint height ) 690afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 691c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul OSMesaContext osmesa = OSMESA_CONTEXT(ctx); 692dd020f13a6d520b46aefd4453dae6b6edcc427f6Brian Paul const GLuint *colorMask = (GLuint *) &ctx->Color.ColorMask; 693dd020f13a6d520b46aefd4453dae6b6edcc427f6Brian Paul 694dd020f13a6d520b46aefd4453dae6b6edcc427f6Brian Paul /* sanity check - we only have a front-left buffer */ 695dd020f13a6d520b46aefd4453dae6b6edcc427f6Brian Paul ASSERT((mask & (DD_FRONT_RIGHT_BIT | DD_BACK_LEFT_BIT | DD_BACK_RIGHT_BIT)) == 0); 696d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell if (*colorMask == 0xffffffff && ctx->Color.IndexMask == 0xffffffff) { 697d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell if (mask & DD_FRONT_LEFT_BIT) { 698d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell if (osmesa->format == OSMESA_COLOR_INDEX) { 699d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell if (all) { 700d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell /* Clear whole CI buffer */ 70174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul#if CHAN_TYPE == GL_UNSIGNED_BYTE 702d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell MEMSET(osmesa->buffer, ctx->Color.ClearIndex, 703d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell osmesa->rowlength * osmesa->height); 70474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul#else 705d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell const GLint n = osmesa->rowlength * osmesa->height; 706d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell GLchan *buffer = (GLchan *) osmesa->buffer; 707d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell GLint i; 708d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell for (i = 0; i < n; i ++) { 709d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell buffer[i] = ctx->Color.ClearIndex; 710d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell } 71174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul#endif 712d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell } 713d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell else { 714d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell /* Clear part of CI buffer */ 715d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell const GLchan clearIndex = (GLchan) ctx->Color.ClearIndex; 716d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell GLint i, j; 717d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell for (i = 0; i < height; i++) { 718d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell GLchan *ptr1 = PIXELADDR1(x, (y + i)); 719d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell for (j = 0; j < width; j++) { 720d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell *ptr1++ = clearIndex; 721d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell } 722d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell } 723d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell } 724d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell } 725d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell else if (osmesa->format == OSMESA_RGB) { 726d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell const GLchan r = ctx->Color.ClearColor[0]; 727d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell const GLchan g = ctx->Color.ClearColor[1]; 728d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell const GLchan b = ctx->Color.ClearColor[2]; 729d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell if (all) { 730d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell /* Clear whole RGB buffer */ 731d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell GLuint n = osmesa->rowlength * osmesa->height; 732d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell GLchan *ptr3 = (GLchan *) osmesa->buffer; 733d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell GLuint i; 734d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell for (i = 0; i < n; i++) { 735d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell PACK_RGB(ptr3, r, g, b); 736d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell ptr3 += 3; 737d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell } 738d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell } 739d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell else { 740d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell /* Clear part of RGB buffer */ 741d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell GLint i, j; 742d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell for (i = 0; i < height; i++) { 743d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell GLchan *ptr3 = PIXELADDR3(x, (y + i)); 744d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell for (j = 0; j < width; j++) { 745d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell PACK_RGB(ptr3, r, g, b); 746d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell ptr3 += 3; 747d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell } 748d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell } 749d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell } 750d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell } 751d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell else if (osmesa->format == OSMESA_BGR) { 752d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell const GLchan r = ctx->Color.ClearColor[0]; 753d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell const GLchan g = ctx->Color.ClearColor[1]; 754d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell const GLchan b = ctx->Color.ClearColor[2]; 755d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell if (all) { 756d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell /* Clear whole RGB buffer */ 757d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell const GLint n = osmesa->rowlength * osmesa->height; 758d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell GLchan *ptr3 = (GLchan *) osmesa->buffer; 759d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell GLint i; 760d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell for (i = 0; i < n; i++) { 761d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell PACK_BGR(ptr3, r, g, b); 762d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell ptr3 += 3; 763d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell } 764d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell } 765d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell else { 766d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell /* Clear part of RGB buffer */ 767d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell GLint i, j; 768d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell for (i = 0; i < height; i++) { 769d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell GLchan *ptr3 = PIXELADDR3(x, (y + i)); 770d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell for (j = 0; j < width; j++) { 771d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell PACK_BGR(ptr3, r, g, b); 772d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell ptr3 += 3; 773d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell } 774d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell } 775d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell } 776d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell } 777206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul else if (osmesa->format == OSMESA_RGB_565) { 778206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul const GLchan r = ctx->Color.ClearColor[0]; 779206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul const GLchan g = ctx->Color.ClearColor[1]; 780206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul const GLchan b = ctx->Color.ClearColor[2]; 781206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul GLushort clearPixel; 782206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul PACK_RGB_565(clearPixel, r, g, b); 783206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul if (all) { 784206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul /* Clear whole RGB buffer */ 785206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul const GLint n = osmesa->rowlength * osmesa->height; 786206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul GLushort *ptr2 = (GLushort *) osmesa->buffer; 787206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul GLuint i; 788206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul for (i = 0; i < n; i++) { 789206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul *ptr2 = clearPixel; 790206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul ptr2++; 791206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul } 792206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul } 793206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul else { 794206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul /* clear scissored region */ 795206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul GLint i, j; 796206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul for (i = 0; i < height; i++) { 797206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul GLushort *ptr2 = (GLushort *) PIXELADDR2(x, (y + i)); 798206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul for (j = 0; j < width; j++) { 799206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul *ptr2 = clearPixel; 800206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul ptr2++; 801206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul } 802206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul } 803206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul } 804206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul } 805d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell else { 80674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul#if CHAN_TYPE == GL_UNSIGNED_BYTE 807d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell /* 4-byte pixel value */ 808d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell GLuint clearPixel; 809d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell GLchan *clr = (GLchan *) &clearPixel; 810d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell clr[osmesa->rInd] = ctx->Color.ClearColor[0]; 811d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell clr[osmesa->gInd] = ctx->Color.ClearColor[1]; 812d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell clr[osmesa->bInd] = ctx->Color.ClearColor[2]; 813d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell clr[osmesa->aInd] = ctx->Color.ClearColor[3]; 814d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell if (all) { 815d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell /* Clear whole RGBA buffer */ 816d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell const GLuint n = osmesa->rowlength * osmesa->height; 817d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell GLuint *ptr4 = (GLuint *) osmesa->buffer; 818d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell GLuint i; 819d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell if (clearPixel) { 820d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell for (i = 0; i < n; i++) { 821d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell *ptr4++ = clearPixel; 822d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell } 823d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell } 824d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell else { 825d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell BZERO(ptr4, n * sizeof(GLuint)); 826d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell } 827d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell } 828d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell else { 829d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell /* Clear part of RGBA buffer */ 830d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell GLint i, j; 831d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell for (i = 0; i < height; i++) { 832d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell GLuint *ptr4 = (GLuint *) PIXELADDR4(x, (y + i)); 833d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell for (j = 0; j < width; j++) { 834d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell *ptr4++ = clearPixel; 835d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell } 836d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell } 837d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell } 83874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul#else 839d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell const GLchan r = ctx->Color.ClearColor[0]; 840d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell const GLchan g = ctx->Color.ClearColor[1]; 841d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell const GLchan b = ctx->Color.ClearColor[2]; 842d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell const GLchan a = ctx->Color.ClearColor[3]; 843d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell if (all) { 844d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell /* Clear whole RGBA buffer */ 845d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell const GLuint n = osmesa->rowlength * osmesa->height; 846d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell GLchan *p = (GLchan *) osmesa->buffer; 847d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell GLuint i; 848d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell for (i = 0; i < n; i++) { 849d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell PACK_RGBA(p, r, g, b, a); 850d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell p += 4; 851d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell } 852d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell } 853d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell else { 854d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell /* Clear part of RGBA buffer */ 855d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell GLint i, j; 856d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell for (i = 0; i < height; i++) { 857d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell GLchan *p = PIXELADDR4(x, (y + i)); 858d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell for (j = 0; j < width; j++) { 859d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell PACK_RGBA(p, r, g, b, a); 860d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell p += 4; 861d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell } 862d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell } 863d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell } 86474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul 86574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul#endif 866d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell } 867d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell mask &= ~DD_FRONT_LEFT_BIT; 868afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 869afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 870d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell 871d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell if (mask) 872d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell _swrast_Clear( ctx, mask, all, x, y, width, height ); 873afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 874afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 875afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 876afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 877afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgstatic void buffer_size( GLcontext *ctx, GLuint *width, GLuint *height ) 878afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 879c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul OSMesaContext osmesa = OSMESA_CONTEXT(ctx); 880afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg *width = osmesa->width; 881afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg *height = osmesa->height; 882afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 883afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 884afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 885afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/**********************************************************************/ 886afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/***** Read/write spans/arrays of RGBA pixels *****/ 887afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/**********************************************************************/ 888afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 889afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/* Write RGBA pixels to an RGBA (or permuted) buffer. */ 89074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void 89174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulwrite_rgba_span( const GLcontext *ctx, GLuint n, GLint x, GLint y, 89274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul CONST GLchan rgba[][4], const GLubyte mask[] ) 893afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 89474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const OSMesaContext osmesa = OSMESA_CONTEXT(ctx); 89574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul GLchan *p = PIXELADDR4(x, y); 896afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLuint i; 897afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (mask) { 89874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul for (i = 0; i < n; i++, p += 4) { 899afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (mask[i]) { 90074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul PACK_RGBA(p, rgba[i][RCOMP], rgba[i][GCOMP], 90174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul rgba[i][BCOMP], rgba[i][ACOMP]); 902afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 903afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 904afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 905afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg else { 90674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul for (i = 0; i < n; i++, p += 4) { 90774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul PACK_RGBA(p, rgba[i][RCOMP], rgba[i][GCOMP], 90874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul rgba[i][BCOMP], rgba[i][ACOMP]); 909afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 910afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 911afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 912afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 913afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 914afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/* Write RGBA pixels to an RGBA buffer. This is the fastest span-writer. */ 91574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void 91674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulwrite_rgba_span_rgba( const GLcontext *ctx, GLuint n, GLint x, GLint y, 91774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul CONST GLchan rgba[][4], const GLubyte mask[] ) 918afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 919c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul OSMesaContext osmesa = OSMESA_CONTEXT(ctx); 92074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul GLuint *ptr4 = (GLuint *) PIXELADDR4(x, y); 921afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg const GLuint *rgba4 = (const GLuint *) rgba; 922afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLuint i; 92374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul ASSERT(CHAN_TYPE == GL_UNSIGNED_BYTE); 924afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (mask) { 92574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul for (i = 0; i < n; i++) { 926afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (mask[i]) { 927afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ptr4[i] = rgba4[i]; 928afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 929afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 930afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 931afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg else { 932afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg MEMCPY( ptr4, rgba4, n * 4 ); 933afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 934afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 935afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 936afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 937afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/* Write RGB pixels to an RGBA (or permuted) buffer. */ 93874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void 93974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulwrite_rgb_span( const GLcontext *ctx, GLuint n, GLint x, GLint y, 94074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul CONST GLchan rgb[][3], const GLubyte mask[] ) 941afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 94274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const OSMesaContext osmesa = OSMESA_CONTEXT(ctx); 94374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul GLchan *p = PIXELADDR4(x, y); 944afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLuint i; 945afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (mask) { 94674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul for (i = 0; i < n; i++, p+=4) { 947afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (mask[i]) { 94865c6ca91795a71cf38dbe5f49f2d73fd9d4049cdBrian Paul PACK_RGBA(p, rgb[i][RCOMP], rgb[i][GCOMP], rgb[i][BCOMP], CHAN_MAX); 949afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 950afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 951afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 952afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg else { 95374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul for (i = 0; i < n; i++, p+=4) { 95465c6ca91795a71cf38dbe5f49f2d73fd9d4049cdBrian Paul PACK_RGBA(p, rgb[i][RCOMP], rgb[i][GCOMP], rgb[i][BCOMP], CHAN_MAX); 955afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 956afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 957afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 958afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 959afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 960afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 96174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void 96274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulwrite_monocolor_span( const GLcontext *ctx, GLuint n, GLint x, GLint y, 96374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const GLchan color[4], const GLubyte mask[] ) 964afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 965c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul const OSMesaContext osmesa = OSMESA_CONTEXT(ctx); 96674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul GLchan *p = PIXELADDR4(x, y); 967afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLuint i; 96874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul for (i = 0; i < n; i++, p += 4) { 969afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (mask[i]) { 97074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul PACK_RGBA(p, color[RCOMP], color[GCOMP], color[BCOMP], color[ACOMP]); 971afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 972afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 973afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 974afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 975afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 976afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 97774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void 97874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulwrite_rgba_pixels( const GLcontext *ctx, GLuint n, 97974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const GLint x[], const GLint y[], 98074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul CONST GLchan rgba[][4], const GLubyte mask[] ) 981afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 98274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const OSMesaContext osmesa = OSMESA_CONTEXT(ctx); 983afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLuint i; 98474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul for (i = 0; i < n; i++) { 985afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (mask[i]) { 98674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul GLchan *p = PIXELADDR4(x[i], y[i]); 98774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul PACK_RGBA(p, rgba[i][RCOMP], rgba[i][GCOMP], 98874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul rgba[i][BCOMP], rgba[i][ACOMP]); 989afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 990afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 991afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 992afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 993afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 994afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 99574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void 99674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulwrite_monocolor_pixels( const GLcontext *ctx, GLuint n, 99774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const GLint x[], const GLint y[], 99874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const GLchan color[4], const GLubyte mask[] ) 999afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 100074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const OSMesaContext osmesa = OSMESA_CONTEXT(ctx); 1001afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLuint i; 100274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul for (i = 0; i < n; i++) { 1003afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (mask[i]) { 100474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul GLchan *p = PIXELADDR4(x[i], y[i]); 100574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul PACK_RGBA(p, color[RCOMP], color[GCOMP], color[BCOMP], color[ACOMP]); 1006afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1007afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1008afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 1009afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1010afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 101174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void 101274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulread_rgba_span( const GLcontext *ctx, GLuint n, GLint x, GLint y, 101374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul GLchan rgba[][4] ) 1014afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 101574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const OSMesaContext osmesa = OSMESA_CONTEXT(ctx); 1016afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLuint i; 101774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul GLchan *p = PIXELADDR4(x, y); 101874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul for (i = 0; i < n; i++, p += 4) { 101974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul rgba[i][RCOMP] = UNPACK_RED(p); 102074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul rgba[i][GCOMP] = UNPACK_GREEN(p); 102174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul rgba[i][BCOMP] = UNPACK_BLUE(p); 102274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul rgba[i][ACOMP] = UNPACK_ALPHA(p); 1023afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1024afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 1025afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1026afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1027afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/* Read RGBA pixels from an RGBA buffer */ 102874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void 102974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulread_rgba_span_rgba( const GLcontext *ctx, GLuint n, GLint x, GLint y, 103074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul GLchan rgba[][4] ) 1031afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 1032c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul OSMesaContext osmesa = OSMESA_CONTEXT(ctx); 103374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul GLuint *ptr4 = (GLuint *) PIXELADDR4(x, y); 10349499e017b7e05411a32b3e4fa94885eaec0d7277Brian Paul MEMCPY( rgba, ptr4, n * 4 * sizeof(GLchan) ); 1035afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 1036afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1037afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 103874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void 103974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulread_rgba_pixels( const GLcontext *ctx, 104074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul GLuint n, const GLint x[], const GLint y[], 104174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul GLchan rgba[][4], const GLubyte mask[] ) 1042afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 104374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const OSMesaContext osmesa = OSMESA_CONTEXT(ctx); 1044afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLuint i; 104574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul for (i = 0; i < n; i++) { 1046afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (mask[i]) { 104774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const GLchan *p = PIXELADDR4(x[i], y[i]); 104874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul rgba[i][RCOMP] = UNPACK_RED(p); 104974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul rgba[i][GCOMP] = UNPACK_GREEN(p); 105074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul rgba[i][BCOMP] = UNPACK_BLUE(p); 105174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul rgba[i][ACOMP] = UNPACK_ALPHA(p); 1052afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1053afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1054afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 1055afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1056afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/**********************************************************************/ 1057afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/***** 3 byte RGB pixel support funcs *****/ 1058afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/**********************************************************************/ 1059afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 106074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul/* Write RGBA pixels to an RGB buffer. */ 106174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void 106274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulwrite_rgba_span_RGB( const GLcontext *ctx, GLuint n, GLint x, GLint y, 106374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul CONST GLchan rgba[][4], const GLubyte mask[] ) 1064afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 106574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const OSMesaContext osmesa = OSMESA_CONTEXT(ctx); 106674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul GLchan *p = PIXELADDR3(x, y); 1067afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLuint i; 1068afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (mask) { 106974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul for (i = 0; i < n; i++, p += 3) { 1070afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (mask[i]) { 107174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul PACK_RGB(p, rgba[i][RCOMP], rgba[i][GCOMP], rgba[i][BCOMP]); 1072afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1073afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1074afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1075afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg else { 107674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul for (i = 0; i < n; i++, p += 3) { 107774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul PACK_RGB(p, rgba[i][RCOMP], rgba[i][GCOMP], rgba[i][BCOMP]); 1078afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1079afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1080afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 1081afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 108274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul/* Write RGBA pixels to an BGR buffer. */ 108374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void 108474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulwrite_rgba_span_BGR( const GLcontext *ctx, GLuint n, GLint x, GLint y, 108574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul CONST GLchan rgba[][4], const GLubyte mask[] ) 1086afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 1087c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul const OSMesaContext osmesa = OSMESA_CONTEXT(ctx); 108874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul GLchan *p = PIXELADDR3(x, y); 1089afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLuint i; 1090afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (mask) { 109174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul for (i = 0; i < n; i++, p += 3) { 1092afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (mask[i]) { 109374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul PACK_BGR(p, rgba[i][RCOMP], rgba[i][GCOMP], rgba[i][BCOMP]); 1094afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1095afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1096afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1097afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg else { 109874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul for (i = 0; i < n; i++, p += 3) { 109974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul PACK_BGR(p, rgba[i][RCOMP], rgba[i][GCOMP], rgba[i][BCOMP]); 1100afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1101afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1102afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 1103afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 110474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul/* Write RGB pixels to an RGB buffer. */ 110574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void 110674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulwrite_rgb_span_RGB( const GLcontext *ctx, GLuint n, GLint x, GLint y, 110774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul CONST GLchan rgb[][3], const GLubyte mask[] ) 110874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul{ 110974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const OSMesaContext osmesa = OSMESA_CONTEXT(ctx); 111074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul GLchan *p = PIXELADDR3(x, y); 111174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul GLuint i; 111274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul if (mask) { 111374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul for (i = 0; i < n; i++, p += 3) { 111474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul if (mask[i]) { 111574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul PACK_RGB(p, rgb[i][RCOMP], rgb[i][GCOMP], rgb[i][BCOMP]); 111674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul } 111774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul } 111874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul } 111974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul else { 112074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul for (i = 0; i < n; i++, p += 3) { 112174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul PACK_RGB(p, rgb[i][RCOMP], rgb[i][GCOMP], rgb[i][BCOMP]); 112274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul } 112374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul } 112474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul} 1125afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 112674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul/* Write RGB pixels to an BGR buffer. */ 112774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void 112874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulwrite_rgb_span_BGR( const GLcontext *ctx, GLuint n, GLint x, GLint y, 112974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul CONST GLchan rgb[][3], const GLubyte mask[] ) 1130afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 1131c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul const OSMesaContext osmesa = OSMESA_CONTEXT(ctx); 113274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul GLchan *p = PIXELADDR3(x, y); 1133afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLuint i; 113474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul if (mask) { 113574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul for (i = 0; i < n; i++, p += 3) { 113674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul if (mask[i]) { 113774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul PACK_BGR(p, rgb[i][RCOMP], rgb[i][GCOMP], rgb[i][BCOMP]); 113874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul } 113974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul } 114074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul } 114174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul else { 114274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul for (i = 0; i < n; i++, p += 3) { 114374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul PACK_BGR(p, rgb[i][RCOMP], rgb[i][GCOMP], rgb[i][BCOMP]); 114474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul } 114574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul } 114674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul} 114774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul 114874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul 114974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void 115074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulwrite_monocolor_span_RGB( const GLcontext *ctx, GLuint n, GLint x, GLint y, 115174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const GLchan color[4], const GLubyte mask[] ) 115274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul{ 115374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const OSMesaContext osmesa = OSMESA_CONTEXT(ctx); 115474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul GLchan *p = PIXELADDR3(x, y); 115574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul GLuint i; 115674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul for (i = 0; i < n; i++, p += 3) { 115774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul if (mask[i]) { 115874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul PACK_RGB(p, color[RCOMP], color[GCOMP], color[BCOMP]); 115974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul } 116074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul } 116174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul} 116274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul 116374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void 116474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulwrite_monocolor_span_BGR( const GLcontext *ctx, GLuint n, GLint x, GLint y, 116574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const GLchan color[4], const GLubyte mask[] ) 116674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul{ 116774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const OSMesaContext osmesa = OSMESA_CONTEXT(ctx); 116874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul GLchan *p = PIXELADDR3(x, y); 116974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul GLuint i; 117074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul for (i = 0; i < n; i++, p += 3) { 1171afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (mask[i]) { 117274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul PACK_BGR(p, color[RCOMP], color[GCOMP], color[BCOMP]); 1173afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1174afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1175afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 1176afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 117774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void 117874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulwrite_rgba_pixels_RGB( const GLcontext *ctx, GLuint n, 117974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const GLint x[], const GLint y[], 118074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul CONST GLchan rgba[][4], const GLubyte mask[] ) 1181afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 1182c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul const OSMesaContext osmesa = (const OSMesaContext) ctx; 1183afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLuint i; 118474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul for (i = 0; i < n; i++) { 118574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul if (mask[i]) { 118674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul GLchan *p = PIXELADDR3(x[i], y[i]); 118774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul PACK_RGB(p, rgba[i][RCOMP], rgba[i][GCOMP], rgba[i][BCOMP]); 118874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul } 118974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul } 119074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul} 119174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul 119274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void 119374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulwrite_rgba_pixels_BGR( const GLcontext *ctx, GLuint n, 119474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const GLint x[], const GLint y[], 119574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul CONST GLchan rgba[][4], const GLubyte mask[] ) 119674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul{ 119774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const OSMesaContext osmesa = (const OSMesaContext) ctx; 119874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul GLuint i; 119974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul for (i = 0; i < n; i++) { 1200afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (mask[i]) { 120174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul GLchan *p = PIXELADDR3(x[i], y[i]); 120274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul PACK_BGR(p, rgba[i][RCOMP], rgba[i][GCOMP], rgba[i][BCOMP]); 1203afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1204afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1205afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 1206afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 120774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void 120874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulwrite_monocolor_pixels_RGB( const GLcontext *ctx, 120974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul GLuint n, const GLint x[], const GLint y[], 121074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const GLchan color[4], const GLubyte mask[] ) 1211afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 1212c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul const OSMesaContext osmesa = OSMESA_CONTEXT(ctx); 1213afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLuint i; 121474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul for (i = 0; i < n; i++) { 1215afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (mask[i]) { 121674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul GLchan *p = PIXELADDR3(x[i], y[i]); 121774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul PACK_RGB(p, color[RCOMP], color[GCOMP], color[BCOMP]); 1218afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1219afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1220afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 1221afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 122274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void 122374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulwrite_monocolor_pixels_BGR( const GLcontext *ctx, 122474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul GLuint n, const GLint x[], const GLint y[], 122574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const GLchan color[4], const GLubyte mask[] ) 1226afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 122774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const OSMesaContext osmesa = OSMESA_CONTEXT(ctx); 122874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul GLuint i; 122974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul for (i = 0; i < n; i++) { 123074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul if (mask[i]) { 123174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul GLchan *p = PIXELADDR3(x[i], y[i]); 123274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul PACK_BGR(p, color[RCOMP], color[GCOMP], color[BCOMP]); 123374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul } 123474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul } 123574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul} 123674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul 123774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void 123874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulread_rgba_span3( const GLcontext *ctx, GLuint n, GLint x, GLint y, 123974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul GLchan rgba[][4] ) 124074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul{ 124174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const OSMesaContext osmesa = OSMESA_CONTEXT(ctx); 1242afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLuint i; 124374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const GLchan *p = PIXELADDR3(x, y); 124474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul for (i = 0; i < n; i++, p += 3) { 124574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul rgba[i][RCOMP] = UNPACK_RED(p); 124674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul rgba[i][GCOMP] = UNPACK_GREEN(p); 124774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul rgba[i][BCOMP] = UNPACK_BLUE(p); 124865c6ca91795a71cf38dbe5f49f2d73fd9d4049cdBrian Paul rgba[i][ACOMP] = CHAN_MAX; 1249afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1250afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 1251afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 125274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void 125374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulread_rgba_pixels3( const GLcontext *ctx, 125474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul GLuint n, const GLint x[], const GLint y[], 125574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul GLchan rgba[][4], const GLubyte mask[] ) 1256afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 125774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const OSMesaContext osmesa = OSMESA_CONTEXT(ctx); 1258afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLuint i; 125974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul for (i = 0; i < n; i++) { 1260afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (mask[i]) { 126174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const GLchan *p = PIXELADDR3(x[i], y[i]); 126274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul rgba[i][RCOMP] = UNPACK_RED(p); 126374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul rgba[i][GCOMP] = UNPACK_GREEN(p); 126474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul rgba[i][BCOMP] = UNPACK_BLUE(p); 126565c6ca91795a71cf38dbe5f49f2d73fd9d4049cdBrian Paul rgba[i][ACOMP] = CHAN_MAX; 1266afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1267afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1268afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 1269afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1270afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1271afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/**********************************************************************/ 1272206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul/***** 2 byte RGB pixel support funcs *****/ 1273206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul/**********************************************************************/ 1274206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul 1275206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul/* Write RGBA pixels to an RGB_565 buffer. */ 1276206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paulstatic void 1277206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paulwrite_rgba_span2( const GLcontext *ctx, 1278206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul GLuint n, GLint x, GLint y, 1279206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul CONST GLubyte rgba[][4], const GLubyte mask[] ) 1280206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul{ 1281206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul OSMesaContext osmesa = OSMESA_CONTEXT(ctx); 1282206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul GLushort *ptr2 = (GLushort *) PIXELADDR2(x, y); 1283206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul GLuint i; 1284206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul if (mask) { 1285206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul for (i = 0; i < n; i++, ptr2++) { 1286206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul if (mask[i]) { 1287206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul PACK_RGB_565(*ptr2, rgba[i][RCOMP], rgba[i][GCOMP], rgba[i][BCOMP]); 1288206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul } 1289206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul } 1290206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul } 1291206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul else { 1292206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul for (i = 0; i < n; i++, ptr2++) { 1293206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul PACK_RGB_565(*ptr2, rgba[i][RCOMP], rgba[i][GCOMP], rgba[i][BCOMP]); 1294206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul } 1295206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul } 1296206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul} 1297206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul 1298206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul 1299206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul/* Write RGB pixels to an RGB_565 buffer. */ 1300206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paulstatic void 1301206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paulwrite_rgb_span2( const GLcontext *ctx, 1302206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul GLuint n, GLint x, GLint y, 1303206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul CONST GLubyte rgb[][3], const GLubyte mask[] ) 1304206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul{ 1305206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul OSMesaContext osmesa = OSMESA_CONTEXT(ctx); 1306206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul GLushort *ptr2 = (GLushort *) PIXELADDR2(x, y); 1307206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul GLuint i; 1308206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul if (mask) { 1309206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul for (i = 0; i < n; i++, ptr2++) { 1310206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul if (mask[i]) { 1311206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul PACK_RGB_565(*ptr2, rgb[i][RCOMP], rgb[i][GCOMP], rgb[i][BCOMP]); 1312206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul } 1313206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul } 1314206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul } 1315206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul else { 1316206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul for (i = 0; i < n; i++, ptr2++) { 1317206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul PACK_RGB_565(*ptr2, rgb[i][RCOMP], rgb[i][GCOMP], rgb[i][BCOMP]); 1318206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul } 1319206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul } 1320206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul} 1321206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul 1322206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul 1323206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paulstatic void 1324206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paulwrite_monocolor_span2( const GLcontext *ctx, GLuint n, GLint x, GLint y, 1325206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul const GLchan color[4], const GLubyte mask[] ) 1326206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul{ 1327206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul OSMesaContext osmesa = OSMESA_CONTEXT(ctx); 1328206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul GLushort pixel; 1329206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul GLushort *ptr2 = (GLushort *) PIXELADDR2(x, y); 1330206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul GLuint i; 1331206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul PACK_RGB_565(pixel, color[RCOMP], color[GCOMP], color[BCOMP]); 1332206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul for (i = 0; i < n; i++, ptr2++) { 1333206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul if (mask[i]) { 1334206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul *ptr2 = pixel; 1335206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul } 1336206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul } 1337206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul} 1338206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul 1339206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul 1340206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paulstatic void 1341206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paulwrite_rgba_pixels2( const GLcontext *ctx, 1342206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul GLuint n, const GLint x[], const GLint y[], 1343206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul CONST GLubyte rgba[][4], const GLubyte mask[] ) 1344206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul{ 1345206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul OSMesaContext osmesa = OSMESA_CONTEXT(ctx); 1346206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul GLuint i; 1347206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul for (i = 0; i < n; i++) { 1348206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul if (mask[i]) { 1349206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul GLushort *ptr2 = (GLushort *) PIXELADDR2(x[i],y[i]); 1350206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul PACK_RGB_565(*ptr2, rgba[i][RCOMP], rgba[i][GCOMP], rgba[i][BCOMP]); 1351206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul } 1352206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul } 1353206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul} 1354206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul 1355206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paulstatic void 1356206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paulwrite_monocolor_pixels2( const GLcontext *ctx, 1357206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul GLuint n, const GLint x[], const GLint y[], 1358206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul const GLchan color[4], const GLubyte mask[] ) 1359206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul{ 1360206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul OSMesaContext osmesa = OSMESA_CONTEXT(ctx); 1361206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul GLuint i; 1362206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul GLushort pixel; 1363206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul PACK_RGB_565(pixel, color[RCOMP], color[GCOMP], color[BCOMP]); 1364206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul for (i = 0; i < n; i++) { 1365206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul if (mask[i]) { 1366206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul GLushort *ptr2 = (GLushort *) PIXELADDR2(x[i],y[i]); 1367206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul *ptr2 = pixel; 1368206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul } 1369206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul } 1370206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul} 1371206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul 1372206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paulstatic void 1373206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paulread_rgba_span2( const GLcontext *ctx, 1374206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul GLuint n, GLint x, GLint y, 1375206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul GLubyte rgba[][4] ) 1376206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul{ 1377206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul OSMesaContext osmesa = OSMESA_CONTEXT(ctx); 1378206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul GLuint i; 1379206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul const GLushort *ptr2 = (const GLushort *) PIXELADDR2(x, y); 1380206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul for (i = 0; i < n; i++, ptr2++) { 1381206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul /* This should be fixed to get the low bits right */ 1382206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul rgba[i][RCOMP] = (*ptr2 >> 8) & 0xFe; 1383206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul rgba[i][GCOMP] = (*ptr2 >> 3) & 0xFc; 1384206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul rgba[i][BCOMP] = (*ptr2 << 3) & 0xFe; 1385206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul rgba[i][ACOMP] = 0; 1386206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul } 1387206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul} 1388206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul 1389206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paulstatic void 1390206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paulread_rgba_pixels2( const GLcontext *ctx, 1391206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul GLuint n, const GLint x[], const GLint y[], 1392206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul GLubyte rgba[][4], const GLubyte mask[] ) 1393206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul{ 1394206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul OSMesaContext osmesa = OSMESA_CONTEXT(ctx); 1395206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul GLuint i; 1396206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul for (i = 0; i < n; i++) { 1397206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul if (mask[i]) { 1398206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul /* This should be fixed to get the low bits right */ 1399206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul const GLushort *ptr2 = (const GLushort *) PIXELADDR2(x[i],y[i]); 1400206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul rgba[i][RCOMP] = (*ptr2 >> 8) & 0xFE; 1401206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul rgba[i][GCOMP] = (*ptr2 >> 3) & 0xFC; 1402206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul rgba[i][BCOMP] = (*ptr2 << 3) & 0xFE; 1403206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul rgba[i][ACOMP] = 0; 1404206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul } 1405206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul } 1406206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul} 1407206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul 1408206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul 1409206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul 1410206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul/**********************************************************************/ 1411afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/***** Read/write spans/arrays of CI pixels *****/ 1412afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/**********************************************************************/ 1413afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1414afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/* Write 32-bit color index to buffer */ 141574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void 141674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulwrite_index32_span( const GLcontext *ctx, GLuint n, GLint x, GLint y, 141774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const GLuint index[], const GLubyte mask[] ) 1418afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 141974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const OSMesaContext osmesa = OSMESA_CONTEXT(ctx); 142074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul GLchan *ptr1 = PIXELADDR1(x, y); 1421afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLuint i; 1422afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (mask) { 1423afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg for (i=0;i<n;i++,ptr1++) { 1424afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (mask[i]) { 142574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul *ptr1 = (GLchan) index[i]; 1426afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1427afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1428afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1429afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg else { 1430afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg for (i=0;i<n;i++,ptr1++) { 143174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul *ptr1 = (GLchan) index[i]; 1432afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1433afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1434afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 1435afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1436afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1437afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/* Write 8-bit color index to buffer */ 143874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void 143974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulwrite_index8_span( const GLcontext *ctx, GLuint n, GLint x, GLint y, 144074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const GLubyte index[], const GLubyte mask[] ) 1441afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 144274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const OSMesaContext osmesa = OSMESA_CONTEXT(ctx); 144374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul GLchan *ptr1 = PIXELADDR1(x, y); 1444afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLuint i; 1445afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (mask) { 1446afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg for (i=0;i<n;i++,ptr1++) { 1447afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (mask[i]) { 144874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul *ptr1 = (GLchan) index[i]; 1449afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1450afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1451afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1452afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg else { 145374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul MEMCPY(ptr1, index, n * sizeof(GLchan)); 1454afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1455afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 1456afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1457afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 145874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void 145974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulwrite_monoindex_span( const GLcontext *ctx, GLuint n, GLint x, GLint y, 146074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul GLuint colorIndex, const GLubyte mask[] ) 1461afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 146274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const OSMesaContext osmesa = OSMESA_CONTEXT(ctx); 146374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul GLchan *ptr1 = PIXELADDR1(x, y); 1464afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLuint i; 1465afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg for (i=0;i<n;i++,ptr1++) { 1466afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (mask[i]) { 146774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul *ptr1 = (GLchan) colorIndex; 1468afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1469afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1470afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 1471afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1472afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 147374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void 147474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulwrite_index_pixels( const GLcontext *ctx, 147574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul GLuint n, const GLint x[], const GLint y[], 147674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const GLuint index[], const GLubyte mask[] ) 1477afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 147874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const OSMesaContext osmesa = OSMESA_CONTEXT(ctx); 1479afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLuint i; 1480afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg for (i=0;i<n;i++) { 1481afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (mask[i]) { 148274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul GLchan *ptr1 = PIXELADDR1(x[i], y[i]); 148374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul *ptr1 = (GLchan) index[i]; 1484afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1485afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1486afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 1487afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1488afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 148974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void 149074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulwrite_monoindex_pixels( const GLcontext *ctx, 149174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul GLuint n, const GLint x[], const GLint y[], 149274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul GLuint colorIndex, const GLubyte mask[] ) 1493afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 149474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const OSMesaContext osmesa = OSMESA_CONTEXT(ctx); 1495afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLuint i; 1496afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg for (i=0;i<n;i++) { 1497afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (mask[i]) { 149874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul GLchan *ptr1 = PIXELADDR1(x[i], y[i]); 149974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul *ptr1 = (GLchan) colorIndex; 1500afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1501afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1502afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 1503afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1504afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 150574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void 150674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulread_index_span( const GLcontext *ctx, 150774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul GLuint n, GLint x, GLint y, GLuint index[] ) 1508afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 150974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const OSMesaContext osmesa = OSMESA_CONTEXT(ctx); 1510afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLuint i; 151174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const GLchan *ptr1 = (const GLchan *) PIXELADDR1(x, y); 1512afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg for (i=0;i<n;i++,ptr1++) { 1513afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg index[i] = (GLuint) *ptr1; 1514afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1515afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 1516afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1517afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 151874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void 151974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulread_index_pixels( const GLcontext *ctx, 152074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul GLuint n, const GLint x[], const GLint y[], 152174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul GLuint index[], const GLubyte mask[] ) 1522afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 152374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const OSMesaContext osmesa = OSMESA_CONTEXT(ctx); 1524afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLuint i; 1525afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg for (i=0;i<n;i++) { 1526afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (mask[i] ) { 152774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const GLchan *ptr1 = PIXELADDR1(x[i], y[i]); 1528afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg index[i] = (GLuint) *ptr1; 1529afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1530afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1531afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 1532afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1533afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1534afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1535afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/**********************************************************************/ 1536afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/***** Optimized line rendering *****/ 1537afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/**********************************************************************/ 1538afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1539afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1540afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/* 1541afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Draw a flat-shaded, RGB line into an osmesa buffer. 1542afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */ 154374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void 154474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulflat_rgba_line( GLcontext *ctx, const SWvertex *vert0, const SWvertex *vert1 ) 1545afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 154674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const OSMesaContext osmesa = OSMESA_CONTEXT(ctx); 154774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const GLchan *color = vert0->color; 1548afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1549afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#define INTERP_XY 1 1550afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#define CLIP_HACK 1 155174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul#define PLOT(X, Y) \ 155274b493a5e61237de081a438e774e5d8139d4c6b7Brian Pauldo { \ 155374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul GLchan *p = PIXELADDR4(X, Y); \ 155474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul PACK_RGBA(p, color[0], color[1], color[2], color[3]); \ 155574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul} while (0) 1556afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1557afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#ifdef WIN32 1558724abeb058ca9372c5a9b9e38ee43dde1accaa41Keith Whitwell#include "..\swrast\s_linetemp.h" 1559afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#else 1560724abeb058ca9372c5a9b9e38ee43dde1accaa41Keith Whitwell#include "swrast/s_linetemp.h" 1561afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#endif 1562afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 1563afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1564afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1565afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/* 1566afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Draw a flat-shaded, Z-less, RGB line into an osmesa buffer. 1567afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */ 156874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void 156974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulflat_rgba_z_line(GLcontext *ctx, const SWvertex *vert0, const SWvertex *vert1) 1570afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 157174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const OSMesaContext osmesa = OSMESA_CONTEXT(ctx); 157274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const GLchan *color = vert0->color; 1573afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1574afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#define INTERP_XY 1 1575afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#define INTERP_Z 1 1576ed30dfa1264ec8875a3162c3c8778bc703bf11d5Brian Paul#define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE 1577afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#define CLIP_HACK 1 157874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul#define PLOT(X, Y) \ 157974b493a5e61237de081a438e774e5d8139d4c6b7Brian Pauldo { \ 158074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul if (Z < *zPtr) { \ 158174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul GLchan *p = PIXELADDR4(X, Y); \ 158274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul PACK_RGBA(p, color[RCOMP], color[GCOMP], \ 158374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul color[BCOMP], color[ACOMP]); \ 158474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul *zPtr = Z; \ 158574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul } \ 158674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul} while (0) 158774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul 1588afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1589afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#ifdef WIN32 1590724abeb058ca9372c5a9b9e38ee43dde1accaa41Keith Whitwell#include "..\swrast\s_linetemp.h" 1591afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#else 1592724abeb058ca9372c5a9b9e38ee43dde1accaa41Keith Whitwell#include "swrast/s_linetemp.h" 1593afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#endif 1594afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 1595afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1596afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1597afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/* 1598afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Draw a flat-shaded, alpha-blended, RGB line into an osmesa buffer. 159974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul * XXX update for GLchan 1600afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */ 160174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void 160274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulflat_blend_rgba_line( GLcontext *ctx, 160374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const SWvertex *vert0, const SWvertex *vert1 ) 1604afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 160574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const OSMesaContext osmesa = OSMESA_CONTEXT(ctx); 160674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const GLint rshift = osmesa->rshift; 160774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const GLint gshift = osmesa->gshift; 160874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const GLint bshift = osmesa->bshift; 160974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const GLint avalue = vert0->color[3]; 161065c6ca91795a71cf38dbe5f49f2d73fd9d4049cdBrian Paul const GLint msavalue = CHAN_MAX - avalue; 161174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const GLint rvalue = vert0->color[0]*avalue; 161274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const GLint gvalue = vert0->color[1]*avalue; 161374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const GLint bvalue = vert0->color[2]*avalue; 1614afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1615afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#define INTERP_XY 1 1616afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#define CLIP_HACK 1 1617afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#define PLOT(X,Y) \ 161865c6ca91795a71cf38dbe5f49f2d73fd9d4049cdBrian Paul { GLuint *ptr4 = (GLuint *) PIXELADDR4(X, Y); \ 16197e67fb41fb54e050f6983b4de09ed3a317d6148fBrian Paul GLuint pixel = 0; \ 1620afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg pixel |=((((((*ptr4) >> rshift) & 0xff)*msavalue+rvalue)>>8) << rshift);\ 1621afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg pixel |=((((((*ptr4) >> gshift) & 0xff)*msavalue+gvalue)>>8) << gshift);\ 1622afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg pixel |=((((((*ptr4) >> bshift) & 0xff)*msavalue+bvalue)>>8) << bshift);\ 16237e67fb41fb54e050f6983b4de09ed3a317d6148fBrian Paul *ptr4 = pixel; \ 1624afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1625afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1626afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#ifdef WIN32 1627724abeb058ca9372c5a9b9e38ee43dde1accaa41Keith Whitwell#include "..\swrast\s_linetemp.h" 1628afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#else 1629724abeb058ca9372c5a9b9e38ee43dde1accaa41Keith Whitwell#include "swrast/s_linetemp.h" 1630afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#endif 1631afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 1632afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1633ed30dfa1264ec8875a3162c3c8778bc703bf11d5Brian Paul 1634afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/* 1635afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Draw a flat-shaded, Z-less, alpha-blended, RGB line into an osmesa buffer. 163674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul * XXX update for GLchan 1637afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */ 163874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void 163974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulflat_blend_rgba_z_line( GLcontext *ctx, 164074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const SWvertex *vert0, const SWvertex *vert1 ) 1641afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 164274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const OSMesaContext osmesa = OSMESA_CONTEXT(ctx); 164374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const GLint rshift = osmesa->rshift; 164474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const GLint gshift = osmesa->gshift; 164574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const GLint bshift = osmesa->bshift; 164674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const GLint avalue = vert0->color[3]; 164774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const GLint msavalue = 256 - avalue; 164874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const GLint rvalue = vert0->color[0]*avalue; 164974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const GLint gvalue = vert0->color[1]*avalue; 165074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const GLint bvalue = vert0->color[2]*avalue; 1651afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1652afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#define INTERP_XY 1 1653afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#define INTERP_Z 1 1654ed30dfa1264ec8875a3162c3c8778bc703bf11d5Brian Paul#define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE 1655afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#define CLIP_HACK 1 16567e67fb41fb54e050f6983b4de09ed3a317d6148fBrian Paul#define PLOT(X,Y) \ 16577e67fb41fb54e050f6983b4de09ed3a317d6148fBrian Paul if (Z < *zPtr) { \ 165874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul GLuint *ptr4 = (GLuint *) PIXELADDR4(X, Y); \ 16597e67fb41fb54e050f6983b4de09ed3a317d6148fBrian Paul GLuint pixel = 0; \ 1660ed30dfa1264ec8875a3162c3c8778bc703bf11d5Brian Paul pixel |=((((((*ptr4) >> rshift) & 0xff)*msavalue+rvalue)>>8) << rshift); \ 1661ed30dfa1264ec8875a3162c3c8778bc703bf11d5Brian Paul pixel |=((((((*ptr4) >> gshift) & 0xff)*msavalue+gvalue)>>8) << gshift); \ 1662ed30dfa1264ec8875a3162c3c8778bc703bf11d5Brian Paul pixel |=((((((*ptr4) >> bshift) & 0xff)*msavalue+bvalue)>>8) << bshift); \ 16637e67fb41fb54e050f6983b4de09ed3a317d6148fBrian Paul *ptr4 = pixel; \ 1664afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1665afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1666afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#ifdef WIN32 1667724abeb058ca9372c5a9b9e38ee43dde1accaa41Keith Whitwell#include "..\swrast\s_linetemp.h" 1668afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#else 1669724abeb058ca9372c5a9b9e38ee43dde1accaa41Keith Whitwell#include "swrast/s_linetemp.h" 1670afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#endif 1671afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 1672afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1673ed30dfa1264ec8875a3162c3c8778bc703bf11d5Brian Paul 1674afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/* 1675afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Draw a flat-shaded, Z-less, alpha-blended, RGB line into an osmesa buffer. 167674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul * XXX update for GLchan 1677afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */ 167874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void 167974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulflat_blend_rgba_z_line_write( GLcontext *ctx, 168074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const SWvertex *vert0, const SWvertex *vert1 ) 1681afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 168274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const OSMesaContext osmesa = OSMESA_CONTEXT(ctx); 168374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const GLint rshift = osmesa->rshift; 168474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const GLint gshift = osmesa->gshift; 168574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const GLint bshift = osmesa->bshift; 168674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const GLint avalue = vert0->color[3]; 168774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const GLint msavalue = 256 - avalue; 168874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const GLint rvalue = vert0->color[0]*avalue; 168974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const GLint gvalue = vert0->color[1]*avalue; 169074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const GLint bvalue = vert0->color[2]*avalue; 1691afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1692afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#define INTERP_XY 1 1693afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#define INTERP_Z 1 1694ed30dfa1264ec8875a3162c3c8778bc703bf11d5Brian Paul#define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE 1695afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#define CLIP_HACK 1 16967e67fb41fb54e050f6983b4de09ed3a317d6148fBrian Paul#define PLOT(X,Y) \ 16977e67fb41fb54e050f6983b4de09ed3a317d6148fBrian Paul if (Z < *zPtr) { \ 169874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul GLuint *ptr4 = (GLuint *) PIXELADDR4(X, Y); \ 16997e67fb41fb54e050f6983b4de09ed3a317d6148fBrian Paul GLuint pixel = 0; \ 1700ed30dfa1264ec8875a3162c3c8778bc703bf11d5Brian Paul pixel |=((((((*ptr4) >> rshift) & 0xff)*msavalue+rvalue)>>8) << rshift); \ 1701ed30dfa1264ec8875a3162c3c8778bc703bf11d5Brian Paul pixel |=((((((*ptr4) >> gshift) & 0xff)*msavalue+gvalue)>>8) << gshift); \ 1702ed30dfa1264ec8875a3162c3c8778bc703bf11d5Brian Paul pixel |=((((((*ptr4) >> bshift) & 0xff)*msavalue+bvalue)>>8) << bshift); \ 17037e67fb41fb54e050f6983b4de09ed3a317d6148fBrian Paul *ptr4 = pixel; \ 17047e67fb41fb54e050f6983b4de09ed3a317d6148fBrian Paul *zPtr = Z; \ 1705afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1706afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1707afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#ifdef WIN32 1708724abeb058ca9372c5a9b9e38ee43dde1accaa41Keith Whitwell#include "..\swrast\s_linetemp.h" 1709afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#else 1710724abeb058ca9372c5a9b9e38ee43dde1accaa41Keith Whitwell#include "swrast/s_linetemp.h" 1711afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#endif 1712afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 1713afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1714afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1715afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/* 1716afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Analyze context state to see if we can provide a fast line drawing 1717afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * function, like those in lines.c. Otherwise, return NULL. 1718afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */ 1719dbd1e2b5990a3689bf718296c57c14fc3ba38db5Jouk Jansenstatic swrast_line_func 17201e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwellosmesa_choose_line_function( GLcontext *ctx ) 1721afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 172274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const OSMesaContext osmesa = OSMESA_CONTEXT(ctx); 172374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const SWcontext *swrast = SWRAST_CONTEXT(ctx); 1724afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 172574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul if (CHAN_BITS != 8) return NULL; 17262d595d70202bad560c27ea81ec71b740415b3355Brian Paul if (ctx->RenderMode != GL_RENDER) return NULL; 1727afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (ctx->Line.SmoothFlag) return NULL; 17282d595d70202bad560c27ea81ec71b740415b3355Brian Paul if (ctx->Texture._ReallyEnabled) return NULL; 172974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul if (ctx->Light.ShadeModel != GL_FLAT) return NULL; 173074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul if (ctx->Line.Width != 1.0F) return NULL; 173174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul if (ctx->Line.StippleFlag) return NULL; 173274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul if (ctx->Line.SmoothFlag) return NULL; 173374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul if (osmesa->format != OSMESA_RGBA && 173474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul osmesa->format != OSMESA_BGRA && 173574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul osmesa->format != OSMESA_ARGB) return NULL; 173674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul 173774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul if (swrast->_RasterMask==DEPTH_BIT 173874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul && ctx->Depth.Func==GL_LESS 173974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul && ctx->Depth.Mask==GL_TRUE 174074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul && ctx->Visual.depthBits == DEFAULT_SOFTWARE_DEPTH_BITS) { 174174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul return flat_rgba_z_line; 174274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul } 174374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul 174474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul if (swrast->_RasterMask == 0) { 174574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul return flat_rgba_line; 174674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul } 174774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul 174874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul if (swrast->_RasterMask==(DEPTH_BIT|BLEND_BIT) 174974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul && ctx->Depth.Func==GL_LESS 175074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul && ctx->Depth.Mask==GL_TRUE 175174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul && ctx->Visual.depthBits == DEFAULT_SOFTWARE_DEPTH_BITS 175274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul && ctx->Color.BlendSrcRGB==GL_SRC_ALPHA 175374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul && ctx->Color.BlendDstRGB==GL_ONE_MINUS_SRC_ALPHA 175474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul && ctx->Color.BlendSrcA==GL_SRC_ALPHA 175574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul && ctx->Color.BlendDstA==GL_ONE_MINUS_SRC_ALPHA 175674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul && ctx->Color.BlendEquation==GL_FUNC_ADD_EXT) { 175774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul return flat_blend_rgba_z_line_write; 175874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul } 175974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul 176074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul if (swrast->_RasterMask==(DEPTH_BIT|BLEND_BIT) 176174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul && ctx->Depth.Func==GL_LESS 176274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul && ctx->Depth.Mask==GL_FALSE 176374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul && ctx->Visual.depthBits == DEFAULT_SOFTWARE_DEPTH_BITS 176474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul && ctx->Color.BlendSrcRGB==GL_SRC_ALPHA 176574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul && ctx->Color.BlendDstRGB==GL_ONE_MINUS_SRC_ALPHA 176674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul && ctx->Color.BlendSrcA==GL_SRC_ALPHA 176774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul && ctx->Color.BlendDstA==GL_ONE_MINUS_SRC_ALPHA 176874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul && ctx->Color.BlendEquation==GL_FUNC_ADD_EXT) { 176974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul return flat_blend_rgba_z_line; 177074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul } 1771afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 177274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul if (swrast->_RasterMask==BLEND_BIT 177374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul && ctx->Color.BlendSrcRGB==GL_SRC_ALPHA 177474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul && ctx->Color.BlendDstRGB==GL_ONE_MINUS_SRC_ALPHA 177574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul && ctx->Color.BlendSrcA==GL_SRC_ALPHA 177674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul && ctx->Color.BlendDstA==GL_ONE_MINUS_SRC_ALPHA 177774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul && ctx->Color.BlendEquation==GL_FUNC_ADD_EXT) { 177874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul return flat_blend_rgba_line; 1779afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 178074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul 1781afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return NULL; 1782afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 1783afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1784afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1785afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/**********************************************************************/ 1786afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/***** Optimized triangle rendering *****/ 1787afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/**********************************************************************/ 1788afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1789afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1790afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/* 1791afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Smooth-shaded, z-less triangle, RGBA color. 1792afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */ 1793dbd1e2b5990a3689bf718296c57c14fc3ba38db5Jouk Jansenstatic void smooth_rgba_z_triangle( GLcontext *ctx, 1794a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul const SWvertex *v0, 1795a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul const SWvertex *v1, 1796a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul const SWvertex *v2 ) 1797afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 179874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const OSMesaContext osmesa = OSMESA_CONTEXT(ctx); 179923ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank 1800afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#define INTERP_Z 1 1801ed30dfa1264ec8875a3162c3c8778bc703bf11d5Brian Paul#define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE 1802afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#define INTERP_RGB 1 1803afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#define INTERP_ALPHA 1 18049bf68ad963ba92b5d1e725f965979042495a5313Brian Paul#define RENDER_SPAN( span ) \ 18059bf68ad963ba92b5d1e725f965979042495a5313Brian Paul GLuint i; \ 18069bf68ad963ba92b5d1e725f965979042495a5313Brian Paul GLchan *img = PIXELADDR4(span.x, span.y); \ 18079bf68ad963ba92b5d1e725f965979042495a5313Brian Paul for (i = 0; i < span.count; i++, img += 4) { \ 18089bf68ad963ba92b5d1e725f965979042495a5313Brian Paul const GLdepth z = FixedToDepth(span.z); \ 1809afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (z < zRow[i]) { \ 18109bf68ad963ba92b5d1e725f965979042495a5313Brian Paul PACK_RGBA(img, FixedToInt(span.red), \ 18119bf68ad963ba92b5d1e725f965979042495a5313Brian Paul FixedToInt(span.green), FixedToInt(span.blue), \ 18129bf68ad963ba92b5d1e725f965979042495a5313Brian Paul FixedToInt(span.alpha)); \ 1813afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg zRow[i] = z; \ 1814afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } \ 18159bf68ad963ba92b5d1e725f965979042495a5313Brian Paul span.red += span.redStep; \ 18169bf68ad963ba92b5d1e725f965979042495a5313Brian Paul span.green += span.greenStep; \ 18179bf68ad963ba92b5d1e725f965979042495a5313Brian Paul span.blue += span.blueStep; \ 18189bf68ad963ba92b5d1e725f965979042495a5313Brian Paul span.alpha += span.alphaStep; \ 18199bf68ad963ba92b5d1e725f965979042495a5313Brian Paul span.z += span.zStep; \ 18209bf68ad963ba92b5d1e725f965979042495a5313Brian Paul } 18219bf68ad963ba92b5d1e725f965979042495a5313Brian Paul 1822afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#ifdef WIN32 1823724abeb058ca9372c5a9b9e38ee43dde1accaa41Keith Whitwell#include "..\swrast\s_tritemp.h" 1824afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#else 1825724abeb058ca9372c5a9b9e38ee43dde1accaa41Keith Whitwell#include "swrast/s_tritemp.h" 1826afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#endif 1827afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 1828afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1829afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1830afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1831afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1832afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/* 1833afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Flat-shaded, z-less triangle, RGBA color. 1834afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */ 1835dbd1e2b5990a3689bf718296c57c14fc3ba38db5Jouk Jansenstatic void flat_rgba_z_triangle( GLcontext *ctx, 1836a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul const SWvertex *v0, 1837a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul const SWvertex *v1, 1838a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul const SWvertex *v2 ) 1839afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 184074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const OSMesaContext osmesa = OSMESA_CONTEXT(ctx); 1841afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#define INTERP_Z 1 1842ed30dfa1264ec8875a3162c3c8778bc703bf11d5Brian Paul#define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE 184374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul#define SETUP_CODE \ 184474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul GLuint pixel; \ 184574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul PACK_RGBA((GLchan *) &pixel, v0->color[0], v0->color[1], \ 184674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul v0->color[2], v0->color[3]); 184774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul 18489bf68ad963ba92b5d1e725f965979042495a5313Brian Paul#define RENDER_SPAN( span ) \ 18499bf68ad963ba92b5d1e725f965979042495a5313Brian Paul GLuint i; \ 18509bf68ad963ba92b5d1e725f965979042495a5313Brian Paul GLuint *img = (GLuint *) PIXELADDR4(span.x, span.y); \ 18519bf68ad963ba92b5d1e725f965979042495a5313Brian Paul for (i = 0; i < span.count; i++) { \ 18529bf68ad963ba92b5d1e725f965979042495a5313Brian Paul const GLdepth z = FixedToDepth(span.z); \ 185374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul if (z < zRow[i]) { \ 185474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul img[i] = pixel; \ 185574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul zRow[i] = z; \ 185674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul } \ 18579bf68ad963ba92b5d1e725f965979042495a5313Brian Paul span.z += span.zStep; \ 18589bf68ad963ba92b5d1e725f965979042495a5313Brian Paul } 18599bf68ad963ba92b5d1e725f965979042495a5313Brian Paul 1860afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#ifdef WIN32 1861724abeb058ca9372c5a9b9e38ee43dde1accaa41Keith Whitwell#include "..\swrast\s_tritemp.h" 1862afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#else 1863724abeb058ca9372c5a9b9e38ee43dde1accaa41Keith Whitwell#include "swrast/s_tritemp.h" 1864afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#endif 1865afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 1866afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1867afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1868afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1869afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/* 1870afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Return pointer to an accelerated triangle function if possible. 1871afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */ 1872dbd1e2b5990a3689bf718296c57c14fc3ba38db5Jouk Jansenstatic swrast_tri_func 18731e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwellosmesa_choose_triangle_function( GLcontext *ctx ) 1874afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 187574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const OSMesaContext osmesa = OSMESA_CONTEXT(ctx); 187674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const SWcontext *swrast = SWRAST_CONTEXT(ctx); 187774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul 187874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul if (CHAN_BITS != 8) return (swrast_tri_func) NULL; 187974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul if (ctx->RenderMode != GL_RENDER) return (swrast_tri_func) NULL; 188074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul if (ctx->Polygon.SmoothFlag) return (swrast_tri_func) NULL; 188174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul if (ctx->Polygon.StippleFlag) return (swrast_tri_func) NULL; 188274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul if (ctx->Texture._ReallyEnabled) return (swrast_tri_func) NULL; 188374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul if (osmesa->format != OSMESA_RGBA && 188474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul osmesa->format != OSMESA_BGRA && 188574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul osmesa->format != OSMESA_ARGB) return (swrast_tri_func) NULL; 188674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul 188774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul if (swrast->_RasterMask == DEPTH_BIT && 188874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul ctx->Depth.Func == GL_LESS && 188974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul ctx->Depth.Mask == GL_TRUE && 189074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul ctx->Visual.depthBits == DEFAULT_SOFTWARE_DEPTH_BITS) { 189174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul if (ctx->Light.ShadeModel == GL_SMOOTH) { 1892afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return smooth_rgba_z_triangle; 1893afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1894afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg else { 1895afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return flat_rgba_z_triangle; 1896afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1897afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 189874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul return (swrast_tri_func) NULL; 18991e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell} 19001e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell 190174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul 190274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul 19031e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell/* Override for the swrast triangle-selection function. Try to use one 19041e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell * of our internal triangle functions, otherwise fall back to the 1905dbd1e2b5990a3689bf718296c57c14fc3ba38db5Jouk Jansen * standard swrast functions. 19061e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell */ 19071e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwellstatic void osmesa_choose_triangle( GLcontext *ctx ) 19081e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell{ 19091e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell SWcontext *swrast = SWRAST_CONTEXT(ctx); 19101e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell 19111e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell swrast->Triangle = osmesa_choose_triangle_function( ctx ); 19121e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell if (!swrast->Triangle) 19131e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell _swrast_choose_triangle( ctx ); 1914afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 1915afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 19161e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwellstatic void osmesa_choose_line( GLcontext *ctx ) 19171e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell{ 19181e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell SWcontext *swrast = SWRAST_CONTEXT(ctx); 19191e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell 19201e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell swrast->Line = osmesa_choose_line_function( ctx ); 19211e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell if (!swrast->Line) 19221e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell _swrast_choose_line( ctx ); 19231e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell} 19241e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell 19251e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell 19262d595d70202bad560c27ea81ec71b740415b3355Brian Paul#define OSMESA_NEW_LINE (_NEW_LINE | \ 19272d595d70202bad560c27ea81ec71b740415b3355Brian Paul _NEW_TEXTURE | \ 19282d595d70202bad560c27ea81ec71b740415b3355Brian Paul _NEW_LIGHT | \ 19292d595d70202bad560c27ea81ec71b740415b3355Brian Paul _NEW_DEPTH | \ 19302d595d70202bad560c27ea81ec71b740415b3355Brian Paul _NEW_RENDERMODE | \ 1931dbd1e2b5990a3689bf718296c57c14fc3ba38db5Jouk Jansen _SWRAST_NEW_RASTERMASK) 19322d595d70202bad560c27ea81ec71b740415b3355Brian Paul 19332d595d70202bad560c27ea81ec71b740415b3355Brian Paul#define OSMESA_NEW_TRIANGLE (_NEW_POLYGON | \ 19342d595d70202bad560c27ea81ec71b740415b3355Brian Paul _NEW_TEXTURE | \ 19352d595d70202bad560c27ea81ec71b740415b3355Brian Paul _NEW_LIGHT | \ 19362d595d70202bad560c27ea81ec71b740415b3355Brian Paul _NEW_DEPTH | \ 19372d595d70202bad560c27ea81ec71b740415b3355Brian Paul _NEW_RENDERMODE | \ 19382d595d70202bad560c27ea81ec71b740415b3355Brian Paul _SWRAST_NEW_RASTERMASK) 19391e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell 19401e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell 1941dbd1e2b5990a3689bf718296c57c14fc3ba38db5Jouk Jansen/* Extend the software rasterizer with our line and triangle 19421e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell * functions. 19431e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell */ 19441e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwellstatic void osmesa_register_swrast_functions( GLcontext *ctx ) 19451e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell{ 19461e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell SWcontext *swrast = SWRAST_CONTEXT( ctx ); 1947dbd1e2b5990a3689bf718296c57c14fc3ba38db5Jouk Jansen 19481e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell swrast->choose_line = osmesa_choose_line; 19491e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell swrast->choose_triangle = osmesa_choose_triangle; 1950dbd1e2b5990a3689bf718296c57c14fc3ba38db5Jouk Jansen 19511e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell swrast->invalidate_line |= OSMESA_NEW_LINE; 19521e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell swrast->invalidate_triangle |= OSMESA_NEW_TRIANGLE; 19531e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell} 1954ed30dfa1264ec8875a3162c3c8778bc703bf11d5Brian Paul 1955ed30dfa1264ec8875a3162c3c8778bc703bf11d5Brian Paul 1956afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgstatic const GLubyte *get_string( GLcontext *ctx, GLenum name ) 1957afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 1958afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg (void) ctx; 1959afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg switch (name) { 1960afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_RENDERER: 1961afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return (const GLubyte *) "Mesa OffScreen"; 1962afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg default: 1963afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return NULL; 1964afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1965afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 1966afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1967afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1968cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwellstatic void osmesa_update_state( GLcontext *ctx, GLuint new_state ) 1969afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 1970c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul OSMesaContext osmesa = OSMESA_CONTEXT(ctx); 1971709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell struct swrast_device_driver *swdd = _swrast_GetDeviceDriverReference( ctx ); 1972709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell TNLcontext *tnl = TNL_CONTEXT(ctx); 1973304357dcd496f7ebf499fd9c77b4eba83a75abd5Brian Paul 1974304357dcd496f7ebf499fd9c77b4eba83a75abd5Brian Paul ASSERT((void *) osmesa == (void *) ctx->DriverCtx); 1975afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 197674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul /* 197774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul * XXX these function pointers could be initialized just once during 197874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul * context creation since they don't depend on any state changes. 197974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul */ 198074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul 1981afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ctx->Driver.GetString = get_string; 1982afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ctx->Driver.UpdateState = osmesa_update_state; 1983cea0e8e6700e871bb9bcb334cb75fbfbfcdfd702Brian Paul ctx->Driver.SetDrawBuffer = set_draw_buffer; 1984a81b3532f7c984878ba1d4b38f796abf731f76b1Brian Paul ctx->Driver.ResizeBuffersMESA = _swrast_alloc_buffers; 1985a81b3532f7c984878ba1d4b38f796abf731f76b1Brian Paul ctx->Driver.GetBufferSize = buffer_size; 1986a81b3532f7c984878ba1d4b38f796abf731f76b1Brian Paul 19875c1e7fa6ee72f4403d9ec9d12830dd689b966e71Keith Whitwell ctx->Driver.Accum = _swrast_Accum; 19885c1e7fa6ee72f4403d9ec9d12830dd689b966e71Keith Whitwell ctx->Driver.Bitmap = _swrast_Bitmap; 1989afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ctx->Driver.Clear = clear; 19905c1e7fa6ee72f4403d9ec9d12830dd689b966e71Keith Whitwell ctx->Driver.CopyPixels = _swrast_CopyPixels; 19915c1e7fa6ee72f4403d9ec9d12830dd689b966e71Keith Whitwell ctx->Driver.DrawPixels = _swrast_DrawPixels; 19925c1e7fa6ee72f4403d9ec9d12830dd689b966e71Keith Whitwell ctx->Driver.ReadPixels = _swrast_ReadPixels; 1993afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 19947d58f44f73be59bd3583e6dfeedf56c43f7fbd55Brian Paul ctx->Driver.ChooseTextureFormat = _mesa_choose_tex_format; 19958e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul ctx->Driver.TexImage1D = _mesa_store_teximage1d; 19968e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul ctx->Driver.TexImage2D = _mesa_store_teximage2d; 19978e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul ctx->Driver.TexImage3D = _mesa_store_teximage3d; 19988e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul ctx->Driver.TexSubImage1D = _mesa_store_texsubimage1d; 19998e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul ctx->Driver.TexSubImage2D = _mesa_store_texsubimage2d; 20008e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul ctx->Driver.TexSubImage3D = _mesa_store_texsubimage3d; 20018e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul ctx->Driver.TestProxyTexImage = _mesa_test_proxy_teximage; 20028e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul 2003709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell ctx->Driver.CopyTexImage1D = _swrast_copy_teximage1d; 2004709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell ctx->Driver.CopyTexImage2D = _swrast_copy_teximage2d; 2005709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell ctx->Driver.CopyTexSubImage1D = _swrast_copy_texsubimage1d; 2006709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell ctx->Driver.CopyTexSubImage2D = _swrast_copy_texsubimage2d; 2007709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell ctx->Driver.CopyTexSubImage3D = _swrast_copy_texsubimage3d; 2008709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell ctx->Driver.CopyColorTable = _swrast_CopyColorTable; 2009709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell ctx->Driver.CopyColorSubTable = _swrast_CopyColorSubTable; 2010709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell ctx->Driver.CopyConvolutionFilter1D = _swrast_CopyConvolutionFilter1D; 2011709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell ctx->Driver.CopyConvolutionFilter2D = _swrast_CopyConvolutionFilter2D; 2012709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell 2013afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 2014afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg /* RGB(A) span/pixel functions */ 201574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul if (osmesa->format == OSMESA_RGB) { 2016709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell swdd->WriteRGBASpan = write_rgba_span_RGB; 2017709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell swdd->WriteRGBSpan = write_rgb_span_RGB; 2018709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell swdd->WriteMonoRGBASpan = write_monocolor_span_RGB; 2019709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell swdd->WriteRGBAPixels = write_rgba_pixels_RGB; 2020709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell swdd->WriteMonoRGBAPixels = write_monocolor_pixels_RGB; 2021709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell swdd->ReadRGBASpan = read_rgba_span3; 2022709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell swdd->ReadRGBAPixels = read_rgba_pixels3; 202374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul } 202474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul else if (osmesa->format == OSMESA_BGR) { 2025709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell swdd->WriteRGBASpan = write_rgba_span_BGR; 2026709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell swdd->WriteRGBSpan = write_rgb_span_BGR; 2027709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell swdd->WriteMonoRGBASpan = write_monocolor_span_BGR; 2028709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell swdd->WriteRGBAPixels = write_rgba_pixels_BGR; 2029709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell swdd->WriteMonoRGBAPixels = write_monocolor_pixels_BGR; 2030709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell swdd->ReadRGBASpan = read_rgba_span3; 2031709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell swdd->ReadRGBAPixels = read_rgba_pixels3; 2032afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 2033206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul else if (osmesa->format == OSMESA_RGB_565) { 2034206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul swdd->WriteRGBASpan = write_rgba_span2; 2035206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul swdd->WriteRGBSpan = write_rgb_span2; 2036206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul swdd->WriteMonoRGBASpan = write_monocolor_span2; 2037206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul swdd->WriteRGBAPixels = write_rgba_pixels2; 2038206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul swdd->WriteMonoRGBAPixels = write_monocolor_pixels2; 2039206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul swdd->ReadRGBASpan = read_rgba_span2; 2040206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul swdd->ReadRGBAPixels = read_rgba_pixels2; 2041206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul } 2042afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg else { 20432db44ffe9d591b0686755e2128ae9a6a1611f2a5Brian Paul /* 4 GLchan / pixel in frame buffer */ 2044709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell swdd->WriteRGBSpan = write_rgb_span; 2045709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell swdd->WriteRGBAPixels = write_rgba_pixels; 2046709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell swdd->WriteMonoRGBASpan = write_monocolor_span; 2047709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell swdd->WriteMonoRGBAPixels = write_monocolor_pixels; 204874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul if (osmesa->format == OSMESA_RGBA && 204974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul CHAN_TYPE == GL_UNSIGNED_BYTE && 205074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul RCOMP==0 && GCOMP==1 && BCOMP==2 && ACOMP==3) { 205174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul /* special, fast case */ 2052709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell swdd->WriteRGBASpan = write_rgba_span_rgba; 2053709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell swdd->ReadRGBASpan = read_rgba_span_rgba; 205474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul } 205574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul else { 2056709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell swdd->WriteRGBASpan = write_rgba_span; 2057709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell swdd->ReadRGBASpan = read_rgba_span; 205874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul } 2059709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell swdd->ReadRGBAPixels = read_rgba_pixels; 2060afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 2061afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 2062afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg /* CI span/pixel functions */ 2063709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell swdd->WriteCI32Span = write_index32_span; 2064709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell swdd->WriteCI8Span = write_index8_span; 2065709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell swdd->WriteMonoCISpan = write_monoindex_span; 2066709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell swdd->WriteCI32Pixels = write_index_pixels; 2067709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell swdd->WriteMonoCIPixels = write_monoindex_pixels; 2068709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell swdd->ReadCI32Span = read_index_span; 2069709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell swdd->ReadCI32Pixels = read_index_pixels; 2070709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell 2071709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell swdd->SetReadBuffer = set_read_buffer; 2072709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell 2073bc69de5f21ebb4d6e1c65bf5652d17a9fc87dda7Keith Whitwell tnl->Driver.RunPipeline = _tnl_run_pipeline; 2074709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell tnl->Driver.RenderStart = _swsetup_RenderStart; 2075709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell tnl->Driver.RenderFinish = _swsetup_RenderFinish; 2076709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell tnl->Driver.BuildProjectedVertices = _swsetup_BuildProjectedVertices; 2077709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell tnl->Driver.RenderPrimitive = _swsetup_RenderPrimitive; 2078709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell tnl->Driver.PointsFunc = _swsetup_Points; 2079709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell tnl->Driver.LineFunc = _swsetup_Line; 2080709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell tnl->Driver.TriangleFunc = _swsetup_Triangle; 2081709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell tnl->Driver.QuadFunc = _swsetup_Quad; 2082709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell tnl->Driver.ResetLineStipple = _swrast_ResetLineStipple; 2083709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell tnl->Driver.RenderInterp = _swsetup_RenderInterp; 2084709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell tnl->Driver.RenderCopyPV = _swsetup_RenderCopyPV; 2085709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell tnl->Driver.RenderClippedLine = _swsetup_RenderClippedLine; 2086709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell tnl->Driver.RenderClippedPolygon = _swsetup_RenderClippedPolygon; 2087709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell 208823caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell 2089cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell _swrast_InvalidateState( ctx, new_state ); 2090cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell _swsetup_InvalidateState( ctx, new_state ); 209158e991705392a2e17a1c8b034f4083a0adaf1943Keith Whitwell _ac_InvalidateState( ctx, new_state ); 2092cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell _tnl_InvalidateState( ctx, new_state ); 2093afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 2094