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 46690ead0f2248c117f675004a1c1918f425ca326fVinson Lee#include "main/compiler.h" 47c223c6b663cd5db39ba19c2be74b88cc3b8f53f3Brian#include "main/mtypes.h" 48ec2b92f98c2e7f161521b447cc1d9a36bce3707cBrian Paul#include "program/prog_execute.h" 49cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell#include "swrast.h" 50ab1195cf1127781909d5158c7de68f8732458d75Chad Versace#include "s_fragprog.h" 513866558c9840f9c4fed6ac0bd2994ccc67f40f7fBrian#include "s_span.h" 52b8d6607acd3b6d18dab0c7247d5e0fc72e98ceaeBrian Paul 53b8d6607acd3b6d18dab0c7247d5e0fc72e98ceaeBrian Paul 54f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergtypedef void (*texture_sample_func)(struct gl_context *ctx, 55cbdc1d53542b3ecca0085399c4bb3b3371f94809Pauli Nieminen const struct gl_sampler_object *samp, 56b8d6607acd3b6d18dab0c7247d5e0fc72e98ceaeBrian Paul const struct gl_texture_object *tObj, 57b8d6607acd3b6d18dab0c7247d5e0fc72e98ceaeBrian Paul GLuint n, const GLfloat texcoords[][4], 58de2afd8688ceb45013d15be7c6e0995199b80e5aBrian Paul const GLfloat lambda[], GLfloat rgba[][4]); 59b8d6607acd3b6d18dab0c7247d5e0fc72e98ceaeBrian Paul 60f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergtypedef void (_ASMAPIP blend_func)( struct gl_context *ctx, GLuint n, 61cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell const GLubyte mask[], 62d92da49bae30be612efb6ea20bdfda232ee3d01dBrian Paul GLvoid *src, const GLvoid *dst, 63a50b7dbc3ba1db8c92b4bbb4f7f06de8d6c039c4Brian Paul GLenum chanType); 64cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell 65f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergtypedef void (*swrast_point_func)( struct gl_context *ctx, const SWvertex *); 66a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul 67f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergtypedef void (*swrast_line_func)( struct gl_context *ctx, 68a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul const SWvertex *, const SWvertex *); 69a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul 70f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergtypedef void (*swrast_tri_func)( struct gl_context *ctx, const SWvertex *, 71a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul const SWvertex *, const SWvertex *); 72a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul 73a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul 74f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergtypedef void (*validate_texture_image_func)(struct gl_context *ctx, 75ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul struct gl_texture_object *texObj, 76ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul GLuint face, GLuint level); 77ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul 78ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul 793866558c9840f9c4fed6ac0bd2994ccc67f40f7fBrian/** 803866558c9840f9c4fed6ac0bd2994ccc67f40f7fBrian * \defgroup Bitmasks 81bf80e1ed620836e2ca0dd3f7d2d4cb187d17563dBrian Paul * Bitmasks to indicate which rasterization options are enabled 82bf80e1ed620836e2ca0dd3f7d2d4cb187d17563dBrian Paul * (RasterMask) 83cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell */ 84bf80e1ed620836e2ca0dd3f7d2d4cb187d17563dBrian Paul/*@{*/ 85bf80e1ed620836e2ca0dd3f7d2d4cb187d17563dBrian Paul#define ALPHATEST_BIT 0x001 /**< Alpha-test pixels */ 86bf80e1ed620836e2ca0dd3f7d2d4cb187d17563dBrian Paul#define BLEND_BIT 0x002 /**< Blend pixels */ 87bf80e1ed620836e2ca0dd3f7d2d4cb187d17563dBrian Paul#define DEPTH_BIT 0x004 /**< Depth-test pixels */ 88bf80e1ed620836e2ca0dd3f7d2d4cb187d17563dBrian Paul#define FOG_BIT 0x008 /**< Fog pixels */ 89bf80e1ed620836e2ca0dd3f7d2d4cb187d17563dBrian Paul#define LOGIC_OP_BIT 0x010 /**< Apply logic op in software */ 90bf80e1ed620836e2ca0dd3f7d2d4cb187d17563dBrian Paul#define CLIP_BIT 0x020 /**< Scissor or window clip pixels */ 91bf80e1ed620836e2ca0dd3f7d2d4cb187d17563dBrian Paul#define STENCIL_BIT 0x040 /**< Stencil pixels */ 92bf80e1ed620836e2ca0dd3f7d2d4cb187d17563dBrian Paul#define MASKING_BIT 0x080 /**< Do glColorMask or glIndexMask */ 93bf80e1ed620836e2ca0dd3f7d2d4cb187d17563dBrian Paul#define MULTI_DRAW_BIT 0x400 /**< Write to more than one color- */ 94bf80e1ed620836e2ca0dd3f7d2d4cb187d17563dBrian Paul /**< buffer or no buffers. */ 95bf80e1ed620836e2ca0dd3f7d2d4cb187d17563dBrian Paul#define OCCLUSION_BIT 0x800 /**< GL_HP_occlusion_test enabled */ 96bf80e1ed620836e2ca0dd3f7d2d4cb187d17563dBrian Paul#define TEXTURE_BIT 0x1000 /**< Texturing really enabled */ 9792f9785c727ea10ff5f8dc9770f0e8f388fcea70Brian Paul#define FRAGPROG_BIT 0x2000 /**< Fragment program enabled */ 987f752fed993e5e9423abac200dd59141edbada56Dave Airlie#define ATIFRAGSHADER_BIT 0x4000 /**< ATI Fragment shader enabled */ 99ba3da6154c324cc916845bc5de3de077d0b59ffcBrian Paul#define CLAMPING_BIT 0x8000 /**< Clamp colors to [0,1] */ 100bf80e1ed620836e2ca0dd3f7d2d4cb187d17563dBrian Paul/*@}*/ 101cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell 102cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell#define _SWRAST_NEW_RASTERMASK (_NEW_BUFFERS| \ 103cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell _NEW_SCISSOR| \ 104cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell _NEW_COLOR| \ 105cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell _NEW_DEPTH| \ 106cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell _NEW_FOG| \ 10792f9785c727ea10ff5f8dc9770f0e8f388fcea70Brian Paul _NEW_PROGRAM| \ 108cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell _NEW_STENCIL| \ 109cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell _NEW_TEXTURE| \ 110cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell _NEW_VIEWPORT| \ 111cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell _NEW_DEPTH) 112cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell 113cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell 114a1661dc8957a35899d653e9fffd97f166c56be56Brian Paulstruct swrast_texture_image; 115a1661dc8957a35899d653e9fffd97f166c56be56Brian Paul 116a1661dc8957a35899d653e9fffd97f166c56be56Brian Paul 117a1661dc8957a35899d653e9fffd97f166c56be56Brian Paul/** 118ba69c4a0025e73ec2997795ddb4c3d6a210bfe32Brian Paul * Fetch a texel from texture image at given position. 119a1661dc8957a35899d653e9fffd97f166c56be56Brian Paul */ 1205ac96033c52eb2185b9b30bcbb40846d2216d0d3Brian Paultypedef void (*FetchTexelFunc)(const struct swrast_texture_image *texImage, 1215ac96033c52eb2185b9b30bcbb40846d2216d0d3Brian Paul GLint col, GLint row, GLint img, 1225ac96033c52eb2185b9b30bcbb40846d2216d0d3Brian Paul GLfloat *texelOut); 123a1661dc8957a35899d653e9fffd97f166c56be56Brian Paul 124a1661dc8957a35899d653e9fffd97f166c56be56Brian Paul 125bf80e1ed620836e2ca0dd3f7d2d4cb187d17563dBrian Paul/** 1261da896803cdd09293c7bb0048a2116e237a51766Brian Paul * Subclass of gl_texture_image. 1271da896803cdd09293c7bb0048a2116e237a51766Brian Paul * We need extra fields/info to keep tracking of mapped texture buffers, 1289403cc3aba0769dc6925cea3ec20aa95d491f516Brian Paul * strides and Fetch functions. 1291da896803cdd09293c7bb0048a2116e237a51766Brian Paul */ 1301da896803cdd09293c7bb0048a2116e237a51766Brian Paulstruct swrast_texture_image 1311da896803cdd09293c7bb0048a2116e237a51766Brian Paul{ 1321da896803cdd09293c7bb0048a2116e237a51766Brian Paul struct gl_texture_image Base; 1331da896803cdd09293c7bb0048a2116e237a51766Brian Paul 134eaf376ba354db11f7729452060570b48a029c9a0Brian Paul GLboolean _IsPowerOfTwo; /**< Are all dimensions powers of two? */ 135eaf376ba354db11f7729452060570b48a029c9a0Brian Paul 136a1661dc8957a35899d653e9fffd97f166c56be56Brian Paul /** used for mipmap LOD computation */ 137a1661dc8957a35899d653e9fffd97f166c56be56Brian Paul GLfloat WidthScale, HeightScale, DepthScale; 138a1661dc8957a35899d653e9fffd97f166c56be56Brian Paul 1396e0f9001fe3fb191c2928bd09aa9e9d05ddf4ea9Brian Paul /** These fields only valid when texture memory is mapped */ 1406e0f9001fe3fb191c2928bd09aa9e9d05ddf4ea9Brian Paul GLint RowStride; /**< Padded width in units of texels */ 1416e0f9001fe3fb191c2928bd09aa9e9d05ddf4ea9Brian Paul GLuint *ImageOffsets; /**< if 3D texture: array [Depth] of offsets to 1426e0f9001fe3fb191c2928bd09aa9e9d05ddf4ea9Brian Paul each 2D slice in 'Data', in texels */ 143bd3c10c0f0c60ab3421c2da2eab814edc2296cb0Brian Paul GLubyte *Map; /**< Pointer to mapped image memory */ 144a1661dc8957a35899d653e9fffd97f166c56be56Brian Paul 145c9bb1bdc4859af001f0bc9a931eaf53266b49c0cBrian Paul /** Malloc'd texture memory */ 14668da4b50e9b6aa72a9b155f650952620063e1b94Brian Paul GLubyte *Buffer; 14768da4b50e9b6aa72a9b155f650952620063e1b94Brian Paul 1485ac96033c52eb2185b9b30bcbb40846d2216d0d3Brian Paul FetchTexelFunc FetchTexel; 1491da896803cdd09293c7bb0048a2116e237a51766Brian Paul}; 1501da896803cdd09293c7bb0048a2116e237a51766Brian Paul 1511da896803cdd09293c7bb0048a2116e237a51766Brian Paul 1521da896803cdd09293c7bb0048a2116e237a51766Brian Paul/** cast wrapper */ 1539520f483b8f1e45fa474674b415554988de5d8d3Brian Paulstatic inline struct swrast_texture_image * 1541da896803cdd09293c7bb0048a2116e237a51766Brian Paulswrast_texture_image(struct gl_texture_image *img) 1551da896803cdd09293c7bb0048a2116e237a51766Brian Paul{ 1561da896803cdd09293c7bb0048a2116e237a51766Brian Paul return (struct swrast_texture_image *) img; 1571da896803cdd09293c7bb0048a2116e237a51766Brian Paul} 1581da896803cdd09293c7bb0048a2116e237a51766Brian Paul 1591da896803cdd09293c7bb0048a2116e237a51766Brian Paul/** cast wrapper */ 1609520f483b8f1e45fa474674b415554988de5d8d3Brian Paulstatic inline const struct swrast_texture_image * 1611da896803cdd09293c7bb0048a2116e237a51766Brian Paulswrast_texture_image_const(const struct gl_texture_image *img) 1621da896803cdd09293c7bb0048a2116e237a51766Brian Paul{ 1631da896803cdd09293c7bb0048a2116e237a51766Brian Paul return (const struct swrast_texture_image *) img; 1641da896803cdd09293c7bb0048a2116e237a51766Brian Paul} 1651da896803cdd09293c7bb0048a2116e237a51766Brian Paul 1661da896803cdd09293c7bb0048a2116e237a51766Brian Paul 1671da896803cdd09293c7bb0048a2116e237a51766Brian Paul/** 16834988272d9c7a889a26bb8bdcb841d44797a5dd6Brian Paul * Subclass of gl_renderbuffer with extra fields needed for software 16934988272d9c7a889a26bb8bdcb841d44797a5dd6Brian Paul * rendering. 17034988272d9c7a889a26bb8bdcb841d44797a5dd6Brian Paul */ 17134988272d9c7a889a26bb8bdcb841d44797a5dd6Brian Paulstruct swrast_renderbuffer 17234988272d9c7a889a26bb8bdcb841d44797a5dd6Brian Paul{ 17334988272d9c7a889a26bb8bdcb841d44797a5dd6Brian Paul struct gl_renderbuffer Base; 17434988272d9c7a889a26bb8bdcb841d44797a5dd6Brian Paul 17534988272d9c7a889a26bb8bdcb841d44797a5dd6Brian Paul GLubyte *Buffer; /**< The malloc'd memory for buffer */ 17634988272d9c7a889a26bb8bdcb841d44797a5dd6Brian Paul 17734988272d9c7a889a26bb8bdcb841d44797a5dd6Brian Paul /** These fields are only valid while buffer is mapped for rendering */ 17834988272d9c7a889a26bb8bdcb841d44797a5dd6Brian Paul GLubyte *Map; 17934988272d9c7a889a26bb8bdcb841d44797a5dd6Brian Paul GLint RowStride; /**< in bytes */ 180bd1ae51b13535bc4438c663ffe91ded49db4890aBrian Paul 181bd1ae51b13535bc4438c663ffe91ded49db4890aBrian Paul /** For span rendering */ 182bd1ae51b13535bc4438c663ffe91ded49db4890aBrian Paul GLenum ColorType; 18334988272d9c7a889a26bb8bdcb841d44797a5dd6Brian Paul}; 18434988272d9c7a889a26bb8bdcb841d44797a5dd6Brian Paul 18534988272d9c7a889a26bb8bdcb841d44797a5dd6Brian Paul 18634988272d9c7a889a26bb8bdcb841d44797a5dd6Brian Paul/** cast wrapper */ 18734988272d9c7a889a26bb8bdcb841d44797a5dd6Brian Paulstatic inline struct swrast_renderbuffer * 18834988272d9c7a889a26bb8bdcb841d44797a5dd6Brian Paulswrast_renderbuffer(struct gl_renderbuffer *img) 18934988272d9c7a889a26bb8bdcb841d44797a5dd6Brian Paul{ 19034988272d9c7a889a26bb8bdcb841d44797a5dd6Brian Paul return (struct swrast_renderbuffer *) img; 19134988272d9c7a889a26bb8bdcb841d44797a5dd6Brian Paul} 19234988272d9c7a889a26bb8bdcb841d44797a5dd6Brian Paul 19334988272d9c7a889a26bb8bdcb841d44797a5dd6Brian Paul 19434988272d9c7a889a26bb8bdcb841d44797a5dd6Brian Paul 19534988272d9c7a889a26bb8bdcb841d44797a5dd6Brian Paul/** 196bf80e1ed620836e2ca0dd3f7d2d4cb187d17563dBrian Paul * \struct SWcontext 197cdb27e8242215271364602995d85607cfc06d441Brian Paul * \brief Per-context state that's private to the software rasterizer module. 198bf80e1ed620836e2ca0dd3f7d2d4cb187d17563dBrian Paul */ 199cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwelltypedef struct 200cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell{ 201bf80e1ed620836e2ca0dd3f7d2d4cb187d17563dBrian Paul /** Driver interface: 202709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell */ 203709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell struct swrast_device_driver Driver; 204709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell 205bf80e1ed620836e2ca0dd3f7d2d4cb187d17563dBrian Paul /** Configuration mechanisms to make software rasterizer match 2065e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen * characteristics of the hardware rasterizer (if present): 2071e1aac034c986a08248861363c0baa27dc2ae2d5Keith Whitwell */ 2081e1aac034c986a08248861363c0baa27dc2ae2d5Keith Whitwell GLboolean AllowVertexFog; 2091e1aac034c986a08248861363c0baa27dc2ae2d5Keith Whitwell GLboolean AllowPixelFog; 2101e1aac034c986a08248861363c0baa27dc2ae2d5Keith Whitwell 211bf80e1ed620836e2ca0dd3f7d2d4cb187d17563dBrian Paul /** Derived values, invalidated on statechanges, updated from 2121e1aac034c986a08248861363c0baa27dc2ae2d5Keith Whitwell * _swrast_validate_derived(): 2131e1aac034c986a08248861363c0baa27dc2ae2d5Keith Whitwell */ 214e00ac11d4dd05c56584622dc2707bbdcfe4b2707Brian Paul GLbitfield _RasterMask; 215fcd7c37fd3d0f61cf6ac81170bc0b3fca64ad9bbBrian GLfloat _BackfaceSign; /** +1 or -1 */ 216fcd7c37fd3d0f61cf6ac81170bc0b3fca64ad9bbBrian GLfloat _BackfaceCullSign; /** +1, 0, or -1 */ 21709da0b8e6621a831e3eeb9381430f2bed18a22adBrian Paul GLboolean _PreferPixelFog; /* Compute fog blend factor per fragment? */ 2187aed2b0c30c6d29d70efd2402a68a8e3de98418cBrian Paul GLboolean _TextureCombinePrimary; 21909da0b8e6621a831e3eeb9381430f2bed18a22adBrian Paul GLboolean _FogEnabled; 2209e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian GLboolean _DeferredTexture; 2211e1aac034c986a08248861363c0baa27dc2ae2d5Keith Whitwell 2220bdf216dd06d5136b8529297297aa962bab548c2Brian /** List/array of the fragment attributes to interpolate */ 2230bdf216dd06d5136b8529297297aa962bab548c2Brian GLuint _ActiveAttribs[FRAG_ATTRIB_MAX]; 2248dffb6bdab25dcacf165851e9d1fdb3beb73099aBrian Paul /** Same info, but as a bitmask of FRAG_BIT_x bits */ 2258dffb6bdab25dcacf165851e9d1fdb3beb73099aBrian Paul GLbitfield64 _ActiveAttribMask; 2260bdf216dd06d5136b8529297297aa962bab548c2Brian /** Number of fragment attributes to interpolate */ 2270bdf216dd06d5136b8529297297aa962bab548c2Brian GLuint _NumActiveAttribs; 2289e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian /** Indicates how each attrib is to be interpolated (lines/tris) */ 2299e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian GLenum _InterpMode[FRAG_ATTRIB_MAX]; /* GL_FLAT or GL_SMOOTH (for now) */ 230dd34fe8679fa200e55cfaf8e80bbecdecea084e3Brian 2311e1aac034c986a08248861363c0baa27dc2ae2d5Keith Whitwell /* Working values: 2321e1aac034c986a08248861363c0baa27dc2ae2d5Keith Whitwell */ 233bf80e1ed620836e2ca0dd3f7d2d4cb187d17563dBrian Paul GLuint StippleCounter; /**< Line stipple counter */ 234fcd7c37fd3d0f61cf6ac81170bc0b3fca64ad9bbBrian GLuint PointLineFacing; 235e00ac11d4dd05c56584622dc2707bbdcfe4b2707Brian Paul GLbitfield NewState; 2361e1aac034c986a08248861363c0baa27dc2ae2d5Keith Whitwell GLuint StateChanges; 237f782b8189e718974a40d72ac4f6b8d213ca99e1eBrian Paul GLenum Primitive; /* current primitive being drawn (ala glBegin) */ 23876ac75af8e5481b498981c133836efa2101be2dcBrian Paul GLboolean SpecularVertexAdd; /**< Add specular/secondary color per vertex */ 2395e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen 240f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg void (*InvalidateState)( struct gl_context *ctx, GLbitfield new_state ); 2413a5bb1729d8c229a587e34ccd5ddc86e26811b9fBrian Paul 2423a5bb1729d8c229a587e34ccd5ddc86e26811b9fBrian Paul /** 2433a5bb1729d8c229a587e34ccd5ddc86e26811b9fBrian Paul * When the NewState mask intersects these masks, we invalidate the 2443a5bb1729d8c229a587e34ccd5ddc86e26811b9fBrian Paul * Point/Line/Triangle function pointers below. 2453a5bb1729d8c229a587e34ccd5ddc86e26811b9fBrian Paul */ 2463a5bb1729d8c229a587e34ccd5ddc86e26811b9fBrian Paul /*@{*/ 2473a5bb1729d8c229a587e34ccd5ddc86e26811b9fBrian Paul GLbitfield InvalidatePointMask; 2483a5bb1729d8c229a587e34ccd5ddc86e26811b9fBrian Paul GLbitfield InvalidateLineMask; 2493a5bb1729d8c229a587e34ccd5ddc86e26811b9fBrian Paul GLbitfield InvalidateTriangleMask; 2503a5bb1729d8c229a587e34ccd5ddc86e26811b9fBrian Paul /*@}*/ 2513a5bb1729d8c229a587e34ccd5ddc86e26811b9fBrian Paul 2523a5bb1729d8c229a587e34ccd5ddc86e26811b9fBrian Paul /** 2533a5bb1729d8c229a587e34ccd5ddc86e26811b9fBrian Paul * Device drivers plug in functions for these callbacks. 2543a5bb1729d8c229a587e34ccd5ddc86e26811b9fBrian Paul * Will be called when the GL state change mask intersects the above masks. 255cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell */ 256bf80e1ed620836e2ca0dd3f7d2d4cb187d17563dBrian Paul /*@{*/ 257f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg void (*choose_point)( struct gl_context * ); 258f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg void (*choose_line)( struct gl_context * ); 259f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg void (*choose_triangle)( struct gl_context * ); 260bf80e1ed620836e2ca0dd3f7d2d4cb187d17563dBrian Paul /*@}*/ 261cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell 2623a5bb1729d8c229a587e34ccd5ddc86e26811b9fBrian Paul /** 2633a5bb1729d8c229a587e34ccd5ddc86e26811b9fBrian Paul * Current point, line and triangle drawing functions. 2643a5bb1729d8c229a587e34ccd5ddc86e26811b9fBrian Paul */ 265bf80e1ed620836e2ca0dd3f7d2d4cb187d17563dBrian Paul /*@{*/ 266a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul swrast_point_func Point; 267a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul swrast_line_func Line; 268a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul swrast_tri_func Triangle; 269bf80e1ed620836e2ca0dd3f7d2d4cb187d17563dBrian Paul /*@}*/ 27046b0988c673b28e072fd0cbf477632a9ab6f9f18Keith Whitwell 271bf80e1ed620836e2ca0dd3f7d2d4cb187d17563dBrian Paul /** 272bf80e1ed620836e2ca0dd3f7d2d4cb187d17563dBrian Paul * Placeholders for when separate specular (or secondary color) is 27322144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes * enabled but texturing is not. 27446b0988c673b28e072fd0cbf477632a9ab6f9f18Keith Whitwell */ 275bf80e1ed620836e2ca0dd3f7d2d4cb187d17563dBrian Paul /*@{*/ 27646b0988c673b28e072fd0cbf477632a9ab6f9f18Keith Whitwell swrast_point_func SpecPoint; 27746b0988c673b28e072fd0cbf477632a9ab6f9f18Keith Whitwell swrast_line_func SpecLine; 27846b0988c673b28e072fd0cbf477632a9ab6f9f18Keith Whitwell swrast_tri_func SpecTriangle; 279bf80e1ed620836e2ca0dd3f7d2d4cb187d17563dBrian Paul /*@}*/ 28046b0988c673b28e072fd0cbf477632a9ab6f9f18Keith Whitwell 28177df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul /** 28277df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul * Typically, we'll allocate a sw_span structure as a local variable 28377df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul * and set its 'array' pointer to point to this object. The reason is 28477df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul * this object is big and causes problems when allocated on the stack 28577df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul * on some systems. 28677df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul */ 287cdb27e8242215271364602995d85607cfc06d441Brian Paul SWspanarrays *SpanArrays; 288ec2d0decbd739df99cac4baba57fe0005bf4894dBrian Paul SWspanarrays *ZoomedArrays; /**< For pixel zooming */ 289f782b8189e718974a40d72ac4f6b8d213ca99e1eBrian Paul 290f782b8189e718974a40d72ac4f6b8d213ca99e1eBrian Paul /** 291f782b8189e718974a40d72ac4f6b8d213ca99e1eBrian Paul * Used to buffer N GL_POINTS, instead of rendering one by one. 292f782b8189e718974a40d72ac4f6b8d213ca99e1eBrian Paul */ 293cdb27e8242215271364602995d85607cfc06d441Brian Paul SWspan PointSpan; 294cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell 2958885b077ed7180e93a002d93864a8ff7b0bb81f3Brian Paul /** Internal hooks, kept up to date by the same mechanism as above. 296cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell */ 297cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell blend_func BlendFunc; 298b8d6607acd3b6d18dab0c7247d5e0fc72e98ceaeBrian Paul texture_sample_func TextureSample[MAX_TEXTURE_IMAGE_UNITS]; 299cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell 300f595212336ae63c981f0f39f4ea1dec67ff7fe25Brian Paul /** Buffer for saving the sampled texture colors. 301f595212336ae63c981f0f39f4ea1dec67ff7fe25Brian Paul * Needed for GL_ARB_texture_env_crossbar implementation. 302f595212336ae63c981f0f39f4ea1dec67ff7fe25Brian Paul */ 303de2afd8688ceb45013d15be7c6e0995199b80e5aBrian Paul GLfloat *TexelBuffer; 304f595212336ae63c981f0f39f4ea1dec67ff7fe25Brian Paul 305ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul validate_texture_image_func ValidateTextureImage; 306ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul 3078b5fce6bcc88cd9dd321f0db95c1714e5e5e85a1Brian /** State used during execution of fragment programs */ 3088b5fce6bcc88cd9dd321f0db95c1714e5e5e85a1Brian struct gl_program_machine FragProgMachine; 3098b5fce6bcc88cd9dd321f0db95c1714e5e5e85a1Brian 31032bf36106ea433038b524311fc10cc5b835862f1Brian Paul /** Temporary arrays for stencil operations. To avoid large stack 31132bf36106ea433038b524311fc10cc5b835862f1Brian Paul * allocations. 31232bf36106ea433038b524311fc10cc5b835862f1Brian Paul */ 31332bf36106ea433038b524311fc10cc5b835862f1Brian Paul struct { 31432bf36106ea433038b524311fc10cc5b835862f1Brian Paul GLubyte *buf1, *buf2, *buf3, *buf4; 31532bf36106ea433038b524311fc10cc5b835862f1Brian Paul } stencil_temp; 31632bf36106ea433038b524311fc10cc5b835862f1Brian Paul 317cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell} SWcontext; 318cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell 319cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell 320f431a3fb4dc1bf860203d79e54657e3a62bc50dfBrian Paulextern void 321f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg_swrast_validate_derived( struct gl_context *ctx ); 322cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell 32304bda46739beb0dab7c8820bdbe67136470d42beBrianextern void 324f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg_swrast_update_texture_samplers(struct gl_context *ctx); 32504bda46739beb0dab7c8820bdbe67136470d42beBrian 326cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell 327f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg/** Return SWcontext for the given struct gl_context */ 3289520f483b8f1e45fa474674b415554988de5d8d3Brian Paulstatic inline SWcontext * 329f9995b30756140724f41daf963fa06167912be7fKristian HøgsbergSWRAST_CONTEXT(struct gl_context *ctx) 33081ca8b93f212d1946c70660041ce97d98f352608Brian Paul{ 33181ca8b93f212d1946c70660041ce97d98f352608Brian Paul return (SWcontext *) ctx->swrast_context; 33281ca8b93f212d1946c70660041ce97d98f352608Brian Paul} 33381ca8b93f212d1946c70660041ce97d98f352608Brian Paul 33481ca8b93f212d1946c70660041ce97d98f352608Brian Paul/** const version of above */ 3359520f483b8f1e45fa474674b415554988de5d8d3Brian Paulstatic inline const SWcontext * 336f9995b30756140724f41daf963fa06167912be7fKristian HøgsbergCONST_SWRAST_CONTEXT(const struct gl_context *ctx) 33781ca8b93f212d1946c70660041ce97d98f352608Brian Paul{ 33881ca8b93f212d1946c70660041ce97d98f352608Brian Paul return (const SWcontext *) ctx->swrast_context; 33981ca8b93f212d1946c70660041ce97d98f352608Brian Paul} 34081ca8b93f212d1946c70660041ce97d98f352608Brian Paul 341cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell 3422d5b86be25a7ccb729e746aa5e1bdd537d76df68Brian Paul/** 3432d5b86be25a7ccb729e746aa5e1bdd537d76df68Brian Paul * Called prior to framebuffer reading/writing. 3442d5b86be25a7ccb729e746aa5e1bdd537d76df68Brian Paul * For drivers that rely on swrast for fallback rendering, this is the 3452d5b86be25a7ccb729e746aa5e1bdd537d76df68Brian Paul * driver's opportunity to map renderbuffers and textures. 3462d5b86be25a7ccb729e746aa5e1bdd537d76df68Brian Paul */ 3479520f483b8f1e45fa474674b415554988de5d8d3Brian Paulstatic inline void 348f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergswrast_render_start(struct gl_context *ctx) 3492d5b86be25a7ccb729e746aa5e1bdd537d76df68Brian Paul{ 3502d5b86be25a7ccb729e746aa5e1bdd537d76df68Brian Paul SWcontext *swrast = SWRAST_CONTEXT(ctx); 3512d5b86be25a7ccb729e746aa5e1bdd537d76df68Brian Paul if (swrast->Driver.SpanRenderStart) 3522d5b86be25a7ccb729e746aa5e1bdd537d76df68Brian Paul swrast->Driver.SpanRenderStart(ctx); 3532d5b86be25a7ccb729e746aa5e1bdd537d76df68Brian Paul} 3542d5b86be25a7ccb729e746aa5e1bdd537d76df68Brian Paul 3552d5b86be25a7ccb729e746aa5e1bdd537d76df68Brian Paul 3562d5b86be25a7ccb729e746aa5e1bdd537d76df68Brian Paul/** Called after framebuffer reading/writing */ 3579520f483b8f1e45fa474674b415554988de5d8d3Brian Paulstatic inline void 358f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergswrast_render_finish(struct gl_context *ctx) 3592d5b86be25a7ccb729e746aa5e1bdd537d76df68Brian Paul{ 3602d5b86be25a7ccb729e746aa5e1bdd537d76df68Brian Paul SWcontext *swrast = SWRAST_CONTEXT(ctx); 3612d5b86be25a7ccb729e746aa5e1bdd537d76df68Brian Paul if (swrast->Driver.SpanRenderFinish) 3622d5b86be25a7ccb729e746aa5e1bdd537d76df68Brian Paul swrast->Driver.SpanRenderFinish(ctx); 3632d5b86be25a7ccb729e746aa5e1bdd537d76df68Brian Paul} 364cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell 365cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell 36668da4b50e9b6aa72a9b155f650952620063e1b94Brian Paulextern void 36768da4b50e9b6aa72a9b155f650952620063e1b94Brian Paul_swrast_span_render_start(struct gl_context *ctx); 36868da4b50e9b6aa72a9b155f650952620063e1b94Brian Paul 36968da4b50e9b6aa72a9b155f650952620063e1b94Brian Paulextern void 37068da4b50e9b6aa72a9b155f650952620063e1b94Brian Paul_swrast_span_render_finish(struct gl_context *ctx); 37168da4b50e9b6aa72a9b155f650952620063e1b94Brian Paul 37268da4b50e9b6aa72a9b155f650952620063e1b94Brian Paulextern void 37368da4b50e9b6aa72a9b155f650952620063e1b94Brian Paul_swrast_map_textures(struct gl_context *ctx); 37468da4b50e9b6aa72a9b155f650952620063e1b94Brian Paul 37568da4b50e9b6aa72a9b155f650952620063e1b94Brian Paulextern void 37668da4b50e9b6aa72a9b155f650952620063e1b94Brian Paul_swrast_unmap_textures(struct gl_context *ctx); 37768da4b50e9b6aa72a9b155f650952620063e1b94Brian Paul 37868da4b50e9b6aa72a9b155f650952620063e1b94Brian Paulextern void 37968da4b50e9b6aa72a9b155f650952620063e1b94Brian Paul_swrast_map_texture(struct gl_context *ctx, struct gl_texture_object *texObj); 38068da4b50e9b6aa72a9b155f650952620063e1b94Brian Paul 38168da4b50e9b6aa72a9b155f650952620063e1b94Brian Paulextern void 38268da4b50e9b6aa72a9b155f650952620063e1b94Brian Paul_swrast_unmap_texture(struct gl_context *ctx, struct gl_texture_object *texObj); 38368da4b50e9b6aa72a9b155f650952620063e1b94Brian Paul 38468da4b50e9b6aa72a9b155f650952620063e1b94Brian Paul 38568da4b50e9b6aa72a9b155f650952620063e1b94Brian Paulextern void 38668da4b50e9b6aa72a9b155f650952620063e1b94Brian Paul_swrast_map_renderbuffers(struct gl_context *ctx); 38768da4b50e9b6aa72a9b155f650952620063e1b94Brian Paul 38868da4b50e9b6aa72a9b155f650952620063e1b94Brian Paulextern void 38968da4b50e9b6aa72a9b155f650952620063e1b94Brian Paul_swrast_unmap_renderbuffers(struct gl_context *ctx); 39068da4b50e9b6aa72a9b155f650952620063e1b94Brian Paul 391f431a3fb4dc1bf860203d79e54657e3a62bc50dfBrian Paul 39276e778dce59aa6f290db50242df945943fc47b05Brian Paul/** 39376e778dce59aa6f290db50242df945943fc47b05Brian Paul * Size of an RGBA pixel, in bytes, for given datatype. 39476e778dce59aa6f290db50242df945943fc47b05Brian Paul */ 39576e778dce59aa6f290db50242df945943fc47b05Brian Paul#define RGBA_PIXEL_SIZE(TYPE) \ 39676e778dce59aa6f290db50242df945943fc47b05Brian Paul ((TYPE == GL_UNSIGNED_BYTE) ? 4 * sizeof(GLubyte) : \ 39776e778dce59aa6f290db50242df945943fc47b05Brian Paul ((TYPE == GL_UNSIGNED_SHORT) ? 4 * sizeof(GLushort) \ 39876e778dce59aa6f290db50242df945943fc47b05Brian Paul : 4 * sizeof(GLfloat))) 39976e778dce59aa6f290db50242df945943fc47b05Brian Paul 40076e778dce59aa6f290db50242df945943fc47b05Brian Paul 40176e778dce59aa6f290db50242df945943fc47b05Brian Paul 402f431a3fb4dc1bf860203d79e54657e3a62bc50dfBrian Paul/* 403389d50baff8234fdf4d7bcddeb09658d7d17012dBrian Paul * Fixed point arithmetic macros 404389d50baff8234fdf4d7bcddeb09658d7d17012dBrian Paul */ 405389d50baff8234fdf4d7bcddeb09658d7d17012dBrian Paul#ifndef FIXED_FRAC_BITS 406389d50baff8234fdf4d7bcddeb09658d7d17012dBrian Paul#define FIXED_FRAC_BITS 11 407389d50baff8234fdf4d7bcddeb09658d7d17012dBrian Paul#endif 408389d50baff8234fdf4d7bcddeb09658d7d17012dBrian Paul 409389d50baff8234fdf4d7bcddeb09658d7d17012dBrian Paul#define FIXED_SHIFT FIXED_FRAC_BITS 410389d50baff8234fdf4d7bcddeb09658d7d17012dBrian Paul#define FIXED_ONE (1 << FIXED_SHIFT) 411389d50baff8234fdf4d7bcddeb09658d7d17012dBrian Paul#define FIXED_HALF (1 << (FIXED_SHIFT-1)) 412389d50baff8234fdf4d7bcddeb09658d7d17012dBrian Paul#define FIXED_FRAC_MASK (FIXED_ONE - 1) 413389d50baff8234fdf4d7bcddeb09658d7d17012dBrian Paul#define FIXED_INT_MASK (~FIXED_FRAC_MASK) 414389d50baff8234fdf4d7bcddeb09658d7d17012dBrian Paul#define FIXED_EPSILON 1 415389d50baff8234fdf4d7bcddeb09658d7d17012dBrian Paul#define FIXED_SCALE ((float) FIXED_ONE) 416389d50baff8234fdf4d7bcddeb09658d7d17012dBrian Paul#define FIXED_DBL_SCALE ((double) FIXED_ONE) 417389d50baff8234fdf4d7bcddeb09658d7d17012dBrian Paul#define FloatToFixed(X) (IROUND((X) * FIXED_SCALE)) 418389d50baff8234fdf4d7bcddeb09658d7d17012dBrian Paul#define FixedToDouble(X) ((X) * (1.0 / FIXED_DBL_SCALE)) 419389d50baff8234fdf4d7bcddeb09658d7d17012dBrian Paul#define IntToFixed(I) ((I) << FIXED_SHIFT) 420389d50baff8234fdf4d7bcddeb09658d7d17012dBrian Paul#define FixedToInt(X) ((X) >> FIXED_SHIFT) 421389d50baff8234fdf4d7bcddeb09658d7d17012dBrian Paul#define FixedToUns(X) (((unsigned int)(X)) >> FIXED_SHIFT) 422389d50baff8234fdf4d7bcddeb09658d7d17012dBrian Paul#define FixedCeil(X) (((X) + FIXED_ONE - FIXED_EPSILON) & FIXED_INT_MASK) 423389d50baff8234fdf4d7bcddeb09658d7d17012dBrian Paul#define FixedFloor(X) ((X) & FIXED_INT_MASK) 424389d50baff8234fdf4d7bcddeb09658d7d17012dBrian Paul#define FixedToFloat(X) ((X) * (1.0F / FIXED_SCALE)) 425389d50baff8234fdf4d7bcddeb09658d7d17012dBrian Paul#define PosFloatToFixed(X) FloatToFixed(X) 426389d50baff8234fdf4d7bcddeb09658d7d17012dBrian Paul#define SignedFloatToFixed(X) FloatToFixed(X) 427389d50baff8234fdf4d7bcddeb09658d7d17012dBrian Paul 428389d50baff8234fdf4d7bcddeb09658d7d17012dBrian Paul 429389d50baff8234fdf4d7bcddeb09658d7d17012dBrian Paul 430389d50baff8234fdf4d7bcddeb09658d7d17012dBrian Paul/* 431f431a3fb4dc1bf860203d79e54657e3a62bc50dfBrian Paul * XXX these macros are just bandages for now in order to make 432f431a3fb4dc1bf860203d79e54657e3a62bc50dfBrian Paul * CHAN_BITS==32 compile cleanly. 433f431a3fb4dc1bf860203d79e54657e3a62bc50dfBrian Paul * These should probably go elsewhere at some point. 434f431a3fb4dc1bf860203d79e54657e3a62bc50dfBrian Paul */ 435f431a3fb4dc1bf860203d79e54657e3a62bc50dfBrian Paul#if CHAN_TYPE == GL_FLOAT 43660174c1aef7c6650a800f16f103a4f9ed2d1004eBrian Paul#define ChanToFixed(X) (X) 43760174c1aef7c6650a800f16f103a4f9ed2d1004eBrian Paul#define FixedToChan(X) (X) 438f431a3fb4dc1bf860203d79e54657e3a62bc50dfBrian Paul#else 439f431a3fb4dc1bf860203d79e54657e3a62bc50dfBrian Paul#define ChanToFixed(X) IntToFixed(X) 440f431a3fb4dc1bf860203d79e54657e3a62bc50dfBrian Paul#define FixedToChan(X) FixedToInt(X) 441f431a3fb4dc1bf860203d79e54657e3a62bc50dfBrian Paul#endif 442f431a3fb4dc1bf860203d79e54657e3a62bc50dfBrian Paul 4430bdf216dd06d5136b8529297297aa962bab548c2Brian 4440bdf216dd06d5136b8529297297aa962bab548c2Brian/** 4450bdf216dd06d5136b8529297297aa962bab548c2Brian * For looping over fragment attributes in the pointe, line 4460bdf216dd06d5136b8529297297aa962bab548c2Brian * triangle rasterizers. 4470bdf216dd06d5136b8529297297aa962bab548c2Brian */ 4480bdf216dd06d5136b8529297297aa962bab548c2Brian#define ATTRIB_LOOP_BEGIN \ 4490bdf216dd06d5136b8529297297aa962bab548c2Brian { \ 4500bdf216dd06d5136b8529297297aa962bab548c2Brian GLuint a; \ 4510bdf216dd06d5136b8529297297aa962bab548c2Brian for (a = 0; a < swrast->_NumActiveAttribs; a++) { \ 4520bdf216dd06d5136b8529297297aa962bab548c2Brian const GLuint attr = swrast->_ActiveAttribs[a]; 4530bdf216dd06d5136b8529297297aa962bab548c2Brian 4540bdf216dd06d5136b8529297297aa962bab548c2Brian#define ATTRIB_LOOP_END } } 4550bdf216dd06d5136b8529297297aa962bab548c2Brian 4560bdf216dd06d5136b8529297297aa962bab548c2Brian 457242fd9df3b2266402b3f6b20447798fb3bf57d53Brian Paul/** 458242fd9df3b2266402b3f6b20447798fb3bf57d53Brian Paul * Return the address of a pixel value in a mapped renderbuffer. 459242fd9df3b2266402b3f6b20447798fb3bf57d53Brian Paul */ 460242fd9df3b2266402b3f6b20447798fb3bf57d53Brian Paulstatic inline GLubyte * 461242fd9df3b2266402b3f6b20447798fb3bf57d53Brian Paul_swrast_pixel_address(struct gl_renderbuffer *rb, GLint x, GLint y) 462242fd9df3b2266402b3f6b20447798fb3bf57d53Brian Paul{ 4630c1862851f27c428a18ba5509636efcc2f0084f8Brian Paul struct swrast_renderbuffer *srb = swrast_renderbuffer(rb); 464242fd9df3b2266402b3f6b20447798fb3bf57d53Brian Paul const GLint bpp = _mesa_get_format_bytes(rb->Format); 4650c1862851f27c428a18ba5509636efcc2f0084f8Brian Paul const GLint rowStride = srb->RowStride; 46633257803d9083643ea9709c127933d5a2c4f1960Brian Paul assert(x >= 0); 46733257803d9083643ea9709c127933d5a2c4f1960Brian Paul assert(y >= 0); 46833257803d9083643ea9709c127933d5a2c4f1960Brian Paul /* NOTE: using <= only because of s_tritemp.h which gets a pixel 46933257803d9083643ea9709c127933d5a2c4f1960Brian Paul * address but doesn't necessarily access it. 47033257803d9083643ea9709c127933d5a2c4f1960Brian Paul */ 47133257803d9083643ea9709c127933d5a2c4f1960Brian Paul assert(x <= (GLint) rb->Width); 47233257803d9083643ea9709c127933d5a2c4f1960Brian Paul assert(y <= (GLint) rb->Height); 4730c1862851f27c428a18ba5509636efcc2f0084f8Brian Paul assert(srb->Map); 4740c1862851f27c428a18ba5509636efcc2f0084f8Brian Paul return (GLubyte *) srb->Map + y * rowStride + x * bpp; 475242fd9df3b2266402b3f6b20447798fb3bf57d53Brian Paul} 476242fd9df3b2266402b3f6b20447798fb3bf57d53Brian Paul 477242fd9df3b2266402b3f6b20447798fb3bf57d53Brian Paul 4780bdf216dd06d5136b8529297297aa962bab548c2Brian 479cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell#endif 480