Skip to content

Commit 27e5332

Browse files
chellmuthJoshuaSenoufMriganka Arya
authored andcommitted
Implement OSL command string code generator (AcademySoftwareFoundation#2575)
Co-authored-by: Joshua Senouf <joshua.senouf@gmail.com> Co-authored-by: Mriganka Arya <marya@imageworks.com>
1 parent 1ef82c8 commit 27e5332

File tree

26 files changed

+1750
-27
lines changed

26 files changed

+1750
-27
lines changed

CMakeLists.txt

Lines changed: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ option(MATERIALX_BUILD_DOCS "Create HTML documentation using Doxygen. Requires t
4040

4141
option(MATERIALX_BUILD_GEN_GLSL "Build the GLSL shader generator back-end." ON)
4242
option(MATERIALX_BUILD_GEN_OSL "Build the OSL shader generator back-end." ON)
43+
option(MATERIALX_BUILD_GEN_OSL_NODES "Build the OSL nodes shader generator back-end." ON)
4344
option(MATERIALX_BUILD_GEN_MDL "Build the MDL shader generator back-end." ON)
4445
option(MATERIALX_BUILD_GEN_MSL "Build the MSL shader generator back-end." ON)
4546
option(MATERIALX_BUILD_RENDER "Build the MaterialX Render modules." ON)
@@ -84,6 +85,7 @@ if (CMAKE_SYSTEM_NAME MATCHES "iOS" OR CMAKE_SYSTEM_NAME MATCHES "tvOS" OR CMAKE
8485
set(MATERIALX_BUILD_GRAPH_EDITOR OFF)
8586
set(MATERIALX_BUILD_GEN_GLSL OFF)
8687
set(MATERIALX_BUILD_GEN_OSL OFF)
88+
set(MATERIALX_BUILD_GEN_OSL_NODES OFF)
8789
set(MATERIALX_BUILD_GEN_MDL OFF)
8890
set(MATERIALX_BUILD_TESTS OFF)
8991
endif()
@@ -103,6 +105,7 @@ if (MATERIALX_BUILD_APPLE_FRAMEWORK)
103105
endif()
104106

105107
if (MATERIALX_BUILD_JS)
108+
set(MATERIALX_BUILD_GEN_OSL_NODES OFF)
106109
set(MATERIALX_BUILD_RENDER OFF)
107110
set(MATERIALX_BUILD_TESTS OFF)
108111
endif()
@@ -136,6 +139,12 @@ if(SKBUILD)
136139
set(MATERIALX_PYTHON_FOLDER_NAME "MaterialX")
137140
endif()
138141

142+
if (MATERIALX_BUILD_GEN_OSL_NODES)
143+
set(MATERIALX_BUILD_GEN_OSL ON)
144+
set(MATERIALX_BUILD_RENDER ON)
145+
set(MATERIALX_BUILD_RENDER_PLATFORMS ON)
146+
endif()
147+
139148
# Helpers for MDL validation
140149
if (MATERIALX_BUILD_GEN_MDL)
141150
set(MATERIALX_MDLC_EXECUTABLE "" CACHE FILEPATH "Full path to the mdlc binary.")
@@ -162,6 +171,7 @@ set(MATERIALX_LIBNAME_SUFFIX "" CACHE STRING "Specify a suffix to all libraries
162171
mark_as_advanced(MATERIALX_BUILD_DOCS)
163172
mark_as_advanced(MATERIALX_BUILD_GEN_GLSL)
164173
mark_as_advanced(MATERIALX_BUILD_GEN_OSL)
174+
mark_as_advanced(MATERIALX_BUILD_GEN_OSL_NODES)
165175
mark_as_advanced(MATERIALX_BUILD_GEN_MDL)
166176
mark_as_advanced(MATERIALX_BUILD_GEN_MSL)
167177
mark_as_advanced(MATERIALX_BUILD_RENDER)
@@ -215,7 +225,7 @@ endif()
215225

216226
# Allow the OSL CMake package to provide binary locations for render tests.
217227
# This will not override explicitly provided oslc, testrender, and include paths.
218-
if(MATERIALX_BUILD_RENDER AND MATERIALX_BUILD_GEN_OSL AND MATERIALX_BUILD_TESTS)
228+
if((MATERIALX_BUILD_RENDER AND MATERIALX_BUILD_GEN_OSL AND MATERIALX_BUILD_TESTS) OR MATERIALX_BUILD_GEN_OSL_NODES)
219229
find_package(OSL QUIET)
220230
if(OSL_FOUND)
221231
if(NOT MATERIALX_OSL_BINARY_OSLC)
@@ -225,6 +235,10 @@ if(MATERIALX_BUILD_RENDER AND MATERIALX_BUILD_GEN_OSL AND MATERIALX_BUILD_TESTS)
225235
# OSL does not yet export a CMake target for testrender.
226236
set(MATERIALX_OSL_BINARY_TESTRENDER $<TARGET_FILE_DIR:OSL::oslc>/testrender)
227237
endif()
238+
if(NOT MATERIALX_OSL_INCLUDE_PATH)
239+
# OSL does not yet export a CMake target for testrender.
240+
set(MATERIALX_OSL_INCLUDE_PATH $<TARGET_FILE_DIR:OSL::oslc>/../include)
241+
endif()
228242
endif()
229243
endif()
230244

@@ -244,6 +258,10 @@ if (MATERIALX_BUILD_GEN_MDL)
244258
add_definitions(-DMATERIALX_INSTALL_MDL_MODULE_PATH=\"${MATERIALX_INSTALL_MDL_MODULE_PATH}\")
245259
endif()
246260

261+
if (MATERIALX_BUILD_GEN_OSL_NODES)
262+
set(MATERIALX_BUILD_DATA_LIBRARY ON)
263+
endif()
264+
247265
# Adjust the default installation path
248266
if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT)
249267
set(CMAKE_INSTALL_PREFIX "${PROJECT_BINARY_DIR}/installed" CACHE PATH "Default install path" FORCE)
@@ -449,7 +467,7 @@ add_subdirectory(source/MaterialXFormat)
449467

450468
# Add shader generation subdirectories
451469
add_subdirectory(source/MaterialXGenShader)
452-
if(MATERIALX_BUILD_GEN_GLSL OR MATERIALX_BUILD_GEN_OSL OR MATERIALX_BUILD_GEN_MDL OR MATERIALX_BUILD_GEN_MSL)
470+
if(MATERIALX_BUILD_GEN_GLSL OR MATERIALX_BUILD_GEN_OSL OR MATERIALX_BUILD_GEN_OSL_NODES OR MATERIALX_BUILD_GEN_MDL OR MATERIALX_BUILD_GEN_MSL)
453471
if (MATERIALX_BUILD_GEN_GLSL)
454472
add_definitions(-DMATERIALX_BUILD_GEN_GLSL)
455473
add_subdirectory(source/MaterialXGenGlsl)
@@ -458,6 +476,10 @@ if(MATERIALX_BUILD_GEN_GLSL OR MATERIALX_BUILD_GEN_OSL OR MATERIALX_BUILD_GEN_MD
458476
add_definitions(-DMATERIALX_BUILD_GEN_OSL)
459477
add_subdirectory(source/MaterialXGenOsl)
460478
endif()
479+
if (MATERIALX_BUILD_GEN_OSL_NODES)
480+
add_definitions(-DMATERIALX_BUILD_GEN_OSL_NODES)
481+
add_subdirectory(source/MaterialXGenOslNodes)
482+
endif()
461483
if (MATERIALX_BUILD_GEN_MDL)
462484
add_definitions(-DMATERIALX_BUILD_GEN_MDL)
463485
add_subdirectory(source/MaterialXGenMdl)

libraries/CMakeLists.txt

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,33 @@ if(MATERIALX_BUILD_DATA_LIBRARY)
2828
add_custom_target(MaterialXBuildData ALL
2929
DEPENDS ${MATERIALX_DATA_LIBRARY_BUILD_FILES})
3030

31+
if (MATERIALX_BUILD_GEN_OSL_NODES AND MATERIALX_OSL_BINARY_OSLC)
32+
33+
set(OSO_BUILD_PATH ${CMAKE_CURRENT_BINARY_DIR}/DataLibraryBuild/targets/genoslnodes/osos)
34+
set(MTLX_BUILD_PATH ${CMAKE_CURRENT_BINARY_DIR}/DataLibraryBuild/targets/genoslnodes)
35+
36+
set(SENTINEL_FILE ${CMAKE_CURRENT_BINARY_DIR}/buildosos.sentinel)
37+
38+
add_custom_command(
39+
OUTPUT ${SENTINEL_FILE}
40+
COMMAND touch ${SENTINEL_FILE}
41+
COMMAND cmake -E make_directory ${OSO_BUILD_PATH}
42+
COMMAND cmake -E make_directory ${MTLX_BUILD_PATH}
43+
COMMAND MaterialXGenOslNodes_LibsToOso
44+
--outputOsoPath ${OSO_BUILD_PATH}
45+
--outputMtlxPath ${MTLX_BUILD_PATH}
46+
--oslCompilerPath ${MATERIALX_OSL_BINARY_OSLC}
47+
--oslIncludePath ${MATERIALX_OSL_INCLUDE_PATH}
48+
--libraryRelativeOsoPath libraries/targets/genoslnodes/osos
49+
--removeNdPrefix true
50+
DEPENDS ${MATERIALX_DATA_LIBRARY_SOURCE_FILES} MaterialXGenOslNodes_LibsToOso
51+
)
52+
53+
add_custom_target(MaterialXBuild_genoslnodes_buildOsos ALL DEPENDS ${SENTINEL_FILE})
54+
add_dependencies(MaterialXBuildData MaterialXBuild_genoslnodes_buildOsos)
55+
56+
endif()
57+
3158
set(DATA_LIBRARY_DIR ${DATA_LIBRARY_BUILD_DIR})
3259
else()
3360
set(DATA_LIBRARY_DIR ${CMAKE_CURRENT_SOURCE_DIR})

libraries/targets/genoslnodes.mtlx

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
<?xml version="1.0"?>
2+
<materialx version="1.39">
3+
4+
<!--
5+
Copyright Contributors to the MaterialX Project
6+
SPDX-License-Identifier: Apache-2.0
7+
-->
8+
9+
<!-- ======================================================================== -->
10+
<!-- Base target definition for OSL targets using shader generation. -->
11+
<!-- ======================================================================== -->
12+
<targetdef name="genoslnodes" />
13+
14+
</materialx>

python/Scripts/generateshader.py

100644100755
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,8 @@ def main():
9292
gentarget = opts.target
9393
if gentarget == 'osl':
9494
shadergen = mx_gen_osl.OslShaderGenerator.create()
95+
if gentarget == 'oslnodes':
96+
shadergen = mx_gen_osl.OslNodeShaderGenerator.create()
9597
elif gentarget == 'mdl':
9698
shadergen = mx_gen_mdl.MdlShaderGenerator.create()
9799
elif gentarget == 'essl':

resources/Materials/TestSuite/_options.mtlx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121

2222
<!-- Comma separated list of target" specifiers to indicate which
2323
code generators to use. -->
24-
<input name="targets" type="string" value="genglsl,genosl,genmdl,genessl,genmsl" />
24+
<input name="targets" type="string" value="genglsl,genosl,genoslnodes,genmdl,genessl,genmsl" />
2525

2626
<!-- Check the count of number of implementations used for a given generator -->
2727
<input name="checkImplCount" type="boolean" value="true" />

source/MaterialXGenOsl/OslShaderGenerator.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -223,7 +223,9 @@ ShaderPtr OslShaderGenerator::createShader(const string& name, ElementPtr elemen
223223
const auto& outputSockets = graph->getOutputSockets();
224224
const auto* singleOutput = outputSockets.size() == 1 ? outputSockets[0] : NULL;
225225

226-
const bool isSurfaceShaderOutput = singleOutput && singleOutput->getType() == Type::SURFACESHADER;
226+
const bool isSurfaceShaderOutput = context.getOptions().oslImplicitSurfaceShaderConversion
227+
&& singleOutput && singleOutput->getType() == Type::SURFACESHADER;
228+
227229
if (isSurfaceShaderOutput)
228230
{
229231
graph->inlineNodeBeforeOutput(outputSockets[0], "_surfacematerial_", "ND_surfacematerial", "surfaceshader", "out", context);
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
file(GLOB_RECURSE materialx_source
2+
"${CMAKE_CURRENT_SOURCE_DIR}/OslNodesShaderGenerator.cpp"
3+
"${CMAKE_CURRENT_SOURCE_DIR}/OslNodesSyntax.cpp"
4+
)
5+
file(GLOB_RECURSE materialx_headers "${CMAKE_CURRENT_SOURCE_DIR}/*.h*")
6+
7+
mx_add_library(MaterialXGenOslNodes
8+
SOURCE_FILES
9+
${materialx_source}
10+
HEADER_FILES
11+
${materialx_headers}
12+
MTLX_MODULES
13+
MaterialXGenShader
14+
MaterialXCore
15+
EXPORT_DEFINE
16+
MATERIALX_GENOSLNODES_EXPORTS)
17+
18+
19+
file(GLOB GenNodes_SRC "${CMAKE_CURRENT_SOURCE_DIR}/LibsToOso.cpp")
20+
21+
set(MATERIALX_LIBRARIES
22+
MaterialXCore
23+
MaterialXFormat
24+
MaterialXGenShader
25+
MaterialXGenOsl
26+
MaterialXRenderOsl)
27+
28+
add_executable(MaterialXGenOslNodes_LibsToOso ${GenNodes_SRC})
29+
30+
target_link_libraries(
31+
MaterialXGenOslNodes_LibsToOso
32+
${MATERIALX_LIBRARIES})
33+
34+
set_target_properties(
35+
MaterialXGenOslNodes_LibsToOso PROPERTIES
36+
INSTALL_RPATH "${MATERIALX_UP_ONE_RPATH}")
37+
38+
# TODO: We likely want to install that file elsewhere and not under `bin`,
39+
# if at all, as we maybe want to keep this executable available at build time only.
40+
install(TARGETS MaterialXGenOslNodes_LibsToOso
41+
EXPORT MaterialX
42+
RUNTIME DESTINATION ${MATERIALX_INSTALL_BIN_PATH})
43+
if(MSVC)
44+
install(FILES $<TARGET_PDB_FILE:MaterialXGenOslNodes_LibsToOso>
45+
DESTINATION ${MATERIALX_INSTALL_BIN_PATH} OPTIONAL)
46+
endif()
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
//
2+
// Copyright Contributors to the MaterialX Project
3+
// SPDX-License-Identifier: Apache-2.0
4+
//
5+
6+
#ifndef MATERIALX_GENOSLNODES_EXPORT_H
7+
#define MATERIALX_GENOSLNODES_EXPORT_H
8+
9+
#include <MaterialXCore/Library.h>
10+
11+
/// @file
12+
/// Macros for declaring imported and exported symbols.
13+
14+
#if defined(MATERIALX_GENOSLNODES_EXPORTS)
15+
#define MX_GENOSLNODES_API MATERIALX_SYMBOL_EXPORT
16+
#define MX_GENOSLNODES_EXTERN_TEMPLATE(...) MATERIALX_EXPORT_EXTERN_TEMPLATE(__VA_ARGS__)
17+
#else
18+
#define MX_GENOSLNODES_API MATERIALX_SYMBOL_IMPORT
19+
#define MX_GENOSLNODES_EXTERN_TEMPLATE(...) MATERIALX_IMPORT_EXTERN_TEMPLATE(__VA_ARGS__)
20+
#endif
21+
22+
#endif

0 commit comments

Comments
 (0)