skia2/experimental/wasm-skp-debugger/gpu.js
Nathaniel Nifong 2e76c84b8b Use WebGL2, not EGL, and don't use replace clip op.
Change-Id: I9e6ae22a646b9cf1f3c20857ffc50ecafe66174a
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/414903
Reviewed-by: Kevin Lubick <kjlubick@google.com>
2021-06-02 17:00:19 +00:00

75 lines
2.9 KiB
JavaScript

// Adds compile-time JS functions to augment the DebuggerView interface.
// Specifically, anything that should only be on the GPU version of DebuggerView.
(function(DebuggerView){
function makeWebGLContext(canvas, attrs) {
// These defaults come from the emscripten _emscripten_webgl_create_context
// TODO(nifong): All these settings appear to be ignored. investigate.
var contextAttributes = {
alpha: 1,
depth: 1,
stencil: 0,
antialias: 1,
premultipliedAlpha: 1,
// for the zoom to be able to access the pixels. Incurs performance penalty
preserveDrawingBuffer: 1,
preferLowPowerToHighPerformance: 0,
failIfMajorPerformanceCaveat: 0,
majorVersion: 2,
minorVersion: 0,
enableExtensionsByDefault: 1,
explicitSwapControl: 0,
renderViaOffscreenBackBuffer: 0,
};
if (!canvas) {
console.log('null canvas passed into makeWebGLContext');
return 0;
}
// This check is from the emscripten version
if (contextAttributes['explicitSwapControl']) {
console.log('explicitSwapControl is not supported');
return 0;
}
// GL is an enscripten provided helper
// See https://github.com/emscripten-core/emscripten/blob/incoming/src/library_webgl.js
var context = GL.createContext(canvas, contextAttributes);
if (!context) {
console.log('Could not get a WebGL context from the canvas element.');
}
console.log('Made Web Gl Canvas Surface');
return context
}
DebuggerView.GetWebGLContext = function(canvas, attrs) {
return makeWebGLContext(canvas, attrs);
};
// canvas - a canvas element to use for this surface.
DebuggerView.MakeWebGLCanvasSurface = function(canvas) {
// we are ok with all the defaults
var ctx = DebuggerView.GetWebGLContext(canvas);
if (!ctx || ctx < 0) {
throw 'failed to create webgl context: err ' + ctx;
}
var grcontext = this.MakeGrContext(ctx);
if (!grcontext) {
throw (
'failed to create grcontext. Open GL driver may not support all needed functions: err '
+ grcontext);
}
// Maybe better to use clientWidth/height. See:
// https://webglfundamentals.org/webgl/lessons/webgl-anti-patterns.html
var surface = this.MakeOnScreenGLSurface(grcontext, canvas.width, canvas.height);
if (!surface) {
// Don't fall back silently in the debugger, the user explicitly controls which backend he
// wants via the UI. Calling function may catch this and show the user an error.
throw ('Failed to create OpenGL surface. GPU Backend unavailable.');
}
return surface;
};
// Default to trying WebGL first.
DebuggerView.MakeCanvasSurface = DebuggerView.MakeWebGLCanvasSurface;
}(Module)); // When this file is loaded in, the high level object is "Module";