s_context.h revision 4a49301e
1/* 2 * Mesa 3-D graphics library 3 * Version: 6.5.3 4 * 5 * Copyright (C) 1999-2007 Brian Paul All Rights Reserved. 6 * 7 * Permission is hereby granted, free of charge, to any person obtaining a 8 * copy of this software and associated documentation files (the "Software"), 9 * to deal in the Software without restriction, including without limitation 10 * the rights to use, copy, modify, merge, publish, distribute, sublicense, 11 * and/or sell copies of the Software, and to permit persons to whom the 12 * Software is furnished to do so, subject to the following conditions: 13 * 14 * The above copyright notice and this permission notice shall be included 15 * in all copies or substantial portions of the Software. 16 * 17 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 18 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 19 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 20 * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN 21 * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 22 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 23 */ 24 25 26/** 27 * \file swrast/s_context.h 28 * \brief Software rasterization context and private types. 29 * \author Keith Whitwell <keith@tungstengraphics.com> 30 */ 31 32/** 33 * \mainpage swrast module 34 * 35 * This module, software rasterization, contains the software fallback 36 * routines for drawing points, lines, triangles, bitmaps and images. 37 * All rendering boils down to writing spans (arrays) of pixels with 38 * particular colors. The span-writing routines must be implemented 39 * by the device driver. 40 */ 41 42 43#ifndef S_CONTEXT_H 44#define S_CONTEXT_H 45 46#include "main/mtypes.h" 47#include "shader/prog_execute.h" 48#include "swrast.h" 49#include "s_span.h" 50 51 52typedef void (*texture_sample_func)(GLcontext *ctx, 53 const struct gl_texture_object *tObj, 54 GLuint n, const GLfloat texcoords[][4], 55 const GLfloat lambda[], GLfloat rgba[][4]); 56 57typedef void (_ASMAPIP blend_func)( GLcontext *ctx, GLuint n, 58 const GLubyte mask[], 59 GLvoid *src, const GLvoid *dst, 60 GLenum chanType); 61 62typedef void (*swrast_point_func)( GLcontext *ctx, const SWvertex *); 63 64typedef void (*swrast_line_func)( GLcontext *ctx, 65 const SWvertex *, const SWvertex *); 66 67typedef void (*swrast_tri_func)( GLcontext *ctx, const SWvertex *, 68 const SWvertex *, const SWvertex *); 69 70 71typedef void (*validate_texture_image_func)(GLcontext *ctx, 72 struct gl_texture_object *texObj, 73 GLuint face, GLuint level); 74 75 76/** 77 * \defgroup Bitmasks 78 * Bitmasks to indicate which rasterization options are enabled 79 * (RasterMask) 80 */ 81/*@{*/ 82#define ALPHATEST_BIT 0x001 /**< Alpha-test pixels */ 83#define BLEND_BIT 0x002 /**< Blend pixels */ 84#define DEPTH_BIT 0x004 /**< Depth-test pixels */ 85#define FOG_BIT 0x008 /**< Fog pixels */ 86#define LOGIC_OP_BIT 0x010 /**< Apply logic op in software */ 87#define CLIP_BIT 0x020 /**< Scissor or window clip pixels */ 88#define STENCIL_BIT 0x040 /**< Stencil pixels */ 89#define MASKING_BIT 0x080 /**< Do glColorMask or glIndexMask */ 90#define MULTI_DRAW_BIT 0x400 /**< Write to more than one color- */ 91 /**< buffer or no buffers. */ 92#define OCCLUSION_BIT 0x800 /**< GL_HP_occlusion_test enabled */ 93#define TEXTURE_BIT 0x1000 /**< Texturing really enabled */ 94#define FRAGPROG_BIT 0x2000 /**< Fragment program enabled */ 95#define ATIFRAGSHADER_BIT 0x4000 /**< ATI Fragment shader enabled */ 96#define CLAMPING_BIT 0x8000 /**< Clamp colors to [0,1] */ 97/*@}*/ 98 99#define _SWRAST_NEW_RASTERMASK (_NEW_BUFFERS| \ 100 _NEW_SCISSOR| \ 101 _NEW_COLOR| \ 102 _NEW_DEPTH| \ 103 _NEW_FOG| \ 104 _NEW_PROGRAM| \ 105 _NEW_STENCIL| \ 106 _NEW_TEXTURE| \ 107 _NEW_VIEWPORT| \ 108 _NEW_DEPTH) 109 110 111/** 112 * \struct SWcontext 113 * \brief Per-context state that's private to the software rasterizer module. 114 */ 115typedef struct 116{ 117 /** Driver interface: 118 */ 119 struct swrast_device_driver Driver; 120 121 /** Configuration mechanisms to make software rasterizer match 122 * characteristics of the hardware rasterizer (if present): 123 */ 124 GLboolean AllowVertexFog; 125 GLboolean AllowPixelFog; 126 127 /** Derived values, invalidated on statechanges, updated from 128 * _swrast_validate_derived(): 129 */ 130 GLbitfield _RasterMask; 131 GLfloat _BackfaceSign; /** +1 or -1 */ 132 GLfloat _BackfaceCullSign; /** +1, 0, or -1 */ 133 GLboolean _PreferPixelFog; /* Compute fog blend factor per fragment? */ 134 GLboolean _TextureCombinePrimary; 135 GLboolean _FogEnabled; 136 GLboolean _DeferredTexture; 137 GLenum _FogMode; /* either GL_FOG_MODE or fragment program's fog mode */ 138 139 /** List/array of the fragment attributes to interpolate */ 140 GLuint _ActiveAttribs[FRAG_ATTRIB_MAX]; 141 /** Same info, but as a bitmask */ 142 GLbitfield _ActiveAttribMask; 143 /** Number of fragment attributes to interpolate */ 144 GLuint _NumActiveAttribs; 145 /** Indicates how each attrib is to be interpolated (lines/tris) */ 146 GLenum _InterpMode[FRAG_ATTRIB_MAX]; /* GL_FLAT or GL_SMOOTH (for now) */ 147 148 /* Accum buffer temporaries. 149 */ 150 GLboolean _IntegerAccumMode; /**< Storing unscaled integers? */ 151 GLfloat _IntegerAccumScaler; /**< Implicit scale factor */ 152 153 /* Working values: 154 */ 155 GLuint StippleCounter; /**< Line stipple counter */ 156 GLuint PointLineFacing; 157 GLbitfield NewState; 158 GLuint StateChanges; 159 GLenum Primitive; /* current primitive being drawn (ala glBegin) */ 160 GLboolean SpecularVertexAdd; /**< Add specular/secondary color per vertex */ 161 162 void (*InvalidateState)( GLcontext *ctx, GLbitfield new_state ); 163 164 /** 165 * When the NewState mask intersects these masks, we invalidate the 166 * Point/Line/Triangle function pointers below. 167 */ 168 /*@{*/ 169 GLbitfield InvalidatePointMask; 170 GLbitfield InvalidateLineMask; 171 GLbitfield InvalidateTriangleMask; 172 /*@}*/ 173 174 /** 175 * Device drivers plug in functions for these callbacks. 176 * Will be called when the GL state change mask intersects the above masks. 177 */ 178 /*@{*/ 179 void (*choose_point)( GLcontext * ); 180 void (*choose_line)( GLcontext * ); 181 void (*choose_triangle)( GLcontext * ); 182 /*@}*/ 183 184 /** 185 * Current point, line and triangle drawing functions. 186 */ 187 /*@{*/ 188 swrast_point_func Point; 189 swrast_line_func Line; 190 swrast_tri_func Triangle; 191 /*@}*/ 192 193 /** 194 * Placeholders for when separate specular (or secondary color) is 195 * enabled but texturing is not. 196 */ 197 /*@{*/ 198 swrast_point_func SpecPoint; 199 swrast_line_func SpecLine; 200 swrast_tri_func SpecTriangle; 201 /*@}*/ 202 203 /** 204 * Typically, we'll allocate a sw_span structure as a local variable 205 * and set its 'array' pointer to point to this object. The reason is 206 * this object is big and causes problems when allocated on the stack 207 * on some systems. 208 */ 209 SWspanarrays *SpanArrays; 210 SWspanarrays *ZoomedArrays; /**< For pixel zooming */ 211 212 /** 213 * Used to buffer N GL_POINTS, instead of rendering one by one. 214 */ 215 SWspan PointSpan; 216 217 /** Internal hooks, kept up to date by the same mechanism as above. 218 */ 219 blend_func BlendFunc; 220 texture_sample_func TextureSample[MAX_TEXTURE_IMAGE_UNITS]; 221 222 /** Buffer for saving the sampled texture colors. 223 * Needed for GL_ARB_texture_env_crossbar implementation. 224 */ 225 GLfloat *TexelBuffer; 226 227 validate_texture_image_func ValidateTextureImage; 228 229 /** State used during execution of fragment programs */ 230 struct gl_program_machine FragProgMachine; 231 232} SWcontext; 233 234 235extern void 236_swrast_validate_derived( GLcontext *ctx ); 237 238extern void 239_swrast_update_texture_samplers(GLcontext *ctx); 240 241 242/** Return SWcontext for the given GLcontext */ 243static INLINE SWcontext * 244SWRAST_CONTEXT(GLcontext *ctx) 245{ 246 return (SWcontext *) ctx->swrast_context; 247} 248 249/** const version of above */ 250static INLINE const SWcontext * 251CONST_SWRAST_CONTEXT(const GLcontext *ctx) 252{ 253 return (const SWcontext *) ctx->swrast_context; 254} 255 256 257/** 258 * Called prior to framebuffer reading/writing. 259 * For drivers that rely on swrast for fallback rendering, this is the 260 * driver's opportunity to map renderbuffers and textures. 261 */ 262static INLINE void 263swrast_render_start(GLcontext *ctx) 264{ 265 SWcontext *swrast = SWRAST_CONTEXT(ctx); 266 if (swrast->Driver.SpanRenderStart) 267 swrast->Driver.SpanRenderStart(ctx); 268} 269 270 271/** Called after framebuffer reading/writing */ 272static INLINE void 273swrast_render_finish(GLcontext *ctx) 274{ 275 SWcontext *swrast = SWRAST_CONTEXT(ctx); 276 if (swrast->Driver.SpanRenderFinish) 277 swrast->Driver.SpanRenderFinish(ctx); 278} 279 280 281 282/** 283 * Size of an RGBA pixel, in bytes, for given datatype. 284 */ 285#define RGBA_PIXEL_SIZE(TYPE) \ 286 ((TYPE == GL_UNSIGNED_BYTE) ? 4 * sizeof(GLubyte) : \ 287 ((TYPE == GL_UNSIGNED_SHORT) ? 4 * sizeof(GLushort) \ 288 : 4 * sizeof(GLfloat))) 289 290 291 292/* 293 * Fixed point arithmetic macros 294 */ 295#ifndef FIXED_FRAC_BITS 296#define FIXED_FRAC_BITS 11 297#endif 298 299#define FIXED_SHIFT FIXED_FRAC_BITS 300#define FIXED_ONE (1 << FIXED_SHIFT) 301#define FIXED_HALF (1 << (FIXED_SHIFT-1)) 302#define FIXED_FRAC_MASK (FIXED_ONE - 1) 303#define FIXED_INT_MASK (~FIXED_FRAC_MASK) 304#define FIXED_EPSILON 1 305#define FIXED_SCALE ((float) FIXED_ONE) 306#define FIXED_DBL_SCALE ((double) FIXED_ONE) 307#define FloatToFixed(X) (IROUND((X) * FIXED_SCALE)) 308#define FixedToDouble(X) ((X) * (1.0 / FIXED_DBL_SCALE)) 309#define IntToFixed(I) ((I) << FIXED_SHIFT) 310#define FixedToInt(X) ((X) >> FIXED_SHIFT) 311#define FixedToUns(X) (((unsigned int)(X)) >> FIXED_SHIFT) 312#define FixedCeil(X) (((X) + FIXED_ONE - FIXED_EPSILON) & FIXED_INT_MASK) 313#define FixedFloor(X) ((X) & FIXED_INT_MASK) 314#define FixedToFloat(X) ((X) * (1.0F / FIXED_SCALE)) 315#define PosFloatToFixed(X) FloatToFixed(X) 316#define SignedFloatToFixed(X) FloatToFixed(X) 317 318 319 320/* 321 * XXX these macros are just bandages for now in order to make 322 * CHAN_BITS==32 compile cleanly. 323 * These should probably go elsewhere at some point. 324 */ 325#if CHAN_TYPE == GL_FLOAT 326#define ChanToFixed(X) (X) 327#define FixedToChan(X) (X) 328#else 329#define ChanToFixed(X) IntToFixed(X) 330#define FixedToChan(X) FixedToInt(X) 331#endif 332 333 334/** 335 * For looping over fragment attributes in the pointe, line 336 * triangle rasterizers. 337 */ 338#define ATTRIB_LOOP_BEGIN \ 339 { \ 340 GLuint a; \ 341 for (a = 0; a < swrast->_NumActiveAttribs; a++) { \ 342 const GLuint attr = swrast->_ActiveAttribs[a]; 343 344#define ATTRIB_LOOP_END } } 345 346 347 348#endif 349