Use external script to prepare OpenCL source.

This commit is contained in:
XMRig 2019-08-28 00:33:49 +07:00
parent 82696000e4
commit fcfb738ded
17 changed files with 2948 additions and 693 deletions

32
scripts/generate_cl.js Normal file
View file

@ -0,0 +1,32 @@
#!/usr/bin/env node
'use strict';
const fs = require('fs');
const path = require('path');
const { text2h, addIncludes } = require('./js/opencl');
const cwd = process.cwd();
function cn()
{
process.chdir(cwd);
process.chdir(path.resolve('src/backend/opencl/cl/cn'));
const cn = addIncludes('cryptonight.cl', [
'algorithm.cl',
'wolf-aes.cl',
'wolf-skein.cl',
'jh.cl',
'blake256.cl',
'groestl256.cl',
'fast_int_math_v2.cl',
'fast_div_heavy.cl'
]);
//fs.writeFileSync('cryptonight_gen.cl', cn);
fs.writeFileSync('cryptonight_cl.h', text2h(cn, 'xmrig', 'cryptonight_cl'));
}
cn();

72
scripts/js/opencl.js Normal file
View file

@ -0,0 +1,72 @@
'use strict';
const fs = require('fs');
function bin2h(buf, namespace, name)
{
const size = buf.byteLength;
let out = `#pragma once\n\nnamespace ${namespace} {\n\nstatic unsigned char ${name}[${size}] = {\n `;
let b = 32;
for (let i = 0; i < size; i++) {
out += `0x${buf.readUInt8(i).toString(16).padStart(2, '0')}${size - i > 1 ? ',' : ''}`;
if (--b === 0) {
b = 32;
out += '\n ';
}
}
out += `\n};\n\n} // namespace ${namespace}\n`;
return out;
}
function text2h(text, namespace, name)
{
const buf = Buffer.from(text);
const size = buf.byteLength;
let out = `#pragma once\n\nnamespace ${namespace} {\n\nstatic char ${name}[${size + 1}] = {\n `;
let b = 32;
for (let i = 0; i < size; i++) {
out += `0x${buf.readUInt8(i).toString(16).padStart(2, '0')},`;
if (--b === 0) {
b = 32;
out += '\n ';
}
}
out += '0x00';
out += `\n};\n\n} // namespace ${namespace}\n`;
return out;
}
function addInclude(input, name)
{
return input.replace(`#include "${name}"`, fs.readFileSync(name, 'utf8'));
}
function addIncludes(inputFileName, names)
{
let data = fs.readFileSync(inputFileName, 'utf8');
for (let name of names) {
data = addInclude(data, name);
}
return data;
}
module.exports.bin2h = bin2h;
module.exports.text2h = text2h;
module.exports.addInclude = addInclude;
module.exports.addIncludes = addIncludes;