| // Adds compile-time JS functions to augment the CanvasKit interface. | |
| // Specifically, anything that should only be on the WebGL version of canvaskit. | |
| // Functions in this file are supplemented by cpu.js. | |
| (function(CanvasKit){ | |
| CanvasKit._extraInitializations = CanvasKit._extraInitializations || []; | |
| CanvasKit._extraInitializations.push(function() { | |
| CanvasKit.MakeGPUDeviceContext = function(device) { | |
| if (!device) { | |
| return null; | |
| } | |
| // This allows native code to access this device by calling | |
| // `emscripten_webgpu_get_device().` | |
| CanvasKit.preinitializedWebGPUDevice = device; | |
| var context = this._MakeGrContext(); | |
| context._device = device; | |
| return context; | |
| }; | |
| CanvasKit.MakeGPUCanvasContext = function(devCtx, canvas, opts) { | |
| var canvasCtx = canvas.getContext('webgpu'); | |
| if (!canvasCtx) { | |
| return null; | |
| } | |
| let format = (opts && opts.format) ? opts.format : navigator.gpu.getPreferredCanvasFormat(); | |
| // GPUCanvasConfiguration | |
| canvasCtx.configure({ | |
| device: devCtx._device, | |
| format: format, | |
| alphaMode: (opts && opts.alphaMode) ? opts.alphaMode : undefined, | |
| }); | |
| var context = { | |
| '_inner': canvasCtx, | |
| '_deviceContext': devCtx, | |
| '_textureFormat': format, | |
| }; | |
| context['requestAnimationFrame'] = function(callback) { | |
| requestAnimationFrame(function() { | |
| const surface = CanvasKit.MakeGPUCanvasSurface(context); | |
| if (!surface) { | |
| console.error('Failed to initialize Surface for current canvas swapchain texture'); | |
| return; | |
| } | |
| callback(surface.getCanvas()); | |
| surface.flush(); | |
| surface.dispose(); | |
| }); | |
| }; | |
| return context; | |
| }; | |
| CanvasKit.MakeGPUCanvasSurface = function(canvasCtx, colorSpace, width, height) { | |
| let context = canvasCtx._inner; | |
| if (!width) { | |
| width = context.canvas.width; | |
| } | |
| if (!height) { | |
| height = context.canvas.height; | |
| } | |
| let surface = this.MakeGPUTextureSurface(canvasCtx._deviceContext, | |
| context.getCurrentTexture(), | |
| canvasCtx._textureFormat, | |
| width, height, colorSpace); | |
| surface._canvasContext = canvasCtx; | |
| return surface; | |
| }; | |
| CanvasKit.MakeGPUTextureSurface = function (devCtx, texture, textureFormat, width, height, colorSpace) { | |
| colorSpace = colorSpace || null; | |
| // JsValStore and WebGPU are objects in Emscripten's library_html5_webgpu.js utility | |
| // library. JsValStore allows a WebGPU object to be imported by native code by calling the | |
| // various `emscripten_webgpu_import_*` functions. | |
| // | |
| // The CanvasKit WASM module is responsible for removing entries from the value store by | |
| // calling `emscripten_webgpu_release_js_handle` after importing the object. | |
| // | |
| // (see | |
| // https://github.com/emscripten-core/emscripten/blob/0e63f74f36b06849ef1c777b130783a43316ade0/src/library_html5_webgpu.js | |
| // for reference) | |
| return this._MakeGPUTextureSurface( | |
| devCtx, | |
| this.JsValStore.add(texture), | |
| this.WebGPU.TextureFormat.indexOf(textureFormat), | |
| width, height, | |
| colorSpace); | |
| }; | |
| CanvasKit.Surface.prototype.assignCurrentSwapChainTexture = function() { | |
| // This feature is only supported for a Surface that was created via MakeGPUCanvasSurface. | |
| if (!this._canvasContext) { | |
| console.log('Surface is not bound to a canvas context'); | |
| return false; | |
| } | |
| let ctx = this._canvasContext._inner; | |
| return this._replaceBackendTexture( | |
| CanvasKit.JsValStore.add(ctx.getCurrentTexture()), | |
| CanvasKit.WebGPU.TextureFormat.indexOf(this._canvasContext._textureFormat), | |
| ctx.canvas.width, ctx.canvas.height); | |
| }; | |
| CanvasKit.Surface.prototype.requestAnimationFrame = function(callback, dirtyRect) { | |
| if (!this.reportBackendTypeIsGPU()) { | |
| return this._requestAnimationFrameInternal(callback, dirtyRect); | |
| } | |
| return requestAnimationFrame(function() { | |
| // Replace the render target of the Surface with the current swapchain surface if this is | |
| // bound to a canvas context. | |
| if (this._canvasContext && !this.assignCurrentSwapChainTexture()) { | |
| console.log('failed to replace GPU backend texture'); | |
| return; | |
| } | |
| callback(this.getCanvas()); | |
| this.flush(dirtyRect); | |
| }.bind(this)); | |
| }; | |
| CanvasKit.Surface.prototype.drawOnce = function(callback, dirtyRect) { | |
| if (!this.reportBackendTypeIsGPU()) { | |
| this._drawOnceInternal(callback, dirtyRect); | |
| return; | |
| } | |
| requestAnimationFrame(function() { | |
| // Replace the render target of the Surface with the current swapchain surface if this is | |
| // bound to a canvas context. | |
| if (this._canvasContext && !this.assignCurrentSwapChainTexture()) { | |
| console.log('failed to replace GPU backend texture'); | |
| return; | |
| } | |
| callback(this.getCanvas()); | |
| this.flush(dirtyRect); | |
| this.dispose(); | |
| }.bind(this)); | |
| }; | |
| }); | |
| }(Module)); // When this file is loaded in, the high level object is "Module". |