diff --git a/src/core/const.js b/src/core/const.js index 1ea4408..220c14e 100644 --- a/src/core/const.js +++ b/src/core/const.js @@ -269,7 +269,7 @@ // TODO: maybe change to SPRITE.BATCH_SIZE: 2000 // TODO: maybe add PARTICLE.BATCH_SIZE: 15000 SPRITE_BATCH_SIZE: 4096, //nice balance between mobile and desktop machines - SPRITE_MAX_TEXTURES: require('./utils/maxRecommendedTextures')(16)//this is the MAXIMUM - various gpus will have there own limits. + SPRITE_MAX_TEXTURES: require('./utils/maxRecommendedTextures')(32)//this is the MAXIMUM - various gpus will have there own limits. }; module.exports = CONST; diff --git a/src/core/const.js b/src/core/const.js index 1ea4408..220c14e 100644 --- a/src/core/const.js +++ b/src/core/const.js @@ -269,7 +269,7 @@ // TODO: maybe change to SPRITE.BATCH_SIZE: 2000 // TODO: maybe add PARTICLE.BATCH_SIZE: 15000 SPRITE_BATCH_SIZE: 4096, //nice balance between mobile and desktop machines - SPRITE_MAX_TEXTURES: require('./utils/maxRecommendedTextures')(16)//this is the MAXIMUM - various gpus will have there own limits. + SPRITE_MAX_TEXTURES: require('./utils/maxRecommendedTextures')(32)//this is the MAXIMUM - various gpus will have there own limits. }; module.exports = CONST; diff --git a/src/core/renderers/webgl/utils/checkMaxIfStatmentsInShader.js b/src/core/renderers/webgl/utils/checkMaxIfStatmentsInShader.js new file mode 100644 index 0000000..6399166 --- /dev/null +++ b/src/core/renderers/webgl/utils/checkMaxIfStatmentsInShader.js @@ -0,0 +1,69 @@ +var glCore = require('pixi-gl-core'); + +var checkMaxIfStatmentsInShader = function(maxIfs) +{ + var tinyCanvas = document.createElement('canvas'); + tinyCanvas.width = 1; + tinyCanvas.height = 1; + + var gl = glCore.createContext(tinyCanvas); + var shader = gl.createShader(gl.FRAGMENT_SHADER); + + while(true) + { + var fragmentSrc = fragTemplate.replace(/\%forloop\%/gi, generateIfTestSrc(maxIfs)); + + gl.shaderSource(shader, fragmentSrc); + gl.compileShader(shader); + + if(!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) + { + maxIfs = (maxIfs/2)|0; + } + else + { + // valid! + break; + } + } + + // get rid of context + if(gl.getExtension('WEBGL_lose_context')) + { + gl.getExtension('WEBGL_lose_context').loseContext(); + } + + return maxIfs; +} + +var fragTemplate = [ + 'precision lowp float;', + 'void main(void){', + 'float test = 0.1;', + '%forloop%', + 'gl_FragColor = vec4(0.0);', + '}' +].join('\n'); + + +function generateIfTestSrc(maxIfs) +{ + var src = ''; + + for (var i = 0; i < maxIfs; i++) + { + if(i > 0) + { + src += '\nelse '; + } + + if(i < maxIfs-1) + { + src += 'if(test == ' + i + '.0){}'; + } + } + + return src; +} + +module.exports = checkMaxIfStatmentsInShader; diff --git a/src/core/const.js b/src/core/const.js index 1ea4408..220c14e 100644 --- a/src/core/const.js +++ b/src/core/const.js @@ -269,7 +269,7 @@ // TODO: maybe change to SPRITE.BATCH_SIZE: 2000 // TODO: maybe add PARTICLE.BATCH_SIZE: 15000 SPRITE_BATCH_SIZE: 4096, //nice balance between mobile and desktop machines - SPRITE_MAX_TEXTURES: require('./utils/maxRecommendedTextures')(16)//this is the MAXIMUM - various gpus will have there own limits. + SPRITE_MAX_TEXTURES: require('./utils/maxRecommendedTextures')(32)//this is the MAXIMUM - various gpus will have there own limits. }; module.exports = CONST; diff --git a/src/core/renderers/webgl/utils/checkMaxIfStatmentsInShader.js b/src/core/renderers/webgl/utils/checkMaxIfStatmentsInShader.js new file mode 100644 index 0000000..6399166 --- /dev/null +++ b/src/core/renderers/webgl/utils/checkMaxIfStatmentsInShader.js @@ -0,0 +1,69 @@ +var glCore = require('pixi-gl-core'); + +var checkMaxIfStatmentsInShader = function(maxIfs) +{ + var tinyCanvas = document.createElement('canvas'); + tinyCanvas.width = 1; + tinyCanvas.height = 1; + + var gl = glCore.createContext(tinyCanvas); + var shader = gl.createShader(gl.FRAGMENT_SHADER); + + while(true) + { + var fragmentSrc = fragTemplate.replace(/\%forloop\%/gi, generateIfTestSrc(maxIfs)); + + gl.shaderSource(shader, fragmentSrc); + gl.compileShader(shader); + + if(!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) + { + maxIfs = (maxIfs/2)|0; + } + else + { + // valid! + break; + } + } + + // get rid of context + if(gl.getExtension('WEBGL_lose_context')) + { + gl.getExtension('WEBGL_lose_context').loseContext(); + } + + return maxIfs; +} + +var fragTemplate = [ + 'precision lowp float;', + 'void main(void){', + 'float test = 0.1;', + '%forloop%', + 'gl_FragColor = vec4(0.0);', + '}' +].join('\n'); + + +function generateIfTestSrc(maxIfs) +{ + var src = ''; + + for (var i = 0; i < maxIfs; i++) + { + if(i > 0) + { + src += '\nelse '; + } + + if(i < maxIfs-1) + { + src += 'if(test == ' + i + '.0){}'; + } + } + + return src; +} + +module.exports = checkMaxIfStatmentsInShader; diff --git a/src/core/sprites/webgl/SpriteRenderer.js b/src/core/sprites/webgl/SpriteRenderer.js index 5213022..272c692 100644 --- a/src/core/sprites/webgl/SpriteRenderer.js +++ b/src/core/sprites/webgl/SpriteRenderer.js @@ -2,6 +2,7 @@ WebGLRenderer = require('../../renderers/webgl/WebGLRenderer'), createIndicesForQuads = require('../../utils/createIndicesForQuads'), generateMultiTextureShader = require('./generateMultiTextureShader'), + checkMaxIfStatmentsInShader = require('../../renderers/webgl/utils/checkMaxIfStatmentsInShader'), Buffer = require('./BatchBuffer'), CONST = require('../../const'), glCore = require('pixi-gl-core'),