casts to fix GLint/GLuint mismatches
[mesa.git] / src / mesa / swrast / s_context.c
index 6f7ad2a4da4e162eab05b54e8bfc4331b9236310..fa91f15a8ff7f3e26f117b0eef2484236cbe5634 100644 (file)
@@ -1,10 +1,10 @@
-/* $Id: s_context.c,v 1.15 2001/02/24 18:25:52 keithw Exp $ */
+/* $Id: s_context.c,v 1.30 2002/04/19 00:38:27 brianp Exp $ */
 
 /*
  * Mesa 3-D graphics library
- * Version:  3.5
+ * Version:  4.1
  *
- * Copyright (C) 1999  Brian Paul   All Rights Reserved.
+ * Copyright (C) 1999-2002  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"),
@@ -31,7 +31,7 @@
 #include "mtypes.h"
 #include "mem.h"
 
-#include "s_pb.h"
+#include "swrast.h"
 #include "s_points.h"
 #include "s_lines.h"
 #include "s_triangle.h"
@@ -56,7 +56,7 @@ _swrast_update_rasterflags( GLcontext *ctx )
    if (ctx->Color.BlendEnabled)           RasterMask |= BLEND_BIT;
    if (ctx->Depth.Test)                   RasterMask |= DEPTH_BIT;
    if (ctx->Fog.Enabled)                  RasterMask |= FOG_BIT;
-   if (ctx->Scissor.Enabled)              RasterMask |= SCISSOR_BIT;
+   if (ctx->Scissor.Enabled)              RasterMask |= CLIP_BIT;
    if (ctx->Stencil.Enabled)              RasterMask |= STENCIL_BIT;
    if (ctx->Visual.rgbMode) {
       const GLuint colorMask = *((GLuint *) &ctx->Color.ColorMask);
@@ -75,10 +75,10 @@ _swrast_update_rasterflags( GLcontext *ctx )
       RasterMask |= ALPHABUF_BIT;
 
    if (   ctx->Viewport.X < 0
-       || ctx->Viewport.X + ctx->Viewport.Width > ctx->DrawBuffer->Width
+       || ctx->Viewport.X + ctx->Viewport.Width > (GLint) ctx->DrawBuffer->Width
        || ctx->Viewport.Y < 0
-       || ctx->Viewport.Y + ctx->Viewport.Height > ctx->DrawBuffer->Height) {
-      RasterMask |= WINCLIP_BIT;
+       || ctx->Viewport.Y + ctx->Viewport.Height > (GLint) ctx->DrawBuffer->Height) {
+      RasterMask |= CLIP_BIT;
    }
 
    if (ctx->Depth.OcclusionTest)
@@ -162,7 +162,7 @@ _swrast_update_hint( GLcontext *ctx )
                               _SWRAST_NEW_RASTERMASK|          \
                               _NEW_LIGHT|                      \
                               _NEW_FOG |                       \
-                             _DD_NEW_SEPERATE_SPECULAR)
+                             _DD_NEW_SEPARATE_SPECULAR)
 
 #define _SWRAST_NEW_LINE (_SWRAST_NEW_DERIVED |                \
                          _NEW_RENDERMODE|              \
@@ -171,7 +171,7 @@ _swrast_update_hint( GLcontext *ctx )
                           _NEW_LIGHT|                  \
                           _NEW_FOG|                    \
                           _NEW_DEPTH |                 \
-                          _DD_NEW_SEPERATE_SPECULAR)
+                          _DD_NEW_SEPARATE_SPECULAR)
 
 #define _SWRAST_NEW_POINT (_SWRAST_NEW_DERIVED |       \
                           _NEW_RENDERMODE |            \
@@ -179,7 +179,7 @@ _swrast_update_hint( GLcontext *ctx )
                           _NEW_TEXTURE |               \
                           _NEW_LIGHT |                 \
                           _NEW_FOG |                   \
-                           _DD_NEW_SEPERATE_SPECULAR)
+                           _DD_NEW_SEPARATE_SPECULAR)
 
 #define _SWRAST_NEW_TEXTURE_SAMPLE_FUNC _NEW_TEXTURE
 
@@ -201,7 +201,7 @@ _swrast_validate_triangle( GLcontext *ctx,
    _swrast_validate_derived( ctx );
    swrast->choose_triangle( ctx );
 
-   if ((ctx->_TriangleCaps & DD_SEPERATE_SPECULAR) && 
+   if ((ctx->_TriangleCaps & DD_SEPARATE_SPECULAR) &&
        !ctx->Texture._ReallyEnabled) {
       swrast->SpecTriangle = swrast->Triangle;
       swrast->Triangle = _swrast_add_spec_terms_triangle;
@@ -218,7 +218,7 @@ _swrast_validate_line( GLcontext *ctx, const SWvertex *v0, const SWvertex *v1 )
    _swrast_validate_derived( ctx );
    swrast->choose_line( ctx );
 
-   if ((ctx->_TriangleCaps & DD_SEPERATE_SPECULAR) && 
+   if ((ctx->_TriangleCaps & DD_SEPARATE_SPECULAR) &&
        !ctx->Texture._ReallyEnabled) {
       swrast->SpecLine = swrast->Line;
       swrast->Line = _swrast_add_spec_terms_line;
@@ -236,7 +236,7 @@ _swrast_validate_point( GLcontext *ctx, const SWvertex *v0 )
    _swrast_validate_derived( ctx );
    swrast->choose_point( ctx );
 
-   if ((ctx->_TriangleCaps & DD_SEPERATE_SPECULAR) && 
+   if ((ctx->_TriangleCaps & DD_SEPARATE_SPECULAR) &&
        !ctx->Texture._ReallyEnabled) {
       swrast->SpecPoint = swrast->Point;
       swrast->Point = _swrast_add_spec_terms_point;
@@ -263,17 +263,15 @@ _swrast_validate_blend_func( GLcontext *ctx, GLuint n,
 static void
 _swrast_validate_texture_sample( 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] )
+                                GLuint n, GLfloat texcoords[][4],
+                                const GLfloat lambda[], GLchan rgba[][4] )
 {
    SWcontext *swrast = SWRAST_CONTEXT(ctx);
 
    _swrast_validate_derived( ctx );
    _swrast_choose_texture_sample_func( ctx, texUnit, tObj );
 
-   swrast->TextureSample[texUnit]( ctx, texUnit, tObj, n, s, t, u,
+   swrast->TextureSample[texUnit]( ctx, texUnit, tObj, n, texcoords,
                                   lambda, rgba );
 }
 
@@ -316,6 +314,27 @@ _swrast_invalidate_state( GLcontext *ctx, GLuint new_state )
    if (new_state & _SWRAST_NEW_TEXTURE_SAMPLE_FUNC)
       for (i = 0 ; i < ctx->Const.MaxTextureUnits ; i++)
         swrast->TextureSample[i] = _swrast_validate_texture_sample;
+
+
+   if (ctx->Visual.rgbMode) {
+      ASSERT(swrast->Driver.WriteRGBASpan);
+      ASSERT(swrast->Driver.WriteRGBSpan);
+      ASSERT(swrast->Driver.WriteMonoRGBASpan);
+      ASSERT(swrast->Driver.WriteRGBAPixels);
+      ASSERT(swrast->Driver.WriteMonoRGBAPixels);
+      ASSERT(swrast->Driver.ReadRGBASpan);
+      ASSERT(swrast->Driver.ReadRGBAPixels);
+   }
+   else {
+      ASSERT(swrast->Driver.WriteCI32Span);
+      ASSERT(swrast->Driver.WriteCI8Span);
+      ASSERT(swrast->Driver.WriteMonoCISpan);
+      ASSERT(swrast->Driver.WriteCI32Pixels);
+      ASSERT(swrast->Driver.WriteMonoCIPixels);
+      ASSERT(swrast->Driver.ReadCI32Span);
+      ASSERT(swrast->Driver.ReadCI32Pixels);
+   }
+
 }
 
 
@@ -330,10 +349,6 @@ _swrast_validate_derived( GLcontext *ctx )
       if (swrast->NewState & _SWRAST_NEW_RASTERMASK)
         _swrast_update_rasterflags( ctx );
 
-      if (swrast->NewState & _NEW_TEXTURE)
-        swrast->_MultiTextureEnabled =
-            ctx->Texture._ReallyEnabled > TEXTURE0_ANY;
-
       if (swrast->NewState & _NEW_POLYGON)
         _swrast_update_polygon( ctx );
 
@@ -346,7 +361,7 @@ _swrast_validate_derived( GLcontext *ctx )
    }
 }
 
-
+#define SWRAST_DEBUG 0
 
 /* Public entrypoints:  See also s_accum.c, s_bitmap.c, etc.
  */
@@ -355,53 +370,75 @@ _swrast_Quad( GLcontext *ctx,
              const SWvertex *v0, const SWvertex *v1,
               const SWvertex *v2, const SWvertex *v3 )
 {
-   SWRAST_CONTEXT(ctx)->Triangle( ctx, v0, v1, v2 );
-   SWRAST_CONTEXT(ctx)->Triangle( ctx, v0, v2, v3 );
+   if (SWRAST_DEBUG) {
+      fprintf(stderr, "_swrast_Quad\n");
+      _swrast_print_vertex( ctx, v0 );
+      _swrast_print_vertex( ctx, v1 );
+      _swrast_print_vertex( ctx, v2 );
+      _swrast_print_vertex( ctx, v3 );
+   }
+   SWRAST_CONTEXT(ctx)->Triangle( ctx, v0, v1, v3 );
+   SWRAST_CONTEXT(ctx)->Triangle( ctx, v1, v2, v3 );
 }
 
 void
 _swrast_Triangle( GLcontext *ctx, const SWvertex *v0,
                   const SWvertex *v1, const SWvertex *v2 )
 {
-/*     fprintf(stderr, "%s\n", __FUNCTION__); */
-/*     _swrast_print_vertex( ctx, v0 ); */
-/*     _swrast_print_vertex( ctx, v1 ); */
-/*     _swrast_print_vertex( ctx, v2 ); */
+   if (SWRAST_DEBUG) {
+      fprintf(stderr, "_swrast_Triangle\n");
+      _swrast_print_vertex( ctx, v0 );
+      _swrast_print_vertex( ctx, v1 );
+      _swrast_print_vertex( ctx, v2 );
+   }
    SWRAST_CONTEXT(ctx)->Triangle( ctx, v0, v1, v2 );
 }
 
 void
 _swrast_Line( GLcontext *ctx, const SWvertex *v0, const SWvertex *v1 )
 {
-/*     fprintf(stderr, "%s\n", __FUNCTION__); */
-/*     _swrast_print_vertex( ctx, v0 ); */
-/*     _swrast_print_vertex( ctx, v1 ); */
+   if (SWRAST_DEBUG) {
+      fprintf(stderr, "_swrast_Line\n");
+      _swrast_print_vertex( ctx, v0 );
+      _swrast_print_vertex( ctx, v1 );
+   }
    SWRAST_CONTEXT(ctx)->Line( ctx, v0, v1 );
 }
 
 void
 _swrast_Point( GLcontext *ctx, const SWvertex *v0 )
 {
-/*     fprintf(stderr, "%s\n", __FUNCTION__); */
-/*     _swrast_print_vertex( ctx, v0 ); */
+   if (SWRAST_DEBUG) {
+      fprintf(stderr, "_swrast_Point\n");
+      _swrast_print_vertex( ctx, v0 );
+   }
    SWRAST_CONTEXT(ctx)->Point( ctx, v0 );
 }
 
 void
 _swrast_InvalidateState( GLcontext *ctx, GLuint new_state )
 {
+   if (SWRAST_DEBUG) {
+      fprintf(stderr, "_swrast_InvalidateState\n");
+   }
    SWRAST_CONTEXT(ctx)->InvalidateState( ctx, new_state );
 }
 
 void
 _swrast_ResetLineStipple( GLcontext *ctx )
 {
+   if (SWRAST_DEBUG) {
+      fprintf(stderr, "_swrast_ResetLineStipple\n");
+   }
    SWRAST_CONTEXT(ctx)->StippleCounter = 0;
 }
 
 void
 _swrast_allow_vertex_fog( GLcontext *ctx, GLboolean value )
 {
+   if (SWRAST_DEBUG) {
+      fprintf(stderr, "_swrast_allow_vertex_fog %d\n", value);
+   }
    SWRAST_CONTEXT(ctx)->InvalidateState( ctx, _NEW_HINT );
    SWRAST_CONTEXT(ctx)->AllowVertexFog = value;
 }
@@ -409,6 +446,9 @@ _swrast_allow_vertex_fog( GLcontext *ctx, GLboolean value )
 void
 _swrast_allow_pixel_fog( GLcontext *ctx, GLboolean value )
 {
+   if (SWRAST_DEBUG) {
+      fprintf(stderr, "_swrast_allow_pixel_fog %d\n", value);
+   }
    SWRAST_CONTEXT(ctx)->InvalidateState( ctx, _NEW_HINT );
    SWRAST_CONTEXT(ctx)->AllowPixelFog = value;
 }
@@ -419,15 +459,14 @@ _swrast_CreateContext( GLcontext *ctx )
 {
    GLuint i;
    SWcontext *swrast = (SWcontext *)CALLOC(sizeof(SWcontext));
-   if (!swrast)
-      return GL_FALSE;
 
-   swrast->PB = gl_alloc_pb();
-   if (!swrast->PB) {
-      FREE(swrast);
-      return GL_FALSE;
+   if (SWRAST_DEBUG) {
+      fprintf(stderr, "_swrast_CreateContext\n");
    }
 
+   if (!swrast)
+      return GL_FALSE;
+
    swrast->NewState = ~0;
 
    swrast->choose_point = _swrast_choose_point;
@@ -464,32 +503,61 @@ _swrast_DestroyContext( GLcontext *ctx )
 {
    SWcontext *swrast = SWRAST_CONTEXT(ctx);
 
-   FREE( swrast->PB );
+   if (SWRAST_DEBUG) {
+      fprintf(stderr, "_swrast_DestroyContext\n");
+   }
+
    FREE( swrast );
 
    ctx->swrast_context = 0;
 }
 
 
+struct swrast_device_driver *
+_swrast_GetDeviceDriverReference( GLcontext *ctx )
+{
+   SWcontext *swrast = SWRAST_CONTEXT(ctx);
+   return &swrast->Driver;
+}
+
+#define SWRAST_DEBUG_VERTICES 0
+
 void
 _swrast_print_vertex( GLcontext *ctx, const SWvertex *v )
 {
    GLuint i;
 
-   fprintf(stderr, "win %f %f %f %f\n", 
-          v->win[0], v->win[1], v->win[2], v->win[3]);
-
-   for (i = 0 ; i < ctx->Const.MaxTextureUnits ; i++)
-      fprintf(stderr, "texcoord[%d] %f %f %f %f\n", i,
-             v->texcoord[i][0], v->texcoord[i][1], 
-             v->texcoord[i][2], v->texcoord[i][3]);
-
-   fprintf(stderr, "color %d %d %d %d\n", 
-          v->color[0], v->color[1], v->color[2], v->color[3]);
-   fprintf(stderr, "spec %d %d %d %d\n",
-          v->specular[0], v->specular[1], v->specular[2], v->specular[3]);
-   fprintf(stderr, "fog %f\n", v->fog);
-   fprintf(stderr, "index %d\n", v->index);
-   fprintf(stderr, "pointsize %f\n", v->pointSize);
-   fprintf(stderr, "\n");
+   if (SWRAST_DEBUG_VERTICES) {
+      fprintf(stderr, "win %f %f %f %f\n",
+             v->win[0], v->win[1], v->win[2], v->win[3]);
+
+      for (i = 0 ; i < ctx->Const.MaxTextureUnits ; i++)
+        if (ctx->Texture.Unit[i]._ReallyEnabled)
+           fprintf(stderr, "texcoord[%d] %f %f %f %f\n", i,
+                   v->texcoord[i][0], v->texcoord[i][1],
+                   v->texcoord[i][2], v->texcoord[i][3]);
+
+#if CHAN_TYPE == GL_FLOAT
+      fprintf(stderr, "color %f %f %f %f\n",
+             v->color[0], v->color[1], v->color[2], v->color[3]);
+      fprintf(stderr, "spec %f %f %f %f\n",
+             v->specular[0], v->specular[1], v->specular[2], v->specular[3]);
+#else
+      fprintf(stderr, "color %d %d %d %d\n",
+             v->color[0], v->color[1], v->color[2], v->color[3]);
+      fprintf(stderr, "spec %d %d %d %d\n",
+             v->specular[0], v->specular[1], v->specular[2], v->specular[3]);
+#endif
+      fprintf(stderr, "fog %f\n", v->fog);
+      fprintf(stderr, "index %d\n", v->index);
+      fprintf(stderr, "pointsize %f\n", v->pointSize);
+      fprintf(stderr, "\n");
+   }
+}
+
+
+void
+_swrast_flush( GLcontext *ctx )
+{
+   /* no-op */
 }