From b2a9cee6f1d68b6009cefcfad26ec617e00d1d48 Mon Sep 17 00:00:00 2001 From: Daniel Hritzkiv Date: Tue, 31 Dec 2019 01:22:20 -0500 Subject: [PATCH 1/5] Make gl context aware See https://github.com/nodejs/node/pull/29631 https://github.com/electron/electron/issues/18397 --- src/native/bindings.cc | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/native/bindings.cc b/src/native/bindings.cc index 44a640a6..0e316f85 100644 --- a/src/native/bindings.cc +++ b/src/native/bindings.cc @@ -488,4 +488,8 @@ NAN_MODULE_INIT(Init) { Nan::Export(target, "setError", WebGLRenderingContext::SetError); } +#if NODE_MAJOR_VERSION >= 10 +NAN_MODULE_WORKER_ENABLED(webgl, Init) +#else NODE_MODULE(webgl, Init) +#endif From de3c4af281c2d9e26abad69dd937ca429e8534ef Mon Sep 17 00:00:00 2001 From: Daniel Hritzkiv Date: Tue, 7 Jan 2020 01:12:16 -0500 Subject: [PATCH 2/5] Test context-aware module --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index da538df8..b89ec61c 100644 --- a/package.json +++ b/package.json @@ -11,7 +11,7 @@ "node": ">=8.0.0" }, "scripts": { - "test": "standard | snazzy && tape test/*.js | faucet", + "test": "standard | snazzy && node --force-context-aware ./node_modules/.bin/tape test/*.js | faucet", "rebuild": "node-gyp rebuild --verbose", "prebuild": "prebuild --all --strip", "install": "prebuild-install || node-gyp rebuild" From 8dbcf6b1863f25ec2f86e2b6567f474dc9fdfe13 Mon Sep 17 00:00:00 2001 From: Daniel Hritzkiv Date: Wed, 8 Jan 2020 02:15:20 -0500 Subject: [PATCH 3/5] Add context-aware test --- test/context-aware-module.js | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 test/context-aware-module.js diff --git a/test/context-aware-module.js b/test/context-aware-module.js new file mode 100644 index 00000000..2d6d10cb --- /dev/null +++ b/test/context-aware-module.js @@ -0,0 +1,33 @@ +'use strict' + +var tape = require('tape') + +tape('context-aware-module', function (t) { + + const createContext1 = require('..'); + const { NativeWebGL: NativeWebGL1 } = require("../src/javascript/native-gl"); + + const gl1 = createContext1(16, 16); + + t.assert(gl1, "gl context returned"); + + gl1.destroy(); + NativeWebGL1.cleanup(); + + delete require.cache[require.resolve('..')]; + delete require.cache[require.resolve('../src/javascript/node-index')]; + delete require.cache[require.resolve('../src/javascript/native-gl')]; + delete require.cache[require.resolve('../build/Debug/webgl.node')]; + delete require.cache[require.resolve('../build/Release/webgl.node')]; + + const createContext2 = require('..'); + const { NativeWebGL: NativeWebGL2 } = require("../src/javascript/native-gl"); + + const gl2 = createContext2(16, 16); + + t.assert(NativeWebGL1 !== NativeWebGL2); + t.assert(createContext1 !== createContext2); + t.assert(gl2, "gl context returned"); + + t.end() +}) From 6825ff79b20815e9504938cef23381f39a01488a Mon Sep 17 00:00:00 2001 From: Daniel Hritzkiv Date: Wed, 8 Jan 2020 02:18:57 -0500 Subject: [PATCH 4/5] Add basic worker test loads the package in both main thread and worker thread. demonstrates two ways of running gl with worker threads - in series, or in parallel. The parallel segfaults currently --- test/util/worker.js | 45 +++++++++++++++++++++++++++++++++++++++++++++ test/worker.js | 38 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 83 insertions(+) create mode 100644 test/util/worker.js create mode 100644 test/worker.js diff --git a/test/util/worker.js b/test/util/worker.js new file mode 100644 index 00000000..1d968ec7 --- /dev/null +++ b/test/util/worker.js @@ -0,0 +1,45 @@ +const { + Worker, isMainThread, parentPort, workerData +} = require('worker_threads'); + +if (isMainThread) { + const createContext = require('../..'); + + gl(1, 1); + + module.exports = function (dimension) { + return new Promise((resolve, reject) => { + const worker = new Worker(__filename, { + workerData: dimension, + }); + + worker.on('message', resolve); + + worker.on('error', reject); + + worker.on('exit', (code) => { + if (code !== 0) { + reject(new Error(`Worker stopped with exit code ${code}`)); + } + }); + }); + }; +} else { + const createContext = require('../..'); + const dimension = workerData; + + const width = dimension; + const height = dimension; + + const gl = createContext(width, height); + + gl.clearColor(0, 1, 0, 0.5) + gl.clear(gl.COLOR_BUFFER_BIT) + + var pixels = new Uint8Array(width * height * 4) + gl.readPixels(0, 0, width, height, gl.RGBA, gl.UNSIGNED_BYTE, pixels) + + gl.destroy() + + parentPort.postMessage(pixels); +} diff --git a/test/worker.js b/test/worker.js new file mode 100644 index 00000000..d11717c9 --- /dev/null +++ b/test/worker.js @@ -0,0 +1,38 @@ +'use strict' + +var tape = require('tape') +var glWorker = require("./util/worker"); + +tape('worker - serial', async function (t) { + const jobsData = [1, 2, 3]; + + t.plan(jobsData.length); + + const results = []; + + for (const data of jobsData) { + const result = await glWorker(data); + + results.push(result); + } + + for (const [index, data] of jobsData.entries()) { + t.equal(results[index].length, data * data * 4); + } + + t.end() +}) + +tape('worker - parallel', async function (t) { + const jobsData = [1, 2, 3]; + + t.plan(jobsData.length); + + const results = await Promise.all(jobsData.map(e => glWorker(e))); + + for (const [index, data] of jobsData.entries()) { + t.equal(results[index].length, data * data * 4); + } + + t.end() +}) From fcd536e700c1fbb7531d81ec39070fa409652f2e Mon Sep 17 00:00:00 2001 From: Daniel Hritzkiv Date: Wed, 8 Jan 2020 02:19:37 -0500 Subject: [PATCH 5/5] Remove --force-context-aware of node for tests --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index b89ec61c..da538df8 100644 --- a/package.json +++ b/package.json @@ -11,7 +11,7 @@ "node": ">=8.0.0" }, "scripts": { - "test": "standard | snazzy && node --force-context-aware ./node_modules/.bin/tape test/*.js | faucet", + "test": "standard | snazzy && tape test/*.js | faucet", "rebuild": "node-gyp rebuild --verbose", "prebuild": "prebuild --all --strip", "install": "prebuild-install || node-gyp rebuild"