+ qglDepthFunc(gl_state.depthfunc);CHECKGLERROR
+ break;
+ case RENDERPATH_D3D9:
+#ifdef SUPPORTD3D
+ IDirect3DDevice9_SetRenderState(vid_d3d9dev, D3DRS_ZFUNC, d3dcmpforglfunc(gl_state.depthfunc));
+#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_DepthFunc(gl_state.depthfunc);
+ break;
+ }
+ }
+}
+
+void GL_DepthRange(float nearfrac, float farfrac)
+{
+ if (gl_state.depthrange[0] != nearfrac || gl_state.depthrange[1] != farfrac)
+ {
+ gl_state.depthrange[0] = nearfrac;
+ gl_state.depthrange[1] = farfrac;
+ switch(vid.renderpath)
+ {
+ case RENDERPATH_GL11:
+ case RENDERPATH_GL13:
+ case RENDERPATH_GL20:
+ case RENDERPATH_GLES1:
+ case RENDERPATH_GLES2:
+#ifdef USE_GLES2
+ qglDepthRangef(gl_state.depthrange[0], gl_state.depthrange[1]);
+#else
+ qglDepthRange(gl_state.depthrange[0], gl_state.depthrange[1]);
+#endif
+ break;
+ case RENDERPATH_D3D9:
+#ifdef SUPPORTD3D
+ {
+ D3DVIEWPORT9 d3dviewport;
+ d3dviewport.X = gl_viewport.x;
+ d3dviewport.Y = gl_viewport.y;
+ d3dviewport.Width = gl_viewport.width;
+ d3dviewport.Height = gl_viewport.height;
+ d3dviewport.MinZ = gl_state.depthrange[0];
+ d3dviewport.MaxZ = gl_state.depthrange[1];
+ IDirect3DDevice9_SetViewport(vid_d3d9dev, &d3dviewport);
+ }
+#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_DepthRange(gl_state.depthrange[0], gl_state.depthrange[1]);
+ break;
+ }
+ }
+}
+
+void R_SetStencilSeparate(qboolean enable, int writemask, int frontfail, int frontzfail, int frontzpass, int backfail, int backzfail, int backzpass, int frontcompare, int backcompare, int comparereference, int comparemask)
+{
+ switch (vid.renderpath)
+ {
+ case RENDERPATH_GL11:
+ case RENDERPATH_GL13:
+ case RENDERPATH_GL20:
+ case RENDERPATH_GLES1:
+ case RENDERPATH_GLES2:
+ CHECKGLERROR
+ if (enable)
+ {
+ qglEnable(GL_STENCIL_TEST);CHECKGLERROR
+ }
+ else
+ {
+ qglDisable(GL_STENCIL_TEST);CHECKGLERROR
+ }
+ if (vid.support.ati_separate_stencil)
+ {
+ qglStencilMask(writemask);CHECKGLERROR
+ qglStencilOpSeparate(GL_FRONT, frontfail, frontzfail, frontzpass);CHECKGLERROR
+ qglStencilOpSeparate(GL_BACK, backfail, backzfail, backzpass);CHECKGLERROR
+ qglStencilFuncSeparate(GL_FRONT, frontcompare, comparereference, comparereference);CHECKGLERROR
+ qglStencilFuncSeparate(GL_BACK, backcompare, comparereference, comparereference);CHECKGLERROR
+ }
+ else if (vid.support.ext_stencil_two_side)
+ {
+#if defined(GL_STENCIL_TEST_TWO_SIDE_EXT) && !defined(USE_GLES2)
+ qglEnable(GL_STENCIL_TEST_TWO_SIDE_EXT);CHECKGLERROR
+ qglActiveStencilFaceEXT(GL_FRONT);CHECKGLERROR
+ qglStencilMask(writemask);CHECKGLERROR
+ qglStencilOp(frontfail, frontzfail, frontzpass);CHECKGLERROR
+ qglStencilFunc(frontcompare, comparereference, comparemask);CHECKGLERROR
+ qglActiveStencilFaceEXT(GL_BACK);CHECKGLERROR
+ qglStencilMask(writemask);CHECKGLERROR
+ qglStencilOp(backfail, backzfail, backzpass);CHECKGLERROR
+ qglStencilFunc(backcompare, comparereference, comparemask);CHECKGLERROR
+#endif
+ }
+ break;
+ case RENDERPATH_D3D9:
+#ifdef SUPPORTD3D
+ IDirect3DDevice9_SetRenderState(vid_d3d9dev, D3DRS_TWOSIDEDSTENCILMODE, true);
+ IDirect3DDevice9_SetRenderState(vid_d3d9dev, D3DRS_STENCILENABLE, enable);
+ IDirect3DDevice9_SetRenderState(vid_d3d9dev, D3DRS_STENCILWRITEMASK, writemask);
+ IDirect3DDevice9_SetRenderState(vid_d3d9dev, D3DRS_STENCILFAIL, d3dstencilopforglfunc(frontfail));
+ IDirect3DDevice9_SetRenderState(vid_d3d9dev, D3DRS_STENCILZFAIL, d3dstencilopforglfunc(frontzfail));
+ IDirect3DDevice9_SetRenderState(vid_d3d9dev, D3DRS_STENCILPASS, d3dstencilopforglfunc(frontzpass));
+ IDirect3DDevice9_SetRenderState(vid_d3d9dev, D3DRS_STENCILFUNC, d3dcmpforglfunc(frontcompare));
+ IDirect3DDevice9_SetRenderState(vid_d3d9dev, D3DRS_CCW_STENCILFAIL, d3dstencilopforglfunc(backfail));
+ IDirect3DDevice9_SetRenderState(vid_d3d9dev, D3DRS_CCW_STENCILZFAIL, d3dstencilopforglfunc(backzfail));
+ IDirect3DDevice9_SetRenderState(vid_d3d9dev, D3DRS_CCW_STENCILPASS, d3dstencilopforglfunc(backzpass));
+ IDirect3DDevice9_SetRenderState(vid_d3d9dev, D3DRS_CCW_STENCILFUNC, d3dcmpforglfunc(backcompare));
+ IDirect3DDevice9_SetRenderState(vid_d3d9dev, D3DRS_STENCILREF, comparereference);
+ IDirect3DDevice9_SetRenderState(vid_d3d9dev, D3DRS_STENCILMASK, comparemask);
+#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:
+ //Con_DPrintf("FIXME SOFT %s:%i %s\n", __FILE__, __LINE__, __FUNCTION__);
+ break;
+ }
+}
+
+void R_SetStencil(qboolean enable, int writemask, int fail, int zfail, int zpass, int compare, int comparereference, int comparemask)
+{
+ switch (vid.renderpath)
+ {
+ case RENDERPATH_GL11:
+ case RENDERPATH_GL13:
+ case RENDERPATH_GL20:
+ case RENDERPATH_GLES1:
+ case RENDERPATH_GLES2:
+ CHECKGLERROR
+ if (enable)
+ {
+ qglEnable(GL_STENCIL_TEST);CHECKGLERROR
+ }
+ else
+ {
+ qglDisable(GL_STENCIL_TEST);CHECKGLERROR
+ }
+ if (vid.support.ext_stencil_two_side)
+ {
+#ifdef GL_STENCIL_TEST_TWO_SIDE_EXT
+ qglDisable(GL_STENCIL_TEST_TWO_SIDE_EXT);CHECKGLERROR
+#endif
+ }
+ qglStencilMask(writemask);CHECKGLERROR
+ qglStencilOp(fail, zfail, zpass);CHECKGLERROR
+ qglStencilFunc(compare, comparereference, comparemask);CHECKGLERROR
+ CHECKGLERROR
+ break;
+ case RENDERPATH_D3D9:
+#ifdef SUPPORTD3D
+ if (vid.support.ati_separate_stencil)
+ IDirect3DDevice9_SetRenderState(vid_d3d9dev, D3DRS_TWOSIDEDSTENCILMODE, true);
+ IDirect3DDevice9_SetRenderState(vid_d3d9dev, D3DRS_STENCILENABLE, enable);
+ IDirect3DDevice9_SetRenderState(vid_d3d9dev, D3DRS_STENCILWRITEMASK, writemask);
+ IDirect3DDevice9_SetRenderState(vid_d3d9dev, D3DRS_STENCILFAIL, d3dstencilopforglfunc(fail));
+ IDirect3DDevice9_SetRenderState(vid_d3d9dev, D3DRS_STENCILZFAIL, d3dstencilopforglfunc(zfail));
+ IDirect3DDevice9_SetRenderState(vid_d3d9dev, D3DRS_STENCILPASS, d3dstencilopforglfunc(zpass));
+ IDirect3DDevice9_SetRenderState(vid_d3d9dev, D3DRS_STENCILFUNC, d3dcmpforglfunc(compare));
+ IDirect3DDevice9_SetRenderState(vid_d3d9dev, D3DRS_STENCILREF, comparereference);
+ IDirect3DDevice9_SetRenderState(vid_d3d9dev, D3DRS_STENCILMASK, comparemask);
+#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:
+ //Con_DPrintf("FIXME SOFT %s:%i %s\n", __FILE__, __LINE__, __FUNCTION__);
+ break;
+ }
+}
+
+void GL_PolygonOffset(float planeoffset, float depthoffset)
+{
+ if (gl_state.polygonoffset[0] != planeoffset || gl_state.polygonoffset[1] != depthoffset)
+ {
+ gl_state.polygonoffset[0] = planeoffset;
+ gl_state.polygonoffset[1] = depthoffset;
+ switch(vid.renderpath)
+ {
+ case RENDERPATH_GL11:
+ case RENDERPATH_GL13:
+ case RENDERPATH_GL20:
+ case RENDERPATH_GLES1:
+ case RENDERPATH_GLES2:
+ qglPolygonOffset(gl_state.polygonoffset[0], gl_state.polygonoffset[1]);
+ break;
+ case RENDERPATH_D3D9:
+#ifdef SUPPORTD3D
+ IDirect3DDevice9_SetRenderState(vid_d3d9dev, D3DRS_SLOPESCALEDEPTHBIAS, gl_state.polygonoffset[0]);
+ IDirect3DDevice9_SetRenderState(vid_d3d9dev, D3DRS_DEPTHBIAS, gl_state.polygonoffset[1] * (1.0f / 16777216.0f));
+#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_PolygonOffset(gl_state.polygonoffset[0], gl_state.polygonoffset[1]);
+ break;
+ }
+ }
+}
+
+void GL_SetMirrorState(qboolean state)
+{
+ if (v_flipped_state != state)
+ {
+ v_flipped_state = state;
+ if (gl_state.cullface == GL_BACK)
+ gl_state.cullface = GL_FRONT;
+ else if (gl_state.cullface == GL_FRONT)
+ gl_state.cullface = GL_BACK;
+ else
+ return;
+ switch(vid.renderpath)
+ {
+ case RENDERPATH_GL11:
+ case RENDERPATH_GL13:
+ case RENDERPATH_GL20:
+ case RENDERPATH_GLES1:
+ case RENDERPATH_GLES2:
+ qglCullFace(gl_state.cullface);CHECKGLERROR
+ break;
+ case RENDERPATH_D3D9:
+#ifdef SUPPORTD3D
+ IDirect3DDevice9_SetRenderState(vid_d3d9dev, D3DRS_CULLMODE, gl_state.cullface == GL_FRONT ? D3DCULL_CCW : D3DCULL_CW);
+#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_CullFace(gl_state.cullface);
+ break;
+ }
+ }
+}
+
+void GL_CullFace(int state)
+{
+ if(v_flipped_state)
+ {
+ if(state == GL_FRONT)
+ state = GL_BACK;
+ else if(state == GL_BACK)
+ state = GL_FRONT;
+ }
+
+ switch(vid.renderpath)
+ {
+ case RENDERPATH_GL11:
+ case RENDERPATH_GL13:
+ case RENDERPATH_GL20:
+ case RENDERPATH_GLES1:
+ case RENDERPATH_GLES2:
+ CHECKGLERROR
+
+ if (state != GL_NONE)
+ {
+ if (!gl_state.cullfaceenable)
+ {
+ gl_state.cullfaceenable = true;
+ qglEnable(GL_CULL_FACE);CHECKGLERROR
+ }
+ if (gl_state.cullface != state)
+ {
+ gl_state.cullface = state;
+ qglCullFace(gl_state.cullface);CHECKGLERROR
+ }
+ }
+ else
+ {
+ if (gl_state.cullfaceenable)
+ {
+ gl_state.cullfaceenable = false;
+ qglDisable(GL_CULL_FACE);CHECKGLERROR
+ }
+ }
+ break;
+ case RENDERPATH_D3D9:
+#ifdef SUPPORTD3D
+ if (gl_state.cullface != state)
+ {
+ gl_state.cullface = state;
+ switch(gl_state.cullface)
+ {
+ case GL_NONE:
+ gl_state.cullfaceenable = false;
+ IDirect3DDevice9_SetRenderState(vid_d3d9dev, D3DRS_CULLMODE, D3DCULL_NONE);
+ break;
+ case GL_FRONT:
+ gl_state.cullfaceenable = true;
+ IDirect3DDevice9_SetRenderState(vid_d3d9dev, D3DRS_CULLMODE, D3DCULL_CCW);
+ break;
+ case GL_BACK:
+ gl_state.cullfaceenable = true;
+ IDirect3DDevice9_SetRenderState(vid_d3d9dev, D3DRS_CULLMODE, D3DCULL_CW);
+ break;
+ }
+ }
+#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:
+ if (gl_state.cullface != state)
+ {
+ gl_state.cullface = state;
+ gl_state.cullfaceenable = state != GL_NONE ? true : false;
+ DPSOFTRAST_CullFace(gl_state.cullface);
+ }
+ break;
+ }
+}
+
+void GL_AlphaTest(int state)
+{
+ if (gl_state.alphatest != state)
+ {
+ gl_state.alphatest = state;
+ switch(vid.renderpath)
+ {
+ case RENDERPATH_GL11:
+ case RENDERPATH_GL13:
+ case RENDERPATH_GLES1:
+#ifdef GL_ALPHA_TEST
+ // only fixed function uses alpha test, other paths use pixel kill capability in shaders
+ CHECKGLERROR
+ if (gl_state.alphatest)
+ {
+ qglEnable(GL_ALPHA_TEST);CHECKGLERROR
+ }
+ else
+ {
+ qglDisable(GL_ALPHA_TEST);CHECKGLERROR
+ }
+#endif
+ break;
+ case RENDERPATH_D3D9:
+ case RENDERPATH_D3D10:
+ case RENDERPATH_D3D11:
+ case RENDERPATH_SOFT:
+ case RENDERPATH_GL20:
+ case RENDERPATH_GLES2:
+ break;
+ }
+ }
+}
+
+void GL_AlphaToCoverage(qboolean state)
+{
+ if (gl_state.alphatocoverage != state)
+ {
+ gl_state.alphatocoverage = state;
+ switch(vid.renderpath)
+ {
+ case RENDERPATH_GL11:
+ case RENDERPATH_GL13:
+ case RENDERPATH_GLES1:
+ case RENDERPATH_GLES2:
+ case RENDERPATH_D3D9:
+ case RENDERPATH_D3D10:
+ case RENDERPATH_D3D11:
+ case RENDERPATH_SOFT:
+ break;
+ case RENDERPATH_GL20:
+#ifdef GL_SAMPLE_ALPHA_TO_COVERAGE_ARB
+ // alpha to coverage turns the alpha value of the pixel into 0%, 25%, 50%, 75% or 100% by masking the multisample fragments accordingly
+ CHECKGLERROR
+ if (gl_state.alphatocoverage)
+ {
+ qglEnable(GL_SAMPLE_ALPHA_TO_COVERAGE_ARB);CHECKGLERROR
+// qglEnable(GL_MULTISAMPLE_ARB);CHECKGLERROR
+ }
+ else
+ {
+ qglDisable(GL_SAMPLE_ALPHA_TO_COVERAGE_ARB);CHECKGLERROR
+// qglDisable(GL_MULTISAMPLE_ARB);CHECKGLERROR
+ }
+#endif
+ break;
+ }
+ }
+}
+
+void GL_ColorMask(int r, int g, int b, int a)
+{
+ // NOTE: this matches D3DCOLORWRITEENABLE_RED, GREEN, BLUE, ALPHA
+ int state = (r ? 1 : 0) | (g ? 2 : 0) | (b ? 4 : 0) | (a ? 8 : 0);
+ if (gl_state.colormask != state)
+ {
+ gl_state.colormask = state;
+ switch(vid.renderpath)
+ {
+ case RENDERPATH_GL11:
+ case RENDERPATH_GL13:
+ case RENDERPATH_GL20:
+ case RENDERPATH_GLES1:
+ case RENDERPATH_GLES2:
+ CHECKGLERROR
+ qglColorMask((GLboolean)r, (GLboolean)g, (GLboolean)b, (GLboolean)a);CHECKGLERROR
+ break;
+ case RENDERPATH_D3D9:
+#ifdef SUPPORTD3D
+ IDirect3DDevice9_SetRenderState(vid_d3d9dev, D3DRS_COLORWRITEENABLE, state);
+#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_ColorMask(r, g, b, a);
+ break;
+ }
+ }
+}
+
+void GL_Color(float cr, float cg, float cb, float ca)
+{
+ if (gl_state.pointer_color_enabled || gl_state.color4f[0] != cr || gl_state.color4f[1] != cg || gl_state.color4f[2] != cb || gl_state.color4f[3] != ca)
+ {
+ gl_state.color4f[0] = cr;
+ gl_state.color4f[1] = cg;
+ gl_state.color4f[2] = cb;
+ gl_state.color4f[3] = ca;
+ switch(vid.renderpath)
+ {
+ case RENDERPATH_GL11:
+ case RENDERPATH_GL13:
+ case RENDERPATH_GLES1:
+#ifndef USE_GLES2
+ CHECKGLERROR
+ qglColor4f(gl_state.color4f[0], gl_state.color4f[1], gl_state.color4f[2], gl_state.color4f[3]);
+ CHECKGLERROR
+#endif
+ break;
+ case RENDERPATH_D3D9:
+ case RENDERPATH_D3D10:
+ case RENDERPATH_D3D11:
+ // no equivalent in D3D
+ break;
+ case RENDERPATH_SOFT:
+ DPSOFTRAST_Color4f(cr, cg, cb, ca);
+ break;
+ case RENDERPATH_GL20:
+ case RENDERPATH_GLES2:
+ qglVertexAttrib4f(GLSLATTRIB_COLOR, cr, cg, cb, ca);
+ break;