int gl_maxdrawrangeelementsindices;
#ifdef DEBUGGL
-int errornumber = 0;
+int gl_errornumber = 0;
void GL_PrintError(int errornumber, const char *filename, int linenumber)
{
IDirect3DSurface9 *d3drt_backbuffercolorsurface;
void *d3dvertexbuffer;
void *d3dvertexdata;
- size_t d3dvertexsize;
+ int d3dvertexsize;
#endif
}
gl_state_t;
Con_DPrintf("FIXME D3D11 %s:%i %s\n", __FILE__, __LINE__, __FUNCTION__);
break;
}
- endindex = Mem_ExpandableArray_IndexRange(&gl_state.meshbufferarray);
+ endindex = (int)Mem_ExpandableArray_IndexRange(&gl_state.meshbufferarray);
for (i = 0;i < endindex;i++)
{
buffer = (r_meshbuffer_t *) Mem_ExpandableArray_RecordAtIndex(&gl_state.meshbufferarray, i);
m[14] = -2 * nearclip * farclip / (farclip - nearclip);
Matrix4x4_FromArrayFloatGL(&basematrix, cubeviewmatrix[side]);
- Matrix4x4_Invert_Simple(&tempmatrix, &v->cameramatrix);
+ Matrix4x4_Invert_Full(&tempmatrix, &v->cameramatrix);
Matrix4x4_Concat(&v->viewmatrix, &basematrix, &tempmatrix);
if (nearplane)
Matrix4x4_FromArrayFloatGL(&v->projectmatrix, m);
}
-void R_Viewport_InitRectSideView(r_viewport_t *v, const matrix4x4_t *cameramatrix, int side, int size, int border, float nearclip, float farclip, const float *nearplane)
+void R_Viewport_InitRectSideView(r_viewport_t *v, const matrix4x4_t *cameramatrix, int side, int size, int border, float nearclip, float farclip, const float *nearplane, int offsetx, int offsety)
{
matrix4x4_t tempmatrix, basematrix;
float m[16];
memset(v, 0, sizeof(*v));
v->type = R_VIEWPORTTYPE_PERSPECTIVECUBESIDE;
v->cameramatrix = *cameramatrix;
- v->x = (side & 1) * size;
- v->y = (side >> 1) * size;
+ v->x = offsetx + (side & 1) * size;
+ v->y = offsety + (side >> 1) * size;
v->width = size;
v->height = size;
v->depth = 1;
m[14] = -2 * nearclip * farclip / (farclip - nearclip);
Matrix4x4_FromArrayFloatGL(&basematrix, rectviewmatrix[side]);
- Matrix4x4_Invert_Simple(&tempmatrix, &v->cameramatrix);
+ Matrix4x4_Invert_Full(&tempmatrix, &v->cameramatrix);
Matrix4x4_Concat(&v->viewmatrix, &basematrix, &tempmatrix);
switch(vid.renderpath)
void R_SetViewport(const r_viewport_t *v)
{
- float m[16];
gl_viewport = *v;
// FIXME: v_flipped_state is evil, this probably breaks somewhere
case RENDERPATH_GL13:
case RENDERPATH_GL11:
case RENDERPATH_GLES1:
-#ifdef GL_PROJECTION
- CHECKGLERROR
- qglViewport(v->x, v->y, v->width, v->height);CHECKGLERROR
- // Load the projection matrix into OpenGL
- qglMatrixMode(GL_PROJECTION);CHECKGLERROR
- Matrix4x4_ToArrayFloatGL(&gl_projectionmatrix, m);
- qglLoadMatrixf(m);CHECKGLERROR
- qglMatrixMode(GL_MODELVIEW);CHECKGLERROR
+#ifndef USE_GLES2
+ {
+ float m[16];
+ CHECKGLERROR
+ qglViewport(v->x, v->y, v->width, v->height);CHECKGLERROR
+ // Load the projection matrix into OpenGL
+ qglMatrixMode(GL_PROJECTION);CHECKGLERROR
+ Matrix4x4_ToArrayFloatGL(&gl_projectionmatrix, m);
+ qglLoadMatrixf(m);CHECKGLERROR
+ qglMatrixMode(GL_MODELVIEW);CHECKGLERROR
+ }
#endif
break;
case RENDERPATH_D3D9:
if (gl_state.uniformbufferobject != bufferobject)
{
gl_state.uniformbufferobject = bufferobject;
+#ifdef GL_UNIFORM_BUFFER
CHECKGLERROR
qglBindBufferARB(GL_UNIFORM_BUFFER, bufferobject);CHECKGLERROR
+#endif
}
}
#ifdef USE_GLES2
// FIXME: separate stencil attachment on GLES
if (depthtexture && depthtexture->texnum ) qglFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT , depthtexture->gltexturetypeenum , depthtexture->texnum , 0);CHECKGLERROR
+ if (depthtexture && depthtexture->renderbuffernum ) qglFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT , GL_RENDERBUFFER, depthtexture->renderbuffernum );CHECKGLERROR
#else
- if (depthtexture && depthtexture->texnum ) qglFramebufferTexture2D(GL_FRAMEBUFFER, depthtexture->glisdepthstencil ? GL_DEPTH_STENCIL_ATTACHMENT : GL_DEPTH_ATTACHMENT , depthtexture->gltexturetypeenum , depthtexture->texnum , 0);CHECKGLERROR
+ if (depthtexture && depthtexture->texnum )
+ {
+ qglFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT , depthtexture->gltexturetypeenum , depthtexture->texnum , 0);CHECKGLERROR
+ if (depthtexture->glisdepthstencil) qglFramebufferTexture2D(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT , depthtexture->gltexturetypeenum , depthtexture->texnum , 0);CHECKGLERROR
+ }
+ if (depthtexture && depthtexture->renderbuffernum )
+ {
+ qglFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT , GL_RENDERBUFFER, depthtexture->renderbuffernum );CHECKGLERROR
+ if (depthtexture->glisdepthstencil) qglFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT , GL_RENDERBUFFER, depthtexture->renderbuffernum );CHECKGLERROR
+ }
#endif
- if (depthtexture && depthtexture->renderbuffernum ) qglFramebufferRenderbuffer(GL_FRAMEBUFFER, depthtexture->glisdepthstencil ? GL_DEPTH_STENCIL_ATTACHMENT : GL_DEPTH_ATTACHMENT , GL_RENDERBUFFER, depthtexture->renderbuffernum );CHECKGLERROR
if (colortexture && colortexture->texnum ) qglFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0 , colortexture->gltexturetypeenum , colortexture->texnum , 0);CHECKGLERROR
if (colortexture2 && colortexture2->texnum) qglFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT1 , colortexture2->gltexturetypeenum, colortexture2->texnum, 0);CHECKGLERROR
if (colortexture3 && colortexture3->texnum) qglFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT2 , colortexture3->gltexturetypeenum, colortexture3->texnum, 0);CHECKGLERROR
case RENDERPATH_GL11:
case RENDERPATH_GL13:
case RENDERPATH_GLES1:
-#ifdef GL_ALPHA_TEST
+#ifndef USE_GLES2
CHECKGLERROR
qglColorMask(1, 1, 1, 1);CHECKGLERROR
qglAlphaFunc(gl_state.alphafunc, gl_state.alphafuncvalue);CHECKGLERROR
qglDisable(GL_ALPHA_TEST);CHECKGLERROR
- qglBlendFunc(gl_state.blendfunc1, gl_state.blendfunc2);CHECKGLERROR
+ if (qglBlendFuncSeparate)
+ {
+ qglBlendFuncSeparate(gl_state.blendfunc1, gl_state.blendfunc2, GL_ZERO, GL_ONE);CHECKGLERROR // ELUAN: Adreno 225 (and others) compositing workaround
+ }
+ else
+ {
+ qglBlendFunc(gl_state.blendfunc1, gl_state.blendfunc2);CHECKGLERROR
+ }
qglDisable(GL_BLEND);CHECKGLERROR
qglCullFace(gl_state.cullface);CHECKGLERROR
qglDisable(GL_CULL_FACE);CHECKGLERROR
case RENDERPATH_GL11:
case RENDERPATH_GL13:
case RENDERPATH_GLES1:
+#ifndef USE_GLES2
if (qglActiveTexture)
{
CHECKGLERROR
qglClientActiveTexture(GL_TEXTURE0 + gl_state.clientunit);
CHECKGLERROR
}
+#endif
break;
case RENDERPATH_D3D9:
case RENDERPATH_D3D10:
case RENDERPATH_GLES1:
case RENDERPATH_GLES2:
CHECKGLERROR
- qglBlendFunc(gl_state.blendfunc1, gl_state.blendfunc2);CHECKGLERROR
+ if (qglBlendFuncSeparate)
+ {
+ qglBlendFuncSeparate(gl_state.blendfunc1, gl_state.blendfunc2, GL_ZERO, GL_ONE);CHECKGLERROR // ELUAN: Adreno 225 (and others) compositing workaround
+ }
+ else
+ {
+ qglBlendFunc(gl_state.blendfunc1, gl_state.blendfunc2);CHECKGLERROR
+ }
if (gl_state.blend != blendenable)
{
gl_state.blend = blendenable;
}
else if (vid.support.ext_stencil_two_side)
{
-#ifdef GL_STENCIL_TEST_TWO_SIDE_EXT
+#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
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:
void GL_Clear(int mask, const float *colorvalue, float depthvalue, int stencilvalue)
{
- static const float blackcolor[4] = {0, 0, 0, 0};
+ // opaque black - if you want transparent black, you'll need to pass in a colorvalue
+ static const float blackcolor[4] = {0.0f, 0.0f, 0.0f, 1.0f};
// prevent warnings when trying to clear a buffer that does not exist
if (!colorvalue)
colorvalue = blackcolor;
case RENDERPATH_GLES1:
case RENDERPATH_GLES2:
CHECKGLERROR
+#ifndef GL_BGRA
+ {
+ int i;
+ int r;
+ // int g;
+ int b;
+ // int a;
+ qglReadPixels(x, y, width, height, GL_RGBA, GL_UNSIGNED_BYTE, outpixels);CHECKGLERROR
+ for (i = 0;i < width * height * 4;i += 4)
+ {
+ r = outpixels[i+0];
+ // g = outpixels[i+1];
+ b = outpixels[i+2];
+ // a = outpixels[i+3];
+ outpixels[i+0] = b;
+ // outpixels[i+1] = g;
+ outpixels[i+2] = r;
+ // outpixels[i+3] = a;
+ }
+ }
+#else
qglReadPixels(x, y, width, height, GL_BGRA, GL_UNSIGNED_BYTE, outpixels);CHECKGLERROR
- break;
+#endif
+ break;
case RENDERPATH_D3D9:
#ifdef SUPPORTD3D
{
if (vertexstrings_count && !GL_Backend_CompileShader(programobject, GL_VERTEX_SHADER, "vertex", vertexstrings_count, vertexstrings_list))
goto cleanup;
-#ifdef GL_GEOMETRY_SHADER
+#if defined(GL_GEOMETRY_SHADER) && !defined(USE_GLES2)
if (geometrystrings_count && !GL_Backend_CompileShader(programobject, GL_GEOMETRY_SHADER, "geometry", geometrystrings_count, geometrystrings_list))
goto cleanup;
#endif
qglLinkProgram(programobject);CHECKGLERROR
qglGetProgramiv(programobject, GL_LINK_STATUS, &programlinked);CHECKGLERROR
qglGetProgramInfoLog(programobject, sizeof(linklog), NULL, linklog);CHECKGLERROR
+
if (linklog[0])
{
+
if (strstr(linklog, "error") || strstr(linklog, "ERROR") || strstr(linklog, "Error") || strstr(linklog, "WARNING") || strstr(linklog, "warning") || strstr(linklog, "Warning") || developer_extra.integer)
Con_DPrintf("program link log:\n%s\n", linklog);
+
// software vertex shader is ok but software fragment shader is WAY
// too slow, fail program if so.
// NOTE: this string might be ATI specific, but that's ok because the
if (strstr(linklog, "fragment shader will run in software"))
programlinked = false;
}
+
if (!programlinked)
goto cleanup;
+
return programobject;
cleanup:
qglDeleteProgram(programobject);CHECKGLERROR
if (buffer->isindexbuffer)
{
r_refdef.stats[r_stat_indexbufferuploadcount]++;
- r_refdef.stats[r_stat_indexbufferuploadsize] += size;
+ r_refdef.stats[r_stat_indexbufferuploadsize] += (int)size;
}
else
{
r_refdef.stats[r_stat_vertexbufferuploadcount]++;
- r_refdef.stats[r_stat_vertexbufferuploadsize] += size;
+ r_refdef.stats[r_stat_vertexbufferuploadsize] += (int)size;
}
if (!subdata)
buffer->size = size;
GL_BindEBO(buffer->bufferobject);
else
GL_BindVBO(buffer->bufferobject);
- if (subdata)
- qglBufferSubDataARB(buffer->isuniformbuffer ? GL_UNIFORM_BUFFER : (buffer->isindexbuffer ? GL_ELEMENT_ARRAY_BUFFER : GL_ARRAY_BUFFER), offset, size, data);
- else
- qglBufferDataARB(buffer->isuniformbuffer ? GL_UNIFORM_BUFFER : (buffer->isindexbuffer ? GL_ELEMENT_ARRAY_BUFFER : GL_ARRAY_BUFFER), size, data, buffer->isdynamic ? GL_STREAM_DRAW : GL_STATIC_DRAW);
+
+ {
+ int buffertype;
+ buffertype = buffer->isindexbuffer ? GL_ELEMENT_ARRAY_BUFFER : GL_ARRAY_BUFFER;
+#ifdef GL_UNIFORM_BUFFER
+ if (buffer->isuniformbuffer)
+ buffertype = GL_UNIFORM_BUFFER;
+#endif
+ if (subdata)
+ qglBufferSubDataARB(buffertype, offset, size, data);
+ else
+ qglBufferDataARB(buffertype, size, data, buffer->isdynamic ? GL_STREAM_DRAW : GL_STATIC_DRAW);
+ }
if (buffer->isuniformbuffer)
GL_BindUBO(0);
break;
if (buffer->devicebuffer)
IDirect3DIndexBuffer9_Release((IDirect3DIndexBuffer9*)buffer->devicebuffer);
buffer->devicebuffer = NULL;
- if (FAILED(result = IDirect3DDevice9_CreateIndexBuffer(vid_d3d9dev, offset+size, buffer->isdynamic ? D3DUSAGE_WRITEONLY | D3DUSAGE_DYNAMIC : 0, buffer->isindex16 ? D3DFMT_INDEX16 : D3DFMT_INDEX32, buffer->isdynamic ? D3DPOOL_DEFAULT : D3DPOOL_MANAGED, &d3d9indexbuffer, NULL)))
+ if (FAILED(result = IDirect3DDevice9_CreateIndexBuffer(vid_d3d9dev, (unsigned int)(offset+size), buffer->isdynamic ? D3DUSAGE_WRITEONLY | D3DUSAGE_DYNAMIC : 0, buffer->isindex16 ? D3DFMT_INDEX16 : D3DFMT_INDEX32, buffer->isdynamic ? D3DPOOL_DEFAULT : D3DPOOL_MANAGED, &d3d9indexbuffer, NULL)))
Sys_Error("IDirect3DDevice9_CreateIndexBuffer(%p, %d, %x, %x, %x, %p, NULL) returned %x\n", vid_d3d9dev, (int)size, buffer->isdynamic ? (int)D3DUSAGE_DYNAMIC : 0, buffer->isindex16 ? (int)D3DFMT_INDEX16 : (int)D3DFMT_INDEX32, buffer->isdynamic ? (int)D3DPOOL_DEFAULT : (int)D3DPOOL_MANAGED, &d3d9indexbuffer, (int)result);
buffer->devicebuffer = (void *)d3d9indexbuffer;
buffer->size = offset+size;
if (buffer->devicebuffer)
IDirect3DVertexBuffer9_Release((IDirect3DVertexBuffer9*)buffer->devicebuffer);
buffer->devicebuffer = NULL;
- if (FAILED(result = IDirect3DDevice9_CreateVertexBuffer(vid_d3d9dev, offset+size, buffer->isdynamic ? D3DUSAGE_WRITEONLY | D3DUSAGE_DYNAMIC : 0, 0, buffer->isdynamic ? D3DPOOL_DEFAULT : D3DPOOL_MANAGED, &d3d9vertexbuffer, NULL)))
+ if (FAILED(result = IDirect3DDevice9_CreateVertexBuffer(vid_d3d9dev, (unsigned int)(offset+size), buffer->isdynamic ? D3DUSAGE_WRITEONLY | D3DUSAGE_DYNAMIC : 0, 0, buffer->isdynamic ? D3DPOOL_DEFAULT : D3DPOOL_MANAGED, &d3d9vertexbuffer, NULL)))
Sys_Error("IDirect3DDevice9_CreateVertexBuffer(%p, %d, %x, %x, %x, %p, NULL) returned %x\n", vid_d3d9dev, (int)size, buffer->isdynamic ? (int)D3DUSAGE_DYNAMIC : 0, 0, buffer->isdynamic ? (int)D3DPOOL_DEFAULT : (int)D3DPOOL_MANAGED, &d3d9vertexbuffer, (int)result);
buffer->devicebuffer = (void *)d3d9vertexbuffer;
buffer->size = offset+size;
size_t bufferstat[R_BUFFERDATA_COUNT][2][2];
r_meshbuffer_t *buffer;
memset(bufferstat, 0, sizeof(bufferstat));
- endindex = Mem_ExpandableArray_IndexRange(&gl_state.meshbufferarray);
+ endindex = (int)Mem_ExpandableArray_IndexRange(&gl_state.meshbufferarray);
for (i = 0;i < endindex;i++)
{
buffer = (r_meshbuffer_t *) Mem_ExpandableArray_RecordAtIndex(&gl_state.meshbufferarray, i);
case RENDERPATH_GL11:
case RENDERPATH_GL13:
case RENDERPATH_GLES1:
+#ifndef USE_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)
{
int bufferobject = vertexbuffer ? vertexbuffer->bufferobject : 0;
gl_state.pointer_vertex_offset = bufferoffset;
CHECKGLERROR
GL_BindVBO(bufferobject);
- qglVertexPointer(components, gltype, stride, bufferobject ? (void *)bufferoffset : pointer);CHECKGLERROR
+ qglVertexPointer(components, gltype, (GLsizei)stride, bufferobject ? (void *)bufferoffset : pointer);CHECKGLERROR
}
+#endif
break;
case RENDERPATH_GL20:
case RENDERPATH_GLES2:
CHECKGLERROR
GL_BindVBO(bufferobject);
// LordHavoc: special flag added to gltype for unnormalized types
- qglVertexAttribPointer(GLSLATTRIB_POSITION, components, gltype & ~0x80000000, (gltype & 0x80000000) == 0, stride, bufferobject ? (void *)bufferoffset : pointer);CHECKGLERROR
+ qglVertexAttribPointer(GLSLATTRIB_POSITION, components, gltype & ~0x80000000, (gltype & 0x80000000) == 0, (GLsizei)stride, bufferobject ? (void *)bufferoffset : pointer);CHECKGLERROR
}
break;
case RENDERPATH_D3D9:
case RENDERPATH_GL11:
case RENDERPATH_GL13:
case RENDERPATH_GLES1:
-#ifdef GL_MODELVIEW
+#ifndef USE_GLES2
CHECKGLERROR
if (pointer)
{
gl_state.pointer_color_offset = bufferoffset;
CHECKGLERROR
GL_BindVBO(bufferobject);
- qglColorPointer(components, gltype, stride, bufferobject ? (void *)bufferoffset : pointer);CHECKGLERROR
+ qglColorPointer(components, gltype, (GLsizei)stride, bufferobject ? (void *)bufferoffset : pointer);CHECKGLERROR
}
}
else
CHECKGLERROR
GL_BindVBO(bufferobject);
// LordHavoc: special flag added to gltype for unnormalized types
- qglVertexAttribPointer(GLSLATTRIB_COLOR, components, gltype & ~0x80000000, (gltype & 0x80000000) == 0, stride, bufferobject ? (void *)bufferoffset : pointer);CHECKGLERROR
+ qglVertexAttribPointer(GLSLATTRIB_COLOR, components, gltype & ~0x80000000, (gltype & 0x80000000) == 0, (GLsizei)stride, bufferobject ? (void *)bufferoffset : pointer);CHECKGLERROR
}
}
else
case RENDERPATH_GL11:
case RENDERPATH_GL13:
case RENDERPATH_GLES1:
-#ifdef GL_MODELVIEW
+#ifndef USE_GLES2
CHECKGLERROR
if (pointer)
{
unit->pointer_texcoord_offset = bufferoffset;
GL_ClientActiveTexture(unitnum);
GL_BindVBO(bufferobject);
- qglTexCoordPointer(components, gltype, stride, bufferobject ? (void *)bufferoffset : pointer);CHECKGLERROR
+ qglTexCoordPointer(components, gltype, (GLsizei)stride, bufferobject ? (void *)bufferoffset : pointer);CHECKGLERROR
}
}
else
unit->pointer_texcoord_offset = bufferoffset;
GL_BindVBO(bufferobject);
// LordHavoc: special flag added to gltype for unnormalized types
- qglVertexAttribPointer(unitnum+GLSLATTRIB_TEXCOORD0, components, gltype & ~0x80000000, (gltype & 0x80000000) == 0, stride, bufferobject ? (void *)bufferoffset : pointer);CHECKGLERROR
+ qglVertexAttribPointer(unitnum+GLSLATTRIB_TEXCOORD0, components, gltype & ~0x80000000, (gltype & 0x80000000) == 0, (GLsizei)stride, bufferobject ? (void *)bufferoffset : pointer);CHECKGLERROR
}
}
else
int tex2d, tex3d, texcubemap, texnum;
if (unitnum >= vid.teximageunits)
return;
-// if (unit->texture == tex)
-// return;
+ if (unit->texture == tex)
+ return;
switch(vid.renderpath)
{
case RENDERPATH_GL20:
void R_Mesh_TexMatrix(unsigned int unitnum, const matrix4x4_t *matrix)
{
- gltextureunit_t *unit = gl_state.units + unitnum;
switch(vid.renderpath)
{
case RENDERPATH_GL11:
#ifdef GL_MODELVIEW
if (matrix && matrix->m[3][3])
{
+ gltextureunit_t *unit = gl_state.units + unitnum;
// texmatrix specified, check if it is different
if (!unit->texmatrixenabled || memcmp(&unit->matrix, matrix, sizeof(matrix4x4_t)))
{
else
{
// no texmatrix specified, revert to identity
+ gltextureunit_t *unit = gl_state.units + unitnum;
if (unit->texmatrixenabled)
{
unit->texmatrixenabled = false;
void R_Mesh_TexCombine(unsigned int unitnum, int combinergb, int combinealpha, int rgbscale, int alphascale)
{
+#if defined(GL_TEXTURE_ENV) && !defined(USE_GLES2)
gltextureunit_t *unit = gl_state.units + unitnum;
CHECKGLERROR
switch(vid.renderpath)
break;
case RENDERPATH_GL13:
case RENDERPATH_GLES1:
-#ifdef GL_TEXTURE_ENV
// GL_ARB_texture_env_combine
if (!combinergb)
combinergb = GL_MODULATE;
qglTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, unit->combine);CHECKGLERROR
}
}
-#endif
break;
case RENDERPATH_GL11:
// normal GL texenv
-#ifdef GL_TEXTURE_ENV
if (!combinergb)
combinergb = GL_MODULATE;
if (unit->combine != combinergb)
GL_ActiveTexture(unitnum);
qglTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, unit->combine);CHECKGLERROR
}
-#endif
break;
case RENDERPATH_D3D9:
case RENDERPATH_D3D10:
case RENDERPATH_SOFT:
break;
}
+#endif
}
void R_Mesh_ResetTextureState(void)