int vertexbufferobject;
int elementbufferobject;
int framebufferobject;
- int defaultframebufferobject; // RENDERPATH_GLES2 has a non-zero fbo provided by the OS
+ int defaultframebufferobject; // deal with platforms that use a non-zero default fbo
qboolean pointer_color_enabled;
int pointer_vertex_components;
switch(vid.renderpath)
{
- case RENDERPATH_GL20:
case RENDERPATH_CGGL:
-// CHECKGLERROR
-// qglViewport(v->x, v->y, v->width, v->height);CHECKGLERROR
-// break;
case RENDERPATH_GL13:
case RENDERPATH_GL11:
CHECKGLERROR
case RENDERPATH_SOFT:
DPSOFTRAST_Viewport(v->x, v->y, v->width, v->height);
break;
+ case RENDERPATH_GL20:
case RENDERPATH_GLES2:
CHECKGLERROR
qglViewport(v->x, v->y, v->width, v->height);CHECKGLERROR
case RENDERPATH_D3D11:
Con_DPrintf("FIXME D3D11 %s:%i %s\n", __FILE__, __LINE__, __FUNCTION__);
break;
- case RENDERPATH_GL20:
case RENDERPATH_CGGL:
CHECKGLERROR
qglColorMask(1, 1, 1, 1);CHECKGLERROR
- qglAlphaFunc(gl_state.alphafunc, gl_state.alphafuncvalue);CHECKGLERROR
- qglDisable(GL_ALPHA_TEST);CHECKGLERROR
+ // qglAlphaFunc(gl_state.alphafunc, gl_state.alphafuncvalue);CHECKGLERROR
+ // qglDisable(GL_ALPHA_TEST);CHECKGLERROR
qglBlendFunc(gl_state.blendfunc1, gl_state.blendfunc2);CHECKGLERROR
qglDisable(GL_BLEND);CHECKGLERROR
qglCullFace(gl_state.cullface);CHECKGLERROR
DPSOFTRAST_SetRenderTargets(vid.width, vid.height, vid.softdepthpixels, vid.softpixels, NULL, NULL, NULL);
DPSOFTRAST_Viewport(0, 0, vid.width, vid.height);
break;
+ case RENDERPATH_GL20:
case RENDERPATH_GLES2:
CHECKGLERROR
qglColorMask(1, 1, 1, 1);CHECKGLERROR
qglEnable(GL_DEPTH_TEST);CHECKGLERROR
qglDepthMask(gl_state.depthmask);CHECKGLERROR
qglPolygonOffset(gl_state.polygonoffset[0], gl_state.polygonoffset[1]);
- qglBindBufferARB(GL_ARRAY_BUFFER_ARB, 0);
- qglBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, 0);
- qglBindRenderbufferEXT(GL_RENDERBUFFER_EXT, 0);
+ // if (vid.renderpath == RENDERPATH_GL20)
+ // {
+ // qglAlphaFunc(gl_state.alphafunc, gl_state.alphafuncvalue);CHECKGLERROR
+ // qglDisable(GL_ALPHA_TEST);CHECKGLERROR
+ // }
+ if (vid.support.arb_vertex_buffer_object)
+ {
+ qglBindBufferARB(GL_ARRAY_BUFFER_ARB, 0);
+ qglBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, 0);
+ }
if (vid.support.ext_framebuffer_object)
qglBindFramebufferEXT(GL_FRAMEBUFFER_EXT, gl_state.defaultframebufferobject);
- qglEnableVertexAttribArray(GLES2ATTRIB_POSITION);
- qglVertexAttribPointer(GLES2ATTRIB_POSITION, 3, GL_FLOAT, false, sizeof(float[3]), NULL);CHECKGLERROR
- qglDisableVertexAttribArray(GLES2ATTRIB_COLOR);
- qglVertexAttribPointer(GLES2ATTRIB_COLOR, 4, GL_FLOAT, false, sizeof(float[4]), NULL);CHECKGLERROR
- qglVertexAttrib4f(GLES2ATTRIB_COLOR, 1, 1, 1, 1);
+ qglEnableVertexAttribArray(GLSLATTRIB_POSITION);
+ qglVertexAttribPointer(GLSLATTRIB_POSITION, 3, GL_FLOAT, false, sizeof(float[3]), NULL);CHECKGLERROR
+ qglDisableVertexAttribArray(GLSLATTRIB_COLOR);
+ qglVertexAttribPointer(GLSLATTRIB_COLOR, 4, GL_FLOAT, false, sizeof(float[4]), NULL);CHECKGLERROR
+ qglVertexAttrib4f(GLSLATTRIB_COLOR, 1, 1, 1, 1);
gl_state.unit = MAX_TEXTUREUNITS;
gl_state.clientunit = MAX_TEXTUREUNITS;
for (i = 0;i < vid.teximageunits;i++)
for (i = 0;i < vid.texarrayunits;i++)
{
GL_BindVBO(0);
- qglVertexAttribPointer(i+GLES2ATTRIB_TEXCOORD0, 2, GL_FLOAT, false, sizeof(float[2]), NULL);CHECKGLERROR
- qglDisableVertexAttribArray(i+GLES2ATTRIB_TEXCOORD0);CHECKGLERROR
+ qglVertexAttribPointer(i+GLSLATTRIB_TEXCOORD0, 2, GL_FLOAT, false, sizeof(float[2]), NULL);CHECKGLERROR
+ qglDisableVertexAttribArray(i+GLSLATTRIB_TEXCOORD0);CHECKGLERROR
}
CHECKGLERROR
break;
{
case RENDERPATH_GL11:
case RENDERPATH_GL13:
- case RENDERPATH_GL20:
case RENDERPATH_CGGL:
if (qglActiveTexture)
{
break;
case RENDERPATH_SOFT:
break;
+ case RENDERPATH_GL20:
case RENDERPATH_GLES2:
break;
}
case RENDERPATH_GL13:
case RENDERPATH_GL20:
case RENDERPATH_CGGL:
+ case RENDERPATH_GLES2:
qglDepthRange(gl_state.depthrange[0], gl_state.depthrange[1]);
break;
case RENDERPATH_D3D9:
case RENDERPATH_SOFT:
DPSOFTRAST_DepthRange(gl_state.depthrange[0], gl_state.depthrange[1]);
break;
- case RENDERPATH_GLES2:
- //Con_DPrintf("FIXME GLES2 %s:%i %s\n", __FILE__, __LINE__, __FUNCTION__);
- // FIXME: qglDepthRangef instead... faster...
- qglDepthRange(gl_state.depthrange[0], gl_state.depthrange[1]);
- break;
}
}
}
case RENDERPATH_GL13:
case RENDERPATH_GL20:
case RENDERPATH_CGGL:
+ case RENDERPATH_GLES2:
CHECKGLERROR
if (enable)
{
case RENDERPATH_SOFT:
//Con_DPrintf("FIXME SOFT %s:%i %s\n", __FILE__, __LINE__, __FUNCTION__);
break;
- case RENDERPATH_GLES2:
- //Con_DPrintf("FIXME GLES2 %s:%i %s\n", __FILE__, __LINE__, __FUNCTION__);
- break;
}
}
{
case RENDERPATH_GL11:
case RENDERPATH_GL13:
- case RENDERPATH_GL20:
- case RENDERPATH_CGGL:
+ // only fixed function uses alpha test, other paths use pixel kill capability in shaders
CHECKGLERROR
if (gl_state.alphatest)
{
break;
case RENDERPATH_D3D9:
#ifdef SUPPORTD3D
- IDirect3DDevice9_SetRenderState(vid_d3d9dev, D3DRS_ALPHATESTENABLE, gl_state.alphatest);
+// IDirect3DDevice9_SetRenderState(vid_d3d9dev, D3DRS_ALPHATESTENABLE, gl_state.alphatest);
#endif
break;
case RENDERPATH_D3D10:
- Con_DPrintf("FIXME D3D10 %s:%i %s\n", __FILE__, __LINE__, __FUNCTION__);
break;
case RENDERPATH_D3D11:
- Con_DPrintf("FIXME D3D11 %s:%i %s\n", __FILE__, __LINE__, __FUNCTION__);
break;
case RENDERPATH_SOFT:
- DPSOFTRAST_AlphaTest(gl_state.alphatest);
- break;
- case RENDERPATH_GLES2:
+// DPSOFTRAST_AlphaTest(gl_state.alphatest);
break;
- }
- }
-}
-
-void GL_AlphaFunc(int state, float value)
-{
- if (gl_state.alphafunc != state || gl_state.alphafuncvalue != value)
- {
- gl_state.alphafunc = state;
- gl_state.alphafuncvalue = value;
- switch(vid.renderpath)
- {
- case RENDERPATH_GL11:
- case RENDERPATH_GL13:
- case RENDERPATH_GL20:
case RENDERPATH_CGGL:
- CHECKGLERROR
- qglAlphaFunc(gl_state.alphafunc, gl_state.alphafuncvalue);CHECKGLERROR
- break;
- case RENDERPATH_D3D9:
-#ifdef SUPPORTD3D
- IDirect3DDevice9_SetRenderState(vid_d3d9dev, D3DRS_ALPHAFUNC, d3dcmpforglfunc(gl_state.alphafunc));
- IDirect3DDevice9_SetRenderState(vid_d3d9dev, D3DRS_ALPHAREF, (int)bound(0, value * 256.0f, 255));
-#endif
- break;
- case RENDERPATH_D3D10:
- Con_DPrintf("FIXME D3D10 %s:%i %s\n", __FILE__, __LINE__, __FUNCTION__);
- break;
- case RENDERPATH_D3D11:
- Con_DPrintf("FIXME D3D11 %s:%i %s\n", __FILE__, __LINE__, __FUNCTION__);
- break;
- case RENDERPATH_SOFT:
- DPSOFTRAST_AlphaFunc(gl_state.alphafunc, gl_state.alphafuncvalue);
- break;
+ case RENDERPATH_GL20:
case RENDERPATH_GLES2:
break;
}
{
case RENDERPATH_GL11:
case RENDERPATH_GL13:
- case RENDERPATH_GL20:
case RENDERPATH_CGGL:
CHECKGLERROR
qglColor4f(gl_state.color4f[0], gl_state.color4f[1], gl_state.color4f[2], gl_state.color4f[3]);
case RENDERPATH_SOFT:
DPSOFTRAST_Color4f(cr, cg, cb, ca);
break;
+ case RENDERPATH_GL20:
case RENDERPATH_GLES2:
- qglVertexAttrib4f(GLES2ATTRIB_COLOR, cr, cg, cb, ca);
+ qglVertexAttrib4f(GLSLATTRIB_COLOR, cr, cg, cb, ca);
break;
}
}
if (!programobject)
return 0;
- if (vid.renderpath == RENDERPATH_GLES2)
- {
- qglBindAttribLocation(programobject, GLES2ATTRIB_POSITION , "Attrib_Position" );
- qglBindAttribLocation(programobject, GLES2ATTRIB_COLOR , "Attrib_Color" );
- qglBindAttribLocation(programobject, GLES2ATTRIB_TEXCOORD0, "Attrib_TexCoord0");
- qglBindAttribLocation(programobject, GLES2ATTRIB_TEXCOORD1, "Attrib_TexCoord1");
- qglBindAttribLocation(programobject, GLES2ATTRIB_TEXCOORD2, "Attrib_TexCoord2");
- qglBindAttribLocation(programobject, GLES2ATTRIB_TEXCOORD3, "Attrib_TexCoord3");
- qglBindAttribLocation(programobject, GLES2ATTRIB_TEXCOORD4, "Attrib_TexCoord4");
- qglBindAttribLocation(programobject, GLES2ATTRIB_TEXCOORD5, "Attrib_TexCoord5");
- qglBindAttribLocation(programobject, GLES2ATTRIB_TEXCOORD6, "Attrib_TexCoord6");
- qglBindAttribLocation(programobject, GLES2ATTRIB_TEXCOORD7, "Attrib_TexCoord7");
- }
+ qglBindAttribLocation(programobject, GLSLATTRIB_POSITION , "Attrib_Position" );
+ qglBindAttribLocation(programobject, GLSLATTRIB_COLOR , "Attrib_Color" );
+ qglBindAttribLocation(programobject, GLSLATTRIB_TEXCOORD0, "Attrib_TexCoord0");
+ qglBindAttribLocation(programobject, GLSLATTRIB_TEXCOORD1, "Attrib_TexCoord1");
+ qglBindAttribLocation(programobject, GLSLATTRIB_TEXCOORD2, "Attrib_TexCoord2");
+ qglBindAttribLocation(programobject, GLSLATTRIB_TEXCOORD3, "Attrib_TexCoord3");
+ qglBindAttribLocation(programobject, GLSLATTRIB_TEXCOORD4, "Attrib_TexCoord4");
+ qglBindAttribLocation(programobject, GLSLATTRIB_TEXCOORD5, "Attrib_TexCoord5");
+ qglBindAttribLocation(programobject, GLSLATTRIB_TEXCOORD6, "Attrib_TexCoord6");
+ qglBindAttribLocation(programobject, GLSLATTRIB_TEXCOORD7, "Attrib_TexCoord7");
if (vertexstrings_count && !GL_Backend_CompileShader(programobject, GL_VERTEX_SHADER, "vertex", vertexstrings_count, vertexstrings_list))
goto cleanup;
{
case RENDERPATH_GL11:
case RENDERPATH_GL13:
- case RENDERPATH_GL20:
case RENDERPATH_CGGL:
if (gl_state.pointer_vertex_components != components || gl_state.pointer_vertex_gltype != gltype || gl_state.pointer_vertex_stride != stride || gl_state.pointer_vertex_pointer != pointer || gl_state.pointer_vertex_vertexbuffer != vertexbuffer || gl_state.pointer_vertex_offset != bufferoffset)
{
qglVertexPointer(components, gltype, stride, bufferobject ? (void *)bufferoffset : pointer);CHECKGLERROR
}
break;
+ case RENDERPATH_GL20:
case RENDERPATH_GLES2:
if (gl_state.pointer_vertex_components != components || gl_state.pointer_vertex_gltype != gltype || gl_state.pointer_vertex_stride != stride || gl_state.pointer_vertex_pointer != pointer || gl_state.pointer_vertex_vertexbuffer != vertexbuffer || gl_state.pointer_vertex_offset != bufferoffset)
{
gl_state.pointer_vertex_offset = bufferoffset;
CHECKGLERROR
GL_BindVBO(bufferobject);
- qglVertexAttribPointer(GLES2ATTRIB_POSITION, components, gltype, false, stride, bufferobject ? (void *)bufferoffset : pointer);CHECKGLERROR
+ qglVertexAttribPointer(GLSLATTRIB_POSITION, components, gltype, false, stride, bufferobject ? (void *)bufferoffset : pointer);CHECKGLERROR
}
break;
case RENDERPATH_D3D9:
{
case RENDERPATH_GL11:
case RENDERPATH_GL13:
- case RENDERPATH_GL20:
case RENDERPATH_CGGL:
CHECKGLERROR
if (pointer)
}
}
break;
+ case RENDERPATH_GL20:
case RENDERPATH_GLES2:
CHECKGLERROR
if (pointer)
{
gl_state.pointer_color_enabled = true;
CHECKGLERROR
- qglEnableVertexAttribArray(GLES2ATTRIB_COLOR);CHECKGLERROR
+ qglEnableVertexAttribArray(GLSLATTRIB_COLOR);CHECKGLERROR
}
if (gl_state.pointer_color_components != components || gl_state.pointer_color_gltype != gltype || gl_state.pointer_color_stride != stride || gl_state.pointer_color_pointer != pointer || gl_state.pointer_color_vertexbuffer != vertexbuffer || gl_state.pointer_color_offset != bufferoffset)
{
gl_state.pointer_color_offset = bufferoffset;
CHECKGLERROR
GL_BindVBO(bufferobject);
- qglVertexAttribPointer(GLES2ATTRIB_COLOR, components, gltype, false, stride, bufferobject ? (void *)bufferoffset : pointer);CHECKGLERROR
+ qglVertexAttribPointer(GLSLATTRIB_COLOR, components, gltype, false, stride, bufferobject ? (void *)bufferoffset : pointer);CHECKGLERROR
}
}
else
{
gl_state.pointer_color_enabled = false;
CHECKGLERROR
- qglDisableVertexAttribArray(GLES2ATTRIB_COLOR);CHECKGLERROR
+ qglDisableVertexAttribArray(GLSLATTRIB_COLOR);CHECKGLERROR
// when color array is on the glColor gets trashed, set it again
- qglVertexAttrib4f(GLES2ATTRIB_COLOR, gl_state.color4f[0], gl_state.color4f[1], gl_state.color4f[2], gl_state.color4f[3]);CHECKGLERROR
+ qglVertexAttrib4f(GLSLATTRIB_COLOR, gl_state.color4f[0], gl_state.color4f[1], gl_state.color4f[2], gl_state.color4f[3]);CHECKGLERROR
}
}
break;
{
case RENDERPATH_GL11:
case RENDERPATH_GL13:
- case RENDERPATH_GL20:
case RENDERPATH_CGGL:
CHECKGLERROR
if (pointer)
}
}
break;
+ case RENDERPATH_GL20:
case RENDERPATH_GLES2:
CHECKGLERROR
if (pointer)
if (!unit->arrayenabled)
{
unit->arrayenabled = true;
- qglEnableVertexAttribArray(unitnum+GLES2ATTRIB_TEXCOORD0);CHECKGLERROR
+ qglEnableVertexAttribArray(unitnum+GLSLATTRIB_TEXCOORD0);CHECKGLERROR
}
// texcoord array
if (unit->pointer_texcoord_components != components || unit->pointer_texcoord_gltype != gltype || unit->pointer_texcoord_stride != stride || unit->pointer_texcoord_pointer != pointer || unit->pointer_texcoord_vertexbuffer != vertexbuffer || unit->pointer_texcoord_offset != bufferoffset)
unit->pointer_texcoord_vertexbuffer = vertexbuffer;
unit->pointer_texcoord_offset = bufferoffset;
GL_BindVBO(bufferobject);
- qglVertexAttribPointer(unitnum+GLES2ATTRIB_TEXCOORD0, components, gltype, false, stride, bufferobject ? (void *)bufferoffset : pointer);CHECKGLERROR
+ qglVertexAttribPointer(unitnum+GLSLATTRIB_TEXCOORD0, components, gltype, false, stride, bufferobject ? (void *)bufferoffset : pointer);CHECKGLERROR
}
}
else
if (unit->arrayenabled)
{
unit->arrayenabled = false;
- qglDisableVertexAttribArray(unitnum+GLES2ATTRIB_TEXCOORD0);CHECKGLERROR
+ qglDisableVertexAttribArray(unitnum+GLSLATTRIB_TEXCOORD0);CHECKGLERROR
}
}
break;
case RENDERPATH_GL13:
case RENDERPATH_GL20:
case RENDERPATH_CGGL:
+ case RENDERPATH_GLES2:
if (matrix && matrix->m[3][3])
{
// texmatrix specified, check if it is different
break;
case RENDERPATH_SOFT:
break;
- case RENDERPATH_GLES2:
- break;
}
}
BACKENDACTIVECHECK
- CHECKGLERROR
+ for (unitnum = 0;unitnum < vid.teximageunits;unitnum++)
+ R_Mesh_TexBind(unitnum, NULL);
+ for (unitnum = 0;unitnum < vid.texarrayunits;unitnum++)
+ R_Mesh_TexCoordPointer(unitnum, 2, GL_FLOAT, sizeof(float[2]), NULL, NULL, 0);
switch(vid.renderpath)
{
case RENDERPATH_GL20:
case RENDERPATH_CGGL:
- for (unitnum = 0;unitnum < vid.teximageunits;unitnum++)
- {
- gltextureunit_t *unit = gl_state.units + unitnum;
- if (unit->t2d)
- {
- unit->t2d = 0;
- GL_ActiveTexture(unitnum);
- qglBindTexture(GL_TEXTURE_2D, unit->t2d);CHECKGLERROR
- }
- if (unit->t3d)
- {
- unit->t3d = 0;
- GL_ActiveTexture(unitnum);
- qglBindTexture(GL_TEXTURE_3D, unit->t3d);CHECKGLERROR
- }
- if (unit->tcubemap)
- {
- unit->tcubemap = 0;
- GL_ActiveTexture(unitnum);
- qglBindTexture(GL_TEXTURE_CUBE_MAP_ARB, unit->tcubemap);CHECKGLERROR
- }
- }
- for (unitnum = 0;unitnum < vid.texarrayunits;unitnum++)
- {
- gltextureunit_t *unit = gl_state.units + unitnum;
- if (unit->arrayenabled)
- {
- unit->arrayenabled = false;
- GL_ClientActiveTexture(unitnum);
- qglDisableClientState(GL_TEXTURE_COORD_ARRAY);CHECKGLERROR
- }
- }
- for (unitnum = 0;unitnum < vid.texunits;unitnum++)
- {
- gltextureunit_t *unit = gl_state.units + unitnum;
- if (unit->texmatrixenabled)
- {
- unit->texmatrixenabled = false;
- unit->matrix = identitymatrix;
- CHECKGLERROR
- GL_ActiveTexture(unitnum);
- qglMatrixMode(GL_TEXTURE);CHECKGLERROR
- qglLoadIdentity();CHECKGLERROR
- qglMatrixMode(GL_MODELVIEW);CHECKGLERROR
- }
- }
+ case RENDERPATH_GLES2:
+ case RENDERPATH_D3D9:
+ case RENDERPATH_D3D10:
+ case RENDERPATH_D3D11:
+ case RENDERPATH_SOFT:
break;
case RENDERPATH_GL13:
case RENDERPATH_GL11:
for (unitnum = 0;unitnum < vid.texunits;unitnum++)
{
- gltextureunit_t *unit = gl_state.units + unitnum;
- if (unit->t2d)
- {
- unit->t2d = 0;
- GL_ActiveTexture(unitnum);
- qglDisable(GL_TEXTURE_2D);CHECKGLERROR
- qglBindTexture(GL_TEXTURE_2D, unit->t2d);CHECKGLERROR
- }
- if (unit->t3d)
- {
- unit->t3d = 0;
- GL_ActiveTexture(unitnum);
- qglDisable(GL_TEXTURE_3D);CHECKGLERROR
- qglBindTexture(GL_TEXTURE_3D, unit->t3d);CHECKGLERROR
- }
- if (unit->tcubemap)
- {
- unit->tcubemap = 0;
- GL_ActiveTexture(unitnum);
- qglDisable(GL_TEXTURE_CUBE_MAP_ARB);CHECKGLERROR
- qglBindTexture(GL_TEXTURE_CUBE_MAP_ARB, unit->tcubemap);CHECKGLERROR
- }
- if (unit->arrayenabled)
- {
- unit->arrayenabled = false;
- GL_ClientActiveTexture(unitnum);
- qglDisableClientState(GL_TEXTURE_COORD_ARRAY);CHECKGLERROR
- }
- if (unit->texmatrixenabled)
- {
- unit->texmatrixenabled = false;
- unit->matrix = identitymatrix;
- CHECKGLERROR
- GL_ActiveTexture(unitnum);
- qglMatrixMode(GL_TEXTURE);CHECKGLERROR
- qglLoadIdentity();CHECKGLERROR
- qglMatrixMode(GL_MODELVIEW);CHECKGLERROR
- }
- if (unit->combine != GL_MODULATE)
- {
- unit->combine = GL_MODULATE;
- GL_ActiveTexture(unitnum);
- qglTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, unit->combine);CHECKGLERROR
- }
+ R_Mesh_TexCombine(unitnum, GL_MODULATE, GL_MODULATE, 1, 1);
+ R_Mesh_TexMatrix(unitnum, NULL);
}
break;
- case RENDERPATH_D3D9:
- case RENDERPATH_D3D10:
- case RENDERPATH_D3D11:
- break;
- case RENDERPATH_SOFT:
- break;
- case RENDERPATH_GLES2:
- break;
}
}