• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1// Adds compile-time JS functions to augment the DebuggerView interface.
2// Specifically, anything that should only be on the GPU version of DebuggerView.
3(function(DebuggerView){
4    function makeWebGLContext(canvas, attrs) {
5      // These defaults come from the emscripten _emscripten_webgl_create_context
6      // TODO(nifong): All these settings appear to be ignored. investigate.
7      var contextAttributes = {
8        alpha: 1,
9        depth: 1,
10        stencil: 0,
11        antialias: 1,
12        premultipliedAlpha: 1,
13        // for the zoom to be able to access the pixels. Incurs performance penalty
14        preserveDrawingBuffer: 1,
15        preferLowPowerToHighPerformance: 0,
16        failIfMajorPerformanceCaveat: 0,
17        majorVersion: 1,
18        minorVersion: 0,
19        enableExtensionsByDefault: 1,
20        explicitSwapControl: 0,
21        renderViaOffscreenBackBuffer: 0,
22      };
23      if (!canvas) {
24        console.log('null canvas passed into makeWebGLContext');
25        return 0;
26      }
27      // This check is from the emscripten version
28      if (contextAttributes['explicitSwapControl']) {
29        console.log('explicitSwapControl is not supported');
30        return 0;
31      }
32      // GL is an enscripten provided helper
33      // See https://github.com/emscripten-core/emscripten/blob/incoming/src/library_webgl.js
34      var context = GL.createContext(canvas, contextAttributes);
35      if (!context) {
36        console.log('Could not get a WebGL context from the canvas element.');
37      }
38      console.log('Made Web Gl Canvas Surface');
39      return context
40    }
41
42    DebuggerView.GetWebGLContext = function(canvas, attrs) {
43      return makeWebGLContext(canvas, attrs);
44    };
45
46    // canvas - a canvas element to use for this surface.
47    DebuggerView.MakeWebGLCanvasSurface = function(canvas) {
48      // we are ok with all the defaults
49      var ctx = DebuggerView.GetWebGLContext(canvas);
50
51      if (!ctx || ctx < 0) {
52        throw 'failed to create webgl context: err ' + ctx;
53      }
54
55      var grcontext = this.MakeGrContext(ctx);
56      if (!grcontext) {
57        throw (
58          'failed to create grcontext. Open GL driver may not support all needed functions: err '
59          + grcontext);
60      }
61
62      // Maybe better to use clientWidth/height.  See:
63      // https://webglfundamentals.org/webgl/lessons/webgl-anti-patterns.html
64      var surface = this.MakeOnScreenGLSurface(grcontext, canvas.width, canvas.height);
65      if (!surface) {
66        // Don't fall back silently in the debugger, the user explicitly controls which backend he
67        // wants via the UI. Calling function may catch this and show the user an error.
68        throw ('Failed to create OpenGL surface. GPU Backend unavailable.');
69      }
70      return surface;
71    };
72    // Default to trying WebGL first.
73    DebuggerView.MakeCanvasSurface = DebuggerView.MakeWebGLCanvasSurface;
74}(Module)); // When this file is loaded in, the high level object is "Module";
75