s_context.h revision 7aed2b0c30c6d29d70efd2402a68a8e3de98418c
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 46c223c6b663cd5db39ba19c2be74b88cc3b8f53f3Brian#include "main/mtypes.h" 47c223c6b663cd5db39ba19c2be74b88cc3b8f53f3Brian#include "shader/prog_execute.h" 48cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell#include "swrast.h" 493866558c9840f9c4fed6ac0bd2994ccc67f40f7fBrian#include "s_span.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], 55de2afd8688ceb45013d15be7c6e0995199b80e5aBrian Paul const GLfloat lambda[], GLfloat 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; 131fcd7c37fd3d0f61cf6ac81170bc0b3fca64ad9bbBrian GLfloat _BackfaceSign; /** +1 or -1 */ 132fcd7c37fd3d0f61cf6ac81170bc0b3fca64ad9bbBrian GLfloat _BackfaceCullSign; /** +1, 0, or -1 */ 13309da0b8e6621a831e3eeb9381430f2bed18a22adBrian Paul GLboolean _PreferPixelFog; /* Compute fog blend factor per fragment? */ 1347aed2b0c30c6d29d70efd2402a68a8e3de98418cBrian Paul GLboolean _TextureCombinePrimary; 13509da0b8e6621a831e3eeb9381430f2bed18a22adBrian Paul GLboolean _FogEnabled; 1369e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian GLboolean _DeferredTexture; 137dfe508ca7af1a6d1099cd65e257512ed1e17d893Brian Paul GLenum _FogMode; /* either GL_FOG_MODE or fragment program's fog mode */ 1381e1aac034c986a08248861363c0baa27dc2ae2d5Keith Whitwell 1390bdf216dd06d5136b8529297297aa962bab548c2Brian /** List/array of the fragment attributes to interpolate */ 1400bdf216dd06d5136b8529297297aa962bab548c2Brian GLuint _ActiveAttribs[FRAG_ATTRIB_MAX]; 1419e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian /** Same info, but as a bitmask */ 1429e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian GLbitfield _ActiveAttribMask; 1430bdf216dd06d5136b8529297297aa962bab548c2Brian /** Number of fragment attributes to interpolate */ 1440bdf216dd06d5136b8529297297aa962bab548c2Brian GLuint _NumActiveAttribs; 1459e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian /** Indicates how each attrib is to be interpolated (lines/tris) */ 1469e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian GLenum _InterpMode[FRAG_ATTRIB_MAX]; /* GL_FLAT or GL_SMOOTH (for now) */ 147dd34fe8679fa200e55cfaf8e80bbecdecea084e3Brian 1485e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen /* Accum buffer temporaries. 1491e1aac034c986a08248861363c0baa27dc2ae2d5Keith Whitwell */ 150bf80e1ed620836e2ca0dd3f7d2d4cb187d17563dBrian Paul GLboolean _IntegerAccumMode; /**< Storing unscaled integers? */ 151bf80e1ed620836e2ca0dd3f7d2d4cb187d17563dBrian Paul GLfloat _IntegerAccumScaler; /**< Implicit scale factor */ 152cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell 1531e1aac034c986a08248861363c0baa27dc2ae2d5Keith Whitwell /* Working values: 1541e1aac034c986a08248861363c0baa27dc2ae2d5Keith Whitwell */ 155bf80e1ed620836e2ca0dd3f7d2d4cb187d17563dBrian Paul GLuint StippleCounter; /**< Line stipple counter */ 156fcd7c37fd3d0f61cf6ac81170bc0b3fca64ad9bbBrian GLuint PointLineFacing; 157e00ac11d4dd05c56584622dc2707bbdcfe4b2707Brian Paul GLbitfield NewState; 1581e1aac034c986a08248861363c0baa27dc2ae2d5Keith Whitwell GLuint StateChanges; 159f782b8189e718974a40d72ac4f6b8d213ca99e1eBrian Paul GLenum Primitive; /* current primitive being drawn (ala glBegin) */ 1605e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen 1613a5bb1729d8c229a587e34ccd5ddc86e26811b9fBrian Paul void (*InvalidateState)( GLcontext *ctx, GLbitfield new_state ); 1623a5bb1729d8c229a587e34ccd5ddc86e26811b9fBrian Paul 1633a5bb1729d8c229a587e34ccd5ddc86e26811b9fBrian Paul /** 1643a5bb1729d8c229a587e34ccd5ddc86e26811b9fBrian Paul * When the NewState mask intersects these masks, we invalidate the 1653a5bb1729d8c229a587e34ccd5ddc86e26811b9fBrian Paul * Point/Line/Triangle function pointers below. 1663a5bb1729d8c229a587e34ccd5ddc86e26811b9fBrian Paul */ 1673a5bb1729d8c229a587e34ccd5ddc86e26811b9fBrian Paul /*@{*/ 1683a5bb1729d8c229a587e34ccd5ddc86e26811b9fBrian Paul GLbitfield InvalidatePointMask; 1693a5bb1729d8c229a587e34ccd5ddc86e26811b9fBrian Paul GLbitfield InvalidateLineMask; 1703a5bb1729d8c229a587e34ccd5ddc86e26811b9fBrian Paul GLbitfield InvalidateTriangleMask; 1713a5bb1729d8c229a587e34ccd5ddc86e26811b9fBrian Paul /*@}*/ 1723a5bb1729d8c229a587e34ccd5ddc86e26811b9fBrian Paul 1733a5bb1729d8c229a587e34ccd5ddc86e26811b9fBrian Paul /** 1743a5bb1729d8c229a587e34ccd5ddc86e26811b9fBrian Paul * Device drivers plug in functions for these callbacks. 1753a5bb1729d8c229a587e34ccd5ddc86e26811b9fBrian Paul * Will be called when the GL state change mask intersects the above masks. 176cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell */ 177bf80e1ed620836e2ca0dd3f7d2d4cb187d17563dBrian Paul /*@{*/ 178cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell void (*choose_point)( GLcontext * ); 179cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell void (*choose_line)( GLcontext * ); 180cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell void (*choose_triangle)( GLcontext * ); 181bf80e1ed620836e2ca0dd3f7d2d4cb187d17563dBrian Paul /*@}*/ 182cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell 1833a5bb1729d8c229a587e34ccd5ddc86e26811b9fBrian Paul /** 1843a5bb1729d8c229a587e34ccd5ddc86e26811b9fBrian Paul * Current point, line and triangle drawing functions. 1853a5bb1729d8c229a587e34ccd5ddc86e26811b9fBrian Paul */ 186bf80e1ed620836e2ca0dd3f7d2d4cb187d17563dBrian Paul /*@{*/ 187a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul swrast_point_func Point; 188a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul swrast_line_func Line; 189a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul swrast_tri_func Triangle; 190bf80e1ed620836e2ca0dd3f7d2d4cb187d17563dBrian Paul /*@}*/ 19146b0988c673b28e072fd0cbf477632a9ab6f9f18Keith Whitwell 192bf80e1ed620836e2ca0dd3f7d2d4cb187d17563dBrian Paul /** 193bf80e1ed620836e2ca0dd3f7d2d4cb187d17563dBrian Paul * Placeholders for when separate specular (or secondary color) is 19422144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes * enabled but texturing is not. 19546b0988c673b28e072fd0cbf477632a9ab6f9f18Keith Whitwell */ 196bf80e1ed620836e2ca0dd3f7d2d4cb187d17563dBrian Paul /*@{*/ 19746b0988c673b28e072fd0cbf477632a9ab6f9f18Keith Whitwell swrast_point_func SpecPoint; 19846b0988c673b28e072fd0cbf477632a9ab6f9f18Keith Whitwell swrast_line_func SpecLine; 19946b0988c673b28e072fd0cbf477632a9ab6f9f18Keith Whitwell swrast_tri_func SpecTriangle; 200bf80e1ed620836e2ca0dd3f7d2d4cb187d17563dBrian Paul /*@}*/ 20146b0988c673b28e072fd0cbf477632a9ab6f9f18Keith Whitwell 20277df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul /** 20377df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul * Typically, we'll allocate a sw_span structure as a local variable 20477df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul * and set its 'array' pointer to point to this object. The reason is 20577df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul * this object is big and causes problems when allocated on the stack 20677df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul * on some systems. 20777df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul */ 208cdb27e8242215271364602995d85607cfc06d441Brian Paul SWspanarrays *SpanArrays; 209ec2d0decbd739df99cac4baba57fe0005bf4894dBrian Paul SWspanarrays *ZoomedArrays; /**< For pixel zooming */ 210f782b8189e718974a40d72ac4f6b8d213ca99e1eBrian Paul 211f782b8189e718974a40d72ac4f6b8d213ca99e1eBrian Paul /** 212f782b8189e718974a40d72ac4f6b8d213ca99e1eBrian Paul * Used to buffer N GL_POINTS, instead of rendering one by one. 213f782b8189e718974a40d72ac4f6b8d213ca99e1eBrian Paul */ 214cdb27e8242215271364602995d85607cfc06d441Brian Paul SWspan PointSpan; 215cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell 2168885b077ed7180e93a002d93864a8ff7b0bb81f3Brian Paul /** Internal hooks, kept up to date by the same mechanism as above. 217cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell */ 218cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell blend_func BlendFunc; 219b8d6607acd3b6d18dab0c7247d5e0fc72e98ceaeBrian Paul texture_sample_func TextureSample[MAX_TEXTURE_IMAGE_UNITS]; 220cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell 221f595212336ae63c981f0f39f4ea1dec67ff7fe25Brian Paul /** Buffer for saving the sampled texture colors. 222f595212336ae63c981f0f39f4ea1dec67ff7fe25Brian Paul * Needed for GL_ARB_texture_env_crossbar implementation. 223f595212336ae63c981f0f39f4ea1dec67ff7fe25Brian Paul */ 224de2afd8688ceb45013d15be7c6e0995199b80e5aBrian Paul GLfloat *TexelBuffer; 225f595212336ae63c981f0f39f4ea1dec67ff7fe25Brian Paul 226ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul validate_texture_image_func ValidateTextureImage; 227ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul 2288b5fce6bcc88cd9dd321f0db95c1714e5e5e85a1Brian /** State used during execution of fragment programs */ 2298b5fce6bcc88cd9dd321f0db95c1714e5e5e85a1Brian struct gl_program_machine FragProgMachine; 2308b5fce6bcc88cd9dd321f0db95c1714e5e5e85a1Brian 231cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell} SWcontext; 232cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell 233cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell 234f431a3fb4dc1bf860203d79e54657e3a62bc50dfBrian Paulextern void 235cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell_swrast_validate_derived( GLcontext *ctx ); 236cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell 23704bda46739beb0dab7c8820bdbe67136470d42beBrianextern void 23804bda46739beb0dab7c8820bdbe67136470d42beBrian_swrast_update_texture_samplers(GLcontext *ctx); 23904bda46739beb0dab7c8820bdbe67136470d42beBrian 240cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell 24181ca8b93f212d1946c70660041ce97d98f352608Brian Paul/** Return SWcontext for the given GLcontext */ 24281ca8b93f212d1946c70660041ce97d98f352608Brian Paulstatic INLINE SWcontext * 24381ca8b93f212d1946c70660041ce97d98f352608Brian PaulSWRAST_CONTEXT(GLcontext *ctx) 24481ca8b93f212d1946c70660041ce97d98f352608Brian Paul{ 24581ca8b93f212d1946c70660041ce97d98f352608Brian Paul return (SWcontext *) ctx->swrast_context; 24681ca8b93f212d1946c70660041ce97d98f352608Brian Paul} 24781ca8b93f212d1946c70660041ce97d98f352608Brian Paul 24881ca8b93f212d1946c70660041ce97d98f352608Brian Paul/** const version of above */ 24981ca8b93f212d1946c70660041ce97d98f352608Brian Paulstatic INLINE const SWcontext * 25081ca8b93f212d1946c70660041ce97d98f352608Brian PaulCONST_SWRAST_CONTEXT(const GLcontext *ctx) 25181ca8b93f212d1946c70660041ce97d98f352608Brian Paul{ 25281ca8b93f212d1946c70660041ce97d98f352608Brian Paul return (const SWcontext *) ctx->swrast_context; 25381ca8b93f212d1946c70660041ce97d98f352608Brian Paul} 25481ca8b93f212d1946c70660041ce97d98f352608Brian Paul 255cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell 2562d5b86be25a7ccb729e746aa5e1bdd537d76df68Brian Paul/** 2572d5b86be25a7ccb729e746aa5e1bdd537d76df68Brian Paul * Called prior to framebuffer reading/writing. 2582d5b86be25a7ccb729e746aa5e1bdd537d76df68Brian Paul * For drivers that rely on swrast for fallback rendering, this is the 2592d5b86be25a7ccb729e746aa5e1bdd537d76df68Brian Paul * driver's opportunity to map renderbuffers and textures. 2602d5b86be25a7ccb729e746aa5e1bdd537d76df68Brian Paul */ 2612d5b86be25a7ccb729e746aa5e1bdd537d76df68Brian Paulstatic INLINE void 2622d5b86be25a7ccb729e746aa5e1bdd537d76df68Brian Paulswrast_render_start(GLcontext *ctx) 2632d5b86be25a7ccb729e746aa5e1bdd537d76df68Brian Paul{ 2642d5b86be25a7ccb729e746aa5e1bdd537d76df68Brian Paul SWcontext *swrast = SWRAST_CONTEXT(ctx); 2652d5b86be25a7ccb729e746aa5e1bdd537d76df68Brian Paul if (swrast->Driver.SpanRenderStart) 2662d5b86be25a7ccb729e746aa5e1bdd537d76df68Brian Paul swrast->Driver.SpanRenderStart(ctx); 2672d5b86be25a7ccb729e746aa5e1bdd537d76df68Brian Paul} 2682d5b86be25a7ccb729e746aa5e1bdd537d76df68Brian Paul 2692d5b86be25a7ccb729e746aa5e1bdd537d76df68Brian Paul 2702d5b86be25a7ccb729e746aa5e1bdd537d76df68Brian Paul/** Called after framebuffer reading/writing */ 2712d5b86be25a7ccb729e746aa5e1bdd537d76df68Brian Paulstatic INLINE void 2722d5b86be25a7ccb729e746aa5e1bdd537d76df68Brian Paulswrast_render_finish(GLcontext *ctx) 2732d5b86be25a7ccb729e746aa5e1bdd537d76df68Brian Paul{ 2742d5b86be25a7ccb729e746aa5e1bdd537d76df68Brian Paul SWcontext *swrast = SWRAST_CONTEXT(ctx); 2752d5b86be25a7ccb729e746aa5e1bdd537d76df68Brian Paul if (swrast->Driver.SpanRenderFinish) 2762d5b86be25a7ccb729e746aa5e1bdd537d76df68Brian Paul swrast->Driver.SpanRenderFinish(ctx); 2772d5b86be25a7ccb729e746aa5e1bdd537d76df68Brian Paul} 278cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell 279cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell 280f431a3fb4dc1bf860203d79e54657e3a62bc50dfBrian Paul 28176e778dce59aa6f290db50242df945943fc47b05Brian Paul/** 28276e778dce59aa6f290db50242df945943fc47b05Brian Paul * Size of an RGBA pixel, in bytes, for given datatype. 28376e778dce59aa6f290db50242df945943fc47b05Brian Paul */ 28476e778dce59aa6f290db50242df945943fc47b05Brian Paul#define RGBA_PIXEL_SIZE(TYPE) \ 28576e778dce59aa6f290db50242df945943fc47b05Brian Paul ((TYPE == GL_UNSIGNED_BYTE) ? 4 * sizeof(GLubyte) : \ 28676e778dce59aa6f290db50242df945943fc47b05Brian Paul ((TYPE == GL_UNSIGNED_SHORT) ? 4 * sizeof(GLushort) \ 28776e778dce59aa6f290db50242df945943fc47b05Brian Paul : 4 * sizeof(GLfloat))) 28876e778dce59aa6f290db50242df945943fc47b05Brian Paul 28976e778dce59aa6f290db50242df945943fc47b05Brian Paul 29076e778dce59aa6f290db50242df945943fc47b05Brian Paul 291f431a3fb4dc1bf860203d79e54657e3a62bc50dfBrian Paul/* 292389d50baff8234fdf4d7bcddeb09658d7d17012dBrian Paul * Fixed point arithmetic macros 293389d50baff8234fdf4d7bcddeb09658d7d17012dBrian Paul */ 294389d50baff8234fdf4d7bcddeb09658d7d17012dBrian Paul#ifndef FIXED_FRAC_BITS 295389d50baff8234fdf4d7bcddeb09658d7d17012dBrian Paul#define FIXED_FRAC_BITS 11 296389d50baff8234fdf4d7bcddeb09658d7d17012dBrian Paul#endif 297389d50baff8234fdf4d7bcddeb09658d7d17012dBrian Paul 298389d50baff8234fdf4d7bcddeb09658d7d17012dBrian Paul#define FIXED_SHIFT FIXED_FRAC_BITS 299389d50baff8234fdf4d7bcddeb09658d7d17012dBrian Paul#define FIXED_ONE (1 << FIXED_SHIFT) 300389d50baff8234fdf4d7bcddeb09658d7d17012dBrian Paul#define FIXED_HALF (1 << (FIXED_SHIFT-1)) 301389d50baff8234fdf4d7bcddeb09658d7d17012dBrian Paul#define FIXED_FRAC_MASK (FIXED_ONE - 1) 302389d50baff8234fdf4d7bcddeb09658d7d17012dBrian Paul#define FIXED_INT_MASK (~FIXED_FRAC_MASK) 303389d50baff8234fdf4d7bcddeb09658d7d17012dBrian Paul#define FIXED_EPSILON 1 304389d50baff8234fdf4d7bcddeb09658d7d17012dBrian Paul#define FIXED_SCALE ((float) FIXED_ONE) 305389d50baff8234fdf4d7bcddeb09658d7d17012dBrian Paul#define FIXED_DBL_SCALE ((double) FIXED_ONE) 306389d50baff8234fdf4d7bcddeb09658d7d17012dBrian Paul#define FloatToFixed(X) (IROUND((X) * FIXED_SCALE)) 307389d50baff8234fdf4d7bcddeb09658d7d17012dBrian Paul#define FixedToDouble(X) ((X) * (1.0 / FIXED_DBL_SCALE)) 308389d50baff8234fdf4d7bcddeb09658d7d17012dBrian Paul#define IntToFixed(I) ((I) << FIXED_SHIFT) 309389d50baff8234fdf4d7bcddeb09658d7d17012dBrian Paul#define FixedToInt(X) ((X) >> FIXED_SHIFT) 310389d50baff8234fdf4d7bcddeb09658d7d17012dBrian Paul#define FixedToUns(X) (((unsigned int)(X)) >> FIXED_SHIFT) 311389d50baff8234fdf4d7bcddeb09658d7d17012dBrian Paul#define FixedCeil(X) (((X) + FIXED_ONE - FIXED_EPSILON) & FIXED_INT_MASK) 312389d50baff8234fdf4d7bcddeb09658d7d17012dBrian Paul#define FixedFloor(X) ((X) & FIXED_INT_MASK) 313389d50baff8234fdf4d7bcddeb09658d7d17012dBrian Paul#define FixedToFloat(X) ((X) * (1.0F / FIXED_SCALE)) 314389d50baff8234fdf4d7bcddeb09658d7d17012dBrian Paul#define PosFloatToFixed(X) FloatToFixed(X) 315389d50baff8234fdf4d7bcddeb09658d7d17012dBrian Paul#define SignedFloatToFixed(X) FloatToFixed(X) 316389d50baff8234fdf4d7bcddeb09658d7d17012dBrian Paul 317389d50baff8234fdf4d7bcddeb09658d7d17012dBrian Paul 318389d50baff8234fdf4d7bcddeb09658d7d17012dBrian Paul 319389d50baff8234fdf4d7bcddeb09658d7d17012dBrian Paul/* 320f431a3fb4dc1bf860203d79e54657e3a62bc50dfBrian Paul * XXX these macros are just bandages for now in order to make 321f431a3fb4dc1bf860203d79e54657e3a62bc50dfBrian Paul * CHAN_BITS==32 compile cleanly. 322f431a3fb4dc1bf860203d79e54657e3a62bc50dfBrian Paul * These should probably go elsewhere at some point. 323f431a3fb4dc1bf860203d79e54657e3a62bc50dfBrian Paul */ 324f431a3fb4dc1bf860203d79e54657e3a62bc50dfBrian Paul#if CHAN_TYPE == GL_FLOAT 32560174c1aef7c6650a800f16f103a4f9ed2d1004eBrian Paul#define ChanToFixed(X) (X) 32660174c1aef7c6650a800f16f103a4f9ed2d1004eBrian Paul#define FixedToChan(X) (X) 327f431a3fb4dc1bf860203d79e54657e3a62bc50dfBrian Paul#else 328f431a3fb4dc1bf860203d79e54657e3a62bc50dfBrian Paul#define ChanToFixed(X) IntToFixed(X) 329f431a3fb4dc1bf860203d79e54657e3a62bc50dfBrian Paul#define FixedToChan(X) FixedToInt(X) 330f431a3fb4dc1bf860203d79e54657e3a62bc50dfBrian Paul#endif 331f431a3fb4dc1bf860203d79e54657e3a62bc50dfBrian Paul 3320bdf216dd06d5136b8529297297aa962bab548c2Brian 3330bdf216dd06d5136b8529297297aa962bab548c2Brian/** 3340bdf216dd06d5136b8529297297aa962bab548c2Brian * For looping over fragment attributes in the pointe, line 3350bdf216dd06d5136b8529297297aa962bab548c2Brian * triangle rasterizers. 3360bdf216dd06d5136b8529297297aa962bab548c2Brian */ 3370bdf216dd06d5136b8529297297aa962bab548c2Brian#define ATTRIB_LOOP_BEGIN \ 3380bdf216dd06d5136b8529297297aa962bab548c2Brian { \ 3390bdf216dd06d5136b8529297297aa962bab548c2Brian GLuint a; \ 3400bdf216dd06d5136b8529297297aa962bab548c2Brian for (a = 0; a < swrast->_NumActiveAttribs; a++) { \ 3410bdf216dd06d5136b8529297297aa962bab548c2Brian const GLuint attr = swrast->_ActiveAttribs[a]; 3420bdf216dd06d5136b8529297297aa962bab548c2Brian 3430bdf216dd06d5136b8529297297aa962bab548c2Brian#define ATTRIB_LOOP_END } } 3440bdf216dd06d5136b8529297297aa962bab548c2Brian 3450bdf216dd06d5136b8529297297aa962bab548c2Brian 3460bdf216dd06d5136b8529297297aa962bab548c2Brian 347cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell#endif 348