Skip to content

Commit bfe1c30

Browse files
authored
Merge branch 'AcademySoftwareFoundation:main' into plugin_manager
2 parents d9db6a0 + ef1d56c commit bfe1c30

16 files changed

Lines changed: 171 additions & 30 deletions

File tree

.github/workflows/main.yml

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,7 @@ jobs:
7878
compiler_version: "16.4"
7979
python: 3.13
8080
test_shaders: ON
81+
test_render: ON
8182

8283
- name: MacOS_Xcode_26_Python313
8384
os: macos-26
@@ -229,6 +230,7 @@ jobs:
229230
python Scripts/generateshader.py ../resources/Materials/Examples/StandardSurface --target osl
230231
python Scripts/generateshader.py ../resources/Materials/Examples/StandardSurface --target mdl
231232
python Scripts/generateshader.py ../resources/Materials/Examples/StandardSurface --target msl
233+
python Scripts/generateshader.py ../resources/Materials/Examples/StandardSurface --target slang
232234
working-directory: python
233235

234236
- name: Shader Validation Tests (Windows)
@@ -265,25 +267,40 @@ jobs:
265267
fi
266268
cppcheck --project=build/compile_commands.json --error-exitcode=1 --suppress=normalCheckLevelMaxBranches --suppress=*:*/External/* --suppress=*:*/NanoGUI/*
267269
268-
- name: Initialize Virtual Framebuffer
270+
- name: Setup Rendering Environment (Linux)
269271
if: matrix.test_render == 'ON' && runner.os == 'Linux'
270272
run: |
271273
Xvfb :1 -screen 0 1280x960x24 &
272274
echo "DISPLAY=:1" >> $GITHUB_ENV
273275
echo "LIBGL_ALWAYS_SOFTWARE=1" >> $GITHUB_ENV
274276
277+
- name: Setup Rendering Environment (MacOS)
278+
if: matrix.test_render == 'ON' && runner.os == 'macOS'
279+
run: |
280+
# macOS can render headless with Metal backend without virtual display
281+
# Force software rendering for Metal backend (more reliable in CI)
282+
echo "MTL_HARDWARE_RENDERING=0" >> $GITHUB_ENV
283+
# Enable Metal debug layer for better debugging in CI
284+
echo "MTL_DEBUG_LAYER=1" >> $GITHUB_ENV
285+
echo "LIBGL_ALWAYS_SOFTWARE=1" >> $GITHUB_ENV
286+
275287
- name: Render Script Tests
276288
if: matrix.test_render == 'ON'
277289
run: |
278290
mkdir build/render
279291
python python/Scripts/baketextures.py resources/Materials/Examples/StandardSurface/standard_surface_brass_tiled.mtlx build/render/brass_average_baked.mtlx --average
280292
python python/Scripts/translateshader.py resources/Materials/Examples/StandardSurface/standard_surface_carpaint.mtlx build/render/usd_preview_surface_carpaint.mtlx UsdPreviewSurface --hdr
281293
282-
- name: Render Application Tests
294+
- name: Viewer Tests
283295
if: matrix.test_render == 'ON'
284296
run: |
285297
../installed/bin/MaterialXView --material brass_average_baked.mtlx --mesh ../../resources/Geometry/sphere.obj --screenWidth 128 --screenHeight 128 --cameraZoom 1.4 --shadowMap false --captureFilename Viewer_BrassAverage.png
286298
../installed/bin/MaterialXView --material usd_preview_surface_carpaint.mtlx --mesh ../../resources/Geometry/sphere.obj --screenWidth 128 --screenHeight 128 --cameraZoom 1.4 --shadowMap false --captureFilename Viewer_CarpaintTranslated.png
299+
working-directory: build/render
300+
301+
- name: Graph Editor Tests
302+
if: matrix.test_render == 'ON' && runner.os == 'Linux'
303+
run: |
287304
../installed/bin/MaterialXGraphEditor --material ../../resources/Materials/Examples/StandardSurface/standard_surface_marble_solid.mtlx --viewWidth 128 --viewHeight 128 --captureFilename GraphEditor_MarbleSolid.png
288305
working-directory: build/render
289306

javascript/MaterialXTest/browser/shaderGenerator.spec.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,8 @@ describe('Generate Shaders', function ()
5151
generators.push(mx.WgslShaderGenerator.create());
5252
if (typeof mx.MdlShaderGenerator != 'undefined')
5353
generators.push(mx.MdlShaderGenerator.create());
54+
if (typeof mx.SlangShaderGenerator != 'undefined')
55+
generators.push(mx.SlangShaderGenerator.create());
5456

5557
const elem = mx.findRenderableElement(doc);
5658
for (let gen of generators)

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/JsMaterialX/CMakeLists.txt

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ set(GENMSL ${CMAKE_CURRENT_SOURCE_DIR}/JsMaterialXGenMsl/)
88
set(GENVK ${CMAKE_CURRENT_SOURCE_DIR}/JsMaterialXGenVk/)
99
set(GENMDL ${CMAKE_CURRENT_SOURCE_DIR}/JsMaterialXGenMdl/)
1010
set(GENWGSL ${CMAKE_CURRENT_SOURCE_DIR}/JsMaterialXGenWgsl/)
11+
set(GENSLANG ${CMAKE_CURRENT_SOURCE_DIR}/JsMaterialXGenSlang/)
1112

1213
set(SOURCE_FOLDER ${PROJECT_SOURCE_DIR}/source)
1314

@@ -50,6 +51,7 @@ set(GENMSL_DEPS ${GENMSL}JsMslShaderGenerator.cpp)
5051
set(GENVK_DEPS ${GENVK}JsVkShaderGenerator.cpp)
5152
set(GENWGSL_DEPS ${GENWGSL}JsWgslShaderGenerator.cpp)
5253
set(GENMDL_DEPS ${GENMDL}JsMdlShaderGenerator.cpp)
54+
set(GENSLANG_DEPS ${GENSLANG}JsSlangShaderGenerator.cpp)
5355

5456
# Linker flags
5557
set(JS_LINK_FLAGS_CORE "")
@@ -114,6 +116,10 @@ if (MATERIALX_BUILD_GEN_MSL)
114116
message("JS: Building JsMaterialXGenShader with MSL support")
115117
target_sources(JsMaterialXGenShader PRIVATE ${GENMSL_DEPS})
116118
endif()
119+
if (MATERIALX_BUILD_GEN_SLANG)
120+
message("JS: Building JsMaterialXGenShader with Slang support")
121+
target_sources(JsMaterialXGenShader PRIVATE ${GENSLANG_DEPS})
122+
endif()
117123

118124
set_target_properties(JsMaterialXCore
119125
PROPERTIES
@@ -152,7 +158,10 @@ if (MATERIALX_BUILD_GEN_MDL)
152158
endif()
153159
if (MATERIALX_BUILD_GEN_MSL)
154160
target_link_libraries(JsMaterialXGenShader PUBLIC MaterialXGenMsl)
155-
endif()
161+
endif()
162+
if (MATERIALX_BUILD_GEN_SLANG)
163+
target_link_libraries(JsMaterialXGenShader PUBLIC MaterialXGenSlang)
164+
endif()
156165

157166
# Install the JavaScript output
158167
install(TARGETS JsMaterialXCore DESTINATION "JavaScript/MaterialX")
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
//
2+
// Copyright Contributors to the MaterialX Project
3+
// SPDX-License-Identifier: Apache-2.0
4+
//
5+
6+
#include <MaterialXGenSlang/SlangShaderGenerator.h>
7+
#include <MaterialXGenShader/Util.h>
8+
9+
#include <emscripten/bind.h>
10+
11+
namespace ems = emscripten;
12+
namespace mx = MaterialX;
13+
14+
namespace
15+
{
16+
// Creator wrapper to avoid having to expose the TypeSystem class in JavaScript
17+
mx::ShaderGeneratorPtr SlangShaderGenerator_create()
18+
{
19+
return mx::SlangShaderGenerator::create();
20+
}
21+
}
22+
23+
EMSCRIPTEN_BINDINGS(SlangShaderGenerator)
24+
{
25+
ems::class_<mx::SlangShaderGenerator, ems::base<mx::HwShaderGenerator>>("SlangShaderGenerator")
26+
.class_function("create", &SlangShaderGenerator_create);
27+
}

source/MaterialXFormat/File.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -185,7 +185,7 @@ FilePathVec FilePath::getFilesInDirectory(const string& extension) const
185185

186186
#if defined(_WIN32)
187187
WIN32_FIND_DATAA fd;
188-
FilePath query = extension.empty() ? *this : (*this / ("*." + extension));
188+
FilePath query = extension.empty() ? (*this / "*") : (*this / ("*." + extension));
189189
HANDLE hFind = FindFirstFileA(query.asString().c_str(), &fd);
190190
if (hFind != INVALID_HANDLE_VALUE)
191191
{

source/MaterialXGenOsl/CMakeLists.txt

Lines changed: 5 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,7 @@
1-
file(GLOB_RECURSE materialx_source
2-
"${CMAKE_CURRENT_SOURCE_DIR}/OslShaderGenerator.cpp"
3-
"${CMAKE_CURRENT_SOURCE_DIR}/OslSyntax.cpp"
4-
"${CMAKE_CURRENT_SOURCE_DIR}/OslNetworkShaderGenerator.cpp"
5-
"${CMAKE_CURRENT_SOURCE_DIR}/OslNetworkSyntax.cpp"
6-
"${CMAKE_CURRENT_SOURCE_DIR}/Nodes/OsoNode.cpp")
7-
8-
file(GLOB_RECURSE materialx_headers
9-
"${CMAKE_CURRENT_SOURCE_DIR}/OslShaderGenerator.h"
10-
"${CMAKE_CURRENT_SOURCE_DIR}/OslSyntax.h"
11-
"${CMAKE_CURRENT_SOURCE_DIR}/OslNetworkShaderGenerator.h"
12-
"${CMAKE_CURRENT_SOURCE_DIR}/OslNetworkSyntax.h"
13-
"${CMAKE_CURRENT_SOURCE_DIR}/Nodes/OsoNode.h"
14-
"${CMAKE_CURRENT_SOURCE_DIR}/Export.h")
1+
file(GLOB_RECURSE materialx_source "${CMAKE_CURRENT_SOURCE_DIR}/*.cpp")
2+
file(GLOB_RECURSE materialx_headers "${CMAKE_CURRENT_SOURCE_DIR}/*.h*")
3+
4+
list(REMOVE_ITEM materialx_source "${CMAKE_CURRENT_SOURCE_DIR}/LibsToOso.cpp")
155

166
mx_add_library(MaterialXGenOsl
177
SOURCE_FILES
@@ -25,7 +15,7 @@ mx_add_library(MaterialXGenOsl
2515
MATERIALX_GENOSL_EXPORTS)
2616

2717
# FIXME: LibsToOso has a dependency on the OslRenderer.
28-
if (MATERIALX_BUILD_RENDER)
18+
if (MATERIALX_BUILD_OSOS AND MATERIALX_BUILD_RENDER)
2919
file(GLOB GenNodes_SRC "${CMAKE_CURRENT_SOURCE_DIR}/LibsToOso.cpp")
3020

3121
set(MATERIALX_LIBRARIES

source/MaterialXGenOsl/LibsToOso.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -335,7 +335,7 @@ int main(int argc, char* const argv[])
335335
mx::NodeGraphPtr librariesDocGraph = librariesDoc->addNodeGraph("librariesDocGraph");
336336

337337
// Loop over all the `NodeDef` gathered in our documents from the provided libraries.
338-
for (const mx::NodeDefPtr& nodeDef : librariesDoc->getNodeDefs())
338+
for (mx::NodeDefPtr nodeDef : librariesDoc->getNodeDefs())
339339
{
340340
std::string nodeName = nodeDef->getName();
341341

@@ -364,7 +364,7 @@ int main(int argc, char* const argv[])
364364
}
365365

366366
// TODO: Check for the existence/validity of the `Node`?
367-
mx::NodePtr node = librariesDoc->addNodeInstance(nodeDef, nodeName);
367+
mx::NodePtr node = librariesDocGraph->addNodeInstance(nodeDef, nodeName);
368368

369369
std::string oslShaderName = node->getName();
370370
oslShaderGen->getSyntax().makeValidName(oslShaderName);

source/MaterialXGraphEditor/Main.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -202,6 +202,13 @@ int main(int argc, char* const argv[])
202202
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 0);
203203
#endif
204204

205+
// When captureFilename is specified, make window invisible
206+
// to avoid issues with headless rendering.
207+
if (!captureFilename.empty())
208+
{
209+
glfwWindowHint(GLFW_VISIBLE, GL_FALSE);
210+
}
211+
205212
// Create window with graphics context
206213
GLFWwindow* window = glfwCreateWindow(1280, 960, "MaterialX Graph Editor", NULL, NULL);
207214
if (!window)

source/MaterialXRenderOsl/OslRenderer.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ OslRendererPtr OslRenderer::create(unsigned int width, unsigned int height, Imag
2828
OslRenderer::OslRenderer(unsigned int width, unsigned int height, Image::BaseType baseType) :
2929
ShaderRenderer(width, height, baseType),
3030
_useTestRender(true),
31+
_useOSLCmdStr(false),
3132
_raysPerPixelLit(1),
3233
_raysPerPixelUnlit(1)
3334
{

0 commit comments

Comments
 (0)