dri: Store the loader private passed in at dri context creation
[mesa.git] / src / mesa / drivers / dri / mga / mgatris.c
index e47cfc171fd5619f7851f3fdce9bdadf43fb3df5..4c58c3bdb04c71c2fdf27d025c8e7365c80d96b6 100644 (file)
  * Authors:
  *    Keith Whitwell <keith@tungstengraphics.com>
  */
-/* $XFree86: xc/lib/GL/mesa/src/drv/mga/mgatris.c,v 1.10 2002/10/30 12:51:36 alanh Exp $ */
 
-#include <stdio.h>
-#include <math.h>
-
-#include "mtypes.h"
-#include "macros.h"
-#include "colormac.h"
+#include "main/mtypes.h"
+#include "main/macros.h"
+#include "main/colormac.h"
+#include "main/mm.h"
 #include "swrast/swrast.h"
 #include "swrast_setup/swrast_setup.h"
 #include "tnl/t_context.h"
 #include "tnl/t_pipeline.h"
 
-#include "mm.h"
 #include "mgacontext.h"
 #include "mgaioctl.h"
 #include "mgatris.h"
 #include "mgavb.h"
-#include "mgastate.h"
 
 
 static void mgaRenderPrimitive( GLcontext *ctx, GLenum prim );
@@ -70,7 +65,7 @@ do {                                          \
 } while (0)
 #endif
 
-static void __inline__ mga_draw_triangle( mgaContextPtr mmesa,
+static void INLINE mga_draw_triangle( mgaContextPtr mmesa,
                                           mgaVertexPtr v0,
                                           mgaVertexPtr v1,
                                           mgaVertexPtr v2 )
@@ -85,7 +80,7 @@ static void __inline__ mga_draw_triangle( mgaContextPtr mmesa,
 }
 
 
-static void __inline__ mga_draw_quad( mgaContextPtr mmesa,
+static void INLINE mga_draw_quad( mgaContextPtr mmesa,
                                       mgaVertexPtr v0,
                                       mgaVertexPtr v1,
                                       mgaVertexPtr v2,
@@ -104,11 +99,13 @@ static void __inline__ mga_draw_quad( mgaContextPtr mmesa,
 }
 
 
-static __inline__ void mga_draw_point( mgaContextPtr mmesa,
+static INLINE void mga_draw_point( mgaContextPtr mmesa,
                                        mgaVertexPtr tmp )
 {
-   GLfloat sz = mmesa->glCtx->Point._Size * .5;
-   int vertex_size = mmesa->vertex_size;
+   const GLfloat sz = 0.5 * CLAMP(mmesa->glCtx->Point.Size,
+                                  mmesa->glCtx->Const.MinPointSize,
+                                  mmesa->glCtx->Const.MaxPointSize);
+   const int vertex_size = mmesa->vertex_size;
    GLuint *vb = mgaAllocDmaLow( mmesa, 6 * 4 * vertex_size );
    int j;
    
@@ -161,14 +158,16 @@ static __inline__ void mga_draw_point( mgaContextPtr mmesa,
 }
 
 
-static __inline__ void mga_draw_line( mgaContextPtr mmesa,
+static INLINE void mga_draw_line( mgaContextPtr mmesa,
                                      mgaVertexPtr v0,
                                      mgaVertexPtr v1 )
 {
    GLuint vertex_size = mmesa->vertex_size;
    GLuint *vb = mgaAllocDmaLow( mmesa, 6 * 4 * vertex_size );
    GLfloat dx, dy, ix, iy;
-   GLfloat width = mmesa->glCtx->Line._Width;
+   const GLfloat width = CLAMP(mmesa->glCtx->Line.Width,
+                               mmesa->glCtx->Const.MinLineWidth,
+                               mmesa->glCtx->Const.MaxLineWidth);
    GLint j;
 
 #if 0
@@ -331,10 +330,10 @@ mga_fallback_point( mgaContextPtr mmesa,
 #define MGA_MAX_TRIFUNC     0x20
 
 static struct {
-   points_func         points;
-   line_func           line;
-   triangle_func       triangle;
-   quad_func           quad;
+   tnl_points_func             points;
+   tnl_line_func               line;
+   tnl_triangle_func   triangle;
+   tnl_quad_func               quad;
 } rast_tab[MGA_MAX_TRIFUNC];
 
 #define DO_FALLBACK (IND & MGA_FALLBACK_BIT)
@@ -355,20 +354,6 @@ static struct {
 #define VERTEX mgaVertex
 #define TAB rast_tab
 
-#define MGA_COLOR( dst, src )                  \
-do {                                           \
-   dst[0] = src[2];                            \
-   dst[1] = src[1];                            \
-   dst[2] = src[0];                            \
-   dst[3] = src[3];                            \
-} while (0)
-
-#define MGA_SPEC( dst, src )                   \
-do {                                           \
-   dst[0] = src[2];                            \
-   dst[1] = src[1];                            \
-   dst[2] = src[0];                            \
-} while (0)
 
 #define DEPTH_SCALE mmesa->depth_scale
 #define UNFILLED_TRI unfilled_tri
@@ -377,21 +362,42 @@ do {                                              \
 #define VERT_Y(_v) _v->v.y
 #define VERT_Z(_v) _v->v.z
 #define AREA_IS_CCW( a ) (a > 0)
-#define GET_VERTEX(e) (mmesa->verts + (e<<mmesa->vertex_stride_shift))
+#define GET_VERTEX(e) (mmesa->verts + (e * mmesa->vertex_size * sizeof(int)))
+
+#define VERT_SET_RGBA( v, c )                                          \
+do {                                                           \
+   mga_color_t *color = (mga_color_t *)&((v)->ui[4]);  \
+   UNCLAMPED_FLOAT_TO_UBYTE(color->red, (c)[0]);               \
+   UNCLAMPED_FLOAT_TO_UBYTE(color->green, (c)[1]);             \
+   UNCLAMPED_FLOAT_TO_UBYTE(color->blue, (c)[2]);              \
+   UNCLAMPED_FLOAT_TO_UBYTE(color->alpha, (c)[3]);             \
+} while (0)
 
-#define VERT_SET_RGBA( v, c )  MGA_COLOR( v->ub4[4], c )
 #define VERT_COPY_RGBA( v0, v1 ) v0->ui[4] = v1->ui[4]
-#define VERT_SAVE_RGBA( idx )  color[idx] = v[idx]->ui[4]
-#define VERT_RESTORE_RGBA( idx ) v[idx]->ui[4] = color[idx]   
 
-#define VERT_SET_SPEC( v, c )  MGA_SPEC( v->ub4[5], c )
-#define VERT_COPY_SPEC( v0, v1 ) COPY_3V(v0->ub4[5], v1->ub4[5])
-#define VERT_SAVE_SPEC( idx )  spec[idx] = v[idx]->ui[5]
-#define VERT_RESTORE_SPEC( idx ) v[idx]->ui[5] = spec[idx]   
+#define VERT_SET_SPEC( v0, c )                                 \
+do {                                                           \
+   UNCLAMPED_FLOAT_TO_UBYTE(v0->v.specular.red, (c)[0]);       \
+   UNCLAMPED_FLOAT_TO_UBYTE(v0->v.specular.green, (c)[1]);     \
+   UNCLAMPED_FLOAT_TO_UBYTE(v0->v.specular.blue, (c)[2]);      \
+} while (0)
+
+#define VERT_COPY_SPEC( v0, v1 )               \
+do {                                           \
+   v0->v.specular.red   = v1->v.specular.red;  \
+   v0->v.specular.green = v1->v.specular.green;        \
+   v0->v.specular.blue  = v1->v.specular.blue; \
+} while (0)
+
+#define VERT_SAVE_RGBA( idx )    color[idx] = v[idx]->ui[4]
+#define VERT_RESTORE_RGBA( idx ) v[idx]->ui[4] = color[idx]
+#define VERT_SAVE_SPEC( idx )    spec[idx] = v[idx]->ui[5]
+#define VERT_RESTORE_SPEC( idx ) v[idx]->ui[5] = spec[idx]
 
 #define LOCAL_VARS(n)                                  \
    mgaContextPtr mmesa = MGA_CONTEXT(ctx);             \
-   GLuint color[n], spec[n];                           \
+   GLuint color[n] = { 0 };                            \
+   GLuint spec[n] = { 0 };                             \
    (void) color; (void) spec;
 
 
@@ -588,7 +594,7 @@ static void init_rast_tab( void )
 /**********************************************************************/
 
 
-#define VERT(x) (mgaVertex *)(vertptr + ((x)<<vertshift))
+#define VERT(x) (mgaVertex *)(vertptr + ((x)*vertex_size*sizeof(int)))
 #define RENDER_POINTS( start, count )          \
    for ( ; start < count ; start++)            \
       mga_draw_point( mmesa, VERT(ELT(start)) );
@@ -603,7 +609,7 @@ static void init_rast_tab( void )
 #define LOCAL_VARS                                             \
     mgaContextPtr mmesa = MGA_CONTEXT(ctx);                    \
     GLubyte *vertptr = (GLubyte *)mmesa->verts;                        \
-    const GLuint vertshift = mmesa->vertex_stride_shift;               \
+    const GLuint vertex_size = mmesa->vertex_size;             \
     const GLuint * const elt = TNL_CONTEXT(ctx)->vb.Elts;      \
     (void) elt;
 #define RESET_STIPPLE 
@@ -660,7 +666,6 @@ static void mgaFastRenderClippedPoly( GLcontext *ctx, const GLuint *elts,
    GLuint vertex_size = mmesa->vertex_size;
    GLuint *vb = mgaAllocDmaLow( mmesa, (n-2) * 3 * 4 * vertex_size );
    GLubyte *vertptr = (GLubyte *)mmesa->verts;                 
-   const GLuint vertshift = mmesa->vertex_stride_shift;        
    const GLuint *start = (const GLuint *)VERT(elts[0]);
    int i,j;
 
@@ -676,31 +681,21 @@ static void mgaFastRenderClippedPoly( GLcontext *ctx, const GLuint *elts,
 /**********************************************************************/
 
 
-
-#define _MGA_NEW_RENDERSTATE (_DD_NEW_LINE_STIPPLE |           \
-                              _DD_NEW_TRI_UNFILLED |           \
-                              _DD_NEW_TRI_LIGHT_TWOSIDE |      \
-                              _DD_NEW_TRI_OFFSET |             \
-                              _DD_NEW_TRI_STIPPLE |            \
-                              _NEW_POLYGONSTIPPLE)
-
-
 #define POINT_FALLBACK (DD_POINT_SMOOTH)
 #define LINE_FALLBACK (DD_LINE_SMOOTH | DD_LINE_STIPPLE)
 #define TRI_FALLBACK (DD_TRI_SMOOTH | DD_TRI_UNFILLED)
-#define ANY_FALLBACK_FLAGS (POINT_FALLBACK|LINE_FALLBACK|TRI_FALLBACK| \
-                            DD_TRI_STIPPLE)
+#define ANY_FALLBACK_FLAGS (POINT_FALLBACK|LINE_FALLBACK|TRI_FALLBACK)
 #define ANY_RASTER_FLAGS (DD_FLATSHADE|DD_TRI_LIGHT_TWOSIDE|DD_TRI_OFFSET| \
                           DD_TRI_UNFILLED)
 
-static void mgaChooseRenderState(GLcontext *ctx)
+void mgaChooseRenderState(GLcontext *ctx)
 {
    TNLcontext *tnl = TNL_CONTEXT(ctx);
    mgaContextPtr mmesa = MGA_CONTEXT(ctx);
    GLuint flags = ctx->_TriangleCaps;
    GLuint index = 0;
 
-   if (flags & (ANY_FALLBACK_FLAGS|ANY_RASTER_FLAGS)) {
+   if (flags & (ANY_FALLBACK_FLAGS|ANY_RASTER_FLAGS|DD_TRI_STIPPLE)) {
       if (flags & ANY_RASTER_FLAGS) {
         if (flags & DD_TRI_LIGHT_TWOSIDE)    index |= MGA_TWOSIDE_BIT;
         if (flags & DD_TRI_OFFSET)           index |= MGA_OFFSET_BIT;
@@ -725,9 +720,11 @@ static void mgaChooseRenderState(GLcontext *ctx)
         if (flags & TRI_FALLBACK) 
            mmesa->draw_tri = mga_fallback_tri;
         
-        if ((flags & DD_TRI_STIPPLE) && !mmesa->haveHwStipple)
-           mmesa->draw_tri = mga_fallback_tri;
-      
+        index |= MGA_FALLBACK_BIT;
+      }
+
+      if ((flags & DD_TRI_STIPPLE) && !mmesa->haveHwStipple) {
+        mmesa->draw_tri = mga_fallback_tri;
         index |= MGA_FALLBACK_BIT;
       }
    }
@@ -759,36 +756,6 @@ static void mgaChooseRenderState(GLcontext *ctx)
 /**********************************************************************/
 
 
-static void mgaRunPipeline( GLcontext *ctx )
-{
-   mgaContextPtr mmesa = MGA_CONTEXT(ctx);
-
-   if (mmesa->new_state) {
-      mgaDDUpdateHwState( ctx );
-   }
-
-   if (!mmesa->Fallback && mmesa->new_gl_state) {
-      if (mmesa->new_gl_state & _MGA_NEW_RASTERSETUP)
-        mgaChooseVertexState( ctx );
-      
-      if (mmesa->new_gl_state & _MGA_NEW_RENDERSTATE)
-        mgaChooseRenderState( ctx );
-      
-      mmesa->new_gl_state = 0;
-
-      /* Circularity: mgaDDUpdateHwState can affect mmesa->Fallback,
-       * but mgaChooseVertexState can affect mmesa->new_state.  Hence
-       * the second check.  (Fix this...)
-       */
-      if (mmesa->new_state) {
-        mgaDDUpdateHwState( ctx );
-      }
-   }
-
-   _tnl_run_pipeline( ctx );
-}
-
-
 static GLenum reduced_prim[GL_POLYGON+1] = {
    GL_POINTS,
    GL_LINES,
@@ -812,18 +779,21 @@ void mgaRasterPrimitive( GLcontext *ctx, GLenum prim, GLuint hwprim )
    mgaContextPtr mmesa = MGA_CONTEXT( ctx );
 
    FLUSH_BATCH( mmesa );
+
+   /* Update culling */
+   if (mmesa->raster_primitive != prim)
+      mmesa->dirty |= MGA_UPLOAD_CONTEXT;
+
    mmesa->raster_primitive = prim;
 /*     mmesa->hw_primitive = hwprim; */
    mmesa->hw_primitive = MGA_WA_TRIANGLES; /* disable mgarender.c for now */
-   mgaUpdateCull(ctx);   
 
    if (ctx->Polygon.StippleFlag && mmesa->haveHwStipple)
    {
       mmesa->dirty |= MGA_UPLOAD_CONTEXT;
+      mmesa->setup.dwgctl &= ~(0xf<<20);
       if (mmesa->raster_primitive == GL_TRIANGLES)
         mmesa->setup.dwgctl |= mmesa->poly_stipple;
-      else
-        mmesa->setup.dwgctl &= ~(0xf<<20);
    }
 }
 
@@ -864,6 +834,29 @@ static void mgaRenderFinish( GLcontext *ctx )
 /*               Manage total rasterization fallbacks                 */
 /**********************************************************************/
 
+static const char * const fallbackStrings[] = {
+   "Texture mode",
+   "glDrawBuffer(GL_FRONT_AND_BACK)",
+   "read buffer",
+   "glBlendFunc(GL_SRC_ALPHA_SATURATE, GL_ZERO)",
+   "glRenderMode(selection or feedback)",
+   "No hardware stencil",
+   "glDepthFunc( GL_NEVER )",
+   "Mixing GL_CLAMP_TO_EDGE and GL_CLAMP",
+   "rasterization fallback option"
+};
+
+static const char *getFallbackString(GLuint bit)
+{
+   int i = 0;
+   while (bit > 1) {
+      i++;
+      bit >>= 1;
+   }
+   return fallbackStrings[i];
+}
+
+
 void mgaFallback( GLcontext *ctx, GLuint bit, GLboolean mode )
 {
    TNLcontext *tnl = TNL_CONTEXT(ctx);
@@ -876,6 +869,10 @@ void mgaFallback( GLcontext *ctx, GLuint bit, GLboolean mode )
         FLUSH_BATCH(mmesa);
         _swsetup_Wakeup( ctx );
         mmesa->RenderIndex = ~0;
+         if (MGA_DEBUG & DEBUG_VERBOSE_FALLBACK) {
+            fprintf(stderr, "MGA begin rasterization fallback: 0x%x %s\n",
+                    bit, getFallbackString(bit));
+         }
       }
    }
    else {
@@ -886,8 +883,12 @@ void mgaFallback( GLcontext *ctx, GLuint bit, GLboolean mode )
         tnl->Driver.Render.PrimitiveNotify = mgaRenderPrimitive;
         tnl->Driver.Render.Finish = mgaRenderFinish;
         tnl->Driver.Render.BuildVertices = mgaBuildVertices;
-        mmesa->new_gl_state |= (_MGA_NEW_RENDERSTATE |
-                                _MGA_NEW_RASTERSETUP);
+        mmesa->NewGLState |= (_MGA_NEW_RENDERSTATE |
+                              _MGA_NEW_RASTERSETUP);
+         if (MGA_DEBUG & DEBUG_VERBOSE_FALLBACK) {
+            fprintf(stderr, "MGA end rasterization fallback: 0x%x %s\n",
+                    bit, getFallbackString(bit));
+         }
       }
    }
 }
@@ -905,7 +906,6 @@ void mgaDDInitTriFuncs( GLcontext *ctx )
 
    mmesa->RenderIndex = ~0;
        
-   tnl->Driver.RunPipeline               = mgaRunPipeline;
    tnl->Driver.Render.Start              = mgaCheckTexSizes;
    tnl->Driver.Render.Finish             = mgaRenderFinish; 
    tnl->Driver.Render.PrimitiveNotify    = mgaRenderPrimitive;