xref: /aosp_15_r20/external/skia/modules/canvaskit/rt_shader.js (revision c8dee2aa9b3f27cf6c858bd81872bdeb2c07ed17)
1*c8dee2aaSAndroid Build Coastguard WorkerCanvasKit._extraInitializations = CanvasKit._extraInitializations || [];
2*c8dee2aaSAndroid Build Coastguard WorkerCanvasKit._extraInitializations.push(function() {
3*c8dee2aaSAndroid Build Coastguard Worker
4*c8dee2aaSAndroid Build Coastguard Worker  // sksl is the shader code.
5*c8dee2aaSAndroid Build Coastguard Worker  // errorCallback is a function that will be called with an error string if the
6*c8dee2aaSAndroid Build Coastguard Worker  // effect cannot be made. If not provided, the error will be logged.
7*c8dee2aaSAndroid Build Coastguard Worker  CanvasKit.RuntimeEffect.Make = function(sksl, errorCallback) {
8*c8dee2aaSAndroid Build Coastguard Worker    // The easiest way to pass a function into C++ code is to wrap it in an object and
9*c8dee2aaSAndroid Build Coastguard Worker    // treat it as an emscripten::val on the other side.
10*c8dee2aaSAndroid Build Coastguard Worker    var callbackObj = {
11*c8dee2aaSAndroid Build Coastguard Worker      'onError': errorCallback || function(err) {
12*c8dee2aaSAndroid Build Coastguard Worker        console.log('RuntimeEffect error', err);
13*c8dee2aaSAndroid Build Coastguard Worker      },
14*c8dee2aaSAndroid Build Coastguard Worker    };
15*c8dee2aaSAndroid Build Coastguard Worker    return CanvasKit.RuntimeEffect._Make(sksl, callbackObj);
16*c8dee2aaSAndroid Build Coastguard Worker  };
17*c8dee2aaSAndroid Build Coastguard Worker
18*c8dee2aaSAndroid Build Coastguard Worker  // sksl is the blender code.
19*c8dee2aaSAndroid Build Coastguard Worker  // errorCallback is a function that will be called with an error string if the
20*c8dee2aaSAndroid Build Coastguard Worker  // effect cannot be made. If not provided, the error will be logged.
21*c8dee2aaSAndroid Build Coastguard Worker  CanvasKit.RuntimeEffect.MakeForBlender = function(sksl, errorCallback) {
22*c8dee2aaSAndroid Build Coastguard Worker    // The easiest way to pass a function into C++ code is to wrap it in an object and
23*c8dee2aaSAndroid Build Coastguard Worker    // treat it as an emscripten::val on the other side.
24*c8dee2aaSAndroid Build Coastguard Worker    var callbackObj = {
25*c8dee2aaSAndroid Build Coastguard Worker      'onError': errorCallback || function(err) {
26*c8dee2aaSAndroid Build Coastguard Worker        console.log('RuntimeEffect error', err);
27*c8dee2aaSAndroid Build Coastguard Worker      },
28*c8dee2aaSAndroid Build Coastguard Worker    };
29*c8dee2aaSAndroid Build Coastguard Worker    return CanvasKit.RuntimeEffect._MakeForBlender(sksl, callbackObj);
30*c8dee2aaSAndroid Build Coastguard Worker  };
31*c8dee2aaSAndroid Build Coastguard Worker
32*c8dee2aaSAndroid Build Coastguard Worker  CanvasKit.RuntimeEffect.prototype.makeShader = function(floats, localMatrix) {
33*c8dee2aaSAndroid Build Coastguard Worker    // If the uniforms were set in a MallocObj, we don't want the shader to take ownership of
34*c8dee2aaSAndroid Build Coastguard Worker    // them (and free the memory when the shader is freed).
35*c8dee2aaSAndroid Build Coastguard Worker    var shouldOwnUniforms = !floats['_ck'];
36*c8dee2aaSAndroid Build Coastguard Worker    var fptr = copy1dArray(floats, 'HEAPF32');
37*c8dee2aaSAndroid Build Coastguard Worker    var localMatrixPtr = copy3x3MatrixToWasm(localMatrix);
38*c8dee2aaSAndroid Build Coastguard Worker    // Our array has 4 bytes per float, so be sure to account for that before
39*c8dee2aaSAndroid Build Coastguard Worker    // sending it over the wire.
40*c8dee2aaSAndroid Build Coastguard Worker    return this._makeShader(fptr, floats.length * 4, shouldOwnUniforms, localMatrixPtr);
41*c8dee2aaSAndroid Build Coastguard Worker  }
42*c8dee2aaSAndroid Build Coastguard Worker
43*c8dee2aaSAndroid Build Coastguard Worker  // childrenWithShaders is an array of other shaders (e.g. Image.makeShader())
44*c8dee2aaSAndroid Build Coastguard Worker  CanvasKit.RuntimeEffect.prototype.makeShaderWithChildren = function(floats, childrenShaders, localMatrix) {
45*c8dee2aaSAndroid Build Coastguard Worker    // If the uniforms were set in a MallocObj, we don't want the shader to take ownership of
46*c8dee2aaSAndroid Build Coastguard Worker    // them (and free the memory when the shader is freed).
47*c8dee2aaSAndroid Build Coastguard Worker    var shouldOwnUniforms = !floats['_ck'];
48*c8dee2aaSAndroid Build Coastguard Worker    var fptr = copy1dArray(floats, 'HEAPF32');
49*c8dee2aaSAndroid Build Coastguard Worker    var localMatrixPtr = copy3x3MatrixToWasm(localMatrix);
50*c8dee2aaSAndroid Build Coastguard Worker    var barePointers = [];
51*c8dee2aaSAndroid Build Coastguard Worker    for (var i = 0; i < childrenShaders.length; i++) {
52*c8dee2aaSAndroid Build Coastguard Worker      // childrenShaders are emscriptens smart pointer type. We want to get the bare pointer
53*c8dee2aaSAndroid Build Coastguard Worker      // and send that over the wire, so it can be re-wrapped as an sk_sp.
54*c8dee2aaSAndroid Build Coastguard Worker      barePointers.push(childrenShaders[i].$$.ptr);
55*c8dee2aaSAndroid Build Coastguard Worker    }
56*c8dee2aaSAndroid Build Coastguard Worker    var childrenPointers = copy1dArray(barePointers, 'HEAPU32');
57*c8dee2aaSAndroid Build Coastguard Worker    // Our array has 4 bytes per float, so be sure to account for that before
58*c8dee2aaSAndroid Build Coastguard Worker    // sending it over the wire.
59*c8dee2aaSAndroid Build Coastguard Worker    return this._makeShaderWithChildren(fptr, floats.length * 4, shouldOwnUniforms, childrenPointers,
60*c8dee2aaSAndroid Build Coastguard Worker                                        barePointers.length, localMatrixPtr);
61*c8dee2aaSAndroid Build Coastguard Worker  }
62*c8dee2aaSAndroid Build Coastguard Worker
63*c8dee2aaSAndroid Build Coastguard Worker  CanvasKit.RuntimeEffect.prototype.makeBlender = function(floats) {
64*c8dee2aaSAndroid Build Coastguard Worker    // If the uniforms were set in a MallocObj, we don't want the shader to take ownership of
65*c8dee2aaSAndroid Build Coastguard Worker    // them (and free the memory when the blender is freed).
66*c8dee2aaSAndroid Build Coastguard Worker    var shouldOwnUniforms = !floats['_ck'];
67*c8dee2aaSAndroid Build Coastguard Worker    var fptr = copy1dArray(floats, 'HEAPF32');
68*c8dee2aaSAndroid Build Coastguard Worker    return this._makeBlender(fptr, floats.length * 4, shouldOwnUniforms);
69*c8dee2aaSAndroid Build Coastguard Worker  }
70*c8dee2aaSAndroid Build Coastguard Worker});
71