Skip to content

Commit a8a59a8

Browse files
committed
Add safeTextureReadHack hack to see if it fixes a problem on a specific platform on one specific machine
1 parent 5dcfed0 commit a8a59a8

1 file changed

Lines changed: 30 additions & 11 deletions

File tree

src/backend/mode_gpu.js

Lines changed: 30 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -52,21 +52,28 @@
5252

5353
return ret;
5454
}
55-
56-
function flatten(arr, padding) {
55+
56+
function pad(arr, padding) {
5757
function zeros(n) {
5858
return Array.apply(null, Array(n)).map(Number.prototype.valueOf,0);
5959
}
60-
function concatWithPadding(a, b) {
61-
return [].concat(a, zeros(padding), b);
60+
61+
var len = arr.length + padding * 2;
62+
63+
var ret = arr.map(function(x) {
64+
return [].concat(zeros(padding), x, zeros(padding));
65+
});
66+
67+
for (var i=0; i<padding; i++) {
68+
ret = [].concat([zeros(len)], ret, [zeros(len)]);
6269
}
6370

71+
return ret;
72+
}
73+
74+
function flatten(arr, padding) {
6475
if (Array.isArray(arr[0])) {
65-
if (padding) {
66-
return (concatWithPadding.apply([], arr)).concat(zeros(padding));
67-
} else {
68-
return [].concat.apply([], arr);
69-
}
76+
return [].concat.apply([], arr);
7077
} else {
7178
return arr;
7279
}
@@ -297,7 +304,9 @@
297304
' float index = (xyz.z * texDim.x * texDim.y) + (xyz.y * texDim.x) + xyz.x;',
298305
' float t = (floor(index / texSize.x) + 0.5);',
299306
' float s = mod(index, texSize.x);',
307+
(opt.safeTextureReadHack ? 's += 1.0; t += 1.0;' : ''),
300308
' s = (s < 0.5) ? 0.0 : s + 0.5;',
309+
(opt.safeTextureReadHack ? 'return decode32(texture2D(tex, vec2(s / (texSize.x + 2.0), t / (texSize.y + 2.0))));' : ''),
301310
' return decode32(texture2D(tex, vec2(s / texSize.x, t / texSize.y)));',
302311
'}',
303312
'',
@@ -416,13 +425,23 @@
416425
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);
417426
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);
418427

419-
420428
var paramArray = flatten(arguments[textureCount]);
421429
while (paramArray.length < paramSize[0] * paramSize[1]) {
422430
paramArray.push(0);
423431
}
432+
433+
if (opt.safeTextureReadHack) {
434+
paramArray = splitArray(paramArray, paramSize[0]);
435+
paramArray = pad(paramArray, 1);
436+
paramArray = flatten(paramArray);
437+
}
438+
424439
var argBuffer = new Uint8Array((new Float32Array(paramArray)).buffer);
425-
gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, paramSize[0], paramSize[1], 0, gl.RGBA, gl.UNSIGNED_BYTE, argBuffer);
440+
if (opt.safeTextureReadHack) {
441+
gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, paramSize[0]+2, paramSize[1]+2, 0, gl.RGBA, gl.UNSIGNED_BYTE, argBuffer);
442+
} else {
443+
gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, paramSize[0], paramSize[1], 0, gl.RGBA, gl.UNSIGNED_BYTE, argBuffer);
444+
}
426445

427446
textures[textureCount] = texture;
428447

0 commit comments

Comments
 (0)