display list support for ARB_vertex/fragment_program

This commit is contained in:
Brian Paul 2003-09-09 15:35:37 +00:00
parent 90f673e3ec
commit 5c480a4887
1 changed files with 148 additions and 11 deletions

View 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 */
}