Polymost: Clean up and rearrange some texcache code. No functional changes.

git-svn-id: https://svn.eduke32.com/eduke32@5710 1a8010ca-5511-0410-912e-c29ae57300e0
This commit is contained in:
hendricks266 2016-05-04 00:25:06 +00:00
parent d1266434f1
commit 84a2695cdc
6 changed files with 111 additions and 113 deletions

View file

@ -1,2 +1,11 @@
#ifndef DXTFILTER_H_
#define DXTFILTER_H_
void dxt_handle_io(int32_t fil, int32_t len, void *midbuf, char *packbuf);
int32_t dedxt_handle_io(int32_t fil, int32_t, void *midbuf, int32_t mbufsiz, char *packbuf, int32_t ispacked);
int32_t dxtfilter(int32_t fil, const texcachepicture *pict, const char *pic, void *midbuf, char *packbuf, uint32_t miplen); int32_t dxtfilter(int32_t fil, const texcachepicture *pict, const char *pic, void *midbuf, char *packbuf, uint32_t miplen);
int32_t dedxtfilter(int32_t fil, const texcachepicture *pict, char *pic, void *midbuf, char *packbuf, int32_t ispacked); int32_t dedxtfilter(int32_t fil, const texcachepicture *pict, char *pic, void *midbuf, char *packbuf, int32_t ispacked);
#endif

View file

@ -52,6 +52,7 @@ extern globaltexcache texcache;
extern char TEXCACHEFILE[BMAX_PATH]; extern char TEXCACHEFILE[BMAX_PATH];
extern int32_t texcache_enabled(void);
extern void texcache_freeptrs(void); extern void texcache_freeptrs(void);
extern void texcache_syncmemcache(void); extern void texcache_syncmemcache(void);
extern void texcache_init(void); extern void texcache_init(void);
@ -61,7 +62,9 @@ extern pthtyp *texcache_fetch(int32_t dapicnum, int32_t dapalnum, int32_t dashad
extern int32_t texcache_loadskin(const texcacheheader *head, int32_t *doalloc, GLuint *glpic, vec2_t *siz); extern int32_t texcache_loadskin(const texcacheheader *head, int32_t *doalloc, GLuint *glpic, vec2_t *siz);
extern int32_t texcache_loadtile(const texcacheheader *head, int32_t *doalloc, pthtyp *pth); extern int32_t texcache_loadtile(const texcacheheader *head, int32_t *doalloc, pthtyp *pth);
extern char const * texcache_calcid(char *cachefn, const char *fn, const int32_t len, const int32_t dameth, const char effect); extern char const * texcache_calcid(char *cachefn, const char *fn, const int32_t len, const int32_t dameth, const char effect);
extern void texcache_writetex(char const * cachefn, texcacheheader *head); extern void texcache_prewritetex(texcacheheader *head);
extern void texcache_postwritetex(char const * const cachefn, int32_t const offset);
extern void texcache_writetex_fromdriver(char const * cachefn, texcacheheader *head);
extern int32_t texcache_readtexheader(char const * cachefn, texcacheheader *head, int32_t modelp); extern int32_t texcache_readtexheader(char const * cachefn, texcacheheader *head, int32_t modelp);
extern void texcache_openfiles(void); extern void texcache_openfiles(void);
extern void texcache_setupmemcache(void); extern void texcache_setupmemcache(void);

View file

@ -43,6 +43,7 @@ Description of Ken's filter to improve LZW compression of DXT1 format by ~15%: (
#include "texcache.h" #include "texcache.h"
#include "lz4.h" #include "lz4.h"
#ifndef EDUKE32_GLES
static uint16_t dxt_hicosub(uint16_t c) static uint16_t dxt_hicosub(uint16_t c)
{ {
int32_t r, g, b; int32_t r, g, b;
@ -60,8 +61,9 @@ static uint16_t dedxt_hicoadd(uint16_t c)
b = ((c>> 0)+(g>>1))&31; b = ((c>> 0)+(g>>1))&31;
return((r<<11)+(g<<5)+b); return((r<<11)+(g<<5)+b);
} }
#endif
static void dxt_handle_io(int32_t fil, int32_t len, void *midbuf, char *packbuf) void dxt_handle_io(int32_t fil, int32_t len, void *midbuf, char *packbuf)
{ {
void *writebuf; void *writebuf;
int32_t j, cleng; int32_t j, cleng;
@ -89,7 +91,7 @@ static void dxt_handle_io(int32_t fil, int32_t len, void *midbuf, char *packbuf)
Bwrite(fil, writebuf, cleng); Bwrite(fil, writebuf, cleng);
} }
static int32_t dedxt_handle_io(int32_t fil, int32_t j /* TODO: better name */, int32_t dedxt_handle_io(int32_t fil, int32_t j /* TODO: better name */,
void *midbuf, int32_t mbufsiz, char *packbuf, int32_t ispacked) void *midbuf, int32_t mbufsiz, char *packbuf, int32_t ispacked)
{ {
void *inbuf; void *inbuf;
@ -133,19 +135,18 @@ static int32_t dedxt_handle_io(int32_t fil, int32_t j /* TODO: better name */,
return 0; return 0;
} }
#ifndef EDUKE32_GLES
// NOTE: <pict> members are in external (little) endianness. // NOTE: <pict> members are in external (little) endianness.
int32_t dxtfilter(int32_t fil, const texcachepicture *pict, const char *pic, void *midbuf, char *packbuf, uint32_t miplen) int32_t dxtfilter(int32_t fil, const texcachepicture *pict, const char *pic, void *midbuf, char *packbuf, uint32_t miplen)
{ {
uint32_t j, k, offs, stride; uint32_t j, k, offs, stride;
char *cptr; char *cptr;
#if !defined EDUKE32_GLES
if ((pict->format == (signed) B_LITTLE32(GL_COMPRESSED_RGB_S3TC_DXT1_EXT)) || if ((pict->format == (signed) B_LITTLE32(GL_COMPRESSED_RGB_S3TC_DXT1_EXT)) ||
(pict->format == (signed) B_LITTLE32(GL_COMPRESSED_RGBA_S3TC_DXT1_EXT))) { offs = 0; stride = 8; } (pict->format == (signed) B_LITTLE32(GL_COMPRESSED_RGBA_S3TC_DXT1_EXT))) { offs = 0; stride = 8; }
else if ((pict->format == (signed) B_LITTLE32(GL_COMPRESSED_RGBA_S3TC_DXT3_EXT)) || else if ((pict->format == (signed) B_LITTLE32(GL_COMPRESSED_RGBA_S3TC_DXT3_EXT)) ||
(pict->format == (signed) B_LITTLE32(GL_COMPRESSED_RGBA_S3TC_DXT5_EXT))) { offs = 8; stride = 16; } (pict->format == (signed) B_LITTLE32(GL_COMPRESSED_RGBA_S3TC_DXT5_EXT))) { offs = 8; stride = 16; }
else else
#endif
{ offs = 0; stride = 8; } { offs = 0; stride = 8; }
if (stride == 16) //If DXT3... if (stride == 16) //If DXT3...
@ -181,10 +182,6 @@ int32_t dxtfilter(int32_t fil, const texcachepicture *pict, const char *pic, voi
dxt_handle_io(fil, tabledivide32(miplen, stride)<<2, midbuf, packbuf); dxt_handle_io(fil, tabledivide32(miplen, stride)<<2, midbuf, packbuf);
#if defined EDUKE32_GLES
UNREFERENCED_PARAMETER(pict);
#endif
return 0; return 0;
} }
@ -194,13 +191,11 @@ int32_t dedxtfilter(int32_t fil, const texcachepicture *pict, char *pic, void *m
int32_t j, k, offs, stride; int32_t j, k, offs, stride;
char *cptr; char *cptr;
#if !defined EDUKE32_GLES
if ((pict->format == GL_COMPRESSED_RGB_S3TC_DXT1_EXT) || if ((pict->format == GL_COMPRESSED_RGB_S3TC_DXT1_EXT) ||
(pict->format == GL_COMPRESSED_RGBA_S3TC_DXT1_EXT)) { offs = 0; stride = 8; } (pict->format == GL_COMPRESSED_RGBA_S3TC_DXT1_EXT)) { offs = 0; stride = 8; }
else if ((pict->format == GL_COMPRESSED_RGBA_S3TC_DXT3_EXT) || else if ((pict->format == GL_COMPRESSED_RGBA_S3TC_DXT3_EXT) ||
(pict->format == GL_COMPRESSED_RGBA_S3TC_DXT5_EXT)) { offs = 8; stride = 16; } (pict->format == GL_COMPRESSED_RGBA_S3TC_DXT5_EXT)) { offs = 8; stride = 16; }
else else
#endif
{ offs = 0; stride = 8; } { offs = 0; stride = 8; }
if (stride == 16) //If DXT3... if (stride == 16) //If DXT3...
@ -246,3 +241,5 @@ int32_t dedxtfilter(int32_t fil, const texcachepicture *pict, char *pic, void *m
return 0; return 0;
} }
#endif #endif
#endif

View file

@ -963,6 +963,7 @@ int32_t mdloadskin(md2model_t *m, int32_t number, int32_t pal, int32_t surf)
bglTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_REPEAT); bglTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_REPEAT);
bglTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_REPEAT); bglTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_REPEAT);
#if defined USE_GLEXT && !defined EDUKE32_GLES
if (!gotcache && glinfo.texcompr && glusetexcache && !(sk->flags & HICR_NOTEXCOMPRESS) && if (!gotcache && glinfo.texcompr && glusetexcache && !(sk->flags & HICR_NOTEXCOMPRESS) &&
(glusetexcompr == 2 || (glusetexcompr && !(sk->flags & HICR_ARTIMMUNITY)))) (glusetexcompr == 2 || (glusetexcompr && !(sk->flags & HICR_ARTIMMUNITY))))
{ {
@ -977,7 +978,7 @@ int32_t mdloadskin(md2model_t *m, int32_t number, int32_t pal, int32_t surf)
(sk->flags & (HICR_NODOWNSIZE|HICR_ARTIMMUNITY) ? CACHEAD_NODOWNSIZE : 0); (sk->flags & (HICR_NODOWNSIZE|HICR_ARTIMMUNITY) ? CACHEAD_NODOWNSIZE : 0);
/// OSD_Printf("Caching \"%s\"\n",fn); /// OSD_Printf("Caching \"%s\"\n",fn);
texcache_writetex(texcacheid, &cachead); texcache_writetex_fromdriver(texcacheid, &cachead);
if (willprint) if (willprint)
{ {
@ -989,6 +990,7 @@ int32_t mdloadskin(md2model_t *m, int32_t number, int32_t pal, int32_t surf)
else else
OSD_Printf("Cached skin \"%s\"\n", fn); OSD_Printf("Cached skin \"%s\"\n", fn);
} }
#endif
if (willprint) if (willprint)
{ {

View file

@ -1518,6 +1518,7 @@ int32_t gloadtile_hi(int32_t dapic,int32_t dapalnum, int32_t facen, hicreplctyp
pth->skyface = facen; pth->skyface = facen;
pth->hicr = hicr; pth->hicr = hicr;
#if defined USE_GLEXT && !defined EDUKE32_GLES
if (!gotcache && glinfo.texcompr && glusetexcache && !(hicr->flags & HICR_NOTEXCOMPRESS) && if (!gotcache && glinfo.texcompr && glusetexcache && !(hicr->flags & HICR_NOTEXCOMPRESS) &&
(glusetexcompr == 2 || (glusetexcompr && !(hicr->flags & HICR_ARTIMMUNITY)))) (glusetexcompr == 2 || (glusetexcompr && !(hicr->flags & HICR_ARTIMMUNITY))))
{ {
@ -1533,7 +1534,7 @@ int32_t gloadtile_hi(int32_t dapic,int32_t dapalnum, int32_t facen, hicreplctyp
(hicr->flags & (HICR_NODOWNSIZE|HICR_ARTIMMUNITY) ? CACHEAD_NODOWNSIZE : 0); (hicr->flags & (HICR_NODOWNSIZE|HICR_ARTIMMUNITY) ? CACHEAD_NODOWNSIZE : 0);
/// OSD_Printf("Caching \"%s\"\n", fn); /// OSD_Printf("Caching \"%s\"\n", fn);
texcache_writetex(texcacheid, &cachead); texcache_writetex_fromdriver(texcacheid, &cachead);
if (willprint) if (willprint)
{ {
@ -1546,6 +1547,7 @@ int32_t gloadtile_hi(int32_t dapic,int32_t dapalnum, int32_t facen, hicreplctyp
else else
OSD_Printf("Cached \"%s\"\n", fn); OSD_Printf("Cached \"%s\"\n", fn);
} }
#endif
if (willprint) if (willprint)
{ {

View file

@ -282,7 +282,7 @@ static void texcache_deletefiles(void)
unlink(ptempbuf); unlink(ptempbuf);
} }
static int32_t texcache_enabled(void) int32_t texcache_enabled(void)
{ {
#if defined EDUKE32_GLES || !defined USE_GLEXT #if defined EDUKE32_GLES || !defined USE_GLEXT
return 0; return 0;
@ -525,42 +525,11 @@ failure:
} }
#undef READTEXHEADER_FAILURE #undef READTEXHEADER_FAILURE
#define WRITEX_FAIL_ON_ERROR() if (bglGetError() != GL_NO_ERROR) goto failure
void texcache_writetex(char const * const cachefn, texcacheheader *head) #if defined USE_GLEXT && !defined EDUKE32_GLES
void texcache_prewritetex(texcacheheader *head)
{ {
char *pic = NULL, *packbuf = NULL;
void *midbuf = NULL;
uint32_t alloclen=0;
#ifndef EDUKE32_GLES
static GLint glGetTexLevelParameterivOK = GL_TRUE;
uint32_t level=0;
uint32_t padx=0, pady=0;
GLint gi;
#endif
int32_t offset = 0;
if (!texcache_enabled()) return;
#ifndef EDUKE32_GLES
gi = GL_FALSE;
bglGetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_TEXTURE_COMPRESSED_ARB, &gi);
if (gi != GL_TRUE)
{
if (glGetTexLevelParameterivOK == GL_TRUE)
{
OSD_Printf("Error: glGetTexLevelParameteriv returned GL_FALSE!\n");
glGetTexLevelParameterivOK = GL_FALSE;
}
return;
}
#endif
Blseek(texcache.filehandle, 0, BSEEK_END);
offset = Blseek(texcache.filehandle, 0, BSEEK_CUR);
// OSD_Printf("Caching %s, offset 0x%x\n", cachefn, offset);
Bmemcpy(head->magic, TEXCACHEMAGIC, 4); // sizes are set by caller Bmemcpy(head->magic, TEXCACHEMAGIC, 4); // sizes are set by caller
if (glusetexcache == 2) if (glusetexcache == 2)
@ -571,19 +540,43 @@ void texcache_writetex(char const * const cachefn, texcacheheader *head)
head->ydim = B_LITTLE32(head->ydim); head->ydim = B_LITTLE32(head->ydim);
head->flags = B_LITTLE32(head->flags); head->flags = B_LITTLE32(head->flags);
head->quality = B_LITTLE32(head->quality); head->quality = B_LITTLE32(head->quality);
}
#define WRITEX_FAIL_ON_ERROR() if (bglGetError() != GL_NO_ERROR) goto failure
void texcache_writetex_fromdriver(char const * const cachefn, texcacheheader *head)
{
texcachepicture pict;
char *pic = NULL, *packbuf = NULL;
void *midbuf = NULL;
uint32_t alloclen=0;
if (!texcache_enabled()) return;
GLint gi = GL_FALSE;
bglGetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_TEXTURE_COMPRESSED_ARB, &gi);
if (gi != GL_TRUE)
{
static GLint glGetTexLevelParameterivOK = GL_TRUE;
if (glGetTexLevelParameterivOK == GL_TRUE)
{
OSD_Printf("Error: glGetTexLevelParameteriv returned GL_FALSE!\n");
glGetTexLevelParameterivOK = GL_FALSE;
}
return;
}
texcache_prewritetex(head);
Blseek(texcache.filehandle, 0, BSEEK_END);
int32_t offset = Blseek(texcache.filehandle, 0, BSEEK_CUR);
// OSD_Printf("Caching %s, offset 0x%x\n", cachefn, offset);
if (Bwrite(texcache.filehandle, head, sizeof(texcacheheader)) != sizeof(texcacheheader)) goto failure; if (Bwrite(texcache.filehandle, head, sizeof(texcacheheader)) != sizeof(texcacheheader)) goto failure;
CLEAR_GL_ERRORS(); CLEAR_GL_ERRORS();
#ifndef EDUKE32_GLES for (uint32_t level = 0, padx = 0, pady = 0; level == 0 || (padx > 1 || pady > 1); ++level)
for (level = 0; level==0 || (padx > 1 || pady > 1); level++)
#endif
{ {
uint32_t miplen;
texcachepicture pict;
#ifndef EDUKE32_GLES
bglGetTexLevelParameteriv(GL_TEXTURE_2D, level, GL_TEXTURE_COMPRESSED_ARB, &gi); WRITEX_FAIL_ON_ERROR(); bglGetTexLevelParameteriv(GL_TEXTURE_2D, level, GL_TEXTURE_COMPRESSED_ARB, &gi); WRITEX_FAIL_ON_ERROR();
if (gi != GL_TRUE) goto failure; // an uncompressed mipmap if (gi != GL_TRUE) goto failure; // an uncompressed mipmap
bglGetTexLevelParameteriv(GL_TEXTURE_2D, level, GL_TEXTURE_INTERNAL_FORMAT, &gi); WRITEX_FAIL_ON_ERROR(); bglGetTexLevelParameteriv(GL_TEXTURE_2D, level, GL_TEXTURE_INTERNAL_FORMAT, &gi); WRITEX_FAIL_ON_ERROR();
@ -602,15 +595,8 @@ void texcache_writetex(char const * const cachefn, texcacheheader *head)
bglGetTexLevelParameteriv(GL_TEXTURE_2D, level, GL_TEXTURE_DEPTH, &gi); WRITEX_FAIL_ON_ERROR(); bglGetTexLevelParameteriv(GL_TEXTURE_2D, level, GL_TEXTURE_DEPTH, &gi); WRITEX_FAIL_ON_ERROR();
pict.depth = B_LITTLE32(gi); pict.depth = B_LITTLE32(gi);
bglGetTexLevelParameteriv(GL_TEXTURE_2D, level, GL_TEXTURE_COMPRESSED_IMAGE_SIZE_ARB, &gi); WRITEX_FAIL_ON_ERROR(); bglGetTexLevelParameteriv(GL_TEXTURE_2D, level, GL_TEXTURE_COMPRESSED_IMAGE_SIZE_ARB, &gi); WRITEX_FAIL_ON_ERROR();
miplen = gi; pict.size = B_LITTLE32(gi); uint32_t miplen = gi; pict.size = B_LITTLE32(gi);
#else // TODO: actually code this ;)
// pict.format = GL_ETC1_RGB8_OES;
pict.xdim = head->xdim;
pict.ydim = head->ydim;
pict.border = 0;
pict.depth = 16;
miplen = 0;
#endif
if (alloclen < miplen) if (alloclen < miplen)
{ {
pic = (char *)Xrealloc(pic, miplen); pic = (char *)Xrealloc(pic, miplen);
@ -619,15 +605,29 @@ void texcache_writetex(char const * const cachefn, texcacheheader *head)
midbuf = (void *)Xrealloc(midbuf, miplen); midbuf = (void *)Xrealloc(midbuf, miplen);
} }
#ifdef USE_GLEXT
bglGetCompressedTexImageARB(GL_TEXTURE_2D, level, pic); WRITEX_FAIL_ON_ERROR(); bglGetCompressedTexImageARB(GL_TEXTURE_2D, level, pic); WRITEX_FAIL_ON_ERROR();
#endif
if (Bwrite(texcache.filehandle, &pict, sizeof(texcachepicture)) != sizeof(texcachepicture)) goto failure; if (Bwrite(texcache.filehandle, &pict, sizeof(texcachepicture)) != sizeof(texcachepicture)) goto failure;
if (dxtfilter(texcache.filehandle, &pict, pic, midbuf, packbuf, miplen)) goto failure; if (dxtfilter(texcache.filehandle, &pict, pic, midbuf, packbuf, miplen)) goto failure;
} }
{ texcache_postwritetex(cachefn, offset);
goto success;
failure:
initprintf("ERROR: cache failure!\n");
texcache.currentindex->offset = 0;
Bmemset(texcache.currentindex->name,0,sizeof(texcache.currentindex->name));
success:
TEXCACHE_FREEBUFS();
}
#undef WRITEX_FAIL_ON_ERROR
void texcache_postwritetex(char const * const cachefn, int32_t const offset)
{
texcacheindex *t; texcacheindex *t;
int32_t i = hash_find(&texcache.hashes, cachefn); int32_t i = hash_find(&texcache.hashes, cachefn);
if (i > -1) if (i > -1)
@ -663,20 +663,9 @@ void texcache_writetex(char const * const cachefn, texcacheheader *head)
} }
else else
OSD_Printf("wtf?\n"); OSD_Printf("wtf?\n");
}
goto success;
failure:
initprintf("ERROR: cache failure!\n");
texcache.currentindex->offset = 0;
Bmemset(texcache.currentindex->name,0,sizeof(texcache.currentindex->name));
success:
TEXCACHE_FREEBUFS();
} }
#undef WRITEX_FAIL_ON_ERROR #endif
static void texcache_setuptexture(int32_t *doalloc, GLuint *glpic) static void texcache_setuptexture(int32_t *doalloc, GLuint *glpic)
{ {
@ -695,10 +684,12 @@ static int32_t texcache_loadmips(const texcacheheader *head, GLenum *glerr)
void *midbuf = NULL; void *midbuf = NULL;
int32_t alloclen=0; int32_t alloclen=0;
#ifndef EDUKE32_GLES #if !defined USE_GLEXT && defined EDUKE32_GLES
int32_t level = 0; UNREFERENCED_PARAMETER(glerr);
for (level = 0; level==0 || (pict.xdim > 1 || pict.ydim > 1); level++) UNREFERENCED_PARAMETER(head);
#endif #endif
for (int32_t level = 0; level==0 || (pict.xdim > 1 || pict.ydim > 1); level++)
{ {
if (texcache_readdata(&pict, sizeof(texcachepicture))) if (texcache_readdata(&pict, sizeof(texcachepicture)))
{ {
@ -722,6 +713,7 @@ static int32_t texcache_loadmips(const texcacheheader *head, GLenum *glerr)
midbuf = (void *)Xrealloc(midbuf, pict.size); midbuf = (void *)Xrealloc(midbuf, pict.size);
} }
#if defined USE_GLEXT && !defined EDUKE32_GLES
if (dedxtfilter(texcache.filehandle, &pict, pic, midbuf, packbuf, if (dedxtfilter(texcache.filehandle, &pict, pic, midbuf, packbuf,
(head->flags & CACHEAD_COMPRESSED)!=0)) (head->flags & CACHEAD_COMPRESSED)!=0))
{ {
@ -729,16 +721,13 @@ static int32_t texcache_loadmips(const texcacheheader *head, GLenum *glerr)
return TEXCACHERR_DEDXT; return TEXCACHERR_DEDXT;
} }
#ifdef USE_GLEXT
bglCompressedTexImage2DARB(GL_TEXTURE_2D,level,pict.format,pict.xdim,pict.ydim,pict.border,pict.size,pic); bglCompressedTexImage2DARB(GL_TEXTURE_2D,level,pict.format,pict.xdim,pict.ydim,pict.border,pict.size,pic);
if ((*glerr=bglGetError()) != GL_NO_ERROR) if ((*glerr=bglGetError()) != GL_NO_ERROR)
{ {
TEXCACHE_FREEBUFS(); TEXCACHE_FREEBUFS();
return TEXCACHERR_COMPTEX; return TEXCACHERR_COMPTEX;
} }
#endif
#ifndef EDUKE32_GLES
GLint format; GLint format;
bglGetTexLevelParameteriv(GL_TEXTURE_2D, level, GL_TEXTURE_INTERNAL_FORMAT, &format); bglGetTexLevelParameteriv(GL_TEXTURE_2D, level, GL_TEXTURE_INTERNAL_FORMAT, &format);
if ((*glerr = bglGetError()) != GL_NO_ERROR) if ((*glerr = bglGetError()) != GL_NO_ERROR)
@ -756,10 +745,6 @@ static int32_t texcache_loadmips(const texcacheheader *head, GLenum *glerr)
#endif #endif
} }
#if !defined USE_GLEXT && defined EDUKE32_GLES
UNREFERENCED_PARAMETER(glerr);
#endif
TEXCACHE_FREEBUFS(); TEXCACHE_FREEBUFS();
return 0; return 0;
} }