Immediate mode performance optimisation

This commit is contained in:
Luke Benstead 2021-04-19 10:53:08 +01:00
parent 778e9c4e64
commit eb35d607b9

View File

@ -31,6 +31,14 @@ static AttribPointer UV_ATTRIB;
static AttribPointer ST_ATTRIB; static AttribPointer ST_ATTRIB;
static AttribPointer NORMAL_ATTRIB; static AttribPointer NORMAL_ATTRIB;
/* Set of flags that have been enabled by glNormal etc. Cleared to VERTEX_ENABLED_FLAG
in glBegin */
static GLuint ENABLED_VERTEX_ATTRIBUTES_DRAFT = VERTEX_ENABLED_FLAG;
/* Set from ENABLED_VERTEX_ATTRIBUTES when glVertex is called so that
* new attribute types are ignored if they appear after the first vertex */
static GLuint ENABLED_VERTEX_ATTRIBUTES = 0;
static inline uint32_t pack_vertex_attribute_vec3_1i(float x, float y, float z) { static inline uint32_t pack_vertex_attribute_vec3_1i(float x, float y, float z) {
const float w = 0.0f; const float w = 0.0f;
@ -105,9 +113,14 @@ void APIENTRY glBegin(GLenum mode) {
IMMEDIATE_MODE_ACTIVE = GL_TRUE; IMMEDIATE_MODE_ACTIVE = GL_TRUE;
ACTIVE_POLYGON_MODE = mode; ACTIVE_POLYGON_MODE = mode;
/* Only vertices enabled at the moment */
ENABLED_VERTEX_ATTRIBUTES = ENABLED_VERTEX_ATTRIBUTES_DRAFT = VERTEX_ENABLED_FLAG;
} }
void APIENTRY glColor4f(GLfloat r, GLfloat g, GLfloat b, GLfloat a) { void APIENTRY glColor4f(GLfloat r, GLfloat g, GLfloat b, GLfloat a) {
ENABLED_VERTEX_ATTRIBUTES_DRAFT |= DIFFUSE_ENABLED_FLAG;
COLOR[0] = (GLubyte)(r * 255); COLOR[0] = (GLubyte)(r * 255);
COLOR[1] = (GLubyte)(g * 255); COLOR[1] = (GLubyte)(g * 255);
COLOR[2] = (GLubyte)(b * 255); COLOR[2] = (GLubyte)(b * 255);
@ -115,6 +128,8 @@ void APIENTRY glColor4f(GLfloat r, GLfloat g, GLfloat b, GLfloat a) {
} }
void APIENTRY glColor4ub(GLubyte r, GLubyte g, GLubyte b, GLubyte a) { void APIENTRY glColor4ub(GLubyte r, GLubyte g, GLubyte b, GLubyte a) {
ENABLED_VERTEX_ATTRIBUTES_DRAFT |= DIFFUSE_ENABLED_FLAG;
COLOR[0] = r; COLOR[0] = r;
COLOR[1] = g; COLOR[1] = g;
COLOR[2] = b; COLOR[2] = b;
@ -122,6 +137,8 @@ void APIENTRY glColor4ub(GLubyte r, GLubyte g, GLubyte b, GLubyte a) {
} }
void APIENTRY glColor4fv(const GLfloat* v) { void APIENTRY glColor4fv(const GLfloat* v) {
ENABLED_VERTEX_ATTRIBUTES_DRAFT |= DIFFUSE_ENABLED_FLAG;
COLOR[0] = (GLubyte)(v[0] * 255); COLOR[0] = (GLubyte)(v[0] * 255);
COLOR[1] = (GLubyte)(v[1] * 255); COLOR[1] = (GLubyte)(v[1] * 255);
COLOR[2] = (GLubyte)(v[2] * 255); COLOR[2] = (GLubyte)(v[2] * 255);
@ -129,6 +146,8 @@ void APIENTRY glColor4fv(const GLfloat* v) {
} }
void APIENTRY glColor3f(GLfloat r, GLfloat g, GLfloat b) { void APIENTRY glColor3f(GLfloat r, GLfloat g, GLfloat b) {
ENABLED_VERTEX_ATTRIBUTES_DRAFT |= DIFFUSE_ENABLED_FLAG;
COLOR[0] = (GLubyte)(r * 255); COLOR[0] = (GLubyte)(r * 255);
COLOR[1] = (GLubyte)(g * 255); COLOR[1] = (GLubyte)(g * 255);
COLOR[2] = (GLubyte)(b * 255); COLOR[2] = (GLubyte)(b * 255);
@ -136,6 +155,8 @@ void APIENTRY glColor3f(GLfloat r, GLfloat g, GLfloat b) {
} }
void APIENTRY glColor3ub(GLubyte red, GLubyte green, GLubyte blue) { void APIENTRY glColor3ub(GLubyte red, GLubyte green, GLubyte blue) {
ENABLED_VERTEX_ATTRIBUTES_DRAFT |= DIFFUSE_ENABLED_FLAG;
COLOR[0] = red; COLOR[0] = red;
COLOR[1] = green; COLOR[1] = green;
COLOR[2] = blue; COLOR[2] = blue;
@ -143,6 +164,8 @@ void APIENTRY glColor3ub(GLubyte red, GLubyte green, GLubyte blue) {
} }
void APIENTRY glColor3ubv(const GLubyte *v) { void APIENTRY glColor3ubv(const GLubyte *v) {
ENABLED_VERTEX_ATTRIBUTES_DRAFT |= DIFFUSE_ENABLED_FLAG;
COLOR[0] = v[0]; COLOR[0] = v[0];
COLOR[1] = v[1]; COLOR[1] = v[1];
COLOR[2] = v[2]; COLOR[2] = v[2];
@ -150,6 +173,8 @@ void APIENTRY glColor3ubv(const GLubyte *v) {
} }
void APIENTRY glColor3fv(const GLfloat* v) { void APIENTRY glColor3fv(const GLfloat* v) {
ENABLED_VERTEX_ATTRIBUTES_DRAFT |= DIFFUSE_ENABLED_FLAG;
COLOR[0] = (GLubyte)(v[0] * 255); COLOR[0] = (GLubyte)(v[0] * 255);
COLOR[1] = (GLubyte)(v[1] * 255); COLOR[1] = (GLubyte)(v[1] * 255);
COLOR[2] = (GLubyte)(v[2] * 255); COLOR[2] = (GLubyte)(v[2] * 255);
@ -157,24 +182,36 @@ void APIENTRY glColor3fv(const GLfloat* v) {
} }
void APIENTRY glVertex3f(GLfloat x, GLfloat y, GLfloat z) { void APIENTRY glVertex3f(GLfloat x, GLfloat y, GLfloat z) {
ENABLED_VERTEX_ATTRIBUTES = ENABLED_VERTEX_ATTRIBUTES_DRAFT;
GLVertexKOS* vert = aligned_vector_extend(&VERTICES, 1); GLVertexKOS* vert = aligned_vector_extend(&VERTICES, 1);
GLfloat* st = aligned_vector_extend(&ST_COORDS, 2);
GLuint* n = aligned_vector_extend(&NORMALS, 1);
vert->x = x; vert->x = x;
vert->y = y; vert->y = y;
vert->z = z; vert->z = z;
vert->u = UV_COORD[0];
vert->v = UV_COORD[1];
vert->bgra[R8IDX] = COLOR[0]; if(ENABLED_VERTEX_ATTRIBUTES & UV_ENABLED_FLAG) {
vert->bgra[G8IDX] = COLOR[1]; vert->u = UV_COORD[0];
vert->bgra[B8IDX] = COLOR[2]; vert->v = UV_COORD[1];
vert->bgra[A8IDX] = COLOR[3]; }
*n = NORMAL; if(ENABLED_VERTEX_ATTRIBUTES & DIFFUSE_ENABLED_FLAG) {
st[0] = ST_COORD[0]; vert->bgra[R8IDX] = COLOR[0];
st[1] = ST_COORD[1]; vert->bgra[G8IDX] = COLOR[1];
vert->bgra[B8IDX] = COLOR[2];
vert->bgra[A8IDX] = COLOR[3];
}
if(ENABLED_VERTEX_ATTRIBUTES & NORMAL_ENABLED_FLAG) {
GLuint* n = aligned_vector_extend(&NORMALS, 1);
*n = NORMAL;
}
if(ENABLED_VERTEX_ATTRIBUTES & ST_ENABLED_FLAG) {
GLfloat* st = aligned_vector_extend(&ST_COORDS, 2);
st[0] = ST_COORD[0];
st[1] = ST_COORD[1];
}
} }
void APIENTRY glVertex3fv(const GLfloat* v) { void APIENTRY glVertex3fv(const GLfloat* v) {
@ -200,9 +237,11 @@ void APIENTRY glVertex4fv(const GLfloat* v) {
void APIENTRY glMultiTexCoord2fARB(GLenum target, GLfloat s, GLfloat t) { void APIENTRY glMultiTexCoord2fARB(GLenum target, GLfloat s, GLfloat t) {
if(target == GL_TEXTURE0) { if(target == GL_TEXTURE0) {
ENABLED_VERTEX_ATTRIBUTES_DRAFT |= UV_ENABLED_FLAG;
UV_COORD[0] = s; UV_COORD[0] = s;
UV_COORD[1] = t; UV_COORD[1] = t;
} else if(target == GL_TEXTURE1) { } else if(target == GL_TEXTURE1) {
ENABLED_VERTEX_ATTRIBUTES_DRAFT |= ST_ENABLED_FLAG;
ST_COORD[0] = s; ST_COORD[0] = s;
ST_COORD[1] = t; ST_COORD[1] = t;
} else { } else {
@ -213,6 +252,7 @@ void APIENTRY glMultiTexCoord2fARB(GLenum target, GLfloat s, GLfloat t) {
} }
void APIENTRY glTexCoord2f(GLfloat u, GLfloat v) { void APIENTRY glTexCoord2f(GLfloat u, GLfloat v) {
ENABLED_VERTEX_ATTRIBUTES_DRAFT |= UV_ENABLED_FLAG;
UV_COORD[0] = u; UV_COORD[0] = u;
UV_COORD[1] = v; UV_COORD[1] = v;
} }
@ -222,10 +262,12 @@ void APIENTRY glTexCoord2fv(const GLfloat* v) {
} }
void APIENTRY glNormal3f(GLfloat x, GLfloat y, GLfloat z) { void APIENTRY glNormal3f(GLfloat x, GLfloat y, GLfloat z) {
ENABLED_VERTEX_ATTRIBUTES_DRAFT |= NORMAL_ENABLED_FLAG;
NORMAL = pack_vertex_attribute_vec3_1i(x, y, z); NORMAL = pack_vertex_attribute_vec3_1i(x, y, z);
} }
void APIENTRY glNormal3fv(const GLfloat* v) { void APIENTRY glNormal3fv(const GLfloat* v) {
ENABLED_VERTEX_ATTRIBUTES_DRAFT |= NORMAL_ENABLED_FLAG;
glNormal3f(v[0], v[1], v[2]); glNormal3f(v[0], v[1], v[2]);
} }
@ -266,7 +308,7 @@ void APIENTRY glEnd() {
*uattr = UV_ATTRIB; *uattr = UV_ATTRIB;
*sattr = ST_ATTRIB; *sattr = ST_ATTRIB;
*attrs = ~0; // Enable everything *attrs = ENABLED_VERTEX_ATTRIBUTES;
#ifndef NDEBUG #ifndef NDEBUG
_glRecalcFastPath(); _glRecalcFastPath();