소스 검색

Merge pull request #9129 from Popov72/fix-ie11-shader

Fix IE11 shader crash
David Catuhe 4 년 전
부모
커밋
9488e3d3f4

+ 3 - 1
src/Engines/Processors/iShaderProcessor.ts

@@ -1,3 +1,5 @@
+declare type ThinEngine = import("../thinEngine").ThinEngine;
+
 /** @hidden */
 export interface IShaderProcessor {
     attributeProcessor?: (attribute: string) => string;
@@ -7,5 +9,5 @@ export interface IShaderProcessor {
     endOfUniformBufferProcessor?: (closingBracketLine: string, isFragment: boolean) => string;
     lineProcessor?: (line: string, isFragment: boolean) => string;
     preProcessor?: (code: string, defines: string[], isFragment: boolean) => string;
-    postProcessor?: (code: string, defines: string[], isFragment: boolean) => string;
+    postProcessor?: (code: string, defines: string[], isFragment: boolean, engine: ThinEngine) => string;
 }

+ 5 - 4
src/Engines/Processors/shaderProcessor.ts

@@ -14,15 +14,16 @@ declare type WebRequest = import("../../Misc/webRequest").WebRequest;
 declare type LoadFileError = import("../../Misc/fileTools").LoadFileError;
 declare type IOfflineProvider = import("../../Offline/IOfflineProvider").IOfflineProvider;
 declare type IFileRequest  = import("../../Misc/fileRequest").IFileRequest;
+declare type ThinEngine = import("../thinEngine").ThinEngine;
 
 const regexSE = /defined\s*?\((.+?)\)/g;
 const regexSERevert = /defined\s*?\[(.+?)\]/g;
 
 /** @hidden */
 export class ShaderProcessor {
-    public static Process(sourceCode: string, options: ProcessingOptions, callback: (migratedCode: string) => void) {
+    public static Process(sourceCode: string, options: ProcessingOptions, callback: (migratedCode: string) => void, engine: ThinEngine) {
         this._ProcessIncludes(sourceCode, options, (codeWithIncludes) => {
-            let migratedCode = this._ProcessShaderConversion(codeWithIncludes, options);
+            let migratedCode = this._ProcessShaderConversion(codeWithIncludes, options, engine);
             callback(migratedCode);
         });
     }
@@ -253,7 +254,7 @@ export class ShaderProcessor {
         return preprocessors;
     }
 
-    private static _ProcessShaderConversion(sourceCode: string, options: ProcessingOptions): string {
+    private static _ProcessShaderConversion(sourceCode: string, options: ProcessingOptions, engine: ThinEngine): string {
 
         var preparedSourceCode = this._ProcessPrecision(sourceCode, options);
 
@@ -279,7 +280,7 @@ export class ShaderProcessor {
 
         // Post processing
         if (options.processor.postProcessor) {
-            preparedSourceCode = options.processor.postProcessor(preparedSourceCode, defines, options.isFragment);
+            preparedSourceCode = options.processor.postProcessor(preparedSourceCode, defines, options.isFragment, engine);
         }
 
         return preparedSourceCode;

+ 18 - 0
src/Engines/WebGL/webGLShaderProcessors.ts

@@ -0,0 +1,18 @@
+import { IShaderProcessor } from '../Processors/iShaderProcessor';
+
+import { ThinEngine } from '../thinEngine';
+
+/** @hidden */
+export class WebGLShaderProcessor implements IShaderProcessor {
+    public postProcessor(code: string, defines: string[], isFragment: boolean, engine: ThinEngine) {
+
+        // Remove extensions
+        if (!engine.getCaps().drawBuffersExtension) {
+            // even if enclosed in #if/#endif, IE11 does parse the #extension declaration, so we need to remove it altogether
+            var regex = /#extension.+GL_EXT_draw_buffers.+(enable|require)/g;
+            code = code.replace(regex, "");
+        }
+
+        return code;
+    }
+}

+ 3 - 0
src/Engines/thinEngine.ts

@@ -17,6 +17,7 @@ import { DataBuffer } from '../Meshes/dataBuffer';
 import { IFileRequest } from '../Misc/fileRequest';
 import { Logger } from '../Misc/logger';
 import { DomManagement } from '../Misc/domManagement';
+import { WebGLShaderProcessor } from './WebGL/webGLShaderProcessors';
 import { WebGL2ShaderProcessor } from './WebGL/webGL2ShaderProcessors';
 import { WebGLDataBuffer } from '../Meshes/WebGL/webGLDataBuffer';
 import { IPipelineContext } from './IPipelineContext';
@@ -702,6 +703,8 @@ export class ThinEngine {
         // Shader processor
         if (this.webGLVersion > 1) {
             this._shaderProcessor = new WebGL2ShaderProcessor();
+        } else {
+            this._shaderProcessor = new WebGLShaderProcessor();
         }
 
         // Detect if we are running on a faulty buggy OS.

+ 2 - 2
src/Materials/effect.ts

@@ -297,8 +297,8 @@ export class Effect implements IDisposable {
                             migratedFragmentCode = processFinalCode("fragment", migratedFragmentCode);
                         }
                         this._useFinalCode(migratedVertexCode, migratedFragmentCode, baseName);
-                    });
-                });
+                    }, this._engine);
+                }, this._engine);
             });
         });
     }