diff --git a/src/example_common/README.md b/src/example_common/README.md new file mode 100644 index 0000000000..0c6d535ec6 --- /dev/null +++ b/src/example_common/README.md @@ -0,0 +1,12 @@ + + +# Shared code for the example renderers + +`testshade` and `testrender` are separate examples of OSL integration. Both +need the render state and free-function renderer services in this directory. +Their OptiX paths also use the CUDA renderer library in `cuda/`. + +Each example compiles the shared sources into its own LLVM bitcode and PTX. +There is no library target to link: the generated code is embedded in each +executable, and each executable installs PTX under its existing filename. diff --git a/src/testrender/cuda/rend_lib.cu b/src/example_common/cuda/rend_lib.cu similarity index 100% rename from src/testrender/cuda/rend_lib.cu rename to src/example_common/cuda/rend_lib.cu diff --git a/src/testrender/cuda/rend_lib.h b/src/example_common/cuda/rend_lib.h similarity index 98% rename from src/testrender/cuda/rend_lib.h rename to src/example_common/cuda/rend_lib.h index 40c848799e..337bca30b8 100644 --- a/src/testrender/cuda/rend_lib.h +++ b/src/example_common/cuda/rend_lib.h @@ -9,9 +9,6 @@ #include #include -#include "../raytracer.h" - - OSL_NAMESPACE_BEGIN diff --git a/src/testshade/render_state.h b/src/example_common/render_state.h similarity index 94% rename from src/testshade/render_state.h rename to src/example_common/render_state.h index 29079f3247..284a0adf56 100644 --- a/src/testshade/render_state.h +++ b/src/example_common/render_state.h @@ -4,6 +4,12 @@ #pragma once +#include +#include +#include + +#include + #include #include diff --git a/src/testshade/rs_simplerend.cpp b/src/example_common/rs_simplerend.cpp similarity index 100% rename from src/testshade/rs_simplerend.cpp rename to src/example_common/rs_simplerend.cpp diff --git a/src/testshade/rs_strdecls.h b/src/example_common/rs_strdecls.h similarity index 95% rename from src/testshade/rs_strdecls.h rename to src/example_common/rs_strdecls.h index f078dd334b..b25fe9add8 100644 --- a/src/testshade/rs_strdecls.h +++ b/src/example_common/rs_strdecls.h @@ -1,3 +1,4 @@ +// Copyright Contributors to the Open Shading Language project. // SPDX-License-Identifier: BSD-3-Clause // https://github.com/AcademySoftwareFoundation/OpenShadingLanguage diff --git a/src/testrender/CMakeLists.txt b/src/testrender/CMakeLists.txt index 4e6e428b8a..1d24868cc7 100644 --- a/src/testrender/CMakeLists.txt +++ b/src/testrender/CMakeLists.txt @@ -3,6 +3,8 @@ # https://github.com/AcademySoftwareFoundation/OpenShadingLanguage # The 'testrender' executable +set (example_common_dir "${PROJECT_SOURCE_DIR}/src/example_common") + set (testrender_srcs shading.cpp simpleraytracer.cpp @@ -13,20 +15,25 @@ set (testrender_srcs find_package(Threads REQUIRED) if (OSL_USE_OPTIX) + # NVCC_COMPILE and MAKE_CUDA_BITCODE use custom commands rather than the + # target's include directories. + list (APPEND OSL_CUDA_INCLUDE_DIRS "${PROJECT_SOURCE_DIR}/src") list (APPEND testrender_srcs optixraytracer.cpp) set (testrender_cuda_srcs cuda/optix_raytracer.cu ) set (testrender_rend_lib_srcs - cuda/rend_lib.cu - ../testshade/rs_simplerend.cpp + "${example_common_dir}/cuda/rend_lib.cu" + "${example_common_dir}/rs_simplerend.cpp" ) # We need to make sure that the PTX files are regenerated whenever these # files change. set (testrender_cuda_headers - cuda/rend_lib.h + "${example_common_dir}/cuda/rend_lib.h" + "${example_common_dir}/render_state.h" + "${example_common_dir}/rs_strdecls.h" background.h optics.h render_params.h @@ -36,6 +43,10 @@ if (OSL_USE_OPTIX) shading.cpp simpleraytracer.cpp ) + list (APPEND exec_headers + "${example_common_dir}/cuda/rend_lib.h" + "${example_common_dir}/render_state.h" + "${example_common_dir}/rs_strdecls.h") # Generate PTX for all of the CUDA files foreach (cudasrc ${testrender_cuda_srcs}) @@ -77,7 +88,8 @@ endif () add_executable (testrender ${testrender_srcs}) -target_include_directories (testrender BEFORE PRIVATE ${OpenImageIO_INCLUDES}) +target_include_directories (testrender BEFORE PRIVATE + ${OpenImageIO_INCLUDES} "${PROJECT_SOURCE_DIR}/src") target_link_libraries (testrender PRIVATE diff --git a/src/testrender/cuda/optix_raytracer.cu b/src/testrender/cuda/optix_raytracer.cu index c102d25dc3..04988d3b1d 100644 --- a/src/testrender/cuda/optix_raytracer.cu +++ b/src/testrender/cuda/optix_raytracer.cu @@ -8,15 +8,16 @@ #include +#include "example_common/cuda/rend_lib.h" +#include "example_common/render_state.h" #include "optix_raytracer.h" -#include "rend_lib.h" -#include "../background.h" -#include "../bvh.h" -#include "../raytracer.h" -#include "../render_params.h" -#include "../sampling.h" -#include "../shading.cpp" +#include "testrender/background.h" +#include "testrender/bvh.h" +#include "testrender/raytracer.h" +#include "testrender/render_params.h" +#include "testrender/sampling.h" +#include "testrender/shading.cpp" #include @@ -312,6 +313,6 @@ __raygen__deferred() // We need to pull in the definition of SimpleRaytracer::subpixel_radiance(), // which is shared between the host and CUDA renderers. -#include "../simpleraytracer.cpp" +#include "testrender/simpleraytracer.cpp" //------------------------------------------------------------------------------ diff --git a/src/testrender/cuda/optix_raytracer.h b/src/testrender/cuda/optix_raytracer.h index 9f27886456..ad54cb1154 100644 --- a/src/testrender/cuda/optix_raytracer.h +++ b/src/testrender/cuda/optix_raytracer.h @@ -3,10 +3,10 @@ #include #include -#include "../background.h" -#include "../raytracer.h" -#include "../sampling.h" -#include "rend_lib.h" +#include "example_common/cuda/rend_lib.h" +#include "testrender/background.h" +#include "testrender/raytracer.h" +#include "testrender/sampling.h" #include diff --git a/src/testrender/raytracer.h b/src/testrender/raytracer.h index a8a9845c8f..eb5dd345af 100644 --- a/src/testrender/raytracer.h +++ b/src/testrender/raytracer.h @@ -9,7 +9,6 @@ #include -#include "../testshade/render_state.h" #include "optix_compat.h" #include "render_params.h" #include @@ -21,10 +20,6 @@ # include // from CUDA #endif -#ifdef __CUDACC__ -# include "cuda/rend_lib.h" -#endif - // The primitives don't included the intersection routines, etc., from the // versions in testrender, since those operations are performed on the GPU. // diff --git a/src/testshade/CMakeLists.txt b/src/testshade/CMakeLists.txt index 12e1745a18..69f3765211 100644 --- a/src/testshade/CMakeLists.txt +++ b/src/testshade/CMakeLists.txt @@ -3,6 +3,11 @@ # https://github.com/AcademySoftwareFoundation/OpenShadingLanguage # The 'testshade' executable +set (example_common_dir "${PROJECT_SOURCE_DIR}/src/example_common") +list (APPEND exec_headers + "${example_common_dir}/render_state.h" + "${example_common_dir}/rs_strdecls.h") + set ( testshade_srcs testshade.cpp simplerend.cpp ) @@ -13,29 +18,35 @@ if (OSL_BUILD_BATCHED) endif() if (OSL_USE_OPTIX) + # NVCC_COMPILE and MAKE_CUDA_BITCODE use custom commands rather than the + # target's include directories. + list (APPEND OSL_CUDA_INCLUDE_DIRS "${PROJECT_SOURCE_DIR}/src") list (APPEND testshade_srcs optixgridrender.cpp) set ( testshade_cuda_srcs cuda/optix_grid_renderer.cu ) set (testshade_rend_lib_srcs - ../testrender/cuda/rend_lib.cu - rs_simplerend.cpp + "${example_common_dir}/cuda/rend_lib.cu" + "${example_common_dir}/rs_simplerend.cpp" ) set ( testshade_cuda_headers - ../testrender/cuda/rend_lib.h - ../testrender/raytracer.h + "${example_common_dir}/cuda/rend_lib.h" + "${example_common_dir}/render_state.h" + "${example_common_dir}/rs_strdecls.h" ) + list (APPEND exec_headers "${example_common_dir}/cuda/rend_lib.h") # We need to make sure that the PTX files are regenerated whenever these # headers change. set ( extra_cuda_headers - render_params.h ) + render_params.h + ${testshade_cuda_headers} ) # Generate PTX for all of the CUDA files foreach (cudasrc ${testshade_cuda_srcs}) - NVCC_COMPILE ( ${cudasrc} ${extra_cuda_headers} ptx_generated "-I../testrender/cuda" "") + NVCC_COMPILE ( ${cudasrc} "${extra_cuda_headers}" ptx_generated "" "") list (APPEND ptx_list ${ptx_generated}) endforeach () @@ -65,10 +76,11 @@ if (OSL_USE_OPTIX) endif() set ( rs_srcs - rs_simplerend.cpp ) + "${example_common_dir}/rs_simplerend.cpp" ) set(include_dirs ${CMAKE_CURRENT_SOURCE_DIR}) list(APPEND include_dirs ${CMAKE_SOURCE_DIR}/src/include) +list(APPEND include_dirs ${PROJECT_SOURCE_DIR}/src) list(APPEND include_dirs ${CMAKE_BINARY_DIR}/include) list(APPEND include_dirs ${IMATH_INCLUDES}) list(APPEND include_dirs ${OpenImageIO_INCLUDES}) @@ -77,7 +89,8 @@ EMBED_LLVM_BITCODE_IN_CPP ( "${rs_srcs}" "_host" "testshade_llvm_compiled_rs" te add_executable ( testshade ${testshade_srcs} testshademain.cpp ) -target_include_directories (testshade BEFORE PRIVATE ${OpenImageIO_INCLUDES}) +target_include_directories (testshade BEFORE PRIVATE + ${OpenImageIO_INCLUDES} "${PROJECT_SOURCE_DIR}/src") target_link_libraries (testshade PRIVATE @@ -120,7 +133,8 @@ if (NOT CODECOV) target_link_libraries (libtestshade PRIVATE oslexec oslquery oslcomp) - target_include_directories (libtestshade BEFORE PRIVATE ${OpenImageIO_INCLUDES}) + target_include_directories (libtestshade BEFORE PRIVATE + ${OpenImageIO_INCLUDES} "${PROJECT_SOURCE_DIR}/src") set_target_properties (libtestshade PROPERTIES PREFIX "") install_targets ( libtestshade ) diff --git a/src/testshade/cuda/optix_grid_renderer.cu b/src/testshade/cuda/optix_grid_renderer.cu index fe5d45a5ee..a71b968372 100644 --- a/src/testshade/cuda/optix_grid_renderer.cu +++ b/src/testshade/cuda/optix_grid_renderer.cu @@ -7,7 +7,8 @@ #include -#include "rend_lib.h" +#include "example_common/cuda/rend_lib.h" +#include "example_common/render_state.h" #include "render_params.h" @@ -80,7 +81,8 @@ __raygen__() uint3 launch_dims = optixGetLaunchDimensions(); uint3 launch_index = optixGetLaunchIndex(); - auto sbtdata = reinterpret_cast(optixGetSbtDataPointer()); + auto sbtdata = reinterpret_cast( + optixGetSbtDataPointer()); const float invw = render_params.invw; const float invh = render_params.invh; @@ -130,7 +132,7 @@ __raygen__() sg.backfacing = 0; // NB: These variables are not used in the current iteration of the sample - sg.raytype = OSL::Ray::CAMERA; + sg.raytype = 1; // "camera" is the first default OSL ray type. sg.flipHandedness = 0; sg.shader2common = reinterpret_cast(render_params.shader2common); diff --git a/src/testshade/simplerend.cpp b/src/testshade/simplerend.cpp index 6cd25b55b9..6591de3dc1 100644 --- a/src/testshade/simplerend.cpp +++ b/src/testshade/simplerend.cpp @@ -19,7 +19,7 @@ namespace RS { namespace Strings { #define RS_STRDECL(str, var_name) const OSL::ustring var_name { str }; -#include "rs_strdecls.h" +#include "example_common/rs_strdecls.h" #undef RS_STRDECL } // namespace Strings } // namespace RS @@ -33,7 +33,7 @@ namespace { namespace Hashes { #define RS_STRDECL(str, var_name) \ constexpr OSL::ustringhash var_name(OSL::strhash(str)); -#include "rs_strdecls.h" +#include "example_common/rs_strdecls.h" #undef RS_STRDECL }; //namespace Hashes } // unnamed namespace diff --git a/src/testshade/simplerend.h b/src/testshade/simplerend.h index 39ff3f5a9f..2591a48c13 100644 --- a/src/testshade/simplerend.h +++ b/src/testshade/simplerend.h @@ -18,7 +18,7 @@ # include "batched_simplerend.h" #endif -#include "render_state.h" +#include "example_common/render_state.h" OSL_NAMESPACE_BEGIN diff --git a/src/testshade/testshade.cpp b/src/testshade/testshade.cpp index 6ac981221e..9e6fcba17b 100644 --- a/src/testshade/testshade.cpp +++ b/src/testshade/testshade.cpp @@ -37,7 +37,7 @@ # include "optixgridrender.h" #endif -#include "render_state.h" +#include "example_common/render_state.h" #include "simplerend.h"