From 0cf58dac36e92d39cf651409318e9fe49ff15ff0 Mon Sep 17 00:00:00 2001 From: XProger Date: Wed, 13 Sep 2017 06:30:33 +0300 Subject: [PATCH] #23 mutual shader cache --- src/cache.h | 14 +++++++------- src/core.h | 10 ++++++---- src/game.h | 15 +++++++++++---- src/level.h | 7 ++----- 4 files changed, 26 insertions(+), 20 deletions(-) diff --git a/src/cache.h b/src/cache.h index d76c620..285abdb 100644 --- a/src/cache.h +++ b/src/cache.h @@ -34,10 +34,9 @@ const char GUI[] = struct ShaderCache { enum Effect { FX_NONE = 0, FX_UNDERWATER = 1, FX_ALPHA_TEST = 2, FX_CLIP_PLANE = 4 }; - MeshBuilder *mesh; Shader *shaders[Core::passMAX][Shader::MAX][(FX_UNDERWATER | FX_ALPHA_TEST | FX_CLIP_PLANE) + 1]; - ShaderCache(MeshBuilder *mesh) : mesh(mesh) { + ShaderCache() { memset(shaders, 0, sizeof(shaders)); LOG("shader: cache warm up...\n"); @@ -128,10 +127,8 @@ struct ShaderCache { static const char *typeNames[] = { "SPRITE", "FLASH", "ROOM", "ENTITY", "MIRROR" }; src = SHADER; - typ = typeNames[type]; - int animTexRangesCount = mesh->animTexRangesCount; - int animTexOffsetsCount = mesh->animTexOffsetsCount; - sprintf(def, "%s#define PASS_%s\n#define TYPE_%s\n#define MAX_LIGHTS %d\n#define MAX_RANGES %d\n#define MAX_OFFSETS %d\n#define MAX_CONTACTS %d\n#define FOG_DIST (1.0/%d.0)\n#define WATER_FOG_DIST (1.0/%d.0)\n#define SHADOW_TEX_SIZE %d.0\n", ext, passNames[pass], typ, MAX_LIGHTS, animTexRangesCount, animTexOffsetsCount, MAX_CONTACTS, FOG_DIST, WATER_FOG_DIST, SHADOW_TEX_SIZE); + typ = typeNames[type]; + sprintf(def, "%s#define PASS_%s\n#define TYPE_%s\n#define MAX_LIGHTS %d\n#define MAX_RANGES %d\n#define MAX_OFFSETS %d\n#define MAX_CONTACTS %d\n#define FOG_DIST (1.0/%d.0)\n#define WATER_FOG_DIST (1.0/%d.0)\n#define SHADOW_TEX_SIZE %d.0\n", ext, passNames[pass], typ, MAX_LIGHTS, MAX_ANIM_TEX_RANGES, MAX_ANIM_TEX_OFFSETS, MAX_CONTACTS, FOG_DIST, WATER_FOG_DIST, SHADOW_TEX_SIZE); if (fx & FX_UNDERWATER) strcat(def, "#define UNDERWATER\n" UNDERWATER_COLOR); if (fx & FX_ALPHA_TEST) strcat(def, "#define ALPHA_TEST\n"); if (fx & FX_CLIP_PLANE) strcat(def, "#define CLIP_PLANE\n"); @@ -172,7 +169,7 @@ struct ShaderCache { return shaders[pass][type][fx] = new Shader(src, def); } - void bind(Core::Pass pass, Shader::Type type, int fx) { + void bind(Core::Pass pass, Shader::Type type, int fx, IGame *game) { Core::pass = pass; Shader *shader = shaders[pass][type][fx]; if (!shader) @@ -184,6 +181,9 @@ struct ShaderCache { shader->setParam(uLightProj, Core::mLightProj); shader->setParam(uViewPos, Core::viewPos); shader->setParam(uParam, Core::params); + MeshBuilder *mesh = game->getMesh(); + ASSERT(mesh->animTexRangesCount <= MAX_ANIM_TEX_RANGES); + ASSERT(mesh->animTexOffsetsCount <= MAX_ANIM_TEX_OFFSETS); shader->setParam(uAnimTexRanges, mesh->animTexRanges[0], mesh->animTexRangesCount); shader->setParam(uAnimTexOffsets, mesh->animTexOffsets[0], mesh->animTexOffsetsCount); } diff --git a/src/core.h b/src/core.h index afb52a0..5f19a81 100644 --- a/src/core.h +++ b/src/core.h @@ -253,10 +253,12 @@ namespace Core { PFNGLDISCARDFRAMEBUFFEREXTPROC glDiscardFramebufferEXT; #endif -#define MAX_LIGHTS 4 -#define MAX_CACHED_LIGHTS 3 -#define MAX_RENDER_BUFFERS 32 -#define MAX_CONTACTS 15 +#define MAX_LIGHTS 4 +#define MAX_CACHED_LIGHTS 3 +#define MAX_RENDER_BUFFERS 32 +#define MAX_CONTACTS 15 +#define MAX_ANIM_TEX_RANGES 16 +#define MAX_ANIM_TEX_OFFSETS 32 struct Shader; struct Texture; diff --git a/src/game.h b/src/game.h index 3590e5b..124fcdc 100644 --- a/src/game.h +++ b/src/game.h @@ -3,11 +3,14 @@ #include "core.h" #include "format.h" +#include "cache.h" #include "level.h" #include "ui.h" +ShaderCache *shaderCache; + namespace Game { - Level *level; + Level *level; Stream *nextLevel; } @@ -35,9 +38,6 @@ namespace Game { nextLevel = NULL; Core::init(); - UI::init(level); - - Sound::callback = stopChannel; Core::settings.detail.ambient = true; Core::settings.detail.lighting = true; @@ -51,6 +51,12 @@ namespace Game { Core::settings.controls.retarget = true; Core::settings.audio.reverb = true; + shaderCache = new ShaderCache(); + + UI::init(level); + + Sound::callback = stopChannel; + level = NULL; startLevel(lvl); } @@ -63,6 +69,7 @@ namespace Game { void free() { delete level; UI::free(); + delete shaderCache; Core::free(); } diff --git a/src/level.h b/src/level.h index 94ba8a9..d4b4e83 100644 --- a/src/level.h +++ b/src/level.h @@ -15,6 +15,7 @@ #include "debug.h" #endif +extern ShaderCache *shaderCache; extern void loadAsync(Stream *stream, void *userData); struct Level : IGame { @@ -35,7 +36,6 @@ struct Level : IGame { float clipHeight; } *params = (Params*)&Core::params; - ShaderCache *shaderCache; AmbientCache *ambientCache; WaterCache *waterCache; ZoneCache *zoneCache; @@ -115,7 +115,7 @@ struct Level : IGame { } virtual void setShader(Core::Pass pass, Shader::Type type, bool underwater = false, bool alphaTest = false) { - shaderCache->bind(pass, type, (underwater ? ShaderCache::FX_UNDERWATER : 0) | (alphaTest ? ShaderCache::FX_ALPHA_TEST : 0) | ((params->clipHeight != NO_CLIP_PLANE && pass == Core::passCompose) ? ShaderCache::FX_CLIP_PLANE : 0)); + shaderCache->bind(pass, type, (underwater ? ShaderCache::FX_UNDERWATER : 0) | (alphaTest ? ShaderCache::FX_ALPHA_TEST : 0) | ((params->clipHeight != NO_CLIP_PLANE && pass == Core::passCompose) ? ShaderCache::FX_CLIP_PLANE : 0), this); } virtual void setupBinding() { @@ -259,7 +259,6 @@ struct Level : IGame { initTextures(); mesh = new MeshBuilder(level); - shaderCache = new ShaderCache(mesh); initOverrides(); for (int i = 0; i < level.entitiesBaseCount; i++) { @@ -438,8 +437,6 @@ struct Level : IGame { for (int i = 0; i < level.entitiesCount; i++) delete (Controller*)level.entities[i].controller; - delete shaderCache; - delete shadow; delete ambientCache; delete waterCache;