X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fmesa%2Fswrast%2Fs_context.h;h=cdd6fa5048d6df2b3968323e20ef29c26b21f6e9;hb=88f3656ea7ae57d22141225db0c5d90ceab420dd;hp=a2c14f07a73747cc8cb3f83064194b1d22a414f8;hpb=77df88727cb0a423dd5cb41498c2302d9df4fce7;p=mesa.git diff --git a/src/mesa/swrast/s_context.h b/src/mesa/swrast/s_context.h index a2c14f07a73..cdd6fa5048d 100644 --- a/src/mesa/swrast/s_context.h +++ b/src/mesa/swrast/s_context.h @@ -1,10 +1,8 @@ -/* $Id: s_context.h,v 1.19 2002/08/07 00:45:07 brianp Exp $ */ - /* * Mesa 3-D graphics library - * Version: 4.1 + * Version: 6.5.3 * - * Copyright (C) 1999-2002 Brian Paul All Rights Reserved. + * Copyright (C) 1999-2007 Brian Paul All Rights Reserved. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), @@ -22,44 +20,44 @@ * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - * Authors: - * Keith Whitwell */ + /** * \file swrast/s_context.h - * \brief fill in description - * \author Keith Whitwell + * \brief Software rasterization context and private types. + * \author Keith Whitwell + */ + +/** + * \mainpage swrast module + * + * This module, software rasterization, contains the software fallback + * routines for drawing points, lines, triangles, bitmaps and images. + * All rendering boils down to writing spans (arrays) of pixels with + * particular colors. The span-writing routines must be implemented + * by the device driver. */ + #ifndef S_CONTEXT_H #define S_CONTEXT_H -#include "mtypes.h" +#include "main/mtypes.h" +#include "shader/prog_execute.h" #include "swrast.h" +#include "s_span.h" -/* - * For texture sampling: - */ -typedef void (*TextureSampleFunc)( GLcontext *ctx, GLuint texUnit, - const struct gl_texture_object *tObj, - GLuint n, GLfloat texcoords[][4], - const GLfloat lambda[], GLchan rgba[][4] ); +typedef void (*texture_sample_func)(GLcontext *ctx, + const struct gl_texture_object *tObj, + GLuint n, const GLfloat texcoords[][4], + const GLfloat lambda[], GLchan rgba[][4]); - -/* - * Blending function - */ -#ifdef USE_MMX_ASM typedef void (_ASMAPIP blend_func)( GLcontext *ctx, GLuint n, const GLubyte mask[], - GLchan src[][4], CONST GLchan dst[][4] ); -#else -typedef void (*blend_func)( GLcontext *ctx, GLuint n, const GLubyte mask[], - GLchan src[][4], CONST GLchan dst[][4] ); -#endif + GLvoid *src, const GLvoid *dst, + GLenum chanType); typedef void (*swrast_point_func)( GLcontext *ctx, const SWvertex *); @@ -70,7 +68,13 @@ typedef void (*swrast_tri_func)( GLcontext *ctx, const SWvertex *, const SWvertex *, const SWvertex *); -/** \defgroup Bitmasks +typedef void (*validate_texture_image_func)(GLcontext *ctx, + struct gl_texture_object *texObj, + GLuint face, GLuint level); + + +/** + * \defgroup Bitmasks * Bitmasks to indicate which rasterization options are enabled * (RasterMask) */ @@ -83,11 +87,13 @@ typedef void (*swrast_tri_func)( GLcontext *ctx, const SWvertex *, #define CLIP_BIT 0x020 /**< Scissor or window clip pixels */ #define STENCIL_BIT 0x040 /**< Stencil pixels */ #define MASKING_BIT 0x080 /**< Do glColorMask or glIndexMask */ -#define ALPHABUF_BIT 0x100 /**< Using software alpha buffer */ #define MULTI_DRAW_BIT 0x400 /**< Write to more than one color- */ /**< buffer or no buffers. */ #define OCCLUSION_BIT 0x800 /**< GL_HP_occlusion_test enabled */ #define TEXTURE_BIT 0x1000 /**< Texturing really enabled */ +#define FRAGPROG_BIT 0x2000 /**< Fragment program enabled */ +#define ATIFRAGSHADER_BIT 0x4000 /**< ATI Fragment shader enabled */ +#define CLAMPING_BIT 0x8000 /**< Clamp colors to [0,1] */ /*@}*/ #define _SWRAST_NEW_RASTERMASK (_NEW_BUFFERS| \ @@ -95,6 +101,7 @@ typedef void (*swrast_tri_func)( GLcontext *ctx, const SWvertex *, _NEW_COLOR| \ _NEW_DEPTH| \ _NEW_FOG| \ + _NEW_PROGRAM| \ _NEW_STENCIL| \ _NEW_TEXTURE| \ _NEW_VIEWPORT| \ @@ -103,7 +110,7 @@ typedef void (*swrast_tri_func)( GLcontext *ctx, const SWvertex *, /** * \struct SWcontext - * \brief SWContext? + * \brief Per-context state that's private to the software rasterizer module. */ typedef struct { @@ -120,41 +127,63 @@ typedef struct /** Derived values, invalidated on statechanges, updated from * _swrast_validate_derived(): */ - GLuint _RasterMask; - GLfloat _MinMagThresh[MAX_TEXTURE_UNITS]; - GLfloat _backface_sign; - GLboolean _PreferPixelFog; + GLbitfield _RasterMask; + GLfloat _BackfaceSign; /** +1 or -1 */ + GLfloat _BackfaceCullSign; /** +1, 0, or -1 */ + GLboolean _PreferPixelFog; /* Compute fog blend factor per fragment? */ GLboolean _AnyTextureCombine; + GLboolean _FogEnabled; + GLboolean _DeferredTexture; + GLenum _FogMode; /* either GL_FOG_MODE or fragment program's fog mode */ + + /** List/array of the fragment attributes to interpolate */ + GLuint _ActiveAttribs[FRAG_ATTRIB_MAX]; + /** Same info, but as a bitmask */ + GLbitfield _ActiveAttribMask; + /** Number of fragment attributes to interpolate */ + GLuint _NumActiveAttribs; + /** Indicates how each attrib is to be interpolated (lines/tris) */ + GLenum _InterpMode[FRAG_ATTRIB_MAX]; /* GL_FLAT or GL_SMOOTH (for now) */ /* Accum buffer temporaries. */ GLboolean _IntegerAccumMode; /**< Storing unscaled integers? */ GLfloat _IntegerAccumScaler; /**< Implicit scale factor */ - /* Working values: */ GLuint StippleCounter; /**< Line stipple counter */ - GLuint NewState; + GLuint PointLineFacing; + GLbitfield NewState; GLuint StateChanges; + GLenum Primitive; /* current primitive being drawn (ala glBegin) */ + + void (*InvalidateState)( GLcontext *ctx, GLbitfield new_state ); + + /** + * When the NewState mask intersects these masks, we invalidate the + * Point/Line/Triangle function pointers below. + */ + /*@{*/ + GLbitfield InvalidatePointMask; + GLbitfield InvalidateLineMask; + GLbitfield InvalidateTriangleMask; + /*@}*/ - /** Mechanism to allow driver (like X11) to register further - * software rasterization routines. + /** + * Device drivers plug in functions for these callbacks. + * Will be called when the GL state change mask intersects the above masks. */ /*@{*/ void (*choose_point)( GLcontext * ); void (*choose_line)( GLcontext * ); void (*choose_triangle)( GLcontext * ); - - GLuint invalidate_point; - GLuint invalidate_line; - GLuint invalidate_triangle; /*@}*/ - /** Function pointers for dispatch behind public entrypoints. */ + /** + * Current point, line and triangle drawing functions. + */ /*@{*/ - void (*InvalidateState)( GLcontext *ctx, GLuint new_state ); - swrast_point_func Point; swrast_line_func Line; swrast_tri_func Triangle; @@ -176,40 +205,86 @@ typedef struct * this object is big and causes problems when allocated on the stack * on some systems. */ - struct span_arrays *span_data; + SWspanarrays *SpanArrays; + SWspanarrays *ZoomedArrays; /**< For pixel zooming */ + + /** + * Used to buffer N GL_POINTS, instead of rendering one by one. + */ + SWspan PointSpan; - /** Internal hooks, kept uptodate by the same mechanism as above. + /** Internal hooks, kept up to date by the same mechanism as above. */ blend_func BlendFunc; - TextureSampleFunc TextureSample[MAX_TEXTURE_UNITS]; + texture_sample_func TextureSample[MAX_TEXTURE_IMAGE_UNITS]; /** Buffer for saving the sampled texture colors. * Needed for GL_ARB_texture_env_crossbar implementation. */ GLchan *TexelBuffer; + validate_texture_image_func ValidateTextureImage; + + /** State used during execution of fragment programs */ + struct gl_program_machine FragProgMachine; + } SWcontext; extern void _swrast_validate_derived( GLcontext *ctx ); +extern void +_swrast_update_texture_samplers(GLcontext *ctx); -#define SWRAST_CONTEXT(ctx) ((SWcontext *)ctx->swrast_context) -#define RENDER_START(SWctx, GLctx) \ - do { \ - if ((SWctx)->Driver.SpanRenderStart) { \ - (*(SWctx)->Driver.SpanRenderStart)(GLctx); \ - } \ - } while (0) +/** Return SWcontext for the given GLcontext */ +static INLINE SWcontext * +SWRAST_CONTEXT(GLcontext *ctx) +{ + return (SWcontext *) ctx->swrast_context; +} -#define RENDER_FINISH(SWctx, GLctx) \ - do { \ - if ((SWctx)->Driver.SpanRenderFinish) { \ - (*(SWctx)->Driver.SpanRenderFinish)(GLctx); \ - } \ - } while (0) +/** const version of above */ +static INLINE const SWcontext * +CONST_SWRAST_CONTEXT(const GLcontext *ctx) +{ + return (const SWcontext *) ctx->swrast_context; +} + + +/** + * Called prior to framebuffer reading/writing. + * For drivers that rely on swrast for fallback rendering, this is the + * driver's opportunity to map renderbuffers and textures. + */ +static INLINE void +swrast_render_start(GLcontext *ctx) +{ + SWcontext *swrast = SWRAST_CONTEXT(ctx); + if (swrast->Driver.SpanRenderStart) + swrast->Driver.SpanRenderStart(ctx); +} + + +/** Called after framebuffer reading/writing */ +static INLINE void +swrast_render_finish(GLcontext *ctx) +{ + SWcontext *swrast = SWRAST_CONTEXT(ctx); + if (swrast->Driver.SpanRenderFinish) + swrast->Driver.SpanRenderFinish(ctx); +} + + + +/** + * Size of an RGBA pixel, in bytes, for given datatype. + */ +#define RGBA_PIXEL_SIZE(TYPE) \ + ((TYPE == GL_UNSIGNED_BYTE) ? 4 * sizeof(GLubyte) : \ + ((TYPE == GL_UNSIGNED_SHORT) ? 4 * sizeof(GLushort) \ + : 4 * sizeof(GLfloat))) @@ -226,4 +301,19 @@ _swrast_validate_derived( GLcontext *ctx ); #define FixedToChan(X) FixedToInt(X) #endif + +/** + * For looping over fragment attributes in the pointe, line + * triangle rasterizers. + */ +#define ATTRIB_LOOP_BEGIN \ + { \ + GLuint a; \ + for (a = 0; a < swrast->_NumActiveAttribs; a++) { \ + const GLuint attr = swrast->_ActiveAttribs[a]; + +#define ATTRIB_LOOP_END } } + + + #endif