mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-06 05:08:08 +02:00
vertex program attribute array work
This commit is contained in:
parent
1113e3266f
commit
b7752724d9
7 changed files with 151 additions and 40 deletions
|
|
@ -1,10 +1,10 @@
|
|||
/* $Id: ac_context.h,v 1.3 2001/03/12 00:48:41 gareth Exp $ */
|
||||
/* $Id: ac_context.h,v 1.4 2002/04/21 18:49:19 brianp Exp $ */
|
||||
|
||||
/*
|
||||
* Mesa 3-D graphics library
|
||||
* Version: 3.5
|
||||
* Version: 4.1
|
||||
*
|
||||
* Copyright (C) 1999-2001 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"),
|
||||
|
|
@ -47,6 +47,7 @@ struct ac_arrays {
|
|||
struct gl_client_array Index;
|
||||
struct gl_client_array TexCoord[MAX_TEXTURE_UNITS];
|
||||
struct gl_client_array EdgeFlag;
|
||||
struct gl_client_array Attrib[VERT_ATTRIB_MAX]; /* GL_NV_vertex_program */
|
||||
};
|
||||
|
||||
struct ac_array_pointers {
|
||||
|
|
@ -58,6 +59,7 @@ struct ac_array_pointers {
|
|||
struct gl_client_array *Index;
|
||||
struct gl_client_array *TexCoord[MAX_TEXTURE_UNITS];
|
||||
struct gl_client_array *EdgeFlag;
|
||||
struct gl_client_array *Attrib[VERT_ATTRIB_MAX]; /* GL_NV_vertex_program */
|
||||
};
|
||||
|
||||
struct ac_array_flags {
|
||||
|
|
@ -69,6 +71,7 @@ struct ac_array_flags {
|
|||
GLboolean Index;
|
||||
GLboolean TexCoord[MAX_TEXTURE_UNITS];
|
||||
GLboolean EdgeFlag;
|
||||
GLboolean Attrib[VERT_ATTRIB_MAX]; /* GL_NV_vertex_program */
|
||||
};
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
/* $Id: ac_import.c,v 1.16 2002/01/05 20:51:12 brianp Exp $ */
|
||||
/* $Id: ac_import.c,v 1.17 2002/04/21 18:49:19 brianp Exp $ */
|
||||
|
||||
/*
|
||||
* Mesa 3-D graphics library
|
||||
|
|
@ -147,6 +147,7 @@ static void reset_index( GLcontext *ctx )
|
|||
ac->NewArrayState &= ~_NEW_ARRAY_INDEX;
|
||||
}
|
||||
|
||||
|
||||
static void reset_fogcoord( GLcontext *ctx )
|
||||
{
|
||||
ACcontext *ac = AC_CONTEXT(ctx);
|
||||
|
|
@ -162,6 +163,7 @@ static void reset_fogcoord( GLcontext *ctx )
|
|||
ac->NewArrayState &= ~_NEW_ARRAY_FOGCOORD;
|
||||
}
|
||||
|
||||
|
||||
static void reset_edgeflag( GLcontext *ctx )
|
||||
{
|
||||
ACcontext *ac = AC_CONTEXT(ctx);
|
||||
|
|
@ -178,7 +180,33 @@ static void reset_edgeflag( GLcontext *ctx )
|
|||
}
|
||||
|
||||
|
||||
static void reset_attrib( GLcontext *ctx, GLuint index )
|
||||
{
|
||||
ACcontext *ac = AC_CONTEXT(ctx);
|
||||
|
||||
if (ctx->Array._Enabled & _NEW_ARRAY_ATTRIB(index)) {
|
||||
ac->Raw.Attrib[index] = ctx->Array.VertexAttrib[index];
|
||||
STRIDE_ARRAY(ac->Raw.Attrib[index], ac->start);
|
||||
}
|
||||
else {
|
||||
ac->Raw.Attrib[index] = ac->Fallback.Attrib[index];
|
||||
|
||||
if (ctx->Current.Attrib[index][3] != 1.0)
|
||||
ac->Raw.Attrib[index].Size = 4;
|
||||
else if (ctx->Current.Attrib[index][2] != 0.0)
|
||||
ac->Raw.Attrib[index].Size = 3;
|
||||
else
|
||||
ac->Raw.Attrib[index].Size = 2;
|
||||
}
|
||||
|
||||
ac->IsCached.Attrib[index] = GL_FALSE;
|
||||
ac->NewArrayState &= ~_NEW_ARRAY_ATTRIB(index);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Generic import function for color data
|
||||
*/
|
||||
static void import( GLcontext *ctx,
|
||||
GLenum type,
|
||||
struct gl_client_array *to,
|
||||
|
|
@ -237,8 +265,12 @@ static void import( GLcontext *ctx,
|
|||
|
||||
|
||||
|
||||
/* Functions to import array ranges with specified types and strides.
|
||||
/*
|
||||
* Functions to import array ranges with specified types and strides.
|
||||
* For example, if the vertex data is GLshort[2] and we want GLfloat[3]
|
||||
* we'll use an import function to do the data conversion.
|
||||
*/
|
||||
|
||||
static void import_texcoord( GLcontext *ctx, GLuint unit,
|
||||
GLenum type, GLuint stride )
|
||||
{
|
||||
|
|
@ -246,6 +278,8 @@ static void import_texcoord( GLcontext *ctx, GLuint unit,
|
|||
struct gl_client_array *from = &ac->Raw.TexCoord[unit];
|
||||
struct gl_client_array *to = &ac->Cache.TexCoord[unit];
|
||||
|
||||
ASSERT(unit < ctx->Const.MaxTextureUnits);
|
||||
|
||||
/* Limited choices at this stage:
|
||||
*/
|
||||
ASSERT(type == GL_FLOAT);
|
||||
|
|
@ -316,9 +350,6 @@ static void import_normal( GLcontext *ctx,
|
|||
ac->IsCached.Normal = GL_TRUE;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
static void import_color( GLcontext *ctx,
|
||||
GLenum type, GLuint stride )
|
||||
{
|
||||
|
|
@ -415,10 +446,42 @@ static void import_edgeflag( GLcontext *ctx,
|
|||
ac->IsCached.EdgeFlag = GL_TRUE;
|
||||
}
|
||||
|
||||
static void import_attrib( GLcontext *ctx, GLuint index,
|
||||
GLenum type, GLuint stride )
|
||||
{
|
||||
ACcontext *ac = AC_CONTEXT(ctx);
|
||||
struct gl_client_array *from = &ac->Raw.Attrib[index];
|
||||
struct gl_client_array *to = &ac->Cache.Attrib[index];
|
||||
|
||||
ASSERT(index < VERT_ATTRIB_MAX);
|
||||
|
||||
/* Limited choices at this stage:
|
||||
*/
|
||||
ASSERT(type == GL_FLOAT);
|
||||
ASSERT(stride == 4*sizeof(GLfloat) || stride == 0);
|
||||
ASSERT(ac->count - ac->start < ctx->Const.MaxArrayLockSize);
|
||||
|
||||
_math_trans_4f( (GLfloat (*)[4]) to->Ptr,
|
||||
from->Ptr,
|
||||
from->StrideB,
|
||||
from->Type,
|
||||
from->Size,
|
||||
0,
|
||||
ac->count - ac->start);
|
||||
|
||||
to->Size = from->Size;
|
||||
to->StrideB = 4 * sizeof(GLfloat);
|
||||
to->Type = GL_FLOAT;
|
||||
ac->IsCached.Attrib[index] = GL_TRUE;
|
||||
}
|
||||
|
||||
|
||||
/* Externals to request arrays with specific properties:
|
||||
|
||||
/*
|
||||
* Externals to request arrays with specific properties:
|
||||
*/
|
||||
|
||||
|
||||
struct gl_client_array *_ac_import_texcoord( GLcontext *ctx,
|
||||
GLuint unit,
|
||||
GLenum type,
|
||||
|
|
@ -429,6 +492,8 @@ struct gl_client_array *_ac_import_texcoord( GLcontext *ctx,
|
|||
{
|
||||
ACcontext *ac = AC_CONTEXT(ctx);
|
||||
|
||||
ASSERT(unit < ctx->Const.MaxTextureUnits);
|
||||
|
||||
/* Can we keep the existing version?
|
||||
*/
|
||||
if (ac->NewArrayState & _NEW_ARRAY_TEXCOORD(unit))
|
||||
|
|
@ -656,9 +721,6 @@ struct gl_client_array *_ac_import_fogcoord( GLcontext *ctx,
|
|||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
struct gl_client_array *_ac_import_edgeflag( GLcontext *ctx,
|
||||
GLenum type,
|
||||
GLuint reqstride,
|
||||
|
|
@ -689,8 +751,45 @@ struct gl_client_array *_ac_import_edgeflag( GLcontext *ctx,
|
|||
}
|
||||
}
|
||||
|
||||
/* GL_NV_vertex_program */
|
||||
struct gl_client_array *_ac_import_attrib( GLcontext *ctx,
|
||||
GLuint index,
|
||||
GLenum type,
|
||||
GLuint reqstride,
|
||||
GLuint reqsize,
|
||||
GLboolean reqwriteable,
|
||||
GLboolean *writeable )
|
||||
{
|
||||
ACcontext *ac = AC_CONTEXT(ctx);
|
||||
|
||||
ASSERT(index < VERT_ATTRIB_MAX);
|
||||
|
||||
/* Can we keep the existing version?
|
||||
*/
|
||||
if (ac->NewArrayState & _NEW_ARRAY_ATTRIB(index))
|
||||
reset_attrib( ctx, index );
|
||||
|
||||
/* Is the request impossible?
|
||||
*/
|
||||
if (reqsize != 0 && ac->Raw.Attrib[index].Size > (GLint) reqsize)
|
||||
return 0;
|
||||
|
||||
/* Do we need to pull in a copy of the client data:
|
||||
*/
|
||||
if (ac->Raw.Attrib[index].Type != type ||
|
||||
(reqstride != 0 && ac->Raw.Attrib[index].StrideB != (GLint)reqstride) ||
|
||||
reqwriteable)
|
||||
{
|
||||
if (!ac->IsCached.Attrib[index])
|
||||
import_attrib(ctx, index, type, reqstride );
|
||||
*writeable = GL_TRUE;
|
||||
return &ac->Cache.Attrib[index];
|
||||
}
|
||||
else {
|
||||
*writeable = GL_FALSE;
|
||||
return &ac->Raw.Attrib[index];
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/* Clients must call this function to validate state and set bounds
|
||||
|
|
@ -723,8 +822,8 @@ void _ac_import_range( GLcontext *ctx, GLuint start, GLuint count )
|
|||
|
||||
|
||||
|
||||
/* Additional convienence function for importing a the element list
|
||||
* for drawelements, drawrangeelements:
|
||||
/* Additional convienence function for importing the element list
|
||||
* for glDrawElements() and glDrawRangeElements().
|
||||
*/
|
||||
CONST void *
|
||||
_ac_import_elements( GLcontext *ctx,
|
||||
|
|
|
|||
|
|
@ -1,10 +1,10 @@
|
|||
/* $Id: acache.h,v 1.2 2001/03/12 00:48:41 gareth Exp $ */
|
||||
/* $Id: acache.h,v 1.3 2002/04/21 18:49:19 brianp Exp $ */
|
||||
|
||||
/*
|
||||
* Mesa 3-D graphics library
|
||||
* Version: 3.5
|
||||
* Version: 4.1
|
||||
*
|
||||
* Copyright (C) 1999-2001 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"),
|
||||
|
|
@ -42,15 +42,6 @@ _ac_DestroyContext( GLcontext *ctx );
|
|||
extern void
|
||||
_ac_InvalidateState( GLcontext *ctx, GLuint new_state );
|
||||
|
||||
extern struct gl_client_array *
|
||||
_ac_import_texcoord( GLcontext *ctx,
|
||||
GLuint unit,
|
||||
GLenum type,
|
||||
GLuint reqstride,
|
||||
GLuint reqsize,
|
||||
GLboolean reqwritable,
|
||||
GLboolean *writable );
|
||||
|
||||
extern struct gl_client_array *
|
||||
_ac_import_vertex( GLcontext *ctx,
|
||||
GLenum type,
|
||||
|
|
@ -103,6 +94,24 @@ _ac_import_edgeflag( GLcontext *ctx,
|
|||
GLboolean reqwritable,
|
||||
GLboolean *writable );
|
||||
|
||||
extern struct gl_client_array *
|
||||
_ac_import_texcoord( GLcontext *ctx,
|
||||
GLuint unit,
|
||||
GLenum type,
|
||||
GLuint reqstride,
|
||||
GLuint reqsize,
|
||||
GLboolean reqwritable,
|
||||
GLboolean *writable );
|
||||
|
||||
extern struct gl_client_array *
|
||||
_ac_import_attrib( GLcontext *ctx,
|
||||
GLuint index,
|
||||
GLenum type,
|
||||
GLuint reqstride,
|
||||
GLuint reqsize,
|
||||
GLboolean reqwritable,
|
||||
GLboolean *writable );
|
||||
|
||||
|
||||
/* Clients must call this function to validate state and set bounds
|
||||
* before importing any data:
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
/* $Id: dd.h,v 1.67 2002/03/16 00:57:14 brianp Exp $ */
|
||||
/* $Id: dd.h,v 1.68 2002/04/21 18:49:18 brianp Exp $ */
|
||||
|
||||
/*
|
||||
* Mesa 3-D graphics library
|
||||
|
|
@ -542,6 +542,8 @@ struct dd_function_table {
|
|||
void (*TexCoordPointer)(GLcontext *ctx, GLint size, GLenum type,
|
||||
GLsizei stride, const GLvoid *ptr);
|
||||
void (*EdgeFlagPointer)(GLcontext *ctx, GLsizei stride, const GLvoid *ptr);
|
||||
void (*VertexAttribPointer)(GLcontext *ctx, GLuint index, GLint size,
|
||||
GLenum type, GLsizei stride, const GLvoid *ptr);
|
||||
|
||||
|
||||
/*** State-query functions
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
/* $Id: enable.c,v 1.61 2002/04/19 08:38:23 alanh Exp $ */
|
||||
/* $Id: enable.c,v 1.62 2002/04/21 18:49:18 brianp Exp $ */
|
||||
|
||||
/*
|
||||
* Mesa 3-D graphics library
|
||||
|
|
@ -112,7 +112,7 @@ client_state( GLcontext *ctx, GLenum cap, GLboolean state )
|
|||
{
|
||||
GLint n = (GLint) cap - GL_VERTEX_ATTRIB_ARRAY0_NV;
|
||||
var = &ctx->Array.VertexAttrib[n].Enabled;
|
||||
flag = _NEW_ARRAY_VERT_ATTRIB0; /* XXX flag OK? */
|
||||
flag = _NEW_ARRAY_ATTRIB(n);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
/* $Id: mtypes.h,v 1.71 2002/04/19 15:49:40 kschultz Exp $ */
|
||||
/* $Id: mtypes.h,v 1.72 2002/04/21 18:49:18 brianp Exp $ */
|
||||
|
||||
/*
|
||||
* Mesa 3-D graphics library
|
||||
|
|
@ -1538,10 +1538,11 @@ struct matrix_stack
|
|||
#define _NEW_ARRAY_TEXCOORD_6 VERT_BIT_TEX6
|
||||
#define _NEW_ARRAY_TEXCOORD_7 VERT_BIT_TEX7
|
||||
#define _NEW_ARRAY_ALL 0xffff
|
||||
#define _NEW_ARRAY_VERT_ATTRIB0 0x10000
|
||||
#define _NEW_ARRAY_ATTRIB_0 0x10000 /* start at bit 16 */
|
||||
|
||||
|
||||
#define _NEW_ARRAY_TEXCOORD(i) (_NEW_ARRAY_TEXCOORD_0 << (i))
|
||||
#define _NEW_ARRAY_ATTRIB(i) (_NEW_ARRAY_ATTRIB_0 << (i))
|
||||
|
||||
/* A bunch of flags that we think might be useful to drivers.
|
||||
*/
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
/* $Id: varray.c,v 1.42 2002/04/04 23:59:14 brianp Exp $ */
|
||||
/* $Id: varray.c,v 1.43 2002/04/21 18:49:18 brianp Exp $ */
|
||||
|
||||
/*
|
||||
* Mesa 3-D graphics library
|
||||
|
|
@ -452,12 +452,12 @@ _mesa_EdgeFlagPointer(GLsizei stride, const GLvoid *vptr)
|
|||
|
||||
|
||||
void _mesa_VertexAttribPointerNV(GLuint index, GLint size, GLenum type,
|
||||
GLsizei stride, const GLvoid *pointer)
|
||||
GLsizei stride, const GLvoid *ptr)
|
||||
{
|
||||
GET_CURRENT_CONTEXT(ctx);
|
||||
ASSERT_OUTSIDE_BEGIN_END(ctx);
|
||||
|
||||
if (index >= VP_NUM_PROG_REGS) {
|
||||
if (index >= VERT_ATTRIB_MAX) {
|
||||
_mesa_error(ctx, GL_INVALID_VALUE, "glVertexAttribPointerNV(index)");
|
||||
return;
|
||||
}
|
||||
|
|
@ -502,16 +502,13 @@ void _mesa_VertexAttribPointerNV(GLuint index, GLint size, GLenum type,
|
|||
ctx->Array.VertexAttrib[index].Stride = stride;
|
||||
ctx->Array.VertexAttrib[index].Size = size;
|
||||
ctx->Array.VertexAttrib[index].Type = type;
|
||||
ctx->Array.VertexAttrib[index].Ptr = (void *) ptr;
|
||||
|
||||
/* XXX need new flags here??? */
|
||||
ctx->NewState |= _NEW_ARRAY;
|
||||
/* XXX probably need new flags!!!! */
|
||||
ctx->Array.NewState |= _NEW_ARRAY_VERT_ATTRIB0;
|
||||
ctx->Array.NewState |= _NEW_ARRAY_ATTRIB(index);
|
||||
|
||||
/* XXX
|
||||
if (ctx->Driver.VertexAttribdPointer)
|
||||
if (ctx->Driver.VertexAttribPointer)
|
||||
ctx->Driver.VertexAttribPointer( ctx, index, size, type, stride, ptr );
|
||||
*/
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue