display list support for ARB_vertex/fragment_program
authorBrian Paul <brian.paul@tungstengraphics.com>
Tue, 9 Sep 2003 15:35:37 +0000 (15:35 +0000)
committerBrian Paul <brian.paul@tungstengraphics.com>
Tue, 9 Sep 2003 15:35:37 +0000 (15:35 +0000)
src/mesa/main/dlist.c

index fa2ff43..1fc0d39 100644 (file)
@@ -269,6 +269,10 @@ typedef enum {
         OPCODE_ACTIVE_STENCIL_FACE_EXT,
         /* GL_EXT_depth_bounds_test */
         OPCODE_DEPTH_BOUNDS_EXT,
+        /* GL_ARB_vertex/fragment_program */
+        OPCODE_PROGRAM_STRING_ARB,
+        OPCODE_PROGRAM_ENV_PARAMETER_ARB,
+
        /* The following three are meta instructions */
        OPCODE_ERROR,           /* raise compiled-in error */
        OPCODE_CONTINUE,
@@ -440,17 +444,23 @@ void _mesa_destroy_list( GLcontext *ctx, GLuint list )
             break;
 #if FEATURE_NV_vertex_program
          case OPCODE_LOAD_PROGRAM_NV:
-            FREE(n[4].data);
+            FREE(n[4].data);  /* program string */
             n += InstSize[n[0].opcode];
             break;
          case OPCODE_REQUEST_RESIDENT_PROGRAMS_NV:
-            FREE(n[2].data);
+            FREE(n[2].data);  /* array of program ids */
             n += InstSize[n[0].opcode];
             break;
 #endif
 #if FEATURE_NV_fragment_program
          case OPCODE_PROGRAM_NAMED_PARAMETER_NV:
-            FREE(n[3].data);
+            FREE(n[3].data);  /* parameter name */
+            n += InstSize[n[0].opcode];
+            break;
+#endif
+#if FEATURE_ARB_vertex_program || FEATURE_ARB_fragment_program
+         case OPCODE_PROGRAM_STRING_ARB:
+            FREE(n[4].data);  /* program string */
             n += InstSize[n[0].opcode];
             break;
 #endif
@@ -685,6 +695,10 @@ void _mesa_init_lists( void )
       InstSize[OPCODE_ACTIVE_STENCIL_FACE_EXT] = 2;
       /* GL_EXT_depth_bounds_test */
       InstSize[OPCODE_DEPTH_BOUNDS_EXT] = 3;
+#if FEATURE_ARB_vertex_program || FEATURE_ARB_fragment_program
+      InstSize[OPCODE_PROGRAM_STRING_ARB] = 5;
+      InstSize[OPCODE_PROGRAM_ENV_PARAMETER_ARB] = 7;
+#endif
    }
    init_flag = 1;
 }
@@ -4398,6 +4412,94 @@ static void save_DepthBoundsEXT( GLclampd zmin, GLclampd zmax )
 
 
 
+#if FEATURE_ARB_vertex_program || FEATURE_ARB_fragment_program
+
+static void
+save_ProgramStringARB(GLenum target, GLenum format, GLsizei len,
+                      const GLvoid *string)
+{
+   GET_CURRENT_CONTEXT(ctx);
+   Node *n;
+   GLubyte *programCopy;
+
+   programCopy = (GLubyte *) _mesa_malloc(len);
+   if (!programCopy) {
+      _mesa_error(ctx, GL_OUT_OF_MEMORY, "glProgramStringARB");
+      return;
+   }
+   _mesa_memcpy(programCopy, string, len);
+
+   ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
+   n = ALLOC_INSTRUCTION( ctx, OPCODE_PROGRAM_STRING_ARB, 4 );
+   if (n) {
+      n[1].e = target;
+      n[2].e = format;
+      n[3].i = len;
+      n[4].data = programCopy;
+   }
+   if (ctx->ExecuteFlag) {
+      (*ctx->Exec->ProgramStringARB)(target, format, len, string);
+   }
+}
+
+
+static void
+save_ProgramEnvParameter4fARB(GLenum target, GLuint index,
+                              GLfloat x, GLfloat y, GLfloat z, GLfloat w)
+{
+   GET_CURRENT_CONTEXT(ctx);
+   Node *n;
+   ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
+   n = ALLOC_INSTRUCTION( ctx, OPCODE_PROGRAM_ENV_PARAMETER_ARB, 6 );
+   if (n) {
+      n[1].e = target;
+      n[2].ui = index;
+      n[3].f = x;
+      n[4].f = y;
+      n[5].f = z;
+      n[6].f = w;
+   }
+   if (ctx->ExecuteFlag) {
+      (*ctx->Exec->ProgramEnvParameter4fARB)( target, index, x, y, z, w);
+   }
+}
+
+
+static void
+save_ProgramEnvParameter4fvARB(GLenum target, GLuint index,
+                               const GLfloat *params)
+{
+   save_ProgramEnvParameter4fARB(target, index, params[0], params[1],
+                                 params[2], params[3]);
+}
+
+
+static void
+save_ProgramEnvParameter4dARB(GLenum target, GLuint index,
+                              GLdouble x, GLdouble y, GLdouble z, GLdouble w)
+{
+   save_ProgramEnvParameter4fARB(target, index,
+                                 (GLfloat) x,
+                                 (GLfloat) y,
+                                 (GLfloat) z,
+                                 (GLfloat) w);
+}
+
+
+static void
+save_ProgramEnvParameter4dvARB(GLenum target, GLuint index,
+                               const GLdouble *params)
+{
+   save_ProgramEnvParameter4fARB(target, index,
+                                 (GLfloat) params[0],
+                                 (GLfloat) params[1],
+                                 (GLfloat) params[2],
+                                 (GLfloat) params[3]);
+}
+
+#endif /* FEATURE_ARB_vertex_program || FEATURE_ARB_fragment_program */
+
+
 
 /* KW: Compile commands
  *
@@ -5145,7 +5247,15 @@ execute_list( GLcontext *ctx, GLuint list )
          case OPCODE_DEPTH_BOUNDS_EXT:
             (*ctx->Exec->DepthBoundsEXT)(n[1].f, n[2].f);
             break;
-
+#if FEATURE_ARB_vertex_program || FEATURE_ARB_fragment_program
+         case OPCODE_PROGRAM_STRING_ARB:
+            (*ctx->Exec->ProgramStringARB)(n[1].e, n[2].e, n[3].i, n[4].data);
+            break;
+         case OPCODE_PROGRAM_ENV_PARAMETER_ARB:
+            (*ctx->Exec->ProgramEnvParameter4fARB)(n[1].e, n[2].ui, n[3].f,
+                                                   n[4].f, n[5].f, n[6].f);
+            break;
+#endif
         case OPCODE_CONTINUE:
            n = (Node *) n[1].next;
            break;
@@ -6129,8 +6239,9 @@ static void exec_MultiModeDrawElementsIBM(const GLenum *mode,
 
 
 
-/*
- * Assign all the pointers in <table> to point to Mesa's display list
+
+/**
+ * Setup the given dispatch table to point to Mesa's display list
  * building functions.
  *
  * This does not include any of the tnl functions - they are
@@ -6595,13 +6706,40 @@ _mesa_init_dlist_table( struct _glapi_table *table, GLuint tableSize )
    /* aliased with MESA_window_pos functions */
 
    /* ARB 26. GL_ARB_vertex_program */
-   /* XXX todo */
-   /* ARB 27. GL_ARB_vertex_program */
-   /* XXX todo */
+   /* ARB 27. GL_ARB_fragment_program */
+#if FEATURE_ARB_vertex_program || FEATURE_ARB_fragment_program
+   /* glVertexAttrib* functions alias the NV ones, handled elsewhere */
+   table->VertexAttribPointerARB = _mesa_VertexAttribPointerARB;
+   table->EnableVertexAttribArrayARB = _mesa_EnableVertexAttribArrayARB;
+   table->DisableVertexAttribArrayARB = _mesa_DisableVertexAttribArrayARB;
+   table->ProgramStringARB = save_ProgramStringARB;
+   table->BindProgramNV = _mesa_BindProgram;
+   table->DeleteProgramsNV = _mesa_DeletePrograms;
+   table->GenProgramsNV = _mesa_GenPrograms;
+   table->IsProgramNV = _mesa_IsProgram;
+   table->GetVertexAttribdvNV = _mesa_GetVertexAttribdvNV;
+   table->GetVertexAttribfvNV = _mesa_GetVertexAttribfvNV;
+   table->GetVertexAttribivNV = _mesa_GetVertexAttribivNV;
+   table->GetVertexAttribPointervNV = _mesa_GetVertexAttribPointervNV;
+   table->ProgramEnvParameter4dARB = save_ProgramEnvParameter4dARB;
+   table->ProgramEnvParameter4dvARB = save_ProgramEnvParameter4dvARB;
+   table->ProgramEnvParameter4fARB = save_ProgramEnvParameter4fARB;
+   table->ProgramEnvParameter4fvARB = save_ProgramEnvParameter4fvARB;
+   table->ProgramLocalParameter4dARB = save_ProgramLocalParameter4dARB;
+   table->ProgramLocalParameter4dvARB = save_ProgramLocalParameter4dvARB;
+   table->ProgramLocalParameter4fARB = save_ProgramLocalParameter4fARB;
+   table->ProgramLocalParameter4fvARB = save_ProgramLocalParameter4fvARB;
+   table->GetProgramEnvParameterdvARB = _mesa_GetProgramEnvParameterdvARB;
+   table->GetProgramEnvParameterfvARB = _mesa_GetProgramEnvParameterfvARB;
+   table->GetProgramLocalParameterdvARB = _mesa_GetProgramLocalParameterdvARB;
+   table->GetProgramLocalParameterfvARB = _mesa_GetProgramLocalParameterfvARB;
+   table->GetProgramivARB = _mesa_GetProgramivARB;
+   table->GetProgramStringARB = _mesa_GetProgramStringARB;
+#endif
 
    /* ARB 28. GL_ARB_vertex_buffer_object */
 #if FEATURE_ARB_vertex_buffer_object
-   /* None of the extension functions get compiled */
+   /* None of the extension's functions get compiled */
    table->BindBufferARB = _mesa_BindBufferARB;
    table->BufferDataARB = _mesa_BufferDataARB;
    table->BufferSubDataARB = _mesa_BufferSubDataARB;
@@ -6614,7 +6752,6 @@ _mesa_init_dlist_table( struct _glapi_table *table, GLuint tableSize )
    table->MapBufferARB = _mesa_MapBufferARB;
    table->UnmapBufferARB = _mesa_UnmapBufferARB;
 #endif
-   /* XXX todo */
 }