mirror of
https://github.com/nzp-team/fteqw.git
synced 2024-11-22 20:11:44 +00:00
Optimise lightmap updates with threaded world rendering.
git-svn-id: https://svn.code.sf.net/p/fteqw/code/trunk@5778 fc73d0e0-1445-4013-8a0c-d673dee63da5
This commit is contained in:
parent
34ff2cd788
commit
697edaac76
2 changed files with 23 additions and 0 deletions
|
@ -3035,6 +3035,7 @@ struct webostate_s
|
||||||
static struct webostate_s *webostates;
|
static struct webostate_s *webostates;
|
||||||
static struct webostate_s *webogenerating;
|
static struct webostate_s *webogenerating;
|
||||||
static int webogeneratingstate; //1 if generating, 0 if not, for waiting for sync.
|
static int webogeneratingstate; //1 if generating, 0 if not, for waiting for sync.
|
||||||
|
int webo_blocklightmapupdates; //0 no webo, &1=using threadedworld, &2=already uploaded.
|
||||||
static void R_DestroyWorldEBO(struct webostate_s *es)
|
static void R_DestroyWorldEBO(struct webostate_s *es)
|
||||||
{
|
{
|
||||||
if (!es)
|
if (!es)
|
||||||
|
@ -3063,6 +3064,7 @@ void R_GeneratedWorldEBO(void *ctx, void *data, size_t a_, size_t b_)
|
||||||
webostates = webostate;
|
webostates = webostate;
|
||||||
webogenerating = NULL;
|
webogenerating = NULL;
|
||||||
webogeneratingstate = 0;
|
webogeneratingstate = 0;
|
||||||
|
webo_blocklightmapupdates = 1;
|
||||||
mod = webostate->wmodel;
|
mod = webostate->wmodel;
|
||||||
|
|
||||||
webostate->lastvalid = cls.framecount;
|
webostate->lastvalid = cls.framecount;
|
||||||
|
@ -3661,6 +3663,7 @@ void Surf_DeInit(void)
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
#ifdef THREADEDWORLD
|
#ifdef THREADEDWORLD
|
||||||
|
webo_blocklightmapupdates = 0;
|
||||||
while(webogenerating)
|
while(webogenerating)
|
||||||
COM_WorkerPartialSync(webogenerating, &webogeneratingstate, true);
|
COM_WorkerPartialSync(webogenerating, &webogeneratingstate, true);
|
||||||
while (webostates)
|
while (webostates)
|
||||||
|
@ -3870,6 +3873,10 @@ int Surf_NewLightmaps(int count, int width, int height, uploadfmt_t fmt, qboolea
|
||||||
unsigned int pixbytes, pixw, pixh, pixd;
|
unsigned int pixbytes, pixw, pixh, pixd;
|
||||||
unsigned int dpixbytes, dpixw, dpixh, dpixd;
|
unsigned int dpixbytes, dpixw, dpixh, dpixd;
|
||||||
uploadfmt_t dfmt;
|
uploadfmt_t dfmt;
|
||||||
|
#ifdef THREADEDWORLD
|
||||||
|
extern int webo_blocklightmapupdates;
|
||||||
|
webo_blocklightmapupdates = 0;
|
||||||
|
#endif
|
||||||
|
|
||||||
if (!count)
|
if (!count)
|
||||||
return -1;
|
return -1;
|
||||||
|
@ -3994,6 +4001,11 @@ int Surf_NewExternalLightmaps(int count, char *filepattern, qboolean deluxe)
|
||||||
char nname[MAX_QPATH];
|
char nname[MAX_QPATH];
|
||||||
qboolean odd = (count & 1) && deluxe;
|
qboolean odd = (count & 1) && deluxe;
|
||||||
|
|
||||||
|
#ifdef THREADEDWORLD
|
||||||
|
extern int webo_blocklightmapupdates;
|
||||||
|
webo_blocklightmapupdates = 0;
|
||||||
|
#endif
|
||||||
|
|
||||||
if (!count)
|
if (!count)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
|
|
|
@ -5511,11 +5511,22 @@ void GLBE_SubmitMeshes (batch_t **worldbatches, int start, int stop)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if (defined(GLQUAKE) || defined(VKQUAKE)) && defined(MULTITHREAD)
|
||||||
|
#define THREADEDWORLD
|
||||||
|
#endif
|
||||||
|
|
||||||
void GLBE_UpdateLightmaps(void)
|
void GLBE_UpdateLightmaps(void)
|
||||||
{
|
{
|
||||||
lightmapinfo_t *lm;
|
lightmapinfo_t *lm;
|
||||||
int lmidx;
|
int lmidx;
|
||||||
|
|
||||||
|
#ifdef THREADEDWORLD
|
||||||
|
extern int webo_blocklightmapupdates;
|
||||||
|
if (webo_blocklightmapupdates == 3)
|
||||||
|
return; //we've not had a new scene to render yet. don't bother uploading while something's still painting, its going to be redundant.
|
||||||
|
webo_blocklightmapupdates |= 2; //FIXME: round-robin it? one lightmap per frame?
|
||||||
|
#endif
|
||||||
|
|
||||||
for (lmidx = 0; lmidx < numlightmaps; lmidx++)
|
for (lmidx = 0; lmidx < numlightmaps; lmidx++)
|
||||||
{
|
{
|
||||||
lm = lightmap[lmidx];
|
lm = lightmap[lmidx];
|
||||||
|
|
Loading…
Reference in a new issue