Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .github/workflows/main.yml
Original file line number Diff line number Diff line change
Expand Up @@ -230,6 +230,7 @@ jobs:
python Scripts/generateshader.py ../resources/Materials/Examples/StandardSurface --target osl
python Scripts/generateshader.py ../resources/Materials/Examples/StandardSurface --target mdl
python Scripts/generateshader.py ../resources/Materials/Examples/StandardSurface --target msl
python Scripts/generateshader.py ../resources/Materials/Examples/StandardSurface --target slang
working-directory: python

- name: Shader Validation Tests (Windows)
Expand Down
2 changes: 2 additions & 0 deletions javascript/MaterialXTest/browser/shaderGenerator.spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,8 @@ describe('Generate Shaders', function ()
generators.push(mx.WgslShaderGenerator.create());
if (typeof mx.MdlShaderGenerator != 'undefined')
generators.push(mx.MdlShaderGenerator.create());
if (typeof mx.SlangShaderGenerator != 'undefined')
generators.push(mx.SlangShaderGenerator.create());

const elem = mx.findRenderableElement(doc);
for (let gen of generators)
Expand Down
3 changes: 3 additions & 0 deletions python/Scripts/generateshader.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
import MaterialX.PyMaterialXGenMdl as mx_gen_mdl
import MaterialX.PyMaterialXGenMsl as mx_gen_msl
import MaterialX.PyMaterialXGenOsl as mx_gen_osl
import MaterialX.PyMaterialXGenSlang as mx_gen_slang
import MaterialX.PyMaterialXGenShader as mx_gen_shader

def validateCode(sourceCodeFile, codevalidator, codevalidatorArgs):
Expand Down Expand Up @@ -102,6 +103,8 @@ def main():
shadergen = mx_gen_glsl.WgslShaderGenerator.create()
elif gentarget == 'msl':
shadergen = mx_gen_msl.MslShaderGenerator.create()
elif gentarget == 'slang':
shadergen = mx_gen_slang.SlangShaderGenerator.create()
else:
shadergen = mx_gen_glsl.GlslShaderGenerator.create()

Expand Down
11 changes: 10 additions & 1 deletion source/JsMaterialX/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ set(GENMSL ${CMAKE_CURRENT_SOURCE_DIR}/JsMaterialXGenMsl/)
set(GENVK ${CMAKE_CURRENT_SOURCE_DIR}/JsMaterialXGenVk/)
set(GENMDL ${CMAKE_CURRENT_SOURCE_DIR}/JsMaterialXGenMdl/)
set(GENWGSL ${CMAKE_CURRENT_SOURCE_DIR}/JsMaterialXGenWgsl/)
set(GENSLANG ${CMAKE_CURRENT_SOURCE_DIR}/JsMaterialXGenSlang/)

set(SOURCE_FOLDER ${PROJECT_SOURCE_DIR}/source)

Expand Down Expand Up @@ -50,6 +51,7 @@ set(GENMSL_DEPS ${GENMSL}JsMslShaderGenerator.cpp)
set(GENVK_DEPS ${GENVK}JsVkShaderGenerator.cpp)
set(GENWGSL_DEPS ${GENWGSL}JsWgslShaderGenerator.cpp)
set(GENMDL_DEPS ${GENMDL}JsMdlShaderGenerator.cpp)
set(GENSLANG_DEPS ${GENSLANG}JsSlangShaderGenerator.cpp)

# Linker flags
set(JS_LINK_FLAGS_CORE "")
Expand Down Expand Up @@ -114,6 +116,10 @@ if (MATERIALX_BUILD_GEN_MSL)
message("JS: Building JsMaterialXGenShader with MSL support")
target_sources(JsMaterialXGenShader PRIVATE ${GENMSL_DEPS})
endif()
if (MATERIALX_BUILD_GEN_SLANG)
message("JS: Building JsMaterialXGenShader with Slang support")
target_sources(JsMaterialXGenShader PRIVATE ${GENSLANG_DEPS})
endif()

set_target_properties(JsMaterialXCore
PROPERTIES
Expand Down Expand Up @@ -152,7 +158,10 @@ if (MATERIALX_BUILD_GEN_MDL)
endif()
if (MATERIALX_BUILD_GEN_MSL)
target_link_libraries(JsMaterialXGenShader PUBLIC MaterialXGenMsl)
endif()
endif()
if (MATERIALX_BUILD_GEN_SLANG)
target_link_libraries(JsMaterialXGenShader PUBLIC MaterialXGenSlang)
endif()

# Install the JavaScript output
install(TARGETS JsMaterialXCore DESTINATION "JavaScript/MaterialX")
Expand Down
27 changes: 27 additions & 0 deletions source/JsMaterialX/JsMaterialXGenSlang/JsSlangShaderGenerator.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
//
// Copyright Contributors to the MaterialX Project
// SPDX-License-Identifier: Apache-2.0
//

#include <MaterialXGenSlang/SlangShaderGenerator.h>
#include <MaterialXGenShader/Util.h>

#include <emscripten/bind.h>

namespace ems = emscripten;
namespace mx = MaterialX;

namespace
{
// Creator wrapper to avoid having to expose the TypeSystem class in JavaScript
mx::ShaderGeneratorPtr SlangShaderGenerator_create()
{
return mx::SlangShaderGenerator::create();
}
}

EMSCRIPTEN_BINDINGS(SlangShaderGenerator)
{
ems::class_<mx::SlangShaderGenerator, ems::base<mx::HwShaderGenerator>>("SlangShaderGenerator")
.class_function("create", &SlangShaderGenerator_create);
}
5 changes: 4 additions & 1 deletion source/PyMaterialX/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ endif()

add_subdirectory(PyMaterialXCore)
add_subdirectory(PyMaterialXFormat)
if (MATERIALX_BUILD_GEN_GLSL OR MATERIALX_BUILD_GEN_OSL OR MATERIALX_BUILD_GEN_MDL OR MATERIALX_BUILD_GEN_MSL)
if (MATERIALX_BUILD_GEN_GLSL OR MATERIALX_BUILD_GEN_OSL OR MATERIALX_BUILD_GEN_MDL OR MATERIALX_BUILD_GEN_MSL OR MATERIALX_BUILD_GEN_SLANG)
add_subdirectory(PyMaterialXGenShader)
if (MATERIALX_BUILD_GEN_GLSL)
add_subdirectory(PyMaterialXGenGlsl)
Expand All @@ -51,6 +51,9 @@ if (MATERIALX_BUILD_GEN_GLSL OR MATERIALX_BUILD_GEN_OSL OR MATERIALX_BUILD_GEN_M
if (MATERIALX_BUILD_GEN_MDL)
add_subdirectory(PyMaterialXGenMdl)
endif()
if (MATERIALX_BUILD_GEN_SLANG)
add_subdirectory(PyMaterialXGenSlang)
endif()
endif()
if (MATERIALX_BUILD_RENDER)
add_subdirectory(PyMaterialXRender)
Expand Down
26 changes: 26 additions & 0 deletions source/PyMaterialX/PyMaterialXGenSlang/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
file(GLOB pymaterialxgenslang_source "${CMAKE_CURRENT_SOURCE_DIR}/*.cpp")
file(GLOB pymaterialxgenslang_headers "${CMAKE_CURRENT_SOURCE_DIR}/*.h")

pybind11_add_module(PyMaterialXGenSlang SHARED ${PYBIND11_MODULE_FLAGS} ${pymaterialxgenslang_source} ${pymaterialxgenslang_headers})

if(APPLE)
set_target_properties(PyMaterialXGenSlang PROPERTIES CXX_VISIBILITY_PRESET "default")
endif()

set_target_properties(
PyMaterialXGenSlang
PROPERTIES
OUTPUT_NAME PyMaterialXGenSlang
COMPILE_FLAGS "${EXTERNAL_COMPILE_FLAGS}"
LINK_FLAGS "${EXTERNAL_LINK_FLAGS}"
INSTALL_RPATH "${MATERIALX_UP_TWO_RPATH}"
DEBUG_POSTFIX "${MATERIALX_PYTHON_DEBUG_POSTFIX}")

target_link_libraries(
PyMaterialXGenSlang
PUBLIC PyMaterialXGenShader
MaterialXGenSlang
PRIVATE ${CMAKE_DL_LIBS})

install(TARGETS PyMaterialXGenSlang
DESTINATION "${MATERIALX_PYTHON_FOLDER_NAME}")
20 changes: 20 additions & 0 deletions source/PyMaterialX/PyMaterialXGenSlang/PyModule.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
//
// Copyright Contributors to the MaterialX Project
// SPDX-License-Identifier: Apache-2.0
//

#include <PyMaterialX/PyMaterialX.h>

namespace py = pybind11;

void bindPySlangShaderGenerator(py::module& mod);

PYBIND11_MODULE(PyMaterialXGenSlang, mod)
{
mod.doc() = "Shader generation using the Slang shading language.";

// PyMaterialXGenSlang depends on types defined in PyMaterialXGenShader
PYMATERIALX_IMPORT_MODULE(PyMaterialXGenShader);

bindPySlangShaderGenerator(mod);
}
33 changes: 33 additions & 0 deletions source/PyMaterialX/PyMaterialXGenSlang/PySlangShaderGenerator.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
//
// Copyright Contributors to the MaterialX Project
// SPDX-License-Identifier: Apache-2.0
//

#include <PyMaterialX/PyMaterialX.h>

#include <MaterialXGenSlang/SlangShaderGenerator.h>
#include <MaterialXGenShader/Shader.h>
#include <MaterialXGenShader/ShaderGenerator.h>

namespace py = pybind11;
namespace mx = MaterialX;

// Slang shader generator bindings

namespace
{
// Creator wrapper to avoid having to expose the TypeSystem class in python
mx::ShaderGeneratorPtr SlangShaderGenerator_create()
{
return mx::SlangShaderGenerator::create();
}
}

void bindPySlangShaderGenerator(py::module& mod)
{
py::class_<mx::SlangShaderGenerator, mx::HwShaderGenerator, mx::SlangShaderGeneratorPtr>(mod, "SlangShaderGenerator")
.def_static("create", &SlangShaderGenerator_create)
.def("generate", &mx::SlangShaderGenerator::generate)
.def("getTarget", &mx::SlangShaderGenerator::getTarget)
.def("getVersion", &mx::SlangShaderGenerator::getVersion);
}