s_context.h revision 9e8a961dd7d7b717a9fb4ecdea1c1b60ea355efe
1cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell/* 2cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell * Mesa 3-D graphics library 38b5fce6bcc88cd9dd321f0db95c1714e5e5e85a1Brian * Version: 6.5.3 45e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen * 58b5fce6bcc88cd9dd321f0db95c1714e5e5e85a1Brian * Copyright (C) 1999-2007 Brian Paul All Rights Reserved. 65e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen * 7cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell * Permission is hereby granted, free of charge, to any person obtaining a 8cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell * copy of this software and associated documentation files (the "Software"), 9cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell * to deal in the Software without restriction, including without limitation 10cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell * the rights to use, copy, modify, merge, publish, distribute, sublicense, 11cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell * and/or sell copies of the Software, and to permit persons to whom the 12cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell * Software is furnished to do so, subject to the following conditions: 135e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen * 14cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell * The above copyright notice and this permission notice shall be included 15cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell * in all copies or substantial portions of the Software. 165e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen * 17cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 18cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 19cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 20cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN 21cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 22cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 23cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell */ 24cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell 25b8d6607acd3b6d18dab0c7247d5e0fc72e98ceaeBrian Paul 26bf80e1ed620836e2ca0dd3f7d2d4cb187d17563dBrian Paul/** 27bf80e1ed620836e2ca0dd3f7d2d4cb187d17563dBrian Paul * \file swrast/s_context.h 28b8d6607acd3b6d18dab0c7247d5e0fc72e98ceaeBrian Paul * \brief Software rasterization context and private types. 2905a4b37707d2c598ea68c05d07a3d65bcbf5a076Brian Paul * \author Keith Whitwell <keith@tungstengraphics.com> 30bf80e1ed620836e2ca0dd3f7d2d4cb187d17563dBrian Paul */ 31bf80e1ed620836e2ca0dd3f7d2d4cb187d17563dBrian Paul 32253204f9f0a1942a65e45d876f8d5f16d1a196a1Brian Paul/** 33253204f9f0a1942a65e45d876f8d5f16d1a196a1Brian Paul * \mainpage swrast module 34253204f9f0a1942a65e45d876f8d5f16d1a196a1Brian Paul * 35253204f9f0a1942a65e45d876f8d5f16d1a196a1Brian Paul * This module, software rasterization, contains the software fallback 36253204f9f0a1942a65e45d876f8d5f16d1a196a1Brian Paul * routines for drawing points, lines, triangles, bitmaps and images. 37253204f9f0a1942a65e45d876f8d5f16d1a196a1Brian Paul * All rendering boils down to writing spans (arrays) of pixels with 38253204f9f0a1942a65e45d876f8d5f16d1a196a1Brian Paul * particular colors. The span-writing routines must be implemented 39253204f9f0a1942a65e45d876f8d5f16d1a196a1Brian Paul * by the device driver. 40253204f9f0a1942a65e45d876f8d5f16d1a196a1Brian Paul */ 41253204f9f0a1942a65e45d876f8d5f16d1a196a1Brian Paul 42253204f9f0a1942a65e45d876f8d5f16d1a196a1Brian Paul 43cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell#ifndef S_CONTEXT_H 44cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell#define S_CONTEXT_H 45cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell 465e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen#include "mtypes.h" 47cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell#include "swrast.h" 483866558c9840f9c4fed6ac0bd2994ccc67f40f7fBrian#include "s_span.h" 498b5fce6bcc88cd9dd321f0db95c1714e5e5e85a1Brian#include "prog_execute.h" 50b8d6607acd3b6d18dab0c7247d5e0fc72e98ceaeBrian Paul 51b8d6607acd3b6d18dab0c7247d5e0fc72e98ceaeBrian Paul 52aa8abf8081023c00469b6c88760ed0291033eb6eBrian Paultypedef void (*texture_sample_func)(GLcontext *ctx, 53b8d6607acd3b6d18dab0c7247d5e0fc72e98ceaeBrian Paul const struct gl_texture_object *tObj, 54b8d6607acd3b6d18dab0c7247d5e0fc72e98ceaeBrian Paul GLuint n, const GLfloat texcoords[][4], 55b8d6607acd3b6d18dab0c7247d5e0fc72e98ceaeBrian Paul const GLfloat lambda[], GLchan rgba[][4]); 56b8d6607acd3b6d18dab0c7247d5e0fc72e98ceaeBrian Paul 57cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwelltypedef void (_ASMAPIP blend_func)( GLcontext *ctx, GLuint n, 58cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell const GLubyte mask[], 59d92da49bae30be612efb6ea20bdfda232ee3d01dBrian Paul GLvoid *src, const GLvoid *dst, 60a50b7dbc3ba1db8c92b4bbb4f7f06de8d6c039c4Brian Paul GLenum chanType); 61cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell 62a852378a6289d154364dde440f89a39bbfc33e2dBrian Paultypedef void (*swrast_point_func)( GLcontext *ctx, const SWvertex *); 63a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul 64a852378a6289d154364dde440f89a39bbfc33e2dBrian Paultypedef void (*swrast_line_func)( GLcontext *ctx, 65a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul const SWvertex *, const SWvertex *); 66a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul 67a852378a6289d154364dde440f89a39bbfc33e2dBrian Paultypedef void (*swrast_tri_func)( GLcontext *ctx, const SWvertex *, 68a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul const SWvertex *, const SWvertex *); 69a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul 70a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul 71ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paultypedef void (*validate_texture_image_func)(GLcontext *ctx, 72ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul struct gl_texture_object *texObj, 73ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul GLuint face, GLuint level); 74ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul 75ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul 763866558c9840f9c4fed6ac0bd2994ccc67f40f7fBrian/** 773866558c9840f9c4fed6ac0bd2994ccc67f40f7fBrian * \defgroup Bitmasks 78bf80e1ed620836e2ca0dd3f7d2d4cb187d17563dBrian Paul * Bitmasks to indicate which rasterization options are enabled 79bf80e1ed620836e2ca0dd3f7d2d4cb187d17563dBrian Paul * (RasterMask) 80cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell */ 81bf80e1ed620836e2ca0dd3f7d2d4cb187d17563dBrian Paul/*@{*/ 82bf80e1ed620836e2ca0dd3f7d2d4cb187d17563dBrian Paul#define ALPHATEST_BIT 0x001 /**< Alpha-test pixels */ 83bf80e1ed620836e2ca0dd3f7d2d4cb187d17563dBrian Paul#define BLEND_BIT 0x002 /**< Blend pixels */ 84bf80e1ed620836e2ca0dd3f7d2d4cb187d17563dBrian Paul#define DEPTH_BIT 0x004 /**< Depth-test pixels */ 85bf80e1ed620836e2ca0dd3f7d2d4cb187d17563dBrian Paul#define FOG_BIT 0x008 /**< Fog pixels */ 86bf80e1ed620836e2ca0dd3f7d2d4cb187d17563dBrian Paul#define LOGIC_OP_BIT 0x010 /**< Apply logic op in software */ 87bf80e1ed620836e2ca0dd3f7d2d4cb187d17563dBrian Paul#define CLIP_BIT 0x020 /**< Scissor or window clip pixels */ 88bf80e1ed620836e2ca0dd3f7d2d4cb187d17563dBrian Paul#define STENCIL_BIT 0x040 /**< Stencil pixels */ 89bf80e1ed620836e2ca0dd3f7d2d4cb187d17563dBrian Paul#define MASKING_BIT 0x080 /**< Do glColorMask or glIndexMask */ 90bf80e1ed620836e2ca0dd3f7d2d4cb187d17563dBrian Paul#define MULTI_DRAW_BIT 0x400 /**< Write to more than one color- */ 91bf80e1ed620836e2ca0dd3f7d2d4cb187d17563dBrian Paul /**< buffer or no buffers. */ 92bf80e1ed620836e2ca0dd3f7d2d4cb187d17563dBrian Paul#define OCCLUSION_BIT 0x800 /**< GL_HP_occlusion_test enabled */ 93bf80e1ed620836e2ca0dd3f7d2d4cb187d17563dBrian Paul#define TEXTURE_BIT 0x1000 /**< Texturing really enabled */ 9492f9785c727ea10ff5f8dc9770f0e8f388fcea70Brian Paul#define FRAGPROG_BIT 0x2000 /**< Fragment program enabled */ 957f752fed993e5e9423abac200dd59141edbada56Dave Airlie#define ATIFRAGSHADER_BIT 0x4000 /**< ATI Fragment shader enabled */ 96ba3da6154c324cc916845bc5de3de077d0b59ffcBrian Paul#define CLAMPING_BIT 0x8000 /**< Clamp colors to [0,1] */ 97bf80e1ed620836e2ca0dd3f7d2d4cb187d17563dBrian Paul/*@}*/ 98cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell 99cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell#define _SWRAST_NEW_RASTERMASK (_NEW_BUFFERS| \ 100cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell _NEW_SCISSOR| \ 101cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell _NEW_COLOR| \ 102cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell _NEW_DEPTH| \ 103cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell _NEW_FOG| \ 10492f9785c727ea10ff5f8dc9770f0e8f388fcea70Brian Paul _NEW_PROGRAM| \ 105cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell _NEW_STENCIL| \ 106cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell _NEW_TEXTURE| \ 107cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell _NEW_VIEWPORT| \ 108cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell _NEW_DEPTH) 109cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell 110cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell 111bf80e1ed620836e2ca0dd3f7d2d4cb187d17563dBrian Paul/** 112bf80e1ed620836e2ca0dd3f7d2d4cb187d17563dBrian Paul * \struct SWcontext 113cdb27e8242215271364602995d85607cfc06d441Brian Paul * \brief Per-context state that's private to the software rasterizer module. 114bf80e1ed620836e2ca0dd3f7d2d4cb187d17563dBrian Paul */ 115cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwelltypedef struct 116cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell{ 117bf80e1ed620836e2ca0dd3f7d2d4cb187d17563dBrian Paul /** Driver interface: 118709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell */ 119709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell struct swrast_device_driver Driver; 120709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell 121bf80e1ed620836e2ca0dd3f7d2d4cb187d17563dBrian Paul /** Configuration mechanisms to make software rasterizer match 1225e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen * characteristics of the hardware rasterizer (if present): 1231e1aac034c986a08248861363c0baa27dc2ae2d5Keith Whitwell */ 1241e1aac034c986a08248861363c0baa27dc2ae2d5Keith Whitwell GLboolean AllowVertexFog; 1251e1aac034c986a08248861363c0baa27dc2ae2d5Keith Whitwell GLboolean AllowPixelFog; 1261e1aac034c986a08248861363c0baa27dc2ae2d5Keith Whitwell 127bf80e1ed620836e2ca0dd3f7d2d4cb187d17563dBrian Paul /** Derived values, invalidated on statechanges, updated from 1281e1aac034c986a08248861363c0baa27dc2ae2d5Keith Whitwell * _swrast_validate_derived(): 1291e1aac034c986a08248861363c0baa27dc2ae2d5Keith Whitwell */ 130e00ac11d4dd05c56584622dc2707bbdcfe4b2707Brian Paul GLbitfield _RasterMask; 13187f858dd7cbca2280c983c77a239013a187c3e9aBrian Paul GLfloat _BackfaceSign; 13209da0b8e6621a831e3eeb9381430f2bed18a22adBrian Paul GLboolean _PreferPixelFog; /* Compute fog blend factor per fragment? */ 133f595212336ae63c981f0f39f4ea1dec67ff7fe25Brian Paul GLboolean _AnyTextureCombine; 13409da0b8e6621a831e3eeb9381430f2bed18a22adBrian Paul GLboolean _FogEnabled; 1359e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian GLboolean _DeferredTexture; 136dfe508ca7af1a6d1099cd65e257512ed1e17d893Brian Paul GLenum _FogMode; /* either GL_FOG_MODE or fragment program's fog mode */ 1371e1aac034c986a08248861363c0baa27dc2ae2d5Keith Whitwell 1381c09bcfdda4083636a3ac27d804a34ef87875ce7Brian /** Multiple render targets */ 1391c09bcfdda4083636a3ac27d804a34ef87875ce7Brian GLbitfield _ColorOutputsMask; 1401c09bcfdda4083636a3ac27d804a34ef87875ce7Brian GLuint _NumColorOutputs; 1411c09bcfdda4083636a3ac27d804a34ef87875ce7Brian 1420bdf216dd06d5136b8529297297aa962bab548c2Brian /** List/array of the fragment attributes to interpolate */ 1430bdf216dd06d5136b8529297297aa962bab548c2Brian GLuint _ActiveAttribs[FRAG_ATTRIB_MAX]; 1449e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian /** Same info, but as a bitmask */ 1459e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian GLbitfield _ActiveAttribMask; 1460bdf216dd06d5136b8529297297aa962bab548c2Brian /** Number of fragment attributes to interpolate */ 1470bdf216dd06d5136b8529297297aa962bab548c2Brian GLuint _NumActiveAttribs; 1489e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian /** Indicates how each attrib is to be interpolated (lines/tris) */ 1499e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian GLenum _InterpMode[FRAG_ATTRIB_MAX]; /* GL_FLAT or GL_SMOOTH (for now) */ 150dd34fe8679fa200e55cfaf8e80bbecdecea084e3Brian 1515e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen /* Accum buffer temporaries. 1521e1aac034c986a08248861363c0baa27dc2ae2d5Keith Whitwell */ 153bf80e1ed620836e2ca0dd3f7d2d4cb187d17563dBrian Paul GLboolean _IntegerAccumMode; /**< Storing unscaled integers? */ 154bf80e1ed620836e2ca0dd3f7d2d4cb187d17563dBrian Paul GLfloat _IntegerAccumScaler; /**< Implicit scale factor */ 155cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell 1561e1aac034c986a08248861363c0baa27dc2ae2d5Keith Whitwell /* Working values: 1571e1aac034c986a08248861363c0baa27dc2ae2d5Keith Whitwell */ 158bf80e1ed620836e2ca0dd3f7d2d4cb187d17563dBrian Paul GLuint StippleCounter; /**< Line stipple counter */ 159e00ac11d4dd05c56584622dc2707bbdcfe4b2707Brian Paul GLbitfield NewState; 1601e1aac034c986a08248861363c0baa27dc2ae2d5Keith Whitwell GLuint StateChanges; 161f782b8189e718974a40d72ac4f6b8d213ca99e1eBrian Paul GLenum Primitive; /* current primitive being drawn (ala glBegin) */ 1625e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen 1633a5bb1729d8c229a587e34ccd5ddc86e26811b9fBrian Paul void (*InvalidateState)( GLcontext *ctx, GLbitfield new_state ); 1643a5bb1729d8c229a587e34ccd5ddc86e26811b9fBrian Paul 1653a5bb1729d8c229a587e34ccd5ddc86e26811b9fBrian Paul /** 1663a5bb1729d8c229a587e34ccd5ddc86e26811b9fBrian Paul * When the NewState mask intersects these masks, we invalidate the 1673a5bb1729d8c229a587e34ccd5ddc86e26811b9fBrian Paul * Point/Line/Triangle function pointers below. 1683a5bb1729d8c229a587e34ccd5ddc86e26811b9fBrian Paul */ 1693a5bb1729d8c229a587e34ccd5ddc86e26811b9fBrian Paul /*@{*/ 1703a5bb1729d8c229a587e34ccd5ddc86e26811b9fBrian Paul GLbitfield InvalidatePointMask; 1713a5bb1729d8c229a587e34ccd5ddc86e26811b9fBrian Paul GLbitfield InvalidateLineMask; 1723a5bb1729d8c229a587e34ccd5ddc86e26811b9fBrian Paul GLbitfield InvalidateTriangleMask; 1733a5bb1729d8c229a587e34ccd5ddc86e26811b9fBrian Paul /*@}*/ 1743a5bb1729d8c229a587e34ccd5ddc86e26811b9fBrian Paul 1753a5bb1729d8c229a587e34ccd5ddc86e26811b9fBrian Paul /** 1763a5bb1729d8c229a587e34ccd5ddc86e26811b9fBrian Paul * Device drivers plug in functions for these callbacks. 1773a5bb1729d8c229a587e34ccd5ddc86e26811b9fBrian Paul * Will be called when the GL state change mask intersects the above masks. 178cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell */ 179bf80e1ed620836e2ca0dd3f7d2d4cb187d17563dBrian Paul /*@{*/ 180cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell void (*choose_point)( GLcontext * ); 181cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell void (*choose_line)( GLcontext * ); 182cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell void (*choose_triangle)( GLcontext * ); 183bf80e1ed620836e2ca0dd3f7d2d4cb187d17563dBrian Paul /*@}*/ 184cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell 1853a5bb1729d8c229a587e34ccd5ddc86e26811b9fBrian Paul /** 1863a5bb1729d8c229a587e34ccd5ddc86e26811b9fBrian Paul * Current point, line and triangle drawing functions. 1873a5bb1729d8c229a587e34ccd5ddc86e26811b9fBrian Paul */ 188bf80e1ed620836e2ca0dd3f7d2d4cb187d17563dBrian Paul /*@{*/ 189a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul swrast_point_func Point; 190a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul swrast_line_func Line; 191a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul swrast_tri_func Triangle; 192bf80e1ed620836e2ca0dd3f7d2d4cb187d17563dBrian Paul /*@}*/ 19346b0988c673b28e072fd0cbf477632a9ab6f9f18Keith Whitwell 194bf80e1ed620836e2ca0dd3f7d2d4cb187d17563dBrian Paul /** 195bf80e1ed620836e2ca0dd3f7d2d4cb187d17563dBrian Paul * Placeholders for when separate specular (or secondary color) is 19622144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes * enabled but texturing is not. 19746b0988c673b28e072fd0cbf477632a9ab6f9f18Keith Whitwell */ 198bf80e1ed620836e2ca0dd3f7d2d4cb187d17563dBrian Paul /*@{*/ 19946b0988c673b28e072fd0cbf477632a9ab6f9f18Keith Whitwell swrast_point_func SpecPoint; 20046b0988c673b28e072fd0cbf477632a9ab6f9f18Keith Whitwell swrast_line_func SpecLine; 20146b0988c673b28e072fd0cbf477632a9ab6f9f18Keith Whitwell swrast_tri_func SpecTriangle; 202bf80e1ed620836e2ca0dd3f7d2d4cb187d17563dBrian Paul /*@}*/ 20346b0988c673b28e072fd0cbf477632a9ab6f9f18Keith Whitwell 20477df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul /** 20577df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul * Typically, we'll allocate a sw_span structure as a local variable 20677df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul * and set its 'array' pointer to point to this object. The reason is 20777df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul * this object is big and causes problems when allocated on the stack 20877df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul * on some systems. 20977df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul */ 210cdb27e8242215271364602995d85607cfc06d441Brian Paul SWspanarrays *SpanArrays; 211f782b8189e718974a40d72ac4f6b8d213ca99e1eBrian Paul 212f782b8189e718974a40d72ac4f6b8d213ca99e1eBrian Paul /** 213f782b8189e718974a40d72ac4f6b8d213ca99e1eBrian Paul * Used to buffer N GL_POINTS, instead of rendering one by one. 214f782b8189e718974a40d72ac4f6b8d213ca99e1eBrian Paul */ 215cdb27e8242215271364602995d85607cfc06d441Brian Paul SWspan PointSpan; 216cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell 2178885b077ed7180e93a002d93864a8ff7b0bb81f3Brian Paul /** Internal hooks, kept up to date by the same mechanism as above. 218cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell */ 219cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell blend_func BlendFunc; 220b8d6607acd3b6d18dab0c7247d5e0fc72e98ceaeBrian Paul texture_sample_func TextureSample[MAX_TEXTURE_IMAGE_UNITS]; 221cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell 222f595212336ae63c981f0f39f4ea1dec67ff7fe25Brian Paul /** Buffer for saving the sampled texture colors. 223f595212336ae63c981f0f39f4ea1dec67ff7fe25Brian Paul * Needed for GL_ARB_texture_env_crossbar implementation. 224f595212336ae63c981f0f39f4ea1dec67ff7fe25Brian Paul */ 225f595212336ae63c981f0f39f4ea1dec67ff7fe25Brian Paul GLchan *TexelBuffer; 226f595212336ae63c981f0f39f4ea1dec67ff7fe25Brian Paul 227ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul validate_texture_image_func ValidateTextureImage; 228ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul 2298b5fce6bcc88cd9dd321f0db95c1714e5e5e85a1Brian /** State used during execution of fragment programs */ 2308b5fce6bcc88cd9dd321f0db95c1714e5e5e85a1Brian struct gl_program_machine FragProgMachine; 2318b5fce6bcc88cd9dd321f0db95c1714e5e5e85a1Brian 232cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell} SWcontext; 233cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell 234cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell 235f431a3fb4dc1bf860203d79e54657e3a62bc50dfBrian Paulextern void 236cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell_swrast_validate_derived( GLcontext *ctx ); 237cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell 23804bda46739beb0dab7c8820bdbe67136470d42beBrianextern void 23904bda46739beb0dab7c8820bdbe67136470d42beBrian_swrast_update_texture_samplers(GLcontext *ctx); 24004bda46739beb0dab7c8820bdbe67136470d42beBrian 241cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell 242cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell#define SWRAST_CONTEXT(ctx) ((SWcontext *)ctx->swrast_context) 243cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell 244709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell#define RENDER_START(SWctx, GLctx) \ 245f431a3fb4dc1bf860203d79e54657e3a62bc50dfBrian Paul do { \ 246709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell if ((SWctx)->Driver.SpanRenderStart) { \ 247709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell (*(SWctx)->Driver.SpanRenderStart)(GLctx); \ 248f431a3fb4dc1bf860203d79e54657e3a62bc50dfBrian Paul } \ 249709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell } while (0) 250709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell 251709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell#define RENDER_FINISH(SWctx, GLctx) \ 252f431a3fb4dc1bf860203d79e54657e3a62bc50dfBrian Paul do { \ 253709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell if ((SWctx)->Driver.SpanRenderFinish) { \ 254709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell (*(SWctx)->Driver.SpanRenderFinish)(GLctx); \ 255f431a3fb4dc1bf860203d79e54657e3a62bc50dfBrian Paul } \ 256709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell } while (0) 257cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell 258cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell 259f431a3fb4dc1bf860203d79e54657e3a62bc50dfBrian Paul 26076e778dce59aa6f290db50242df945943fc47b05Brian Paul/** 26176e778dce59aa6f290db50242df945943fc47b05Brian Paul * Size of an RGBA pixel, in bytes, for given datatype. 26276e778dce59aa6f290db50242df945943fc47b05Brian Paul */ 26376e778dce59aa6f290db50242df945943fc47b05Brian Paul#define RGBA_PIXEL_SIZE(TYPE) \ 26476e778dce59aa6f290db50242df945943fc47b05Brian Paul ((TYPE == GL_UNSIGNED_BYTE) ? 4 * sizeof(GLubyte) : \ 26576e778dce59aa6f290db50242df945943fc47b05Brian Paul ((TYPE == GL_UNSIGNED_SHORT) ? 4 * sizeof(GLushort) \ 26676e778dce59aa6f290db50242df945943fc47b05Brian Paul : 4 * sizeof(GLfloat))) 26776e778dce59aa6f290db50242df945943fc47b05Brian Paul 26876e778dce59aa6f290db50242df945943fc47b05Brian Paul 26976e778dce59aa6f290db50242df945943fc47b05Brian Paul 270f431a3fb4dc1bf860203d79e54657e3a62bc50dfBrian Paul/* 271f431a3fb4dc1bf860203d79e54657e3a62bc50dfBrian Paul * XXX these macros are just bandages for now in order to make 272f431a3fb4dc1bf860203d79e54657e3a62bc50dfBrian Paul * CHAN_BITS==32 compile cleanly. 273f431a3fb4dc1bf860203d79e54657e3a62bc50dfBrian Paul * These should probably go elsewhere at some point. 274f431a3fb4dc1bf860203d79e54657e3a62bc50dfBrian Paul */ 275f431a3fb4dc1bf860203d79e54657e3a62bc50dfBrian Paul#if CHAN_TYPE == GL_FLOAT 27660174c1aef7c6650a800f16f103a4f9ed2d1004eBrian Paul#define ChanToFixed(X) (X) 27760174c1aef7c6650a800f16f103a4f9ed2d1004eBrian Paul#define FixedToChan(X) (X) 278f431a3fb4dc1bf860203d79e54657e3a62bc50dfBrian Paul#else 279f431a3fb4dc1bf860203d79e54657e3a62bc50dfBrian Paul#define ChanToFixed(X) IntToFixed(X) 280f431a3fb4dc1bf860203d79e54657e3a62bc50dfBrian Paul#define FixedToChan(X) FixedToInt(X) 281f431a3fb4dc1bf860203d79e54657e3a62bc50dfBrian Paul#endif 282f431a3fb4dc1bf860203d79e54657e3a62bc50dfBrian Paul 2830bdf216dd06d5136b8529297297aa962bab548c2Brian 2840bdf216dd06d5136b8529297297aa962bab548c2Brian/** 2850bdf216dd06d5136b8529297297aa962bab548c2Brian * For looping over fragment attributes in the pointe, line 2860bdf216dd06d5136b8529297297aa962bab548c2Brian * triangle rasterizers. 2870bdf216dd06d5136b8529297297aa962bab548c2Brian */ 2880bdf216dd06d5136b8529297297aa962bab548c2Brian#define ATTRIB_LOOP_BEGIN \ 2890bdf216dd06d5136b8529297297aa962bab548c2Brian { \ 2900bdf216dd06d5136b8529297297aa962bab548c2Brian GLuint a; \ 2910bdf216dd06d5136b8529297297aa962bab548c2Brian for (a = 0; a < swrast->_NumActiveAttribs; a++) { \ 2920bdf216dd06d5136b8529297297aa962bab548c2Brian const GLuint attr = swrast->_ActiveAttribs[a]; 2930bdf216dd06d5136b8529297297aa962bab548c2Brian 2940bdf216dd06d5136b8529297297aa962bab548c2Brian#define ATTRIB_LOOP_END } } 2950bdf216dd06d5136b8529297297aa962bab548c2Brian 2960bdf216dd06d5136b8529297297aa962bab548c2Brian 2970bdf216dd06d5136b8529297297aa962bab548c2Brian 298cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell#endif 299