Skip to content

Commit 65e06db

Browse files
committed
Add pybind11 bindings for Slang generator.
1 parent 6029ef4 commit 65e06db

6 files changed

Lines changed: 87 additions & 1 deletion

File tree

.github/workflows/main.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -229,6 +229,7 @@ jobs:
229229
python Scripts/generateshader.py ../resources/Materials/Examples/StandardSurface --target osl
230230
python Scripts/generateshader.py ../resources/Materials/Examples/StandardSurface --target mdl
231231
python Scripts/generateshader.py ../resources/Materials/Examples/StandardSurface --target msl
232+
python Scripts/generateshader.py ../resources/Materials/Examples/StandardSurface --target slang
232233
working-directory: python
233234

234235
- name: Shader Validation Tests (Windows)

python/Scripts/generateshader.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
import MaterialX.PyMaterialXGenMdl as mx_gen_mdl
1212
import MaterialX.PyMaterialXGenMsl as mx_gen_msl
1313
import MaterialX.PyMaterialXGenOsl as mx_gen_osl
14+
import MaterialX.PyMaterialXGenSlang as mx_gen_slang
1415
import MaterialX.PyMaterialXGenShader as mx_gen_shader
1516

1617
def validateCode(sourceCodeFile, codevalidator, codevalidatorArgs):
@@ -102,6 +103,8 @@ def main():
102103
shadergen = mx_gen_glsl.WgslShaderGenerator.create()
103104
elif gentarget == 'msl':
104105
shadergen = mx_gen_msl.MslShaderGenerator.create()
106+
elif gentarget == 'slang':
107+
shadergen = mx_gen_slang.SlangShaderGenerator.create()
105108
else:
106109
shadergen = mx_gen_glsl.GlslShaderGenerator.create()
107110

source/PyMaterialX/CMakeLists.txt

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ endif()
3737

3838
add_subdirectory(PyMaterialXCore)
3939
add_subdirectory(PyMaterialXFormat)
40-
if (MATERIALX_BUILD_GEN_GLSL OR MATERIALX_BUILD_GEN_OSL OR MATERIALX_BUILD_GEN_MDL OR MATERIALX_BUILD_GEN_MSL)
40+
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)
4141
add_subdirectory(PyMaterialXGenShader)
4242
if (MATERIALX_BUILD_GEN_GLSL)
4343
add_subdirectory(PyMaterialXGenGlsl)
@@ -51,6 +51,9 @@ if (MATERIALX_BUILD_GEN_GLSL OR MATERIALX_BUILD_GEN_OSL OR MATERIALX_BUILD_GEN_M
5151
if (MATERIALX_BUILD_GEN_MDL)
5252
add_subdirectory(PyMaterialXGenMdl)
5353
endif()
54+
if (MATERIALX_BUILD_GEN_SLANG)
55+
add_subdirectory(PyMaterialXGenSlang)
56+
endif()
5457
endif()
5558
if (MATERIALX_BUILD_RENDER)
5659
add_subdirectory(PyMaterialXRender)
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
file(GLOB pymaterialxgenslang_source "${CMAKE_CURRENT_SOURCE_DIR}/*.cpp")
2+
file(GLOB pymaterialxgenslang_headers "${CMAKE_CURRENT_SOURCE_DIR}/*.h")
3+
4+
pybind11_add_module(PyMaterialXGenSlang SHARED ${PYBIND11_MODULE_FLAGS} ${pymaterialxgenslang_source} ${pymaterialxgenslang_headers})
5+
6+
if(APPLE)
7+
set_target_properties(PyMaterialXGenSlang PROPERTIES CXX_VISIBILITY_PRESET "default")
8+
endif()
9+
10+
set_target_properties(
11+
PyMaterialXGenSlang
12+
PROPERTIES
13+
OUTPUT_NAME PyMaterialXGenSlang
14+
COMPILE_FLAGS "${EXTERNAL_COMPILE_FLAGS}"
15+
LINK_FLAGS "${EXTERNAL_LINK_FLAGS}"
16+
INSTALL_RPATH "${MATERIALX_UP_TWO_RPATH}"
17+
DEBUG_POSTFIX "${MATERIALX_PYTHON_DEBUG_POSTFIX}")
18+
19+
target_link_libraries(
20+
PyMaterialXGenSlang
21+
PUBLIC PyMaterialXGenShader
22+
MaterialXGenSlang
23+
PRIVATE ${CMAKE_DL_LIBS})
24+
25+
install(TARGETS PyMaterialXGenSlang
26+
DESTINATION "${MATERIALX_PYTHON_FOLDER_NAME}")
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
//
2+
// Copyright Contributors to the MaterialX Project
3+
// SPDX-License-Identifier: Apache-2.0
4+
//
5+
6+
#include <PyMaterialX/PyMaterialX.h>
7+
8+
namespace py = pybind11;
9+
10+
void bindPySlangShaderGenerator(py::module& mod);
11+
12+
PYBIND11_MODULE(PyMaterialXGenSlang, mod)
13+
{
14+
mod.doc() = "Shader generation using the Slang shading language.";
15+
16+
// PyMaterialXGenSlang depends on types defined in PyMaterialXGenShader
17+
PYMATERIALX_IMPORT_MODULE(PyMaterialXGenShader);
18+
19+
bindPySlangShaderGenerator(mod);
20+
}
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
//
2+
// Copyright Contributors to the MaterialX Project
3+
// SPDX-License-Identifier: Apache-2.0
4+
//
5+
6+
#include <PyMaterialX/PyMaterialX.h>
7+
8+
#include <MaterialXGenSlang/SlangShaderGenerator.h>
9+
#include <MaterialXGenShader/Shader.h>
10+
#include <MaterialXGenShader/ShaderGenerator.h>
11+
12+
namespace py = pybind11;
13+
namespace mx = MaterialX;
14+
15+
// Slang shader generator bindings
16+
17+
namespace
18+
{
19+
// Creator wrapper to avoid having to expose the TypeSystem class in python
20+
mx::ShaderGeneratorPtr SlangShaderGenerator_create()
21+
{
22+
return mx::SlangShaderGenerator::create();
23+
}
24+
}
25+
26+
void bindPySlangShaderGenerator(py::module& mod)
27+
{
28+
py::class_<mx::SlangShaderGenerator, mx::HwShaderGenerator, mx::SlangShaderGeneratorPtr>(mod, "SlangShaderGenerator")
29+
.def_static("create", &SlangShaderGenerator_create)
30+
.def("generate", &mx::SlangShaderGenerator::generate)
31+
.def("getTarget", &mx::SlangShaderGenerator::getTarget)
32+
.def("getVersion", &mx::SlangShaderGenerator::getVersion);
33+
}

0 commit comments

Comments
 (0)