Files
SDL3CPlusPlus/MaterialX/javascript/MaterialXTest/browser/shaderGenerator.spec.js
2026-01-06 21:02:41 +00:00

105 lines
4.3 KiB
JavaScript
Executable File

// MaterialX is served through a script tag in the test setup.
function createStandardSurfaceMaterial(mx)
{
const doc = mx.createDocument();
const ssName = 'SR_default';
const ssNode = doc.addChildOfCategory('standard_surface', ssName);
ssNode.setType('surfaceshader');
const smNode = doc.addChildOfCategory('surfacematerial', 'Default');
smNode.setType('material');
const shaderElement = smNode.addInput('surfaceshader');
shaderElement.setType('surfaceshader');
shaderElement.setNodeName(ssName);
expect(doc.validate()).to.be.true;
return doc;
}
describe('Generate Shaders', function ()
{
let mx;
const canvas = document.createElement('canvas');
const gl = canvas.getContext('webgl2');
this.timeout(60000);
before(async function ()
{
mx = await MaterialX();
});
it('Compile Shaders', () =>
{
const doc = createStandardSurfaceMaterial(mx);
const generators = []
if (typeof mx.EsslShaderGenerator != 'undefined')
generators.push(new mx.EsslShaderGenerator());
if (typeof mx.GlslShaderGenerator != 'undefined')
generators.push(new mx.GlslShaderGenerator());
if (typeof mx.MslShaderGenerator != 'undefined')
generators.push(new mx.MslShaderGenerator());
if (typeof mx.OslShaderGenerator != 'undefined')
generators.push(new mx.OslShaderGenerator());
if (typeof mx.VkShaderGenerator != 'undefined')
generators.push(new mx.VkShaderGenerator());
if (typeof mx.MdlShaderGenerator != 'undefined')
generators.push(new mx.MdlShaderGenerator());
const elem = mx.findRenderableElement(doc);
for (let gen of generators)
{
console.log("Generating shader for " + gen.getTarget() + "...");
const genContext = new mx.GenContext(gen);
const stdlib = mx.loadStandardLibraries(genContext);
doc.importLibrary(stdlib);
try
{
const mxShader = gen.generate(elem.getNamePath(), elem, genContext);
const fShader = mxShader.getSourceCode("pixel");
if (gen.getTarget() == 'essl')
{
const vShader = mxShader.getSourceCode("vertex");
const glVertexShader = gl.createShader(gl.VERTEX_SHADER);
gl.shaderSource(glVertexShader, vShader);
gl.compileShader(glVertexShader);
if (!gl.getShaderParameter(glVertexShader, gl.COMPILE_STATUS))
{
console.error("-------- VERTEX SHADER FAILED TO COMPILE: ----------------");
console.error("--- VERTEX SHADER LOG ---");
console.error(gl.getShaderInfoLog(glVertexShader));
console.error("--- VERTEX SHADER START ---");
console.error(fShader);
console.error("--- VERTEX SHADER END ---");
}
expect(gl.getShaderParameter(glVertexShader, gl.COMPILE_STATUS)).to.equal(true);
const glPixelShader = gl.createShader(gl.FRAGMENT_SHADER);
gl.shaderSource(glPixelShader, fShader);
gl.compileShader(glPixelShader);
if (!gl.getShaderParameter(glPixelShader, gl.COMPILE_STATUS))
{
console.error("-------- PIXEL SHADER FAILED TO COMPILE: ----------------");
console.error("--- PIXEL SHADER LOG ---");
console.error(gl.getShaderInfoLog(glPixelShader));
console.error("--- PIXEL SHADER START ---");
console.error(fShader);
console.error("--- PIXEL SHADER END ---");
}
expect(gl.getShaderParameter(glPixelShader, gl.COMPILE_STATUS)).to.equal(true);
}
}
catch (errPtr)
{
console.error("-------- Failed code generation: ----------------");
console.error(mx.getExceptionMessage(errPtr));
}
}
});
});