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