From f1870d7602c04282a9a6ef3c73b1d55520132b05 Mon Sep 17 00:00:00 2001 From: Fazli Sapuan Date: Sat, 23 Jan 2016 21:05:48 +0800 Subject: [PATCH 1/2] Regex Glsl --- src/js-regex.js | 139 ++++++++++++++++++++++++++++++++ test/html/basic_sum_gpu_AB.html | 31 +++++++ test/src/basic_sum_AB.js | 9 +++ 3 files changed, 179 insertions(+) create mode 100644 src/js-regex.js create mode 100644 test/html/basic_sum_gpu_AB.html diff --git a/src/js-regex.js b/src/js-regex.js new file mode 100644 index 00000000..a66801df --- /dev/null +++ b/src/js-regex.js @@ -0,0 +1,139 @@ +var GPU_regex = (function() { + String.prototype.replaceAll = function (find, replace) { + var str = this; + return str.replace(new RegExp(find, 'g'), replace); + }; + + webCLGL = new WebCLGL(); + + function clone(obj) { + if(obj === null || typeof(obj) !== 'object' || 'isActiveClone' in obj) + return obj; + + var temp = obj.constructor(); // changed + + for(var key in obj) { + if(Object.prototype.hasOwnProperty.call(obj, key)) { + obj['isActiveClone'] = null; + temp[key] = clone(obj[key]); + delete obj['isActiveClone']; + } + } + + return temp; + } + + var STRIP_COMMENTS = /((\/\/.*$)|(\/\*[\s\S]*?\*\/))/mg; + var ARGUMENT_NAMES = /([^\s,]+)/g; + function getParamNames(func) { + var fnStr = func.toString().replace(STRIP_COMMENTS, ''); + var result = fnStr.slice(fnStr.indexOf('(')+1, fnStr.indexOf(')')).match(ARGUMENT_NAMES); + if(result === null) + result = []; + return result; + } + + /// Does simple validation of the provided function string if it is a function + /// this is a basic sanity testing before Jison conversion + /// + /// @param funcStr the input function string + /// + /// @returns boolean + function validateStringIsFunction( funcStr ) { + if( funcStr != null ) { + return (funcStr.slice(0, "function".length).toLowerCase() == "function") + } + return false;; + } + + /// Does the core conversion of a basic Javascript function into a webclgl + /// and returns a callable function if valid + /// + /// @param inputFunction The calling to perform the conversion + /// @param _threadDim The thread dim array configuration + /// @param _blockDim The block dim array configuration + /// @param paramObj The parameter object + /// + /// @returns callable function if converted, else returns null + function regex( inputFunction, _threadDim, _blockDim ) { + var threadDim = clone(_threadDim); + var blockDim = clone(_blockDim); + + while (threadDim.length < 3) { + threadDim.push(1); + } + + while (blockDim.length < 3) { + blockDim.push(1); + } + + var globalDim = [ + threadDim[0] * blockDim[0], + threadDim[1] * blockDim[1], + threadDim[2] * blockDim[2] + ]; + + var totalSize = globalDim[0] * globalDim[1] * globalDim[2]; + + var funcStr = inputFunction.toString(); + var funcBody = funcStr.toString().match(/function[^{]+\{([\s\S]*)\}$/)[1]; + + funcBody = funcBody.replaceAll('var ', 'float '); + funcBody = funcBody.replaceAll('this.thread.x', '_x_'); + funcBody = funcBody.replaceAll('return ', 'out_float = '); + + var argNames = getParamNames(inputFunction); + + var shaderCode = 'void main('; + for (var i=0; i + + + + GPU.JS : Basic Sum GPU AB + + + + + + + + + + + + + + + + + + + + +
+
+ + + + diff --git a/test/src/basic_sum_AB.js b/test/src/basic_sum_AB.js index f63ae322..9cae539e 100644 --- a/test/src/basic_sum_AB.js +++ b/test/src/basic_sum_AB.js @@ -23,3 +23,12 @@ QUnit.test( "basic_sum_AB (GPU)", function( assert ) { QUnit.test( "basic_sum_AB (CPU)", function( assert ) { basic_sum_AB_test(assert, "cpu"); }); + +/* +// EXAMPLE GLSL +void main(float* a, float* b) { + vec2 _x_ = get_global_id(); + float ret = a[_x_] + b[_x_]; + out_float = ret; +} + */ From 81f1541e09269bbeabd5c4306ee607df2d3eaa89 Mon Sep 17 00:00:00 2001 From: Matthew Saw Date: Sat, 23 Jan 2016 21:26:29 +0800 Subject: [PATCH 2/2] added ast parsing for for stmt, normal stmt and assignment expression --- src/js-to-webclgl.js | 39 ++++++++++++++++++++++++++++++++++++++- 1 file changed, 38 insertions(+), 1 deletion(-) diff --git a/src/js-to-webclgl.js b/src/js-to-webclgl.js index 4c0c39a4..76b87839 100644 --- a/src/js-to-webclgl.js +++ b/src/js-to-webclgl.js @@ -50,7 +50,44 @@ var GPU_jsToWebclgl = (function() { function ast_FunctionExpression(ast, retArr) { return retArr; } - + + /// Prases the abstract syntax tree, genericially to its respective function + /// + /// @param ast the AST object to parse + /// + /// @returns the prased openclgl string + function ast_ForStatement(forNode, retArr) { + if (forNode.type != "ForStatement") { + throw "error"; + } + retArr.push("for ("); + ast_generic(forNode.init, retArr); + ast_generic(forNode.test, retArr); + ast_generic(forNode.update, retArr); + retArr.push(")"); + ast_generic(forNode.body, retArr); + return retArr; + } + + function ast_ExpressionStatement(expNode, retArr) { + if (expNode.type != "ExpressionStatement") { + throw "error"; + } + ast_generic(expNode.expression, retArr); + retArr.push(";"); + return retArr; + } + + function ast_AssignmentExpression(assNode, retArr) { + if (assNode.type != "AssignmentExpression") { + throw "error"; + } + + retArr.push("float"); + ast_generic(assNode.left, retArr); + retArr.push(assNode.operator); + ast_generic(assNode.right, retArr); + } /// Does the core conversion of a basic Javascript function into a webclgl /// and returns a callable function if valid