osmesa.c revision c19d783e0715ac01ad4d3fd0705500d2bf6f7039
1c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul/* $Id: osmesa.c,v 1.29 2000/11/14 17:40:14 brianp Exp $ */ 2afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 3afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/* 4afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Mesa 3-D graphics library 5cb5ecb883eb3be842ef44c61df8d4b527877c858Brian Paul * Version: 3.3 6afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * 7304357dcd496f7ebf499fd9c77b4eba83a75abd5Brian Paul * Copyright (C) 1999-2000 Brian Paul All Rights Reserved. 8afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * 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: 15afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * 16afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * The above copyright notice and this permission notice shall be included 17afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * in all copies or substantial portions of the Software. 18afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * 19afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 20afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 21afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 22afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN 23afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 24afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 25afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */ 26afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 27afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 28afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/* 29afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Off-Screen Mesa rendering / Rendering into client memory space 30d3c070ca6a36daa765b1ad7f44e03e6671ad0490Brian Paul * 31d3c070ca6a36daa765b1ad7f44e03e6671ad0490Brian Paul * Note on thread safety: this driver is thread safe. All 32d3c070ca6a36daa765b1ad7f44e03e6671ad0490Brian Paul * functions are reentrant. The notion of current context is 33b1394fa92aaaf859ce9efc8b5fc194397921320cBrian Paul * managed by the core _mesa_make_current() and _mesa_get_current_context() 34d3c070ca6a36daa765b1ad7f44e03e6671ad0490Brian Paul * functions. Those functions are thread-safe. 35afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */ 36afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 37afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 38afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#ifdef PC_HEADER 39afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#include "all.h" 40afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#else 41eed6f691991ed0d64752fa712c83f67eb700b9adBrian Paul#include "glheader.h" 42afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#include "GL/osmesa.h" 43afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#include "context.h" 44afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#include "depth.h" 45ebb248aa5c018dc676d389221d76ed329059789eBrian Paul#include "macros.h" 46cb5ecb883eb3be842ef44c61df8d4b527877c858Brian Paul#include "mem.h" 47afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#include "matrix.h" 48afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#include "types.h" 4923ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank#include "extensions.h" 501e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell#include "swrast/swrast.h" 511e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell#include "swrast_setup/swrast_setup.h" 521e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell#include "swrast/s_context.h" 53724abeb058ca9372c5a9b9e38ee43dde1accaa41Keith Whitwell#include "swrast/s_depth.h" 541e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell#include "swrast/s_lines.h" 551e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell#include "swrast/s_triangle.h" 56afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#endif 57afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 58afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 59724abeb058ca9372c5a9b9e38ee43dde1accaa41Keith Whitwell 60724abeb058ca9372c5a9b9e38ee43dde1accaa41Keith Whitwell 61304357dcd496f7ebf499fd9c77b4eba83a75abd5Brian Paul/* 62304357dcd496f7ebf499fd9c77b4eba83a75abd5Brian Paul * This is the OS/Mesa context struct. 63304357dcd496f7ebf499fd9c77b4eba83a75abd5Brian Paul * Notice how it includes a GLcontext. By doing this we're mimicking 64304357dcd496f7ebf499fd9c77b4eba83a75abd5Brian Paul * C++ inheritance/derivation. 65304357dcd496f7ebf499fd9c77b4eba83a75abd5Brian Paul * Later, we can cast a GLcontext pointer into an OSMesaContext pointer 66304357dcd496f7ebf499fd9c77b4eba83a75abd5Brian Paul * or vice versa. 67304357dcd496f7ebf499fd9c77b4eba83a75abd5Brian Paul */ 68afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgstruct osmesa_context { 69304357dcd496f7ebf499fd9c77b4eba83a75abd5Brian Paul GLcontext gl_ctx; /* The core GL/Mesa context */ 70afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLvisual *gl_visual; /* Describes the buffers */ 71afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLframebuffer *gl_buffer; /* Depth, stencil, accum, etc buffers */ 72afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLenum format; /* either GL_RGBA or GL_COLOR_INDEX */ 73afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg void *buffer; /* the image buffer */ 74afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLint width, height; /* size of image buffer */ 75afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLuint pixel; /* current color index or RGBA pixel value */ 76afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLuint clearpixel; /* pixel for clearing the color buffer */ 77afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLint rowlength; /* number of pixels per row */ 78afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLint userRowLength; /* user-specified number of pixels per row */ 79afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLint rshift, gshift; /* bit shifts for RGBA formats */ 80afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLint bshift, ashift; 81afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLint rind, gind, bind; /* index offsets for RGBA formats */ 82afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg void *rowaddr[MAX_HEIGHT]; /* address of first pixel in each image row */ 83afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLboolean yup; /* TRUE -> Y increases upward */ 84afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg /* FALSE -> Y increases downward */ 85afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}; 86afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 87afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 88afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 89afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/* A forward declaration: */ 90afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgstatic void osmesa_update_state( GLcontext *ctx ); 911e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwellstatic void osmesa_register_swrast_functions( GLcontext *ctx ); 92afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 93afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 94afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 95c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul#define OSMESA_CONTEXT(ctx) ((OSMesaContext) (ctx->DriverCtx)) 96c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul 97c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul 98c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul 99afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/**********************************************************************/ 100afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/***** Public Functions *****/ 101afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/**********************************************************************/ 102afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 103afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 104afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/* 105afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Create an Off-Screen Mesa rendering context. The only attribute needed is 106afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * an RGBA vs Color-Index mode flag. 107afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * 108afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Input: format - either GL_RGBA or GL_COLOR_INDEX 109afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * sharelist - specifies another OSMesaContext with which to share 110afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * display lists. NULL indicates no sharing. 111afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Return: an OSMesaContext or 0 if error 112afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */ 113d3c070ca6a36daa765b1ad7f44e03e6671ad0490Brian PaulOSMesaContext GLAPIENTRY 114d3c070ca6a36daa765b1ad7f44e03e6671ad0490Brian PaulOSMesaCreateContext( GLenum format, OSMesaContext sharelist ) 115afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 1162bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul return OSMesaCreateContextExt(format, DEFAULT_SOFTWARE_DEPTH_BITS, 1172bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul 8, 16, sharelist); 1182bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul} 1192bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul 1202bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul 1212bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul 1222bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul/* 1232bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul * New in Mesa 3.5 1242bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul * 1252bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul * Create context and specify size of ancillary buffers. 1262bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul */ 1272bf5d9470d3232763cb49b5589209940d4d5398dBrian PaulOSMesaContext GLAPIENTRY 1282bf5d9470d3232763cb49b5589209940d4d5398dBrian PaulOSMesaCreateContextExt( GLenum format, GLint depthBits, GLint stencilBits, 1292bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul GLint accumBits, OSMesaContext sharelist ) 1302bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul{ 131afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg OSMesaContext osmesa; 132afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLint rshift, gshift, bshift, ashift; 133afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLint rind, gind, bind; 1342bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul GLint indexBits, redBits, greenBits, blueBits, alphaBits; 135afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLboolean rgbmode; 136afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLboolean swalpha; 137afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLuint i4 = 1; 138afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLubyte *i1 = (GLubyte *) &i4; 139afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLint little_endian = *i1; 140afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 141afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg swalpha = GL_FALSE; 142afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg rind = gind = bind = 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; 1502bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul redBits = 8; 1512bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul greenBits = 8; 1522bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul blueBits = 8; 153afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg alphaBits = 8; 154afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (little_endian) { 155afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg rshift = 0; 156afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg gshift = 8; 157afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg bshift = 16; 158afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ashift = 24; 159afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 160afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg else { 161afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg rshift = 24; 162afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg gshift = 16; 163afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg bshift = 8; 164afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ashift = 0; 165afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 166afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg rgbmode = GL_TRUE; 167afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 168afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg else if (format==OSMESA_BGRA) { 169afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg indexBits = 0; 1702bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul redBits = 8; 1712bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul greenBits = 8; 1722bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul blueBits = 8; 173afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg alphaBits = 8; 174afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (little_endian) { 175afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ashift = 0; 176afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg rshift = 8; 177afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg gshift = 16; 178afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg bshift = 24; 179afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 180afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg else { 181afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg bshift = 24; 182afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg gshift = 16; 183afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg rshift = 8; 184afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ashift = 0; 185afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 186afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg rgbmode = GL_TRUE; 187afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 188afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg else if (format==OSMESA_ARGB) { 189afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg indexBits = 0; 1902bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul redBits = 8; 1912bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul greenBits = 8; 1922bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul blueBits = 8; 193afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg alphaBits = 8; 194afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (little_endian) { 195afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg bshift = 0; 196afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg gshift = 8; 197afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg rshift = 16; 198afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ashift = 24; 199afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 200afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg else { 201afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ashift = 24; 202afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg rshift = 16; 203afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg gshift = 8; 204afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg bshift = 0; 205afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 206afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg rgbmode = GL_TRUE; 207afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 208afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg else if (format==OSMESA_RGB) { 209afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg indexBits = 0; 2102bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul redBits = 8; 2112bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul greenBits = 8; 2122bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul blueBits = 8; 213afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg alphaBits = 0; 214afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg bshift = 0; 215afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg gshift = 8; 216afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg rshift = 16; 217afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ashift = 24; 218afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg bind = 2; 219afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg gind = 1; 220afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg rind = 0; 221afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg rgbmode = GL_TRUE; 222afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg swalpha = GL_TRUE; 223afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 224afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg else if (format==OSMESA_BGR) { 225afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg indexBits = 0; 2262bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul redBits = 8; 2272bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul greenBits = 8; 2282bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul blueBits = 8; 229afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg alphaBits = 0; 230afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg bshift = 0; 231afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg gshift = 8; 232afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg rshift = 16; 233afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ashift = 24; 234afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg bind = 0; 235afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg gind = 1; 236afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg rind = 2; 237afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg rgbmode = GL_TRUE; 238afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg swalpha = GL_TRUE; 239afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 240afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg else { 241afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return NULL; 242afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 243afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 244afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 245bd5cdaf4442872d3cd2ff94eeafadd481d27fcfbBrian Paul osmesa = (OSMesaContext) CALLOC_STRUCT(osmesa_context); 246afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (osmesa) { 2472bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul osmesa->gl_visual = _mesa_create_visual( rgbmode, 2482bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul GL_FALSE, /* double buffer */ 2492bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul GL_FALSE, /* stereo */ 2502bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul redBits, 2512bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul greenBits, 2522bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul blueBits, 2532bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul alphaBits, 2542bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul indexBits, 2552bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul depthBits, 2562bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul stencilBits, 2572bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul accumBits, 2582bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul accumBits, 2592bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul accumBits, 2602bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul alphaBits ? accumBits : 0, 2612bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul 1 /* num samples */ 2622bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul ); 263afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (!osmesa->gl_visual) { 264941dcc797e1a6317808c1ec43476817286d576baBrian Paul FREE(osmesa); 265afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return NULL; 266afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 267afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 268df81387dfae199a71bc55138ea5856dc05eacf24Brian Paul if (!_mesa_initialize_context(&osmesa->gl_ctx, 269df81387dfae199a71bc55138ea5856dc05eacf24Brian Paul osmesa->gl_visual, 270df81387dfae199a71bc55138ea5856dc05eacf24Brian Paul sharelist ? &sharelist->gl_ctx 271df81387dfae199a71bc55138ea5856dc05eacf24Brian Paul : (GLcontext *) NULL, 272df81387dfae199a71bc55138ea5856dc05eacf24Brian Paul (void *) osmesa, GL_TRUE )) { 273df81387dfae199a71bc55138ea5856dc05eacf24Brian Paul _mesa_destroy_visual( osmesa->gl_visual ); 274bd5cdaf4442872d3cd2ff94eeafadd481d27fcfbBrian Paul FREE(osmesa); 275afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return NULL; 276afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 27723ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank gl_extensions_enable(&(osmesa->gl_ctx),"GL_HP_occlusion_test"); 278413d6a21f849a689b5c83ea04395856b44fc65a8Brian Paul gl_extensions_enable(&(osmesa->gl_ctx), "GL_ARB_texture_cube_map"); 27924507ff6ab91a85f98da60745bd6585499968b60Brian Paul gl_extensions_enable(&(osmesa->gl_ctx), "GL_EXT_texture_env_combine"); 280304357dcd496f7ebf499fd9c77b4eba83a75abd5Brian Paul 281b1394fa92aaaf859ce9efc8b5fc194397921320cBrian Paul osmesa->gl_buffer = _mesa_create_framebuffer( osmesa->gl_visual, 282b1394fa92aaaf859ce9efc8b5fc194397921320cBrian Paul osmesa->gl_visual->DepthBits > 0, 283b1394fa92aaaf859ce9efc8b5fc194397921320cBrian Paul osmesa->gl_visual->StencilBits > 0, 284b1394fa92aaaf859ce9efc8b5fc194397921320cBrian Paul osmesa->gl_visual->AccumRedBits > 0, 285b1394fa92aaaf859ce9efc8b5fc194397921320cBrian Paul osmesa->gl_visual->AlphaBits > 0 ); 2864c44d63f01a01f134d7e4456d4209edee97f9ef5Brian Paul 287afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (!osmesa->gl_buffer) { 288b1394fa92aaaf859ce9efc8b5fc194397921320cBrian Paul _mesa_destroy_visual( osmesa->gl_visual ); 289b1394fa92aaaf859ce9efc8b5fc194397921320cBrian Paul _mesa_free_context_data( &osmesa->gl_ctx ); 290bd5cdaf4442872d3cd2ff94eeafadd481d27fcfbBrian Paul FREE(osmesa); 291afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return NULL; 292afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 293afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg osmesa->format = format; 294afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg osmesa->buffer = NULL; 295afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg osmesa->width = 0; 296afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg osmesa->height = 0; 297afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg osmesa->pixel = 0; 298afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg osmesa->clearpixel = 0; 299afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg osmesa->userRowLength = 0; 300afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg osmesa->rowlength = 0; 301afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg osmesa->yup = GL_TRUE; 302afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg osmesa->rshift = rshift; 303afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg osmesa->gshift = gshift; 304afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg osmesa->bshift = bshift; 305afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg osmesa->ashift = ashift; 306afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg osmesa->rind = rind; 307afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg osmesa->gind = gind; 308afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg osmesa->bind = bind; 3091e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell 3101e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell 3111e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell /* Initialize the software rasterizer and helper modules. 3121e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell */ 3131e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell { 3141e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell GLcontext *ctx = &osmesa->gl_ctx; 3151e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell 3161e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell _swrast_CreateContext( ctx ); 3171e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell _swsetup_CreateContext( ctx ); 3181e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell 3191e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell if (ctx->VB) 3201e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell _swsetup_RegisterVB( ctx->VB ); 3211e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell 3221e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell osmesa_register_swrast_functions( ctx ); 3231e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell } 324afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 325afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return osmesa; 326afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 327afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 328afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 329afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 3302bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul 331afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/* 332afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Destroy an Off-Screen Mesa rendering context. 333afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * 334afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Input: ctx - the context to destroy 335afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */ 336afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgvoid GLAPIENTRY OSMesaDestroyContext( OSMesaContext ctx ) 337afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 338afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (ctx) { 339b1394fa92aaaf859ce9efc8b5fc194397921320cBrian Paul _mesa_destroy_visual( ctx->gl_visual ); 340b1394fa92aaaf859ce9efc8b5fc194397921320cBrian Paul _mesa_destroy_framebuffer( ctx->gl_buffer ); 341b1394fa92aaaf859ce9efc8b5fc194397921320cBrian Paul _mesa_free_context_data( &ctx->gl_ctx ); 342bd5cdaf4442872d3cd2ff94eeafadd481d27fcfbBrian Paul FREE( ctx ); 343afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 344afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 345afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 346afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 347afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 348afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/* 349afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Recompute the values of the context's rowaddr array. 350afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */ 351afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgstatic void compute_row_addresses( OSMesaContext ctx ) 352afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 353afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLint i; 354afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 355afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (ctx->yup) { 356afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg /* Y=0 is bottom line of window */ 357afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (ctx->format==OSMESA_COLOR_INDEX) { 358afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg /* 1-byte CI mode */ 359afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLubyte *origin = (GLubyte *) ctx->buffer; 360afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg for (i=0;i<MAX_HEIGHT;i++) { 361afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ctx->rowaddr[i] = origin + i * ctx->rowlength; 362afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 363afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 364afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg else { 365afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if ((ctx->format==OSMESA_RGB) || (ctx->format==OSMESA_BGR)) { 366afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg /* 3-byte RGB mode */ 367afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLubyte *origin = (GLubyte *) ctx->buffer; 368afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg for (i=0;i<MAX_HEIGHT;i++) { 369afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ctx->rowaddr[i] = origin + (i * (ctx->rowlength*3)); 370afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 371afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } else { 372afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg /* 4-byte RGBA mode */ 373afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLuint *origin = (GLuint *) ctx->buffer; 374afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg for (i=0;i<MAX_HEIGHT;i++) { 375afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ctx->rowaddr[i] = origin + i * ctx->rowlength; 376afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 377afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 378afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 379afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 380afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg else { 381afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg /* Y=0 is top line of window */ 382afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (ctx->format==OSMESA_COLOR_INDEX) { 383afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg /* 1-byte CI mode */ 384afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLubyte *origin = (GLubyte *) ctx->buffer; 385afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg for (i=0;i<MAX_HEIGHT;i++) { 386afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ctx->rowaddr[i] = origin + (ctx->height-i-1) * ctx->rowlength; 387afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 388afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 389afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg else { 390afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if ((ctx->format==OSMESA_RGB) || (ctx->format==OSMESA_BGR)) { 391afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg /* 3-byte RGB mode */ 392afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLubyte *origin = (GLubyte *) ctx->buffer; 393afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg for (i=0;i<MAX_HEIGHT;i++) { 394afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ctx->rowaddr[i] = origin + ((ctx->height-i-1) * (ctx->rowlength*3)); 395afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 396afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } else { 397afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg /* 4-byte RGBA mode */ 398afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLuint *origin = (GLuint *) ctx->buffer; 399afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg for (i=0;i<MAX_HEIGHT;i++) { 400afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ctx->rowaddr[i] = origin + (ctx->height-i-1) * ctx->rowlength; 401afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 402afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 403afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 404afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 405afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 406afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 407afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 408afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/* 409afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Bind an OSMesaContext to an image buffer. The image buffer is just a 410afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * block of memory which the client provides. Its size must be at least 411afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * as large as width*height*sizeof(type). Its address should be a multiple 412afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * of 4 if using RGBA mode. 413afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * 414afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Image data is stored in the order of glDrawPixels: row-major order 415afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * with the lower-left image pixel stored in the first array position 416afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * (ie. bottom-to-top). 417afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * 418afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Since the only type initially supported is GL_UNSIGNED_BYTE, if the 419afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * context is in RGBA mode, each pixel will be stored as a 4-byte RGBA 420afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * value. If the context is in color indexed mode, each pixel will be 421afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * stored as a 1-byte value. 422afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * 423afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * If the context's viewport hasn't been initialized yet, it will now be 424afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * initialized to (0,0,width,height). 425afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * 426afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Input: ctx - the rendering context 427afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * buffer - the image buffer memory 428afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * type - data type for pixel components, only GL_UNSIGNED_BYTE 429afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * supported now 430afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * width, height - size of image buffer in pixels, at least 1 431afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Return: GL_TRUE if success, GL_FALSE if error because of invalid ctx, 432afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * invalid buffer address, type!=GL_UNSIGNED_BYTE, width<1, height<1, 433afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * width>internal limit or height>internal limit. 434afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */ 435d3c070ca6a36daa765b1ad7f44e03e6671ad0490Brian PaulGLboolean GLAPIENTRY 436d3c070ca6a36daa765b1ad7f44e03e6671ad0490Brian PaulOSMesaMakeCurrent( OSMesaContext ctx, void *buffer, GLenum type, 437d3c070ca6a36daa765b1ad7f44e03e6671ad0490Brian Paul GLsizei width, GLsizei height ) 438afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 439afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (!ctx || !buffer || type!=GL_UNSIGNED_BYTE 440afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg || width<1 || height<1 || width>MAX_WIDTH || height>MAX_HEIGHT) { 441afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return GL_FALSE; 442afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 443afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 444304357dcd496f7ebf499fd9c77b4eba83a75abd5Brian Paul osmesa_update_state( &ctx->gl_ctx ); 445b1394fa92aaaf859ce9efc8b5fc194397921320cBrian Paul _mesa_make_current( &ctx->gl_ctx, ctx->gl_buffer ); 446afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 447afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ctx->buffer = buffer; 448afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ctx->width = width; 449afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ctx->height = height; 450afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (ctx->userRowLength) 451afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ctx->rowlength = ctx->userRowLength; 452afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg else 453afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ctx->rowlength = width; 454afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 455afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg compute_row_addresses( ctx ); 456afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 457afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg /* init viewport */ 458304357dcd496f7ebf499fd9c77b4eba83a75abd5Brian Paul if (ctx->gl_ctx.Viewport.Width==0) { 459afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg /* initialize viewport and scissor box to buffer size */ 460cb5ecb883eb3be842ef44c61df8d4b527877c858Brian Paul _mesa_Viewport( 0, 0, width, height ); 461304357dcd496f7ebf499fd9c77b4eba83a75abd5Brian Paul ctx->gl_ctx.Scissor.Width = width; 462304357dcd496f7ebf499fd9c77b4eba83a75abd5Brian Paul ctx->gl_ctx.Scissor.Height = height; 463afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 464afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 465afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return GL_TRUE; 466afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 467afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 468afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 469afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 470afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgOSMesaContext GLAPIENTRY OSMesaGetCurrentContext( void ) 471afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 472b1394fa92aaaf859ce9efc8b5fc194397921320cBrian Paul GLcontext *ctx = _mesa_get_current_context(); 473d3c070ca6a36daa765b1ad7f44e03e6671ad0490Brian Paul if (ctx) 474304357dcd496f7ebf499fd9c77b4eba83a75abd5Brian Paul return (OSMesaContext) ctx; 475d3c070ca6a36daa765b1ad7f44e03e6671ad0490Brian Paul else 476d3c070ca6a36daa765b1ad7f44e03e6671ad0490Brian Paul return NULL; 477afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 478afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 479afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 480afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 481afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgvoid GLAPIENTRY OSMesaPixelStore( GLint pname, GLint value ) 482afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 483afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg OSMesaContext ctx = OSMesaGetCurrentContext(); 484afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 485afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg switch (pname) { 486afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case OSMESA_ROW_LENGTH: 487afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (value<0) { 488304357dcd496f7ebf499fd9c77b4eba83a75abd5Brian Paul gl_error( &ctx->gl_ctx, GL_INVALID_VALUE, 489afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg "OSMesaPixelStore(value)" ); 490afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return; 491afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 492afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ctx->userRowLength = value; 493afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ctx->rowlength = value; 494afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg break; 495afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case OSMESA_Y_UP: 496afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ctx->yup = value ? GL_TRUE : GL_FALSE; 497afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg break; 498afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg default: 499304357dcd496f7ebf499fd9c77b4eba83a75abd5Brian Paul gl_error( &ctx->gl_ctx, GL_INVALID_ENUM, "OSMesaPixelStore(pname)" ); 500afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return; 501afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 502afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 503afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg compute_row_addresses( ctx ); 504afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 505afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 506afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 507afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgvoid GLAPIENTRY OSMesaGetIntegerv( GLint pname, GLint *value ) 508afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 509afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg OSMesaContext ctx = OSMesaGetCurrentContext(); 510afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 511afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg switch (pname) { 512afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case OSMESA_WIDTH: 513afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg *value = ctx->width; 514afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return; 515afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case OSMESA_HEIGHT: 516afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg *value = ctx->height; 517afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return; 518afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case OSMESA_FORMAT: 519afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg *value = ctx->format; 520afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return; 521afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case OSMESA_TYPE: 522afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg *value = GL_UNSIGNED_BYTE; 523afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return; 524afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case OSMESA_ROW_LENGTH: 525afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg *value = ctx->rowlength; 526afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return; 527afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case OSMESA_Y_UP: 528afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg *value = ctx->yup; 529afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return; 530afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg default: 531304357dcd496f7ebf499fd9c77b4eba83a75abd5Brian Paul gl_error(&ctx->gl_ctx, GL_INVALID_ENUM, "OSMesaGetIntergerv(pname)"); 532afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return; 533afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 534afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 535afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 536afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/* 537afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Return the depth buffer associated with an OSMesa context. 538afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Input: c - the OSMesa context 539afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Output: width, height - size of buffer in pixels 540afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * bytesPerValue - bytes per depth value (2 or 4) 541afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * buffer - pointer to depth buffer values 542afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Return: GL_TRUE or GL_FALSE to indicate success or failure. 543afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */ 5447e67fb41fb54e050f6983b4de09ed3a317d6148fBrian PaulGLboolean GLAPIENTRY 5457e67fb41fb54e050f6983b4de09ed3a317d6148fBrian PaulOSMesaGetDepthBuffer( OSMesaContext c, GLint *width, GLint *height, 5467e67fb41fb54e050f6983b4de09ed3a317d6148fBrian Paul GLint *bytesPerValue, void **buffer ) 547afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 548650cb74bcb913d2589355d56a14da1ab0307d1fcBrian Paul if ((!c->gl_buffer) || (!c->gl_buffer->DepthBuffer)) { 549afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg *width = 0; 550afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg *height = 0; 551afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg *bytesPerValue = 0; 552afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg *buffer = 0; 553afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return GL_FALSE; 554afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 555afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg else { 556afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg *width = c->gl_buffer->Width; 557afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg *height = c->gl_buffer->Height; 558afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg *bytesPerValue = sizeof(GLdepth); 559650cb74bcb913d2589355d56a14da1ab0307d1fcBrian Paul *buffer = c->gl_buffer->DepthBuffer; 560afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return GL_TRUE; 561afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 562afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 563afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 56423ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank/* 56523ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank * Return the color buffer associated with an OSMesa context. 56623ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank * Input: c - the OSMesa context 56723ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank * Output: width, height - size of buffer in pixels 56823ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank * format - the pixel format (OSMESA_FORMAT) 56923ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank * buffer - pointer to color buffer values 57023ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank * Return: GL_TRUE or GL_FALSE to indicate success or failure. 57123ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank */ 5727e67fb41fb54e050f6983b4de09ed3a317d6148fBrian PaulGLboolean GLAPIENTRY 5737e67fb41fb54e050f6983b4de09ed3a317d6148fBrian PaulOSMesaGetColorBuffer( OSMesaContext c, GLint *width, 5747e67fb41fb54e050f6983b4de09ed3a317d6148fBrian Paul GLint *height, GLint *format, void **buffer ) 57523ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank{ 57623ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank if (!c->buffer) { 57723ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank *width = 0; 57823ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank *height = 0; 57923ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank *format = 0; 58023ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank *buffer = 0; 58123ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank return GL_FALSE; 5827e67fb41fb54e050f6983b4de09ed3a317d6148fBrian Paul } 5837e67fb41fb54e050f6983b4de09ed3a317d6148fBrian Paul else { 58423ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank *width = c->width; 58523ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank *height = c->height; 58623ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank *format = c->format; 58723ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank *buffer = c->buffer; 58823ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank return GL_TRUE; 58923ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank } 59023ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank} 591afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 592afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/**********************************************************************/ 593afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/*** Device Driver Functions ***/ 594afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/**********************************************************************/ 595afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 596afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 597afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/* 598afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Useful macros: 599afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */ 600afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#define PACK_RGBA(R,G,B,A) ( ((R) << osmesa->rshift) \ 601afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg | ((G) << osmesa->gshift) \ 602afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg | ((B) << osmesa->bshift) \ 603afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg | ((A) << osmesa->ashift) ) 604afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 605afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#define PACK_RGBA2(R,G,B,A) ( ((R) << rshift) \ 606afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg | ((G) << gshift) \ 607afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg | ((B) << bshift) \ 608afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg | ((A) << ashift) ) 609afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 610afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#define UNPACK_RED(P) (((P) >> osmesa->rshift) & 0xff) 611afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#define UNPACK_GREEN(P) (((P) >> osmesa->gshift) & 0xff) 612afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#define UNPACK_BLUE(P) (((P) >> osmesa->bshift) & 0xff) 613afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#define UNPACK_ALPHA(P) (((P) >> osmesa->ashift) & 0xff) 614afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 615afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#define PIXELADDR1(X,Y) ((GLubyte *) osmesa->rowaddr[Y] + (X)) 616afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#define PIXELADDR3(X,Y) ((GLubyte *) osmesa->rowaddr[Y] + ((X)*3)) 617afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#define PIXELADDR4(X,Y) ((GLuint *) osmesa->rowaddr[Y] + (X)) 618afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 619afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 620afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 621afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 622cea0e8e6700e871bb9bcb334cb75fbfbfcdfd702Brian Paulstatic GLboolean set_draw_buffer( GLcontext *ctx, GLenum mode ) 623afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 624afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg (void) ctx; 625afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (mode==GL_FRONT_LEFT) { 626afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return GL_TRUE; 627afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 628afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg else { 629afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return GL_FALSE; 630afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 631afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 632afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 633afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 634cea0e8e6700e871bb9bcb334cb75fbfbfcdfd702Brian Paulstatic void set_read_buffer( GLcontext *ctx, GLframebuffer *buffer, GLenum mode ) 635cea0e8e6700e871bb9bcb334cb75fbfbfcdfd702Brian Paul{ 636cea0e8e6700e871bb9bcb334cb75fbfbfcdfd702Brian Paul /* separate read buffer not supported */ 637cea0e8e6700e871bb9bcb334cb75fbfbfcdfd702Brian Paul ASSERT(buffer == ctx->DrawBuffer); 638cea0e8e6700e871bb9bcb334cb75fbfbfcdfd702Brian Paul ASSERT(mode == GL_FRONT_LEFT); 639cea0e8e6700e871bb9bcb334cb75fbfbfcdfd702Brian Paul} 640cea0e8e6700e871bb9bcb334cb75fbfbfcdfd702Brian Paul 641cea0e8e6700e871bb9bcb334cb75fbfbfcdfd702Brian Paul 642afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgstatic void clear_index( GLcontext *ctx, GLuint index ) 643afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 644c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul OSMesaContext osmesa = OSMESA_CONTEXT(ctx); 645afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg osmesa->clearpixel = index; 646afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 647afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 648afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 649afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 650afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgstatic void clear_color( GLcontext *ctx, 6519499e017b7e05411a32b3e4fa94885eaec0d7277Brian Paul GLchan r, GLchan g, GLchan b, GLchan a ) 652afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 653c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul OSMesaContext osmesa = OSMESA_CONTEXT(ctx); 654afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg osmesa->clearpixel = PACK_RGBA( r, g, b, a ); 655afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 656afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 657afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 658afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 659afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgstatic GLbitfield clear( GLcontext *ctx, GLbitfield mask, GLboolean all, 660afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLint x, GLint y, GLint width, GLint height ) 661afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 662c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul OSMesaContext osmesa = OSMESA_CONTEXT(ctx); 663dd020f13a6d520b46aefd4453dae6b6edcc427f6Brian Paul const GLuint *colorMask = (GLuint *) &ctx->Color.ColorMask; 664dd020f13a6d520b46aefd4453dae6b6edcc427f6Brian Paul 665dd020f13a6d520b46aefd4453dae6b6edcc427f6Brian Paul /* we can't handle color or index masking */ 666dd020f13a6d520b46aefd4453dae6b6edcc427f6Brian Paul if (*colorMask != 0xffffffff || ctx->Color.IndexMask != 0xffffffff) 667dd020f13a6d520b46aefd4453dae6b6edcc427f6Brian Paul return mask; 668dd020f13a6d520b46aefd4453dae6b6edcc427f6Brian Paul 669dd020f13a6d520b46aefd4453dae6b6edcc427f6Brian Paul /* sanity check - we only have a front-left buffer */ 670dd020f13a6d520b46aefd4453dae6b6edcc427f6Brian Paul ASSERT((mask & (DD_FRONT_RIGHT_BIT | DD_BACK_LEFT_BIT | DD_BACK_RIGHT_BIT)) == 0); 671dd020f13a6d520b46aefd4453dae6b6edcc427f6Brian Paul 672dd020f13a6d520b46aefd4453dae6b6edcc427f6Brian Paul if (mask & DD_FRONT_LEFT_BIT) { 673afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (osmesa->format==OSMESA_COLOR_INDEX) { 674afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (all) { 675afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg /* Clear whole CI buffer */ 676afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg MEMSET(osmesa->buffer, osmesa->clearpixel, 677afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg osmesa->rowlength * osmesa->height); 678afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 679afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg else { 680afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg /* Clear part of CI buffer */ 681afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLint i, j; 682afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg for (i=0;i<height;i++) { 683afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLubyte *ptr1 = PIXELADDR1( x, (y+i) ); 684afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg for (j=0;j<width;j++) { 685afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg *ptr1++ = osmesa->clearpixel; 686afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 687afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 688afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 689afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 690afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg else if ((osmesa->format==OSMESA_RGB)||(osmesa->format==OSMESA_BGR)) { 691afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLubyte rval = UNPACK_RED(osmesa->clearpixel); 692afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLubyte gval = UNPACK_GREEN(osmesa->clearpixel); 693afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLubyte bval = UNPACK_BLUE(osmesa->clearpixel); 694afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLint rind = osmesa->rind; 695afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLint gind = osmesa->gind; 696afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLint bind = osmesa->bind; 697afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (all) { 698afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLuint i, n; 699afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLubyte *ptr3 = (GLubyte *) osmesa->buffer; 700afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg /* Clear whole RGB buffer */ 701afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg n = osmesa->rowlength * osmesa->height; 702afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg for (i=0;i<n;i++) { 703afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ptr3[rind] = rval; 704afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ptr3[gind] = gval; 705afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ptr3[bind] = bval; 706afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ptr3 += 3; 707afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 708afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 709afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg else { 710afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg /* Clear part of RGB buffer */ 711afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLint i, j; 712afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg for (i=0;i<height;i++) { 713afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLubyte *ptr3 = PIXELADDR3( x, (y+i) ); 714afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg for (j=0;j<width;j++) { 715afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ptr3[rind] = rval; 716afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ptr3[gind] = gval; 717afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ptr3[bind] = bval; 718afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ptr3 += 3; 719afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 720afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 721afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 722afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 723afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg else { 724afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (all) { 725afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg /* Clear whole RGBA buffer */ 726afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLuint i, n, *ptr4; 727afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg n = osmesa->rowlength * osmesa->height; 728afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ptr4 = (GLuint *) osmesa->buffer; 729941dcc797e1a6317808c1ec43476817286d576baBrian Paul if (osmesa->clearpixel) { 730941dcc797e1a6317808c1ec43476817286d576baBrian Paul for (i=0;i<n;i++) { 731941dcc797e1a6317808c1ec43476817286d576baBrian Paul *ptr4++ = osmesa->clearpixel; 732941dcc797e1a6317808c1ec43476817286d576baBrian Paul } 733941dcc797e1a6317808c1ec43476817286d576baBrian Paul } 734941dcc797e1a6317808c1ec43476817286d576baBrian Paul else { 735941dcc797e1a6317808c1ec43476817286d576baBrian Paul BZERO(ptr4, n * sizeof(GLuint)); 736afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 737afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 738afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg else { 739afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg /* Clear part of RGBA buffer */ 740afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLint i, j; 741afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg for (i=0;i<height;i++) { 742afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLuint *ptr4 = PIXELADDR4( x, (y+i) ); 743afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg for (j=0;j<width;j++) { 744afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg *ptr4++ = osmesa->clearpixel; 745afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 746afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 747afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 748afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 749afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 750dd020f13a6d520b46aefd4453dae6b6edcc427f6Brian Paul /* have Mesa clear all other buffers */ 751dd020f13a6d520b46aefd4453dae6b6edcc427f6Brian Paul return mask & (~DD_FRONT_LEFT_BIT); 752afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 753afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 754afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 755afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 756afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgstatic void set_index( GLcontext *ctx, GLuint index ) 757afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 758c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul OSMesaContext osmesa = OSMESA_CONTEXT(ctx); 759afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg osmesa->pixel = index; 760afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 761afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 762afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 763afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 764afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgstatic void set_color( GLcontext *ctx, 7659499e017b7e05411a32b3e4fa94885eaec0d7277Brian Paul GLchan r, GLchan g, GLchan b, GLchan a ) 766afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 767c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul OSMesaContext osmesa = OSMESA_CONTEXT(ctx); 768afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg osmesa->pixel = PACK_RGBA( r, g, b, a ); 769afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 770afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 771afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 772afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 773afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgstatic void buffer_size( GLcontext *ctx, GLuint *width, GLuint *height ) 774afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 775c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul OSMesaContext osmesa = OSMESA_CONTEXT(ctx); 776afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg *width = osmesa->width; 777afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg *height = osmesa->height; 778afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 779afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 780afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 781afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/**********************************************************************/ 782afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/***** Read/write spans/arrays of RGBA pixels *****/ 783afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/**********************************************************************/ 784afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 785afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/* Write RGBA pixels to an RGBA (or permuted) buffer. */ 786afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgstatic void write_rgba_span( const GLcontext *ctx, 787afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLuint n, GLint x, GLint y, 7889499e017b7e05411a32b3e4fa94885eaec0d7277Brian Paul CONST GLchan rgba[][4], const GLubyte mask[] ) 789afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 790c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul OSMesaContext osmesa = OSMESA_CONTEXT(ctx); 791afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLuint *ptr4 = PIXELADDR4( x, y ); 792afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLuint i; 793afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLint rshift = osmesa->rshift; 794afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLint gshift = osmesa->gshift; 795afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLint bshift = osmesa->bshift; 796afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLint ashift = osmesa->ashift; 797afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (mask) { 798afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg for (i=0;i<n;i++,ptr4++) { 799afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (mask[i]) { 800afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg *ptr4 = PACK_RGBA2( rgba[i][RCOMP], rgba[i][GCOMP], rgba[i][BCOMP], rgba[i][ACOMP] ); 801afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 802afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 803afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 804afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg else { 805afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg for (i=0;i<n;i++,ptr4++) { 806afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg *ptr4 = PACK_RGBA2( rgba[i][RCOMP], rgba[i][GCOMP], rgba[i][BCOMP], rgba[i][ACOMP] ); 807afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 808afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 809afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 810afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 811afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 812afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/* Write RGBA pixels to an RGBA buffer. This is the fastest span-writer. */ 813afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgstatic void write_rgba_span_rgba( const GLcontext *ctx, 814afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLuint n, GLint x, GLint y, 8159499e017b7e05411a32b3e4fa94885eaec0d7277Brian Paul CONST GLchan rgba[][4], 816afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg const GLubyte mask[] ) 817afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 818c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul OSMesaContext osmesa = OSMESA_CONTEXT(ctx); 819afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLuint *ptr4 = PIXELADDR4( x, y ); 820afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg const GLuint *rgba4 = (const GLuint *) rgba; 821afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLuint i; 822afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (mask) { 823afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg for (i=0;i<n;i++) { 824afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (mask[i]) { 825afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ptr4[i] = rgba4[i]; 826afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 827afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 828afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 829afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg else { 830afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg MEMCPY( ptr4, rgba4, n * 4 ); 831afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 832afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 833afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 834afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 835afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/* Write RGB pixels to an RGBA (or permuted) buffer. */ 836afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgstatic void write_rgb_span( const GLcontext *ctx, 837afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLuint n, GLint x, GLint y, 8389499e017b7e05411a32b3e4fa94885eaec0d7277Brian Paul CONST GLchan rgb[][3], const GLubyte mask[] ) 839afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 840c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul OSMesaContext osmesa = OSMESA_CONTEXT(ctx); 841afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLuint *ptr4 = PIXELADDR4( x, y ); 842afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLuint i; 843afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLint rshift = osmesa->rshift; 844afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLint gshift = osmesa->gshift; 845afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLint bshift = osmesa->bshift; 846afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLint ashift = osmesa->ashift; 847afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (mask) { 848afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg for (i=0;i<n;i++,ptr4++) { 849afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (mask[i]) { 850afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg *ptr4 = PACK_RGBA2( rgb[i][RCOMP], rgb[i][GCOMP], rgb[i][BCOMP], 255 ); 851afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 852afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 853afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 854afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg else { 855afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg for (i=0;i<n;i++,ptr4++) { 856afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg *ptr4 = PACK_RGBA2( rgb[i][RCOMP], rgb[i][GCOMP], rgb[i][BCOMP], 255); 857afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 858afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 859afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 860afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 861afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 862afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 863afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgstatic void write_monocolor_span( const GLcontext *ctx, 864afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLuint n, GLint x, GLint y, 865c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul const GLchan color[4], const GLubyte mask[] ) 866afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 867c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul const OSMesaContext osmesa = OSMESA_CONTEXT(ctx); 868c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul const GLuint pixel = PACK_RGBA(color[RCOMP], color[GCOMP], 869c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul color[BCOMP], color[ACOMP]); 870afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLuint *ptr4 = PIXELADDR4(x,y); 871afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLuint i; 872afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg for (i=0;i<n;i++,ptr4++) { 873afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (mask[i]) { 874c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul *ptr4 = pixel; 875afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 876afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 877afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 878afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 879afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 880afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 881afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgstatic void write_rgba_pixels( const GLcontext *ctx, 882afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLuint n, const GLint x[], const GLint y[], 8839499e017b7e05411a32b3e4fa94885eaec0d7277Brian Paul CONST GLchan rgba[][4], const GLubyte mask[] ) 884afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 885c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul OSMesaContext osmesa = OSMESA_CONTEXT(ctx); 886afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLuint i; 887afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLint rshift = osmesa->rshift; 888afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLint gshift = osmesa->gshift; 889afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLint bshift = osmesa->bshift; 890afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLint ashift = osmesa->ashift; 891afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg for (i=0;i<n;i++) { 892afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (mask[i]) { 893afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLuint *ptr4 = PIXELADDR4(x[i],y[i]); 894afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg *ptr4 = PACK_RGBA2( rgba[i][RCOMP], rgba[i][GCOMP], rgba[i][BCOMP], rgba[i][ACOMP] ); 895afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 896afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 897afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 898afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 899afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 900afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 901afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgstatic void write_monocolor_pixels( const GLcontext *ctx, 902afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLuint n, const GLint x[], const GLint y[], 903c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul const GLchan color[4], 904c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul const GLubyte mask[] ) 905afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 906c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul OSMesaContext osmesa = OSMESA_CONTEXT(ctx); 907c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul const GLuint pixel = PACK_RGBA(color[RCOMP], color[GCOMP], 908c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul color[BCOMP], color[ACOMP]); 909afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLuint i; 910afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg for (i=0;i<n;i++) { 911afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (mask[i]) { 912afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLuint *ptr4 = PIXELADDR4(x[i],y[i]); 913c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul *ptr4 = pixel; 914afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 915afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 916afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 917afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 918afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 919afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgstatic void read_rgba_span( const GLcontext *ctx, GLuint n, GLint x, GLint y, 9209499e017b7e05411a32b3e4fa94885eaec0d7277Brian Paul GLchan rgba[][4] ) 921afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 922c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul OSMesaContext osmesa = OSMESA_CONTEXT(ctx); 923afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLuint i; 924afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLuint *ptr4 = PIXELADDR4(x,y); 925afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg for (i=0;i<n;i++) { 926afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLuint pixel = *ptr4++; 927afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg rgba[i][RCOMP] = UNPACK_RED(pixel); 928afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg rgba[i][GCOMP] = UNPACK_GREEN(pixel); 929afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg rgba[i][BCOMP] = UNPACK_BLUE(pixel); 930afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg rgba[i][ACOMP] = UNPACK_ALPHA(pixel); 931afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 932afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 933afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 934afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 935afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/* Read RGBA pixels from an RGBA buffer */ 936afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgstatic void read_rgba_span_rgba( const GLcontext *ctx, 937afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLuint n, GLint x, GLint y, 9389499e017b7e05411a32b3e4fa94885eaec0d7277Brian Paul GLchan rgba[][4] ) 939afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 940c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul OSMesaContext osmesa = OSMESA_CONTEXT(ctx); 941afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLuint *ptr4 = PIXELADDR4(x,y); 9429499e017b7e05411a32b3e4fa94885eaec0d7277Brian Paul MEMCPY( rgba, ptr4, n * 4 * sizeof(GLchan) ); 943afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 944afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 945afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 946afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgstatic void read_rgba_pixels( const GLcontext *ctx, 947afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLuint n, const GLint x[], const GLint y[], 9489499e017b7e05411a32b3e4fa94885eaec0d7277Brian Paul GLchan rgba[][4], const GLubyte mask[] ) 949afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 950c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul OSMesaContext osmesa = OSMESA_CONTEXT(ctx); 951afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLuint i; 952afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg for (i=0;i<n;i++) { 953afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (mask[i]) { 954afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLuint *ptr4 = PIXELADDR4(x[i],y[i]); 955afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLuint pixel = *ptr4; 956afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg rgba[i][RCOMP] = UNPACK_RED(pixel); 957afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg rgba[i][GCOMP] = UNPACK_GREEN(pixel); 958afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg rgba[i][BCOMP] = UNPACK_BLUE(pixel); 959afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg rgba[i][ACOMP] = UNPACK_ALPHA(pixel); 960afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 961afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 962afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 963afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 964afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/**********************************************************************/ 965afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/***** 3 byte RGB pixel support funcs *****/ 966afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/**********************************************************************/ 967afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 968afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/* Write RGBA pixels to an RGB or BGR buffer. */ 969afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgstatic void write_rgba_span3( const GLcontext *ctx, 970afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLuint n, GLint x, GLint y, 9719499e017b7e05411a32b3e4fa94885eaec0d7277Brian Paul CONST GLchan rgba[][4], const GLubyte mask[] ) 972afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 973c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul OSMesaContext osmesa = OSMESA_CONTEXT(ctx); 974afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLubyte *ptr3 = PIXELADDR3( x, y); 975afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLuint i; 976afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLint rind = osmesa->rind; 977afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLint gind = osmesa->gind; 978afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLint bind = osmesa->bind; 979afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (mask) { 980afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg for (i=0;i<n;i++,ptr3+=3) { 981afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (mask[i]) { 982afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ptr3[rind] = rgba[i][RCOMP]; 983afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ptr3[gind] = rgba[i][GCOMP]; 984afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ptr3[bind] = rgba[i][BCOMP]; 985afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 986afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 987afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 988afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg else { 989afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg for (i=0;i<n;i++,ptr3+=3) { 990afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ptr3[rind] = rgba[i][RCOMP]; 991afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ptr3[gind] = rgba[i][GCOMP]; 992afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ptr3[bind] = rgba[i][BCOMP]; 993afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 994afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 995afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 996afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 997afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/* Write RGB pixels to an RGB or BGR buffer. */ 998afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgstatic void write_rgb_span3( const GLcontext *ctx, 999afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLuint n, GLint x, GLint y, 10009499e017b7e05411a32b3e4fa94885eaec0d7277Brian Paul CONST GLchan rgb[][3], const GLubyte mask[] ) 1001afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 1002c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul const OSMesaContext osmesa = OSMESA_CONTEXT(ctx); 1003c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul const GLint rind = osmesa->rind; 1004c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul const GLint gind = osmesa->gind; 1005c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul const GLint bind = osmesa->bind; 1006afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLubyte *ptr3 = PIXELADDR3( x, y); 1007afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLuint i; 1008afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (mask) { 1009afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg for (i=0;i<n;i++,ptr3+=3) { 1010afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (mask[i]) { 1011afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ptr3[rind] = rgb[i][RCOMP]; 1012afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ptr3[gind] = rgb[i][GCOMP]; 1013afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ptr3[bind] = rgb[i][BCOMP]; 1014afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1015afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1016afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1017afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg else { 1018afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg for (i=0;i<n;i++,ptr3+=3) { 1019afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ptr3[rind] = rgb[i][RCOMP]; 1020afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ptr3[gind] = rgb[i][GCOMP]; 1021afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ptr3[bind] = rgb[i][BCOMP]; 1022afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1023afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1024afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 1025afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1026afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1027afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgstatic void write_monocolor_span3( const GLcontext *ctx, 1028c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul GLuint n, GLint x, GLint y, 1029c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul const GLchan color[4], const GLubyte mask[] ) 1030afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 1031c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul const OSMesaContext osmesa = OSMESA_CONTEXT(ctx); 1032c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul const GLubyte rval = color[RCOMP]; 1033c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul const GLubyte gval = color[GCOMP]; 1034c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul const GLubyte bval = color[BCOMP]; 1035c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul const GLint rind = osmesa->rind; 1036c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul const GLint gind = osmesa->gind; 1037c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul const GLint bind = osmesa->bind; 1038afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLubyte *ptr3 = PIXELADDR3( x, y); 1039afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLuint i; 1040afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg for (i=0;i<n;i++,ptr3+=3) { 1041afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (mask[i]) { 1042afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ptr3[rind] = rval; 1043afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ptr3[gind] = gval; 1044afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ptr3[bind] = bval; 1045afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1046afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1047afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 1048afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1049afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgstatic void write_rgba_pixels3( const GLcontext *ctx, 1050afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLuint n, const GLint x[], const GLint y[], 10519499e017b7e05411a32b3e4fa94885eaec0d7277Brian Paul CONST GLchan rgba[][4], const GLubyte mask[] ) 1052afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 1053c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul const OSMesaContext osmesa = (const OSMesaContext) ctx; 1054afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLuint i; 1055afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLint rind = osmesa->rind; 1056afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLint gind = osmesa->gind; 1057afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLint bind = osmesa->bind; 1058afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg for (i=0;i<n;i++) { 1059afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (mask[i]) { 1060afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLubyte *ptr3 = PIXELADDR3(x[i],y[i]); 1061afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ptr3[rind] = rgba[i][RCOMP]; 1062afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ptr3[gind] = rgba[i][GCOMP]; 1063afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ptr3[bind] = rgba[i][BCOMP]; 1064afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1065afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1066afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 1067afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1068afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgstatic void write_monocolor_pixels3( const GLcontext *ctx, 1069c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul GLuint n, const GLint x[], 1070c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul const GLint y[], 1071c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul const GLchan color[4], 1072c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul const GLubyte mask[] ) 1073afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 1074c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul const OSMesaContext osmesa = OSMESA_CONTEXT(ctx); 1075c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul const GLint rind = osmesa->rind; 1076c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul const GLint gind = osmesa->gind; 1077c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul const GLint bind = osmesa->bind; 1078c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul const GLubyte rval = color[RCOMP]; 1079c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul const GLubyte gval = color[GCOMP]; 1080c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul const GLubyte bval = color[BCOMP]; 1081afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLuint i; 1082afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg for (i=0;i<n;i++) { 1083afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (mask[i]) { 1084afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLubyte *ptr3 = PIXELADDR3(x[i],y[i]); 1085afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ptr3[rind] = rval; 1086afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ptr3[gind] = gval; 1087afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ptr3[bind] = bval; 1088afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1089afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1090afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 1091afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1092afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgstatic void read_rgba_span3( const GLcontext *ctx, 1093afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLuint n, GLint x, GLint y, 10949499e017b7e05411a32b3e4fa94885eaec0d7277Brian Paul GLchan rgba[][4] ) 1095afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 1096c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul OSMesaContext osmesa = OSMESA_CONTEXT(ctx); 1097afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLuint i; 1098afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLint rind = osmesa->rind; 1099afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLint gind = osmesa->gind; 1100afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLint bind = osmesa->bind; 11017e67fb41fb54e050f6983b4de09ed3a317d6148fBrian Paul const GLubyte *ptr3 = PIXELADDR3( x, y); 1102afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg for (i=0;i<n;i++,ptr3+=3) { 1103afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg rgba[i][RCOMP] = ptr3[rind]; 1104afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg rgba[i][GCOMP] = ptr3[gind]; 1105afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg rgba[i][BCOMP] = ptr3[bind]; 1106afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg rgba[i][ACOMP] = 0; 1107afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1108afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 1109afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1110afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgstatic void read_rgba_pixels3( const GLcontext *ctx, 1111afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLuint n, const GLint x[], const GLint y[], 11129499e017b7e05411a32b3e4fa94885eaec0d7277Brian Paul GLchan rgba[][4], const GLubyte mask[] ) 1113afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 1114c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul OSMesaContext osmesa = OSMESA_CONTEXT(ctx); 1115afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLuint i; 1116afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLint rind = osmesa->rind; 1117afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLint gind = osmesa->gind; 1118afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLint bind = osmesa->bind; 1119afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg for (i=0;i<n;i++) { 1120afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (mask[i]) { 11217e67fb41fb54e050f6983b4de09ed3a317d6148fBrian Paul const GLubyte *ptr3 = PIXELADDR3(x[i],y[i]); 1122afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg rgba[i][RCOMP] = ptr3[rind]; 1123afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg rgba[i][GCOMP] = ptr3[gind]; 1124afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg rgba[i][BCOMP] = ptr3[bind]; 1125afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg rgba[i][ACOMP] = 0; 1126afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1127afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1128afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 1129afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1130afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1131afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/**********************************************************************/ 1132afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/***** Read/write spans/arrays of CI pixels *****/ 1133afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/**********************************************************************/ 1134afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1135afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/* Write 32-bit color index to buffer */ 1136afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgstatic void write_index32_span( const GLcontext *ctx, 1137afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLuint n, GLint x, GLint y, 1138afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg const GLuint index[], const GLubyte mask[] ) 1139afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 1140c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul OSMesaContext osmesa = OSMESA_CONTEXT(ctx); 1141afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLubyte *ptr1 = PIXELADDR1(x,y); 1142afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLuint i; 1143afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (mask) { 1144afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg for (i=0;i<n;i++,ptr1++) { 1145afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (mask[i]) { 1146afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg *ptr1 = (GLubyte) index[i]; 1147afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1148afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1149afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1150afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg else { 1151afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg for (i=0;i<n;i++,ptr1++) { 1152afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg *ptr1 = (GLubyte) index[i]; 1153afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1154afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1155afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 1156afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1157afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1158afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/* Write 8-bit color index to buffer */ 1159afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgstatic void write_index8_span( const GLcontext *ctx, 1160afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLuint n, GLint x, GLint y, 1161afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg const GLubyte index[], const GLubyte mask[] ) 1162afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 1163c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul OSMesaContext osmesa = OSMESA_CONTEXT(ctx); 1164afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLubyte *ptr1 = PIXELADDR1(x,y); 1165afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLuint i; 1166afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (mask) { 1167afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg for (i=0;i<n;i++,ptr1++) { 1168afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (mask[i]) { 1169afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg *ptr1 = (GLubyte) index[i]; 1170afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1171afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1172afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1173afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg else { 1174afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg MEMCPY( ptr1, index, n ); 1175afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1176afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 1177afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1178afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1179afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgstatic void write_monoindex_span( const GLcontext *ctx, 1180afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLuint n, GLint x, GLint y, 1181c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul GLuint colorIndex, const GLubyte mask[] ) 1182afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 1183c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul OSMesaContext osmesa = OSMESA_CONTEXT(ctx); 1184afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLubyte *ptr1 = PIXELADDR1(x,y); 1185afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLuint i; 1186afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg for (i=0;i<n;i++,ptr1++) { 1187afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (mask[i]) { 1188c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul *ptr1 = (GLubyte) colorIndex; 1189afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1190afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1191afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 1192afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1193afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1194afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgstatic void write_index_pixels( const GLcontext *ctx, 1195afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLuint n, const GLint x[], const GLint y[], 1196afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg const GLuint index[], const GLubyte mask[] ) 1197afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 1198c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul OSMesaContext osmesa = OSMESA_CONTEXT(ctx); 1199afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLuint i; 1200afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg for (i=0;i<n;i++) { 1201afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (mask[i]) { 1202afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLubyte *ptr1 = PIXELADDR1(x[i],y[i]); 1203afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg *ptr1 = (GLubyte) index[i]; 1204afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1205afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1206afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 1207afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1208afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1209afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgstatic void write_monoindex_pixels( const GLcontext *ctx, 1210afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLuint n, const GLint x[], const GLint y[], 1211c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul GLuint colorIndex, const GLubyte mask[] ) 1212afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 1213c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul OSMesaContext osmesa = OSMESA_CONTEXT(ctx); 1214afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLuint i; 1215afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg for (i=0;i<n;i++) { 1216afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (mask[i]) { 1217afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLubyte *ptr1 = PIXELADDR1(x[i],y[i]); 1218c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul *ptr1 = (GLubyte) colorIndex; 1219afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1220afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1221afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 1222afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1223afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1224afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgstatic void read_index_span( const GLcontext *ctx, 1225afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLuint n, GLint x, GLint y, GLuint index[] ) 1226afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 1227c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul OSMesaContext osmesa = OSMESA_CONTEXT(ctx); 1228afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLuint i; 12297e67fb41fb54e050f6983b4de09ed3a317d6148fBrian Paul const GLubyte *ptr1 = PIXELADDR1(x,y); 1230afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg for (i=0;i<n;i++,ptr1++) { 1231afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg index[i] = (GLuint) *ptr1; 1232afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1233afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 1234afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1235afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1236afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgstatic void read_index_pixels( const GLcontext *ctx, 1237afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLuint n, const GLint x[], const GLint y[], 1238afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLuint index[], const GLubyte mask[] ) 1239afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 1240c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul OSMesaContext osmesa = OSMESA_CONTEXT(ctx); 1241afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLuint i; 1242afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg for (i=0;i<n;i++) { 1243afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (mask[i] ) { 12447e67fb41fb54e050f6983b4de09ed3a317d6148fBrian Paul const GLubyte *ptr1 = PIXELADDR1(x[i],y[i]); 1245afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg index[i] = (GLuint) *ptr1; 1246afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1247afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1248afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 1249afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1250afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1251afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1252afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/**********************************************************************/ 1253afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/***** Optimized line rendering *****/ 1254afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/**********************************************************************/ 1255afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1256afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1257afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/* 1258afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Draw a flat-shaded, RGB line into an osmesa buffer. 1259afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */ 1260afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgstatic void flat_rgba_line( GLcontext *ctx, 12611e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell SWvertex *vert0, SWvertex *vert1 ) 1262afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 1263c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul OSMesaContext osmesa = OSMESA_CONTEXT(ctx); 12641e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell GLubyte *color = vert0->color; 1265afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg unsigned long pixel = PACK_RGBA( color[0], color[1], color[2], color[3] ); 1266afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1267afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#define INTERP_XY 1 1268afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#define CLIP_HACK 1 1269afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#define PLOT(X,Y) { GLuint *ptr4 = PIXELADDR4(X,Y); *ptr4 = pixel; } 1270afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1271afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#ifdef WIN32 1272724abeb058ca9372c5a9b9e38ee43dde1accaa41Keith Whitwell#include "..\swrast\s_linetemp.h" 1273afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#else 1274724abeb058ca9372c5a9b9e38ee43dde1accaa41Keith Whitwell#include "swrast/s_linetemp.h" 1275afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#endif 1276afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 1277afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1278afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1279afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/* 1280afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Draw a flat-shaded, Z-less, RGB line into an osmesa buffer. 1281afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */ 1282afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgstatic void flat_rgba_z_line( GLcontext *ctx, 12831e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell SWvertex *vert0, SWvertex *vert1 ) 1284afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 1285c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul OSMesaContext osmesa = OSMESA_CONTEXT(ctx); 12861e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell GLubyte *color = vert0->color; 1287afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg unsigned long pixel = PACK_RGBA( color[0], color[1], color[2], color[3] ); 1288afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1289afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#define INTERP_XY 1 1290afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#define INTERP_Z 1 1291ed30dfa1264ec8875a3162c3c8778bc703bf11d5Brian Paul#define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE 1292afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#define CLIP_HACK 1 1293afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#define PLOT(X,Y) \ 1294afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (Z < *zPtr) { \ 1295afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLuint *ptr4 = PIXELADDR4(X,Y); \ 1296afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg *ptr4 = pixel; \ 1297afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg *zPtr = Z; \ 1298afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1299afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1300afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#ifdef WIN32 1301724abeb058ca9372c5a9b9e38ee43dde1accaa41Keith Whitwell#include "..\swrast\s_linetemp.h" 1302afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#else 1303724abeb058ca9372c5a9b9e38ee43dde1accaa41Keith Whitwell#include "swrast/s_linetemp.h" 1304afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#endif 1305afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 1306afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1307afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1308afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/* 1309afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Draw a flat-shaded, alpha-blended, RGB line into an osmesa buffer. 1310afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */ 1311afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgstatic void flat_blend_rgba_line( GLcontext *ctx, 13121e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell SWvertex *vert0, SWvertex *vert1 ) 1313afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 1314c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul OSMesaContext osmesa = OSMESA_CONTEXT(ctx); 1315afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLint rshift = osmesa->rshift; 1316afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLint gshift = osmesa->gshift; 1317afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLint bshift = osmesa->bshift; 13181e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell GLint avalue = vert0->color[3]; 1319afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLint msavalue = 255 - avalue; 13201e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell GLint rvalue = vert0->color[0]*avalue; 13211e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell GLint gvalue = vert0->color[1]*avalue; 13221e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell GLint bvalue = vert0->color[2]*avalue; 1323afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1324afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#define INTERP_XY 1 1325afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#define CLIP_HACK 1 1326afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#define PLOT(X,Y) \ 13277e67fb41fb54e050f6983b4de09ed3a317d6148fBrian Paul { GLuint *ptr4 = PIXELADDR4(X,Y); \ 13287e67fb41fb54e050f6983b4de09ed3a317d6148fBrian Paul GLuint pixel = 0; \ 1329afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg pixel |=((((((*ptr4) >> rshift) & 0xff)*msavalue+rvalue)>>8) << rshift);\ 1330afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg pixel |=((((((*ptr4) >> gshift) & 0xff)*msavalue+gvalue)>>8) << gshift);\ 1331afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg pixel |=((((((*ptr4) >> bshift) & 0xff)*msavalue+bvalue)>>8) << bshift);\ 13327e67fb41fb54e050f6983b4de09ed3a317d6148fBrian Paul *ptr4 = pixel; \ 1333afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1334afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1335afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#ifdef WIN32 1336724abeb058ca9372c5a9b9e38ee43dde1accaa41Keith Whitwell#include "..\swrast\s_linetemp.h" 1337afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#else 1338724abeb058ca9372c5a9b9e38ee43dde1accaa41Keith Whitwell#include "swrast/s_linetemp.h" 1339afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#endif 1340afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 1341afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1342ed30dfa1264ec8875a3162c3c8778bc703bf11d5Brian Paul 1343afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/* 1344afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Draw a flat-shaded, Z-less, alpha-blended, RGB line into an osmesa buffer. 1345afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */ 1346afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgstatic void flat_blend_rgba_z_line( GLcontext *ctx, 13471e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell SWvertex *vert0, SWvertex *vert1 ) 1348afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 1349c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul OSMesaContext osmesa = OSMESA_CONTEXT(ctx); 1350afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLint rshift = osmesa->rshift; 1351afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLint gshift = osmesa->gshift; 1352afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLint bshift = osmesa->bshift; 13531e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell GLint avalue = vert0->color[3]; 1354afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLint msavalue = 256 - avalue; 13551e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell GLint rvalue = vert0->color[0]*avalue; 13561e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell GLint gvalue = vert0->color[1]*avalue; 13571e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell GLint bvalue = vert0->color[2]*avalue; 1358afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1359afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#define INTERP_XY 1 1360afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#define INTERP_Z 1 1361ed30dfa1264ec8875a3162c3c8778bc703bf11d5Brian Paul#define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE 1362afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#define CLIP_HACK 1 13637e67fb41fb54e050f6983b4de09ed3a317d6148fBrian Paul#define PLOT(X,Y) \ 13647e67fb41fb54e050f6983b4de09ed3a317d6148fBrian Paul if (Z < *zPtr) { \ 13657e67fb41fb54e050f6983b4de09ed3a317d6148fBrian Paul GLuint *ptr4 = PIXELADDR4(X,Y); \ 13667e67fb41fb54e050f6983b4de09ed3a317d6148fBrian Paul GLuint pixel = 0; \ 1367ed30dfa1264ec8875a3162c3c8778bc703bf11d5Brian Paul pixel |=((((((*ptr4) >> rshift) & 0xff)*msavalue+rvalue)>>8) << rshift); \ 1368ed30dfa1264ec8875a3162c3c8778bc703bf11d5Brian Paul pixel |=((((((*ptr4) >> gshift) & 0xff)*msavalue+gvalue)>>8) << gshift); \ 1369ed30dfa1264ec8875a3162c3c8778bc703bf11d5Brian Paul pixel |=((((((*ptr4) >> bshift) & 0xff)*msavalue+bvalue)>>8) << bshift); \ 13707e67fb41fb54e050f6983b4de09ed3a317d6148fBrian Paul *ptr4 = pixel; \ 1371afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1372afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1373afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#ifdef WIN32 1374724abeb058ca9372c5a9b9e38ee43dde1accaa41Keith Whitwell#include "..\swrast\s_linetemp.h" 1375afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#else 1376724abeb058ca9372c5a9b9e38ee43dde1accaa41Keith Whitwell#include "swrast/s_linetemp.h" 1377afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#endif 1378afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 1379afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1380ed30dfa1264ec8875a3162c3c8778bc703bf11d5Brian Paul 1381afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/* 1382afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Draw a flat-shaded, Z-less, alpha-blended, RGB line into an osmesa buffer. 1383afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */ 1384afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgstatic void flat_blend_rgba_z_line_write( GLcontext *ctx, 13851e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell SWvertex *vert0, SWvertex *vert1 ) 1386afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 1387c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul OSMesaContext osmesa = OSMESA_CONTEXT(ctx); 1388afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLint rshift = osmesa->rshift; 1389afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLint gshift = osmesa->gshift; 1390afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLint bshift = osmesa->bshift; 13911e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell GLint avalue = vert0->color[3]; 1392afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLint msavalue = 256 - avalue; 13931e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell GLint rvalue = vert0->color[0]*avalue; 13941e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell GLint gvalue = vert0->color[1]*avalue; 13951e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell GLint bvalue = vert0->color[2]*avalue; 1396afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1397afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#define INTERP_XY 1 1398afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#define INTERP_Z 1 1399ed30dfa1264ec8875a3162c3c8778bc703bf11d5Brian Paul#define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE 1400afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#define CLIP_HACK 1 14017e67fb41fb54e050f6983b4de09ed3a317d6148fBrian Paul#define PLOT(X,Y) \ 14027e67fb41fb54e050f6983b4de09ed3a317d6148fBrian Paul if (Z < *zPtr) { \ 14037e67fb41fb54e050f6983b4de09ed3a317d6148fBrian Paul GLuint *ptr4 = PIXELADDR4(X,Y); \ 14047e67fb41fb54e050f6983b4de09ed3a317d6148fBrian Paul GLuint pixel = 0; \ 1405ed30dfa1264ec8875a3162c3c8778bc703bf11d5Brian Paul pixel |=((((((*ptr4) >> rshift) & 0xff)*msavalue+rvalue)>>8) << rshift); \ 1406ed30dfa1264ec8875a3162c3c8778bc703bf11d5Brian Paul pixel |=((((((*ptr4) >> gshift) & 0xff)*msavalue+gvalue)>>8) << gshift); \ 1407ed30dfa1264ec8875a3162c3c8778bc703bf11d5Brian Paul pixel |=((((((*ptr4) >> bshift) & 0xff)*msavalue+bvalue)>>8) << bshift); \ 14087e67fb41fb54e050f6983b4de09ed3a317d6148fBrian Paul *ptr4 = pixel; \ 14097e67fb41fb54e050f6983b4de09ed3a317d6148fBrian Paul *zPtr = Z; \ 1410afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1411afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1412afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#ifdef WIN32 1413724abeb058ca9372c5a9b9e38ee43dde1accaa41Keith Whitwell#include "..\swrast\s_linetemp.h" 1414afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#else 1415724abeb058ca9372c5a9b9e38ee43dde1accaa41Keith Whitwell#include "swrast/s_linetemp.h" 1416afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#endif 1417afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 1418afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1419afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1420afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/* 1421afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Analyze context state to see if we can provide a fast line drawing 1422afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * function, like those in lines.c. Otherwise, return NULL. 1423afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */ 14241e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwellstatic swrast_line_func 14251e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwellosmesa_choose_line_function( GLcontext *ctx ) 1426afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 1427c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul OSMesaContext osmesa = OSMESA_CONTEXT(ctx); 14281e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell SWcontext *swrast = SWRAST_CONTEXT(ctx); 1429afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 14302d595d70202bad560c27ea81ec71b740415b3355Brian Paul if (ctx->RenderMode != GL_RENDER) return NULL; 1431afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (ctx->Line.SmoothFlag) return NULL; 14322d595d70202bad560c27ea81ec71b740415b3355Brian Paul if (ctx->Texture._ReallyEnabled) return NULL; 1433afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (ctx->Light.ShadeModel!=GL_FLAT) return NULL; 1434afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1435afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (ctx->Line.Width==1.0F 1436afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg && ctx->Line.StippleFlag==GL_FALSE) { 1437afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 14381e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell if (swrast->_RasterMask==DEPTH_BIT 1439afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg && ctx->Depth.Func==GL_LESS 1440ed30dfa1264ec8875a3162c3c8778bc703bf11d5Brian Paul && ctx->Depth.Mask==GL_TRUE 1441b1394fa92aaaf859ce9efc8b5fc194397921320cBrian Paul && ctx->Visual.DepthBits == DEFAULT_SOFTWARE_DEPTH_BITS) { 1442afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg switch(osmesa->format) { 1443afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case OSMESA_RGBA: 1444afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case OSMESA_BGRA: 1445afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case OSMESA_ARGB: 1446afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return flat_rgba_z_line; 1447afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg default: 1448afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return NULL; 1449afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1450afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1451afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 14521e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell if (swrast->_RasterMask==0) { 1453afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg switch(osmesa->format) { 1454afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case OSMESA_RGBA: 1455afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case OSMESA_BGRA: 1456afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case OSMESA_ARGB: 1457afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return flat_rgba_line; 1458afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg default: 1459afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return NULL; 1460afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1461afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1462afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 14631e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell if (swrast->_RasterMask==(DEPTH_BIT|BLEND_BIT) 1464afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg && ctx->Depth.Func==GL_LESS 1465afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg && ctx->Depth.Mask==GL_TRUE 1466b1394fa92aaaf859ce9efc8b5fc194397921320cBrian Paul && ctx->Visual.DepthBits == DEFAULT_SOFTWARE_DEPTH_BITS 1467afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg && ctx->Color.BlendSrcRGB==GL_SRC_ALPHA 1468afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg && ctx->Color.BlendDstRGB==GL_ONE_MINUS_SRC_ALPHA 1469afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg && ctx->Color.BlendSrcA==GL_SRC_ALPHA 1470afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg && ctx->Color.BlendDstA==GL_ONE_MINUS_SRC_ALPHA 1471afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg && ctx->Color.BlendEquation==GL_FUNC_ADD_EXT) { 1472afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg switch(osmesa->format) { 1473afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case OSMESA_RGBA: 1474afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case OSMESA_BGRA: 1475afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case OSMESA_ARGB: 1476afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return flat_blend_rgba_z_line_write; 1477afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg default: 1478afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return NULL; 1479afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1480afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1481afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 14821e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell if (swrast->_RasterMask==(DEPTH_BIT|BLEND_BIT) 1483afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg && ctx->Depth.Func==GL_LESS 1484afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg && ctx->Depth.Mask==GL_FALSE 1485b1394fa92aaaf859ce9efc8b5fc194397921320cBrian Paul && ctx->Visual.DepthBits == DEFAULT_SOFTWARE_DEPTH_BITS 1486afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg && ctx->Color.BlendSrcRGB==GL_SRC_ALPHA 1487afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg && ctx->Color.BlendDstRGB==GL_ONE_MINUS_SRC_ALPHA 1488afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg && ctx->Color.BlendSrcA==GL_SRC_ALPHA 1489afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg && ctx->Color.BlendDstA==GL_ONE_MINUS_SRC_ALPHA 1490afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg && ctx->Color.BlendEquation==GL_FUNC_ADD_EXT) { 1491afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg switch(osmesa->format) { 1492afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case OSMESA_RGBA: 1493afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case OSMESA_BGRA: 1494afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case OSMESA_ARGB: 1495afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return flat_blend_rgba_z_line; 1496afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg default: 1497afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return NULL; 1498afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1499afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1500afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 15011e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell if (swrast->_RasterMask==BLEND_BIT 1502afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg && ctx->Color.BlendSrcRGB==GL_SRC_ALPHA 1503afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg && ctx->Color.BlendDstRGB==GL_ONE_MINUS_SRC_ALPHA 1504afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg && ctx->Color.BlendSrcA==GL_SRC_ALPHA 1505afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg && ctx->Color.BlendDstA==GL_ONE_MINUS_SRC_ALPHA 1506afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg && ctx->Color.BlendEquation==GL_FUNC_ADD_EXT) { 1507afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg switch(osmesa->format) { 1508afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case OSMESA_RGBA: 1509afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case OSMESA_BGRA: 1510afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case OSMESA_ARGB: 1511afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return flat_blend_rgba_line; 1512afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg default: 1513afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return NULL; 1514afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1515afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1516afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1517afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1518afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return NULL; 1519afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 1520afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1521afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1522afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/**********************************************************************/ 1523afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/***** Optimized triangle rendering *****/ 1524afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/**********************************************************************/ 1525afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1526afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1527afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/* 1528afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Smooth-shaded, z-less triangle, RGBA color. 1529afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */ 15301e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwellstatic void smooth_rgba_z_triangle( GLcontext *ctx, 15311e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell SWvertex *v0, SWvertex *v1, SWvertex *v2 ) 1532afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 1533c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul OSMesaContext osmesa = OSMESA_CONTEXT(ctx); 1534afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLint rshift = osmesa->rshift; 1535afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLint gshift = osmesa->gshift; 1536afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLint bshift = osmesa->bshift; 1537afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLint ashift = osmesa->ashift; 153823ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank 1539afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#define INTERP_Z 1 1540ed30dfa1264ec8875a3162c3c8778bc703bf11d5Brian Paul#define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE 1541afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#define INTERP_RGB 1 1542afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#define INTERP_ALPHA 1 1543afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#define INNER_LOOP( LEFT, RIGHT, Y ) \ 1544afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ \ 1545afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLint i, len = RIGHT-LEFT; \ 1546afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLuint *img = PIXELADDR4(LEFT,Y); \ 1547724abeb058ca9372c5a9b9e38ee43dde1accaa41Keith Whitwell (void) fffog; \ 1548afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg for (i=0;i<len;i++,img++) { \ 1549afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLdepth z = FixedToDepth(ffz); \ 1550afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (z < zRow[i]) { \ 1551afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg *img = PACK_RGBA2( FixedToInt(ffr), FixedToInt(ffg), \ 1552afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg FixedToInt(ffb), FixedToInt(ffa) ); \ 1553afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg zRow[i] = z; \ 1554afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } \ 1555afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ffr += fdrdx; ffg += fdgdx; ffb += fdbdx; ffa += fdadx;\ 1556afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ffz += fdzdx; \ 1557afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } \ 1558afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 1559afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#ifdef WIN32 1560724abeb058ca9372c5a9b9e38ee43dde1accaa41Keith Whitwell#include "..\swrast\s_tritemp.h" 1561afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#else 1562724abeb058ca9372c5a9b9e38ee43dde1accaa41Keith Whitwell#include "swrast/s_tritemp.h" 1563afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#endif 1564afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 1565afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1566afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1567afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1568afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1569afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/* 1570afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Flat-shaded, z-less triangle, RGBA color. 1571afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */ 15721e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwellstatic void flat_rgba_z_triangle( GLcontext *ctx, 15731e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell SWvertex *v0, SWvertex *v1, SWvertex *v2 ) 1574afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 1575c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul OSMesaContext osmesa = OSMESA_CONTEXT(ctx); 1576afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#define INTERP_Z 1 1577ed30dfa1264ec8875a3162c3c8778bc703bf11d5Brian Paul#define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE 1578afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#define SETUP_CODE \ 15791e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell GLubyte r = v0->color[0]; \ 15801e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell GLubyte g = v0->color[1]; \ 15811e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell GLubyte b = v0->color[2]; \ 15821e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell GLubyte a = v0->color[3]; \ 1583afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLuint pixel = PACK_RGBA(r,g,b,a); 1584afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1585afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#define INNER_LOOP( LEFT, RIGHT, Y ) \ 1586afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ \ 1587afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLint i, len = RIGHT-LEFT; \ 1588afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLuint *img = PIXELADDR4(LEFT,Y); \ 1589724abeb058ca9372c5a9b9e38ee43dde1accaa41Keith Whitwell (void) fffog; \ 1590afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg for (i=0;i<len;i++,img++) { \ 1591afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLdepth z = FixedToDepth(ffz); \ 1592afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (z < zRow[i]) { \ 1593afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg *img = pixel; \ 1594afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg zRow[i] = z; \ 1595afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } \ 1596afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ffz += fdzdx; \ 1597afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } \ 1598afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 1599afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#ifdef WIN32 1600724abeb058ca9372c5a9b9e38ee43dde1accaa41Keith Whitwell#include "..\swrast\s_tritemp.h" 1601afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#else 1602724abeb058ca9372c5a9b9e38ee43dde1accaa41Keith Whitwell#include "swrast/s_tritemp.h" 1603afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#endif 1604afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 1605afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1606afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1607afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1608afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/* 1609afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Return pointer to an accelerated triangle function if possible. 1610afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */ 16111e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwellstatic swrast_tri_func 16121e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwellosmesa_choose_triangle_function( GLcontext *ctx ) 1613afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 1614c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul OSMesaContext osmesa = OSMESA_CONTEXT(ctx); 16151e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell SWcontext *swrast = SWRAST_CONTEXT(ctx); 1616afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 16171e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell if ((osmesa->format==OSMESA_RGB)||(osmesa->format==OSMESA_BGR)) 16181e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell return (swrast_tri_func)NULL; 1619afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 16202d595d70202bad560c27ea81ec71b740415b3355Brian Paul if (ctx->RenderMode != GL_RENDER) return (swrast_tri_func) NULL; 16212d595d70202bad560c27ea81ec71b740415b3355Brian Paul if (ctx->Polygon.SmoothFlag) return (swrast_tri_func) NULL; 16222d595d70202bad560c27ea81ec71b740415b3355Brian Paul if (ctx->Polygon.StippleFlag) return (swrast_tri_func) NULL; 16232d595d70202bad560c27ea81ec71b740415b3355Brian Paul if (ctx->Texture._ReallyEnabled) return (swrast_tri_func) NULL; 1624afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 16251e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell if (swrast->_RasterMask==DEPTH_BIT 1626afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg && ctx->Depth.Func==GL_LESS 1627afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg && ctx->Depth.Mask==GL_TRUE 1628b1394fa92aaaf859ce9efc8b5fc194397921320cBrian Paul && ctx->Visual.DepthBits == DEFAULT_SOFTWARE_DEPTH_BITS 1629afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg && osmesa->format!=OSMESA_COLOR_INDEX) { 1630afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (ctx->Light.ShadeModel==GL_SMOOTH) { 1631afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return smooth_rgba_z_triangle; 1632afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1633afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg else { 1634afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return flat_rgba_z_triangle; 1635afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1636afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 16371e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell return (swrast_tri_func)NULL; 16381e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell} 16391e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell 16401e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell/* Override for the swrast triangle-selection function. Try to use one 16411e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell * of our internal triangle functions, otherwise fall back to the 16421e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell * standard swrast functions. 16431e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell */ 16441e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwellstatic void osmesa_choose_triangle( GLcontext *ctx ) 16451e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell{ 16461e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell SWcontext *swrast = SWRAST_CONTEXT(ctx); 16471e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell 16481e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell swrast->Triangle = osmesa_choose_triangle_function( ctx ); 16491e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell if (!swrast->Triangle) 16501e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell _swrast_choose_triangle( ctx ); 1651afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 1652afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 16531e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwellstatic void osmesa_choose_line( GLcontext *ctx ) 16541e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell{ 16551e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell SWcontext *swrast = SWRAST_CONTEXT(ctx); 16561e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell 16571e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell swrast->Line = osmesa_choose_line_function( ctx ); 16581e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell if (!swrast->Line) 16591e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell _swrast_choose_line( ctx ); 16601e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell} 16611e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell 16621e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell 16632d595d70202bad560c27ea81ec71b740415b3355Brian Paul#define OSMESA_NEW_LINE (_NEW_LINE | \ 16642d595d70202bad560c27ea81ec71b740415b3355Brian Paul _NEW_TEXTURE | \ 16652d595d70202bad560c27ea81ec71b740415b3355Brian Paul _NEW_LIGHT | \ 16662d595d70202bad560c27ea81ec71b740415b3355Brian Paul _NEW_DEPTH | \ 16672d595d70202bad560c27ea81ec71b740415b3355Brian Paul _NEW_RENDERMODE | \ 16682d595d70202bad560c27ea81ec71b740415b3355Brian Paul _SWRAST_NEW_RASTERMASK) 16692d595d70202bad560c27ea81ec71b740415b3355Brian Paul 16702d595d70202bad560c27ea81ec71b740415b3355Brian Paul#define OSMESA_NEW_TRIANGLE (_NEW_POLYGON | \ 16712d595d70202bad560c27ea81ec71b740415b3355Brian Paul _NEW_TEXTURE | \ 16722d595d70202bad560c27ea81ec71b740415b3355Brian Paul _NEW_LIGHT | \ 16732d595d70202bad560c27ea81ec71b740415b3355Brian Paul _NEW_DEPTH | \ 16742d595d70202bad560c27ea81ec71b740415b3355Brian Paul _NEW_RENDERMODE | \ 16752d595d70202bad560c27ea81ec71b740415b3355Brian Paul _SWRAST_NEW_RASTERMASK) 16761e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell 16771e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell 16781e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell/* Extend the software rasterizer with our line and triangle 16791e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell * functions. 16801e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell */ 16811e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwellstatic void osmesa_register_swrast_functions( GLcontext *ctx ) 16821e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell{ 16831e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell SWcontext *swrast = SWRAST_CONTEXT( ctx ); 16841e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell 16851e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell swrast->choose_line = osmesa_choose_line; 16861e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell swrast->choose_triangle = osmesa_choose_triangle; 16871e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell 16881e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell swrast->invalidate_line |= OSMESA_NEW_LINE; 16891e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell swrast->invalidate_triangle |= OSMESA_NEW_TRIANGLE; 16901e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell} 1691ed30dfa1264ec8875a3162c3c8778bc703bf11d5Brian Paul 1692ed30dfa1264ec8875a3162c3c8778bc703bf11d5Brian Paul 1693afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgstatic const GLubyte *get_string( GLcontext *ctx, GLenum name ) 1694afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 1695afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg (void) ctx; 1696afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg switch (name) { 1697afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_RENDERER: 1698afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return (const GLubyte *) "Mesa OffScreen"; 1699afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg default: 1700afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return NULL; 1701afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1702afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 1703afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1704afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1705afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgstatic void osmesa_update_state( GLcontext *ctx ) 1706afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 1707c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul OSMesaContext osmesa = OSMESA_CONTEXT(ctx); 1708304357dcd496f7ebf499fd9c77b4eba83a75abd5Brian Paul 1709304357dcd496f7ebf499fd9c77b4eba83a75abd5Brian Paul ASSERT((void *) osmesa == (void *) ctx->DriverCtx); 1710afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1711afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ctx->Driver.GetString = get_string; 17121e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell ctx->Driver.UpdateStateNotify = ~0; 1713afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ctx->Driver.UpdateState = osmesa_update_state; 1714afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1715cea0e8e6700e871bb9bcb334cb75fbfbfcdfd702Brian Paul ctx->Driver.SetDrawBuffer = set_draw_buffer; 1716cea0e8e6700e871bb9bcb334cb75fbfbfcdfd702Brian Paul ctx->Driver.SetReadBuffer = set_read_buffer; 1717c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul#if 000 1718afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ctx->Driver.Color = set_color; 1719afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ctx->Driver.Index = set_index; 1720c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul#endif 1721afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ctx->Driver.ClearIndex = clear_index; 1722afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ctx->Driver.ClearColor = clear_color; 1723afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ctx->Driver.Clear = clear; 1724afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1725afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ctx->Driver.GetBufferSize = buffer_size; 1726afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 17271e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell ctx->Driver.PointsFunc = _swsetup_Points; 17281e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell ctx->Driver.LineFunc = _swsetup_Line; 17291e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell ctx->Driver.TriangleFunc = _swsetup_Triangle; 17301e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell ctx->Driver.QuadFunc = _swsetup_Quad; 17311e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell ctx->Driver.RasterSetup = _swsetup_RasterSetup; 1732afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1733afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1734afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg /* RGB(A) span/pixel functions */ 1735afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if ((osmesa->format==OSMESA_RGB) || (osmesa->format==OSMESA_BGR)) { 1736afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg /* 3 bytes / pixel in frame buffer */ 1737afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ctx->Driver.WriteRGBASpan = write_rgba_span3; 1738afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ctx->Driver.WriteRGBSpan = write_rgb_span3; 1739afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ctx->Driver.WriteRGBAPixels = write_rgba_pixels3; 1740afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ctx->Driver.WriteMonoRGBASpan = write_monocolor_span3; 1741afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ctx->Driver.WriteMonoRGBAPixels = write_monocolor_pixels3; 1742afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ctx->Driver.ReadRGBASpan = read_rgba_span3; 1743afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ctx->Driver.ReadRGBAPixels = read_rgba_pixels3; 1744afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1745afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg else { 1746afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg /* 4 bytes / pixel in frame buffer */ 1747afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (osmesa->format==OSMESA_RGBA 1748afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg && RCOMP==0 && GCOMP==1 && BCOMP==2 && ACOMP==3) 1749afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ctx->Driver.WriteRGBASpan = write_rgba_span_rgba; 1750afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg else 1751afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ctx->Driver.WriteRGBASpan = write_rgba_span; 1752afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ctx->Driver.WriteRGBSpan = write_rgb_span; 1753afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ctx->Driver.WriteRGBAPixels = write_rgba_pixels; 1754afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ctx->Driver.WriteMonoRGBASpan = write_monocolor_span; 1755afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ctx->Driver.WriteMonoRGBAPixels = write_monocolor_pixels; 1756afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (osmesa->format==OSMESA_RGBA 1757afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg && RCOMP==0 && GCOMP==1 && BCOMP==2 && ACOMP==3) 1758afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ctx->Driver.ReadRGBASpan = read_rgba_span_rgba; 1759afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg else 1760afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ctx->Driver.ReadRGBASpan = read_rgba_span; 1761afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ctx->Driver.ReadRGBAPixels = read_rgba_pixels; 1762afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1763afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1764afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg /* CI span/pixel functions */ 1765afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ctx->Driver.WriteCI32Span = write_index32_span; 1766afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ctx->Driver.WriteCI8Span = write_index8_span; 1767afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ctx->Driver.WriteMonoCISpan = write_monoindex_span; 1768afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ctx->Driver.WriteCI32Pixels = write_index_pixels; 1769afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ctx->Driver.WriteMonoCIPixels = write_monoindex_pixels; 1770afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ctx->Driver.ReadCI32Span = read_index_span; 1771afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ctx->Driver.ReadCI32Pixels = read_index_pixels; 1772afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 1773