- Refine the Cache_Get callback, to use a void * instead of a char *

- Switch alias models over to Cache_Get/Cache_Release
This commit is contained in:
Adam Olsen 2001-08-31 12:22:45 +00:00
parent f54ef94fd0
commit f1a016c8a5
13 changed files with 82 additions and 68 deletions

View file

@ -120,12 +120,12 @@ void Hunk_Check (void);
struct cache_user_s;
typedef void * (*cache_allocator_t) (struct cache_user_s *c, int size, const char *name);
typedef void (*cache_loader_t) (struct cache_user_s *cache, cache_allocator_t allocator);
typedef void (*cache_loader_t) (void *object, cache_allocator_t allocator);
typedef struct cache_user_s
{
void *data;
char *filename;
void *object;
cache_loader_t loader;
} cache_user_t;
@ -143,7 +143,7 @@ void *Cache_Alloc (cache_user_t *c, int size, const char *name);
void Cache_Report (void);
void Cache_Add (cache_user_t *c, const char *filename, cache_loader_t loader);
void Cache_Add (cache_user_t *c, void *object, cache_loader_t loader);
void Cache_Remove (cache_user_t *c);
void *Cache_Get (cache_user_t *c);
void *Cache_TryGet (cache_user_t *c);

View file

@ -61,7 +61,7 @@ void SND_Update_ (void);
sfx_t *SND_PrecacheSound (const char *name);
void SND_ClearBuffer (void);
void SND_PaintChannels (int endtime);
void SND_CallbackLoad (struct cache_user_s *cache, cache_allocator_t allocator);
void SND_CallbackLoad (void *object, cache_allocator_t allocator);
void SND_Init_Cvars ();
@ -330,7 +330,7 @@ SND_FindName (const char *name)
sfx = &known_sfx[i];
strcpy (sfx->name, name);
Cache_Add (&sfx->cache, name, SND_CallbackLoad);
Cache_Add (&sfx->cache, sfx, SND_CallbackLoad);
num_sfx++;

View file

@ -47,7 +47,7 @@ int cache_full_cycle;
byte *SND_Alloc (int size);
wavinfo_t SND_GetWavinfo (const char *name, byte * wav, int wavlength);
sfxcache_t *SND_LoadSound (cache_user_t *cache, const char *name, cache_allocator_t allocator);
sfxcache_t *SND_LoadSound (sfx_t *sfx, cache_allocator_t allocator);
void
@ -157,7 +157,7 @@ SND_ResampleSfx (sfxcache_t *sc, int inrate, int inwidth, byte * data)
//=============================================================================
sfxcache_t *
SND_LoadSound (cache_user_t *cache, const char *name, cache_allocator_t allocator)
SND_LoadSound (sfx_t *sfx, cache_allocator_t allocator)
{
char namebuffer[256];
byte *data;
@ -169,7 +169,7 @@ SND_LoadSound (cache_user_t *cache, const char *name, cache_allocator_t allocato
// load it in
strcpy (namebuffer, "sound/");
strncat (namebuffer, name, sizeof (namebuffer) - strlen (namebuffer));
strncat (namebuffer, sfx->name, sizeof (namebuffer) - strlen (namebuffer));
data = COM_LoadStackFile (namebuffer, stackbuf, sizeof (stackbuf));
@ -178,9 +178,9 @@ SND_LoadSound (cache_user_t *cache, const char *name, cache_allocator_t allocato
return NULL;
}
info = SND_GetWavinfo (name, data, com_filesize);
info = SND_GetWavinfo (sfx->name, data, com_filesize);
if (info.channels != 1) {
Con_Printf ("%s is a stereo sample\n", name);
Con_Printf ("%s is a stereo sample\n", sfx->name);
return NULL;
}
@ -193,7 +193,7 @@ SND_LoadSound (cache_user_t *cache, const char *name, cache_allocator_t allocato
len = len * 2 * info.channels;
}
sc = allocator (cache, len + sizeof (sfxcache_t), name);
sc = allocator (&sfx->cache, len + sizeof (sfxcache_t), sfx->name);
if (!sc)
return NULL;
@ -210,9 +210,9 @@ SND_LoadSound (cache_user_t *cache, const char *name, cache_allocator_t allocato
}
void
SND_CallbackLoad (struct cache_user_s *cache, cache_allocator_t allocator)
SND_CallbackLoad (void *object, cache_allocator_t allocator)
{
SND_LoadSound (cache, cache->filename, allocator);
SND_LoadSound (object, allocator);
}
/* WAV loading */

View file

@ -356,7 +356,7 @@ GL_MakeAliasModelDisplayLists (model_t *m, aliashdr_t *hdr, void *_m, int _s)
qboolean do_cache = false;
aliasmodel = m;
paliashdr = hdr; // (aliashdr_t *)Mod_Extradata (m);
paliashdr = hdr;
if (gl_mesh_cache->int_val
&& gl_mesh_cache->int_val <= paliashdr->mdl.numtris) {

View file

@ -80,7 +80,7 @@ void *Mod_LoadAliasGroup (void *pin, maliasframedesc_t *frame);
//=========================================================================
void
Mod_LoadAliasModel (model_t *mod, void *buffer)
Mod_LoadAliasModel (model_t *mod, void *buffer, cache_allocator_t allocator)
{
int i, j;
mdl_t *pinmodel, *pmodel;
@ -94,6 +94,7 @@ Mod_LoadAliasModel (model_t *mod, void *buffer)
byte *p;
int len;
unsigned short crc;
void *mem;
CRC_Init (&crc);
for (len = com_filesize, p = buffer; len; len--, p++)
@ -218,10 +219,10 @@ Mod_LoadAliasModel (model_t *mod, void *buffer)
end = Hunk_LowMark ();
total = end - start;
Cache_Alloc (&mod->cache, total, loadname);
if (!mod->cache.data)
return;
memcpy (mod->cache.data, pheader, total);
mem = allocator (&mod->cache, total, loadname);
if (!mem)
return; // FIXME: shouldn't this call Hunk_FreeToLowMark too?!?!
memcpy (mem, pheader, total);
Hunk_FreeToLowMark (start);
}

View file

@ -48,9 +48,11 @@
#include "QF/sys.h"
#include "QF/vfs.h"
void Mod_LoadAliasModel (model_t *mod, void *buf);
void Mod_LoadAliasModel (model_t *mod, void *buf, cache_allocator_t allocator);
void Mod_LoadSpriteModel (model_t *mod, void *buf);
void Mod_LoadBrushModel (model_t *mod, void *buf);
model_t *Mod_RealLoadModel (model_t *mod, qboolean crash, cache_allocator_t allocator);
void Mod_CallbackLoad (void *object, cache_allocator_t allocator);
model_t *loadmodel;
char loadname[32]; // for hunk tags
@ -143,6 +145,7 @@ Mod_FindName (const char *name)
strcpy (mod->name, name);
mod->needload = true;
mod_numknown++;
Cache_Add (&mod->cache, mod, Mod_CallbackLoad);
}
return mod;
@ -156,19 +159,21 @@ Mod_FindName (const char *name)
model_t *
Mod_LoadModel (model_t *mod, qboolean crash)
{
void *d;
unsigned int *buf;
byte stackbuf[1024]; // avoid dirtying the cache heap
if (!mod->needload) {
if (mod->type == mod_alias) {
d = Cache_Check (&mod->cache);
if (d)
if (Cache_Check (&mod->cache))
return mod;
} else
return mod; // not cached at all
}
return Mod_RealLoadModel (mod, crash, Cache_Alloc);
}
model_t *
Mod_RealLoadModel (model_t *mod, qboolean crash, cache_allocator_t allocator)
{
unsigned int *buf;
byte stackbuf[1024]; // avoid dirtying the cache heap
// load the file
buf =
(unsigned int *) COM_LoadStackFile (mod->name, stackbuf,
@ -192,7 +197,7 @@ Mod_LoadModel (model_t *mod, qboolean crash)
switch (LittleLong (*(unsigned int *) buf)) {
case IDPOLYHEADER:
Mod_LoadAliasModel (mod, buf);
Mod_LoadAliasModel (mod, buf, allocator);
break;
case IDSPRITEHEADER:
@ -207,6 +212,20 @@ Mod_LoadModel (model_t *mod, qboolean crash)
return mod;
}
/*
Mod_CallbackLoad
Callback used to load model automatically
*/
void
Mod_CallbackLoad (void *object, cache_allocator_t allocator)
{
if (((model_t *)object)->type != mod_alias)
Sys_Error ("Mod_CallbackLoad for non-alias model? FIXME!\n");
// FIXME: do we want crash set to true?
Mod_RealLoadModel (object, true, allocator);
}
/*
Mod_ForName
@ -223,27 +242,6 @@ Mod_ForName (const char *name, qboolean crash)
return Mod_LoadModel (mod, crash);
}
/*
Mod_Extradata
Caches the data if needed
*/
void *
Mod_Extradata (model_t *mod)
{
void *r;
r = Cache_Check (&mod->cache);
if (r)
return r;
Mod_LoadModel (mod, true);
if (!mod->cache.data)
Sys_Error ("Mod_Extradata: caching failed");
return mod->cache.data;
}
void
Mod_TouchModel (const char *name)
{

View file

@ -963,16 +963,14 @@ Cache_Profile (void)
}
void
Cache_Add (cache_user_t *c, const char *filename, cache_loader_t loader)
Cache_Add (cache_user_t *c, void *object, cache_loader_t loader)
{
CACHE_WRITE_LOCK;
if (c->data || c->filename || c->loader)
if (c->data || c->object || c->loader)
Sys_Error ("Cache_Add: cache item already exists!\n");
c->filename = strdup (filename);
if (!c->filename)
Sys_Error ("Cache_Add: strdup failed!\n");
c->object = object;
c->loader = loader;
// c->loader (c, Cache_RealAlloc); // for debugging
@ -985,14 +983,13 @@ Cache_Remove (cache_user_t *c)
{
CACHE_WRITE_LOCK;
if (!c->filename || !c->loader)
if (!c->object || !c->loader)
Sys_Error ("Cache_Remove: already removed!\n");
if (Cache_RealCheck (c))
Cache_RealFree (c);
free (c->filename);
c->filename = 0;
c->object = 0;
c->loader = 0;
CACHE_WRITE_UNLOCK;
@ -1006,7 +1003,7 @@ Cache_TryGet (cache_user_t *c)
mem = Cache_RealCheck (c);
if (!mem) {
c->loader (c, Cache_RealAlloc);
c->loader (c->object, Cache_RealAlloc);
mem = Cache_RealCheck (c);
}
if (mem)

View file

@ -624,7 +624,7 @@ R_DrawAliasModel (entity_t *e, qboolean cull)
VectorNormalize (shadevector);
// locate the proper data
paliashdr = (aliashdr_t *) Mod_Extradata (currententity->model);
paliashdr = Cache_Get (&currententity->model->cache);
c_alias_polys += paliashdr->mdl.numtris;
// draw all the triangles
@ -714,6 +714,8 @@ R_DrawAliasModel (entity_t *e, qboolean cull)
qfglEnable (GL_TEXTURE_2D);
qfglPopMatrix ();
}
Cache_Release (&currententity->model->cache);
}
/*

View file

@ -207,7 +207,7 @@ Skin_Do_Translation_Model (model_t *model, int skinnum, int slot, skin_t *skin)
if (model->type != mod_alias) // only translate skins on alias models
return;
paliashdr = (aliashdr_t *) Mod_Extradata (model);
paliashdr = Cache_Get (&model->cache);
if (skinnum < 0
|| skinnum >= paliashdr->mdl.numskins) {
Con_Printf ("(%d): Invalid player skin #%d\n", slot,
@ -222,6 +222,8 @@ Skin_Do_Translation_Model (model_t *model, int skinnum, int slot, skin_t *skin)
inheight = paliashdr->mdl.skinheight;
build_skin (texnum, original, inwidth, inheight, inwidth, inheight, false);
Cache_Release (&model->cache);
}
void

View file

@ -113,7 +113,7 @@ R_AliasCheckBBox (void)
// expand, rotate, and translate points into worldspace
currententity->trivial_accept = 0;
pmodel = currententity->model;
pahdr = Mod_Extradata (pmodel);
pahdr = Cache_Get (&pmodel->cache);
pmdl = (mdl_t *) ((byte *) pahdr + pahdr->model);
R_AliasSetUpTransform (0);
@ -166,6 +166,7 @@ R_AliasCheckBBox (void)
}
if (zfullyclipped) {
Cache_Release (&pmodel->cache);
return false; // everything was near-z-clipped
}
@ -226,8 +227,10 @@ R_AliasCheckBBox (void)
allclip &= flags;
}
if (allclip)
if (allclip) {
Cache_Release (&pmodel->cache);
return false; // trivial reject off one side
}
currententity->trivial_accept = !anyclip & !zclipped;
@ -237,6 +240,7 @@ R_AliasCheckBBox (void)
}
}
Cache_Release (&pmodel->cache);
return true;
}
@ -664,7 +668,7 @@ R_AliasDrawModel (alight_t *plighting)
(((long) &finalverts[0] + CACHE_SIZE - 1) & ~(CACHE_SIZE - 1));
pauxverts = &auxverts[0];
paliashdr = (aliashdr_t *) Mod_Extradata (currententity->model);
paliashdr = Cache_Get (&currententity->model->cache);
pmdl = (mdl_t *) ((byte *) paliashdr + paliashdr->model);
R_AliasSetupSkin ();
@ -697,4 +701,6 @@ R_AliasDrawModel (alight_t *plighting)
R_AliasPrepareUnclippedPoints ();
else
R_AliasPreparePoints ();
Cache_Release (&currententity->model->cache);
}

View file

@ -113,7 +113,7 @@ R_AliasCheckBBox (void)
// expand, rotate, and translate points into worldspace
currententity->trivial_accept = 0;
pmodel = currententity->model;
pahdr = Mod_Extradata (pmodel);
pahdr = Cache_Get (&pmodel->cache);
pmdl = (mdl_t *) ((byte *) pahdr + pahdr->model);
R_AliasSetUpTransform (0);
@ -166,6 +166,7 @@ R_AliasCheckBBox (void)
}
if (zfullyclipped) {
Cache_Release (&pmodel->cache);
return false; // everything was near-z-clipped
}
@ -226,8 +227,10 @@ R_AliasCheckBBox (void)
allclip &= flags;
}
if (allclip)
if (allclip) {
Cache_Release (&pmodel->cache);
return false; // trivial reject off one side
}
currententity->trivial_accept = !anyclip & !zclipped;
@ -237,6 +240,7 @@ R_AliasCheckBBox (void)
}
}
Cache_Release (&pmodel->cache);
return true;
}
@ -651,7 +655,7 @@ R_AliasDrawModel (alight_t *plighting)
(((long) &finalverts[0] + CACHE_SIZE - 1) & ~(CACHE_SIZE - 1));
pauxverts = &auxverts[0];
paliashdr = (aliashdr_t *) Mod_Extradata (currententity->model);
paliashdr = Cache_Get (&currententity->model->cache);
pmdl = (mdl_t *) ((byte *) paliashdr + paliashdr->model);
R_AliasSetupSkin ();
@ -683,4 +687,6 @@ R_AliasDrawModel (alight_t *plighting)
R_AliasPrepareUnclippedPoints ();
else
R_AliasPreparePoints ();
Cache_Release (&currententity->model->cache);
}

View file

@ -1373,12 +1373,13 @@ PrintFrameName (model_t *m, int frame)
aliashdr_t *hdr;
maliasframedesc_t *pframedesc;
hdr = (aliashdr_t *) Mod_Extradata (m);
hdr = Cache_TryGet (&m->cache);
if (!hdr)
return;
pframedesc = &hdr->frames[frame];
Con_Printf ("frame %i: %s\n", frame, pframedesc->name);
Cache_Release (&m->cache);
}
/*

View file

@ -296,13 +296,14 @@ Model_NextDownload (void)
info_key = emodel_name;
if (info_key && cl_model_crcs->int_val) {
aliashdr_t *ahdr = (aliashdr_t *) Mod_Extradata
(cl.model_precache[i]);
aliashdr_t *ahdr = Cache_Get
(&cl.model_precache[i]->cache);
Info_SetValueForKey (cls.userinfo, info_key, va ("%d", ahdr->crc),
MAX_INFO_STRING, 0);
MSG_WriteByte (&cls.netchan.message, clc_stringcmd);
SZ_Print (&cls.netchan.message, va ("setinfo %s %d", info_key,
ahdr->crc));
Cache_Release (&cl.model_precache[i]->cache);
}
}