added GL_SGIX/SGIS_pixel_texture
[mesa.git] / src / mesa / main / dlist.c
index a85cd7e993ccb5650c35c36b0be67fa003efa45a..6234273cee2dee7fffc9b7710271e1fc16b5c035 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: dlist.c,v 1.30 2000/02/12 17:26:15 brianp Exp $ */
+/* $Id: dlist.c,v 1.37 2000/04/07 16:45:26 brianp Exp $ */
 
 /*
  * Mesa 3-D graphics library
@@ -33,6 +33,7 @@
 #include "attrib.h"
 #include "bitmap.h"
 #include "bbox.h"
+#include "blend.h"
 #include "buffers.h"
 #include "clip.h"
 #include "colortab.h"
@@ -58,6 +59,7 @@
 #include "mem.h"
 #include "pipeline.h"
 #include "pixel.h"
+#include "pixeltex.h"
 #include "points.h"
 #include "polygon.h"
 #include "readpix.h"
@@ -226,6 +228,9 @@ typedef enum {
         /* GL_ARB_multitexture */
         OPCODE_ACTIVE_TEXTURE,
         OPCODE_CLIENT_ACTIVE_TEXTURE,
+        /* GL_SGIX/SGIS_pixel_texture */
+        OPCODE_PIXEL_TEXGEN_SGIX,
+        OPCODE_PIXEL_TEXGEN_PARAMETER_SGIS,
        /* The following three are meta instructions */
        OPCODE_ERROR,           /* raise compiled-in error */
        OPCODE_VERTEX_CASSETTE, /* render prebuilt vertex buffer */
@@ -585,6 +590,9 @@ void gl_init_lists( void )
       InstSize[OPCODE_ERROR] = 3;
       InstSize[OPCODE_VERTEX_CASSETTE] = 9;
       InstSize[OPCODE_END_OF_LIST] = 1;
+      /* GL_SGIX/SGIS_pixel_texture */
+      InstSize[OPCODE_PIXEL_TEXGEN_SGIX] = 2;
+      InstSize[OPCODE_PIXEL_TEXGEN_PARAMETER_SGIS] = 3,
       /* GL_ARB_multitexture */
       InstSize[OPCODE_ACTIVE_TEXTURE] = 2;
       InstSize[OPCODE_CLIENT_ACTIVE_TEXTURE] = 2;
@@ -692,7 +700,7 @@ static void save_BlendEquation( GLenum mode )
       n[1].e = mode;
    }
    if (ctx->ExecuteFlag) {
-      (*ctx->Exec->BlendEquationEXT)( mode );
+      (*ctx->Exec->BlendEquation)( mode );
    }
 }
 
@@ -713,8 +721,8 @@ static void save_BlendFunc( GLenum sfactor, GLenum dfactor )
 }
 
 
-static void save_BlendFuncSeparateINGR(GLenum sfactorRGB, GLenum dfactorRGB,
-                                       GLenum sfactorA, GLenum dfactorA)
+static void save_BlendFuncSeparateEXT(GLenum sfactorRGB, GLenum dfactorRGB,
+                                      GLenum sfactorA, GLenum dfactorA)
 {
    GET_CURRENT_CONTEXT(ctx);
    Node *n;
@@ -727,7 +735,7 @@ static void save_BlendFuncSeparateINGR(GLenum sfactorRGB, GLenum dfactorRGB,
       n[4].e = dfactorA;
    }
    if (ctx->ExecuteFlag) {
-      (*ctx->Exec->BlendFuncSeparateINGR)( sfactorRGB, dfactorRGB,
+      (*ctx->Exec->BlendFuncSeparateEXT)( sfactorRGB, dfactorRGB,
                                           sfactorA, dfactorA);
    }
 }
@@ -747,7 +755,7 @@ static void save_BlendColor( GLfloat red, GLfloat green,
       n[4].f = alpha;
    }
    if (ctx->ExecuteFlag) {
-      (*ctx->Exec->BlendColorEXT)( red, green, blue, alpha );
+      (*ctx->Exec->BlendColor)( red, green, blue, alpha );
    }
 }
 
@@ -939,17 +947,17 @@ static void save_ColorMaterial( GLenum face, GLenum mode )
 }
 
 
-static void save_ColorTableEXT( GLenum target, GLenum internalFormat,
-                                GLsizei width, GLenum format, GLenum type,
-                                const GLvoid *table )
+static void save_ColorTable( GLenum target, GLenum internalFormat,
+                             GLsizei width, GLenum format, GLenum type,
+                             const GLvoid *table )
 {
    GET_CURRENT_CONTEXT(ctx);
    if (target == GL_PROXY_TEXTURE_1D ||
        target == GL_PROXY_TEXTURE_2D ||
        target == GL_PROXY_TEXTURE_3D) {
       /* execute immediately */
-      (*ctx->Exec->ColorTableEXT)( target, internalFormat, width,
-                                  format, type, table );
+      (*ctx->Exec->ColorTable)( target, internalFormat, width,
+                                format, type, table );
    }
    else {
       GLvoid *image = _mesa_unpack_image(width, 1, 1, format, type, table,
@@ -969,16 +977,16 @@ static void save_ColorTableEXT( GLenum target, GLenum internalFormat,
          FREE(image);
       }
       if (ctx->ExecuteFlag) {
-         (*ctx->Exec->ColorTableEXT)( target, internalFormat, width,
-                                     format, type, table );
+         (*ctx->Exec->ColorTable)( target, internalFormat, width,
+                                   format, type, table );
       }
    }
 }
 
 
-static void save_ColorSubTableEXT( GLenum target, GLsizei start, GLsizei count,
-                                   GLenum format, GLenum type,
-                                   const GLvoid *table)
+static void save_ColorSubTable( GLenum target, GLsizei start, GLsizei count,
+                                GLenum format, GLenum type,
+                                const GLvoid *table)
 {
    GET_CURRENT_CONTEXT(ctx);
    GLvoid *image = _mesa_unpack_image(count, 1, 1, format, type, table,
@@ -998,7 +1006,7 @@ static void save_ColorSubTableEXT( GLenum target, GLsizei start, GLsizei count,
       FREE(image);
    }
    if (ctx->ExecuteFlag) {
-      (*ctx->Exec->ColorSubTableEXT)(target, start, count, format, type, table);
+      (*ctx->Exec->ColorSubTable)(target, start, count, format, type, table);
    }
 }
 
@@ -2176,7 +2184,8 @@ static void save_PolygonOffset( GLfloat factor, GLfloat units )
 
 static void save_PolygonOffsetEXT( GLfloat factor, GLfloat bias )
 {
-   save_PolygonOffset(factor, DEPTH_SCALE * bias);
+   GET_CURRENT_CONTEXT(ctx);
+   save_PolygonOffset(factor, ctx->Visual->DepthMaxF * bias);
 }
 
 
@@ -2883,17 +2892,6 @@ static void save_TexImage3D( GLenum target,
 }
 
 
-static void save_TexImage3DEXT( GLenum target,
-                                GLint level, GLenum components,
-                                GLsizei width, GLsizei height, GLsizei depth,
-                                GLint border, GLenum format, GLenum type,
-                                const GLvoid *pixels )
-{
-   save_TexImage3D(target, level, (GLint) components, width, height,
-                   depth, border, format, type, pixels);
-}
-
-
 static void save_TexSubImage1D( GLenum target, GLint level, GLint xoffset,
                                 GLsizei width, GLenum format, GLenum type,
                                 const GLvoid *pixels )
@@ -3233,6 +3231,53 @@ static void save_MultTransposeMatrixfARB( const GLfloat m[16] )
 }
 
 
+static void save_PixelTexGenSGIX(GLenum mode)
+{
+   GET_CURRENT_CONTEXT(ctx);
+   Node *n;
+   FLUSH_VB(ctx, "dlist");
+   n = alloc_instruction( ctx, OPCODE_PIXEL_TEXGEN_SGIX, 1 );
+   if (n) {
+      n[1].e = mode;
+   }
+   if (ctx->ExecuteFlag) {
+      (*ctx->Exec->PixelTexGenSGIX)( mode );
+   }
+}
+
+
+static void save_PixelTexGenParameteriSGIS(GLenum target, GLint value)
+{
+   GET_CURRENT_CONTEXT(ctx);
+   Node *n;
+   FLUSH_VB(ctx, "dlist");
+   n = alloc_instruction( ctx, OPCODE_PIXEL_TEXGEN_PARAMETER_SGIS, 2 );
+   if (n) {
+      n[1].e = target;
+      n[2].i = value;
+   }
+   if (ctx->ExecuteFlag) {
+      (*ctx->Exec->PixelTexGenParameteriSGIS)( target, value );
+   }
+}
+
+
+static void save_PixelTexGenParameterfSGIS(GLenum target, GLfloat value)
+{
+   save_PixelTexGenParameteriSGIS(target, (GLint) value);
+}
+
+
+static void save_PixelTexGenParameterivSGIS(GLenum target, const GLint *value)
+{
+   save_PixelTexGenParameteriSGIS(target, *value);
+}
+
+
+static void save_PixelTexGenParameterfvSGIS(GLenum target, const GLfloat *value)
+{
+   save_PixelTexGenParameteriSGIS(target, (GLint) *value);
+}
 
 void gl_compile_cassette( GLcontext *ctx )
 {
@@ -3375,10 +3420,12 @@ static void execute_list( GLcontext *ctx, GLuint list )
                (MESA_VERBOSE & VERBOSE_IMMEDIATE))
               gl_print_cassette( (struct immediate *) n[1].data );
 
-           if (0)
-              fprintf(stderr, "Run cassette %d, rows %d..%d, beginstate %x\n",
+           if (MESA_VERBOSE & VERBOSE_DISPLAY_LIST) {
+              fprintf(stderr, "Run cassette %d, rows %d..%d, beginstate %x ",
                       IM->id,
                       IM->Start, IM->Count, IM->BeginState);
+              gl_print_vert_flags("orflag", IM->OrFlag);
+           }
 
            gl_fixup_cassette( ctx, (struct immediate *) n[1].data ); 
            gl_execute_cassette( ctx, (struct immediate *) n[1].data ); 
@@ -3398,21 +3445,21 @@ static void execute_list( GLcontext *ctx, GLuint list )
                struct gl_pixelstore_attrib save = ctx->Unpack;
                ctx->Unpack = _mesa_native_packing;
                (*ctx->Exec->Bitmap)( (GLsizei) n[1].i, (GLsizei) n[2].i,
-                                n[3].f, n[4].f, n[5].f, n[6].f, n[7].data );
+                 n[3].f, n[4].f, n[5].f, n[6].f, (const GLubyte *) n[7].data );
                ctx->Unpack = save;  /* restore */
             }
            break;
         case OPCODE_BLEND_COLOR:
-           (*ctx->Exec->BlendColorEXT)( n[1].f, n[2].f, n[3].f, n[4].f );
+           (*ctx->Exec->BlendColor)( n[1].f, n[2].f, n[3].f, n[4].f );
            break;
         case OPCODE_BLEND_EQUATION:
-           (*ctx->Exec->BlendEquationEXT)( n[1].e );
+           (*ctx->Exec->BlendEquation)( n[1].e );
            break;
         case OPCODE_BLEND_FUNC:
            (*ctx->Exec->BlendFunc)( n[1].e, n[2].e );
            break;
         case OPCODE_BLEND_FUNC_SEPARATE:
-           (*ctx->Exec->BlendFuncSeparateINGR)(n[1].e, n[2].e, n[3].e, n[4].e);
+           (*ctx->Exec->BlendFuncSeparateEXT)(n[1].e, n[2].e, n[3].e, n[4].e);
            break;
          case OPCODE_CALL_LIST:
            /* Generated by glCallList(), don't add ListBase */
@@ -3464,8 +3511,8 @@ static void execute_list( GLcontext *ctx, GLuint list )
             {
                struct gl_pixelstore_attrib save = ctx->Unpack;
                ctx->Unpack = _mesa_native_packing;
-               (*ctx->Exec->ColorTableEXT)( n[1].e, n[2].e, n[3].i, n[4].e,
-                                           n[5].e, n[6].data );
+               (*ctx->Exec->ColorTable)( n[1].e, n[2].e, n[3].i, n[4].e,
+                                         n[5].e, n[6].data );
                ctx->Unpack = save;  /* restore */
             }
             break;
@@ -3473,8 +3520,8 @@ static void execute_list( GLcontext *ctx, GLuint list )
             {
                struct gl_pixelstore_attrib save = ctx->Unpack;
                ctx->Unpack = _mesa_native_packing;
-               (*ctx->Exec->ColorSubTableEXT)( n[1].e, n[2].i, n[3].i,
-                                              n[4].e, n[5].e, n[6].data );
+               (*ctx->Exec->ColorSubTable)( n[1].e, n[2].i, n[3].i,
+                                            n[4].e, n[5].e, n[6].data );
                ctx->Unpack = save;  /* restore */
             }
             break;
@@ -3878,6 +3925,12 @@ static void execute_list( GLcontext *ctx, GLuint list )
          case OPCODE_CLIENT_ACTIVE_TEXTURE:  /* GL_ARB_multitexture */
             (*ctx->Exec->ClientActiveTextureARB)( n[1].e );
             break;
+         case OPCODE_PIXEL_TEXGEN_SGIX:  /* GL_SGIX_pixel_texture */
+            (*ctx->Exec->PixelTexGenSGIX)( n[1].e );
+            break;
+         case OPCODE_PIXEL_TEXGEN_PARAMETER_SGIS:  /* GL_SGIS_pixel_texture */
+            (*ctx->Exec->PixelTexGenParameteriSGIS)( n[1].e, n[2].i );
+            break;
         case OPCODE_CONTINUE:
            n = (Node *) n[1].next;
            break;
@@ -3964,6 +4017,11 @@ _mesa_GenLists(GLsizei range )
       return 0;
    }
 
+   /*
+    * Make this an atomic operation
+    */
+   _glthread_LOCK_MUTEX(ctx->Shared->Mutex);
+
    base = _mesa_HashFindFreeKeyBlock(ctx->Shared->DisplayList, range);
    if (base) {
       /* reserve the list IDs by with empty/dummy lists */
@@ -3972,6 +4030,9 @@ _mesa_GenLists(GLsizei range )
          _mesa_HashInsert(ctx->Shared->DisplayList, base+i, make_empty_list());
       }
    }
+
+   _glthread_UNLOCK_MUTEX(ctx->Shared->Mutex);
+
    return base;
 }
 
@@ -4515,11 +4576,11 @@ _mesa_init_dlist_table( struct _glapi_table *table )
    table->TexSubImage3D = save_TexSubImage3D;
 
    /* GL_ARB_imaging */
-   /* NOT supported, just call stub functions */
-   table->BlendColor = _mesa_BlendColor;
-   table->BlendEquation = _mesa_BlendEquation;
-   table->ColorSubTable = _mesa_ColorSubTable;
-   table->ColorTable = _mesa_ColorTable;
+   /* Not all are supported */
+   table->BlendColor = save_BlendColor;
+   table->BlendEquation = save_BlendEquation;
+   table->ColorSubTable = save_ColorSubTable;
+   table->ColorTable = save_ColorTable;
    table->ColorTableParameterfv = _mesa_ColorTableParameterfv;
    table->ColorTableParameteriv = _mesa_ColorTableParameteriv;
    table->ConvolutionFilter1D = _mesa_ConvolutionFilter1D;
@@ -4551,17 +4612,32 @@ _mesa_init_dlist_table( struct _glapi_table *table )
    table->ResetMinmax = _mesa_ResetMinmax;
    table->SeparableFilter2D = _mesa_SeparableFilter2D;
 
-   /* 6. GL_EXT_texture3d */
+   /* GL_EXT_texture3d */
+#if 0
    table->CopyTexSubImage3DEXT = save_CopyTexSubImage3D;
    table->TexImage3DEXT = save_TexImage3DEXT;
    table->TexSubImage3DEXT = save_TexSubImage3D;
+#endif
 
    /* GL_EXT_paletted_texture */
-   table->ColorTableEXT = save_ColorTableEXT;
-   table->ColorSubTableEXT = save_ColorSubTableEXT;
-   table->GetColorTableEXT = _mesa_GetColorTableEXT;
-   table->GetColorTableParameterfvEXT = _mesa_GetColorTableParameterfvEXT;
-   table->GetColorTableParameterivEXT = _mesa_GetColorTableParameterivEXT;
+#if 0
+   table->ColorTableEXT = save_ColorTable;
+   table->ColorSubTableEXT = save_ColorSubTable;
+#endif
+   table->GetColorTableEXT = _mesa_GetColorTable;
+   table->GetColorTableParameterfvEXT = _mesa_GetColorTableParameterfv;
+   table->GetColorTableParameterivEXT = _mesa_GetColorTableParameteriv;
+
+   /* 15. GL_SGIX_pixel_texture */
+   table->PixelTexGenSGIX = save_PixelTexGenSGIX;
+
+   /* 15. GL_SGIS_pixel_texture */
+   table->PixelTexGenParameteriSGIS = save_PixelTexGenParameteriSGIS;
+   table->PixelTexGenParameterfSGIS = save_PixelTexGenParameterfSGIS;
+   table->PixelTexGenParameterivSGIS = save_PixelTexGenParameterivSGIS;
+   table->PixelTexGenParameterfvSGIS = save_PixelTexGenParameterfvSGIS;
+   table->GetPixelTexGenParameterivSGIS = _mesa_GetPixelTexGenParameterivSGIS;
+   table->GetPixelTexGenParameterfvSGIS = _mesa_GetPixelTexGenParameterfvSGIS;
 
    /* GL_EXT_compiled_vertex_array */
    table->LockArraysEXT = _mesa_LockArraysEXT;
@@ -4578,10 +4654,14 @@ _mesa_init_dlist_table( struct _glapi_table *table )
    table->PolygonOffsetEXT = save_PolygonOffsetEXT;
 
    /* GL_EXT_blend_minmax */
-   table->BlendEquationEXT = save_BlendEquation;
+#if 0
+   table->BlendEquationEXT = save_BlendEquationEXT;
+#endif
 
    /* GL_EXT_blend_color */
-   table->BlendColorEXT = save_BlendColor;
+#if 0 
+   table->BlendColorEXT = save_BlendColorEXT;
+#endif
 
    /* GL_ARB_multitexture */
    table->ActiveTextureARB = save_ActiveTextureARB;
@@ -4619,8 +4699,8 @@ _mesa_init_dlist_table( struct _glapi_table *table )
    table->MultiTexCoord4sARB = _mesa_MultiTexCoord4sARB;
    table->MultiTexCoord4svARB = _mesa_MultiTexCoord4svARB;
 
-   /* GL_INGR_blend_func_separate */
-   table->BlendFuncSeparateINGR = save_BlendFuncSeparateINGR;
+   /* GL_EXT_blend_func_separate */
+   table->BlendFuncSeparateEXT = save_BlendFuncSeparateEXT;
 
    /* GL_MESA_window_pos */
    table->WindowPos2dMESA = save_WindowPos2dMESA;
@@ -4791,6 +4871,7 @@ static void print_list( GLcontext *ctx, FILE *f, GLuint list )
                    ((struct immediate *) n[1].data)->id,
                    n[2].ui,
                    n[3].ui);
+           gl_print_cassette( (struct immediate *) n[1].data );
            break;
         case OPCODE_CONTINUE:
             fprintf(f,"DISPLAY-LIST-CONTINUE\n");