diff --git a/engine/client/cl_parse.c b/engine/client/cl_parse.c index 8ecc33b84..d8eb2e608 100644 --- a/engine/client/cl_parse.c +++ b/engine/client/cl_parse.c @@ -115,15 +115,54 @@ char *svc_strings[] = "FTE svc_spawnbaseline2", "FTE svc_customtempent", "FTE svc_choosesplitclient", - "FTE svc_showpic", - "FTE svc_hidepic", - "FTE svc_movepic", - "FTE svc_updatepic", - "FTE svcqw_effect", - "FTE svcqw_effect2", - "FTE svc_csqcentities", - "FTE svc_precache", - "FTE svc_choosesplitclient", + + "svcfte_showpic", + "svcfte_hidepic", + "svcfte_movepic", + "svcfte_updatepic", + + "???", + + "svcfte_effect", + "svcfte_effect2", + + "svcfte_csqcentities", + + "svcfte_precache", + + "svcfte_updatestatstring", + "svcfte_updatestatfloat", + + "svcfte_trailparticles", + "svcfte_pointparticles", + "svcfte_pointparticles1", + + "svcfte_cgamepacket", + "svcfte_voicechat", + "svcfte_setangledelta", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", + "???", }; char *svc_nqstrings[] = diff --git a/engine/gl/gl_shader.c b/engine/gl/gl_shader.c index f337ded5e..1f6886db4 100644 --- a/engine/gl/gl_shader.c +++ b/engine/gl/gl_shader.c @@ -1343,7 +1343,11 @@ static void Shader_FlushGenerics(void) { g = sgenerics; sgenerics = g->next; - free(g); + + if (g->prog.refs == 1) + free(g); + else + Con_Printf("generic shader still used\n"); } } static program_t *Shader_LoadGeneric(char *name, int qrtype) @@ -2500,6 +2504,61 @@ static shaderkey_t shaderpasskeys[] = // =============================================================== + +void Shader_FreePass (shaderpass_t *pass) +{ +#ifndef NOMEDIA + if ( pass->flags & SHADER_PASS_VIDEOMAP ) + { + Media_ShutdownCin(pass->cin); + pass->cin = NULL; + } +#endif +} + +void Shader_Free (shader_t *shader) +{ + int i; + shaderpass_t *pass; + + if (shader->bucket.data == shader) + Hash_RemoveData(&shader_active_hash, shader->name, shader); + shader->bucket.data = NULL; + +#ifdef GLQUAKE + if (qrenderer == QR_OPENGL && shader->prog) + { + program_t *prog = shader->prog; + int p; + if (--prog->refs == 0) + { + for (p = 0; p < PERMUTATIONS; p++) + { + if (prog->handle[p].glsl) + qglDeleteProgramObject_(prog->handle[p].glsl); + } + free(prog); + } + shader->prog = NULL; + } +#endif + if (shader->skydome) + { + Z_Free (shader->skydome); + } + + pass = shader->passes; + for (i = 0; i < shader->numpasses; i++, pass++) + { + Shader_FreePass (pass); + } + shader->numpasses = 0; +} + + + + + int Shader_InitCallback (const char *name, int size, void *param) { strcpy(shaderbuf+shaderbuflen, name); @@ -2511,6 +2570,7 @@ int Shader_InitCallback (const char *name, int size, void *param) qboolean Shader_Init (void) { + int i; shaderbuflen = 0; r_shaders = calloc(MAX_SHADERS, sizeof(shader_t)); @@ -2521,6 +2581,11 @@ qboolean Shader_Init (void) memset(shader_active_hash_mem, 0, Hash_BytesForBuckets(1024)); Hash_InitTable(&shader_active_hash, 1024, shader_active_hash_mem); + for (i = 0; i < MAX_SHADERS; i++) + { + if (r_shaders[i].uses) + Shader_Free(&r_shaders[i]); + } Shader_FlushGenerics(); shader_rescan_needed = true; Shader_NeedReload(); @@ -2636,56 +2701,6 @@ static void Shader_GetPathAndOffset ( char *name, char **path, unsigned int *off path = NULL; } -void Shader_FreePass (shaderpass_t *pass) -{ -#ifndef NOMEDIA - if ( pass->flags & SHADER_PASS_VIDEOMAP ) - { - Media_ShutdownCin(pass->cin); - pass->cin = NULL; - } -#endif -} - -void Shader_Free (shader_t *shader) -{ - int i; - shaderpass_t *pass; - - if (shader->bucket.data == shader) - Hash_RemoveData(&shader_active_hash, shader->name, shader); - shader->bucket.data = NULL; - -#ifdef GLQUAKE - if (qrenderer == QR_OPENGL && shader->prog) - { - program_t *prog = shader->prog; - int p; - if (--prog->refs == 0) - { - for (p = 0; p < PERMUTATIONS; p++) - { - if (prog->handle[p].glsl) - qglDeleteProgramObject_(prog->handle[p].glsl); - } - free(prog); - } - shader->prog = NULL; - } -#endif - if (shader->skydome) - { - Z_Free (shader->skydome); - } - - pass = shader->passes; - for (i = 0; i < shader->numpasses; i++, pass++) - { - Shader_FreePass (pass); - } - shader->numpasses = 0; -} - void Shader_Reset(shader_t *s) { char name[MAX_QPATH]; diff --git a/engine/server/sv_send.c b/engine/server/sv_send.c index 032520653..92fcc374f 100644 --- a/engine/server/sv_send.c +++ b/engine/server/sv_send.c @@ -1611,7 +1611,7 @@ void SV_UpdateClientStats (client_t *client, int pnum) else { #ifdef PEXT_CSQC - if ((client->fteprotocolextensions & PEXT_CSQC) && (sv.csqcchecksum || progstype == PROG_H2)) + if (client->fteprotocolextensions & PEXT_CSQC) { if (statss[i] || client->statss[i]) if (strcmp(statss[i]?statss[i]:"", client->statss[i]?client->statss[i]:"")) @@ -1645,48 +1645,55 @@ void SV_UpdateClientStats (client_t *client, int pnum) if (statsf[i]) { - if (statsf[i] != client->statsf[i]) + if (client->fteprotocolextensions & PEXT_CSQC) { - if (statsf[i] - (float)(int)statsf[i] == 0 && statsf[i] >= 0 && statsf[i] <= 255) + if (statsf[i] != client->statsf[i]) { - if (pnum) + if (statsf[i] - (float)(int)statsf[i] == 0 && statsf[i] >= 0 && statsf[i] <= 255) { - ClientReliableWrite_Begin(client->controller, svcfte_choosesplitclient, 5); - ClientReliableWrite_Byte(client->controller, pnum); - ClientReliableWrite_Byte(client->controller, svc_updatestat); - ClientReliableWrite_Byte(client->controller, i); - ClientReliableWrite_Byte(client->controller, statsf[i]); + if (pnum) + { + ClientReliableWrite_Begin(client->controller, svcfte_choosesplitclient, 5); + ClientReliableWrite_Byte(client->controller, pnum); + ClientReliableWrite_Byte(client->controller, svc_updatestat); + ClientReliableWrite_Byte(client->controller, i); + ClientReliableWrite_Byte(client->controller, statsf[i]); + } + else + { + ClientReliableWrite_Begin(client, svc_updatestat, 3); + ClientReliableWrite_Byte(client, i); + ClientReliableWrite_Byte(client, statsf[i]); + } } else { - ClientReliableWrite_Begin(client, svc_updatestat, 3); - ClientReliableWrite_Byte(client, i); - ClientReliableWrite_Byte(client, statsf[i]); + if (pnum) + { + ClientReliableWrite_Begin(client->controller, svcfte_choosesplitclient, 8); + ClientReliableWrite_Byte(client->controller, pnum); + ClientReliableWrite_Byte(client->controller, svcfte_updatestatfloat); + ClientReliableWrite_Byte(client->controller, i); + ClientReliableWrite_Float(client->controller, statsf[i]); + } + else + { + ClientReliableWrite_Begin(client, svcfte_updatestatfloat, 6); + ClientReliableWrite_Byte(client, i); + ClientReliableWrite_Float(client, statsf[i]); + } } + client->statsf[i] = statsf[i]; + /*make sure statsf is correct*/ + client->statsi[i] = statsf[i]; } - else - { - if (pnum) - { - ClientReliableWrite_Begin(client->controller, svcfte_choosesplitclient, 8); - ClientReliableWrite_Byte(client->controller, pnum); - ClientReliableWrite_Byte(client->controller, svcfte_updatestatfloat); - ClientReliableWrite_Byte(client->controller, i); - ClientReliableWrite_Float(client->controller, statsf[i]); - } - else - { - ClientReliableWrite_Begin(client, svcfte_updatestatfloat, 6); - ClientReliableWrite_Byte(client, i); - ClientReliableWrite_Float(client, statsf[i]); - } - } - client->statsf[i] = statsf[i]; - /*make sure statsf is correct*/ - client->statsi[i] = statsf[i]; + } + else + { + statsi[i] = statsf[i]; } } - else if (statsi[i] != client->statsi[i]) + if (statsi[i] != client->statsi[i]) { client->statsi[i] = statsi[i]; client->statsf[i] = statsi[i];