Skip to content

Commit d85fcde

Browse files
committed
Shader caches: add configurable version number to force reset, allow manual saving
1 parent 0b98aaf commit d85fcde

2 files changed

Lines changed: 28 additions & 17 deletions

File tree

h3d/impl/ShaderCache.hx

Lines changed: 21 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,12 @@ class ShaderCache {
1414
var sourceFile : String;
1515
public var keepSource : Bool;
1616
var mode : ShaderCacheMode;
17+
var dirty = true;
18+
public var allowSave = true;
1719

18-
inline static var VERSION_KEY_WORD = "VERSION";
19-
inline static var VERSION = 1;
20-
inline static var MODE_KEY_WORD = "MODE";
20+
public static var VERSION_KEY_WORD = "VERSION";
21+
public static var VERSION = 1;
22+
public static var MODE_KEY_WORD = "MODE";
2123

2224
public function new( file : String, ?outputFile : String, mode = Base64) {
2325
this.file = file;
@@ -26,16 +28,17 @@ class ShaderCache {
2628
sourceFile = file + ".source";
2729
}
2830

31+
@:deprecated("use allowSave = false")
2932
public function disableSave() {
30-
outputFile = null;
33+
allowSave = false;
3134
}
3235

3336
public function initEmpty() {
3437
data = [];
3538
sources = [];
3639
}
3740

38-
function load() {
41+
public function load() {
3942
data = new Map();
4043
try loadFile(file) catch( e : Dynamic ) {};
4144
if( outputFile != file ) try loadFile(outputFile) catch( e : Dynamic ) {};
@@ -54,8 +57,13 @@ class ShaderCache {
5457
var curPos = cache.position;
5558
if ( !hasVersion )
5659
cache.position = curPos = 0;
57-
else
58-
cache.readInt32();
60+
else {
61+
var version = cache.readInt32();
62+
if(version != VERSION) {
63+
trace('Shader cache version $version, expected $VERSION, skipping');
64+
return;
65+
}
66+
}
5967

6068
var hasMode = cache.readString(MODE_KEY_WORD.length) == MODE_KEY_WORD;
6169
var mode = Base64;
@@ -135,7 +143,8 @@ class ShaderCache {
135143

136144
var saveTimer : haxe.Timer;
137145
public function saveCompiledShader( source : String, bytes : haxe.io.Bytes, ?configurationKey = "", ?saveToFile = true ) {
138-
if( outputFile == null )
146+
dirty = true;
147+
if( !allowSave )
139148
return;
140149
if( data == null ) load();
141150
var key = configurationKey + haxe.crypto.Md5.encode(source);
@@ -156,7 +165,10 @@ class ShaderCache {
156165
}, 100);
157166
}
158167

159-
function save() {
168+
public function save() {
169+
if( !dirty )
170+
return;
171+
dirty = false;
160172
var out = new haxe.io.BytesOutput();
161173
var keys = Lambda.array({ iterator : data.keys });
162174
keys.sort(Reflect.compare);

hxsl/CacheFile2.hx

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -253,10 +253,11 @@ class CacheFile2Loader {
253253
class CacheFile2 extends Cache {
254254
static var DEBUG : Bool = false;
255255
static var LOAD_TIME : Float = 0.0;
256+
public static var VERSION = 1;
256257

257258
var file : String;
258259
var outFile : String;
259-
var allowSave : Bool;
260+
public var allowSave : Bool;
260261

261262
var isLoading : Bool = false;
262263
var isDirty(default, set) : Bool = false;
@@ -367,7 +368,7 @@ class CacheFile2 extends Cache {
367368
}
368369

369370
var magic = readLine();
370-
if( !StringTools.startsWith(magic, "CF2-1") ) {
371+
if( !StringTools.startsWith(magic, 'CF2-$VERSION') ) {
371372
f.close();
372373
return false;
373374
}
@@ -469,11 +470,11 @@ class CacheFile2 extends Cache {
469470
return true;
470471
}
471472

472-
function saveIfModified() {
473+
public function saveIfModified() {
473474
if( this.isDirty ) {
474475
this.isDirty = false;
475476
#if !shader_debug_dump
476-
save();
477+
_save();
477478
#end
478479
}
479480
}
@@ -615,11 +616,9 @@ class CacheFile2 extends Cache {
615616
sys.io.File.saveContent(path, out.join("\n"));
616617
}
617618

618-
function save() {
619-
if( !allowSave ) return;
620-
619+
function _save() {
621620
var out = new haxe.io.BytesOutput();
622-
out.writeString("CF2-1\n", UTF8); // magic-version
621+
out.writeString('CF2-$VERSION\n', UTF8);
623622

624623
linkers.sort((l1, l2) -> Reflect.compare(l1.name, l2.name));
625624
for( lk in linkers ) {

0 commit comments

Comments
 (0)