swrast: replace RENDER_START/FINISH macros with inline functions
[mesa.git] / src / mesa / swrast / s_context.h
index 03f6961001a7ce1cab87d26ece76eb23a600e971..cdd6fa5048d6df2b3968323e20ef29c26b21f6e9 100644 (file)
@@ -1,10 +1,8 @@
-/* $Id: s_context.h,v 1.10 2001/05/17 09:32:17 keithw Exp $ */
-
 /*
  * Mesa 3-D graphics library
- * Version:  3.5
+ * Version:  6.5.3
  *
- * Copyright (C) 1999-2001  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"),
  * 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.
+ */
+
+
+/**
+ * \file swrast/s_context.h
+ * \brief Software rasterization context and private types.
+ * \author Keith Whitwell <keith@tungstengraphics.com>
+ */
+
+/**
+ * \mainpage swrast module
  *
- * Authors:
- *    Keith Whitwell <keithw@valinux.com>
+ * 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"
-
-/*
- * For texture sampling:
- */
-typedef void (*TextureSampleFunc)( GLcontext *ctx, GLuint texUnit,
-                                  const struct gl_texture_object *tObj,
-                                   GLuint n,
-                                   const GLfloat s[], const GLfloat t[],
-                                   const GLfloat u[], const GLfloat lambda[],
-                                   GLchan rgba[][4] );
+#include "s_span.h"
 
 
+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 *);
 
@@ -66,126 +68,252 @@ typedef void (*swrast_tri_func)( GLcontext *ctx, const SWvertex *,
                                  const SWvertex *, const SWvertex *);
 
 
+typedef void (*validate_texture_image_func)(GLcontext *ctx,
+                                            struct gl_texture_object *texObj,
+                                            GLuint face, GLuint level);
 
-/*
- * Bitmasks to indicate which rasterization options are enabled (RasterMask)
- */
-#define ALPHATEST_BIT          0x001   /* Alpha-test pixels */
-#define BLEND_BIT              0x002   /* Blend pixels */
-#define DEPTH_BIT              0x004   /* Depth-test pixels */
-#define FOG_BIT                        0x008   /* Fog pixels */
-#define LOGIC_OP_BIT           0x010   /* Apply logic op in software */
-#define SCISSOR_BIT            0x020   /* Scissor pixels */
-#define STENCIL_BIT            0x040   /* Stencil pixels */
-#define MASKING_BIT            0x080   /* Do glColorMask or glIndexMask */
-#define ALPHABUF_BIT           0x100   /* Using software alpha buffer */
-#define WINCLIP_BIT            0x200   /* Clip pixels/primitives to window */
-#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 */
 
+/**
+ * \defgroup Bitmasks
+ * Bitmasks to indicate which rasterization options are enabled
+ * (RasterMask)
+ */
+/*@{*/
+#define ALPHATEST_BIT          0x001   /**< Alpha-test pixels */
+#define BLEND_BIT              0x002   /**< Blend pixels */
+#define DEPTH_BIT              0x004   /**< Depth-test pixels */
+#define FOG_BIT                        0x008   /**< Fog pixels */
+#define LOGIC_OP_BIT           0x010   /**< Apply logic op in software */
+#define CLIP_BIT               0x020   /**< Scissor or window clip pixels */
+#define STENCIL_BIT            0x040   /**< Stencil pixels */
+#define MASKING_BIT            0x080   /**< Do glColorMask or glIndexMask */
+#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|  \
                                _NEW_SCISSOR|   \
                                _NEW_COLOR|     \
                                _NEW_DEPTH|     \
                                _NEW_FOG|       \
+                                _NEW_PROGRAM|   \
                                _NEW_STENCIL|   \
                                _NEW_TEXTURE|   \
                                _NEW_VIEWPORT|  \
                                _NEW_DEPTH)
 
 
-
+/**
+ * \struct SWcontext
+ * \brief  Per-context state that's private to the software rasterizer module.
+ */
 typedef struct
 {
-   /* Driver interface:
+   /** Driver interface:
     */
    struct swrast_device_driver Driver;
 
-   /* Configuration mechanisms to make software rasterizer match
+   /** Configuration mechanisms to make software rasterizer match
     * characteristics of the hardware rasterizer (if present):
     */
    GLboolean AllowVertexFog;
    GLboolean AllowPixelFog;
 
-   /* Derived values, invalidated on statechanges, updated from
+   /** 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 */
-
+   GLboolean _IntegerAccumMode;        /**< Storing unscaled integers? */
+   GLfloat _IntegerAccumScaler;        /**< Implicit scale factor */
 
    /* Working values:
     */
-   struct pixel_buffer* PB;
-   GLuint StippleCounter;    /* Line stipple counter */
-   GLuint NewState;
+   GLuint StippleCounter;    /**< Line stipple counter */
+   GLuint PointLineFacing;
+   GLbitfield NewState;
    GLuint StateChanges;
+   GLenum Primitive;    /* current primitive being drawn (ala glBegin) */
+
+   void (*InvalidateState)( GLcontext *ctx, GLbitfield new_state );
 
-   /* Mechanism to allow driver (like X11) to register further
-    * software rasterization routines.
+   /**
+    * When the NewState mask intersects these masks, we invalidate the
+    * Point/Line/Triangle function pointers below.
+    */
+   /*@{*/
+   GLbitfield InvalidatePointMask;
+   GLbitfield InvalidateLineMask;
+   GLbitfield InvalidateTriangleMask;
+   /*@}*/
+
+   /**
+    * 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;
+   /*@}*/
 
-   /* Placeholders for when separate specular (or secondary color) is
+   /**
+    * Placeholders for when separate specular (or secondary color) is
     * enabled but texturing is not.
     */
+   /*@{*/
    swrast_point_func SpecPoint;
    swrast_line_func SpecLine;
    swrast_tri_func SpecTriangle;
+   /*@}*/
 
+   /**
+    * Typically, we'll allocate a sw_span structure as a local variable
+    * and set its 'array' pointer to point to this object.  The reason is
+    * this object is big and causes problems when allocated on the stack
+    * on some systems.
+    */
+   SWspanarrays *SpanArrays;
+   SWspanarrays *ZoomedArrays;  /**< For pixel zooming */
 
-   /* Internal hooks, kept uptodate by the same mechanism as above.
+   /**
+    * Used to buffer N GL_POINTS, instead of rendering one by one.
+    */
+   SWspan PointSpan;
+
+   /** 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;
 
 
-void
+extern void
 _swrast_validate_derived( GLcontext *ctx );
 
+extern void
+_swrast_update_texture_samplers(GLcontext *ctx);
+
+
+/** Return SWcontext for the given GLcontext */
+static INLINE SWcontext *
+SWRAST_CONTEXT(GLcontext *ctx)
+{
+   return (SWcontext *) ctx->swrast_context;
+}
+
+/** 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)))
+
+
 
-#define SWRAST_CONTEXT(ctx) ((SWcontext *)ctx->swrast_context)
+/*
+ * XXX these macros are just bandages for now in order to make
+ * CHAN_BITS==32 compile cleanly.
+ * These should probably go elsewhere at some point.
+ */
+#if CHAN_TYPE == GL_FLOAT
+#define ChanToFixed(X)  (X)
+#define FixedToChan(X)  (X)
+#else
+#define ChanToFixed(X)  IntToFixed(X)
+#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 RENDER_START(SWctx, GLctx)                     \
-   do {                                                \
-      if ((SWctx)->Driver.SpanRenderStart) {           \
-         (*(SWctx)->Driver.SpanRenderStart)(GLctx);    \
-      }                                                \
-   } while (0)
+#define ATTRIB_LOOP_END } }
 
-#define RENDER_FINISH(SWctx, GLctx)                    \
-   do {                                                \
-      if ((SWctx)->Driver.SpanRenderFinish) {          \
-         (*(SWctx)->Driver.SpanRenderFinish)(GLctx);   \
-      }                                                \
-   } while (0)
 
 
 #endif