|
@@ -157,6 +157,12 @@
|
|
|
public timerQuery: EXT_disjoint_timer_query;
|
|
|
/** Defines if timestamp can be used with timer query */
|
|
|
public canUseTimestampForTimerQuery: boolean;
|
|
|
+ /** Function used to let the system compiles shaders in background */
|
|
|
+ public parallelShaderCompile: {
|
|
|
+ MAX_SHADER_COMPILER_THREADS_KHR: number;
|
|
|
+ maxShaderCompilerThreadsKHR: (thread: number) => void;
|
|
|
+ COMPLETION_STATUS_KHR: number;
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
/** Interface defining initialization parameters for Engine class */
|
|
@@ -1349,6 +1355,13 @@
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ // Shader compiler threads
|
|
|
+ this._caps.parallelShaderCompile = this._gl.getExtension('KHR_parallel_shader_compile');
|
|
|
+ if (this._caps.parallelShaderCompile) {
|
|
|
+ const threads = this._gl.getParameter(this._caps.parallelShaderCompile.MAX_SHADER_COMPILER_THREADS_KHR);
|
|
|
+ this._caps.parallelShaderCompile.maxShaderCompilerThreadsKHR(threads);
|
|
|
+ }
|
|
|
+
|
|
|
// Depth Texture
|
|
|
if (this._webGLVersion > 1) {
|
|
|
this._caps.depthTextureExtension = true;
|
|
@@ -1376,6 +1389,7 @@
|
|
|
this._caps.vertexArrayObject = false;
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
// Instances count
|
|
|
if (this._webGLVersion > 1) {
|
|
|
this._caps.instancedArrays = true;
|
|
@@ -3305,6 +3319,24 @@
|
|
|
this.bindTransformFeedback(null);
|
|
|
}
|
|
|
|
|
|
+ shaderProgram.context = context;
|
|
|
+ shaderProgram.vertexShader = vertexShader;
|
|
|
+ shaderProgram.fragmentShader = fragmentShader;
|
|
|
+
|
|
|
+ if (!this._caps.parallelShaderCompile) {
|
|
|
+ this._finalizeProgram(shaderProgram);
|
|
|
+ } else {
|
|
|
+ shaderProgram.isParallelCompiled = true;
|
|
|
+ }
|
|
|
+
|
|
|
+ return shaderProgram;
|
|
|
+ }
|
|
|
+
|
|
|
+ private _finalizeProgram(shaderProgram: WebGLProgram) {
|
|
|
+ const context = shaderProgram.context!;
|
|
|
+ const vertexShader = shaderProgram.vertexShader!;
|
|
|
+ const fragmentShader = shaderProgram.fragmentShader!;
|
|
|
+
|
|
|
var linked = context.getProgramParameter(shaderProgram, context.LINK_STATUS);
|
|
|
|
|
|
if (!linked) {
|
|
@@ -3329,7 +3361,38 @@
|
|
|
context.deleteShader(vertexShader);
|
|
|
context.deleteShader(fragmentShader);
|
|
|
|
|
|
- return shaderProgram;
|
|
|
+ shaderProgram.context = undefined;
|
|
|
+ shaderProgram.vertexShader = undefined;
|
|
|
+ shaderProgram.fragmentShader = undefined;
|
|
|
+
|
|
|
+ if (shaderProgram.onCompiled) {
|
|
|
+ shaderProgram.onCompiled();
|
|
|
+ shaderProgram.onCompiled = undefined;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /** @hidden */
|
|
|
+ public _isProgramCompiled(shaderProgram: WebGLProgram): boolean {
|
|
|
+ if (!shaderProgram.isParallelCompiled) {
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (this._gl.getProgramParameter(shaderProgram, this._caps.parallelShaderCompile.COMPLETION_STATUS_KHR)) {
|
|
|
+ this._finalizeProgram(shaderProgram);
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+ /** @hidden */
|
|
|
+ public _executeWhenProgramIsCompiled(shaderProgram: WebGLProgram, action: () => void) {
|
|
|
+ if (!shaderProgram.isParallelCompiled) {
|
|
|
+ action();
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ shaderProgram.onCompiled = action;
|
|
|
}
|
|
|
|
|
|
/**
|