osmesa.c revision 01dc182ee86922845ba0b17a2cda9af19150c93a
101dc182ee86922845ba0b17a2cda9af19150c93aBrian Paul/* $Id: osmesa.c,v 1.78 2002/04/04 16:58:04 brianp Exp $ */ 2afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 3afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/* 4afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Mesa 3-D graphics library 51cefc83a8802deb53a176e20fd2d23b8ce47909fBrian Paul * Version: 4.1 6dbd1e2b5990a3689bf718296c57c14fc3ba38db5Jouk Jansen * 71cefc83a8802deb53a176e20fd2d23b8ce47909fBrian Paul * Copyright (C) 1999-2002 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" 4002ee456248c75cfee324164ec6fd81a3b77ec2bfBrian Paul#include "buffers.h" 41afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#include "context.h" 4274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul#include "colormac.h" 43afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#include "depth.h" 448e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul#include "extensions.h" 45ebb248aa5c018dc676d389221d76ed329059789eBrian Paul#include "macros.h" 46afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#include "matrix.h" 478e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul#include "mem.h" 483041d05bbcccfddba01a1eeaba01e5da0e1e99afBrian Paul#include "mmath.h" 49dbd1e2b5990a3689bf718296c57c14fc3ba38db5Jouk Jansen#include "mtypes.h" 507d58f44f73be59bd3583e6dfeedf56c43f7fbd55Brian Paul#include "texformat.h" 518e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul#include "texstore.h" 528e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul#include "array_cache/acache.h" 531e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell#include "swrast/swrast.h" 541e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell#include "swrast_setup/swrast_setup.h" 551e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell#include "swrast/s_context.h" 56724abeb058ca9372c5a9b9e38ee43dde1accaa41Keith Whitwell#include "swrast/s_depth.h" 571e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell#include "swrast/s_lines.h" 581e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell#include "swrast/s_triangle.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 */ 11505ba9becc3211795af539d79b70c8a6af2688108Karl SchultzGLAPI OSMesaContext 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 */ 12905ba9becc3211795af539d79b70c8a6af2688108Karl SchultzGLAPI OSMesaContext 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; 13874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const GLuint i4 = 1; 13974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const GLubyte *i1 = (GLubyte *) &i4; 14074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const GLint little_endian = *i1; 141afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 14274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul rind = gind = bind = aind = 0; 143afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (format==OSMESA_COLOR_INDEX) { 144afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg indexBits = 8; 145afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg rshift = gshift = bshift = ashift = 0; 146afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg rgbmode = GL_FALSE; 147afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 148afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg else if (format==OSMESA_RGBA) { 149afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg indexBits = 0; 15001915e90e6912f06d43d443a09157f7bbc96ddc5Brian Paul redBits = CHAN_BITS; 15101915e90e6912f06d43d443a09157f7bbc96ddc5Brian Paul greenBits = CHAN_BITS; 15201915e90e6912f06d43d443a09157f7bbc96ddc5Brian Paul blueBits = CHAN_BITS; 15301915e90e6912f06d43d443a09157f7bbc96ddc5Brian Paul alphaBits = CHAN_BITS; 15474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul rind = 0; 15574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul gind = 1; 15674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul bind = 2; 15774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul aind = 3; 158afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (little_endian) { 159afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg rshift = 0; 160afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg gshift = 8; 161afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg bshift = 16; 162afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ashift = 24; 163afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 164afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg else { 165afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg rshift = 24; 166afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg gshift = 16; 167afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg bshift = 8; 168afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ashift = 0; 169afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 170afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg rgbmode = GL_TRUE; 171afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 172afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg else if (format==OSMESA_BGRA) { 173afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg indexBits = 0; 17401915e90e6912f06d43d443a09157f7bbc96ddc5Brian Paul redBits = CHAN_BITS; 17501915e90e6912f06d43d443a09157f7bbc96ddc5Brian Paul greenBits = CHAN_BITS; 17601915e90e6912f06d43d443a09157f7bbc96ddc5Brian Paul blueBits = CHAN_BITS; 17701915e90e6912f06d43d443a09157f7bbc96ddc5Brian Paul alphaBits = CHAN_BITS; 17874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul bind = 0; 1792427575c21c7c04b52f4a3605ad87c142c01f840Brian Paul gind = 1; 1802427575c21c7c04b52f4a3605ad87c142c01f840Brian Paul rind = 2; 18174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul aind = 3; 182afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (little_endian) { 1832427575c21c7c04b52f4a3605ad87c142c01f840Brian Paul bshift = 0; 1842427575c21c7c04b52f4a3605ad87c142c01f840Brian Paul gshift = 8; 1852427575c21c7c04b52f4a3605ad87c142c01f840Brian Paul rshift = 16; 1862427575c21c7c04b52f4a3605ad87c142c01f840Brian Paul ashift = 24; 187afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 188afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg else { 189afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg bshift = 24; 190afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg gshift = 16; 191afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg rshift = 8; 192afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ashift = 0; 193afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 194afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg rgbmode = GL_TRUE; 195afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 196afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg else if (format==OSMESA_ARGB) { 197afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg indexBits = 0; 19801915e90e6912f06d43d443a09157f7bbc96ddc5Brian Paul redBits = CHAN_BITS; 19901915e90e6912f06d43d443a09157f7bbc96ddc5Brian Paul greenBits = CHAN_BITS; 20001915e90e6912f06d43d443a09157f7bbc96ddc5Brian Paul blueBits = CHAN_BITS; 20101915e90e6912f06d43d443a09157f7bbc96ddc5Brian Paul alphaBits = CHAN_BITS; 2022427575c21c7c04b52f4a3605ad87c142c01f840Brian Paul aind = 0; 20374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul rind = 1; 20474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul gind = 2; 20574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul bind = 3; 206afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (little_endian) { 2072427575c21c7c04b52f4a3605ad87c142c01f840Brian Paul ashift = 0; 2082427575c21c7c04b52f4a3605ad87c142c01f840Brian Paul rshift = 8; 2092427575c21c7c04b52f4a3605ad87c142c01f840Brian Paul gshift = 16; 2102427575c21c7c04b52f4a3605ad87c142c01f840Brian Paul bshift = 24; 211afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 212afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg else { 213afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ashift = 24; 214afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg rshift = 16; 215afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg gshift = 8; 216afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg bshift = 0; 217afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 218afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg rgbmode = GL_TRUE; 219afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 220afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg else if (format==OSMESA_RGB) { 221afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg indexBits = 0; 22201915e90e6912f06d43d443a09157f7bbc96ddc5Brian Paul redBits = CHAN_BITS; 22301915e90e6912f06d43d443a09157f7bbc96ddc5Brian Paul greenBits = CHAN_BITS; 22401915e90e6912f06d43d443a09157f7bbc96ddc5Brian Paul blueBits = CHAN_BITS; 225afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg alphaBits = 0; 226afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg bshift = 0; 227afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg gshift = 8; 228afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg rshift = 16; 229afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ashift = 24; 230afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg rind = 0; 23174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul gind = 1; 23274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul bind = 2; 233afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg rgbmode = GL_TRUE; 234afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 235afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg else if (format==OSMESA_BGR) { 236afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg indexBits = 0; 23701915e90e6912f06d43d443a09157f7bbc96ddc5Brian Paul redBits = CHAN_BITS; 23801915e90e6912f06d43d443a09157f7bbc96ddc5Brian Paul greenBits = CHAN_BITS; 23901915e90e6912f06d43d443a09157f7bbc96ddc5Brian Paul blueBits = CHAN_BITS; 240afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg alphaBits = 0; 241afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg bshift = 0; 242afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg gshift = 8; 243afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg rshift = 16; 244afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ashift = 24; 245afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg rind = 2; 24674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul gind = 1; 24774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul bind = 0; 248afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg rgbmode = GL_TRUE; 249afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 250206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul else if (format==OSMESA_RGB_565) { 251206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul indexBits = 0; 252206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul redBits = 5; 253206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul greenBits = 6; 254206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul blueBits = 5; 255206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul alphaBits = 0; 256206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul rshift = 11; 257206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul gshift = 5; 258206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul bshift = 0; 259206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul ashift = 0; 260206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul rind = 0; /* not used */ 261206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul gind = 0; 262206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul bind = 0; 263206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul rgbmode = GL_TRUE; 264206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul } 265afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg else { 266afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return NULL; 267afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 268afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 269afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 270bd5cdaf4442872d3cd2ff94eeafadd481d27fcfbBrian Paul osmesa = (OSMesaContext) CALLOC_STRUCT(osmesa_context); 271afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (osmesa) { 2722bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul osmesa->gl_visual = _mesa_create_visual( rgbmode, 2732bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul GL_FALSE, /* double buffer */ 2742bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul GL_FALSE, /* stereo */ 2752bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul redBits, 2762bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul greenBits, 2772bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul blueBits, 2782bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul alphaBits, 2792bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul indexBits, 2802bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul depthBits, 2812bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul stencilBits, 2822bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul accumBits, 2832bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul accumBits, 2842bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul accumBits, 2852bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul alphaBits ? accumBits : 0, 2862bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul 1 /* num samples */ 2872bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul ); 288afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (!osmesa->gl_visual) { 289941dcc797e1a6317808c1ec43476817286d576baBrian Paul FREE(osmesa); 290afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return NULL; 291afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 292afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 293df81387dfae199a71bc55138ea5856dc05eacf24Brian Paul if (!_mesa_initialize_context(&osmesa->gl_ctx, 294df81387dfae199a71bc55138ea5856dc05eacf24Brian Paul osmesa->gl_visual, 295df81387dfae199a71bc55138ea5856dc05eacf24Brian Paul sharelist ? &sharelist->gl_ctx 296df81387dfae199a71bc55138ea5856dc05eacf24Brian Paul : (GLcontext *) NULL, 297df81387dfae199a71bc55138ea5856dc05eacf24Brian Paul (void *) osmesa, GL_TRUE )) { 298df81387dfae199a71bc55138ea5856dc05eacf24Brian Paul _mesa_destroy_visual( osmesa->gl_visual ); 299bd5cdaf4442872d3cd2ff94eeafadd481d27fcfbBrian Paul FREE(osmesa); 300afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return NULL; 301afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 3025a9026c65d260dc185e072163999f5d810015108Brian Paul 3035a9026c65d260dc185e072163999f5d810015108Brian Paul _mesa_enable_sw_extensions(&(osmesa->gl_ctx)); 3042a88946f9ad82350c2f7edc2185bf9394d2d4764Brian Paul _mesa_enable_1_3_extensions(&(osmesa->gl_ctx)); 305304357dcd496f7ebf499fd9c77b4eba83a75abd5Brian Paul 306b1394fa92aaaf859ce9efc8b5fc194397921320cBrian Paul osmesa->gl_buffer = _mesa_create_framebuffer( osmesa->gl_visual, 3074742735a5c22f2400a2777965e08e757ec384979Karl Schultz (GLboolean) ( osmesa->gl_visual->depthBits > 0 ), 3084742735a5c22f2400a2777965e08e757ec384979Karl Schultz (GLboolean) ( osmesa->gl_visual->stencilBits > 0 ), 3094742735a5c22f2400a2777965e08e757ec384979Karl Schultz (GLboolean) ( osmesa->gl_visual->accumRedBits > 0 ), 3104742735a5c22f2400a2777965e08e757ec384979Karl Schultz GL_FALSE /* s/w alpha */ ); 3114c44d63f01a01f134d7e4456d4209edee97f9ef5Brian Paul 312afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (!osmesa->gl_buffer) { 313b1394fa92aaaf859ce9efc8b5fc194397921320cBrian Paul _mesa_destroy_visual( osmesa->gl_visual ); 314b1394fa92aaaf859ce9efc8b5fc194397921320cBrian Paul _mesa_free_context_data( &osmesa->gl_ctx ); 315bd5cdaf4442872d3cd2ff94eeafadd481d27fcfbBrian Paul FREE(osmesa); 316afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return NULL; 317afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 318afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg osmesa->format = format; 319afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg osmesa->buffer = NULL; 320afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg osmesa->width = 0; 321afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg osmesa->height = 0; 322afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg osmesa->userRowLength = 0; 323afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg osmesa->rowlength = 0; 324afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg osmesa->yup = GL_TRUE; 325afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg osmesa->rshift = rshift; 326afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg osmesa->gshift = gshift; 327afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg osmesa->bshift = bshift; 328afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg osmesa->ashift = ashift; 32974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul osmesa->rInd = rind; 33074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul osmesa->gInd = gind; 33174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul osmesa->bInd = bind; 33274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul osmesa->aInd = aind; 3331e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell 3341e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell 3351e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell /* Initialize the software rasterizer and helper modules. 3361e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell */ 3371e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell { 3381e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell GLcontext *ctx = &osmesa->gl_ctx; 3391e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell 3401e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell _swrast_CreateContext( ctx ); 34158e991705392a2e17a1c8b034f4083a0adaf1943Keith Whitwell _ac_CreateContext( ctx ); 34223caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell _tnl_CreateContext( ctx ); 343cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell _swsetup_CreateContext( ctx ); 344dbd1e2b5990a3689bf718296c57c14fc3ba38db5Jouk Jansen 3451182ffeec39bf419928ba862c225e80a439fee7aKeith Whitwell _swsetup_Wakeup( ctx ); 3461e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell osmesa_register_swrast_functions( ctx ); 3471e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell } 348afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 349afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return osmesa; 350afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 351afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 352afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 353afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 3542bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul 355afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/* 356afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Destroy an Off-Screen Mesa rendering context. 357afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * 358afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Input: ctx - the context to destroy 359afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */ 36005ba9becc3211795af539d79b70c8a6af2688108Karl SchultzGLAPI void GLAPIENTRY OSMesaDestroyContext( OSMesaContext ctx ) 361afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 362afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (ctx) { 363709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell _swsetup_DestroyContext( &ctx->gl_ctx ); 364709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell _tnl_DestroyContext( &ctx->gl_ctx ); 365709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell _ac_DestroyContext( &ctx->gl_ctx ); 366709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell _swrast_DestroyContext( &ctx->gl_ctx ); 367709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell 368b1394fa92aaaf859ce9efc8b5fc194397921320cBrian Paul _mesa_destroy_visual( ctx->gl_visual ); 369b1394fa92aaaf859ce9efc8b5fc194397921320cBrian Paul _mesa_destroy_framebuffer( ctx->gl_buffer ); 370b1394fa92aaaf859ce9efc8b5fc194397921320cBrian Paul _mesa_free_context_data( &ctx->gl_ctx ); 371bd5cdaf4442872d3cd2ff94eeafadd481d27fcfbBrian Paul FREE( ctx ); 372afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 373afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 374afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 375afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 376afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 377afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/* 378afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Recompute the values of the context's rowaddr array. 379afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */ 380afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgstatic void compute_row_addresses( OSMesaContext ctx ) 381afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 38274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul GLint bytesPerPixel, bytesPerRow, i; 38374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul GLubyte *origin = (GLubyte *) ctx->buffer; 38474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul 38574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul if (ctx->format == OSMESA_COLOR_INDEX) { 38674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul /* CI mode */ 38774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul bytesPerPixel = 1 * sizeof(GLchan); 38874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul } 38974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul else if ((ctx->format == OSMESA_RGB) || (ctx->format == OSMESA_BGR)) { 39074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul /* RGB mode */ 39174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul bytesPerPixel = 3 * sizeof(GLchan); 39274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul } 393206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul else if (ctx->format == OSMESA_RGB_565) { 394206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul /* 5/6/5 RGB pixel in 16 bits */ 395206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul bytesPerPixel = 2; 396206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul } 39774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul else { 39874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul /* RGBA mode */ 39974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul bytesPerPixel = 4 * sizeof(GLchan); 40074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul } 40174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul 40274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul bytesPerRow = ctx->rowlength * bytesPerPixel; 403afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 404afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (ctx->yup) { 405afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg /* Y=0 is bottom line of window */ 40674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul for (i = 0; i < MAX_HEIGHT; i++) { 40774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul ctx->rowaddr[i] = (GLchan *) ((GLubyte *) origin + i * bytesPerRow); 408afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 409afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 410afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg else { 411afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg /* Y=0 is top line of window */ 41274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul for (i = 0; i < MAX_HEIGHT; i++) { 41374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul GLint j = ctx->height - i - 1; 41474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul ctx->rowaddr[i] = (GLchan *) ((GLubyte *) origin + j * bytesPerRow); 415afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 416afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 417afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 418afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 419afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 420afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/* 421afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Bind an OSMesaContext to an image buffer. The image buffer is just a 422afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * block of memory which the client provides. Its size must be at least 423afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * as large as width*height*sizeof(type). Its address should be a multiple 424afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * of 4 if using RGBA mode. 425afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * 426afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Image data is stored in the order of glDrawPixels: row-major order 427afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * with the lower-left image pixel stored in the first array position 428afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * (ie. bottom-to-top). 429afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * 430afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * If the context's viewport hasn't been initialized yet, it will now be 431afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * initialized to (0,0,width,height). 432afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * 433afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Input: ctx - the rendering context 434afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * buffer - the image buffer memory 43509a0cb464d2bc661859c6435f2145e8a5ece005aBrian Paul * type - data type for pixel components 43609a0cb464d2bc661859c6435f2145e8a5ece005aBrian Paul * Normally, only GL_UNSIGNED_BYTE and GL_UNSIGNED_SHORT_5_6_5 43709a0cb464d2bc661859c6435f2145e8a5ece005aBrian Paul * are supported. But if Mesa's been compiled with CHAN_BITS==16 43809a0cb464d2bc661859c6435f2145e8a5ece005aBrian Paul * then type must be GL_UNSIGNED_SHORT. And if Mesa's been build 43909a0cb464d2bc661859c6435f2145e8a5ece005aBrian Paul * with CHAN_BITS==32 then type must be GL_FLOAT. 440afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * width, height - size of image buffer in pixels, at least 1 441afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Return: GL_TRUE if success, GL_FALSE if error because of invalid ctx, 44209a0cb464d2bc661859c6435f2145e8a5ece005aBrian Paul * invalid buffer address, invalid type, width<1, height<1, 443afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * width>internal limit or height>internal limit. 444afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */ 44505ba9becc3211795af539d79b70c8a6af2688108Karl SchultzGLAPI GLboolean GLAPIENTRY 446d3c070ca6a36daa765b1ad7f44e03e6671ad0490Brian PaulOSMesaMakeCurrent( OSMesaContext ctx, void *buffer, GLenum type, 447d3c070ca6a36daa765b1ad7f44e03e6671ad0490Brian Paul GLsizei width, GLsizei height ) 448afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 449206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul if (!ctx || !buffer || 45074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul width < 1 || height < 1 || 45174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul width > MAX_WIDTH || height > MAX_HEIGHT) { 452afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return GL_FALSE; 453afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 454afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 4555233ca8d3061e9e126c73073dccf56c65869bb61Brian Paul if (ctx->format == OSMESA_RGB_565) { 4565233ca8d3061e9e126c73073dccf56c65869bb61Brian Paul if (type != GL_UNSIGNED_SHORT_5_6_5) 4575233ca8d3061e9e126c73073dccf56c65869bb61Brian Paul return GL_FALSE; 458206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul } 459206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul else if (type != CHAN_TYPE) { 460206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul return GL_FALSE; 461206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul } 462206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul 463cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell osmesa_update_state( &ctx->gl_ctx, 0 ); 464b1394fa92aaaf859ce9efc8b5fc194397921320cBrian Paul _mesa_make_current( &ctx->gl_ctx, ctx->gl_buffer ); 465afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 466afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ctx->buffer = buffer; 467afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ctx->width = width; 468afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ctx->height = height; 469afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (ctx->userRowLength) 470afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ctx->rowlength = ctx->userRowLength; 471afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg else 472afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ctx->rowlength = width; 473afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 474afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg compute_row_addresses( ctx ); 475afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 476afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg /* init viewport */ 47702ee456248c75cfee324164ec6fd81a3b77ec2bfBrian Paul if (ctx->gl_ctx.Viewport.Width == 0) { 478afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg /* initialize viewport and scissor box to buffer size */ 479cb5ecb883eb3be842ef44c61df8d4b527877c858Brian Paul _mesa_Viewport( 0, 0, width, height ); 480304357dcd496f7ebf499fd9c77b4eba83a75abd5Brian Paul ctx->gl_ctx.Scissor.Width = width; 481304357dcd496f7ebf499fd9c77b4eba83a75abd5Brian Paul ctx->gl_ctx.Scissor.Height = height; 482afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 48302ee456248c75cfee324164ec6fd81a3b77ec2bfBrian Paul else { 48402ee456248c75cfee324164ec6fd81a3b77ec2bfBrian Paul /* this will make ensure we recognize the new buffer size */ 48502ee456248c75cfee324164ec6fd81a3b77ec2bfBrian Paul _mesa_ResizeBuffersMESA(); 48602ee456248c75cfee324164ec6fd81a3b77ec2bfBrian Paul } 487afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 488afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return GL_TRUE; 489afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 490afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 491afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 492afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 49305ba9becc3211795af539d79b70c8a6af2688108Karl SchultzGLAPI OSMesaContext 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 50405ba9becc3211795af539d79b70c8a6af2688108Karl SchultzGLAPI void 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 53005ba9becc3211795af539d79b70c8a6af2688108Karl SchultzGLAPI void 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; 553a0037ad8b38e25bdb16e64e4da6e5c75cc66a9cdBrian Paul case OSMESA_MAX_WIDTH: 554a0037ad8b38e25bdb16e64e4da6e5c75cc66a9cdBrian Paul *value = MAX_WIDTH; 555a0037ad8b38e25bdb16e64e4da6e5c75cc66a9cdBrian Paul return; 556a0037ad8b38e25bdb16e64e4da6e5c75cc66a9cdBrian Paul case OSMESA_MAX_HEIGHT: 557a0037ad8b38e25bdb16e64e4da6e5c75cc66a9cdBrian Paul *value = MAX_HEIGHT; 558a0037ad8b38e25bdb16e64e4da6e5c75cc66a9cdBrian Paul return; 559afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg default: 56008836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul _mesa_error(&ctx->gl_ctx, GL_INVALID_ENUM, "OSMesaGetIntergerv(pname)"); 561afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return; 562afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 563afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 564afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 565afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/* 566afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Return the depth buffer associated with an OSMesa context. 567afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Input: c - the OSMesa context 568afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Output: width, height - size of buffer in pixels 569afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * bytesPerValue - bytes per depth value (2 or 4) 570afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * buffer - pointer to depth buffer values 571afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Return: GL_TRUE or GL_FALSE to indicate success or failure. 572afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */ 57305ba9becc3211795af539d79b70c8a6af2688108Karl SchultzGLAPI GLboolean GLAPIENTRY 5747e67fb41fb54e050f6983b4de09ed3a317d6148fBrian PaulOSMesaGetDepthBuffer( OSMesaContext c, GLint *width, GLint *height, 5757e67fb41fb54e050f6983b4de09ed3a317d6148fBrian Paul GLint *bytesPerValue, void **buffer ) 576afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 577650cb74bcb913d2589355d56a14da1ab0307d1fcBrian Paul if ((!c->gl_buffer) || (!c->gl_buffer->DepthBuffer)) { 578afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg *width = 0; 579afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg *height = 0; 580afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg *bytesPerValue = 0; 581afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg *buffer = 0; 582afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return GL_FALSE; 583afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 584afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg else { 585afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg *width = c->gl_buffer->Width; 586afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg *height = c->gl_buffer->Height; 5879db3f95acea5622573803890afd506ebcdaab3b3Brian Paul if (c->gl_visual->depthBits <= 16) 5889db3f95acea5622573803890afd506ebcdaab3b3Brian Paul *bytesPerValue = sizeof(GLushort); 5899db3f95acea5622573803890afd506ebcdaab3b3Brian Paul else 5909db3f95acea5622573803890afd506ebcdaab3b3Brian Paul *bytesPerValue = sizeof(GLuint); 591650cb74bcb913d2589355d56a14da1ab0307d1fcBrian Paul *buffer = c->gl_buffer->DepthBuffer; 592afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return GL_TRUE; 593afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 594afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 595afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 59623ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank/* 59723ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank * Return the color buffer associated with an OSMesa context. 59823ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank * Input: c - the OSMesa context 59923ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank * Output: width, height - size of buffer in pixels 60023ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank * format - the pixel format (OSMESA_FORMAT) 60123ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank * buffer - pointer to color buffer values 60223ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank * Return: GL_TRUE or GL_FALSE to indicate success or failure. 60323ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank */ 60405ba9becc3211795af539d79b70c8a6af2688108Karl SchultzGLAPI GLboolean GLAPIENTRY 6057e67fb41fb54e050f6983b4de09ed3a317d6148fBrian PaulOSMesaGetColorBuffer( OSMesaContext c, GLint *width, 6067e67fb41fb54e050f6983b4de09ed3a317d6148fBrian Paul GLint *height, GLint *format, void **buffer ) 60723ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank{ 60823ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank if (!c->buffer) { 60923ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank *width = 0; 61023ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank *height = 0; 61123ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank *format = 0; 61223ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank *buffer = 0; 61323ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank return GL_FALSE; 6147e67fb41fb54e050f6983b4de09ed3a317d6148fBrian Paul } 6157e67fb41fb54e050f6983b4de09ed3a317d6148fBrian Paul else { 61623ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank *width = c->width; 61723ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank *height = c->height; 61823ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank *format = c->format; 61923ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank *buffer = c->buffer; 62023ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank return GL_TRUE; 62123ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank } 62223ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank} 623afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 62401dc182ee86922845ba0b17a2cda9af19150c93aBrian Paul 62501dc182ee86922845ba0b17a2cda9af19150c93aBrian Paul 62601dc182ee86922845ba0b17a2cda9af19150c93aBrian Paulstruct name_address { 62701dc182ee86922845ba0b17a2cda9af19150c93aBrian Paul const char *Name; 62801dc182ee86922845ba0b17a2cda9af19150c93aBrian Paul GLvoid *Address; 62901dc182ee86922845ba0b17a2cda9af19150c93aBrian Paul}; 63001dc182ee86922845ba0b17a2cda9af19150c93aBrian Paul 63101dc182ee86922845ba0b17a2cda9af19150c93aBrian Paulstatic struct name_address functions[] = { 63201dc182ee86922845ba0b17a2cda9af19150c93aBrian Paul { "OSMesaCreateContext", (void *) OSMesaCreateContext }, 63301dc182ee86922845ba0b17a2cda9af19150c93aBrian Paul { "OSMesaCreateContextExt", (void *) OSMesaCreateContextExt }, 63401dc182ee86922845ba0b17a2cda9af19150c93aBrian Paul { "OSMesaDestroyContext", (void *) OSMesaDestroyContext }, 63501dc182ee86922845ba0b17a2cda9af19150c93aBrian Paul { "OSMesaMakeCurrent", (void *) OSMesaMakeCurrent }, 63601dc182ee86922845ba0b17a2cda9af19150c93aBrian Paul { "OSMesaGetCurrentContext", (void *) OSMesaGetCurrentContext }, 63701dc182ee86922845ba0b17a2cda9af19150c93aBrian Paul { "OSMesaPixelsStore", (void *) OSMesaPixelStore }, 63801dc182ee86922845ba0b17a2cda9af19150c93aBrian Paul { "OSMesaGetIntegerv", (void *) OSMesaGetIntegerv }, 63901dc182ee86922845ba0b17a2cda9af19150c93aBrian Paul { "OSMesaGetDepthBuffer", (void *) OSMesaGetDepthBuffer }, 64001dc182ee86922845ba0b17a2cda9af19150c93aBrian Paul { "OSMesaGetColorBuffer", (void *) OSMesaGetColorBuffer }, 64101dc182ee86922845ba0b17a2cda9af19150c93aBrian Paul { "OSMesaGetProcAddress", (void *) OSMesaGetProcAddress }, 64201dc182ee86922845ba0b17a2cda9af19150c93aBrian Paul { NULL, NULL } 64301dc182ee86922845ba0b17a2cda9af19150c93aBrian Paul}; 64401dc182ee86922845ba0b17a2cda9af19150c93aBrian Paul 64501dc182ee86922845ba0b17a2cda9af19150c93aBrian PaulGLAPI void * GLAPIENTRY 64601dc182ee86922845ba0b17a2cda9af19150c93aBrian PaulOSMesaGetProcAddress( const char *funcName ) 64701dc182ee86922845ba0b17a2cda9af19150c93aBrian Paul{ 64801dc182ee86922845ba0b17a2cda9af19150c93aBrian Paul int i; 64901dc182ee86922845ba0b17a2cda9af19150c93aBrian Paul for (i = 0; functions[i].Name; i++) { 65001dc182ee86922845ba0b17a2cda9af19150c93aBrian Paul if (strcmp(functions[i].Name, funcName) == 0) 65101dc182ee86922845ba0b17a2cda9af19150c93aBrian Paul return (void *) functions[i].Address; 65201dc182ee86922845ba0b17a2cda9af19150c93aBrian Paul } 65301dc182ee86922845ba0b17a2cda9af19150c93aBrian Paul return (void *) _glapi_get_proc_address(funcName); 65401dc182ee86922845ba0b17a2cda9af19150c93aBrian Paul} 65501dc182ee86922845ba0b17a2cda9af19150c93aBrian Paul 65601dc182ee86922845ba0b17a2cda9af19150c93aBrian Paul 657afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/**********************************************************************/ 658afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/*** Device Driver Functions ***/ 659afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/**********************************************************************/ 660afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 661afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 662afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/* 663afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Useful macros: 664afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */ 665afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 66674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul#define PACK_RGBA(DST, R, G, B, A) \ 66774b493a5e61237de081a438e774e5d8139d4c6b7Brian Pauldo { \ 66874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul (DST)[osmesa->rInd] = R; \ 66974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul (DST)[osmesa->gInd] = G; \ 67074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul (DST)[osmesa->bInd] = B; \ 67174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul (DST)[osmesa->aInd] = A; \ 67274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul} while (0) 67374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul 67474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul#define PACK_RGB(DST, R, G, B) \ 67574b493a5e61237de081a438e774e5d8139d4c6b7Brian Pauldo { \ 67674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul (DST)[0] = R; \ 67774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul (DST)[1] = G; \ 67874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul (DST)[2] = B; \ 67974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul} while (0) 680afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 68174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul#define PACK_BGR(DST, R, G, B) \ 68274b493a5e61237de081a438e774e5d8139d4c6b7Brian Pauldo { \ 68374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul (DST)[0] = B; \ 68474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul (DST)[1] = G; \ 68574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul (DST)[2] = R; \ 68674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul} while (0) 687afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 688206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul#define PACK_RGB_565(DST, R, G, B) \ 689206eda8b69ab3c63e9597015189f49d1bda9356fBrian Pauldo { \ 690f431a3fb4dc1bf860203d79e54657e3a62bc50dfBrian Paul (DST) = (((int) (R) << 8) & 0xf800) | (((int) (G) << 3) & 0x7e0) | ((int) (B) >> 3);\ 691206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul} while (0) 692206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul 693afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 69401915e90e6912f06d43d443a09157f7bbc96ddc5Brian Paul#define UNPACK_RED(P) ( (P)[osmesa->rInd] ) 69501915e90e6912f06d43d443a09157f7bbc96ddc5Brian Paul#define UNPACK_GREEN(P) ( (P)[osmesa->gInd] ) 69601915e90e6912f06d43d443a09157f7bbc96ddc5Brian Paul#define UNPACK_BLUE(P) ( (P)[osmesa->bInd] ) 69701915e90e6912f06d43d443a09157f7bbc96ddc5Brian Paul#define UNPACK_ALPHA(P) ( (P)[osmesa->aInd] ) 69874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul 69974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul 70074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul#define PIXELADDR1(X,Y) (osmesa->rowaddr[Y] + (X)) 701206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul#define PIXELADDR2(X,Y) (osmesa->rowaddr[Y] + 2 * (X)) 70274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul#define PIXELADDR3(X,Y) (osmesa->rowaddr[Y] + 3 * (X)) 70374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul#define PIXELADDR4(X,Y) (osmesa->rowaddr[Y] + 4 * (X)) 704afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 705afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 706afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 707cea0e8e6700e871bb9bcb334cb75fbfbfcdfd702Brian Paulstatic GLboolean set_draw_buffer( GLcontext *ctx, GLenum mode ) 708afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 709afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg (void) ctx; 710afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (mode==GL_FRONT_LEFT) { 711afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return GL_TRUE; 712afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 713afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg else { 714afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return GL_FALSE; 715afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 716afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 717afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 718afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 719cea0e8e6700e871bb9bcb334cb75fbfbfcdfd702Brian Paulstatic void set_read_buffer( GLcontext *ctx, GLframebuffer *buffer, GLenum mode ) 720cea0e8e6700e871bb9bcb334cb75fbfbfcdfd702Brian Paul{ 721cea0e8e6700e871bb9bcb334cb75fbfbfcdfd702Brian Paul /* separate read buffer not supported */ 722cea0e8e6700e871bb9bcb334cb75fbfbfcdfd702Brian Paul ASSERT(buffer == ctx->DrawBuffer); 723cea0e8e6700e871bb9bcb334cb75fbfbfcdfd702Brian Paul ASSERT(mode == GL_FRONT_LEFT); 724cea0e8e6700e871bb9bcb334cb75fbfbfcdfd702Brian Paul} 725cea0e8e6700e871bb9bcb334cb75fbfbfcdfd702Brian Paul 726cea0e8e6700e871bb9bcb334cb75fbfbfcdfd702Brian Paul 727d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwellstatic void clear( GLcontext *ctx, GLbitfield mask, GLboolean all, 728d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell GLint x, GLint y, GLint width, GLint height ) 729afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 730c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul OSMesaContext osmesa = OSMESA_CONTEXT(ctx); 731dd020f13a6d520b46aefd4453dae6b6edcc427f6Brian Paul const GLuint *colorMask = (GLuint *) &ctx->Color.ColorMask; 732dd020f13a6d520b46aefd4453dae6b6edcc427f6Brian Paul 733dd020f13a6d520b46aefd4453dae6b6edcc427f6Brian Paul /* sanity check - we only have a front-left buffer */ 734dd020f13a6d520b46aefd4453dae6b6edcc427f6Brian Paul ASSERT((mask & (DD_FRONT_RIGHT_BIT | DD_BACK_LEFT_BIT | DD_BACK_RIGHT_BIT)) == 0); 735d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell if (*colorMask == 0xffffffff && ctx->Color.IndexMask == 0xffffffff) { 736d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell if (mask & DD_FRONT_LEFT_BIT) { 737d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell if (osmesa->format == OSMESA_COLOR_INDEX) { 738d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell if (all) { 739d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell /* Clear whole CI buffer */ 74074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul#if CHAN_TYPE == GL_UNSIGNED_BYTE 741d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell MEMSET(osmesa->buffer, ctx->Color.ClearIndex, 742d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell osmesa->rowlength * osmesa->height); 74374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul#else 744d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell const GLint n = osmesa->rowlength * osmesa->height; 745d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell GLchan *buffer = (GLchan *) osmesa->buffer; 746d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell GLint i; 747d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell for (i = 0; i < n; i ++) { 748d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell buffer[i] = ctx->Color.ClearIndex; 749d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell } 75074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul#endif 751d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell } 752d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell else { 753d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell /* Clear part of CI buffer */ 754d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell const GLchan clearIndex = (GLchan) ctx->Color.ClearIndex; 755d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell GLint i, j; 756d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell for (i = 0; i < height; i++) { 757d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell GLchan *ptr1 = PIXELADDR1(x, (y + i)); 758d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell for (j = 0; j < width; j++) { 759d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell *ptr1++ = clearIndex; 760d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell } 761d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell } 762d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell } 763d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell } 764d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell else if (osmesa->format == OSMESA_RGB) { 765d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell const GLchan r = ctx->Color.ClearColor[0]; 766d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell const GLchan g = ctx->Color.ClearColor[1]; 767d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell const GLchan b = ctx->Color.ClearColor[2]; 768d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell if (all) { 769d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell /* Clear whole RGB buffer */ 770d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell GLuint n = osmesa->rowlength * osmesa->height; 771d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell GLchan *ptr3 = (GLchan *) osmesa->buffer; 772d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell GLuint i; 773d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell for (i = 0; i < n; i++) { 774d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell PACK_RGB(ptr3, r, g, b); 775d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell ptr3 += 3; 776d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell } 777d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell } 778d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell else { 779d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell /* Clear part of RGB buffer */ 780d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell GLint i, j; 781d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell for (i = 0; i < height; i++) { 782d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell GLchan *ptr3 = PIXELADDR3(x, (y + i)); 783d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell for (j = 0; j < width; j++) { 784d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell PACK_RGB(ptr3, r, g, b); 785d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell ptr3 += 3; 786d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell } 787d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell } 788d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell } 789d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell } 790d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell else if (osmesa->format == OSMESA_BGR) { 791d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell const GLchan r = ctx->Color.ClearColor[0]; 792d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell const GLchan g = ctx->Color.ClearColor[1]; 793d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell const GLchan b = ctx->Color.ClearColor[2]; 794d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell if (all) { 795d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell /* Clear whole RGB buffer */ 796d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell const GLint n = osmesa->rowlength * osmesa->height; 797d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell GLchan *ptr3 = (GLchan *) osmesa->buffer; 798d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell GLint i; 799d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell for (i = 0; i < n; i++) { 800d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell PACK_BGR(ptr3, r, g, b); 801d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell ptr3 += 3; 802d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell } 803d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell } 804d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell else { 805d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell /* Clear part of RGB buffer */ 806d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell GLint i, j; 807d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell for (i = 0; i < height; i++) { 808d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell GLchan *ptr3 = PIXELADDR3(x, (y + i)); 809d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell for (j = 0; j < width; j++) { 810d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell PACK_BGR(ptr3, r, g, b); 811d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell ptr3 += 3; 812d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell } 813d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell } 814d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell } 815d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell } 816206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul else if (osmesa->format == OSMESA_RGB_565) { 817206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul const GLchan r = ctx->Color.ClearColor[0]; 818206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul const GLchan g = ctx->Color.ClearColor[1]; 819206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul const GLchan b = ctx->Color.ClearColor[2]; 820206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul GLushort clearPixel; 821206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul PACK_RGB_565(clearPixel, r, g, b); 822206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul if (all) { 823206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul /* Clear whole RGB buffer */ 8244742735a5c22f2400a2777965e08e757ec384979Karl Schultz const GLuint n = osmesa->rowlength * osmesa->height; 825206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul GLushort *ptr2 = (GLushort *) osmesa->buffer; 826206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul GLuint i; 827206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul for (i = 0; i < n; i++) { 828206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul *ptr2 = clearPixel; 829206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul ptr2++; 830206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul } 831206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul } 832206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul else { 833206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul /* clear scissored region */ 834206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul GLint i, j; 835206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul for (i = 0; i < height; i++) { 836206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul GLushort *ptr2 = (GLushort *) PIXELADDR2(x, (y + i)); 837206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul for (j = 0; j < width; j++) { 838206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul *ptr2 = clearPixel; 839206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul ptr2++; 840206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul } 841206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul } 842206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul } 843206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul } 844d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell else { 84574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul#if CHAN_TYPE == GL_UNSIGNED_BYTE 846d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell /* 4-byte pixel value */ 847d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell GLuint clearPixel; 848d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell GLchan *clr = (GLchan *) &clearPixel; 849d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell clr[osmesa->rInd] = ctx->Color.ClearColor[0]; 850d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell clr[osmesa->gInd] = ctx->Color.ClearColor[1]; 851d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell clr[osmesa->bInd] = ctx->Color.ClearColor[2]; 852d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell clr[osmesa->aInd] = ctx->Color.ClearColor[3]; 853d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell if (all) { 854d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell /* Clear whole RGBA buffer */ 855d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell const GLuint n = osmesa->rowlength * osmesa->height; 856d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell GLuint *ptr4 = (GLuint *) osmesa->buffer; 857d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell GLuint i; 858d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell if (clearPixel) { 859d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell for (i = 0; i < n; i++) { 860d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell *ptr4++ = clearPixel; 861d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell } 862d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell } 863d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell else { 864d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell BZERO(ptr4, n * sizeof(GLuint)); 865d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell } 866d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell } 867d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell else { 868d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell /* Clear part of RGBA buffer */ 869d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell GLint i, j; 870d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell for (i = 0; i < height; i++) { 871d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell GLuint *ptr4 = (GLuint *) PIXELADDR4(x, (y + i)); 872d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell for (j = 0; j < width; j++) { 873d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell *ptr4++ = clearPixel; 874d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell } 875d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell } 876d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell } 87774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul#else 878d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell const GLchan r = ctx->Color.ClearColor[0]; 879d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell const GLchan g = ctx->Color.ClearColor[1]; 880d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell const GLchan b = ctx->Color.ClearColor[2]; 881d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell const GLchan a = ctx->Color.ClearColor[3]; 882d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell if (all) { 883d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell /* Clear whole RGBA buffer */ 884d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell const GLuint n = osmesa->rowlength * osmesa->height; 885d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell GLchan *p = (GLchan *) osmesa->buffer; 886d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell GLuint i; 887d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell for (i = 0; i < n; i++) { 888d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell PACK_RGBA(p, r, g, b, a); 889d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell p += 4; 890d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell } 891d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell } 892d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell else { 893d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell /* Clear part of RGBA buffer */ 894d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell GLint i, j; 895d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell for (i = 0; i < height; i++) { 896d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell GLchan *p = PIXELADDR4(x, (y + i)); 897d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell for (j = 0; j < width; j++) { 898d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell PACK_RGBA(p, r, g, b, a); 899d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell p += 4; 900d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell } 901d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell } 902d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell } 90374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul 90474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul#endif 905d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell } 906d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell mask &= ~DD_FRONT_LEFT_BIT; 907afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 908afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 909d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell 910d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell if (mask) 911d98fdad3bfc7018740cf781e00fa53ad9a4479cdKeith Whitwell _swrast_Clear( ctx, mask, all, x, y, width, height ); 912afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 913afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 914afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 915afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 91618a285a5e244b7405b85feb7315a30d99920ec5dBrian Paulstatic void buffer_size( GLframebuffer *buffer, GLuint *width, GLuint *height ) 917afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 91823d319fc7dda3ae3639c05cd2c7a8bcdac9eac36Brian Paul /* don't use GET_CURRENT_CONTEXT(ctx) here - it's a problem on Windows */ 91923d319fc7dda3ae3639c05cd2c7a8bcdac9eac36Brian Paul GLcontext *ctx = (GLcontext *) _glapi_get_context(); 92018a285a5e244b7405b85feb7315a30d99920ec5dBrian Paul (void) buffer; 92118a285a5e244b7405b85feb7315a30d99920ec5dBrian Paul if (ctx) { 92218a285a5e244b7405b85feb7315a30d99920ec5dBrian Paul OSMesaContext osmesa = OSMESA_CONTEXT(ctx); 92318a285a5e244b7405b85feb7315a30d99920ec5dBrian Paul *width = osmesa->width; 92418a285a5e244b7405b85feb7315a30d99920ec5dBrian Paul *height = osmesa->height; 92518a285a5e244b7405b85feb7315a30d99920ec5dBrian Paul } 926afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 927afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 928afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 929afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/**********************************************************************/ 930afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/***** Read/write spans/arrays of RGBA pixels *****/ 931afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/**********************************************************************/ 932afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 933afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/* Write RGBA pixels to an RGBA (or permuted) buffer. */ 93474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void 93574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulwrite_rgba_span( const GLcontext *ctx, GLuint n, GLint x, GLint y, 93674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul CONST GLchan rgba[][4], const GLubyte mask[] ) 937afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 93874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const OSMesaContext osmesa = OSMESA_CONTEXT(ctx); 93974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul GLchan *p = PIXELADDR4(x, y); 940afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLuint i; 941afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (mask) { 94274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul for (i = 0; i < n; i++, p += 4) { 943afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (mask[i]) { 94474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul PACK_RGBA(p, rgba[i][RCOMP], rgba[i][GCOMP], 94574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul rgba[i][BCOMP], rgba[i][ACOMP]); 946afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 947afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 948afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 949afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg else { 95074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul for (i = 0; i < n; i++, p += 4) { 95174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul PACK_RGBA(p, rgba[i][RCOMP], rgba[i][GCOMP], 95274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul rgba[i][BCOMP], rgba[i][ACOMP]); 953afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 954afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 955afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 956afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 957afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 958afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/* Write RGBA pixels to an RGBA buffer. This is the fastest span-writer. */ 95974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void 96074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulwrite_rgba_span_rgba( const GLcontext *ctx, GLuint n, GLint x, GLint y, 96174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul CONST GLchan rgba[][4], const GLubyte mask[] ) 962afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 963c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul OSMesaContext osmesa = OSMESA_CONTEXT(ctx); 96474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul GLuint *ptr4 = (GLuint *) PIXELADDR4(x, y); 965afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg const GLuint *rgba4 = (const GLuint *) rgba; 966afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLuint i; 96774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul ASSERT(CHAN_TYPE == GL_UNSIGNED_BYTE); 968afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (mask) { 96974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul for (i = 0; i < n; i++) { 970afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (mask[i]) { 971afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ptr4[i] = rgba4[i]; 972afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 973afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 974afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 975afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg else { 976afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg MEMCPY( ptr4, rgba4, n * 4 ); 977afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 978afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 979afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 980afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 981afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/* Write RGB pixels to an RGBA (or permuted) buffer. */ 98274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void 98374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulwrite_rgb_span( const GLcontext *ctx, GLuint n, GLint x, GLint y, 98474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul CONST GLchan rgb[][3], const GLubyte mask[] ) 985afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 98674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const OSMesaContext osmesa = OSMESA_CONTEXT(ctx); 98774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul GLchan *p = PIXELADDR4(x, y); 988afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLuint i; 989afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (mask) { 99074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul for (i = 0; i < n; i++, p+=4) { 991afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (mask[i]) { 99265c6ca91795a71cf38dbe5f49f2d73fd9d4049cdBrian Paul PACK_RGBA(p, rgb[i][RCOMP], rgb[i][GCOMP], rgb[i][BCOMP], CHAN_MAX); 993afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 994afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 995afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 996afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg else { 99774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul for (i = 0; i < n; i++, p+=4) { 99865c6ca91795a71cf38dbe5f49f2d73fd9d4049cdBrian Paul PACK_RGBA(p, rgb[i][RCOMP], rgb[i][GCOMP], rgb[i][BCOMP], CHAN_MAX); 999afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1000afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1001afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 1002afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1003afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1004afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 100574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void 100674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulwrite_monocolor_span( const GLcontext *ctx, GLuint n, GLint x, GLint y, 100774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const GLchan color[4], const GLubyte mask[] ) 1008afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 1009c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul const OSMesaContext osmesa = OSMESA_CONTEXT(ctx); 101074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul GLchan *p = PIXELADDR4(x, y); 1011afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLuint i; 101274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul for (i = 0; i < n; i++, p += 4) { 1013afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (mask[i]) { 101474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul PACK_RGBA(p, color[RCOMP], color[GCOMP], color[BCOMP], color[ACOMP]); 1015afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1016afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1017afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 1018afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1019afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1020afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 102174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void 102274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulwrite_rgba_pixels( const GLcontext *ctx, GLuint n, 102374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const GLint x[], const GLint y[], 102474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul CONST GLchan rgba[][4], const GLubyte mask[] ) 1025afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 102674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const OSMesaContext osmesa = OSMESA_CONTEXT(ctx); 1027afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLuint i; 102874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul for (i = 0; i < n; i++) { 1029afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (mask[i]) { 103074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul GLchan *p = PIXELADDR4(x[i], y[i]); 103174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul PACK_RGBA(p, rgba[i][RCOMP], rgba[i][GCOMP], 103274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul rgba[i][BCOMP], rgba[i][ACOMP]); 1033afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1034afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1035afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 1036afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1037afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1038afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 103974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void 104074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulwrite_monocolor_pixels( const GLcontext *ctx, GLuint n, 104174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const GLint x[], const GLint y[], 104274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const GLchan color[4], const GLubyte mask[] ) 1043afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 104474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const OSMesaContext osmesa = OSMESA_CONTEXT(ctx); 1045afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLuint i; 104674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul for (i = 0; i < n; i++) { 1047afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (mask[i]) { 104874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul GLchan *p = PIXELADDR4(x[i], y[i]); 104974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul PACK_RGBA(p, color[RCOMP], color[GCOMP], color[BCOMP], color[ACOMP]); 1050afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1051afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1052afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 1053afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1054afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 105574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void 105674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulread_rgba_span( const GLcontext *ctx, GLuint n, GLint x, GLint y, 105774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul GLchan rgba[][4] ) 1058afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 105974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const OSMesaContext osmesa = OSMESA_CONTEXT(ctx); 1060afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLuint i; 106174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul GLchan *p = PIXELADDR4(x, y); 106274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul for (i = 0; i < n; i++, p += 4) { 106374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul rgba[i][RCOMP] = UNPACK_RED(p); 106474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul rgba[i][GCOMP] = UNPACK_GREEN(p); 106574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul rgba[i][BCOMP] = UNPACK_BLUE(p); 106674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul rgba[i][ACOMP] = UNPACK_ALPHA(p); 1067afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1068afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 1069afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1070afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1071afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/* Read RGBA pixels from an RGBA buffer */ 107274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void 107374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulread_rgba_span_rgba( const GLcontext *ctx, GLuint n, GLint x, GLint y, 107474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul GLchan rgba[][4] ) 1075afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 1076c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul OSMesaContext osmesa = OSMESA_CONTEXT(ctx); 107774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul GLuint *ptr4 = (GLuint *) PIXELADDR4(x, y); 10789499e017b7e05411a32b3e4fa94885eaec0d7277Brian Paul MEMCPY( rgba, ptr4, n * 4 * sizeof(GLchan) ); 1079afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 1080afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1081afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 108274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void 108374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulread_rgba_pixels( const GLcontext *ctx, 108474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul GLuint n, const GLint x[], const GLint y[], 108574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul GLchan rgba[][4], const GLubyte mask[] ) 1086afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 108774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const OSMesaContext osmesa = OSMESA_CONTEXT(ctx); 1088afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLuint i; 108974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul for (i = 0; i < n; i++) { 1090afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (mask[i]) { 109174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const GLchan *p = PIXELADDR4(x[i], y[i]); 109274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul rgba[i][RCOMP] = UNPACK_RED(p); 109374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul rgba[i][GCOMP] = UNPACK_GREEN(p); 109474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul rgba[i][BCOMP] = UNPACK_BLUE(p); 109574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul rgba[i][ACOMP] = UNPACK_ALPHA(p); 1096afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1097afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1098afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 1099afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1100afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/**********************************************************************/ 1101afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/***** 3 byte RGB pixel support funcs *****/ 1102afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/**********************************************************************/ 1103afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 110474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul/* Write RGBA pixels to an RGB buffer. */ 110574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void 110674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulwrite_rgba_span_RGB( const GLcontext *ctx, GLuint n, GLint x, GLint y, 110774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul CONST GLchan rgba[][4], const GLubyte mask[] ) 1108afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 110974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const OSMesaContext osmesa = OSMESA_CONTEXT(ctx); 111074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul GLchan *p = PIXELADDR3(x, y); 1111afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLuint i; 1112afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (mask) { 111374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul for (i = 0; i < n; i++, p += 3) { 1114afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (mask[i]) { 111574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul PACK_RGB(p, rgba[i][RCOMP], rgba[i][GCOMP], rgba[i][BCOMP]); 1116afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1117afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1118afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1119afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg else { 112074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul for (i = 0; i < n; i++, p += 3) { 112174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul PACK_RGB(p, rgba[i][RCOMP], rgba[i][GCOMP], rgba[i][BCOMP]); 1122afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1123afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1124afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 1125afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 112674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul/* Write RGBA pixels to an BGR buffer. */ 112774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void 112874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulwrite_rgba_span_BGR( const GLcontext *ctx, GLuint n, GLint x, GLint y, 112974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul CONST GLchan rgba[][4], const GLubyte mask[] ) 1130afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 1131c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul const OSMesaContext osmesa = OSMESA_CONTEXT(ctx); 113274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul GLchan *p = PIXELADDR3(x, y); 1133afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLuint i; 1134afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (mask) { 113574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul for (i = 0; i < n; i++, p += 3) { 1136afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (mask[i]) { 113774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul PACK_BGR(p, rgba[i][RCOMP], rgba[i][GCOMP], rgba[i][BCOMP]); 1138afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1139afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1140afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1141afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg else { 114274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul for (i = 0; i < n; i++, p += 3) { 114374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul PACK_BGR(p, rgba[i][RCOMP], rgba[i][GCOMP], rgba[i][BCOMP]); 1144afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1145afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1146afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 1147afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 114874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul/* Write RGB pixels to an RGB buffer. */ 114974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void 115074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulwrite_rgb_span_RGB( const GLcontext *ctx, GLuint n, GLint x, GLint y, 115174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul CONST GLchan rgb[][3], 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 if (mask) { 115774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul for (i = 0; i < n; i++, p += 3) { 115874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul if (mask[i]) { 115974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul PACK_RGB(p, rgb[i][RCOMP], rgb[i][GCOMP], rgb[i][BCOMP]); 116074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul } 116174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul } 116274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul } 116374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul else { 116474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul for (i = 0; i < n; i++, p += 3) { 116574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul PACK_RGB(p, rgb[i][RCOMP], rgb[i][GCOMP], rgb[i][BCOMP]); 116674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul } 116774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul } 116874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul} 1169afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 117074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul/* Write RGB pixels to an BGR buffer. */ 117174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void 117274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulwrite_rgb_span_BGR( const GLcontext *ctx, GLuint n, GLint x, GLint y, 117374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul CONST GLchan rgb[][3], const GLubyte mask[] ) 1174afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 1175c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul const OSMesaContext osmesa = OSMESA_CONTEXT(ctx); 117674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul GLchan *p = PIXELADDR3(x, y); 1177afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLuint i; 117874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul if (mask) { 117974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul for (i = 0; i < n; i++, p += 3) { 118074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul if (mask[i]) { 118174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul PACK_BGR(p, rgb[i][RCOMP], rgb[i][GCOMP], rgb[i][BCOMP]); 118274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul } 118374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul } 118474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul } 118574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul else { 118674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul for (i = 0; i < n; i++, p += 3) { 118774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul PACK_BGR(p, rgb[i][RCOMP], rgb[i][GCOMP], rgb[i][BCOMP]); 118874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul } 118974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul } 119074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul} 119174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul 119274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul 119374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void 119474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulwrite_monocolor_span_RGB( const GLcontext *ctx, GLuint n, GLint x, GLint y, 119574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const GLchan color[4], const GLubyte mask[] ) 119674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul{ 119774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const OSMesaContext osmesa = OSMESA_CONTEXT(ctx); 119874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul GLchan *p = PIXELADDR3(x, y); 119974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul GLuint i; 120074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul for (i = 0; i < n; i++, p += 3) { 120174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul if (mask[i]) { 120274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul PACK_RGB(p, color[RCOMP], color[GCOMP], color[BCOMP]); 120374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul } 120474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul } 120574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul} 120674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul 120774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void 120874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulwrite_monocolor_span_BGR( const GLcontext *ctx, GLuint n, GLint x, GLint y, 120974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const GLchan color[4], const GLubyte mask[] ) 121074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul{ 121174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const OSMesaContext osmesa = OSMESA_CONTEXT(ctx); 121274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul GLchan *p = PIXELADDR3(x, y); 121374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul GLuint i; 121474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul for (i = 0; i < n; i++, p += 3) { 1215afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (mask[i]) { 121674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul PACK_BGR(p, color[RCOMP], color[GCOMP], color[BCOMP]); 1217afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1218afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1219afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 1220afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 122174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void 122274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulwrite_rgba_pixels_RGB( const GLcontext *ctx, GLuint n, 122374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const GLint x[], const GLint y[], 122474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul CONST GLchan rgba[][4], const GLubyte mask[] ) 1225afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 1226c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul const OSMesaContext osmesa = (const OSMesaContext) ctx; 1227afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLuint i; 122874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul for (i = 0; i < n; i++) { 122974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul if (mask[i]) { 123074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul GLchan *p = PIXELADDR3(x[i], y[i]); 123174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul PACK_RGB(p, rgba[i][RCOMP], rgba[i][GCOMP], rgba[i][BCOMP]); 123274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul } 123374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul } 123474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul} 123574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul 123674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void 123774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulwrite_rgba_pixels_BGR( const GLcontext *ctx, GLuint n, 123874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const GLint x[], const GLint y[], 123974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul CONST GLchan rgba[][4], const GLubyte mask[] ) 124074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul{ 124174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const OSMesaContext osmesa = (const OSMesaContext) ctx; 124274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul GLuint i; 124374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul for (i = 0; i < n; i++) { 1244afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (mask[i]) { 124574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul GLchan *p = PIXELADDR3(x[i], y[i]); 124674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul PACK_BGR(p, rgba[i][RCOMP], rgba[i][GCOMP], rgba[i][BCOMP]); 1247afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1248afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1249afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 1250afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 125174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void 125274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulwrite_monocolor_pixels_RGB( const GLcontext *ctx, 125374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul GLuint n, const GLint x[], const GLint y[], 125474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const GLchan color[4], const GLubyte mask[] ) 1255afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 1256c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul const OSMesaContext osmesa = OSMESA_CONTEXT(ctx); 1257afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLuint i; 125874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul for (i = 0; i < n; i++) { 1259afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (mask[i]) { 126074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul GLchan *p = PIXELADDR3(x[i], y[i]); 126174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul PACK_RGB(p, color[RCOMP], color[GCOMP], color[BCOMP]); 1262afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1263afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1264afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 1265afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 126674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void 126774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulwrite_monocolor_pixels_BGR( const GLcontext *ctx, 126874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul GLuint n, const GLint x[], const GLint y[], 126974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const GLchan color[4], const GLubyte mask[] ) 1270afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 127174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const OSMesaContext osmesa = OSMESA_CONTEXT(ctx); 127274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul GLuint i; 127374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul for (i = 0; i < n; i++) { 127474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul if (mask[i]) { 127574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul GLchan *p = PIXELADDR3(x[i], y[i]); 127674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul PACK_BGR(p, color[RCOMP], color[GCOMP], color[BCOMP]); 127774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul } 127874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul } 127974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul} 128074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul 128174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void 128274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulread_rgba_span3( const GLcontext *ctx, GLuint n, GLint x, GLint y, 128374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul GLchan rgba[][4] ) 128474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul{ 128574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const OSMesaContext osmesa = OSMESA_CONTEXT(ctx); 1286afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLuint i; 128774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const GLchan *p = PIXELADDR3(x, y); 128874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul for (i = 0; i < n; i++, p += 3) { 128974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul rgba[i][RCOMP] = UNPACK_RED(p); 129074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul rgba[i][GCOMP] = UNPACK_GREEN(p); 129174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul rgba[i][BCOMP] = UNPACK_BLUE(p); 129265c6ca91795a71cf38dbe5f49f2d73fd9d4049cdBrian Paul rgba[i][ACOMP] = CHAN_MAX; 1293afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1294afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 1295afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 129674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void 129774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulread_rgba_pixels3( const GLcontext *ctx, 129874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul GLuint n, const GLint x[], const GLint y[], 129974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul GLchan rgba[][4], const GLubyte mask[] ) 1300afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 130174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const OSMesaContext osmesa = OSMESA_CONTEXT(ctx); 1302afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLuint i; 130374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul for (i = 0; i < n; i++) { 1304afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (mask[i]) { 130574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const GLchan *p = PIXELADDR3(x[i], y[i]); 130674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul rgba[i][RCOMP] = UNPACK_RED(p); 130774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul rgba[i][GCOMP] = UNPACK_GREEN(p); 130874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul rgba[i][BCOMP] = UNPACK_BLUE(p); 130965c6ca91795a71cf38dbe5f49f2d73fd9d4049cdBrian Paul rgba[i][ACOMP] = CHAN_MAX; 1310afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1311afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1312afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 1313afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1314afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1315afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/**********************************************************************/ 1316206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul/***** 2 byte RGB pixel support funcs *****/ 1317206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul/**********************************************************************/ 1318206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul 1319206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul/* Write RGBA pixels to an RGB_565 buffer. */ 1320206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paulstatic void 1321206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paulwrite_rgba_span2( const GLcontext *ctx, 1322206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul GLuint n, GLint x, GLint y, 1323f431a3fb4dc1bf860203d79e54657e3a62bc50dfBrian Paul CONST GLchan rgba[][4], const GLubyte mask[] ) 1324206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul{ 1325206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul OSMesaContext osmesa = OSMESA_CONTEXT(ctx); 1326206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul GLushort *ptr2 = (GLushort *) PIXELADDR2(x, y); 1327206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul GLuint i; 1328206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul if (mask) { 1329206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul for (i = 0; i < n; i++, ptr2++) { 1330206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul if (mask[i]) { 1331206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul PACK_RGB_565(*ptr2, rgba[i][RCOMP], rgba[i][GCOMP], rgba[i][BCOMP]); 1332206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul } 1333206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul } 1334206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul } 1335206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul else { 1336206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul for (i = 0; i < n; i++, ptr2++) { 1337206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul PACK_RGB_565(*ptr2, rgba[i][RCOMP], rgba[i][GCOMP], rgba[i][BCOMP]); 1338206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul } 1339206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul } 1340206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul} 1341206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul 1342206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul 1343206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul/* Write RGB pixels to an RGB_565 buffer. */ 1344206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paulstatic void 1345206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paulwrite_rgb_span2( const GLcontext *ctx, 1346206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul GLuint n, GLint x, GLint y, 1347f431a3fb4dc1bf860203d79e54657e3a62bc50dfBrian Paul CONST GLchan rgb[][3], const GLubyte mask[] ) 1348206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul{ 1349206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul OSMesaContext osmesa = OSMESA_CONTEXT(ctx); 1350206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul GLushort *ptr2 = (GLushort *) PIXELADDR2(x, y); 1351206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul GLuint i; 1352206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul if (mask) { 1353206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul for (i = 0; i < n; i++, ptr2++) { 1354206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul if (mask[i]) { 1355206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul PACK_RGB_565(*ptr2, rgb[i][RCOMP], rgb[i][GCOMP], rgb[i][BCOMP]); 1356206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul } 1357206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul } 1358206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul } 1359206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul else { 1360206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul for (i = 0; i < n; i++, ptr2++) { 1361206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul PACK_RGB_565(*ptr2, rgb[i][RCOMP], rgb[i][GCOMP], rgb[i][BCOMP]); 1362206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul } 1363206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul } 1364206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul} 1365206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul 1366206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul 1367206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paulstatic void 1368206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paulwrite_monocolor_span2( const GLcontext *ctx, GLuint n, GLint x, GLint y, 1369206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul const GLchan color[4], const GLubyte mask[] ) 1370206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul{ 1371206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul OSMesaContext osmesa = OSMESA_CONTEXT(ctx); 1372206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul GLushort pixel; 1373206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul GLushort *ptr2 = (GLushort *) PIXELADDR2(x, y); 1374206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul GLuint i; 1375206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul PACK_RGB_565(pixel, color[RCOMP], color[GCOMP], color[BCOMP]); 1376206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul for (i = 0; i < n; i++, ptr2++) { 1377206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul if (mask[i]) { 1378206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul *ptr2 = pixel; 1379206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul } 1380206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul } 1381206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul} 1382206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul 1383206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul 1384206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paulstatic void 1385206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paulwrite_rgba_pixels2( const GLcontext *ctx, 1386206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul GLuint n, const GLint x[], const GLint y[], 1387f431a3fb4dc1bf860203d79e54657e3a62bc50dfBrian Paul CONST GLchan rgba[][4], const GLubyte mask[] ) 1388206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul{ 1389206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul OSMesaContext osmesa = OSMESA_CONTEXT(ctx); 1390206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul GLuint i; 1391206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul for (i = 0; i < n; i++) { 1392206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul if (mask[i]) { 1393206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul GLushort *ptr2 = (GLushort *) PIXELADDR2(x[i],y[i]); 1394206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul PACK_RGB_565(*ptr2, rgba[i][RCOMP], rgba[i][GCOMP], rgba[i][BCOMP]); 1395206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul } 1396206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul } 1397206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul} 1398206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul 1399206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paulstatic void 1400206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paulwrite_monocolor_pixels2( const GLcontext *ctx, 1401206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul GLuint n, const GLint x[], const GLint y[], 1402206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul const GLchan color[4], const GLubyte mask[] ) 1403206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul{ 1404206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul OSMesaContext osmesa = OSMESA_CONTEXT(ctx); 1405206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul GLuint i; 1406206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul GLushort pixel; 1407206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul PACK_RGB_565(pixel, color[RCOMP], color[GCOMP], color[BCOMP]); 1408206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul for (i = 0; i < n; i++) { 1409206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul if (mask[i]) { 1410206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul GLushort *ptr2 = (GLushort *) PIXELADDR2(x[i],y[i]); 1411206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul *ptr2 = pixel; 1412206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul } 1413206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul } 1414206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul} 1415206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul 1416206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paulstatic void 1417206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paulread_rgba_span2( const GLcontext *ctx, 1418206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul GLuint n, GLint x, GLint y, 1419f431a3fb4dc1bf860203d79e54657e3a62bc50dfBrian Paul GLchan rgba[][4] ) 1420206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul{ 1421206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul OSMesaContext osmesa = OSMESA_CONTEXT(ctx); 1422206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul GLuint i; 1423206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul const GLushort *ptr2 = (const GLushort *) PIXELADDR2(x, y); 1424206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul for (i = 0; i < n; i++, ptr2++) { 1425206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul /* This should be fixed to get the low bits right */ 1426206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul rgba[i][RCOMP] = (*ptr2 >> 8) & 0xFe; 1427206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul rgba[i][GCOMP] = (*ptr2 >> 3) & 0xFc; 1428206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul rgba[i][BCOMP] = (*ptr2 << 3) & 0xFe; 1429206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul rgba[i][ACOMP] = 0; 1430206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul } 1431206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul} 1432206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul 1433206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paulstatic void 1434206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paulread_rgba_pixels2( const GLcontext *ctx, 1435206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul GLuint n, const GLint x[], const GLint y[], 1436f431a3fb4dc1bf860203d79e54657e3a62bc50dfBrian Paul GLchan rgba[][4], const GLubyte mask[] ) 1437206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul{ 1438206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul OSMesaContext osmesa = OSMESA_CONTEXT(ctx); 1439206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul GLuint i; 1440206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul for (i = 0; i < n; i++) { 1441206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul if (mask[i]) { 1442206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul /* This should be fixed to get the low bits right */ 1443206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul const GLushort *ptr2 = (const GLushort *) PIXELADDR2(x[i],y[i]); 1444206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul rgba[i][RCOMP] = (*ptr2 >> 8) & 0xFE; 1445206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul rgba[i][GCOMP] = (*ptr2 >> 3) & 0xFC; 1446206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul rgba[i][BCOMP] = (*ptr2 << 3) & 0xFE; 1447206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul rgba[i][ACOMP] = 0; 1448206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul } 1449206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul } 1450206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul} 1451206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul 1452206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul 1453206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul 1454206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul/**********************************************************************/ 1455afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/***** Read/write spans/arrays of CI pixels *****/ 1456afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/**********************************************************************/ 1457afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1458afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/* Write 32-bit color index to buffer */ 145974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void 146074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulwrite_index32_span( const GLcontext *ctx, GLuint n, GLint x, GLint y, 146174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const GLuint index[], const GLubyte mask[] ) 1462afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 146374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const OSMesaContext osmesa = OSMESA_CONTEXT(ctx); 146474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul GLchan *ptr1 = PIXELADDR1(x, y); 1465afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLuint i; 1466afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (mask) { 1467afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg for (i=0;i<n;i++,ptr1++) { 1468afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (mask[i]) { 146974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul *ptr1 = (GLchan) index[i]; 1470afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1471afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1472afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1473afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg else { 1474afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg for (i=0;i<n;i++,ptr1++) { 147574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul *ptr1 = (GLchan) index[i]; 1476afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1477afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1478afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 1479afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1480afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1481afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/* Write 8-bit color index to buffer */ 148274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void 148374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulwrite_index8_span( const GLcontext *ctx, GLuint n, GLint x, GLint y, 148474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const GLubyte index[], const GLubyte mask[] ) 1485afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 148674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const OSMesaContext osmesa = OSMESA_CONTEXT(ctx); 148774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul GLchan *ptr1 = PIXELADDR1(x, y); 1488afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLuint i; 1489afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (mask) { 1490afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg for (i=0;i<n;i++,ptr1++) { 1491afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (mask[i]) { 149274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul *ptr1 = (GLchan) index[i]; 1493afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1494afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1495afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1496afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg else { 149774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul MEMCPY(ptr1, index, n * sizeof(GLchan)); 1498afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1499afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 1500afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1501afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 150274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void 150374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulwrite_monoindex_span( const GLcontext *ctx, GLuint n, GLint x, GLint y, 150474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul GLuint colorIndex, const GLubyte mask[] ) 1505afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 150674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const OSMesaContext osmesa = OSMESA_CONTEXT(ctx); 150774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul GLchan *ptr1 = PIXELADDR1(x, y); 1508afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLuint i; 1509afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg for (i=0;i<n;i++,ptr1++) { 1510afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (mask[i]) { 151174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul *ptr1 = (GLchan) colorIndex; 1512afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1513afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1514afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 1515afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1516afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 151774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void 151874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulwrite_index_pixels( const GLcontext *ctx, 151974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul GLuint n, const GLint x[], const GLint y[], 152074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const GLuint index[], const GLubyte mask[] ) 1521afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 152274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const OSMesaContext osmesa = OSMESA_CONTEXT(ctx); 1523afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLuint i; 1524afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg for (i=0;i<n;i++) { 1525afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (mask[i]) { 152674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul GLchan *ptr1 = PIXELADDR1(x[i], y[i]); 152774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul *ptr1 = (GLchan) index[i]; 1528afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1529afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1530afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 1531afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1532afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 153374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void 153474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulwrite_monoindex_pixels( const GLcontext *ctx, 153574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul GLuint n, const GLint x[], const GLint y[], 153674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul GLuint colorIndex, const GLubyte mask[] ) 1537afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 153874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const OSMesaContext osmesa = OSMESA_CONTEXT(ctx); 1539afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLuint i; 1540afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg for (i=0;i<n;i++) { 1541afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (mask[i]) { 154274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul GLchan *ptr1 = PIXELADDR1(x[i], y[i]); 154374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul *ptr1 = (GLchan) colorIndex; 1544afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1545afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1546afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 1547afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1548afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 154974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void 155074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulread_index_span( const GLcontext *ctx, 155174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul GLuint n, GLint x, GLint y, GLuint index[] ) 1552afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 155374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const OSMesaContext osmesa = OSMESA_CONTEXT(ctx); 1554afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLuint i; 155574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const GLchan *ptr1 = (const GLchan *) PIXELADDR1(x, y); 1556afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg for (i=0;i<n;i++,ptr1++) { 1557afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg index[i] = (GLuint) *ptr1; 1558afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1559afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 1560afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1561afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 156274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void 156374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulread_index_pixels( const GLcontext *ctx, 156474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul GLuint n, const GLint x[], const GLint y[], 156574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul GLuint index[], const GLubyte mask[] ) 1566afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 156774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const OSMesaContext osmesa = OSMESA_CONTEXT(ctx); 1568afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLuint i; 1569afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg for (i=0;i<n;i++) { 1570afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (mask[i] ) { 157174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const GLchan *ptr1 = PIXELADDR1(x[i], y[i]); 1572afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg index[i] = (GLuint) *ptr1; 1573afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1574afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1575afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 1576afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1577afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1578afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1579afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/**********************************************************************/ 1580afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/***** Optimized line rendering *****/ 1581afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/**********************************************************************/ 1582afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1583afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1584afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/* 1585afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Draw a flat-shaded, RGB line into an osmesa buffer. 1586afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */ 158774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void 158874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulflat_rgba_line( GLcontext *ctx, const SWvertex *vert0, const SWvertex *vert1 ) 1589afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 159074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const OSMesaContext osmesa = OSMESA_CONTEXT(ctx); 159131c40f0905331ca51d705f8a072a9d239d692966Keith Whitwell const GLchan *color = vert1->color; 1592afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1593afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#define INTERP_XY 1 1594afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#define CLIP_HACK 1 159574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul#define PLOT(X, Y) \ 159674b493a5e61237de081a438e774e5d8139d4c6b7Brian Pauldo { \ 159774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul GLchan *p = PIXELADDR4(X, Y); \ 159874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul PACK_RGBA(p, color[0], color[1], color[2], color[3]); \ 159974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul} while (0) 1600afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1601afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#ifdef WIN32 1602724abeb058ca9372c5a9b9e38ee43dde1accaa41Keith Whitwell#include "..\swrast\s_linetemp.h" 1603afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#else 1604724abeb058ca9372c5a9b9e38ee43dde1accaa41Keith Whitwell#include "swrast/s_linetemp.h" 1605afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#endif 1606afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 1607afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1608afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1609afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/* 1610afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Draw a flat-shaded, Z-less, RGB line into an osmesa buffer. 1611afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */ 161274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void 161374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulflat_rgba_z_line(GLcontext *ctx, const SWvertex *vert0, const SWvertex *vert1) 1614afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 161574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const OSMesaContext osmesa = OSMESA_CONTEXT(ctx); 161631c40f0905331ca51d705f8a072a9d239d692966Keith Whitwell const GLchan *color = vert1->color; 1617afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1618afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#define INTERP_XY 1 1619afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#define INTERP_Z 1 1620ed30dfa1264ec8875a3162c3c8778bc703bf11d5Brian Paul#define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE 1621afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#define CLIP_HACK 1 162274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul#define PLOT(X, Y) \ 162374b493a5e61237de081a438e774e5d8139d4c6b7Brian Pauldo { \ 162474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul if (Z < *zPtr) { \ 162574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul GLchan *p = PIXELADDR4(X, Y); \ 162674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul PACK_RGBA(p, color[RCOMP], color[GCOMP], \ 162774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul color[BCOMP], color[ACOMP]); \ 162874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul *zPtr = Z; \ 162974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul } \ 163074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul} while (0) 163174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul 1632afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1633afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#ifdef WIN32 1634724abeb058ca9372c5a9b9e38ee43dde1accaa41Keith Whitwell#include "..\swrast\s_linetemp.h" 1635afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#else 1636724abeb058ca9372c5a9b9e38ee43dde1accaa41Keith Whitwell#include "swrast/s_linetemp.h" 1637afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#endif 1638afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 1639afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1640afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1641afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/* 1642afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Draw a flat-shaded, alpha-blended, RGB line into an osmesa buffer. 164374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul * XXX update for GLchan 1644afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */ 164574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void 164674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulflat_blend_rgba_line( GLcontext *ctx, 164774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const SWvertex *vert0, const SWvertex *vert1 ) 1648afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 164974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const OSMesaContext osmesa = OSMESA_CONTEXT(ctx); 165074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const GLint rshift = osmesa->rshift; 165174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const GLint gshift = osmesa->gshift; 165274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const GLint bshift = osmesa->bshift; 165374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const GLint avalue = vert0->color[3]; 165465c6ca91795a71cf38dbe5f49f2d73fd9d4049cdBrian Paul const GLint msavalue = CHAN_MAX - avalue; 165531c40f0905331ca51d705f8a072a9d239d692966Keith Whitwell const GLint rvalue = vert1->color[0]*avalue; 165631c40f0905331ca51d705f8a072a9d239d692966Keith Whitwell const GLint gvalue = vert1->color[1]*avalue; 165731c40f0905331ca51d705f8a072a9d239d692966Keith Whitwell const GLint bvalue = vert1->color[2]*avalue; 1658afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1659afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#define INTERP_XY 1 1660afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#define CLIP_HACK 1 1661afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#define PLOT(X,Y) \ 166265c6ca91795a71cf38dbe5f49f2d73fd9d4049cdBrian Paul { GLuint *ptr4 = (GLuint *) PIXELADDR4(X, Y); \ 16637e67fb41fb54e050f6983b4de09ed3a317d6148fBrian Paul GLuint pixel = 0; \ 1664afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg pixel |=((((((*ptr4) >> rshift) & 0xff)*msavalue+rvalue)>>8) << rshift);\ 1665afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg pixel |=((((((*ptr4) >> gshift) & 0xff)*msavalue+gvalue)>>8) << gshift);\ 1666afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg pixel |=((((((*ptr4) >> bshift) & 0xff)*msavalue+bvalue)>>8) << bshift);\ 16677e67fb41fb54e050f6983b4de09ed3a317d6148fBrian Paul *ptr4 = pixel; \ 1668afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1669afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 16702427575c21c7c04b52f4a3605ad87c142c01f840Brian Paul#if 0 /* XXX use this in the future */ 16712427575c21c7c04b52f4a3605ad87c142c01f840Brian Paul#define PLOT(X,Y) \ 16722427575c21c7c04b52f4a3605ad87c142c01f840Brian Paul { \ 16732427575c21c7c04b52f4a3605ad87c142c01f840Brian Paul GLchan *pixel = (GLchan *) PIXELADDR4(X, Y); \ 16742427575c21c7c04b52f4a3605ad87c142c01f840Brian Paul pixel[rInd] = (pixel[rInd] * msavalue + rvalue) >> CHAN_BITS; \ 16752427575c21c7c04b52f4a3605ad87c142c01f840Brian Paul pixel[gInd] = (pixel[gInd] * msavalue + gvalue) >> CHAN_BITS; \ 16762427575c21c7c04b52f4a3605ad87c142c01f840Brian Paul pixel[bInd] = (pixel[bInd] * msavalue + bvalue) >> CHAN_BITS; \ 16772427575c21c7c04b52f4a3605ad87c142c01f840Brian Paul pixel[aInd] = (pixel[aInd] * msavalue + avalue) >> CHAN_BITS; \ 16782427575c21c7c04b52f4a3605ad87c142c01f840Brian Paul } 16792427575c21c7c04b52f4a3605ad87c142c01f840Brian Paul#endif 16802427575c21c7c04b52f4a3605ad87c142c01f840Brian Paul 1681afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#ifdef WIN32 1682724abeb058ca9372c5a9b9e38ee43dde1accaa41Keith Whitwell#include "..\swrast\s_linetemp.h" 1683afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#else 1684724abeb058ca9372c5a9b9e38ee43dde1accaa41Keith Whitwell#include "swrast/s_linetemp.h" 1685afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#endif 1686afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 1687afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1688ed30dfa1264ec8875a3162c3c8778bc703bf11d5Brian Paul 1689afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/* 1690afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Draw a flat-shaded, Z-less, alpha-blended, RGB line into an osmesa buffer. 16912427575c21c7c04b52f4a3605ad87c142c01f840Brian Paul * But don't write to Z buffer. 169274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul * XXX update for GLchan 1693afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */ 169474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void 169574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulflat_blend_rgba_z_line( GLcontext *ctx, 169674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const SWvertex *vert0, const SWvertex *vert1 ) 1697afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 169874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const OSMesaContext osmesa = OSMESA_CONTEXT(ctx); 169974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const GLint rshift = osmesa->rshift; 170074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const GLint gshift = osmesa->gshift; 170174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const GLint bshift = osmesa->bshift; 170274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const GLint avalue = vert0->color[3]; 170374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const GLint msavalue = 256 - avalue; 170431c40f0905331ca51d705f8a072a9d239d692966Keith Whitwell const GLint rvalue = vert1->color[0]*avalue; 170531c40f0905331ca51d705f8a072a9d239d692966Keith Whitwell const GLint gvalue = vert1->color[1]*avalue; 170631c40f0905331ca51d705f8a072a9d239d692966Keith Whitwell const GLint bvalue = vert1->color[2]*avalue; 1707afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1708afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#define INTERP_XY 1 1709afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#define INTERP_Z 1 1710ed30dfa1264ec8875a3162c3c8778bc703bf11d5Brian Paul#define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE 1711afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#define CLIP_HACK 1 17127e67fb41fb54e050f6983b4de09ed3a317d6148fBrian Paul#define PLOT(X,Y) \ 17137e67fb41fb54e050f6983b4de09ed3a317d6148fBrian Paul if (Z < *zPtr) { \ 171474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul GLuint *ptr4 = (GLuint *) PIXELADDR4(X, Y); \ 17157e67fb41fb54e050f6983b4de09ed3a317d6148fBrian Paul GLuint pixel = 0; \ 1716ed30dfa1264ec8875a3162c3c8778bc703bf11d5Brian Paul pixel |=((((((*ptr4) >> rshift) & 0xff)*msavalue+rvalue)>>8) << rshift); \ 1717ed30dfa1264ec8875a3162c3c8778bc703bf11d5Brian Paul pixel |=((((((*ptr4) >> gshift) & 0xff)*msavalue+gvalue)>>8) << gshift); \ 1718ed30dfa1264ec8875a3162c3c8778bc703bf11d5Brian Paul pixel |=((((((*ptr4) >> bshift) & 0xff)*msavalue+bvalue)>>8) << bshift); \ 17197e67fb41fb54e050f6983b4de09ed3a317d6148fBrian Paul *ptr4 = pixel; \ 1720afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1721afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 17222427575c21c7c04b52f4a3605ad87c142c01f840Brian Paul#if 0 /* XXX use this in the future */ 17232427575c21c7c04b52f4a3605ad87c142c01f840Brian Paul#define PLOT(X,Y) \ 17242427575c21c7c04b52f4a3605ad87c142c01f840Brian Paul if (Z < *zPtr) { \ 17252427575c21c7c04b52f4a3605ad87c142c01f840Brian Paul GLchan *pixel = (GLchan *) PIXELADDR4(X, Y); \ 17262427575c21c7c04b52f4a3605ad87c142c01f840Brian Paul pixel[rInd] = (pixel[rInd] * msavalue + rvalue) >> CHAN_BITS; \ 17272427575c21c7c04b52f4a3605ad87c142c01f840Brian Paul pixel[gInd] = (pixel[gInd] * msavalue + gvalue) >> CHAN_BITS; \ 17282427575c21c7c04b52f4a3605ad87c142c01f840Brian Paul pixel[bInd] = (pixel[bInd] * msavalue + bvalue) >> CHAN_BITS; \ 17292427575c21c7c04b52f4a3605ad87c142c01f840Brian Paul pixel[aInd] = (pixel[aInd] * msavalue + avalue) >> CHAN_BITS; \ 17302427575c21c7c04b52f4a3605ad87c142c01f840Brian Paul } 17312427575c21c7c04b52f4a3605ad87c142c01f840Brian Paul#endif 17322427575c21c7c04b52f4a3605ad87c142c01f840Brian Paul 1733afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#ifdef WIN32 1734724abeb058ca9372c5a9b9e38ee43dde1accaa41Keith Whitwell#include "..\swrast\s_linetemp.h" 1735afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#else 1736724abeb058ca9372c5a9b9e38ee43dde1accaa41Keith Whitwell#include "swrast/s_linetemp.h" 1737afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#endif 1738afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 1739afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1740ed30dfa1264ec8875a3162c3c8778bc703bf11d5Brian Paul 1741afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/* 1742afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Draw a flat-shaded, Z-less, alpha-blended, RGB line into an osmesa buffer. 174374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul * XXX update for GLchan 1744afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */ 174574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void 174674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulflat_blend_rgba_z_line_write( GLcontext *ctx, 174774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const SWvertex *vert0, const SWvertex *vert1 ) 1748afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 174974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const OSMesaContext osmesa = OSMESA_CONTEXT(ctx); 175074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const GLint rshift = osmesa->rshift; 175174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const GLint gshift = osmesa->gshift; 175274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const GLint bshift = osmesa->bshift; 175374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const GLint avalue = vert0->color[3]; 175474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const GLint msavalue = 256 - avalue; 175531c40f0905331ca51d705f8a072a9d239d692966Keith Whitwell const GLint rvalue = vert1->color[0]*avalue; 175631c40f0905331ca51d705f8a072a9d239d692966Keith Whitwell const GLint gvalue = vert1->color[1]*avalue; 175731c40f0905331ca51d705f8a072a9d239d692966Keith Whitwell const GLint bvalue = vert1->color[2]*avalue; 1758afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1759afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#define INTERP_XY 1 1760afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#define INTERP_Z 1 1761ed30dfa1264ec8875a3162c3c8778bc703bf11d5Brian Paul#define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE 1762afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#define CLIP_HACK 1 17637e67fb41fb54e050f6983b4de09ed3a317d6148fBrian Paul#define PLOT(X,Y) \ 17647e67fb41fb54e050f6983b4de09ed3a317d6148fBrian Paul if (Z < *zPtr) { \ 176574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul GLuint *ptr4 = (GLuint *) PIXELADDR4(X, Y); \ 17667e67fb41fb54e050f6983b4de09ed3a317d6148fBrian Paul GLuint pixel = 0; \ 1767ed30dfa1264ec8875a3162c3c8778bc703bf11d5Brian Paul pixel |=((((((*ptr4) >> rshift) & 0xff)*msavalue+rvalue)>>8) << rshift); \ 1768ed30dfa1264ec8875a3162c3c8778bc703bf11d5Brian Paul pixel |=((((((*ptr4) >> gshift) & 0xff)*msavalue+gvalue)>>8) << gshift); \ 1769ed30dfa1264ec8875a3162c3c8778bc703bf11d5Brian Paul pixel |=((((((*ptr4) >> bshift) & 0xff)*msavalue+bvalue)>>8) << bshift); \ 17707e67fb41fb54e050f6983b4de09ed3a317d6148fBrian Paul *ptr4 = pixel; \ 17717e67fb41fb54e050f6983b4de09ed3a317d6148fBrian Paul *zPtr = Z; \ 1772afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1773afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 17742427575c21c7c04b52f4a3605ad87c142c01f840Brian Paul#if 0 /* XXX use this in the future */ 17752427575c21c7c04b52f4a3605ad87c142c01f840Brian Paul#define PLOT(X,Y) \ 17762427575c21c7c04b52f4a3605ad87c142c01f840Brian Paul if (Z < *zPtr) { \ 17772427575c21c7c04b52f4a3605ad87c142c01f840Brian Paul GLchan *pixel = (GLchan *) PIXELADDR4(X, Y); \ 17782427575c21c7c04b52f4a3605ad87c142c01f840Brian Paul pixel[rInd] = (pixel[rInd] * msavalue + rvalue) >> CHAN_BITS; \ 17792427575c21c7c04b52f4a3605ad87c142c01f840Brian Paul pixel[gInd] = (pixel[gInd] * msavalue + gvalue) >> CHAN_BITS; \ 17802427575c21c7c04b52f4a3605ad87c142c01f840Brian Paul pixel[bInd] = (pixel[bInd] * msavalue + bvalue) >> CHAN_BITS; \ 17812427575c21c7c04b52f4a3605ad87c142c01f840Brian Paul pixel[aInd] = (pixel[aInd] * msavalue + avalue) >> CHAN_BITS; \ 17822427575c21c7c04b52f4a3605ad87c142c01f840Brian Paul *zPtr = Z; \ 17832427575c21c7c04b52f4a3605ad87c142c01f840Brian Paul } 17842427575c21c7c04b52f4a3605ad87c142c01f840Brian Paul#endif 17852427575c21c7c04b52f4a3605ad87c142c01f840Brian Paul 1786afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#ifdef WIN32 1787724abeb058ca9372c5a9b9e38ee43dde1accaa41Keith Whitwell#include "..\swrast\s_linetemp.h" 1788afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#else 1789724abeb058ca9372c5a9b9e38ee43dde1accaa41Keith Whitwell#include "swrast/s_linetemp.h" 1790afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#endif 1791afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 1792afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1793afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1794afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/* 1795afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Analyze context state to see if we can provide a fast line drawing 1796afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * function, like those in lines.c. Otherwise, return NULL. 1797afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */ 1798dbd1e2b5990a3689bf718296c57c14fc3ba38db5Jouk Jansenstatic swrast_line_func 17991e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwellosmesa_choose_line_function( GLcontext *ctx ) 1800afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 180174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const OSMesaContext osmesa = OSMESA_CONTEXT(ctx); 180274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const SWcontext *swrast = SWRAST_CONTEXT(ctx); 1803afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 180474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul if (CHAN_BITS != 8) return NULL; 18052d595d70202bad560c27ea81ec71b740415b3355Brian Paul if (ctx->RenderMode != GL_RENDER) return NULL; 1806afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (ctx->Line.SmoothFlag) return NULL; 18072d595d70202bad560c27ea81ec71b740415b3355Brian Paul if (ctx->Texture._ReallyEnabled) return NULL; 180874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul if (ctx->Light.ShadeModel != GL_FLAT) return NULL; 180974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul if (ctx->Line.Width != 1.0F) return NULL; 181074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul if (ctx->Line.StippleFlag) return NULL; 181174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul if (ctx->Line.SmoothFlag) return NULL; 181274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul if (osmesa->format != OSMESA_RGBA && 181374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul osmesa->format != OSMESA_BGRA && 181474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul osmesa->format != OSMESA_ARGB) return NULL; 181574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul 181674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul if (swrast->_RasterMask==DEPTH_BIT 181774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul && ctx->Depth.Func==GL_LESS 181874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul && ctx->Depth.Mask==GL_TRUE 181974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul && ctx->Visual.depthBits == DEFAULT_SOFTWARE_DEPTH_BITS) { 18204742735a5c22f2400a2777965e08e757ec384979Karl Schultz return (swrast_line_func) flat_rgba_z_line; 182174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul } 182274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul 182374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul if (swrast->_RasterMask == 0) { 18244742735a5c22f2400a2777965e08e757ec384979Karl Schultz return (swrast_line_func) flat_rgba_line; 182574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul } 182674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul 182774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul if (swrast->_RasterMask==(DEPTH_BIT|BLEND_BIT) 182874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul && ctx->Depth.Func==GL_LESS 182974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul && ctx->Depth.Mask==GL_TRUE 183074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul && ctx->Visual.depthBits == DEFAULT_SOFTWARE_DEPTH_BITS 183174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul && ctx->Color.BlendSrcRGB==GL_SRC_ALPHA 183274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul && ctx->Color.BlendDstRGB==GL_ONE_MINUS_SRC_ALPHA 183374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul && ctx->Color.BlendSrcA==GL_SRC_ALPHA 183474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul && ctx->Color.BlendDstA==GL_ONE_MINUS_SRC_ALPHA 183574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul && ctx->Color.BlendEquation==GL_FUNC_ADD_EXT) { 18364742735a5c22f2400a2777965e08e757ec384979Karl Schultz return (swrast_line_func) flat_blend_rgba_z_line_write; 183774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul } 183874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul 183974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul if (swrast->_RasterMask==(DEPTH_BIT|BLEND_BIT) 184074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul && ctx->Depth.Func==GL_LESS 184174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul && ctx->Depth.Mask==GL_FALSE 184274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul && ctx->Visual.depthBits == DEFAULT_SOFTWARE_DEPTH_BITS 184374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul && ctx->Color.BlendSrcRGB==GL_SRC_ALPHA 184474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul && ctx->Color.BlendDstRGB==GL_ONE_MINUS_SRC_ALPHA 184574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul && ctx->Color.BlendSrcA==GL_SRC_ALPHA 184674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul && ctx->Color.BlendDstA==GL_ONE_MINUS_SRC_ALPHA 184774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul && ctx->Color.BlendEquation==GL_FUNC_ADD_EXT) { 18484742735a5c22f2400a2777965e08e757ec384979Karl Schultz return (swrast_line_func) flat_blend_rgba_z_line; 184974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul } 1850afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 185174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul if (swrast->_RasterMask==BLEND_BIT 185274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul && ctx->Color.BlendSrcRGB==GL_SRC_ALPHA 185374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul && ctx->Color.BlendDstRGB==GL_ONE_MINUS_SRC_ALPHA 185474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul && ctx->Color.BlendSrcA==GL_SRC_ALPHA 185574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul && ctx->Color.BlendDstA==GL_ONE_MINUS_SRC_ALPHA 185674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul && ctx->Color.BlendEquation==GL_FUNC_ADD_EXT) { 18574742735a5c22f2400a2777965e08e757ec384979Karl Schultz return (swrast_line_func) flat_blend_rgba_line; 1858afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 185974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul 18604742735a5c22f2400a2777965e08e757ec384979Karl Schultz return (swrast_line_func) NULL; 1861afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 1862afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1863afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1864afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/**********************************************************************/ 1865afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/***** Optimized triangle rendering *****/ 1866afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/**********************************************************************/ 1867afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1868afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1869afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/* 1870afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Smooth-shaded, z-less triangle, RGBA color. 1871afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */ 1872dbd1e2b5990a3689bf718296c57c14fc3ba38db5Jouk Jansenstatic void smooth_rgba_z_triangle( GLcontext *ctx, 1873a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul const SWvertex *v0, 1874a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul const SWvertex *v1, 1875a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul const SWvertex *v2 ) 1876afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 187774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const OSMesaContext osmesa = OSMESA_CONTEXT(ctx); 187823ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank 1879afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#define INTERP_Z 1 1880ed30dfa1264ec8875a3162c3c8778bc703bf11d5Brian Paul#define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE 1881afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#define INTERP_RGB 1 1882afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#define INTERP_ALPHA 1 18839bf68ad963ba92b5d1e725f965979042495a5313Brian Paul#define RENDER_SPAN( span ) \ 18849bf68ad963ba92b5d1e725f965979042495a5313Brian Paul GLuint i; \ 18859bf68ad963ba92b5d1e725f965979042495a5313Brian Paul GLchan *img = PIXELADDR4(span.x, span.y); \ 188610f30eb43835c57c00783390a02d72daf4f78e26Brian Paul for (i = 0; i < span.end; i++, img += 4) { \ 18879bf68ad963ba92b5d1e725f965979042495a5313Brian Paul const GLdepth z = FixedToDepth(span.z); \ 1888afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (z < zRow[i]) { \ 188996385fa15569e25cd0977e678c0ff3bdab6ef316Brian Paul PACK_RGBA(img, FixedToChan(span.red), \ 189096385fa15569e25cd0977e678c0ff3bdab6ef316Brian Paul FixedToChan(span.green), FixedToChan(span.blue), \ 189196385fa15569e25cd0977e678c0ff3bdab6ef316Brian Paul FixedToChan(span.alpha)); \ 1892afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg zRow[i] = z; \ 1893afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } \ 18949bf68ad963ba92b5d1e725f965979042495a5313Brian Paul span.red += span.redStep; \ 18959bf68ad963ba92b5d1e725f965979042495a5313Brian Paul span.green += span.greenStep; \ 18969bf68ad963ba92b5d1e725f965979042495a5313Brian Paul span.blue += span.blueStep; \ 18979bf68ad963ba92b5d1e725f965979042495a5313Brian Paul span.alpha += span.alphaStep; \ 18989bf68ad963ba92b5d1e725f965979042495a5313Brian Paul span.z += span.zStep; \ 18999bf68ad963ba92b5d1e725f965979042495a5313Brian Paul } 19009bf68ad963ba92b5d1e725f965979042495a5313Brian Paul 1901afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#ifdef WIN32 1902724abeb058ca9372c5a9b9e38ee43dde1accaa41Keith Whitwell#include "..\swrast\s_tritemp.h" 1903afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#else 1904724abeb058ca9372c5a9b9e38ee43dde1accaa41Keith Whitwell#include "swrast/s_tritemp.h" 1905afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#endif 1906afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 1907afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1908afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1909afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1910afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1911afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/* 1912afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Flat-shaded, z-less triangle, RGBA color. 1913afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */ 1914dbd1e2b5990a3689bf718296c57c14fc3ba38db5Jouk Jansenstatic void flat_rgba_z_triangle( GLcontext *ctx, 1915a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul const SWvertex *v0, 1916a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul const SWvertex *v1, 1917a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul const SWvertex *v2 ) 1918afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 191974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const OSMesaContext osmesa = OSMESA_CONTEXT(ctx); 1920afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#define INTERP_Z 1 1921ed30dfa1264ec8875a3162c3c8778bc703bf11d5Brian Paul#define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE 192274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul#define SETUP_CODE \ 192374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul GLuint pixel; \ 192431c40f0905331ca51d705f8a072a9d239d692966Keith Whitwell PACK_RGBA((GLchan *) &pixel, v2->color[0], v2->color[1], \ 192531c40f0905331ca51d705f8a072a9d239d692966Keith Whitwell v2->color[2], v2->color[3]); 192674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul 19279bf68ad963ba92b5d1e725f965979042495a5313Brian Paul#define RENDER_SPAN( span ) \ 19289bf68ad963ba92b5d1e725f965979042495a5313Brian Paul GLuint i; \ 19299bf68ad963ba92b5d1e725f965979042495a5313Brian Paul GLuint *img = (GLuint *) PIXELADDR4(span.x, span.y); \ 193010f30eb43835c57c00783390a02d72daf4f78e26Brian Paul for (i = 0; i < span.end; i++) { \ 19319bf68ad963ba92b5d1e725f965979042495a5313Brian Paul const GLdepth z = FixedToDepth(span.z); \ 193274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul if (z < zRow[i]) { \ 193374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul img[i] = pixel; \ 193474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul zRow[i] = z; \ 193574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul } \ 19369bf68ad963ba92b5d1e725f965979042495a5313Brian Paul span.z += span.zStep; \ 19379bf68ad963ba92b5d1e725f965979042495a5313Brian Paul } 19389bf68ad963ba92b5d1e725f965979042495a5313Brian Paul 1939afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#ifdef WIN32 1940724abeb058ca9372c5a9b9e38ee43dde1accaa41Keith Whitwell#include "..\swrast\s_tritemp.h" 1941afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#else 1942724abeb058ca9372c5a9b9e38ee43dde1accaa41Keith Whitwell#include "swrast/s_tritemp.h" 1943afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#endif 1944afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 1945afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1946afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1947afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1948afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/* 1949afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Return pointer to an accelerated triangle function if possible. 1950afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */ 1951dbd1e2b5990a3689bf718296c57c14fc3ba38db5Jouk Jansenstatic swrast_tri_func 19521e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwellosmesa_choose_triangle_function( GLcontext *ctx ) 1953afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 195474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const OSMesaContext osmesa = OSMESA_CONTEXT(ctx); 195574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul const SWcontext *swrast = SWRAST_CONTEXT(ctx); 195674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul 195774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul if (CHAN_BITS != 8) return (swrast_tri_func) NULL; 195874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul if (ctx->RenderMode != GL_RENDER) return (swrast_tri_func) NULL; 195974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul if (ctx->Polygon.SmoothFlag) return (swrast_tri_func) NULL; 196074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul if (ctx->Polygon.StippleFlag) return (swrast_tri_func) NULL; 196174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul if (ctx->Texture._ReallyEnabled) return (swrast_tri_func) NULL; 196274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul if (osmesa->format != OSMESA_RGBA && 196374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul osmesa->format != OSMESA_BGRA && 196474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul osmesa->format != OSMESA_ARGB) return (swrast_tri_func) NULL; 196574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul 196674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul if (swrast->_RasterMask == DEPTH_BIT && 196774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul ctx->Depth.Func == GL_LESS && 196874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul ctx->Depth.Mask == GL_TRUE && 196974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul ctx->Visual.depthBits == DEFAULT_SOFTWARE_DEPTH_BITS) { 197074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul if (ctx->Light.ShadeModel == GL_SMOOTH) { 19714742735a5c22f2400a2777965e08e757ec384979Karl Schultz return (swrast_tri_func) smooth_rgba_z_triangle; 1972afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1973afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg else { 19744742735a5c22f2400a2777965e08e757ec384979Karl Schultz return (swrast_tri_func) flat_rgba_z_triangle; 1975afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1976afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 197774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul return (swrast_tri_func) NULL; 19781e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell} 19791e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell 198074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul 198174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul 19821e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell/* Override for the swrast triangle-selection function. Try to use one 19831e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell * of our internal triangle functions, otherwise fall back to the 1984dbd1e2b5990a3689bf718296c57c14fc3ba38db5Jouk Jansen * standard swrast functions. 19851e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell */ 19861e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwellstatic void osmesa_choose_triangle( GLcontext *ctx ) 19871e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell{ 19881e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell SWcontext *swrast = SWRAST_CONTEXT(ctx); 19891e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell 19901e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell swrast->Triangle = osmesa_choose_triangle_function( ctx ); 19911e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell if (!swrast->Triangle) 19921e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell _swrast_choose_triangle( ctx ); 1993afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 1994afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 19951e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwellstatic void osmesa_choose_line( GLcontext *ctx ) 19961e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell{ 19971e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell SWcontext *swrast = SWRAST_CONTEXT(ctx); 19981e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell 19991e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell swrast->Line = osmesa_choose_line_function( ctx ); 20001e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell if (!swrast->Line) 20011e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell _swrast_choose_line( ctx ); 20021e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell} 20031e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell 20041e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell 20052d595d70202bad560c27ea81ec71b740415b3355Brian Paul#define OSMESA_NEW_LINE (_NEW_LINE | \ 20062d595d70202bad560c27ea81ec71b740415b3355Brian Paul _NEW_TEXTURE | \ 20072d595d70202bad560c27ea81ec71b740415b3355Brian Paul _NEW_LIGHT | \ 20082d595d70202bad560c27ea81ec71b740415b3355Brian Paul _NEW_DEPTH | \ 20092d595d70202bad560c27ea81ec71b740415b3355Brian Paul _NEW_RENDERMODE | \ 2010dbd1e2b5990a3689bf718296c57c14fc3ba38db5Jouk Jansen _SWRAST_NEW_RASTERMASK) 20112d595d70202bad560c27ea81ec71b740415b3355Brian Paul 20122d595d70202bad560c27ea81ec71b740415b3355Brian Paul#define OSMESA_NEW_TRIANGLE (_NEW_POLYGON | \ 20132d595d70202bad560c27ea81ec71b740415b3355Brian Paul _NEW_TEXTURE | \ 20142d595d70202bad560c27ea81ec71b740415b3355Brian Paul _NEW_LIGHT | \ 20152d595d70202bad560c27ea81ec71b740415b3355Brian Paul _NEW_DEPTH | \ 20162d595d70202bad560c27ea81ec71b740415b3355Brian Paul _NEW_RENDERMODE | \ 20172d595d70202bad560c27ea81ec71b740415b3355Brian Paul _SWRAST_NEW_RASTERMASK) 20181e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell 20191e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell 2020dbd1e2b5990a3689bf718296c57c14fc3ba38db5Jouk Jansen/* Extend the software rasterizer with our line and triangle 20211e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell * functions. 20221e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell */ 20231e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwellstatic void osmesa_register_swrast_functions( GLcontext *ctx ) 20241e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell{ 20251e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell SWcontext *swrast = SWRAST_CONTEXT( ctx ); 2026dbd1e2b5990a3689bf718296c57c14fc3ba38db5Jouk Jansen 20271e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell swrast->choose_line = osmesa_choose_line; 20281e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell swrast->choose_triangle = osmesa_choose_triangle; 2029dbd1e2b5990a3689bf718296c57c14fc3ba38db5Jouk Jansen 20301e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell swrast->invalidate_line |= OSMESA_NEW_LINE; 20311e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell swrast->invalidate_triangle |= OSMESA_NEW_TRIANGLE; 20321e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell} 2033ed30dfa1264ec8875a3162c3c8778bc703bf11d5Brian Paul 2034ed30dfa1264ec8875a3162c3c8778bc703bf11d5Brian Paul 2035afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgstatic const GLubyte *get_string( GLcontext *ctx, GLenum name ) 2036afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 2037afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg (void) ctx; 2038afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg switch (name) { 2039afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_RENDERER: 20401cefc83a8802deb53a176e20fd2d23b8ce47909fBrian Paul#if CHAN_BITS == 32 20411cefc83a8802deb53a176e20fd2d23b8ce47909fBrian Paul return (const GLubyte *) "Mesa OffScreen32"; 20421cefc83a8802deb53a176e20fd2d23b8ce47909fBrian Paul#elif CHAN_BITS == 16 20431cefc83a8802deb53a176e20fd2d23b8ce47909fBrian Paul return (const GLubyte *) "Mesa OffScreen16"; 20441cefc83a8802deb53a176e20fd2d23b8ce47909fBrian Paul#else 2045afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return (const GLubyte *) "Mesa OffScreen"; 20461cefc83a8802deb53a176e20fd2d23b8ce47909fBrian Paul#endif 2047afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg default: 2048afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return NULL; 2049afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 2050afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 2051afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 2052afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 2053cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwellstatic void osmesa_update_state( GLcontext *ctx, GLuint new_state ) 2054afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 2055c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul OSMesaContext osmesa = OSMESA_CONTEXT(ctx); 2056709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell struct swrast_device_driver *swdd = _swrast_GetDeviceDriverReference( ctx ); 2057709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell TNLcontext *tnl = TNL_CONTEXT(ctx); 2058304357dcd496f7ebf499fd9c77b4eba83a75abd5Brian Paul 2059304357dcd496f7ebf499fd9c77b4eba83a75abd5Brian Paul ASSERT((void *) osmesa == (void *) ctx->DriverCtx); 2060afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 206174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul /* 206274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul * XXX these function pointers could be initialized just once during 206374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul * context creation since they don't depend on any state changes. 206474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul */ 206574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul 2066afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ctx->Driver.GetString = get_string; 2067afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ctx->Driver.UpdateState = osmesa_update_state; 2068cea0e8e6700e871bb9bcb334cb75fbfbfcdfd702Brian Paul ctx->Driver.SetDrawBuffer = set_draw_buffer; 206918a285a5e244b7405b85feb7315a30d99920ec5dBrian Paul ctx->Driver.ResizeBuffers = _swrast_alloc_buffers; 2070a81b3532f7c984878ba1d4b38f796abf731f76b1Brian Paul ctx->Driver.GetBufferSize = buffer_size; 2071a81b3532f7c984878ba1d4b38f796abf731f76b1Brian Paul 20725c1e7fa6ee72f4403d9ec9d12830dd689b966e71Keith Whitwell ctx->Driver.Accum = _swrast_Accum; 20735c1e7fa6ee72f4403d9ec9d12830dd689b966e71Keith Whitwell ctx->Driver.Bitmap = _swrast_Bitmap; 2074afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ctx->Driver.Clear = clear; 20755c1e7fa6ee72f4403d9ec9d12830dd689b966e71Keith Whitwell ctx->Driver.CopyPixels = _swrast_CopyPixels; 20765c1e7fa6ee72f4403d9ec9d12830dd689b966e71Keith Whitwell ctx->Driver.DrawPixels = _swrast_DrawPixels; 20775c1e7fa6ee72f4403d9ec9d12830dd689b966e71Keith Whitwell ctx->Driver.ReadPixels = _swrast_ReadPixels; 2078afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 20797d58f44f73be59bd3583e6dfeedf56c43f7fbd55Brian Paul ctx->Driver.ChooseTextureFormat = _mesa_choose_tex_format; 20808e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul ctx->Driver.TexImage1D = _mesa_store_teximage1d; 20818e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul ctx->Driver.TexImage2D = _mesa_store_teximage2d; 20828e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul ctx->Driver.TexImage3D = _mesa_store_teximage3d; 20838e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul ctx->Driver.TexSubImage1D = _mesa_store_texsubimage1d; 20848e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul ctx->Driver.TexSubImage2D = _mesa_store_texsubimage2d; 20858e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul ctx->Driver.TexSubImage3D = _mesa_store_texsubimage3d; 20868e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul ctx->Driver.TestProxyTexImage = _mesa_test_proxy_teximage; 20878e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul 2088709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell ctx->Driver.CopyTexImage1D = _swrast_copy_teximage1d; 2089709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell ctx->Driver.CopyTexImage2D = _swrast_copy_teximage2d; 2090709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell ctx->Driver.CopyTexSubImage1D = _swrast_copy_texsubimage1d; 2091709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell ctx->Driver.CopyTexSubImage2D = _swrast_copy_texsubimage2d; 2092709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell ctx->Driver.CopyTexSubImage3D = _swrast_copy_texsubimage3d; 2093709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell ctx->Driver.CopyColorTable = _swrast_CopyColorTable; 2094709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell ctx->Driver.CopyColorSubTable = _swrast_CopyColorSubTable; 2095709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell ctx->Driver.CopyConvolutionFilter1D = _swrast_CopyConvolutionFilter1D; 2096709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell ctx->Driver.CopyConvolutionFilter2D = _swrast_CopyConvolutionFilter2D; 2097709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell 2098e79f4b08d5005a4053230a1e4c66455fb9e56430Brian Paul ctx->Driver.BaseCompressedTexFormat = _mesa_base_compressed_texformat; 2099e79f4b08d5005a4053230a1e4c66455fb9e56430Brian Paul ctx->Driver.CompressedTextureSize = _mesa_compressed_texture_size; 2100e79f4b08d5005a4053230a1e4c66455fb9e56430Brian Paul ctx->Driver.GetCompressedTexImage = _mesa_get_compressed_teximage; 2101afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 2102afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg /* RGB(A) span/pixel functions */ 210374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul if (osmesa->format == OSMESA_RGB) { 2104709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell swdd->WriteRGBASpan = write_rgba_span_RGB; 2105709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell swdd->WriteRGBSpan = write_rgb_span_RGB; 2106709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell swdd->WriteMonoRGBASpan = write_monocolor_span_RGB; 2107709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell swdd->WriteRGBAPixels = write_rgba_pixels_RGB; 2108709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell swdd->WriteMonoRGBAPixels = write_monocolor_pixels_RGB; 2109709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell swdd->ReadRGBASpan = read_rgba_span3; 2110709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell swdd->ReadRGBAPixels = read_rgba_pixels3; 211174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul } 211274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul else if (osmesa->format == OSMESA_BGR) { 2113709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell swdd->WriteRGBASpan = write_rgba_span_BGR; 2114709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell swdd->WriteRGBSpan = write_rgb_span_BGR; 2115709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell swdd->WriteMonoRGBASpan = write_monocolor_span_BGR; 2116709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell swdd->WriteRGBAPixels = write_rgba_pixels_BGR; 2117709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell swdd->WriteMonoRGBAPixels = write_monocolor_pixels_BGR; 2118709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell swdd->ReadRGBASpan = read_rgba_span3; 2119709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell swdd->ReadRGBAPixels = read_rgba_pixels3; 2120afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 2121206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul else if (osmesa->format == OSMESA_RGB_565) { 2122206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul swdd->WriteRGBASpan = write_rgba_span2; 2123206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul swdd->WriteRGBSpan = write_rgb_span2; 2124206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul swdd->WriteMonoRGBASpan = write_monocolor_span2; 2125206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul swdd->WriteRGBAPixels = write_rgba_pixels2; 2126206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul swdd->WriteMonoRGBAPixels = write_monocolor_pixels2; 2127206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul swdd->ReadRGBASpan = read_rgba_span2; 2128206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul swdd->ReadRGBAPixels = read_rgba_pixels2; 2129206eda8b69ab3c63e9597015189f49d1bda9356fBrian Paul } 2130afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg else { 21312db44ffe9d591b0686755e2128ae9a6a1611f2a5Brian Paul /* 4 GLchan / pixel in frame buffer */ 2132709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell swdd->WriteRGBSpan = write_rgb_span; 2133709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell swdd->WriteRGBAPixels = write_rgba_pixels; 2134709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell swdd->WriteMonoRGBASpan = write_monocolor_span; 2135709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell swdd->WriteMonoRGBAPixels = write_monocolor_pixels; 213674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul if (osmesa->format == OSMESA_RGBA && 213774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul CHAN_TYPE == GL_UNSIGNED_BYTE && 213874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul RCOMP==0 && GCOMP==1 && BCOMP==2 && ACOMP==3) { 213974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul /* special, fast case */ 2140709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell swdd->WriteRGBASpan = write_rgba_span_rgba; 2141709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell swdd->ReadRGBASpan = read_rgba_span_rgba; 214274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul } 214374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul else { 2144709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell swdd->WriteRGBASpan = write_rgba_span; 2145709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell swdd->ReadRGBASpan = read_rgba_span; 214674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul } 2147709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell swdd->ReadRGBAPixels = read_rgba_pixels; 2148afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 2149afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 2150afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg /* CI span/pixel functions */ 2151709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell swdd->WriteCI32Span = write_index32_span; 2152709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell swdd->WriteCI8Span = write_index8_span; 2153709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell swdd->WriteMonoCISpan = write_monoindex_span; 2154709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell swdd->WriteCI32Pixels = write_index_pixels; 2155709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell swdd->WriteMonoCIPixels = write_monoindex_pixels; 2156709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell swdd->ReadCI32Span = read_index_span; 2157709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell swdd->ReadCI32Pixels = read_index_pixels; 2158709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell 2159709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell swdd->SetReadBuffer = set_read_buffer; 2160709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell 2161bc69de5f21ebb4d6e1c65bf5652d17a9fc87dda7Keith Whitwell tnl->Driver.RunPipeline = _tnl_run_pipeline; 216223caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell 2163cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell _swrast_InvalidateState( ctx, new_state ); 2164cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell _swsetup_InvalidateState( ctx, new_state ); 216558e991705392a2e17a1c8b034f4083a0adaf1943Keith Whitwell _ac_InvalidateState( ctx, new_state ); 2166cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell _tnl_InvalidateState( ctx, new_state ); 2167afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 2168