Skip to content
Snippets Groups Projects
Commit fe7d19cc authored by Eidolon's avatar Eidolon
Browse files

Use vertex arrays to draw in DrawPolygon for OpenGL.

This should introduce a minor performance boost for slow CPUs in
OpenGL mode. If it doesn't, it shouldn't be any slower. It also puts
us a little closer to supporting GLES as well.

This introduces several new pgl function pointers that are from
GL 1.1. I do not check for their existence because no driver out in
the wild in active use doesn't support 1.1.
parent 80bde9e0
Branches
No related tags found
No related merge requests found
...@@ -185,7 +185,9 @@ FUNCPRINTF void DBG_Printf(const char *lpFmt, ...) ...@@ -185,7 +185,9 @@ FUNCPRINTF void DBG_Printf(const char *lpFmt, ...)
#define pglPolygonOffset glPolygonOffset #define pglPolygonOffset glPolygonOffset
#define pglScissor glScissor #define pglScissor glScissor
#define pglEnable glEnable #define pglEnable glEnable
#define pglEnableClientState glEnableClientState
#define pglDisable glDisable #define pglDisable glDisable
#define pglDisableClientState glDisableClientState
#define pglGetDoublev glGetDoublev #define pglGetDoublev glGetDoublev
//glGetIntegerv //glGetIntegerv
//glGetString //glGetString
...@@ -218,6 +220,16 @@ FUNCPRINTF void DBG_Printf(const char *lpFmt, ...) ...@@ -218,6 +220,16 @@ FUNCPRINTF void DBG_Printf(const char *lpFmt, ...)
#define pglColor4fv glColor4fv #define pglColor4fv glColor4fv
#define pglTexCoord2f glTexCoord2f #define pglTexCoord2f glTexCoord2f
/* Drawing Functions (arrays) */
#define pglVertexPointer glVertexPointer
#define pglNormalPointer glNormalPointer
#define pglColorPointer glColorPointer
#define pglIndexPointer glIndexPointer
#define pglTexCoordPointer glTexCoordPointer
#define pglEdgeFlagPointer glEdgeFlagPointer
#define pglDrawArrays glDrawArrays
#define pglDrawElements glDrawElements
/* Lighting */ /* Lighting */
#define pglShadeModel glShadeModel #define pglShadeModel glShadeModel
#define pglLightfv glLightfv #define pglLightfv glLightfv
...@@ -271,8 +283,12 @@ typedef void (APIENTRY * PFNglScissor) (GLint x, GLint y, GLsizei width, GLsizei ...@@ -271,8 +283,12 @@ typedef void (APIENTRY * PFNglScissor) (GLint x, GLint y, GLsizei width, GLsizei
static PFNglScissor pglScissor; static PFNglScissor pglScissor;
typedef void (APIENTRY * PFNglEnable) (GLenum cap); typedef void (APIENTRY * PFNglEnable) (GLenum cap);
static PFNglEnable pglEnable; static PFNglEnable pglEnable;
typedef void (APIENTRY * PFNglEnableClientState) (GLenum cap);
static PFNglEnableClientState pglEnableClientState;
typedef void (APIENTRY * PFNglDisable) (GLenum cap); typedef void (APIENTRY * PFNglDisable) (GLenum cap);
static PFNglDisable pglDisable; static PFNglDisable pglDisable;
typedef void (APIENTRY * PFNglDisableClientState) (GLenum cap);
static PFNglDisableClientState pglDisableClientState;
typedef void (APIENTRY * PFNglGetDoublev) (GLenum pname, GLdouble *params); typedef void (APIENTRY * PFNglGetDoublev) (GLenum pname, GLdouble *params);
static PFNglGetDoublev pglGetDoublev; static PFNglGetDoublev pglGetDoublev;
//glGetIntegerv //glGetIntegerv
...@@ -326,6 +342,24 @@ static PFNglColor4fv pglColor4fv; ...@@ -326,6 +342,24 @@ static PFNglColor4fv pglColor4fv;
typedef void (APIENTRY * PFNglTexCoord2f) (GLfloat s, GLfloat t); typedef void (APIENTRY * PFNglTexCoord2f) (GLfloat s, GLfloat t);
static PFNglTexCoord2f pglTexCoord2f; static PFNglTexCoord2f pglTexCoord2f;
/* Drawing Functions (arrays) */
typedef void (APIENTRY * PFNglVertexPointer) (GLint size, GLenum type, GLsizei stride, const GLvoid * pointer);
static PFNglVertexPointer pglVertexPointer;
typedef void (APIENTRY * PFNglNormalPointer) (GLenum type, GLsizei stride, const GLvoid * pointer);
static PFNglNormalPointer pglNormalPointer;
typedef void (APIENTRY * PFNglColorPointer) (GLint size, GLenum type, GLsizei stride, const GLvoid * pointer);
static PFNglColorPointer pglColorPointer;
typedef void (APIENTRY * PFNglIndexPointer) (GLenum type, GLsizei stride, const GLvoid * pointer);
static PFNglIndexPointer pglIndexPointer;
typedef void (APIENTRY * PFNglTexCoordPointer) (GLint size, GLenum type, GLsizei stride, const GLvoid * pointer);
static PFNglTexCoordPointer pglTexCoordPointer;
typedef void (APIENTRY * PFNglEdgeFlagPointer) (GLsizei stride, const GLvoid * pointer);
static PFNglEdgeFlagPointer pglEdgeFlagPointer;
typedef void (APIENTRY * PFNglDrawArrays) (GLenum mode, GLint first, GLsizei count);
static PFNglDrawArrays pglDrawArrays;
typedef void (APIENTRY * PFNglDrawElements) (GLenum mode, GLsizei count, GLenum type, const GLvoid * indices);
static PFNglDrawElements pglDrawElements;
/* Lighting */ /* Lighting */
typedef void (APIENTRY * PFNglShadeModel) (GLenum mode); typedef void (APIENTRY * PFNglShadeModel) (GLenum mode);
static PFNglShadeModel pglShadeModel; static PFNglShadeModel pglShadeModel;
...@@ -416,7 +450,9 @@ boolean SetupGLfunc(void) ...@@ -416,7 +450,9 @@ boolean SetupGLfunc(void)
GETOPENGLFUNC(pglPolygonOffset , glPolygonOffset) GETOPENGLFUNC(pglPolygonOffset , glPolygonOffset)
GETOPENGLFUNC(pglScissor , glScissor) GETOPENGLFUNC(pglScissor , glScissor)
GETOPENGLFUNC(pglEnable , glEnable) GETOPENGLFUNC(pglEnable , glEnable)
GETOPENGLFUNC(pglEnableClientState, glEnableClientState);
GETOPENGLFUNC(pglDisable , glDisable) GETOPENGLFUNC(pglDisable , glDisable)
GETOPENGLFUNC(pglDisableClientState, glDisableClientState);
GETOPENGLFUNC(pglGetDoublev , glGetDoublev) GETOPENGLFUNC(pglGetDoublev , glGetDoublev)
GETOPENGLFUNC(pglGetIntegerv , glGetIntegerv) GETOPENGLFUNC(pglGetIntegerv , glGetIntegerv)
GETOPENGLFUNC(pglGetString , glGetString) GETOPENGLFUNC(pglGetString , glGetString)
...@@ -444,6 +480,14 @@ boolean SetupGLfunc(void) ...@@ -444,6 +480,14 @@ boolean SetupGLfunc(void)
GETOPENGLFUNC(pglColor4f , glColor4f) GETOPENGLFUNC(pglColor4f , glColor4f)
GETOPENGLFUNC(pglColor4fv , glColor4fv) GETOPENGLFUNC(pglColor4fv , glColor4fv)
GETOPENGLFUNC(pglTexCoord2f , glTexCoord2f) GETOPENGLFUNC(pglTexCoord2f , glTexCoord2f)
GETOPENGLFUNC(pglVertexPointer, glVertexPointer)
GETOPENGLFUNC(pglNormalPointer, glNormalPointer)
GETOPENGLFUNC(pglColorPointer, glColorPointer)
GETOPENGLFUNC(pglTexCoordPointer, glTexCoordPointer)
GETOPENGLFUNC(pglEdgeFlagPointer, glEdgeFlagPointer)
GETOPENGLFUNC(pglDrawArrays, glDrawArrays)
GETOPENGLFUNC(pglDrawElements, glDrawElements)
GETOPENGLFUNC(pglShadeModel , glShadeModel) GETOPENGLFUNC(pglShadeModel , glShadeModel)
GETOPENGLFUNC(pglLightfv, glLightfv) GETOPENGLFUNC(pglLightfv, glLightfv)
...@@ -1296,6 +1340,7 @@ EXPORT void HWRAPI(DrawPolygon) (FSurfaceInfo *pSurf, ...@@ -1296,6 +1340,7 @@ EXPORT void HWRAPI(DrawPolygon) (FSurfaceInfo *pSurf,
FUINT i; FUINT i;
FUINT j; FUINT j;
GLRGBAFloat c = {0,0,0,0}; GLRGBAFloat c = {0,0,0,0};
FUINT stride;
if ((PolyFlags & PF_Corona) && (oglflags & GLF_NOZBUFREAD)) if ((PolyFlags & PF_Corona) && (oglflags & GLF_NOZBUFREAD))
PolyFlags &= ~(PF_NoDepthTest|PF_Corona); PolyFlags &= ~(PF_NoDepthTest|PF_Corona);
...@@ -1375,15 +1420,15 @@ EXPORT void HWRAPI(DrawPolygon) (FSurfaceInfo *pSurf, ...@@ -1375,15 +1420,15 @@ EXPORT void HWRAPI(DrawPolygon) (FSurfaceInfo *pSurf,
if (PolyFlags & PF_MD2) if (PolyFlags & PF_MD2)
return; return;
pglBegin(GL_TRIANGLE_FAN); stride = sizeof(FUINT) + sizeof(FLOAT) + sizeof(FLOAT);
for (i = 0; i < iNumPts; i++)
{ pglEnableClientState(GL_VERTEX_ARRAY);
pglTexCoord2f(pOutVerts[i].sow, pOutVerts[i].tow); pglEnableClientState(GL_TEXTURE_COORD_ARRAY);
//Hurdler: test code: -pOutVerts[i].z => pOutVerts[i].z pglVertexPointer(3, GL_FLOAT, sizeof(FOutVector), &pOutVerts[0].x);
pglVertex3f(pOutVerts[i].x, pOutVerts[i].y, pOutVerts[i].z); pglTexCoordPointer(2, GL_FLOAT, sizeof(FOutVector), &pOutVerts[0].sow);
//pglVertex3f(pOutVerts[i].x, pOutVerts[i].y, -pOutVerts[i].z); pglDrawArrays(GL_TRIANGLE_FAN, 0, iNumPts);
} pglDisableClientState(GL_TEXTURE_COORD_ARRAY);
pglEnd(); pglDisableClientState(GL_VERTEX_ARRAY);
if (PolyFlags & PF_RemoveYWrap) if (PolyFlags & PF_RemoveYWrap)
pglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); pglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment