From 8e0bdb300d86e7942aa366faacfac70bdfb68c16 Mon Sep 17 00:00:00 2001 From: JoeOster <52936608+JoeOster@users.noreply.github.com> Date: Wed, 29 Sep 2021 09:45:57 -0700 Subject: [PATCH 01/36] ONSAM-1414 Broken Link in Headers (#685) * Update Makefile * Update Makefile * Update Makefile * Update DCT.hpp * Update intrin_ftz_sample.cpp * Update merge_sort.cpp * Update intrin_double_sample.cpp * Update intrin_dot_sample.cpp * Update DCT.cpp --- .../C++/CombinationalLogic/MandelbrotOMP/Makefile | 12 ------------ .../C++/CompilerInfrastructure/Intrinsics/Makefile | 12 ------------ .../Intrinsics/src/intrin_dot_sample.cpp | 12 ------------ .../Intrinsics/src/intrin_double_sample.cpp | 12 ------------ .../Intrinsics/src/intrin_ftz_sample.cpp | 12 ------------ .../C++/GraphTraversal/MergesortOMP/Makefile | 12 ------------ .../GraphTraversal/MergesortOMP/src/merge_sort.cpp | 12 ------------ .../DiscreteCosineTransform/src/DCT.cpp | 13 ------------- .../DiscreteCosineTransform/src/DCT.hpp | 12 ------------ 9 files changed, 109 deletions(-) diff --git a/DirectProgramming/C++/CombinationalLogic/MandelbrotOMP/Makefile b/DirectProgramming/C++/CombinationalLogic/MandelbrotOMP/Makefile index 2e9ce924f3..36798a3914 100644 --- a/DirectProgramming/C++/CombinationalLogic/MandelbrotOMP/Makefile +++ b/DirectProgramming/C++/CombinationalLogic/MandelbrotOMP/Makefile @@ -1,15 +1,3 @@ -#============================================================== -# -# SAMPLE SOURCE CODE - SUBJECT TO THE TERMS OF SAMPLE CODE LICENSE AGREEMENT, -# http://software.intel.com/en-us/articles/intel-sample-source-code-license-agreement/ -# -# Copyright Intel Corporation -# -# THIS FILE IS PROVIDED "AS IS" WITH NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT -# NOT LIMITED TO ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A PARTICULAR -# PURPOSE, NON-INFRINGEMENT OF INTELLECTUAL PROPERTY RIGHTS. -# -# ============================================================= CXX := icpc SRCDIR := src BUILDDIR := release diff --git a/DirectProgramming/C++/CompilerInfrastructure/Intrinsics/Makefile b/DirectProgramming/C++/CompilerInfrastructure/Intrinsics/Makefile index 70fff7783c..8068092756 100644 --- a/DirectProgramming/C++/CompilerInfrastructure/Intrinsics/Makefile +++ b/DirectProgramming/C++/CompilerInfrastructure/Intrinsics/Makefile @@ -1,15 +1,3 @@ -#============================================================== -# -# SAMPLE SOURCE CODE - SUBJECT TO THE TERMS OF SAMPLE CODE LICENSE AGREEMENT, -# http://software.intel.com/en-us/articles/intel-sample-source-code-license-agreement/ -# -# Copyright Intel Corporation -# -# THIS FILE IS PROVIDED "AS IS" WITH NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT -# NOT LIMITED TO ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A PARTICULAR -# PURPOSE, NON-INFRINGEMENT OF INTELLECTUAL PROPERTY RIGHTS. -# -# ============================================================= CC = icc EXECS=intrin_dot_sample.exe intrin_double_sample.exe intrin_ftz_sample.exe DBG_EXECS=intrin_dot_sample_dbg.exe intrin_double_sample_dbg.exe intrin_ftz_sample_dbg.exe diff --git a/DirectProgramming/C++/CompilerInfrastructure/Intrinsics/src/intrin_dot_sample.cpp b/DirectProgramming/C++/CompilerInfrastructure/Intrinsics/src/intrin_dot_sample.cpp index f4774140db..fa60747976 100644 --- a/DirectProgramming/C++/CompilerInfrastructure/Intrinsics/src/intrin_dot_sample.cpp +++ b/DirectProgramming/C++/CompilerInfrastructure/Intrinsics/src/intrin_dot_sample.cpp @@ -1,15 +1,3 @@ -//============================================================== -// -// SAMPLE SOURCE CODE - SUBJECT TO THE TERMS OF SAMPLE CODE LICENSE AGREEMENT, -// http://software.intel.com/en-us/articles/intel-sample-source-code-license-agreement/ -// -// Copyright 2016 Intel Corporation -// -// THIS FILE IS PROVIDED "AS IS" WITH NO WARRANTIES, EXPRESS OR IMPLIED, -// INCLUDING BUT NOT LIMITED TO ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT OF INTELLECTUAL PROPERTY RIGHTS. -// -// ============================================================= /* [DESCRIPTION] * This C code sample demonstrates how to use C, Intel(R) MMX(TM), * Intel(R) Streaming SIMD Extensions 3 (Intel(R) SSE3), diff --git a/DirectProgramming/C++/CompilerInfrastructure/Intrinsics/src/intrin_double_sample.cpp b/DirectProgramming/C++/CompilerInfrastructure/Intrinsics/src/intrin_double_sample.cpp index 44c1dac23c..7fb803e9fc 100644 --- a/DirectProgramming/C++/CompilerInfrastructure/Intrinsics/src/intrin_double_sample.cpp +++ b/DirectProgramming/C++/CompilerInfrastructure/Intrinsics/src/intrin_double_sample.cpp @@ -1,15 +1,3 @@ -//============================================================== -// -// SAMPLE SOURCE CODE - SUBJECT TO THE TERMS OF SAMPLE CODE LICENSE AGREEMENT, -// http://software.intel.com/en-us/articles/intel-sample-source-code-license-agreement/ -// -// Copyright 2016 Intel Corporation -// -// THIS FILE IS PROVIDED "AS IS" WITH NO WARRANTIES, EXPRESS OR IMPLIED, -// INCLUDING BUT NOT LIMITED TO ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT OF INTELLECTUAL PROPERTY RIGHTS. -// -// ============================================================= /* [DESCRIPTION] * This C code sample demonstrates how to use C in * comparison with diff --git a/DirectProgramming/C++/CompilerInfrastructure/Intrinsics/src/intrin_ftz_sample.cpp b/DirectProgramming/C++/CompilerInfrastructure/Intrinsics/src/intrin_ftz_sample.cpp index d731710d19..773841cd44 100644 --- a/DirectProgramming/C++/CompilerInfrastructure/Intrinsics/src/intrin_ftz_sample.cpp +++ b/DirectProgramming/C++/CompilerInfrastructure/Intrinsics/src/intrin_ftz_sample.cpp @@ -1,15 +1,3 @@ -//============================================================== -// -// SAMPLE SOURCE CODE - SUBJECT TO THE TERMS OF SAMPLE CODE LICENSE AGREEMENT, -// http://software.intel.com/en-us/articles/intel-sample-source-code-license-agreement/ -// -// Copyright 2017 Intel Corporation -// -// THIS FILE IS PROVIDED "AS IS" WITH NO WARRANTIES, EXPRESS OR IMPLIED, -// INCLUDING BUT NOT LIMITED TO ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT OF INTELLECTUAL PROPERTY RIGHTS. -// -// ============================================================= /* [DESCRIPTION] * This code sample demonstrates how to use the * _MM_GET_FLUSH_ZERO_MODE() and _MM_GET_DENORMALS_ZERO_MODE() diff --git a/DirectProgramming/C++/GraphTraversal/MergesortOMP/Makefile b/DirectProgramming/C++/GraphTraversal/MergesortOMP/Makefile index 8fc2cbbc18..550db04262 100644 --- a/DirectProgramming/C++/GraphTraversal/MergesortOMP/Makefile +++ b/DirectProgramming/C++/GraphTraversal/MergesortOMP/Makefile @@ -1,15 +1,3 @@ -#============================================================== -# -# SAMPLE SOURCE CODE - SUBJECT TO THE TERMS OF SAMPLE CODE LICENSE AGREEMENT, -# http://software.intel.com/en-us/articles/intel-sample-source-code-license-agreement/ -# -# Copyright Intel Corporation -# -# THIS FILE IS PROVIDED "AS IS" WITH NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT -# NOT LIMITED TO ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A PARTICULAR -# PURPOSE, NON-INFRINGEMENT OF INTELLECTUAL PROPERTY RIGHTS. -# -# ============================================================= CXX := icpc SRCDIR := src BUILDDIR := release diff --git a/DirectProgramming/C++/GraphTraversal/MergesortOMP/src/merge_sort.cpp b/DirectProgramming/C++/GraphTraversal/MergesortOMP/src/merge_sort.cpp index 703942be96..4b43c6b4fc 100644 --- a/DirectProgramming/C++/GraphTraversal/MergesortOMP/src/merge_sort.cpp +++ b/DirectProgramming/C++/GraphTraversal/MergesortOMP/src/merge_sort.cpp @@ -1,15 +1,3 @@ -//============================================================== -// -// SAMPLE SOURCE CODE - SUBJECT TO THE TERMS OF SAMPLE CODE LICENSE AGREEMENT, -// http://software.intel.com/en-us/articles/intel-sample-source-code-license-agreement/ -// -// Copyright Intel Corporation -// -// THIS FILE IS PROVIDED "AS IS" WITH NO WARRANTIES, EXPRESS OR IMPLIED, -// INCLUDING BUT NOT LIMITED TO ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT OF INTELLECTUAL PROPERTY RIGHTS. -// -// ============================================================= #define _CRT_SECURE_NO_DEPRECATE #include diff --git a/DirectProgramming/DPC++/SpectralMethods/DiscreteCosineTransform/src/DCT.cpp b/DirectProgramming/DPC++/SpectralMethods/DiscreteCosineTransform/src/DCT.cpp index f48619fd9a..43f34889d4 100644 --- a/DirectProgramming/DPC++/SpectralMethods/DiscreteCosineTransform/src/DCT.cpp +++ b/DirectProgramming/DPC++/SpectralMethods/DiscreteCosineTransform/src/DCT.cpp @@ -1,16 +1,3 @@ -//======================================================================================= -// -// SAMPLE SOURCE CODE - SUBJECT TO THE TERMS OF SAMPLE CODE LICENSE AGREEMENT, -// http://software.intel.com/en-us/articles/intel-sample-source-code-license-agreement/ -// -// Copyright Intel Corporation -// -// THIS FILE IS PROVIDED "AS IS" WITH NO WARRANTIES, EXPRESS OR IMPLIED, -// INCLUDING BUT NOT LIMITED TO ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT OF INTELLECTUAL PROPERTY RIGHTS. -// -// ====================================================================================== - #include "DCT.hpp" #include diff --git a/DirectProgramming/DPC++/SpectralMethods/DiscreteCosineTransform/src/DCT.hpp b/DirectProgramming/DPC++/SpectralMethods/DiscreteCosineTransform/src/DCT.hpp index 8cf715ec0a..ebaf7a7033 100644 --- a/DirectProgramming/DPC++/SpectralMethods/DiscreteCosineTransform/src/DCT.hpp +++ b/DirectProgramming/DPC++/SpectralMethods/DiscreteCosineTransform/src/DCT.hpp @@ -1,15 +1,3 @@ -//======================================================================================= -// -// SAMPLE SOURCE CODE - SUBJECT TO THE TERMS OF SAMPLE CODE LICENSE AGREEMENT, -// http://software.intel.com/en-us/articles/intel-sample-source-code-license-agreement/ -// -// Copyright Intel Corporation -// -// THIS FILE IS PROVIDED "AS IS" WITH NO WARRANTIES, EXPRESS OR IMPLIED, -// INCLUDING BUT NOT LIMITED TO ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT OF INTELLECTUAL PROPERTY RIGHTS. -// -// ====================================================================================== #pragma pack(push, 1) // This is the data structure which is going to represent one pixel value in RGB From 4bed52e76ceb17243a0bc4ce24e9aed52aaa6e49 Mon Sep 17 00:00:00 2001 From: ericlars Date: Wed, 29 Sep 2021 10:37:09 -0700 Subject: [PATCH 02/36] fix deprecation notice (#682) --- .../oneMKL/black_scholes/black_scholes.cpp | 5 ++-- .../oneMKL/black_scholes/code_wrapper.tpp | 28 +++++++++++++++++++ 2 files changed, 31 insertions(+), 2 deletions(-) create mode 100644 Libraries/oneMKL/black_scholes/code_wrapper.tpp diff --git a/Libraries/oneMKL/black_scholes/black_scholes.cpp b/Libraries/oneMKL/black_scholes/black_scholes.cpp index 7d2180f03b..d7c494945f 100644 --- a/Libraries/oneMKL/black_scholes/black_scholes.cpp +++ b/Libraries/oneMKL/black_scholes/black_scholes.cpp @@ -27,6 +27,7 @@ using namespace oneapi; #include "input_generator.hpp" #include "black_scholes.hpp" +#include "code_wrapper.tpp" namespace { @@ -83,7 +84,7 @@ void async_sycl_error(sycl::exception_list el) { try { std::rethrow_exception(*l); } catch(const sycl::exception & e) { - std::cerr << "SYCL exception occured with code " << e.get_cl_code() << " with " << e.what() << std::endl; + std::cerr << "SYCL exception occured with code " << code_wrapper(e) << " with " << e.what() << std::endl; } } } @@ -184,7 +185,7 @@ int sample_run(int64_t nopt) { } } catch (sycl::exception const & re) { - std::cerr << "SYCL exception occured with code " << re.get_cl_code() << " with " << re.what() << std::endl; + std::cerr << "SYCL exception occured with code " << code_wrapper(re) << " with " << re.what() << std::endl; return -1; } diff --git a/Libraries/oneMKL/black_scholes/code_wrapper.tpp b/Libraries/oneMKL/black_scholes/code_wrapper.tpp new file mode 100644 index 0000000000..59fe39c3e5 --- /dev/null +++ b/Libraries/oneMKL/black_scholes/code_wrapper.tpp @@ -0,0 +1,28 @@ +//============================================================== +// Copyright © 2020 Intel Corporation +// +// SPDX-License-Identifier: MIT +// ============================================================= + +/******************************************************************************* + ! Content: + ! Wrapper utility for backward compatibility with get_cl_code in SYCL 1.2.1 + !******************************************************************************/ + +#pragma once +#include + +template +struct has_member_code_meta : std::false_type {}; + +template +struct has_member_code_meta().code() )> > : std::true_type {}; + +template ::value>::type* = nullptr > +auto code_wrapper (T x) { + return x.code(); +}; +template ::value>::type* = nullptr > +auto code_wrapper (T x) { + return x.get_cl_code(); +}; From b23d63a8e92b01149b59bb840bb6ee5b8e0317af Mon Sep 17 00:00:00 2001 From: Michael R Carroll Date: Fri, 8 Oct 2021 17:11:34 -0700 Subject: [PATCH 03/36] initial commit for RenderingToolkit GSG sample proposal --- RenderingToolkit/README.md | 144 +++++++ RenderingToolkit/embree_gsg/CMakeLists.txt | 27 ++ RenderingToolkit/embree_gsg/sample.json | 22 + RenderingToolkit/embree_gsg/src/minimal.cpp | 256 ++++++++++++ RenderingToolkit/oidn_gsg/CMakeLists.txt | 33 ++ RenderingToolkit/oidn_gsg/sample.json | 22 + .../oidn_gsg/src/apps/oidnDenoise.cpp | 380 +++++++++++++++++ .../oidn_gsg/src/apps/utils/CMakeLists.txt | 6 + .../oidn_gsg/src/apps/utils/arg_parser.h | 69 ++++ .../oidn_gsg/src/apps/utils/image_io.cpp | 309 ++++++++++++++ .../oidn_gsg/src/apps/utils/image_io.h | 66 +++ .../oidn_gsg/src/common/CMakeLists.txt | 29 ++ .../oidn_gsg/src/common/platform.cpp | 111 +++++ .../oidn_gsg/src/common/platform.h | 176 ++++++++ RenderingToolkit/oidn_gsg/src/common/timer.h | 36 ++ RenderingToolkit/openvkl_gsg/CMakeLists.txt | 26 ++ RenderingToolkit/openvkl_gsg/sample.json | 22 + .../openvkl_gsg/src/vklTutorial.c | 390 ++++++++++++++++++ RenderingToolkit/ospray_gsg/CMakeLists.txt | 27 ++ RenderingToolkit/ospray_gsg/sample.json | 22 + .../ospray_gsg/src/ospTutorial.cpp | 172 ++++++++ 21 files changed, 2345 insertions(+) create mode 100644 RenderingToolkit/README.md create mode 100644 RenderingToolkit/embree_gsg/CMakeLists.txt create mode 100644 RenderingToolkit/embree_gsg/sample.json create mode 100644 RenderingToolkit/embree_gsg/src/minimal.cpp create mode 100644 RenderingToolkit/oidn_gsg/CMakeLists.txt create mode 100644 RenderingToolkit/oidn_gsg/sample.json create mode 100644 RenderingToolkit/oidn_gsg/src/apps/oidnDenoise.cpp create mode 100644 RenderingToolkit/oidn_gsg/src/apps/utils/CMakeLists.txt create mode 100644 RenderingToolkit/oidn_gsg/src/apps/utils/arg_parser.h create mode 100644 RenderingToolkit/oidn_gsg/src/apps/utils/image_io.cpp create mode 100644 RenderingToolkit/oidn_gsg/src/apps/utils/image_io.h create mode 100644 RenderingToolkit/oidn_gsg/src/common/CMakeLists.txt create mode 100644 RenderingToolkit/oidn_gsg/src/common/platform.cpp create mode 100644 RenderingToolkit/oidn_gsg/src/common/platform.h create mode 100644 RenderingToolkit/oidn_gsg/src/common/timer.h create mode 100644 RenderingToolkit/openvkl_gsg/CMakeLists.txt create mode 100644 RenderingToolkit/openvkl_gsg/sample.json create mode 100644 RenderingToolkit/openvkl_gsg/src/vklTutorial.c create mode 100644 RenderingToolkit/ospray_gsg/CMakeLists.txt create mode 100644 RenderingToolkit/ospray_gsg/sample.json create mode 100644 RenderingToolkit/ospray_gsg/src/ospTutorial.cpp diff --git a/RenderingToolkit/README.md b/RenderingToolkit/README.md new file mode 100644 index 0000000000..97428f896b --- /dev/null +++ b/RenderingToolkit/README.md @@ -0,0 +1,144 @@ +# Getting Started Samples for Intel® oneAPI Rendering Toolkit (RenderKit) + +TBD + +You can find more information at the [ Intel oneAPI Rendering Toolkit portal](https://software.intel.com/content/www/us/en/develop/tools/oneapi/rendering-toolkit.html). + +Users could learn how to run samples for different components in oneAPI Rendering Toolkit + +## License + +TBD + +Code samples are licensed under the MIT license. See +[License.txt](https://github.com/oneapi-src/oneAPI-samples/blob/master/License.txt) for details. + +Third party program Licenses can be found here: [third-party-programs.txt](https://github.com/oneapi-src/oneAPI-samples/blob/master/third-party-programs.txt) + +## Getting Started Samples + +| Component | Folder | Description | +| --------- | ------------------------------------------------ | - | +| Intel OSPRay | [ospray_gsg](ospray_gsg) | Get started with Intel OSPRay | +| Intel Embree | [embree_gsg](embree_gsg)| Get started with Intel Embree | +| Intel Open Volume Kernel Library | [openvkl_gsg](openvkl_gsg)| Get started with Intel Open VKL | +| Intel Open Image Denoise | [oidn_gsg](oidn_gsg) | Get started with Intel Open Image Denoise | + +## Build A Sample: + +To build and run the samples you will need a compiler toolchain and imaging tools: + +Compiler: +- MSVS2019 on Windows OS +- On other platforms a C++11 compiler and a C99 compiler. (Ex: gcc/g++/clang) + +Imaging Tools: +- An image **display program** for .ppm and .pfm filetypes . Ex: [ImageMagick](https://www.imagemagick.org/) +- An image **converter** for .ppm and .pfm filetypes and endian conversions. Ex: [ImageMagick](https://www.imagemagick.org/) + +### Windows OS: + +Run a new **x64 Native Tools Command Prompt for VS 2019** + +``` +call \setvars.bat +cd RenderingToolkit\_gsg +mkdir build +cd build +cmake -G”Visual Studio 16 2019” -A x64 -DCMAKE_PREFIX_PATH=”” .. +cmake -–build . --config Release +cd Release +``` + + +### Linux OS: + +Start a new Terminal session +``` +source /setvars.sh +cd RenderingToolkit/_gsg +mkdir build +cd build +cmake -DCMAKE_PREFIX_PATH=”” .. +cmake -–build . +``` + + + +### MacOS: + +Start a new Terminal session + +``` +source /setvars.sh +cd RenderingToolkit/_gsg +mkdir build +cd build +cmake -DCMAKE_PREFIX_PATH=”” .. +cmake -–build . +``` + + +## Run a built sample + +### Running ospray_gsg + +Set environment variables if and only if they have not been already set in the same shell for the build step +- Windows OS: `call \setvars.bat` +- Linux OS/MacOS: `source /setvars.sh` +Run built '`ospTutorialCpp`' executable +Results are emmitted to disk in the local directory. +Use an image viewer like ImageMagick display (imdisplay) to review output .ppm files. +``` +imdisplay firstFrameCpp.ppm +imdisplay accumulatedFrameCpp.ppm +``` +Notice image convergence as OSPRay performs more accumulations to generate the second image. + +### Running embree_gsg + +Set environment variables if and only if they have not been already set in the same shell for the build step +- Windows OS: `call \setvars.bat` +- Linux OS/MacOS: `source /setvars.sh` + +Run the built `minimal` executable +Embree results are emmitted to the command line interface. + +### Running openvkl_gsg + +Set environment variables if and only if they have not been already set in the same shell for the build step: +- Windows OS: `call \setvars.bat` +- Linux OS/MacOS: `source /setvars.sh` + +Run the built `vklTutorial` executable from the command line +Results are emitted to the command line interface. + +### Running oidn_gsg + +Set environment variables if and only if they have not been already set in the same shell for the build step +- Windows OS: `call \setvars.bat` +- Linux OS/MacOS: `source /setvars.sh` + +First, run ospray_gsg sample executable `ospTutorialCpp` from above. +Convert `ospTutorialCpp` output .ppm images to .pfm LSB format. Use a tool like [ImageMagick](https://www.imagemagick.org/) **convert**. Ex: + +`magick convert accumulatedFrameCpp.ppm -endian LSB PFM:accumulatedFrameCpp.pfm` + +Run oidn_gsg sample program `oidnDenoise` with .pfm as input: + +`oidnDenoise --hdr /accumulatedFrameCpp.pfm -o denoisedAccumulatedFrameCpp.pfm` + +Review the output with an image viewer like [ImageMagick](https://www.imagemagick.org/) **display**: + +`imdisplay denoisedAccumulatedFrameCpp.pfm` + +Visually compare the denoised image to the original accumulatedFrameCpp.pfm: + +`imdisplay /accumulatedFrameCpp.pfm` + + + + + + + diff --git a/RenderingToolkit/embree_gsg/CMakeLists.txt b/RenderingToolkit/embree_gsg/CMakeLists.txt new file mode 100644 index 0000000000..ea7d809d86 --- /dev/null +++ b/RenderingToolkit/embree_gsg/CMakeLists.txt @@ -0,0 +1,27 @@ +cmake_minimum_required(VERSION 3.16) +project(embree_gsg LANGUAGES C CXX) + +find_package(embree 3.0 REQUIRED) + +set(ONEAPI_ROOT "") +if($ENV{ONEAPI_ROOT}) + set(ONEAPI_ROOT $ENV{ONEAPI_ROOT}) +else() + if(WIN32) + set(ONEAPI_ROOT "C:/Program Files (x86)/Intel/oneAPI") + else() + set(ONEAPI_ROOT /opt/intel/oneapi) + endif() +endif($ENV{ONEAPI_ROOT}) + + +message(STATUS "ONEAPI_ROOT: ${ONEAPI_ROOT}") +include_directories(${EMBREE_INCLUDE_DIR} ${RKCOMMON_INCLUDE_DIRS}) +link_directories(${EMBREE_ROOT}/lib ${ONEAPI_ROOT}/rkcommon/latest/lib) + +add_executable(minimal src/minimal.cpp) +target_link_libraries(minimal PRIVATE embree rkcommon) + +install(TARGETS minimal + DESTINATION ${CMAKE_INSTALL_BINDIR} +) diff --git a/RenderingToolkit/embree_gsg/sample.json b/RenderingToolkit/embree_gsg/sample.json new file mode 100644 index 0000000000..99cc7b8584 --- /dev/null +++ b/RenderingToolkit/embree_gsg/sample.json @@ -0,0 +1,22 @@ +{ + "guid": "87FA013D-0B19-45AE-BCD5-43412BE0A99F", + "name": "Intel Embree Getting Started", + "categories": ["Toolkit/oneAPI Rendering Toolkit/Embree/Embree-Getting-Started"], + "description": "This introductory hello rendering toolkit sample illustrates how to cast a ray into a scene with Intel Embree", + "builder": ["cli"], + "languages": [{"cpp":{}}], + "dependencies": ["tbb","rkcommon"], + "os":["linux", "windows", "darwin"], + "targetDevice": ["CPU"], + "ciTests": { + "linux": [ + { + "env": ["source /opt/intel/oneapi/setvars.sh --force", "conda create -n ospray-tutorial-test -c intel -c conda-forge matplotlib runipy intel-aikit-modin", "source activate aikit-modin-test"], + "id": "Intel_Embree_minimal", + "steps": [ + "minimal.exe" + ] + } + ] +} +} diff --git a/RenderingToolkit/embree_gsg/src/minimal.cpp b/RenderingToolkit/embree_gsg/src/minimal.cpp new file mode 100644 index 0000000000..1a7d7b221f --- /dev/null +++ b/RenderingToolkit/embree_gsg/src/minimal.cpp @@ -0,0 +1,256 @@ +// Copyright 2009-2021 Intel Corporation +// SPDX-License-Identifier: Apache-2.0 + +#include +#include +#include +#include +#include + +#if defined(_WIN32) +# include +# include +#endif + +/* + * A minimal tutorial. + * + * It demonstrates how to intersect a ray with a single triangle. It is + * meant to get you started as quickly as possible, and does not output + * an image. + * + * For more complex examples, see the other tutorials. + * + * Compile this file using + * + * gcc -std=c99 \ + * -I///include \ + * -o minimal \ + * minimal.c \ + * -L///lib \ + * -lembree3 + * + * You should be able to compile this using a C or C++ compiler. + */ + +/* + * This is only required to make the tutorial compile even when + * a custom namespace is set. + */ +#if defined(RTC_NAMESPACE_USE) +RTC_NAMESPACE_USE +#endif + +/* + * We will register this error handler with the device in initializeDevice(), + * so that we are automatically informed on errors. + * This is extremely helpful for finding bugs in your code, prevents you + * from having to add explicit error checking to each Embree API call. + */ +void errorFunction(void* userPtr, enum RTCError error, const char* str) +{ + printf("error %d: %s\n", error, str); +} + +/* + * Embree has a notion of devices, which are entities that can run + * raytracing kernels. + * We initialize our device here, and then register the error handler so that + * we don't miss any errors. + * + * rtcNewDevice() takes a configuration string as an argument. See the API docs + * for more information. + * + * Note that RTCDevice is reference-counted. + */ +RTCDevice initializeDevice() +{ + RTCDevice device = rtcNewDevice(NULL); + + if (!device) + printf("error %d: cannot create device\n", rtcGetDeviceError(NULL)); + + rtcSetDeviceErrorFunction(device, errorFunction, NULL); + return device; +} + +/* + * Create a scene, which is a collection of geometry objects. Scenes are + * what the intersect / occluded functions work on. You can think of a + * scene as an acceleration structure, e.g. a bounding-volume hierarchy. + * + * Scenes, like devices, are reference-counted. + */ +RTCScene initializeScene(RTCDevice device) +{ + RTCScene scene = rtcNewScene(device); + + /* + * Create a triangle mesh geometry, and initialize a single triangle. + * You can look up geometry types in the API documentation to + * find out which type expects which buffers. + * + * We create buffers directly on the device, but you can also use + * shared buffers. For shared buffers, special care must be taken + * to ensure proper alignment and padding. This is described in + * more detail in the API documentation. + */ + RTCGeometry geom = rtcNewGeometry(device, RTC_GEOMETRY_TYPE_TRIANGLE); + float* vertices = (float*) rtcSetNewGeometryBuffer(geom, + RTC_BUFFER_TYPE_VERTEX, + 0, + RTC_FORMAT_FLOAT3, + 3*sizeof(float), + 3); + + unsigned* indices = (unsigned*) rtcSetNewGeometryBuffer(geom, + RTC_BUFFER_TYPE_INDEX, + 0, + RTC_FORMAT_UINT3, + 3*sizeof(unsigned), + 1); + + if (vertices && indices) + { + vertices[0] = 0.f; vertices[1] = 0.f; vertices[2] = 0.f; + vertices[3] = 1.f; vertices[4] = 0.f; vertices[5] = 0.f; + vertices[6] = 0.f; vertices[7] = 1.f; vertices[8] = 0.f; + + indices[0] = 0; indices[1] = 1; indices[2] = 2; + } + + /* + * You must commit geometry objects when you are done setting them up, + * or you will not get any intersections. + */ + rtcCommitGeometry(geom); + + /* + * In rtcAttachGeometry(...), the scene takes ownership of the geom + * by increasing its reference count. This means that we don't have + * to hold on to the geom handle, and may release it. The geom object + * will be released automatically when the scene is destroyed. + * + * rtcAttachGeometry() returns a geometry ID. We could use this to + * identify intersected objects later on. + */ + rtcAttachGeometry(scene, geom); + rtcReleaseGeometry(geom); + + /* + * Like geometry objects, scenes must be committed. This lets + * Embree know that it may start building an acceleration structure. + */ + rtcCommitScene(scene); + + return scene; +} + +/* + * Cast a single ray with origin (ox, oy, oz) and direction + * (dx, dy, dz). + */ +void castRay(RTCScene scene, + float ox, float oy, float oz, + float dx, float dy, float dz) +{ + /* + * The intersect context can be used to set intersection + * filters or flags, and it also contains the instance ID stack + * used in multi-level instancing. + */ + struct RTCIntersectContext context; + rtcInitIntersectContext(&context); + + /* + * The ray hit structure holds both the ray and the hit. + * The user must initialize it properly -- see API documentation + * for rtcIntersect1() for details. + */ + struct RTCRayHit rayhit; + rayhit.ray.org_x = ox; + rayhit.ray.org_y = oy; + rayhit.ray.org_z = oz; + rayhit.ray.dir_x = dx; + rayhit.ray.dir_y = dy; + rayhit.ray.dir_z = dz; + rayhit.ray.tnear = 0; + rayhit.ray.tfar = std::numeric_limits::infinity(); + rayhit.ray.mask = -1; + rayhit.ray.flags = 0; + rayhit.hit.geomID = RTC_INVALID_GEOMETRY_ID; + rayhit.hit.instID[0] = RTC_INVALID_GEOMETRY_ID; + + /* + * There are multiple variants of rtcIntersect. This one + * intersects a single ray with the scene. + */ + rtcIntersect1(scene, &context, &rayhit); + + printf("%f, %f, %f: ", ox, oy, oz); + if (rayhit.hit.geomID != RTC_INVALID_GEOMETRY_ID) + { + /* Note how geomID and primID identify the geometry we just hit. + * We could use them here to interpolate geometry information, + * compute shading, etc. + * Since there is only a single triangle in this scene, we will + * get geomID=0 / primID=0 for all hits. + * There is also instID, used for instancing. See + * the instancing tutorials for more information */ + printf("Found intersection on geometry %d, primitive %d at tfar=%f\n", + rayhit.hit.geomID, + rayhit.hit.primID, + rayhit.ray.tfar); + } + else + printf("Did not find any intersection.\n"); +} + +void waitForKeyPressedUnderWindows() +{ +#if defined(_WIN32) + HANDLE hStdOutput = GetStdHandle(STD_OUTPUT_HANDLE); + + CONSOLE_SCREEN_BUFFER_INFO csbi; + if (!GetConsoleScreenBufferInfo(hStdOutput, &csbi)) { + printf("GetConsoleScreenBufferInfo failed: %d\n", GetLastError()); + return; + } + + /* do not pause when running on a shell */ + if (csbi.dwCursorPosition.X != 0 || csbi.dwCursorPosition.Y != 0) + return; + + /* only pause if running in separate console window. */ + printf("\n\tPress any key to exit...\n"); + int ch = getch(); +#endif +} + + +/* -------------------------------------------------------------------------- */ + +int main() +{ + /* Initialization. All of this may fail, but we will be notified by + * our errorFunction. */ + RTCDevice device = initializeDevice(); + RTCScene scene = initializeScene(device); + + /* This will hit the triangle at t=1. */ + castRay(scene, 0, 0, -1, 0, 0, 1); + + /* This will not hit anything. */ + castRay(scene, 1, 1, -1, 0, 0, 1); + + /* Though not strictly necessary in this example, you should + * always make sure to release resources allocated through Embree. */ + rtcReleaseScene(scene); + rtcReleaseDevice(device); + + /* wait for user input under Windows when opened in separate window */ + waitForKeyPressedUnderWindows(); + + return 0; +} + diff --git a/RenderingToolkit/oidn_gsg/CMakeLists.txt b/RenderingToolkit/oidn_gsg/CMakeLists.txt new file mode 100644 index 0000000000..50ff52d1a6 --- /dev/null +++ b/RenderingToolkit/oidn_gsg/CMakeLists.txt @@ -0,0 +1,33 @@ +cmake_minimum_required(VERSION 3.16) +project(OIDN_GSG LANGUAGES C CXX) + +find_package(OpenImageDenoise REQUIRED) +find_package(TBB REQUIRED) + +set(ONEAPI_ROOT "") +if($ENV{ONEAPI_ROOT}) + set(ONEAPI_ROOT $ENV{ONEAPI_ROOT}) +else() + if(WIN32) + set(ONEAPI_ROOT "C:/Program Files (x86)/Intel/oneAPI") + else() + set(ONEAPI_ROOT /opt/intel/oneapi) + endif() +endif($ENV{ONEAPI_ROOT}) +set(OIDN_ROOT ${ONEAPI_ROOT}/oidn/latest) +set(OIDN_INCLUDE_DIR ${OIDN_ROOT}/include) +set(OIDN_LIB_DIR ${OIDN_ROOT}/lib) +message(STATUS "ONEAPI_ROOT: ${ONEAPI_ROOT}") + +add_subdirectory(src/common) +add_subdirectory(src/apps/utils) + +include_directories(${OIDN_INCLUDE_DIR} ${OIDN_ROOT} ${OIDN_GSG_SOURCE_DIR}/src) +link_directories(${OIDN_ROOT}/lib) + +add_executable(oidnDenoise src/apps/oidnDenoise.cpp) +target_link_libraries(oidnDenoise PRIVATE common utils OpenImageDenoise) + +install(TARGETS oidnDenoise + DESTINATION ${CMAKE_INSTALL_BINDIR} +) diff --git a/RenderingToolkit/oidn_gsg/sample.json b/RenderingToolkit/oidn_gsg/sample.json new file mode 100644 index 0000000000..6162a7b6df --- /dev/null +++ b/RenderingToolkit/oidn_gsg/sample.json @@ -0,0 +1,22 @@ +{ + "guid": "41F82C06-A9FA-4521-B87A-8F7304CB6631", + "name": "Intel Open Image Denoise Getting Started", + "categories": ["Toolkit/oneAPI Rendering Toolkit/Open Image Denoise/OIDN-Getting-Started"], + "description": "This introductory hello rendering toolkit sample illustrates how to denoise a raytraced image with Intel Open Image Denoise", + "builder": ["cli"], + "languages": [{"cpp":{}}], + "dependencies": ["tbb","rkcommon"], + "os":["linux", "windows", "darwin"], + "targetDevice": ["CPU"], + "ciTests": { + "linux": [ + { + "env": ["source /opt/intel/oneapi/setvars.sh --force", "conda create -n ospray-tutorial-test -c intel -c conda-forge matplotlib runipy intel-aikit-modin", "source activate aikit-modin-test"], + "id": "Intel_OIDN_oidnDenoise", + "steps": [ + "oidnDenoise.exe" + ] + } + ] +} +} diff --git a/RenderingToolkit/oidn_gsg/src/apps/oidnDenoise.cpp b/RenderingToolkit/oidn_gsg/src/apps/oidnDenoise.cpp new file mode 100644 index 0000000000..2e74ebf3f9 --- /dev/null +++ b/RenderingToolkit/oidn_gsg/src/apps/oidnDenoise.cpp @@ -0,0 +1,380 @@ +// Copyright 2009-2021 Intel Corporation +// SPDX-License-Identifier: Apache-2.0 + +#include +#include +#include +#include +#include +#include + +#ifdef VTUNE +#include +#endif + +#include + +#include "common/timer.h" +#include "apps/utils/image_io.h" +#include "apps/utils/arg_parser.h" + +OIDN_NAMESPACE_USING +using namespace oidn; + +void printUsage() +{ + std::cout << "Intel(R) Open Image Denoise" << std::endl; + std::cout << "usage: oidnDenoise [-f/--filter RT|RTLightmap]" << std::endl + << " [--hdr color.pfm] [--ldr color.pfm] [--srgb] [--dir directional.pfm]" << std::endl + << " [--alb albedo.pfm] [--nrm normal.pfm] [--clean_aux]" << std::endl + << " [--is/--input_scale value]" << std::endl + << " [-o/--output output.pfm] [-r/--ref reference_output.pfm]" << std::endl + << " [-w/--weights weights.tza]" << std::endl + << " [--threads n] [--affinity 0|1] [--maxmem MB] [--inplace]" << std::endl + << " [--bench ntimes] [-v/--verbose 0-3]" << std::endl + << " [-h/--help]" << std::endl; +} + +void errorCallback(void* userPtr, Error error, const char* message) +{ + throw std::runtime_error(message); +} + +volatile bool isCancelled = false; + +void signalHandler(int signal) +{ + isCancelled = true; +} + +bool progressCallback(void* userPtr, double n) +{ + if (isCancelled) + { + std::cout << std::endl; + return false; + } + std::cout << "\rDenoising " << int(n * 100.) << "%" << std::flush; + return true; +} + +std::vector loadFile(const std::string& filename) +{ + std::ifstream file(filename, std::ios::binary); + if (file.fail()) + throw std::runtime_error("cannot open file: " + filename); + file.seekg(0, file.end); + const size_t size = file.tellg(); + file.seekg(0, file.beg); + std::vector buffer(size); + file.read(buffer.data(), size); + if (file.fail()) + throw std::runtime_error("error reading from file"); + return buffer; +} + +int main(int argc, char* argv[]) +{ + std::string filterType = "RT"; + std::string colorFilename, albedoFilename, normalFilename; + std::string outputFilename, refFilename; + std::string weightsFilename; + bool hdr = false; + bool srgb = false; + bool directional = false; + float inputScale = std::numeric_limits::quiet_NaN(); + bool cleanAux = false; + int numBenchmarkRuns = 0; + int numThreads = -1; + int setAffinity = -1; + int maxMemoryMB = -1; + bool inplace = false; + int verbose = -1; + + // Parse the arguments + if (argc == 1) + { + printUsage(); + return 1; + } + + try + { + ArgParser args(argc, argv); + while (args.hasNext()) + { + std::string opt = args.getNextOpt(); + if (opt == "f" || opt == "filter") + filterType = args.getNextValue(); + else if (opt == "hdr") + { + colorFilename = args.getNextValue(); + hdr = true; + } + else if (opt == "ldr") + { + colorFilename = args.getNextValue(); + hdr = false; + } + else if (opt == "srgb") + srgb = true; + else if (opt == "dir") + { + colorFilename = args.getNextValue(); + directional = true; + } + else if (opt == "alb" || opt == "albedo") + albedoFilename = args.getNextValue(); + else if (opt == "nrm" || opt == "normal") + normalFilename = args.getNextValue(); + else if (opt == "o" || opt == "out" || opt == "output") + outputFilename = args.getNextValue(); + else if (opt == "r" || opt == "ref" || opt == "reference") + refFilename = args.getNextValue(); + else if (opt == "is" || opt == "input_scale" || opt == "inputScale" || opt == "inputscale") + inputScale = args.getNextValueFloat(); + else if (opt == "clean_aux" || opt == "cleanAux") + cleanAux = true; + else if (opt == "w" || opt == "weights") + weightsFilename = args.getNextValue(); + else if (opt == "bench" || opt == "benchmark") + numBenchmarkRuns = std::max(args.getNextValueInt(), 0); + else if (opt == "threads") + numThreads = args.getNextValueInt(); + else if (opt == "affinity") + setAffinity = args.getNextValueInt(); + else if (opt == "maxmem" || opt == "maxMemoryMB") + maxMemoryMB = args.getNextValueInt(); + else if (opt == "inplace") + inplace = true; + else if (opt == "v" || opt == "verbose") + verbose = args.getNextValueInt(); + else if (opt == "h" || opt == "help") + { + printUsage(); + return 1; + } + else + throw std::invalid_argument("invalid argument"); + } + + if (!refFilename.empty() && numBenchmarkRuns > 0) + throw std::runtime_error("reference and benchmark modes cannot be enabled at the same time"); + + #if defined(OIDN_X64) + // Set MXCSR flags + if (!refFilename.empty()) + { + // In reference mode we have to disable the FTZ and DAZ flags to get accurate results + _MM_SET_FLUSH_ZERO_MODE(_MM_FLUSH_ZERO_OFF); + _MM_SET_DENORMALS_ZERO_MODE(_MM_DENORMALS_ZERO_OFF); + } + else + { + // Enable the FTZ and DAZ flags to maximize performance + _MM_SET_FLUSH_ZERO_MODE(_MM_FLUSH_ZERO_ON); + _MM_SET_DENORMALS_ZERO_MODE(_MM_DENORMALS_ZERO_ON); + } + #endif + + // Load the input image + std::shared_ptr input, ref; + std::shared_ptr color, albedo, normal; + + std::cout << "Loading input" << std::endl; + + if (!albedoFilename.empty()) + input = albedo = loadImage(albedoFilename, 3, false); + + if (!normalFilename.empty()) + input = normal = loadImage(normalFilename, 3); + + if (!colorFilename.empty()) + input = color = loadImage(colorFilename, 3, srgb); + + if (!input) + throw std::runtime_error("no input image specified"); + + if (!refFilename.empty()) + { + ref = loadImage(refFilename, 3, srgb); + if (ref->dims() != input->dims()) + throw std::runtime_error("invalid reference output image"); + } + + const int width = input->width; + const int height = input->height; + std::cout << "Resolution: " << width << "x" << height << std::endl; + + // Initialize the output image + std::shared_ptr output; + if (inplace) + output = input; + else + output = std::make_shared(width, height, 3); + + // Load the filter weights if specified + std::vector weights; + if (!weightsFilename.empty()) + { + std::cout << "Loading filter weights" << std::endl; + weights = loadFile(weightsFilename); + } + + // Initialize the denoising filter + std::cout << "Initializing" << std::endl; + Timer timer; + + DeviceRef device = newDevice(); + + const char* errorMessage; + if (device.getError(errorMessage) != Error::None) + throw std::runtime_error(errorMessage); + device.setErrorFunction(errorCallback); + + if (numThreads > 0) + device.set("numThreads", numThreads); + if (setAffinity >= 0) + device.set("setAffinity", bool(setAffinity)); + if (verbose >= 0) + device.set("verbose", verbose); + device.commit(); + + const double deviceInitTime = timer.query(); + timer.reset(); + + FilterRef filter = device.newFilter(filterType.c_str()); + + if (color) + filter.setImage("color", color->data(), Format::Float3, color->width, color->height); + if (albedo) + filter.setImage("albedo", albedo->data(), Format::Float3, albedo->width, albedo->height); + if (normal) + filter.setImage("normal", normal->data(), Format::Float3, normal->width, normal->height); + + filter.setImage("output", output->data(), Format::Float3, output->width, output->height); + + if (filterType == "RT") + { + if (hdr) + filter.set("hdr", true); + if (srgb) + filter.set("srgb", true); + } + else if (filterType == "RTLightmap") + { + if (directional) + filter.set("directional", true); + } + + if (std::isfinite(inputScale)) + filter.set("inputScale", inputScale); + + if (cleanAux) + filter.set("cleanAux", cleanAux); + + if (maxMemoryMB >= 0) + filter.set("maxMemoryMB", maxMemoryMB); + + if (!weights.empty()) + filter.setData("weights", weights.data(), weights.size()); + + const bool showProgress = !ref && numBenchmarkRuns == 0 && verbose <= 2; + if (showProgress) + { + filter.setProgressMonitorFunction(progressCallback); + signal(SIGINT, signalHandler); + } + + filter.commit(); + + const double filterInitTime = timer.query(); + + const int versionMajor = device.get("versionMajor"); + const int versionMinor = device.get("versionMinor"); + const int versionPatch = device.get("versionPatch"); + + std::cout << " device=CPU" + << ", version=" << versionMajor << "." << versionMinor << "." << versionPatch + << ", msec=" << (1000. * deviceInitTime) << std::endl + << " filter=" << filterType + << ", msec=" << (1000. * filterInitTime) << std::endl; + + // Denoise the image + if (!showProgress) + std::cout << "Denoising" << std::endl; + timer.reset(); + + filter.execute(); + + const double denoiseTime = timer.query(); + if (showProgress) + std::cout << std::endl; + if (verbose <= 2) + std::cout << " msec=" << (1000. * denoiseTime) << std::endl; + + if (showProgress) + { + filter.setProgressMonitorFunction(nullptr); + signal(SIGINT, SIG_DFL); + } + + if (!outputFilename.empty()) + { + // Save output image + std::cout << "Saving output" << std::endl; + saveImage(outputFilename, *output, srgb); + } + + if (ref) + { + // Verify the output values + std::cout << "Verifying output" << std::endl; + + size_t numErrors; + float maxError; + std::tie(numErrors, maxError) = compareImage(*output, *ref, 1e-4); + + std::cout << " values=" << output->size() << ", errors=" << numErrors << ", maxerror=" << maxError << std::endl; + + if (numErrors > 0) + { + // Save debug images + std::cout << "Saving debug images" << std::endl; + saveImage("denoise_in.ppm", *input, srgb); + saveImage("denoise_out.ppm", *output, srgb); + saveImage("denoise_ref.ppm", *ref, srgb); + + throw std::runtime_error("output does not match the reference"); + } + } + + if (numBenchmarkRuns > 0) + { + // Benchmark loop + #ifdef VTUNE + __itt_resume(); + #endif + + std::cout << "Benchmarking: " << "ntimes=" << numBenchmarkRuns << std::endl; + timer.reset(); + + for (int i = 0; i < numBenchmarkRuns; ++i) + filter.execute(); + + const double totalTime = timer.query(); + std::cout << " sec=" << totalTime << ", msec/image=" << (1000.*totalTime / numBenchmarkRuns) << std::endl; + + #ifdef VTUNE + __itt_pause(); + #endif + } + } + catch (std::exception& e) + { + std::cerr << "Error: " << e.what() << std::endl; + return 1; + } + + return 0; +} diff --git a/RenderingToolkit/oidn_gsg/src/apps/utils/CMakeLists.txt b/RenderingToolkit/oidn_gsg/src/apps/utils/CMakeLists.txt new file mode 100644 index 0000000000..f870cec05e --- /dev/null +++ b/RenderingToolkit/oidn_gsg/src/apps/utils/CMakeLists.txt @@ -0,0 +1,6 @@ +add_library(utils STATIC + image_io.h + image_io.cpp +) + +target_link_libraries(utils PUBLIC common) diff --git a/RenderingToolkit/oidn_gsg/src/apps/utils/arg_parser.h b/RenderingToolkit/oidn_gsg/src/apps/utils/arg_parser.h new file mode 100644 index 0000000000..f69d30e2da --- /dev/null +++ b/RenderingToolkit/oidn_gsg/src/apps/utils/arg_parser.h @@ -0,0 +1,69 @@ +// Copyright 2009-2021 Intel Corporation +// SPDX-License-Identifier: Apache-2.0 + +#pragma once + +#include +#include +#include + +namespace oidn { + + // Command-line argument parser + class ArgParser + { + private: + int argc; + char** argv; + int pos; + + public: + ArgParser(int argc, char* argv[]) + : argc(argc), argv(argv), + pos(1) + {} + + bool hasNext() const + { + return pos < argc; + } + + std::string getNext() + { + if (pos < argc) + return argv[pos++]; + else + throw std::invalid_argument("argument expected"); + } + + std::string getNextOpt() + { + std::string str = getNext(); + if (str.empty() || str[0] != '-') + throw std::invalid_argument("option expected"); + return str.substr(str.find_first_not_of("-")); + } + + std::string getNextValue() + { + std::string str = getNext(); + if (!str.empty() && str[0] == '-') + throw std::invalid_argument("value expected"); + return str; + } + + int getNextValueInt() + { + std::string str = getNextValue(); + return atoi(str.c_str()); + } + + float getNextValueFloat() + { + std::string str = getNextValue(); + return atof(str.c_str()); + } + }; + +} // namespace oidn + diff --git a/RenderingToolkit/oidn_gsg/src/apps/utils/image_io.cpp b/RenderingToolkit/oidn_gsg/src/apps/utils/image_io.cpp new file mode 100644 index 0000000000..fe181521de --- /dev/null +++ b/RenderingToolkit/oidn_gsg/src/apps/utils/image_io.cpp @@ -0,0 +1,309 @@ +// Copyright 2009-2021 Intel Corporation +// SPDX-License-Identifier: Apache-2.0 + +#include +#include +#include +#include "image_io.h" + +#if defined(OIDN_USE_OPENIMAGEIO) + #include +#endif + +namespace oidn { + + namespace + { + inline float srgbForward(float y) + { + return (y <= 0.0031308f) ? (12.92f * y) : (1.055f * std::pow(y, 1.f/2.4f) - 0.055f); + } + + inline float srgbInverse(float x) + { + return (x <= 0.04045f) ? (x / 12.92f) : std::pow((x + 0.055f) / 1.055f, 2.4f); + } + + void srgbForward(ImageBuffer& image) + { + for (size_t i = 0; i < image.size(); ++i) + image[i] = srgbForward(image[i]); + } + + void srgbInverse(ImageBuffer& image) + { + for (size_t i = 0; i < image.size(); ++i) + image[i] = srgbInverse(image[i]); + } + + std::string getExtension(const std::string& filename) + { + const size_t pos = filename.find_last_of('.'); + if (pos == std::string::npos) + return ""; // no extension + else + { + std::string ext = filename.substr(pos + 1); + for (auto& c : ext) c = tolower(c); + return ext; + } + } + + std::shared_ptr loadImagePFM(const std::string& filename, int numChannels) + { + // Open the file + std::ifstream file(filename, std::ios::binary); + if (file.fail()) + throw std::runtime_error("cannot open image file: " + filename); + + // Read the header + std::string id; + file >> id; + int C; + if (id == "PF") + C = 3; + else if (id == "Pf") + C = 1; + else + throw std::runtime_error("invalid PFM image"); + + if (numChannels == 0) + numChannels = C; + else if (C < numChannels) + throw std::runtime_error("not enough image channnels"); + + int H, W; + file >> W >> H; + + float scale; + file >> scale; + + file.get(); // skip newline + + if (file.fail()) + throw std::runtime_error("invalid PFM image"); + + if (scale >= 0.f) + throw std::runtime_error("big-endian PFM images are not supported"); + scale = fabs(scale); + + // Read the pixels + auto image = std::make_shared(W, H, numChannels); + + for (int h = 0; h < H; ++h) + { + for (int w = 0; w < W; ++w) + { + for (int c = 0; c < C; ++c) + { + float x; + file.read((char*)&x, sizeof(float)); + if (c < numChannels) + (*image)[(size_t(H-1-h)*W + w) * numChannels + c] = x * scale; + } + } + } + + if (file.fail()) + throw std::runtime_error("invalid PFM image"); + + return image; + } + + void saveImagePFM(const std::string& filename, const ImageBuffer& image) + { + const int H = image.height; + const int W = image.width; + const int C = image.numChannels; + + // Open the file + std::ofstream file(filename, std::ios::binary); + if (file.fail()) + throw std::runtime_error("cannot open image file: " + filename); + + // Write the header + file << "PF" << std::endl; + file << W << " " << H << std::endl; + file << "-1.0" << std::endl; + + // Write the pixels + for (int h = 0; h < H; ++h) + { + for (int w = 0; w < W; ++w) + { + for (int c = 0; c < 3; ++c) + { + const float x = image[(size_t(H-1-h)*W + w) * C + c]; + file.write((char*)&x, sizeof(float)); + } + } + } + } + + void saveImagePPM(const std::string& filename, const ImageBuffer& image) + { + if (image.numChannels != 3) + throw std::invalid_argument("image must have 3 channels"); + const int H = image.height; + const int W = image.width; + const int C = image.numChannels; + + // Open the file + std::ofstream file(filename, std::ios::binary); + if (file.fail()) + throw std::runtime_error("cannot open image file: " + filename); + + // Write the header + file << "P6" << std::endl; + file << W << " " << H << std::endl; + file << "255" << std::endl; + + // Write the pixels + for (int i = 0; i < W*H; ++i) + { + for (int c = 0; c < 3; ++c) + { + const float x = image[i*C+c]; + const int ch = std::min(std::max(int(x * 255.f), 0), 255); + file.put(char(ch)); + } + } + } + } + +#ifdef OIDN_USE_OPENIMAGEIO + std::shared_ptr loadImageOIIO(const std::string& filename, int numChannels) + { + auto in = OIIO::ImageInput::open(filename); + if (!in) + throw std::runtime_error("cannot open image file: " + filename); + + const OIIO::ImageSpec& spec = in->spec(); + if (numChannels == 0) + numChannels = spec.nchannels; + else if (spec.nchannels < numChannels) + throw std::runtime_error("not enough image channels"); + auto image = std::make_shared(spec.width, spec.height, numChannels); + if (!in->read_image(0, 0, 0, numChannels, OIIO::TypeDesc::FLOAT, image->data())) + throw std::runtime_error("failed to read image data"); + in->close(); + +#if OIIO_VERSION < 10903 + OIIO::ImageInput::destroy(in); +#endif + return image; + } + + void saveImageOIIO(const std::string& filename, const ImageBuffer& image) + { + auto out = OIIO::ImageOutput::create(filename); + if (!out) + throw std::runtime_error("cannot save unsupported image file format: " + filename); + + OIIO::ImageSpec spec(image.width, + image.height, + image.numChannels, + OIIO::TypeDesc::FLOAT); + + if (!out->open(filename, spec)) + throw std::runtime_error("cannot create image file: " + filename); + if (!out->write_image(OIIO::TypeDesc::FLOAT, image.data())) + throw std::runtime_error("failed to write image data"); + out->close(); + +#if OIIO_VERSION < 10903 + OIIO::ImageOutput::destroy(out); +#endif + } +#endif + + std::shared_ptr loadImage(const std::string& filename, int numChannels) + { + const std::string ext = getExtension(filename); + std::shared_ptr image; + + if (ext == "pfm") + image = loadImagePFM(filename, numChannels); + else +#if OIDN_USE_OPENIMAGEIO + image = loadImageOIIO(filename, numChannels); +#else + throw std::runtime_error("cannot load unsupported image file format: " + filename); +#endif + + return image; + } + + void saveImage(const std::string& filename, const ImageBuffer& image) + { + const std::string ext = getExtension(filename); + if (ext == "pfm") + saveImagePFM(filename, image); + else if (ext == "ppm") + saveImagePPM(filename, image); + else +#if OIDN_USE_OPENIMAGEIO + saveImageOIIO(filename, image); +#else + throw std::runtime_error("cannot write unsupported image file format: " + filename); +#endif + } + + bool isSrgbImage(const std::string& filename) + { + const std::string ext = getExtension(filename); + return ext != "pfm" && ext != "exr" && ext != "hdr"; + } + + std::shared_ptr loadImage(const std::string& filename, int numChannels, bool srgb) + { + auto image = loadImage(filename, numChannels); + if (!srgb && isSrgbImage(filename)) + srgbInverse(*image); + return image; + } + + void saveImage(const std::string& filename, const ImageBuffer& image, bool srgb) + { + if (!srgb && isSrgbImage(filename)) + { + ImageBuffer newImage = image; + srgbForward(newImage); + saveImage(filename, newImage); + } + else + { + saveImage(filename, image); + } + } + + std::tuple compareImage(const ImageBuffer& image, + const ImageBuffer& ref, + float threshold) + { + assert(ref.dims() == image.dims()); + + size_t numErrors = 0; + float maxError = 0; + + for (size_t i = 0; i < image.size(); ++i) + { + const float actual = image[i]; + const float expect = ref[i]; + + float error = std::abs(expect - actual); + if (expect != 0) + error = std::min(error, error / expect); + + maxError = std::max(maxError, error); + if (error > threshold) + { + //std::cerr << "i=" << i << " expect=" << expect << " actual=" << actual; + ++numErrors; + } + } + + return std::make_tuple(numErrors, maxError); + } + +} // namespace oidn diff --git a/RenderingToolkit/oidn_gsg/src/apps/utils/image_io.h b/RenderingToolkit/oidn_gsg/src/apps/utils/image_io.h new file mode 100644 index 0000000000..f966ac55d4 --- /dev/null +++ b/RenderingToolkit/oidn_gsg/src/apps/utils/image_io.h @@ -0,0 +1,66 @@ +// Copyright 2009-2021 Intel Corporation +// SPDX-License-Identifier: Apache-2.0 + +#pragma once + +#include +#include +#include +#include +#include + +namespace oidn { + + struct ImageBuffer + { + std::vector buffer; + int width; + int height; + int numChannels; + + ImageBuffer() + : width(0), + height(0), + numChannels(0) {} + + ImageBuffer(int width, int height, int numChannels) + : buffer(size_t(width) * height * numChannels), + width(width), + height(height), + numChannels(numChannels) {} + + operator bool() const + { + return data() != nullptr; + } + + const float& operator [](size_t i) const { return buffer[i]; } + float& operator [](size_t i) { return buffer[i]; } + + const float* data() const { return buffer.data(); } + float* data() { return buffer.data(); } + + size_t size() const { return buffer.size(); } + std::array dims() const { return {width, height, numChannels}; } + }; + + // Loads an image with an optionally specified number of channels (loads all + // channels by default) + std::shared_ptr loadImage(const std::string& filename, int numChannels = 0); + + // Loads an image with/without sRGB to linear conversion + std::shared_ptr loadImage(const std::string& filename, int numChannels, bool srgb); + + // Saves an image + void saveImage(const std::string& filename, const ImageBuffer& image); + + // Saves an image with/without linear to sRGB conversion + void saveImage(const std::string& filename, const ImageBuffer& image, bool srgb); + + // Compares an image to a reference image and returns the number of errors + // and the maximum error value + std::tuple compareImage(const ImageBuffer& image, + const ImageBuffer& ref, + float threshold); + +} // namespace oidn diff --git a/RenderingToolkit/oidn_gsg/src/common/CMakeLists.txt b/RenderingToolkit/oidn_gsg/src/common/CMakeLists.txt new file mode 100644 index 0000000000..358646e9a9 --- /dev/null +++ b/RenderingToolkit/oidn_gsg/src/common/CMakeLists.txt @@ -0,0 +1,29 @@ +set(ONEAPI_ROOT "") +if($ENV{ONEAPI_ROOT}) + set(ONEAPI_ROOT $ENV{ONEAPI_ROOT}) +else() + if(WIN32) + set(ONEAPI_ROOT "C:/Program Files (x86)/Intel/oneAPI") + else() + set(ONEAPI_ROOT /opt/intel/oneapi) + endif() +endif($ENV{ONEAPI_ROOT}) +set(OIDN_ROOT ${ONEAPI_ROOT}/oidn/latest) +set(OIDN_INCLUDE_DIR ${OIDN_ROOT}/include) + +add_library(common STATIC + platform.h + platform.cpp + timer.h +) + +target_include_directories(common + PUBLIC + ${OIDN_ROOT} +) + +#target_link_libraries(common +# PUBLIC +# ${CMAKE_THREAD_LIBS_INIT} +# TBB +#) diff --git a/RenderingToolkit/oidn_gsg/src/common/platform.cpp b/RenderingToolkit/oidn_gsg/src/common/platform.cpp new file mode 100644 index 0000000000..d909a5acfa --- /dev/null +++ b/RenderingToolkit/oidn_gsg/src/common/platform.cpp @@ -0,0 +1,111 @@ +// Copyright 2009-2021 Intel Corporation +// SPDX-License-Identifier: Apache-2.0 + +#include "platform.h" + +namespace oidn { + + // --------------------------------------------------------------------------- + // Common functions + // --------------------------------------------------------------------------- + + void* alignedMalloc(size_t size, size_t alignment) + { + if (size == 0) + return nullptr; + + assert((alignment & (alignment-1)) == 0); + #if defined(OIDN_X64) + void* ptr = _mm_malloc(size, alignment); + #else + void* ptr; + if (posix_memalign(&ptr, max(alignment, sizeof(void*)), size) != 0) + ptr = nullptr; + #endif + + if (ptr == nullptr) + throw std::bad_alloc(); + + return ptr; + } + + void alignedFree(void* ptr) + { + if (ptr) + #if defined(OIDN_X64) + _mm_free(ptr); + #else + free(ptr); + #endif + } + + // --------------------------------------------------------------------------- + // System information + // --------------------------------------------------------------------------- + + std::string getPlatformName() + { + std::string name; + + #if defined(__linux__) + name = "Linux"; + #elif defined(__FreeBSD__) + name = "FreeBSD"; + #elif defined(__CYGWIN__) + name = "Cygwin"; + #elif defined(_WIN32) + name = "Windows"; + #elif defined(__APPLE__) + name = "macOS"; + #elif defined(__unix__) + name = "Unix"; + #else + return "Unknown"; + #endif + + #if defined(__x86_64__) || defined(_M_X64) || defined(__ia64__) || defined(__aarch64__) + name += " (64-bit)"; + #else + name += " (32-bit)"; + #endif + + return name; + } + + std::string getCompilerName() + { + #if defined(__INTEL_COMPILER) + int major = __INTEL_COMPILER / 100 % 100; + int minor = __INTEL_COMPILER % 100 / 10; + std::string version = "Intel Compiler "; + version += toString(major); + version += "." + toString(minor); + #if defined(__INTEL_COMPILER_UPDATE) + version += "." + toString(__INTEL_COMPILER_UPDATE); + #endif + return version; + #elif defined(__clang__) + return "Clang " __clang_version__; + #elif defined(__GNUC__) + return "GCC " __VERSION__; + #elif defined(_MSC_VER) + std::string version = toString(_MSC_FULL_VER); + version.insert(4, "."); + version.insert(9, "."); + version.insert(2, "."); + return "Visual C++ Compiler " + version; + #else + return "Unknown"; + #endif + } + + std::string getBuildName() + { + #if defined(NDEBUG) + return "Release"; + #else + return "Debug"; + #endif + } + +} // namespace oidn diff --git a/RenderingToolkit/oidn_gsg/src/common/platform.h b/RenderingToolkit/oidn_gsg/src/common/platform.h new file mode 100644 index 0000000000..b750f7762c --- /dev/null +++ b/RenderingToolkit/oidn_gsg/src/common/platform.h @@ -0,0 +1,176 @@ +// Copyright 2009-2021 Intel Corporation +// SPDX-License-Identifier: Apache-2.0 + +#pragma once + +// --------------------------------------------------------------------------- +// Macros +// --------------------------------------------------------------------------- + +#if defined(__x86_64__) || defined(_M_X64) + #define OIDN_X64 +#elif defined(__aarch64__) + #define OIDN_ARM64 +#endif + +#if defined(_WIN32) + // Windows + #if !defined(__noinline) + #define __noinline __declspec(noinline) + #endif +#else + // Unix + #if !defined(__forceinline) + #define __forceinline inline __attribute__((always_inline)) + #endif + #if !defined(__noinline) + #define __noinline __attribute__((noinline)) + #endif +#endif + +#ifndef UNUSED + #define UNUSED(x) ((void)x) +#endif +#ifndef MAYBE_UNUSED + #define MAYBE_UNUSED(x) UNUSED(x) +#endif + +// --------------------------------------------------------------------------- +// Includes +// --------------------------------------------------------------------------- + +#if defined(_WIN32) + #if !defined(WIN32_LEAN_AND_MEAN) + #define WIN32_LEAN_AND_MEAN + #endif + #if !defined(NOMINMAX) + #define NOMINMAX + #endif + #include +#elif defined(__APPLE__) + #include +#endif + +#if defined(OIDN_X64) + #include + #include +#endif + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "include/OpenImageDenoise/oidn.hpp" + +namespace oidn { + + // Introduce all names from the API namespace + OIDN_NAMESPACE_USING + + // --------------------------------------------------------------------------- + // Error handling and debugging + // --------------------------------------------------------------------------- + + struct Verbose + { + int verbose; + + Verbose(int v = 0) : verbose(v) {} + __forceinline bool isVerbose(int v = 1) const { return v <= verbose; } + }; + + #define OIDN_WARNING(message) { if (isVerbose()) std::cerr << "Warning: " << message << std::endl; } + #define OIDN_FATAL(message) throw std::runtime_error(message); + + // --------------------------------------------------------------------------- + // Common functions + // --------------------------------------------------------------------------- + + using std::min; + using std::max; + + template + __forceinline T clamp(const T& value, const T& minValue, const T& maxValue) + { + return min(max(value, minValue), maxValue); + } + + constexpr size_t memoryAlignment = 128; + + void* alignedMalloc(size_t size, size_t alignment = memoryAlignment); + void alignedFree(void* ptr); + + template + inline std::string toString(const T& a) + { + std::stringstream sm; + sm << a; + return sm.str(); + } + + template + inline T fromString(const std::string& str) + { + std::stringstream sm(str); + T a{}; + sm >> a; + return a; + } + + template<> + inline std::string fromString(const std::string& str) + { + return str; + } + +#if defined(__APPLE__) + template + inline bool getSysctl(const char* name, T& value) + { + int64_t result = 0; + size_t size = sizeof(result); + + if (sysctlbyname(name, &result, &size, nullptr, 0) != 0) + return false; + + value = T(result); + return true; + } +#endif + + template + inline bool getEnvVar(const std::string& name, T& value) + { + auto* str = getenv(name.c_str()); + bool found = (str != nullptr); + if (found) + value = fromString(str); + return found; + } + + inline bool isEnvVar(const std::string& name) + { + auto* str = getenv(name.c_str()); + return (str != nullptr); + } + + // --------------------------------------------------------------------------- + // System information + // --------------------------------------------------------------------------- + + std::string getPlatformName(); + std::string getCompilerName(); + std::string getBuildName(); + +} // namespace oidn + diff --git a/RenderingToolkit/oidn_gsg/src/common/timer.h b/RenderingToolkit/oidn_gsg/src/common/timer.h new file mode 100644 index 0000000000..8d64a69178 --- /dev/null +++ b/RenderingToolkit/oidn_gsg/src/common/timer.h @@ -0,0 +1,36 @@ +// Copyright 2009-2021 Intel Corporation +// SPDX-License-Identifier: Apache-2.0 + +#pragma once + +#include "platform.h" +#include + +namespace oidn { + + class Timer + { + private: + using clock = std::chrono::high_resolution_clock; + + std::chrono::time_point start; + + public: + Timer() + { + reset(); + } + + void reset() + { + start = clock::now(); + } + + double query() const + { + auto end = clock::now(); + return std::chrono::duration_cast>(end - start).count(); + } + }; + +} // namespace oidn diff --git a/RenderingToolkit/openvkl_gsg/CMakeLists.txt b/RenderingToolkit/openvkl_gsg/CMakeLists.txt new file mode 100644 index 0000000000..b50047915f --- /dev/null +++ b/RenderingToolkit/openvkl_gsg/CMakeLists.txt @@ -0,0 +1,26 @@ +cmake_minimum_required(VERSION 3.16) +project(OPENVKL_GSG LANGUAGES C) + +find_package(openvkl REQUIRED) + +set(ONEAPI_ROOT "") +if($ENV{ONEAPI_ROOT}) + set(ONEAPI_ROOT $ENV{ONEAPI_ROOT}) +else() + if(WIN32) + set(ONEAPI_ROOT "C:/Program Files (x86)/Intel/oneAPI") + else() + set(ONEAPI_ROOT /opt/intel/oneapi) + endif() +endif($ENV{ONEAPI_ROOT}) + +set(OPENVKL_ROOT ${ONEAPI_ROOT}/openvkl/latest) +set(OPENVKL_INCLUDE_DIR ${OPENVKL_ROOT}/include) +message(STATUS "OPENVKL_INCLUDE_DIR: ${OPENVKL_INCLUDE_DIR}") +message(STATUS "ONEAPI_ROOT: ${ONEAPI_ROOT}") +include_directories(${OPENVKL_INCLUDE_DIR} ${ONEAPI_ROOT}/rkcommon/latest/include) +link_directories(${OPENVKL_ROOT}/lib) + +add_executable(vklTutorial src/vklTutorial.c) +target_link_libraries(vklTutorial PRIVATE openvkl) +install(TARGETS vklTutorial RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}) diff --git a/RenderingToolkit/openvkl_gsg/sample.json b/RenderingToolkit/openvkl_gsg/sample.json new file mode 100644 index 0000000000..4eeeac8097 --- /dev/null +++ b/RenderingToolkit/openvkl_gsg/sample.json @@ -0,0 +1,22 @@ +{ + "guid": "80BB7E55-6FCA-491F-8541-E271324CF169", + "name": "Intel Open VKL Getting Started", + "categories": ["Toolkit/oneAPI Rendering Toolkit/Open VKL/Open-VKL-Getting-Started"], + "description": "This introductory hello rendering toolkit sample illustrates how to sample with Intel Open VKL", + "builder": ["cli"], + "languages": [{"c":{}}], + "dependencies": ["tbb","openvkl","embree","rkcommon"], + "os":["linux", "windows", "darwin"], + "targetDevice": ["CPU"], + "ciTests": { + "linux": [ + { + "env": ["source /opt/intel/oneapi/setvars.sh --force", "conda create -n ospray-tutorial-test -c intel -c conda-forge matplotlib runipy intel-aikit-modin", "source activate aikit-modin-test"], + "id": "Intel_Open_VKL_vklTutorial", + "steps": [ + "vklTutorial.exe" + ] + } + ] +} +} diff --git a/RenderingToolkit/openvkl_gsg/src/vklTutorial.c b/RenderingToolkit/openvkl_gsg/src/vklTutorial.c new file mode 100644 index 0000000000..c12f0547fd --- /dev/null +++ b/RenderingToolkit/openvkl_gsg/src/vklTutorial.c @@ -0,0 +1,390 @@ +// Copyright 2019-2021 Intel Corporation +// SPDX-License-Identifier: Apache-2.0 + +#include +#include + +#if defined(_MSC_VER) +#include // _malloca +#include // Sleep +#endif + +void demoScalarAPI(VKLDevice device, VKLVolume volume) +{ + printf("demo of 1-wide API\n"); + + VKLSampler sampler = vklNewSampler(volume); + vklCommit(sampler); + + // bounding box + vkl_box3f bbox = vklGetBoundingBox(volume); + printf("\tbounding box\n"); + printf("\t\tlower = %f %f %f\n", bbox.lower.x, bbox.lower.y, bbox.lower.z); + printf("\t\tupper = %f %f %f\n\n", bbox.upper.x, bbox.upper.y, bbox.upper.z); + + // number of attributes + unsigned int numAttributes = vklGetNumAttributes(volume); + printf("\tnum attributes = %d\n\n", numAttributes); + + // value range for all attributes + for (unsigned int i = 0; i < numAttributes; i++) { + vkl_range1f valueRange = vklGetValueRange(volume, i); + printf("\tvalue range (attribute %u) = (%f %f)\n", + i, + valueRange.lower, + valueRange.upper); + } + + // coordinate for sampling / gradients + vkl_vec3f coord = {1.f, 2.f, 3.f}; + printf("\n\tcoord = %f %f %f\n\n", coord.x, coord.y, coord.z); + + // sample, gradient (first attribute) + unsigned int attributeIndex = 0; + float time = 0.f; + float sample = vklComputeSample(sampler, &coord, attributeIndex, time); + vkl_vec3f grad = vklComputeGradient(sampler, &coord, attributeIndex, time); + printf("\tsampling and gradient computation (first attribute)\n"); + printf("\t\tsample = %f\n", sample); + printf("\t\tgrad = %f %f %f\n\n", grad.x, grad.y, grad.z); + + // sample (multiple attributes) + unsigned int M = 3; + unsigned int attributeIndices[] = {0, 1, 2}; + float samples[3]; + vklComputeSampleM(sampler, &coord, samples, M, attributeIndices, time); + printf("\tsampling (multiple attributes)\n"); + printf("\t\tsamples = %f %f %f\n\n", samples[0], samples[1], samples[2]); + + // interval iterator context setup + vkl_range1f ranges[2] = {{10, 20}, {50, 75}}; + int num_ranges = 2; + VKLData rangesData = + vklNewData(device, num_ranges, VKL_BOX1F, ranges, VKL_DATA_DEFAULT, 0); + + VKLIntervalIteratorContext intervalContext = + vklNewIntervalIteratorContext(sampler); + + vklSetInt(intervalContext, "attributeIndex", attributeIndex); + + vklSetData(intervalContext, "valueRanges", rangesData); + vklRelease(rangesData); + + vklCommit(intervalContext); + + // hit iterator context setup + float values[2] = {32, 96}; + int num_values = 2; + VKLData valuesData = + vklNewData(device, num_values, VKL_FLOAT, values, VKL_DATA_DEFAULT, 0); + + VKLHitIteratorContext hitContext = vklNewHitIteratorContext(sampler); + + vklSetInt(hitContext, "attributeIndex", attributeIndex); + + vklSetData(hitContext, "values", valuesData); + vklRelease(valuesData); + + vklCommit(hitContext); + + // ray definition for iterators + vkl_vec3f rayOrigin = {0, 1, 1}; + vkl_vec3f rayDirection = {1, 0, 0}; + vkl_range1f rayTRange = {0, 200}; + printf("\trayOrigin = %f %f %f\n", rayOrigin.x, rayOrigin.y, rayOrigin.z); + printf("\trayDirection = %f %f %f\n", + rayDirection.x, + rayDirection.y, + rayDirection.z); + printf("\trayTRange = %f %f\n", rayTRange.lower, rayTRange.upper); + + // interval iteration. This is scoped + { + // Note: buffer will cease to exist at the end of this scope. +#if defined(_MSC_VER) + // MSVC does not support variable length arrays, but provides a + // safer version of alloca. + char *buffer = _malloca(vklGetIntervalIteratorSize(intervalContext)); +#else + char buffer[vklGetIntervalIteratorSize(intervalContext)]; +#endif + VKLIntervalIterator intervalIterator = + vklInitIntervalIterator(intervalContext, + &rayOrigin, + &rayDirection, + &rayTRange, + time, + buffer); + + printf("\n\tinterval iterator for value ranges {%f %f} {%f %f}\n", + ranges[0].lower, + ranges[0].upper, + ranges[1].lower, + ranges[1].upper); + + for (;;) { + VKLInterval interval; + int result = vklIterateInterval(intervalIterator, &interval); + if (!result) + break; + printf( + "\t\ttRange (%f %f)\n\t\tvalueRange (%f %f)\n\t\tnominalDeltaT " + "%f\n\n", + interval.tRange.lower, + interval.tRange.upper, + interval.valueRange.lower, + interval.valueRange.upper, + interval.nominalDeltaT); + } +#if defined(_MSC_VER) + _freea(buffer); +#endif + } + + // hit iteration + { +#if defined(_MSC_VER) + // MSVC does not support variable length arrays, but provides a + // safer version of alloca. + char *buffer = _malloca(vklGetHitIteratorSize(hitContext)); +#else + char buffer[vklGetHitIteratorSize(hitContext)]; +#endif + VKLHitIterator hitIterator = vklInitHitIterator(hitContext, + &rayOrigin, + &rayDirection, + &rayTRange, + time, + buffer); + + printf("\thit iterator for values %f %f\n", values[0], values[1]); + + for (;;) { + VKLHit hit; + int result = vklIterateHit(hitIterator, &hit); + if (!result) + break; + printf("\t\tt %f\n\t\tsample %f\n\t\tepsilon %f\n\n", + hit.t, + hit.sample, + hit.epsilon); + } +#if defined(_MSC_VER) + _freea(buffer); +#endif + } + + vklRelease(hitContext); + vklRelease(intervalContext); + vklRelease(sampler); +} + +void demoVectorAPI(VKLVolume volume) +{ + printf("demo of 4-wide API (8- and 16- follow the same pattern)\n"); + + VKLSampler sampler = vklNewSampler(volume); + vklCommit(sampler); + + // structure-of-array layout + vkl_vvec3f4 coord4; + int valid[4]; + for (int i = 0; i < 4; i++) { + coord4.x[i] = i * 3 + 0; + coord4.y[i] = i * 3 + 1; + coord4.z[i] = i * 3 + 2; + valid[i] = -1; // valid mask: 0 = not valid, -1 = valid + } + + for (int i = 0; i < 4; i++) { + printf( + "\tcoord[%d] = %f %f %f\n", i, coord4.x[i], coord4.y[i], coord4.z[i]); + } + + // sample, gradient (first attribute) + unsigned int attributeIndex = 0; + float time4[4] = {0.f}; + float sample4[4]; + vkl_vvec3f4 grad4; + vklComputeSample4(valid, sampler, &coord4, sample4, attributeIndex, time4); + vklComputeGradient4(valid, sampler, &coord4, &grad4, attributeIndex, time4); + + printf("\n\tsampling and gradient computation (first attribute)\n"); + + for (int i = 0; i < 4; i++) { + printf("\t\tsample[%d] = %f\n", i, sample4[i]); + printf( + "\t\tgrad[%d] = %f %f %f\n", i, grad4.x[i], grad4.y[i], grad4.z[i]); + } + + // sample (multiple attributes) + unsigned int M = 3; + unsigned int attributeIndices[] = {0, 1, 2}; + float samples[3 * 4]; + vklComputeSampleM4( + valid, sampler, &coord4, samples, M, attributeIndices, time4); + + printf("\n\tsampling (multiple attributes)\n"); + + printf("\t\tsamples = "); + + for (unsigned int j = 0; j < M; j++) { + printf("%f %f %f %f\n", + samples[j * 4 + 0], + samples[j * 4 + 1], + samples[j * 4 + 2], + samples[j * 4 + 3]); + printf("\t\t "); + } + + printf("\n"); + + vklRelease(sampler); +} + +void demoStreamAPI(VKLVolume volume) +{ + printf("demo of stream API\n"); + + VKLSampler sampler = vklNewSampler(volume); + vklCommit(sampler); + + // array-of-structure layout; arbitrary stream lengths are supported + vkl_vec3f coord[5]; + + for (int i = 0; i < 5; i++) { + coord[i].x = i * 3 + 0; + coord[i].y = i * 3 + 1; + coord[i].z = i * 3 + 2; + } + + for (int i = 0; i < 5; i++) { + printf("\tcoord[%d] = %f %f %f\n", i, coord[i].x, coord[i].y, coord[i].z); + } + + // sample, gradient (first attribute) + printf("\n\tsampling and gradient computation (first attribute)\n"); + unsigned int attributeIndex = 0; + float time[5] = {0.f}; + float sample[5]; + vkl_vec3f grad[5]; + vklComputeSampleN(sampler, 5, coord, sample, attributeIndex, time); + vklComputeGradientN(sampler, 5, coord, grad, attributeIndex, time); + + for (int i = 0; i < 5; i++) { + printf("\t\tsample[%d] = %f\n", i, sample[i]); + printf("\t\tgrad[%d] = %f %f %f\n", i, grad[i].x, grad[i].y, grad[i].z); + } + + // sample (multiple attributes) + unsigned int M = 3; + unsigned int attributeIndices[] = {0, 1, 2}; + float samples[3 * 5]; + vklComputeSampleMN(sampler, 5, coord, samples, M, attributeIndices, time); + + printf("\n\tsampling (multiple attributes)\n"); + + printf("\t\tsamples = "); + + for (int i = 0; i < 5; i++) { + for (unsigned int j = 0; j < M; j++) { + printf("%f ", samples[i * M + j]); + } + printf("\n\t\t "); + } + + printf("\n"); + + vklRelease(sampler); +} + +int main() +{ + vklLoadModule("cpu_device"); + + VKLDevice device = vklNewDevice("cpu"); + vklCommitDevice(device); + + const int dimensions[] = {128, 128, 128}; + + const int numVoxels = dimensions[0] * dimensions[1] * dimensions[2]; + + const int numAttributes = 3; + + VKLVolume volume = vklNewVolume(device, "structuredRegular"); + vklSetVec3i( + volume, "dimensions", dimensions[0], dimensions[1], dimensions[2]); + vklSetVec3f(volume, "gridOrigin", 0, 0, 0); + vklSetVec3f(volume, "gridSpacing", 1, 1, 1); + + float *voxels = malloc(numVoxels * sizeof(float)); + + if (!voxels) { + printf("failed to allocate voxel memory!\n"); + return 1; + } + + // volume attribute 0: x-grad + for (int k = 0; k < dimensions[2]; k++) + for (int j = 0; j < dimensions[1]; j++) + for (int i = 0; i < dimensions[0]; i++) + voxels[k * dimensions[0] * dimensions[1] + j * dimensions[2] + i] = + (float)i; + + VKLData data0 = + vklNewData(device, numVoxels, VKL_FLOAT, voxels, VKL_DATA_DEFAULT, 0); + + // volume attribute 1: y-grad + for (int k = 0; k < dimensions[2]; k++) + for (int j = 0; j < dimensions[1]; j++) + for (int i = 0; i < dimensions[0]; i++) + voxels[k * dimensions[0] * dimensions[1] + j * dimensions[2] + i] = + (float)j; + + VKLData data1 = + vklNewData(device, numVoxels, VKL_FLOAT, voxels, VKL_DATA_DEFAULT, 0); + + // volume attribute 2: z-grad + for (int k = 0; k < dimensions[2]; k++) + for (int j = 0; j < dimensions[1]; j++) + for (int i = 0; i < dimensions[0]; i++) + voxels[k * dimensions[0] * dimensions[1] + j * dimensions[2] + i] = + (float)k; + + VKLData data2 = + vklNewData(device, numVoxels, VKL_FLOAT, voxels, VKL_DATA_DEFAULT, 0); + + VKLData attributes[] = {data0, data1, data2}; + + VKLData attributesData = vklNewData( + device, numAttributes, VKL_DATA, attributes, VKL_DATA_DEFAULT, 0); + + vklRelease(data0); + vklRelease(data1); + vklRelease(data2); + + vklSetData(volume, "data", attributesData); + vklRelease(attributesData); + + vklCommit(volume); + + demoScalarAPI(device, volume); + demoVectorAPI(volume); + demoStreamAPI(volume); + + vklRelease(volume); + + vklReleaseDevice(device); + + free(voxels); + + printf("complete.\n"); + +#if defined(_MSC_VER) + // On Windows, sleep for a few seconds so the terminal window doesn't close + // immediately. + Sleep(3000); +#endif + + return 0; +} diff --git a/RenderingToolkit/ospray_gsg/CMakeLists.txt b/RenderingToolkit/ospray_gsg/CMakeLists.txt new file mode 100644 index 0000000000..a7016ac36b --- /dev/null +++ b/RenderingToolkit/ospray_gsg/CMakeLists.txt @@ -0,0 +1,27 @@ +cmake_minimum_required(VERSION 3.16) +project(OSPRay_gsg LANGUAGES C CXX) + +find_package(ospray REQUIRED) + +set(ONEAPI_ROOT "") +if($ENV{ONEAPI_ROOT}) + set(ONEAPI_ROOT $ENV{ONEAPI_ROOT}) +else() + if(WIN32) + set(ONEAPI_ROOT "C:/Program Files (x86)/Intel/oneAPI") + else() + set(ONEAPI_ROOT /opt/intel/oneapi) + endif() +endif($ENV{ONEAPI_ROOT}) + + +message(STATUS "ONEAPI_ROOT: ${ONEAPI_ROOT}") +include_directories(${OSPRAY_INCLUDE_DIR} ${RKCOMMON_INCLUDE_DIRS}) +link_directories(${OSPRAY_ROOT}/lib ${ONEAPI_ROOT}/rkcommon/latest/lib) + +add_executable(ospTutorialCpp ${OSPRAY_RESOURCE} src/ospTutorial.cpp) +target_link_libraries(ospTutorialCpp PRIVATE ospray rkcommon) + +install(TARGETS ospTutorialCpp + DESTINATION ${CMAKE_INSTALL_BINDIR} +) diff --git a/RenderingToolkit/ospray_gsg/sample.json b/RenderingToolkit/ospray_gsg/sample.json new file mode 100644 index 0000000000..4a8d9f873a --- /dev/null +++ b/RenderingToolkit/ospray_gsg/sample.json @@ -0,0 +1,22 @@ +{ + "guid": "40C26D31-D553-4BD9-9E1D-63DDF352CB85", + "name": "Intel OSPRay Getting Started", + "categories": ["Toolkit/oneAPI Rendering Toolkit/OSPRay/OSPRay-Getting-Started"], + "description": "This introductory hellorenderingtoolkit sample illustrates how to render triangle data with the pathtracer from Intel OSPRay", + "builder": ["cli"], + "languages": [{"c":{}}, {"cpp":{}}], + "dependencies": ["tbb","ospray","openvkl","embree","rkcommon"], + "os":["linux", "windows", "darwin"], + "targetDevice": ["CPU"], + "ciTests": { + "linux": [ + { + "env": ["source /opt/intel/oneapi/setvars.sh --force", "conda create -n ospray-tutorial-test -c intel -c conda-forge matplotlib runipy intel-aikit-modin", "source activate aikit-modin-test"], + "id": "Intel_OSPRay_ospTutorial", + "steps": [ + "ospTutorialCpp.exe" + ] + } + ] +} +} diff --git a/RenderingToolkit/ospray_gsg/src/ospTutorial.cpp b/RenderingToolkit/ospray_gsg/src/ospTutorial.cpp new file mode 100644 index 0000000000..276ba7b9bf --- /dev/null +++ b/RenderingToolkit/ospray_gsg/src/ospTutorial.cpp @@ -0,0 +1,172 @@ +// Copyright 2009-2021 Intel Corporation +// SPDX-License-Identifier: Apache-2.0 + +/* This is a small example tutorial how to use OSPRay in an application. + * + * On Linux build it in the build_directory with + * g++ ../apps/ospTutorial/ospTutorial.cpp -I ../ospray/include \ + * -I ../../rkcommon -L . -lospray -Wl,-rpath,. -o ospTutorial + * On Windows build it in the build_directory\$Configuration with + * cl ..\..\apps\ospTutorial\ospTutorial.cpp /EHsc -I ..\..\ospray\include ^ + * -I ..\.. -I ..\..\..\rkcommon ospray.lib + * Above commands assume that rkcommon is present in a directory right "next + * to" the OSPRay directory. If this is not the case, then adjust the include + * path (alter "-I " appropriately). + */ + +#include +#include +#include +#ifdef _WIN32 +#define NOMINMAX +#include +#include +#include +#else +#include +#endif + +#include + +#include "ospray/ospray_cpp.h" +#include "ospray/ospray_cpp/ext/rkcommon.h" +#include "rkcommon/utility/SaveImage.h" + +using namespace rkcommon::math; + +int main(int argc, const char **argv) +{ + // image size + vec2i imgSize; + imgSize.x = 1024; // width + imgSize.y = 768; // height + + // camera + vec3f cam_pos{0.f, 0.f, 0.f}; + vec3f cam_up{0.f, 1.f, 0.f}; + vec3f cam_view{0.1f, 0.f, 1.f}; + + // triangle mesh data + std::vector vertex = {vec3f(-1.0f, -1.0f, 3.0f), + vec3f(-1.0f, 1.0f, 3.0f), + vec3f(1.0f, -1.0f, 3.0f), + vec3f(0.1f, 0.1f, 0.3f)}; + + std::vector color = {vec4f(0.9f, 0.5f, 0.5f, 1.0f), + vec4f(0.8f, 0.8f, 0.8f, 1.0f), + vec4f(0.8f, 0.8f, 0.8f, 1.0f), + vec4f(0.5f, 0.9f, 0.5f, 1.0f)}; + + std::vector index = {vec3ui(0, 1, 2), vec3ui(1, 2, 3)}; + +#ifdef _WIN32 + bool waitForKey = false; + CONSOLE_SCREEN_BUFFER_INFO csbi; + if (GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &csbi)) { + // detect standalone console: cursor at (0,0)? + waitForKey = csbi.dwCursorPosition.X == 0 && csbi.dwCursorPosition.Y == 0; + } +#endif + + // initialize OSPRay; OSPRay parses (and removes) its commandline parameters, + // e.g. "--osp:debug" + OSPError init_error = ospInit(&argc, argv); + if (init_error != OSP_NO_ERROR) + return init_error; + + // use scoped lifetimes of wrappers to release everything before ospShutdown() + { + // create and setup camera + ospray::cpp::Camera camera("perspective"); + camera.setParam("aspect", imgSize.x / (float)imgSize.y); + camera.setParam("position", cam_pos); + camera.setParam("direction", cam_view); + camera.setParam("up", cam_up); + camera.commit(); // commit each object to indicate modifications are done + + // create and setup model and mesh + ospray::cpp::Geometry mesh("mesh"); + mesh.setParam("vertex.position", ospray::cpp::CopiedData(vertex)); + mesh.setParam("vertex.color", ospray::cpp::CopiedData(color)); + mesh.setParam("index", ospray::cpp::CopiedData(index)); + mesh.commit(); + + // put the mesh into a model + ospray::cpp::GeometricModel model(mesh); + model.commit(); + + // put the model into a group (collection of models) + ospray::cpp::Group group; + group.setParam("geometry", ospray::cpp::CopiedData(model)); + group.commit(); + + // put the group into an instance (give the group a world transform) + ospray::cpp::Instance instance(group); + instance.commit(); + + // put the instance in the world + ospray::cpp::World world; + world.setParam("instance", ospray::cpp::CopiedData(instance)); + + // create and setup light for Ambient Occlusion + ospray::cpp::Light light("ambient"); + light.commit(); + + world.setParam("light", ospray::cpp::CopiedData(light)); + world.commit(); + + // create renderer, choose Scientific Visualization renderer + ospray::cpp::Renderer renderer("scivis"); + + // complete setup of renderer + renderer.setParam("aoSamples", 1); + renderer.setParam("backgroundColor", 1.0f); // white, transparent + renderer.commit(); + + // create and setup framebuffer + ospray::cpp::FrameBuffer framebuffer( + imgSize.x, imgSize.y, OSP_FB_SRGBA, OSP_FB_COLOR | OSP_FB_ACCUM); + framebuffer.clear(); + + // render one frame + framebuffer.renderFrame(renderer, camera, world); + + // access framebuffer and write its content as PPM file + uint32_t *fb = (uint32_t *)framebuffer.map(OSP_FB_COLOR); + rkcommon::utility::writePPM("firstFrameCpp.ppm", imgSize.x, imgSize.y, fb); + framebuffer.unmap(fb); + std::cout << "rendering initial frame to firstFrameCpp.ppm" << std::endl; + + // render 10 more frames, which are accumulated to result in a better + // converged image + for (int frames = 0; frames < 10; frames++) + framebuffer.renderFrame(renderer, camera, world); + + fb = (uint32_t *)framebuffer.map(OSP_FB_COLOR); + rkcommon::utility::writePPM( + "accumulatedFrameCpp.ppm", imgSize.x, imgSize.y, fb); + framebuffer.unmap(fb); + std::cout << "rendering 10 accumulated frames to accumulatedFrameCpp.ppm" + << std::endl; + + ospray::cpp::PickResult res = + framebuffer.pick(renderer, camera, world, 0.5f, 0.5f); + + if (res.hasHit) { + std::cout << "picked geometry [instance: " << res.instance.handle() + << ", model: " << res.model.handle() + << ", primitive: " << res.primID << "]" << std::endl; + } + } + + ospShutdown(); + +#ifdef _WIN32 + if (waitForKey) { + printf("\n\tpress any key to exit"); + _getch(); + } +#endif + + return 0; +} From f0a1b50baf3dbad0c6f41d439c4f537047680c2a Mon Sep 17 00:00:00 2001 From: Michael R Carroll Date: Fri, 8 Oct 2021 17:17:10 -0700 Subject: [PATCH 04/36] signed inital commit for RenderingToolkit GSG intro samples Signed-off-by: Michael R Carroll --- RenderingToolkit/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/RenderingToolkit/README.md b/RenderingToolkit/README.md index 97428f896b..f0ff3dd46b 100644 --- a/RenderingToolkit/README.md +++ b/RenderingToolkit/README.md @@ -4,7 +4,7 @@ TBD You can find more information at the [ Intel oneAPI Rendering Toolkit portal](https://software.intel.com/content/www/us/en/develop/tools/oneapi/rendering-toolkit.html). -Users could learn how to run samples for different components in oneAPI Rendering Toolkit +Users learn how to build and run samples for the component libraries in oneAPI Rendering Toolkit ## License From 9fa62eafe11d5975134a7b479e50cef4e439416c Mon Sep 17 00:00:00 2001 From: Michael R Carroll Date: Fri, 8 Oct 2021 17:32:00 -0700 Subject: [PATCH 05/36] Added generated GUIDS to .repo-tools/Docs_Automation/guids.json (signed commit) Signed-off-by: Michael R Carroll --- .repo-tools/Docs_Automation/guids.json | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/.repo-tools/Docs_Automation/guids.json b/.repo-tools/Docs_Automation/guids.json index e1c7b3f15d..45a1cc85ca 100644 --- a/.repo-tools/Docs_Automation/guids.json +++ b/.repo-tools/Docs_Automation/guids.json @@ -920,5 +920,24 @@ "guid": "81B93386-B5EB-4998-B91B-3453263EC03E", "ver": "2021.4.0", "name": "Intel® Python Scikit-learn Extension Getting Started" + }, + "87FA013D-0B19-45AE-BCD5-43412BE0A99F" : { + "guid": "87FA013D-0B19-45AE-BCD5-43412BE0A99F", + "ver": "2021.4.0", + "name": "Intel oneAPI Rendering Toolkit Embree Getting Started" + }, + "41F82C06-A9FA-4521-B87A-8F7304CB6631" : { + "guid": "41F82C06-A9FA-4521-B87A-8F7304CB6631", + "ver": "2021.4.0", + "name": "Intel oneAPI Rendering Toolkit Open Image Denoise Getting Started" + }, + "80BB7E55-6FCA-491F-8541-E271324CF169" : { + "guid": "80BB7E55-6FCA-491F-8541-E271324CF169", + "ver": "2021.4.0", + "name": "Intel oneAPI Rendering Toolkit Open VKL Getting Started" + }, + "40C26D31-D553-4BD9-9E1D-63DDF352CB85" : { + "guid": "40C26D31-D553-4BD9-9E1D-63DDF352CB85", + "ver": "2021.4.0", + "name": "Intel oneAPI Rendering Toolkit OSPRay Getting Started" } -} \ No newline at end of file From be21e944a1c1fc3986e71de96720e2fa2ffb52e9 Mon Sep 17 00:00:00 2001 From: Michael R Carroll <43764969+MichaelRoyceCarroll@users.noreply.github.com> Date: Thu, 14 Oct 2021 15:59:50 -0700 Subject: [PATCH 06/36] Update README.md Moving README.md content to individual folders --- RenderingToolkit/README.md | 129 ++++--------------------------------- 1 file changed, 12 insertions(+), 117 deletions(-) diff --git a/RenderingToolkit/README.md b/RenderingToolkit/README.md index f0ff3dd46b..32e8523cd2 100644 --- a/RenderingToolkit/README.md +++ b/RenderingToolkit/README.md @@ -4,7 +4,7 @@ TBD You can find more information at the [ Intel oneAPI Rendering Toolkit portal](https://software.intel.com/content/www/us/en/develop/tools/oneapi/rendering-toolkit.html). -Users learn how to build and run samples for the component libraries in oneAPI Rendering Toolkit +Users learn how to build and run samples for the component libraries in Render Kit. ## License @@ -15,130 +15,25 @@ Code samples are licensed under the MIT license. See Third party program Licenses can be found here: [third-party-programs.txt](https://github.com/oneapi-src/oneAPI-samples/blob/master/third-party-programs.txt) -## Getting Started Samples - -| Component | Folder | Description | -| --------- | ------------------------------------------------ | - | -| Intel OSPRay | [ospray_gsg](ospray_gsg) | Get started with Intel OSPRay | -| Intel Embree | [embree_gsg](embree_gsg)| Get started with Intel Embree | -| Intel Open Volume Kernel Library | [openvkl_gsg](openvkl_gsg)| Get started with Intel Open VKL | -| Intel Open Image Denoise | [oidn_gsg](oidn_gsg) | Get started with Intel Open Image Denoise | - -## Build A Sample: +## Requirements To build and run the samples you will need a compiler toolchain and imaging tools: Compiler: -- MSVS2019 on Windows OS +- MSVS 2019 on Windows* OS - On other platforms a C++11 compiler and a C99 compiler. (Ex: gcc/g++/clang) Imaging Tools: - An image **display program** for .ppm and .pfm filetypes . Ex: [ImageMagick](https://www.imagemagick.org/) -- An image **converter** for .ppm and .pfm filetypes and endian conversions. Ex: [ImageMagick](https://www.imagemagick.org/) - -### Windows OS: - -Run a new **x64 Native Tools Command Prompt for VS 2019** - -``` -call \setvars.bat -cd RenderingToolkit\_gsg -mkdir build -cd build -cmake -G”Visual Studio 16 2019” -A x64 -DCMAKE_PREFIX_PATH=”” .. -cmake -–build . --config Release -cd Release -``` - - -### Linux OS: - -Start a new Terminal session -``` -source /setvars.sh -cd RenderingToolkit/_gsg -mkdir build -cd build -cmake -DCMAKE_PREFIX_PATH=”” .. -cmake -–build . -``` - - - -### MacOS: - -Start a new Terminal session - -``` -source /setvars.sh -cd RenderingToolkit/_gsg -mkdir build -cd build -cmake -DCMAKE_PREFIX_PATH=”” .. -cmake -–build . -``` - - -## Run a built sample - -### Running ospray_gsg - -Set environment variables if and only if they have not been already set in the same shell for the build step -- Windows OS: `call \setvars.bat` -- Linux OS/MacOS: `source /setvars.sh` -Run built '`ospTutorialCpp`' executable -Results are emmitted to disk in the local directory. -Use an image viewer like ImageMagick display (imdisplay) to review output .ppm files. -``` -imdisplay firstFrameCpp.ppm -imdisplay accumulatedFrameCpp.ppm -``` -Notice image convergence as OSPRay performs more accumulations to generate the second image. - -### Running embree_gsg - -Set environment variables if and only if they have not been already set in the same shell for the build step -- Windows OS: `call \setvars.bat` -- Linux OS/MacOS: `source /setvars.sh` - -Run the built `minimal` executable -Embree results are emmitted to the command line interface. - -### Running openvkl_gsg - -Set environment variables if and only if they have not been already set in the same shell for the build step: -- Windows OS: `call \setvars.bat` -- Linux OS/MacOS: `source /setvars.sh` - -Run the built `vklTutorial` executable from the command line -Results are emitted to the command line interface. - -### Running oidn_gsg - -Set environment variables if and only if they have not been already set in the same shell for the build step -- Windows OS: `call \setvars.bat` -- Linux OS/MacOS: `source /setvars.sh` - -First, run ospray_gsg sample executable `ospTutorialCpp` from above. -Convert `ospTutorialCpp` output .ppm images to .pfm LSB format. Use a tool like [ImageMagick](https://www.imagemagick.org/) **convert**. Ex: - -`magick convert accumulatedFrameCpp.ppm -endian LSB PFM:accumulatedFrameCpp.pfm` - -Run oidn_gsg sample program `oidnDenoise` with .pfm as input: - -`oidnDenoise --hdr /accumulatedFrameCpp.pfm -o denoisedAccumulatedFrameCpp.pfm` - -Review the output with an image viewer like [ImageMagick](https://www.imagemagick.org/) **display**: - -`imdisplay denoisedAccumulatedFrameCpp.pfm` - -Visually compare the denoised image to the original accumulatedFrameCpp.pfm: - -`imdisplay /accumulatedFrameCpp.pfm` - - - - +- An image **converter** for .ppm filetypes, .pfm filetypes, and endian conversions. Ex: [ImageMagick](https://www.imagemagick.org/) +## Getting Started Samples +Please try the getting started sample programs in order. Outputs of a sample may serve as inputs for anothe sample. +| Order | Component | Folder | Description | +| -- | --------- | ------------------------------------------------ | - | +| 1 | Intel OSPRay | [01_ospray_gsg](ospray_gsg) | Get started with Intel OSPRay | +| 2 | Intel Embree | [02_embree_gsg](embree_gsg)| Get started with Intel Embree | +| 3 | Intel Open Volume Kernel Library | [03_openvkl_gsg](openvkl_gsg)| Get started with Intel Open VKL | +| 4 | Intel Open Image Denoise | [04_oidn_gsg](oidn_gsg) | Get started with Intel Open Image Denoise | From 78b2bff9df7c382969da938866368ddc501cf614 Mon Sep 17 00:00:00 2001 From: Michael R Carroll Date: Thu, 14 Oct 2021 20:25:05 -0700 Subject: [PATCH 07/36] Order samples folders Signed-off-by: Michael R Carroll --- RenderingToolkit/{ospray_gsg => 01_ospray_gsg}/CMakeLists.txt | 0 RenderingToolkit/{ospray_gsg => 01_ospray_gsg}/sample.json | 0 .../{ospray_gsg => 01_ospray_gsg}/src/ospTutorial.cpp | 0 RenderingToolkit/{embree_gsg => 02_embree_gsg}/CMakeLists.txt | 0 RenderingToolkit/{embree_gsg => 02_embree_gsg}/sample.json | 0 RenderingToolkit/{embree_gsg => 02_embree_gsg}/src/minimal.cpp | 0 RenderingToolkit/{openvkl_gsg => 03_openvkl_gsg}/CMakeLists.txt | 0 RenderingToolkit/{openvkl_gsg => 03_openvkl_gsg}/sample.json | 0 .../{openvkl_gsg => 03_openvkl_gsg}/src/vklTutorial.c | 0 RenderingToolkit/{oidn_gsg => 04_oidn_gsg}/CMakeLists.txt | 0 RenderingToolkit/{oidn_gsg => 04_oidn_gsg}/sample.json | 0 .../{oidn_gsg => 04_oidn_gsg}/src/apps/oidnDenoise.cpp | 0 .../{oidn_gsg => 04_oidn_gsg}/src/apps/utils/CMakeLists.txt | 0 .../{oidn_gsg => 04_oidn_gsg}/src/apps/utils/arg_parser.h | 0 .../{oidn_gsg => 04_oidn_gsg}/src/apps/utils/image_io.cpp | 0 .../{oidn_gsg => 04_oidn_gsg}/src/apps/utils/image_io.h | 0 .../{oidn_gsg => 04_oidn_gsg}/src/common/CMakeLists.txt | 0 .../{oidn_gsg => 04_oidn_gsg}/src/common/platform.cpp | 0 RenderingToolkit/{oidn_gsg => 04_oidn_gsg}/src/common/platform.h | 0 RenderingToolkit/{oidn_gsg => 04_oidn_gsg}/src/common/timer.h | 0 20 files changed, 0 insertions(+), 0 deletions(-) rename RenderingToolkit/{ospray_gsg => 01_ospray_gsg}/CMakeLists.txt (100%) rename RenderingToolkit/{ospray_gsg => 01_ospray_gsg}/sample.json (100%) rename RenderingToolkit/{ospray_gsg => 01_ospray_gsg}/src/ospTutorial.cpp (100%) rename RenderingToolkit/{embree_gsg => 02_embree_gsg}/CMakeLists.txt (100%) rename RenderingToolkit/{embree_gsg => 02_embree_gsg}/sample.json (100%) rename RenderingToolkit/{embree_gsg => 02_embree_gsg}/src/minimal.cpp (100%) rename RenderingToolkit/{openvkl_gsg => 03_openvkl_gsg}/CMakeLists.txt (100%) rename RenderingToolkit/{openvkl_gsg => 03_openvkl_gsg}/sample.json (100%) rename RenderingToolkit/{openvkl_gsg => 03_openvkl_gsg}/src/vklTutorial.c (100%) rename RenderingToolkit/{oidn_gsg => 04_oidn_gsg}/CMakeLists.txt (100%) rename RenderingToolkit/{oidn_gsg => 04_oidn_gsg}/sample.json (100%) rename RenderingToolkit/{oidn_gsg => 04_oidn_gsg}/src/apps/oidnDenoise.cpp (100%) rename RenderingToolkit/{oidn_gsg => 04_oidn_gsg}/src/apps/utils/CMakeLists.txt (100%) rename RenderingToolkit/{oidn_gsg => 04_oidn_gsg}/src/apps/utils/arg_parser.h (100%) rename RenderingToolkit/{oidn_gsg => 04_oidn_gsg}/src/apps/utils/image_io.cpp (100%) rename RenderingToolkit/{oidn_gsg => 04_oidn_gsg}/src/apps/utils/image_io.h (100%) rename RenderingToolkit/{oidn_gsg => 04_oidn_gsg}/src/common/CMakeLists.txt (100%) rename RenderingToolkit/{oidn_gsg => 04_oidn_gsg}/src/common/platform.cpp (100%) rename RenderingToolkit/{oidn_gsg => 04_oidn_gsg}/src/common/platform.h (100%) rename RenderingToolkit/{oidn_gsg => 04_oidn_gsg}/src/common/timer.h (100%) diff --git a/RenderingToolkit/ospray_gsg/CMakeLists.txt b/RenderingToolkit/01_ospray_gsg/CMakeLists.txt similarity index 100% rename from RenderingToolkit/ospray_gsg/CMakeLists.txt rename to RenderingToolkit/01_ospray_gsg/CMakeLists.txt diff --git a/RenderingToolkit/ospray_gsg/sample.json b/RenderingToolkit/01_ospray_gsg/sample.json similarity index 100% rename from RenderingToolkit/ospray_gsg/sample.json rename to RenderingToolkit/01_ospray_gsg/sample.json diff --git a/RenderingToolkit/ospray_gsg/src/ospTutorial.cpp b/RenderingToolkit/01_ospray_gsg/src/ospTutorial.cpp similarity index 100% rename from RenderingToolkit/ospray_gsg/src/ospTutorial.cpp rename to RenderingToolkit/01_ospray_gsg/src/ospTutorial.cpp diff --git a/RenderingToolkit/embree_gsg/CMakeLists.txt b/RenderingToolkit/02_embree_gsg/CMakeLists.txt similarity index 100% rename from RenderingToolkit/embree_gsg/CMakeLists.txt rename to RenderingToolkit/02_embree_gsg/CMakeLists.txt diff --git a/RenderingToolkit/embree_gsg/sample.json b/RenderingToolkit/02_embree_gsg/sample.json similarity index 100% rename from RenderingToolkit/embree_gsg/sample.json rename to RenderingToolkit/02_embree_gsg/sample.json diff --git a/RenderingToolkit/embree_gsg/src/minimal.cpp b/RenderingToolkit/02_embree_gsg/src/minimal.cpp similarity index 100% rename from RenderingToolkit/embree_gsg/src/minimal.cpp rename to RenderingToolkit/02_embree_gsg/src/minimal.cpp diff --git a/RenderingToolkit/openvkl_gsg/CMakeLists.txt b/RenderingToolkit/03_openvkl_gsg/CMakeLists.txt similarity index 100% rename from RenderingToolkit/openvkl_gsg/CMakeLists.txt rename to RenderingToolkit/03_openvkl_gsg/CMakeLists.txt diff --git a/RenderingToolkit/openvkl_gsg/sample.json b/RenderingToolkit/03_openvkl_gsg/sample.json similarity index 100% rename from RenderingToolkit/openvkl_gsg/sample.json rename to RenderingToolkit/03_openvkl_gsg/sample.json diff --git a/RenderingToolkit/openvkl_gsg/src/vklTutorial.c b/RenderingToolkit/03_openvkl_gsg/src/vklTutorial.c similarity index 100% rename from RenderingToolkit/openvkl_gsg/src/vklTutorial.c rename to RenderingToolkit/03_openvkl_gsg/src/vklTutorial.c diff --git a/RenderingToolkit/oidn_gsg/CMakeLists.txt b/RenderingToolkit/04_oidn_gsg/CMakeLists.txt similarity index 100% rename from RenderingToolkit/oidn_gsg/CMakeLists.txt rename to RenderingToolkit/04_oidn_gsg/CMakeLists.txt diff --git a/RenderingToolkit/oidn_gsg/sample.json b/RenderingToolkit/04_oidn_gsg/sample.json similarity index 100% rename from RenderingToolkit/oidn_gsg/sample.json rename to RenderingToolkit/04_oidn_gsg/sample.json diff --git a/RenderingToolkit/oidn_gsg/src/apps/oidnDenoise.cpp b/RenderingToolkit/04_oidn_gsg/src/apps/oidnDenoise.cpp similarity index 100% rename from RenderingToolkit/oidn_gsg/src/apps/oidnDenoise.cpp rename to RenderingToolkit/04_oidn_gsg/src/apps/oidnDenoise.cpp diff --git a/RenderingToolkit/oidn_gsg/src/apps/utils/CMakeLists.txt b/RenderingToolkit/04_oidn_gsg/src/apps/utils/CMakeLists.txt similarity index 100% rename from RenderingToolkit/oidn_gsg/src/apps/utils/CMakeLists.txt rename to RenderingToolkit/04_oidn_gsg/src/apps/utils/CMakeLists.txt diff --git a/RenderingToolkit/oidn_gsg/src/apps/utils/arg_parser.h b/RenderingToolkit/04_oidn_gsg/src/apps/utils/arg_parser.h similarity index 100% rename from RenderingToolkit/oidn_gsg/src/apps/utils/arg_parser.h rename to RenderingToolkit/04_oidn_gsg/src/apps/utils/arg_parser.h diff --git a/RenderingToolkit/oidn_gsg/src/apps/utils/image_io.cpp b/RenderingToolkit/04_oidn_gsg/src/apps/utils/image_io.cpp similarity index 100% rename from RenderingToolkit/oidn_gsg/src/apps/utils/image_io.cpp rename to RenderingToolkit/04_oidn_gsg/src/apps/utils/image_io.cpp diff --git a/RenderingToolkit/oidn_gsg/src/apps/utils/image_io.h b/RenderingToolkit/04_oidn_gsg/src/apps/utils/image_io.h similarity index 100% rename from RenderingToolkit/oidn_gsg/src/apps/utils/image_io.h rename to RenderingToolkit/04_oidn_gsg/src/apps/utils/image_io.h diff --git a/RenderingToolkit/oidn_gsg/src/common/CMakeLists.txt b/RenderingToolkit/04_oidn_gsg/src/common/CMakeLists.txt similarity index 100% rename from RenderingToolkit/oidn_gsg/src/common/CMakeLists.txt rename to RenderingToolkit/04_oidn_gsg/src/common/CMakeLists.txt diff --git a/RenderingToolkit/oidn_gsg/src/common/platform.cpp b/RenderingToolkit/04_oidn_gsg/src/common/platform.cpp similarity index 100% rename from RenderingToolkit/oidn_gsg/src/common/platform.cpp rename to RenderingToolkit/04_oidn_gsg/src/common/platform.cpp diff --git a/RenderingToolkit/oidn_gsg/src/common/platform.h b/RenderingToolkit/04_oidn_gsg/src/common/platform.h similarity index 100% rename from RenderingToolkit/oidn_gsg/src/common/platform.h rename to RenderingToolkit/04_oidn_gsg/src/common/platform.h diff --git a/RenderingToolkit/oidn_gsg/src/common/timer.h b/RenderingToolkit/04_oidn_gsg/src/common/timer.h similarity index 100% rename from RenderingToolkit/oidn_gsg/src/common/timer.h rename to RenderingToolkit/04_oidn_gsg/src/common/timer.h From 89907390b52cae06f4159671718bf35d364ed490 Mon Sep 17 00:00:00 2001 From: Michael R Carroll <43764969+MichaelRoyceCarroll@users.noreply.github.com> Date: Thu, 14 Oct 2021 20:28:06 -0700 Subject: [PATCH 08/36] Update README.md --- RenderingToolkit/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/RenderingToolkit/README.md b/RenderingToolkit/README.md index 32e8523cd2..07897e6408 100644 --- a/RenderingToolkit/README.md +++ b/RenderingToolkit/README.md @@ -29,7 +29,7 @@ Imaging Tools: ## Getting Started Samples -Please try the getting started sample programs in order. Outputs of a sample may serve as inputs for anothe sample. +Please try the getting started sample programs in order. Outputs of a sample may serve as inputs for another sample. | Order | Component | Folder | Description | | -- | --------- | ------------------------------------------------ | - | From fb7dcf2977a07f2ebce7ab6392aa7122e3fa0920 Mon Sep 17 00:00:00 2001 From: Michael R Carroll Date: Thu, 14 Oct 2021 22:38:45 -0700 Subject: [PATCH 09/36] Adding per sample component README.md files Signed-off-by: Michael R Carroll --- RenderingToolkit/01_ospray_gsg/README.md | 115 ++++++++++++++++++ RenderingToolkit/02_embree_gsg/README.md | 79 +++++++++++++ RenderingToolkit/03_openvkl_gsg/README.md | 82 +++++++++++++ RenderingToolkit/04_oidn_gsg/README.md | 135 ++++++++++++++++++++++ 4 files changed, 411 insertions(+) create mode 100644 RenderingToolkit/01_ospray_gsg/README.md create mode 100644 RenderingToolkit/02_embree_gsg/README.md create mode 100644 RenderingToolkit/03_openvkl_gsg/README.md create mode 100644 RenderingToolkit/04_oidn_gsg/README.md diff --git a/RenderingToolkit/01_ospray_gsg/README.md b/RenderingToolkit/01_ospray_gsg/README.md new file mode 100644 index 0000000000..3a57899c22 --- /dev/null +++ b/RenderingToolkit/01_ospray_gsg/README.md @@ -0,0 +1,115 @@ +# Getting Started Sample for Intel oneAPI Rendering Toolkit: Intel OSPRay + +This sample ospTutorialCpp renders two triangles with the OSPRay API. + +Two renders are written to .ppm image files to disk. The first image is rendered with one accumulation. The second image is rendered with 10 accumulations. + + +## License + +TBD + +Code samples are licensed under the MIT license. See +[License.txt](https://github.com/oneapi-src/oneAPI-samples/blob/master/License.txt) for details. + +Third party program Licenses can be found here: [third-party-programs.txt](https://github.com/oneapi-src/oneAPI-samples/blob/master/third-party-programs.txt) + +## Requirements + +To build and run the samples you will need a compiler toolchain and imaging tools: + +Compiler: +- MSVS 2019 on Windows* OS +- On other platforms a C++11 compiler and a C99 compiler. (Ex: gcc/g++/clang) + +oneAPI Libraries: +Install the Intel oneAPI Rendering Toolkit +- OSPRay +- Embree +- Open VKL + +Imaging Tools: +- An image **display program** for .ppm and .pfm filetypes . Ex: [ImageMagick](https://www.imagemagick.org/) + + +## Build and Run + +### Windows OS: + +Run a new **x64 Native Tools Command Prompt for MSVS 2019** + +``` +call \setvars.bat +cd \RenderingToolkit\ospray_gsg +mkdir build +cd build +cmake -G"Visual Studio 16 2019" -A x64 -DCMAKE_PREFIX_PATH="" .. +cmake --build . --config Release +cd Release +ospTutorialCpp.exe +``` + +Review the first output image with a .ppm image viewer. Example using ImageMagick display: +``` +\imdisplay firstFrameCpp.ppm +``` + +Review the accumulated output image with a .ppm image viewer. Example using ImageMagick display: +``` +\imdisplay accumulatedFrameCpp.ppm +``` + + +### Linux OS: + +Start a new Terminal session +``` +source /setvars.sh +cd /RenderingToolkit/ospray_gsg +mkdir build +cd build +cmake -DCMAKE_PREFIX_PATH="" .. +cmake --build . +./ospTutorialCpp +``` + +Review the first output image with a .ppm image viewer. Example using ImageMagick display: +``` +/imdisplay firstFrameCpp.ppm +``` + +Review the accumulated output image with a .ppm image viewer. Example using ImageMagick display: +``` +/imdisplay accumulatedFrameCpp.ppm +``` + + +### MacOS: + +Start a new Terminal session + +``` +source /setvars.sh +cd /RenderingToolkit/ospray_gsg +mkdir build +cd build +cmake -DCMAKE_PREFIX_PATH="" .. +cmake --build . +./ospTutorialCpp +``` + +Review the first output image with a .ppm image viewer. Example using ImageMagick display: +``` +/imdisplay firstFrameCpp.ppm +``` + +Review the accumulated output image with a .ppm image viewer. Example using ImageMagick display: +``` +/imdisplay accumulatedFrameCpp.ppm +``` + + + + + + diff --git a/RenderingToolkit/02_embree_gsg/README.md b/RenderingToolkit/02_embree_gsg/README.md new file mode 100644 index 0000000000..08462dafc6 --- /dev/null +++ b/RenderingToolkit/02_embree_gsg/README.md @@ -0,0 +1,79 @@ +# Getting Started Sample for Intel oneAPI Rendering Toolkit: Intel Embree + +This sample program, minimal, performs two ray to triangle intersect tests with the Embree API. + +Output is written to the console (stdout). + +## License + +TBD + +Code samples are licensed under the MIT license. See +[License.txt](https://github.com/oneapi-src/oneAPI-samples/blob/master/License.txt) for details. + +Third party program Licenses can be found here: [third-party-programs.txt](https://github.com/oneapi-src/oneAPI-samples/blob/master/third-party-programs.txt) + +## Requirements + +To build and run the samples you will need a compiler toolchain and imaging tools: + +Compiler: +- MSVS 2019 on Windows* OS +- On other platforms a C++11 compiler and a C99 compiler. (Ex: gcc/g++/clang) + +oneAPI Libraries: +Install the Intel oneAPI Rendering Toolkit +- Embree + + +## Build and Run + +### Windows OS: + +Run a new **x64 Native Tools Command Prompt for MSVS 2019** + +``` +call \setvars.bat +cd \RenderingToolkit\embree_gsg +mkdir build +cd build +cmake -G"Visual Studio 16 2019" -A x64 -DCMAKE_PREFIX_PATH="" .. +cmake --build . --config Release +cd Release +minimal.exe +``` + +Review the terminal output (stdout) + + +### Linux OS: + +Start a new Terminal session +``` +source /setvars.sh +cd /RenderingToolkit/embree_gsg +mkdir build +cd build +cmake -DCMAKE_PREFIX_PATH="" .. +cmake --build . +./minimal +``` + +Review the terminal output (stdout) + + +### MacOS: + +Start a new Terminal session + +``` +source /setvars.sh +cd /RenderingToolkit/ospray_gsg +mkdir build +cd build +cmake -DCMAKE_PREFIX_PATH="" .. +cmake --build . +./minimal +``` + +Review the terminal output (stdout) diff --git a/RenderingToolkit/03_openvkl_gsg/README.md b/RenderingToolkit/03_openvkl_gsg/README.md new file mode 100644 index 0000000000..65da1515b9 --- /dev/null +++ b/RenderingToolkit/03_openvkl_gsg/README.md @@ -0,0 +1,82 @@ +# Getting Started Sample for Intel oneAPI Rendering Toolkit: Intel Open VKL + +This sample program, vklTutorial, shows sampling output amongst the different volumetric sampling capabilities with Intel Open VKL. + +Output is written to the console (stdout). + +## License + +TBD + +Code samples are licensed under the MIT license. See +[License.txt](https://github.com/oneapi-src/oneAPI-samples/blob/master/License.txt) for details. + +Third party program Licenses can be found here: [third-party-programs.txt](https://github.com/oneapi-src/oneAPI-samples/blob/master/third-party-programs.txt) + +## Requirements + +To build and run the samples you will need a compiler toolchain and imaging tools: + +Compiler: +- MSVS 2019 on Windows* OS +- On other platforms a C++11 compiler and a C99 compiler. (Ex: gcc/g++/clang) + +oneAPI Libraries: +Install the Intel oneAPI Rendering Toolkit +- Embree +- Open VKL + + + + +## Build and Run + +### Windows OS: + +Run a new **x64 Native Tools Command Prompt for MSVS 2019** + +``` +call \setvars.bat +cd \RenderingToolkit\openvkl_gsg +mkdir build +cd build +cmake -G"Visual Studio 16 2019" -A x64 -DCMAKE_PREFIX_PATH="" .. +cmake --build . --config Release +cd Release +vklTutorial.exe +``` + +Review the terminal output (stdout) + + +### Linux OS: + +Start a new Terminal session +``` +source /setvars.sh +cd /RenderingToolkit/openvkl_gsg +mkdir build +cd build +cmake -DCMAKE_PREFIX_PATH="" .. +cmake --build . +./vklTutorial +``` + +Review the terminal output (stdout) + + +### MacOS: + +Start a new Terminal session + +``` +source /setvars.sh +cd /RenderingToolkit/openvkl_gsg +mkdir build +cd build +cmake -DCMAKE_PREFIX_PATH="" .. +cmake --build . +./vklTutorial +``` + +Review the terminal output (stdout) diff --git a/RenderingToolkit/04_oidn_gsg/README.md b/RenderingToolkit/04_oidn_gsg/README.md new file mode 100644 index 0000000000..c169799ce6 --- /dev/null +++ b/RenderingToolkit/04_oidn_gsg/README.md @@ -0,0 +1,135 @@ +# Getting Started Sample for Intel oneAPI Rendering Toolkit: Intel Open Image Denoise + +This sample program, oidnDenoise, denoises a raytraced image. + +oidnDenoise takes a preprocessed image accumulatedFrameCpp for input. Recall, this image was originally generated from the Intel OSPRay getting started sample, ospTutorial. + +oidnDenoise writes a denoised .pfm image file to disk. + +## License + +TBD + +Code samples are licensed under the MIT license. See +[License.txt](https://github.com/oneapi-src/oneAPI-samples/blob/master/License.txt) for details. + +Third party program Licenses can be found here: [third-party-programs.txt](https://github.com/oneapi-src/oneAPI-samples/blob/master/third-party-programs.txt) + +## Requirements + +To build and run the samples you will need a compiler toolchain and imaging tools: + +Compiler: +- MSVS 2019 on Windows* OS +- On other platforms a C++11 compiler and a C99 compiler. (Ex: gcc/g++/clang) + +oneAPI Libraries: +Install the Intel oneAPI Rendering Toolkit +- OSPRay +- Embree +- Open VKL +- Open Image Denoise + +Imaging Tools: +- An image **display program** for .ppm and .pfm filetypes . Ex: [ImageMagick](https://www.imagemagick.org/) +- An image **converter** for .ppm filetypes, .pfm filetypes, and endian conversions. Ex: [ImageMagick](https://www.imagemagick.org/) + +## Build and Run + +First, build and run the sample Intel OSPray getting started sample, ospTutorial, from the 01_ospray_gsg folder to generate input. + +### Windows OS: + + +Run a new **x64 Native Tools Command Prompt for MSVS 2019** + +``` +call \setvars.bat +cd \RenderingToolkit\oidn_gsg +mkdir build +cd build +cmake -G"Visual Studio 16 2019" -A x64 -DCMAKE_PREFIX_PATH="" .. +cmake --build . --config Release +cd Release +``` + +Convert the accumulatedFrameCpp.ppm image to LSB data ordering and .pfm format. Example conversion with ImageMagick convert: + +``` +\magick convert ..\..\..\01_ospray_gsg\build\Release\accumulatedFrameCpp.ppm -endian LSB PFM:accumulatedFrameCpp.pfm +``` + +Denoise the image: + +``` +oidnDenoise.exe -hdr accumulatedFrameCpp.pfm -o denoised.pfm +``` + +Review the output for visual comparison to the input. Example view with ImageMagick display: + +``` +\imdisplay denoised.pfm +``` + + + +### Linux OS: + +Start a new Terminal session +``` +source /setvars.sh +cd /RenderingToolkit/oidn_gsg +mkdir build +cd build +cmake -DCMAKE_PREFIX_PATH="" .. +cmake --build . +``` + +Convert the accumulatedFrameCpp.ppm image to LSB data ordering and .pfm format. Example conversion with ImageMagick convert: +``` +/magick convert ../../../01_ospray_gsg\build\Release\accumulatedFrameCpp.ppm -endian LSB PFM:accumulatedFrameCpp.pfm +``` + +Denoise the image: + +``` +./oidnDenoise -hdr accumulatedFrameCpp.pfm -o denoised.pfm +``` + +Review the output for visual comparison to the input. Example view with ImageMagick display: + +``` +/imdisplay denoised.pfm +``` + + + +### MacOS: + +Start a new Terminal session + +``` +source /setvars.sh +cd /RenderingToolkit/oidn_gsg +mkdir build +cd build +cmake -DCMAKE_PREFIX_PATH="" .. +cmake --build . +``` + +Convert the accumulatedFrameCpp.ppm image to LSB data ordering and .pfm format. Example conversion with ImageMagick convert: +``` +/magick convert ../../../01_ospray_gsg\build\Release\accumulatedFrameCpp.ppm -endian LSB PFM:accumulatedFrameCpp.pfm +``` + +Denoise the image: + +``` +oidnDenoise.exe -hdr accumulatedFrameCpp.pfm -o denoised.pfm +``` + +Review the output for visual comparison to the input. Example view with ImageMagick display: + +``` +/imdisplay denoised.pfm +``` From d85d35837b5edfe4d4d1f2cba01bd28adb97baf6 Mon Sep 17 00:00:00 2001 From: Michael R Carroll <43764969+MichaelRoyceCarroll@users.noreply.github.com> Date: Thu, 14 Oct 2021 23:01:29 -0700 Subject: [PATCH 10/36] Update README.md --- RenderingToolkit/README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/RenderingToolkit/README.md b/RenderingToolkit/README.md index 07897e6408..50509eae33 100644 --- a/RenderingToolkit/README.md +++ b/RenderingToolkit/README.md @@ -33,7 +33,7 @@ Please try the getting started sample programs in order. Outputs of a sample ma | Order | Component | Folder | Description | | -- | --------- | ------------------------------------------------ | - | -| 1 | Intel OSPRay | [01_ospray_gsg](ospray_gsg) | Get started with Intel OSPRay | -| 2 | Intel Embree | [02_embree_gsg](embree_gsg)| Get started with Intel Embree | -| 3 | Intel Open Volume Kernel Library | [03_openvkl_gsg](openvkl_gsg)| Get started with Intel Open VKL | -| 4 | Intel Open Image Denoise | [04_oidn_gsg](oidn_gsg) | Get started with Intel Open Image Denoise | +| 1 | Intel OSPRay | [01_ospray_gsg](01_ospray_gsg) | Get started with Intel OSPRay | +| 2 | Intel Embree | [02_embree_gsg](02_embree_gsg)| Get started with Intel Embree | +| 3 | Intel Open Volume Kernel Library | [03_openvkl_gsg](03_openvkl_gsg)| Get started with Intel Open VKL | +| 4 | Intel Open Image Denoise | [04_oidn_gsg](04_oidn_gsg) | Get started with Intel Open Image Denoise | From 507eb041b4096654193101e721c46145dbdd940b Mon Sep 17 00:00:00 2001 From: Michael R Carroll Date: Fri, 15 Oct 2021 08:20:23 -0700 Subject: [PATCH 11/36] Adding percomponent LICENSE placeholder files (to be reviewed) Signed-off-by: Michael R Carroll --- RenderingToolkit/01_ospray_gsg/LICENSE.txt | 202 ++++++++++++++++++++ RenderingToolkit/02_embree_gsg/LICENSE.txt | 202 ++++++++++++++++++++ RenderingToolkit/03_openvkl_gsg/LICENSE.txt | 202 ++++++++++++++++++++ RenderingToolkit/04_oidn_gsg/LICENSE.txt | 202 ++++++++++++++++++++ 4 files changed, 808 insertions(+) create mode 100644 RenderingToolkit/01_ospray_gsg/LICENSE.txt create mode 100644 RenderingToolkit/02_embree_gsg/LICENSE.txt create mode 100644 RenderingToolkit/03_openvkl_gsg/LICENSE.txt create mode 100644 RenderingToolkit/04_oidn_gsg/LICENSE.txt diff --git a/RenderingToolkit/01_ospray_gsg/LICENSE.txt b/RenderingToolkit/01_ospray_gsg/LICENSE.txt new file mode 100644 index 0000000000..d645695673 --- /dev/null +++ b/RenderingToolkit/01_ospray_gsg/LICENSE.txt @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/RenderingToolkit/02_embree_gsg/LICENSE.txt b/RenderingToolkit/02_embree_gsg/LICENSE.txt new file mode 100644 index 0000000000..d645695673 --- /dev/null +++ b/RenderingToolkit/02_embree_gsg/LICENSE.txt @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/RenderingToolkit/03_openvkl_gsg/LICENSE.txt b/RenderingToolkit/03_openvkl_gsg/LICENSE.txt new file mode 100644 index 0000000000..d645695673 --- /dev/null +++ b/RenderingToolkit/03_openvkl_gsg/LICENSE.txt @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/RenderingToolkit/04_oidn_gsg/LICENSE.txt b/RenderingToolkit/04_oidn_gsg/LICENSE.txt new file mode 100644 index 0000000000..d645695673 --- /dev/null +++ b/RenderingToolkit/04_oidn_gsg/LICENSE.txt @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. From b738b264c43be65eda7ed5125f75a716977948e7 Mon Sep 17 00:00:00 2001 From: Michael R Carroll Date: Fri, 15 Oct 2021 12:26:39 -0700 Subject: [PATCH 12/36] Adding converted .pfm input file. This file could help users if they get stuck. It is not too big. Signed-off-by: Michael R Carroll --- .../04_oidn_gsg/accumulatedFrameCpp.pfm | Bin 0 -> 9437201 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 RenderingToolkit/04_oidn_gsg/accumulatedFrameCpp.pfm diff --git a/RenderingToolkit/04_oidn_gsg/accumulatedFrameCpp.pfm b/RenderingToolkit/04_oidn_gsg/accumulatedFrameCpp.pfm new file mode 100644 index 0000000000000000000000000000000000000000..0cf85bf88b23b6be2919f9488a53b3c8b9a2f557 GIT binary patch literal 9437201 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 o$zP@Vq?%Z+M5 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/)?bHFVQ!RkGrWa%zo40&k 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 zV1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~ z0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz z7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|Xg zfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_ z1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;= zV1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~ z0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz z7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|Xg zfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_ z1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;= zV1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~ z0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz z7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|Xg zfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_ z1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;= zV1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~ z0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz z7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|Xg zfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_ z1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;= zV1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~ z0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz z7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|Xg zfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_ z1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;= zV1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~ z0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz z7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|Xg zfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_ z1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;= zV1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~ z0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz z7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|Xg zfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_ z1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;= zV1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~ z0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz z7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|Xg zfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_ z1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;= zV1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~ z0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz z7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|Xg zfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_ z1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;= zV1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~ z0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz z7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|Xg zfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_ z1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;= zV1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~ z0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz z7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|Xg zfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_ z1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;= zV1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~ z0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz z7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|Xg zfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_ z1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;= zV1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~ z0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz z7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|Xg zfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_ z1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;= zV1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~ z0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz z7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|Xg zfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_ z1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;= zV1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~ z0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz z7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|Xg zfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_ z1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;= zV1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~ z0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz z7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|Xg zfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_ z1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;= zV1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~ z0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz z7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|Xg zfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_ z1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;= zV1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~ z0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz z7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|Xg zfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_ z1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;= zV1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~ z0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz z7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|Xg zfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_ z1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;= zV1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~ z0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz z7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|Xg zfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_ z1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;= zV1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~ z0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz z7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|Xg zfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_ z1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;= zV1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~ z0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz z7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|Xg zfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_ z1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;= zV1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~ z0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz z7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|Xg zfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_ z1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;= zV1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~ z0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz z7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|Xg zfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_ z1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;= zV1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~ z0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz z7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|Xg zfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_ z1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;= zV1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~ z0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz z7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|Xg zfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_ z1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;= zV1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~ z0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz z7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|Xg zfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_ z1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;= zV1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~ z0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz z7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|Xg zfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_ z1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;= zV1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~ z0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz z7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|Xg zfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_ z1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;= zV1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~ z0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz z7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|Xg zfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_ z1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;= zV1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~ z0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz z7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|Xg zfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_ z1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;= zV1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~ z0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz z7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|Xg zfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_ z1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;= zV1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~ z0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz z7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|Xg zfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_ z1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;= zV1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~ z0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz z7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|Xg WfB^;=V1NMz7+`<_1{nAV1OFd1(xiR> literal 0 HcmV?d00001 From 5f91694dd5246050c1101214a77d0108294807f5 Mon Sep 17 00:00:00 2001 From: Michael R Carroll Date: Fri, 15 Oct 2021 14:19:01 -0700 Subject: [PATCH 13/36] Updating sample.json files per Joseph Oster guidance Signed-off-by: Michael R Carroll --- RenderingToolkit/01_ospray_gsg/sample.json | 56 +++++++++++++++---- RenderingToolkit/02_embree_gsg/sample.json | 58 ++++++++++++++++---- RenderingToolkit/03_openvkl_gsg/sample.json | 58 +++++++++++++++----- RenderingToolkit/04_oidn_gsg/sample.json | 60 ++++++++++++++++----- 4 files changed, 187 insertions(+), 45 deletions(-) diff --git a/RenderingToolkit/01_ospray_gsg/sample.json b/RenderingToolkit/01_ospray_gsg/sample.json index 4a8d9f873a..a29383b8be 100644 --- a/RenderingToolkit/01_ospray_gsg/sample.json +++ b/RenderingToolkit/01_ospray_gsg/sample.json @@ -1,22 +1,58 @@ { "guid": "40C26D31-D553-4BD9-9E1D-63DDF352CB85", "name": "Intel OSPRay Getting Started", - "categories": ["Toolkit/oneAPI Rendering Toolkit/OSPRay/OSPRay-Getting-Started"], - "description": "This introductory hellorenderingtoolkit sample illustrates how to render triangle data with the pathtracer from Intel OSPRay", + "categories": ["Toolkit/oneAPI Libraries/OSPRay"], + "description": "This introductory 'hello rendering toolkit' sample program demonstrates how to render triangle data with the pathtracer from Intel OSPRay", "builder": ["cli"], - "languages": [{"c":{}}, {"cpp":{}}], + "languages": [{"cpp":{}}], "dependencies": ["tbb","ospray","openvkl","embree","rkcommon"], "os":["linux", "windows", "darwin"], "targetDevice": ["CPU"], "ciTests": { "linux": [ - { - "env": ["source /opt/intel/oneapi/setvars.sh --force", "conda create -n ospray-tutorial-test -c intel -c conda-forge matplotlib runipy intel-aikit-modin", "source activate aikit-modin-test"], - "id": "Intel_OSPRay_ospTutorial", + { + "env": ["source /opt/intel/oneapi/setvars.sh --force"], + "id": "Intel_OSPRay_ospTutorial_lin", "steps": [ - "ospTutorialCpp.exe" + "mkdir build", + "cd build", + "cmake -DCMAKE_PREFIX_PATH=\"/opt/intel/oneAPI\" ..", + "cmake --build . ", + "cd Release", + "./ospTutorialCpp" ] - } - ] -} + } + ], + "windows":[ + { + "env": ["call C:\\Program Files (x86)\\Intel\\oneAPI\\setvars.bat"], + "id": "Intel_OSPRay_ospTutorial_win", + "steps":[ + "mkdir build", + "cd build", + "cmake -G\"Visual Studio 16 2019\" -A x64 -DCMAKE_PREFIX_PATH=\"C:/Program Files (x86)/Intel/oneAPI\" ..", + "cmake --build . --config Release", + "cd Release", + "ospTutorialCpp.exe" + ] + + } + ], + "macos": [ + { + "env": ["source /opt/intel/oneapi/setvars.sh --force"], + "id": "Intel_OSPRay_ospTutorial_mac", + "steps": [ + "mkdir build", + "cd build", + "cmake -DCMAKE_PREFIX_PATH=\"/opt/intel/oneAPI\" ..", + "cmake --build . ", + "cd Release", + "./ospTutorialCpp" + ] + } + ] + + + } } diff --git a/RenderingToolkit/02_embree_gsg/sample.json b/RenderingToolkit/02_embree_gsg/sample.json index 99cc7b8584..5c5806f060 100644 --- a/RenderingToolkit/02_embree_gsg/sample.json +++ b/RenderingToolkit/02_embree_gsg/sample.json @@ -1,7 +1,7 @@ { "guid": "87FA013D-0B19-45AE-BCD5-43412BE0A99F", "name": "Intel Embree Getting Started", - "categories": ["Toolkit/oneAPI Rendering Toolkit/Embree/Embree-Getting-Started"], + "categories": ["Toolkit/oneAPI Libraries/Embree"], "description": "This introductory hello rendering toolkit sample illustrates how to cast a ray into a scene with Intel Embree", "builder": ["cli"], "languages": [{"cpp":{}}], @@ -9,14 +9,50 @@ "os":["linux", "windows", "darwin"], "targetDevice": ["CPU"], "ciTests": { - "linux": [ - { - "env": ["source /opt/intel/oneapi/setvars.sh --force", "conda create -n ospray-tutorial-test -c intel -c conda-forge matplotlib runipy intel-aikit-modin", "source activate aikit-modin-test"], - "id": "Intel_Embree_minimal", - "steps": [ - "minimal.exe" - ] - } - ] -} + "linux": [ + { + "env": ["source /opt/intel/oneapi/setvars.sh --force"], + "id": "Intel_Embree_minimal_lin", + "steps": [ + "mkdir build", + "cd build", + "cmake -DCMAKE_PREFIX_PATH=\"/opt/intel/oneAPI\" ..", + "cmake --build . ", + "cd Release", + "./minimal" + ] + } + ], + "windows":[ + { + "env": ["call C:\\Program Files (x86)\\Intel\\oneAPI\\setvars.bat"], + "id": "Intel_Embree_minimal_win", + "steps":[ + "mkdir build", + "cd build", + "cmake -G\"Visual Studio 16 2019\" -A x64 -DCMAKE_PREFIX_PATH=\"C:/Program Files (x86)/Intel/oneAPI\" ..", + "cmake --build . --config Release", + "cd Release", + "minimal.exe" + ] + + } + ], + "darwin": [ + { + "env": ["source /opt/intel/oneapi/setvars.sh --force"], + "id": "Intel_Embree_minimal_mac", + "steps": [ + "mkdir build", + "cd build", + "cmake -DCMAKE_PREFIX_PATH=\"/opt/intel/oneAPI\" ..", + "cmake --build . ", + "cd Release", + "./minimal" + ] + } + ] + + + } } diff --git a/RenderingToolkit/03_openvkl_gsg/sample.json b/RenderingToolkit/03_openvkl_gsg/sample.json index 4eeeac8097..c658c082d4 100644 --- a/RenderingToolkit/03_openvkl_gsg/sample.json +++ b/RenderingToolkit/03_openvkl_gsg/sample.json @@ -1,22 +1,56 @@ { "guid": "80BB7E55-6FCA-491F-8541-E271324CF169", "name": "Intel Open VKL Getting Started", - "categories": ["Toolkit/oneAPI Rendering Toolkit/Open VKL/Open-VKL-Getting-Started"], - "description": "This introductory hello rendering toolkit sample illustrates how to sample with Intel Open VKL", + "categories": ["Toolkit/oneAPI Libraries/Open VKL"], + "description": "This introductory hello rendering toolkit sample program demonstrates how to sample into volumes with Intel Open VKL", "builder": ["cli"], "languages": [{"c":{}}], "dependencies": ["tbb","openvkl","embree","rkcommon"], "os":["linux", "windows", "darwin"], "targetDevice": ["CPU"], "ciTests": { - "linux": [ - { - "env": ["source /opt/intel/oneapi/setvars.sh --force", "conda create -n ospray-tutorial-test -c intel -c conda-forge matplotlib runipy intel-aikit-modin", "source activate aikit-modin-test"], - "id": "Intel_Open_VKL_vklTutorial", - "steps": [ - "vklTutorial.exe" - ] - } - ] -} + "linux": [ + { + "env": ["source /opt/intel/oneapi/setvars.sh --force"], + "id": "Intel_OpenVKL_vklTutorial_lin", + "steps": [ + "mkdir build", + "cd build", + "cmake -DCMAKE_PREFIX_PATH=\"/opt/intel/oneAPI\" ..", + "cmake --build . ", + "cd Release", + "./vklTutorial" + ] + } + ], + "windows":[ + { + "env": ["call C:\\Program Files (x86)\\Intel\\oneAPI\\setvars.bat"], + "id": "Intel_OpenVKL_vklTutorial_win", + "steps":[ + "mkdir build", + "cd build", + "cmake -G\"Visual Studio 16 2019\" -A x64 -DCMAKE_PREFIX_PATH=\"C:/Program Files (x86)/Intel/oneAPI\" ..", + "cmake --build . --config Release", + "cd Release", + "vklTutorial.exe" + ] + + } + ], + "darwin": [ + { + "env": ["source /opt/intel/oneapi/setvars.sh --force"], + "id": "Intel_OpenVKL_vklTutorial_mac", + "steps": [ + "mkdir build", + "cd build", + "cmake -DCMAKE_PREFIX_PATH=\"/opt/intel/oneAPI\" ..", + "cmake --build . ", + "cd Release", + "./vklTutorial" + ] + } + ] + } } diff --git a/RenderingToolkit/04_oidn_gsg/sample.json b/RenderingToolkit/04_oidn_gsg/sample.json index 6162a7b6df..4d139aa371 100644 --- a/RenderingToolkit/04_oidn_gsg/sample.json +++ b/RenderingToolkit/04_oidn_gsg/sample.json @@ -1,22 +1,58 @@ { "guid": "41F82C06-A9FA-4521-B87A-8F7304CB6631", "name": "Intel Open Image Denoise Getting Started", - "categories": ["Toolkit/oneAPI Rendering Toolkit/Open Image Denoise/OIDN-Getting-Started"], - "description": "This introductory hello rendering toolkit sample illustrates how to denoise a raytraced image with Intel Open Image Denoise", + "categories": ["Toolkit/oneAPI Libraries/Open Image Denoise"], + "description": "This introductory 'hello rendering toolkit' sample program demonstrates how to denoise a raytraced image with Intel Open Image Denoise", "builder": ["cli"], "languages": [{"cpp":{}}], "dependencies": ["tbb","rkcommon"], "os":["linux", "windows", "darwin"], "targetDevice": ["CPU"], "ciTests": { - "linux": [ - { - "env": ["source /opt/intel/oneapi/setvars.sh --force", "conda create -n ospray-tutorial-test -c intel -c conda-forge matplotlib runipy intel-aikit-modin", "source activate aikit-modin-test"], - "id": "Intel_OIDN_oidnDenoise", - "steps": [ - "oidnDenoise.exe" - ] - } - ] -} + "linux": [ + { + "env": ["source /opt/intel/oneapi/setvars.sh --force"], + "id": "Intel_OIDN_oidnDenoise_lin", + "steps": [ + "mkdir build", + "cd build", + "cmake -DCMAKE_PREFIX_PATH=\"/opt/intel/oneAPI\" ..", + "cmake --build . ", + "cd Release", + "./oidnDenoise" + ] + } + ], + "windows":[ + { + "env": ["call C:\\Program Files (x86)\\Intel\\oneAPI\\setvars.bat"], + "id": "Intel_OIDN_oidnDenoise_win", + "steps":[ + "mkdir build", + "cd build", + "cmake -G\"Visual Studio 16 2019\" -A x64 -DCMAKE_PREFIX_PATH=\"C:/Program Files (x86)/Intel/oneAPI\" ..", + "cmake --build . --config Release", + "cd Release", + "oidnDenoise.exe" + ] + + } + ], + "darwin": [ + { + "env": ["source /opt/intel/oneapi/setvars.sh --force"], + "id": "Intel_OIDN_oidnDenoise_mac", + "steps": [ + "mkdir build", + "cd build", + "cmake -DCMAKE_PREFIX_PATH=\"/opt/intel/oneAPI\" ..", + "cmake --build . ", + "cd Release", + "./oidnDenoise" + ] + } + ] + + + } } From a3461c38365c177692487a4c70f5ada6975ea842 Mon Sep 17 00:00:00 2001 From: Michael R Carroll Date: Fri, 15 Oct 2021 15:09:47 -0700 Subject: [PATCH 14/36] Updates to oidn README.md for linux and macos Signed-off-by: Michael R Carroll --- RenderingToolkit/04_oidn_gsg/README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/RenderingToolkit/04_oidn_gsg/README.md b/RenderingToolkit/04_oidn_gsg/README.md index c169799ce6..e99c3a8a9c 100644 --- a/RenderingToolkit/04_oidn_gsg/README.md +++ b/RenderingToolkit/04_oidn_gsg/README.md @@ -87,7 +87,7 @@ cmake --build . Convert the accumulatedFrameCpp.ppm image to LSB data ordering and .pfm format. Example conversion with ImageMagick convert: ``` -/magick convert ../../../01_ospray_gsg\build\Release\accumulatedFrameCpp.ppm -endian LSB PFM:accumulatedFrameCpp.pfm +/convert-im6 ../../../01_ospray_gsg/build/accumulatedFrameCpp.ppm -endian LSB PFM:accumulatedFrameCpp.pfm ``` Denoise the image: @@ -99,7 +99,7 @@ Denoise the image: Review the output for visual comparison to the input. Example view with ImageMagick display: ``` -/imdisplay denoised.pfm +/display-im6 denoised.pfm ``` @@ -119,13 +119,13 @@ cmake --build . Convert the accumulatedFrameCpp.ppm image to LSB data ordering and .pfm format. Example conversion with ImageMagick convert: ``` -/magick convert ../../../01_ospray_gsg\build\Release\accumulatedFrameCpp.ppm -endian LSB PFM:accumulatedFrameCpp.pfm +/magick convert ../../../01_ospray_gsg/build/accumulatedFrameCpp.ppm -endian LSB PFM:accumulatedFrameCpp.pfm ``` Denoise the image: ``` -oidnDenoise.exe -hdr accumulatedFrameCpp.pfm -o denoised.pfm +./oidnDenoise -hdr accumulatedFrameCpp.pfm -o denoised.pfm ``` Review the output for visual comparison to the input. Example view with ImageMagick display: From 86c8200370118a2a0f7ddc9e154aead75f503073 Mon Sep 17 00:00:00 2001 From: Michael R Carroll Date: Mon, 18 Oct 2021 14:13:19 -0700 Subject: [PATCH 15/36] Update README for library requirements Signed-off-by: Michael R Carroll --- RenderingToolkit/README.md | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/RenderingToolkit/README.md b/RenderingToolkit/README.md index 50509eae33..0f649dbfc6 100644 --- a/RenderingToolkit/README.md +++ b/RenderingToolkit/README.md @@ -17,12 +17,19 @@ Third party program Licenses can be found here: [third-party-programs.txt](https ## Requirements -To build and run the samples you will need a compiler toolchain and imaging tools: +To build and run the samples you will need a compiler toolchain, the libraries, and imaging tools: Compiler: - MSVS 2019 on Windows* OS - On other platforms a C++11 compiler and a C99 compiler. (Ex: gcc/g++/clang) +oneAPI Libraries: +Install the Intel oneAPI Rendering Toolkit +- OSPRay +- Embree +- Open VKL +- Open Image Denoise + Imaging Tools: - An image **display program** for .ppm and .pfm filetypes . Ex: [ImageMagick](https://www.imagemagick.org/) - An image **converter** for .ppm filetypes, .pfm filetypes, and endian conversions. Ex: [ImageMagick](https://www.imagemagick.org/) From 2c6f167ef30bea5fec28191da8b5b92246697399 Mon Sep 17 00:00:00 2001 From: Michael R Carroll Date: Mon, 18 Oct 2021 14:24:24 -0700 Subject: [PATCH 16/36] New branch for just oidn sample Signed-off-by: Michael R Carroll --- RenderingToolkit/01_ospray_gsg/CMakeLists.txt | 27 -- RenderingToolkit/01_ospray_gsg/LICENSE.txt | 202 --------- RenderingToolkit/01_ospray_gsg/README.md | 115 ------ RenderingToolkit/01_ospray_gsg/sample.json | 58 --- .../01_ospray_gsg/src/ospTutorial.cpp | 172 -------- RenderingToolkit/02_embree_gsg/CMakeLists.txt | 27 -- RenderingToolkit/02_embree_gsg/LICENSE.txt | 202 --------- RenderingToolkit/02_embree_gsg/README.md | 79 ---- RenderingToolkit/02_embree_gsg/sample.json | 58 --- .../02_embree_gsg/src/minimal.cpp | 256 ------------ .../03_openvkl_gsg/CMakeLists.txt | 26 -- RenderingToolkit/03_openvkl_gsg/LICENSE.txt | 202 --------- RenderingToolkit/03_openvkl_gsg/README.md | 82 ---- RenderingToolkit/03_openvkl_gsg/sample.json | 56 --- .../03_openvkl_gsg/src/vklTutorial.c | 390 ------------------ 15 files changed, 1952 deletions(-) delete mode 100644 RenderingToolkit/01_ospray_gsg/CMakeLists.txt delete mode 100644 RenderingToolkit/01_ospray_gsg/LICENSE.txt delete mode 100644 RenderingToolkit/01_ospray_gsg/README.md delete mode 100644 RenderingToolkit/01_ospray_gsg/sample.json delete mode 100644 RenderingToolkit/01_ospray_gsg/src/ospTutorial.cpp delete mode 100644 RenderingToolkit/02_embree_gsg/CMakeLists.txt delete mode 100644 RenderingToolkit/02_embree_gsg/LICENSE.txt delete mode 100644 RenderingToolkit/02_embree_gsg/README.md delete mode 100644 RenderingToolkit/02_embree_gsg/sample.json delete mode 100644 RenderingToolkit/02_embree_gsg/src/minimal.cpp delete mode 100644 RenderingToolkit/03_openvkl_gsg/CMakeLists.txt delete mode 100644 RenderingToolkit/03_openvkl_gsg/LICENSE.txt delete mode 100644 RenderingToolkit/03_openvkl_gsg/README.md delete mode 100644 RenderingToolkit/03_openvkl_gsg/sample.json delete mode 100644 RenderingToolkit/03_openvkl_gsg/src/vklTutorial.c diff --git a/RenderingToolkit/01_ospray_gsg/CMakeLists.txt b/RenderingToolkit/01_ospray_gsg/CMakeLists.txt deleted file mode 100644 index a7016ac36b..0000000000 --- a/RenderingToolkit/01_ospray_gsg/CMakeLists.txt +++ /dev/null @@ -1,27 +0,0 @@ -cmake_minimum_required(VERSION 3.16) -project(OSPRay_gsg LANGUAGES C CXX) - -find_package(ospray REQUIRED) - -set(ONEAPI_ROOT "") -if($ENV{ONEAPI_ROOT}) - set(ONEAPI_ROOT $ENV{ONEAPI_ROOT}) -else() - if(WIN32) - set(ONEAPI_ROOT "C:/Program Files (x86)/Intel/oneAPI") - else() - set(ONEAPI_ROOT /opt/intel/oneapi) - endif() -endif($ENV{ONEAPI_ROOT}) - - -message(STATUS "ONEAPI_ROOT: ${ONEAPI_ROOT}") -include_directories(${OSPRAY_INCLUDE_DIR} ${RKCOMMON_INCLUDE_DIRS}) -link_directories(${OSPRAY_ROOT}/lib ${ONEAPI_ROOT}/rkcommon/latest/lib) - -add_executable(ospTutorialCpp ${OSPRAY_RESOURCE} src/ospTutorial.cpp) -target_link_libraries(ospTutorialCpp PRIVATE ospray rkcommon) - -install(TARGETS ospTutorialCpp - DESTINATION ${CMAKE_INSTALL_BINDIR} -) diff --git a/RenderingToolkit/01_ospray_gsg/LICENSE.txt b/RenderingToolkit/01_ospray_gsg/LICENSE.txt deleted file mode 100644 index d645695673..0000000000 --- a/RenderingToolkit/01_ospray_gsg/LICENSE.txt +++ /dev/null @@ -1,202 +0,0 @@ - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. diff --git a/RenderingToolkit/01_ospray_gsg/README.md b/RenderingToolkit/01_ospray_gsg/README.md deleted file mode 100644 index 3a57899c22..0000000000 --- a/RenderingToolkit/01_ospray_gsg/README.md +++ /dev/null @@ -1,115 +0,0 @@ -# Getting Started Sample for Intel oneAPI Rendering Toolkit: Intel OSPRay - -This sample ospTutorialCpp renders two triangles with the OSPRay API. - -Two renders are written to .ppm image files to disk. The first image is rendered with one accumulation. The second image is rendered with 10 accumulations. - - -## License - -TBD - -Code samples are licensed under the MIT license. See -[License.txt](https://github.com/oneapi-src/oneAPI-samples/blob/master/License.txt) for details. - -Third party program Licenses can be found here: [third-party-programs.txt](https://github.com/oneapi-src/oneAPI-samples/blob/master/third-party-programs.txt) - -## Requirements - -To build and run the samples you will need a compiler toolchain and imaging tools: - -Compiler: -- MSVS 2019 on Windows* OS -- On other platforms a C++11 compiler and a C99 compiler. (Ex: gcc/g++/clang) - -oneAPI Libraries: -Install the Intel oneAPI Rendering Toolkit -- OSPRay -- Embree -- Open VKL - -Imaging Tools: -- An image **display program** for .ppm and .pfm filetypes . Ex: [ImageMagick](https://www.imagemagick.org/) - - -## Build and Run - -### Windows OS: - -Run a new **x64 Native Tools Command Prompt for MSVS 2019** - -``` -call \setvars.bat -cd \RenderingToolkit\ospray_gsg -mkdir build -cd build -cmake -G"Visual Studio 16 2019" -A x64 -DCMAKE_PREFIX_PATH="" .. -cmake --build . --config Release -cd Release -ospTutorialCpp.exe -``` - -Review the first output image with a .ppm image viewer. Example using ImageMagick display: -``` -\imdisplay firstFrameCpp.ppm -``` - -Review the accumulated output image with a .ppm image viewer. Example using ImageMagick display: -``` -\imdisplay accumulatedFrameCpp.ppm -``` - - -### Linux OS: - -Start a new Terminal session -``` -source /setvars.sh -cd /RenderingToolkit/ospray_gsg -mkdir build -cd build -cmake -DCMAKE_PREFIX_PATH="" .. -cmake --build . -./ospTutorialCpp -``` - -Review the first output image with a .ppm image viewer. Example using ImageMagick display: -``` -/imdisplay firstFrameCpp.ppm -``` - -Review the accumulated output image with a .ppm image viewer. Example using ImageMagick display: -``` -/imdisplay accumulatedFrameCpp.ppm -``` - - -### MacOS: - -Start a new Terminal session - -``` -source /setvars.sh -cd /RenderingToolkit/ospray_gsg -mkdir build -cd build -cmake -DCMAKE_PREFIX_PATH="" .. -cmake --build . -./ospTutorialCpp -``` - -Review the first output image with a .ppm image viewer. Example using ImageMagick display: -``` -/imdisplay firstFrameCpp.ppm -``` - -Review the accumulated output image with a .ppm image viewer. Example using ImageMagick display: -``` -/imdisplay accumulatedFrameCpp.ppm -``` - - - - - - diff --git a/RenderingToolkit/01_ospray_gsg/sample.json b/RenderingToolkit/01_ospray_gsg/sample.json deleted file mode 100644 index a29383b8be..0000000000 --- a/RenderingToolkit/01_ospray_gsg/sample.json +++ /dev/null @@ -1,58 +0,0 @@ -{ - "guid": "40C26D31-D553-4BD9-9E1D-63DDF352CB85", - "name": "Intel OSPRay Getting Started", - "categories": ["Toolkit/oneAPI Libraries/OSPRay"], - "description": "This introductory 'hello rendering toolkit' sample program demonstrates how to render triangle data with the pathtracer from Intel OSPRay", - "builder": ["cli"], - "languages": [{"cpp":{}}], - "dependencies": ["tbb","ospray","openvkl","embree","rkcommon"], - "os":["linux", "windows", "darwin"], - "targetDevice": ["CPU"], - "ciTests": { - "linux": [ - { - "env": ["source /opt/intel/oneapi/setvars.sh --force"], - "id": "Intel_OSPRay_ospTutorial_lin", - "steps": [ - "mkdir build", - "cd build", - "cmake -DCMAKE_PREFIX_PATH=\"/opt/intel/oneAPI\" ..", - "cmake --build . ", - "cd Release", - "./ospTutorialCpp" - ] - } - ], - "windows":[ - { - "env": ["call C:\\Program Files (x86)\\Intel\\oneAPI\\setvars.bat"], - "id": "Intel_OSPRay_ospTutorial_win", - "steps":[ - "mkdir build", - "cd build", - "cmake -G\"Visual Studio 16 2019\" -A x64 -DCMAKE_PREFIX_PATH=\"C:/Program Files (x86)/Intel/oneAPI\" ..", - "cmake --build . --config Release", - "cd Release", - "ospTutorialCpp.exe" - ] - - } - ], - "macos": [ - { - "env": ["source /opt/intel/oneapi/setvars.sh --force"], - "id": "Intel_OSPRay_ospTutorial_mac", - "steps": [ - "mkdir build", - "cd build", - "cmake -DCMAKE_PREFIX_PATH=\"/opt/intel/oneAPI\" ..", - "cmake --build . ", - "cd Release", - "./ospTutorialCpp" - ] - } - ] - - - } -} diff --git a/RenderingToolkit/01_ospray_gsg/src/ospTutorial.cpp b/RenderingToolkit/01_ospray_gsg/src/ospTutorial.cpp deleted file mode 100644 index 276ba7b9bf..0000000000 --- a/RenderingToolkit/01_ospray_gsg/src/ospTutorial.cpp +++ /dev/null @@ -1,172 +0,0 @@ -// Copyright 2009-2021 Intel Corporation -// SPDX-License-Identifier: Apache-2.0 - -/* This is a small example tutorial how to use OSPRay in an application. - * - * On Linux build it in the build_directory with - * g++ ../apps/ospTutorial/ospTutorial.cpp -I ../ospray/include \ - * -I ../../rkcommon -L . -lospray -Wl,-rpath,. -o ospTutorial - * On Windows build it in the build_directory\$Configuration with - * cl ..\..\apps\ospTutorial\ospTutorial.cpp /EHsc -I ..\..\ospray\include ^ - * -I ..\.. -I ..\..\..\rkcommon ospray.lib - * Above commands assume that rkcommon is present in a directory right "next - * to" the OSPRay directory. If this is not the case, then adjust the include - * path (alter "-I " appropriately). - */ - -#include -#include -#include -#ifdef _WIN32 -#define NOMINMAX -#include -#include -#include -#else -#include -#endif - -#include - -#include "ospray/ospray_cpp.h" -#include "ospray/ospray_cpp/ext/rkcommon.h" -#include "rkcommon/utility/SaveImage.h" - -using namespace rkcommon::math; - -int main(int argc, const char **argv) -{ - // image size - vec2i imgSize; - imgSize.x = 1024; // width - imgSize.y = 768; // height - - // camera - vec3f cam_pos{0.f, 0.f, 0.f}; - vec3f cam_up{0.f, 1.f, 0.f}; - vec3f cam_view{0.1f, 0.f, 1.f}; - - // triangle mesh data - std::vector vertex = {vec3f(-1.0f, -1.0f, 3.0f), - vec3f(-1.0f, 1.0f, 3.0f), - vec3f(1.0f, -1.0f, 3.0f), - vec3f(0.1f, 0.1f, 0.3f)}; - - std::vector color = {vec4f(0.9f, 0.5f, 0.5f, 1.0f), - vec4f(0.8f, 0.8f, 0.8f, 1.0f), - vec4f(0.8f, 0.8f, 0.8f, 1.0f), - vec4f(0.5f, 0.9f, 0.5f, 1.0f)}; - - std::vector index = {vec3ui(0, 1, 2), vec3ui(1, 2, 3)}; - -#ifdef _WIN32 - bool waitForKey = false; - CONSOLE_SCREEN_BUFFER_INFO csbi; - if (GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &csbi)) { - // detect standalone console: cursor at (0,0)? - waitForKey = csbi.dwCursorPosition.X == 0 && csbi.dwCursorPosition.Y == 0; - } -#endif - - // initialize OSPRay; OSPRay parses (and removes) its commandline parameters, - // e.g. "--osp:debug" - OSPError init_error = ospInit(&argc, argv); - if (init_error != OSP_NO_ERROR) - return init_error; - - // use scoped lifetimes of wrappers to release everything before ospShutdown() - { - // create and setup camera - ospray::cpp::Camera camera("perspective"); - camera.setParam("aspect", imgSize.x / (float)imgSize.y); - camera.setParam("position", cam_pos); - camera.setParam("direction", cam_view); - camera.setParam("up", cam_up); - camera.commit(); // commit each object to indicate modifications are done - - // create and setup model and mesh - ospray::cpp::Geometry mesh("mesh"); - mesh.setParam("vertex.position", ospray::cpp::CopiedData(vertex)); - mesh.setParam("vertex.color", ospray::cpp::CopiedData(color)); - mesh.setParam("index", ospray::cpp::CopiedData(index)); - mesh.commit(); - - // put the mesh into a model - ospray::cpp::GeometricModel model(mesh); - model.commit(); - - // put the model into a group (collection of models) - ospray::cpp::Group group; - group.setParam("geometry", ospray::cpp::CopiedData(model)); - group.commit(); - - // put the group into an instance (give the group a world transform) - ospray::cpp::Instance instance(group); - instance.commit(); - - // put the instance in the world - ospray::cpp::World world; - world.setParam("instance", ospray::cpp::CopiedData(instance)); - - // create and setup light for Ambient Occlusion - ospray::cpp::Light light("ambient"); - light.commit(); - - world.setParam("light", ospray::cpp::CopiedData(light)); - world.commit(); - - // create renderer, choose Scientific Visualization renderer - ospray::cpp::Renderer renderer("scivis"); - - // complete setup of renderer - renderer.setParam("aoSamples", 1); - renderer.setParam("backgroundColor", 1.0f); // white, transparent - renderer.commit(); - - // create and setup framebuffer - ospray::cpp::FrameBuffer framebuffer( - imgSize.x, imgSize.y, OSP_FB_SRGBA, OSP_FB_COLOR | OSP_FB_ACCUM); - framebuffer.clear(); - - // render one frame - framebuffer.renderFrame(renderer, camera, world); - - // access framebuffer and write its content as PPM file - uint32_t *fb = (uint32_t *)framebuffer.map(OSP_FB_COLOR); - rkcommon::utility::writePPM("firstFrameCpp.ppm", imgSize.x, imgSize.y, fb); - framebuffer.unmap(fb); - std::cout << "rendering initial frame to firstFrameCpp.ppm" << std::endl; - - // render 10 more frames, which are accumulated to result in a better - // converged image - for (int frames = 0; frames < 10; frames++) - framebuffer.renderFrame(renderer, camera, world); - - fb = (uint32_t *)framebuffer.map(OSP_FB_COLOR); - rkcommon::utility::writePPM( - "accumulatedFrameCpp.ppm", imgSize.x, imgSize.y, fb); - framebuffer.unmap(fb); - std::cout << "rendering 10 accumulated frames to accumulatedFrameCpp.ppm" - << std::endl; - - ospray::cpp::PickResult res = - framebuffer.pick(renderer, camera, world, 0.5f, 0.5f); - - if (res.hasHit) { - std::cout << "picked geometry [instance: " << res.instance.handle() - << ", model: " << res.model.handle() - << ", primitive: " << res.primID << "]" << std::endl; - } - } - - ospShutdown(); - -#ifdef _WIN32 - if (waitForKey) { - printf("\n\tpress any key to exit"); - _getch(); - } -#endif - - return 0; -} diff --git a/RenderingToolkit/02_embree_gsg/CMakeLists.txt b/RenderingToolkit/02_embree_gsg/CMakeLists.txt deleted file mode 100644 index ea7d809d86..0000000000 --- a/RenderingToolkit/02_embree_gsg/CMakeLists.txt +++ /dev/null @@ -1,27 +0,0 @@ -cmake_minimum_required(VERSION 3.16) -project(embree_gsg LANGUAGES C CXX) - -find_package(embree 3.0 REQUIRED) - -set(ONEAPI_ROOT "") -if($ENV{ONEAPI_ROOT}) - set(ONEAPI_ROOT $ENV{ONEAPI_ROOT}) -else() - if(WIN32) - set(ONEAPI_ROOT "C:/Program Files (x86)/Intel/oneAPI") - else() - set(ONEAPI_ROOT /opt/intel/oneapi) - endif() -endif($ENV{ONEAPI_ROOT}) - - -message(STATUS "ONEAPI_ROOT: ${ONEAPI_ROOT}") -include_directories(${EMBREE_INCLUDE_DIR} ${RKCOMMON_INCLUDE_DIRS}) -link_directories(${EMBREE_ROOT}/lib ${ONEAPI_ROOT}/rkcommon/latest/lib) - -add_executable(minimal src/minimal.cpp) -target_link_libraries(minimal PRIVATE embree rkcommon) - -install(TARGETS minimal - DESTINATION ${CMAKE_INSTALL_BINDIR} -) diff --git a/RenderingToolkit/02_embree_gsg/LICENSE.txt b/RenderingToolkit/02_embree_gsg/LICENSE.txt deleted file mode 100644 index d645695673..0000000000 --- a/RenderingToolkit/02_embree_gsg/LICENSE.txt +++ /dev/null @@ -1,202 +0,0 @@ - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. diff --git a/RenderingToolkit/02_embree_gsg/README.md b/RenderingToolkit/02_embree_gsg/README.md deleted file mode 100644 index 08462dafc6..0000000000 --- a/RenderingToolkit/02_embree_gsg/README.md +++ /dev/null @@ -1,79 +0,0 @@ -# Getting Started Sample for Intel oneAPI Rendering Toolkit: Intel Embree - -This sample program, minimal, performs two ray to triangle intersect tests with the Embree API. - -Output is written to the console (stdout). - -## License - -TBD - -Code samples are licensed under the MIT license. See -[License.txt](https://github.com/oneapi-src/oneAPI-samples/blob/master/License.txt) for details. - -Third party program Licenses can be found here: [third-party-programs.txt](https://github.com/oneapi-src/oneAPI-samples/blob/master/third-party-programs.txt) - -## Requirements - -To build and run the samples you will need a compiler toolchain and imaging tools: - -Compiler: -- MSVS 2019 on Windows* OS -- On other platforms a C++11 compiler and a C99 compiler. (Ex: gcc/g++/clang) - -oneAPI Libraries: -Install the Intel oneAPI Rendering Toolkit -- Embree - - -## Build and Run - -### Windows OS: - -Run a new **x64 Native Tools Command Prompt for MSVS 2019** - -``` -call \setvars.bat -cd \RenderingToolkit\embree_gsg -mkdir build -cd build -cmake -G"Visual Studio 16 2019" -A x64 -DCMAKE_PREFIX_PATH="" .. -cmake --build . --config Release -cd Release -minimal.exe -``` - -Review the terminal output (stdout) - - -### Linux OS: - -Start a new Terminal session -``` -source /setvars.sh -cd /RenderingToolkit/embree_gsg -mkdir build -cd build -cmake -DCMAKE_PREFIX_PATH="" .. -cmake --build . -./minimal -``` - -Review the terminal output (stdout) - - -### MacOS: - -Start a new Terminal session - -``` -source /setvars.sh -cd /RenderingToolkit/ospray_gsg -mkdir build -cd build -cmake -DCMAKE_PREFIX_PATH="" .. -cmake --build . -./minimal -``` - -Review the terminal output (stdout) diff --git a/RenderingToolkit/02_embree_gsg/sample.json b/RenderingToolkit/02_embree_gsg/sample.json deleted file mode 100644 index 5c5806f060..0000000000 --- a/RenderingToolkit/02_embree_gsg/sample.json +++ /dev/null @@ -1,58 +0,0 @@ -{ - "guid": "87FA013D-0B19-45AE-BCD5-43412BE0A99F", - "name": "Intel Embree Getting Started", - "categories": ["Toolkit/oneAPI Libraries/Embree"], - "description": "This introductory hello rendering toolkit sample illustrates how to cast a ray into a scene with Intel Embree", - "builder": ["cli"], - "languages": [{"cpp":{}}], - "dependencies": ["tbb","rkcommon"], - "os":["linux", "windows", "darwin"], - "targetDevice": ["CPU"], - "ciTests": { - "linux": [ - { - "env": ["source /opt/intel/oneapi/setvars.sh --force"], - "id": "Intel_Embree_minimal_lin", - "steps": [ - "mkdir build", - "cd build", - "cmake -DCMAKE_PREFIX_PATH=\"/opt/intel/oneAPI\" ..", - "cmake --build . ", - "cd Release", - "./minimal" - ] - } - ], - "windows":[ - { - "env": ["call C:\\Program Files (x86)\\Intel\\oneAPI\\setvars.bat"], - "id": "Intel_Embree_minimal_win", - "steps":[ - "mkdir build", - "cd build", - "cmake -G\"Visual Studio 16 2019\" -A x64 -DCMAKE_PREFIX_PATH=\"C:/Program Files (x86)/Intel/oneAPI\" ..", - "cmake --build . --config Release", - "cd Release", - "minimal.exe" - ] - - } - ], - "darwin": [ - { - "env": ["source /opt/intel/oneapi/setvars.sh --force"], - "id": "Intel_Embree_minimal_mac", - "steps": [ - "mkdir build", - "cd build", - "cmake -DCMAKE_PREFIX_PATH=\"/opt/intel/oneAPI\" ..", - "cmake --build . ", - "cd Release", - "./minimal" - ] - } - ] - - - } -} diff --git a/RenderingToolkit/02_embree_gsg/src/minimal.cpp b/RenderingToolkit/02_embree_gsg/src/minimal.cpp deleted file mode 100644 index 1a7d7b221f..0000000000 --- a/RenderingToolkit/02_embree_gsg/src/minimal.cpp +++ /dev/null @@ -1,256 +0,0 @@ -// Copyright 2009-2021 Intel Corporation -// SPDX-License-Identifier: Apache-2.0 - -#include -#include -#include -#include -#include - -#if defined(_WIN32) -# include -# include -#endif - -/* - * A minimal tutorial. - * - * It demonstrates how to intersect a ray with a single triangle. It is - * meant to get you started as quickly as possible, and does not output - * an image. - * - * For more complex examples, see the other tutorials. - * - * Compile this file using - * - * gcc -std=c99 \ - * -I///include \ - * -o minimal \ - * minimal.c \ - * -L///lib \ - * -lembree3 - * - * You should be able to compile this using a C or C++ compiler. - */ - -/* - * This is only required to make the tutorial compile even when - * a custom namespace is set. - */ -#if defined(RTC_NAMESPACE_USE) -RTC_NAMESPACE_USE -#endif - -/* - * We will register this error handler with the device in initializeDevice(), - * so that we are automatically informed on errors. - * This is extremely helpful for finding bugs in your code, prevents you - * from having to add explicit error checking to each Embree API call. - */ -void errorFunction(void* userPtr, enum RTCError error, const char* str) -{ - printf("error %d: %s\n", error, str); -} - -/* - * Embree has a notion of devices, which are entities that can run - * raytracing kernels. - * We initialize our device here, and then register the error handler so that - * we don't miss any errors. - * - * rtcNewDevice() takes a configuration string as an argument. See the API docs - * for more information. - * - * Note that RTCDevice is reference-counted. - */ -RTCDevice initializeDevice() -{ - RTCDevice device = rtcNewDevice(NULL); - - if (!device) - printf("error %d: cannot create device\n", rtcGetDeviceError(NULL)); - - rtcSetDeviceErrorFunction(device, errorFunction, NULL); - return device; -} - -/* - * Create a scene, which is a collection of geometry objects. Scenes are - * what the intersect / occluded functions work on. You can think of a - * scene as an acceleration structure, e.g. a bounding-volume hierarchy. - * - * Scenes, like devices, are reference-counted. - */ -RTCScene initializeScene(RTCDevice device) -{ - RTCScene scene = rtcNewScene(device); - - /* - * Create a triangle mesh geometry, and initialize a single triangle. - * You can look up geometry types in the API documentation to - * find out which type expects which buffers. - * - * We create buffers directly on the device, but you can also use - * shared buffers. For shared buffers, special care must be taken - * to ensure proper alignment and padding. This is described in - * more detail in the API documentation. - */ - RTCGeometry geom = rtcNewGeometry(device, RTC_GEOMETRY_TYPE_TRIANGLE); - float* vertices = (float*) rtcSetNewGeometryBuffer(geom, - RTC_BUFFER_TYPE_VERTEX, - 0, - RTC_FORMAT_FLOAT3, - 3*sizeof(float), - 3); - - unsigned* indices = (unsigned*) rtcSetNewGeometryBuffer(geom, - RTC_BUFFER_TYPE_INDEX, - 0, - RTC_FORMAT_UINT3, - 3*sizeof(unsigned), - 1); - - if (vertices && indices) - { - vertices[0] = 0.f; vertices[1] = 0.f; vertices[2] = 0.f; - vertices[3] = 1.f; vertices[4] = 0.f; vertices[5] = 0.f; - vertices[6] = 0.f; vertices[7] = 1.f; vertices[8] = 0.f; - - indices[0] = 0; indices[1] = 1; indices[2] = 2; - } - - /* - * You must commit geometry objects when you are done setting them up, - * or you will not get any intersections. - */ - rtcCommitGeometry(geom); - - /* - * In rtcAttachGeometry(...), the scene takes ownership of the geom - * by increasing its reference count. This means that we don't have - * to hold on to the geom handle, and may release it. The geom object - * will be released automatically when the scene is destroyed. - * - * rtcAttachGeometry() returns a geometry ID. We could use this to - * identify intersected objects later on. - */ - rtcAttachGeometry(scene, geom); - rtcReleaseGeometry(geom); - - /* - * Like geometry objects, scenes must be committed. This lets - * Embree know that it may start building an acceleration structure. - */ - rtcCommitScene(scene); - - return scene; -} - -/* - * Cast a single ray with origin (ox, oy, oz) and direction - * (dx, dy, dz). - */ -void castRay(RTCScene scene, - float ox, float oy, float oz, - float dx, float dy, float dz) -{ - /* - * The intersect context can be used to set intersection - * filters or flags, and it also contains the instance ID stack - * used in multi-level instancing. - */ - struct RTCIntersectContext context; - rtcInitIntersectContext(&context); - - /* - * The ray hit structure holds both the ray and the hit. - * The user must initialize it properly -- see API documentation - * for rtcIntersect1() for details. - */ - struct RTCRayHit rayhit; - rayhit.ray.org_x = ox; - rayhit.ray.org_y = oy; - rayhit.ray.org_z = oz; - rayhit.ray.dir_x = dx; - rayhit.ray.dir_y = dy; - rayhit.ray.dir_z = dz; - rayhit.ray.tnear = 0; - rayhit.ray.tfar = std::numeric_limits::infinity(); - rayhit.ray.mask = -1; - rayhit.ray.flags = 0; - rayhit.hit.geomID = RTC_INVALID_GEOMETRY_ID; - rayhit.hit.instID[0] = RTC_INVALID_GEOMETRY_ID; - - /* - * There are multiple variants of rtcIntersect. This one - * intersects a single ray with the scene. - */ - rtcIntersect1(scene, &context, &rayhit); - - printf("%f, %f, %f: ", ox, oy, oz); - if (rayhit.hit.geomID != RTC_INVALID_GEOMETRY_ID) - { - /* Note how geomID and primID identify the geometry we just hit. - * We could use them here to interpolate geometry information, - * compute shading, etc. - * Since there is only a single triangle in this scene, we will - * get geomID=0 / primID=0 for all hits. - * There is also instID, used for instancing. See - * the instancing tutorials for more information */ - printf("Found intersection on geometry %d, primitive %d at tfar=%f\n", - rayhit.hit.geomID, - rayhit.hit.primID, - rayhit.ray.tfar); - } - else - printf("Did not find any intersection.\n"); -} - -void waitForKeyPressedUnderWindows() -{ -#if defined(_WIN32) - HANDLE hStdOutput = GetStdHandle(STD_OUTPUT_HANDLE); - - CONSOLE_SCREEN_BUFFER_INFO csbi; - if (!GetConsoleScreenBufferInfo(hStdOutput, &csbi)) { - printf("GetConsoleScreenBufferInfo failed: %d\n", GetLastError()); - return; - } - - /* do not pause when running on a shell */ - if (csbi.dwCursorPosition.X != 0 || csbi.dwCursorPosition.Y != 0) - return; - - /* only pause if running in separate console window. */ - printf("\n\tPress any key to exit...\n"); - int ch = getch(); -#endif -} - - -/* -------------------------------------------------------------------------- */ - -int main() -{ - /* Initialization. All of this may fail, but we will be notified by - * our errorFunction. */ - RTCDevice device = initializeDevice(); - RTCScene scene = initializeScene(device); - - /* This will hit the triangle at t=1. */ - castRay(scene, 0, 0, -1, 0, 0, 1); - - /* This will not hit anything. */ - castRay(scene, 1, 1, -1, 0, 0, 1); - - /* Though not strictly necessary in this example, you should - * always make sure to release resources allocated through Embree. */ - rtcReleaseScene(scene); - rtcReleaseDevice(device); - - /* wait for user input under Windows when opened in separate window */ - waitForKeyPressedUnderWindows(); - - return 0; -} - diff --git a/RenderingToolkit/03_openvkl_gsg/CMakeLists.txt b/RenderingToolkit/03_openvkl_gsg/CMakeLists.txt deleted file mode 100644 index b50047915f..0000000000 --- a/RenderingToolkit/03_openvkl_gsg/CMakeLists.txt +++ /dev/null @@ -1,26 +0,0 @@ -cmake_minimum_required(VERSION 3.16) -project(OPENVKL_GSG LANGUAGES C) - -find_package(openvkl REQUIRED) - -set(ONEAPI_ROOT "") -if($ENV{ONEAPI_ROOT}) - set(ONEAPI_ROOT $ENV{ONEAPI_ROOT}) -else() - if(WIN32) - set(ONEAPI_ROOT "C:/Program Files (x86)/Intel/oneAPI") - else() - set(ONEAPI_ROOT /opt/intel/oneapi) - endif() -endif($ENV{ONEAPI_ROOT}) - -set(OPENVKL_ROOT ${ONEAPI_ROOT}/openvkl/latest) -set(OPENVKL_INCLUDE_DIR ${OPENVKL_ROOT}/include) -message(STATUS "OPENVKL_INCLUDE_DIR: ${OPENVKL_INCLUDE_DIR}") -message(STATUS "ONEAPI_ROOT: ${ONEAPI_ROOT}") -include_directories(${OPENVKL_INCLUDE_DIR} ${ONEAPI_ROOT}/rkcommon/latest/include) -link_directories(${OPENVKL_ROOT}/lib) - -add_executable(vklTutorial src/vklTutorial.c) -target_link_libraries(vklTutorial PRIVATE openvkl) -install(TARGETS vklTutorial RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}) diff --git a/RenderingToolkit/03_openvkl_gsg/LICENSE.txt b/RenderingToolkit/03_openvkl_gsg/LICENSE.txt deleted file mode 100644 index d645695673..0000000000 --- a/RenderingToolkit/03_openvkl_gsg/LICENSE.txt +++ /dev/null @@ -1,202 +0,0 @@ - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. diff --git a/RenderingToolkit/03_openvkl_gsg/README.md b/RenderingToolkit/03_openvkl_gsg/README.md deleted file mode 100644 index 65da1515b9..0000000000 --- a/RenderingToolkit/03_openvkl_gsg/README.md +++ /dev/null @@ -1,82 +0,0 @@ -# Getting Started Sample for Intel oneAPI Rendering Toolkit: Intel Open VKL - -This sample program, vklTutorial, shows sampling output amongst the different volumetric sampling capabilities with Intel Open VKL. - -Output is written to the console (stdout). - -## License - -TBD - -Code samples are licensed under the MIT license. See -[License.txt](https://github.com/oneapi-src/oneAPI-samples/blob/master/License.txt) for details. - -Third party program Licenses can be found here: [third-party-programs.txt](https://github.com/oneapi-src/oneAPI-samples/blob/master/third-party-programs.txt) - -## Requirements - -To build and run the samples you will need a compiler toolchain and imaging tools: - -Compiler: -- MSVS 2019 on Windows* OS -- On other platforms a C++11 compiler and a C99 compiler. (Ex: gcc/g++/clang) - -oneAPI Libraries: -Install the Intel oneAPI Rendering Toolkit -- Embree -- Open VKL - - - - -## Build and Run - -### Windows OS: - -Run a new **x64 Native Tools Command Prompt for MSVS 2019** - -``` -call \setvars.bat -cd \RenderingToolkit\openvkl_gsg -mkdir build -cd build -cmake -G"Visual Studio 16 2019" -A x64 -DCMAKE_PREFIX_PATH="" .. -cmake --build . --config Release -cd Release -vklTutorial.exe -``` - -Review the terminal output (stdout) - - -### Linux OS: - -Start a new Terminal session -``` -source /setvars.sh -cd /RenderingToolkit/openvkl_gsg -mkdir build -cd build -cmake -DCMAKE_PREFIX_PATH="" .. -cmake --build . -./vklTutorial -``` - -Review the terminal output (stdout) - - -### MacOS: - -Start a new Terminal session - -``` -source /setvars.sh -cd /RenderingToolkit/openvkl_gsg -mkdir build -cd build -cmake -DCMAKE_PREFIX_PATH="" .. -cmake --build . -./vklTutorial -``` - -Review the terminal output (stdout) diff --git a/RenderingToolkit/03_openvkl_gsg/sample.json b/RenderingToolkit/03_openvkl_gsg/sample.json deleted file mode 100644 index c658c082d4..0000000000 --- a/RenderingToolkit/03_openvkl_gsg/sample.json +++ /dev/null @@ -1,56 +0,0 @@ -{ - "guid": "80BB7E55-6FCA-491F-8541-E271324CF169", - "name": "Intel Open VKL Getting Started", - "categories": ["Toolkit/oneAPI Libraries/Open VKL"], - "description": "This introductory hello rendering toolkit sample program demonstrates how to sample into volumes with Intel Open VKL", - "builder": ["cli"], - "languages": [{"c":{}}], - "dependencies": ["tbb","openvkl","embree","rkcommon"], - "os":["linux", "windows", "darwin"], - "targetDevice": ["CPU"], - "ciTests": { - "linux": [ - { - "env": ["source /opt/intel/oneapi/setvars.sh --force"], - "id": "Intel_OpenVKL_vklTutorial_lin", - "steps": [ - "mkdir build", - "cd build", - "cmake -DCMAKE_PREFIX_PATH=\"/opt/intel/oneAPI\" ..", - "cmake --build . ", - "cd Release", - "./vklTutorial" - ] - } - ], - "windows":[ - { - "env": ["call C:\\Program Files (x86)\\Intel\\oneAPI\\setvars.bat"], - "id": "Intel_OpenVKL_vklTutorial_win", - "steps":[ - "mkdir build", - "cd build", - "cmake -G\"Visual Studio 16 2019\" -A x64 -DCMAKE_PREFIX_PATH=\"C:/Program Files (x86)/Intel/oneAPI\" ..", - "cmake --build . --config Release", - "cd Release", - "vklTutorial.exe" - ] - - } - ], - "darwin": [ - { - "env": ["source /opt/intel/oneapi/setvars.sh --force"], - "id": "Intel_OpenVKL_vklTutorial_mac", - "steps": [ - "mkdir build", - "cd build", - "cmake -DCMAKE_PREFIX_PATH=\"/opt/intel/oneAPI\" ..", - "cmake --build . ", - "cd Release", - "./vklTutorial" - ] - } - ] - } -} diff --git a/RenderingToolkit/03_openvkl_gsg/src/vklTutorial.c b/RenderingToolkit/03_openvkl_gsg/src/vklTutorial.c deleted file mode 100644 index c12f0547fd..0000000000 --- a/RenderingToolkit/03_openvkl_gsg/src/vklTutorial.c +++ /dev/null @@ -1,390 +0,0 @@ -// Copyright 2019-2021 Intel Corporation -// SPDX-License-Identifier: Apache-2.0 - -#include -#include - -#if defined(_MSC_VER) -#include // _malloca -#include // Sleep -#endif - -void demoScalarAPI(VKLDevice device, VKLVolume volume) -{ - printf("demo of 1-wide API\n"); - - VKLSampler sampler = vklNewSampler(volume); - vklCommit(sampler); - - // bounding box - vkl_box3f bbox = vklGetBoundingBox(volume); - printf("\tbounding box\n"); - printf("\t\tlower = %f %f %f\n", bbox.lower.x, bbox.lower.y, bbox.lower.z); - printf("\t\tupper = %f %f %f\n\n", bbox.upper.x, bbox.upper.y, bbox.upper.z); - - // number of attributes - unsigned int numAttributes = vklGetNumAttributes(volume); - printf("\tnum attributes = %d\n\n", numAttributes); - - // value range for all attributes - for (unsigned int i = 0; i < numAttributes; i++) { - vkl_range1f valueRange = vklGetValueRange(volume, i); - printf("\tvalue range (attribute %u) = (%f %f)\n", - i, - valueRange.lower, - valueRange.upper); - } - - // coordinate for sampling / gradients - vkl_vec3f coord = {1.f, 2.f, 3.f}; - printf("\n\tcoord = %f %f %f\n\n", coord.x, coord.y, coord.z); - - // sample, gradient (first attribute) - unsigned int attributeIndex = 0; - float time = 0.f; - float sample = vklComputeSample(sampler, &coord, attributeIndex, time); - vkl_vec3f grad = vklComputeGradient(sampler, &coord, attributeIndex, time); - printf("\tsampling and gradient computation (first attribute)\n"); - printf("\t\tsample = %f\n", sample); - printf("\t\tgrad = %f %f %f\n\n", grad.x, grad.y, grad.z); - - // sample (multiple attributes) - unsigned int M = 3; - unsigned int attributeIndices[] = {0, 1, 2}; - float samples[3]; - vklComputeSampleM(sampler, &coord, samples, M, attributeIndices, time); - printf("\tsampling (multiple attributes)\n"); - printf("\t\tsamples = %f %f %f\n\n", samples[0], samples[1], samples[2]); - - // interval iterator context setup - vkl_range1f ranges[2] = {{10, 20}, {50, 75}}; - int num_ranges = 2; - VKLData rangesData = - vklNewData(device, num_ranges, VKL_BOX1F, ranges, VKL_DATA_DEFAULT, 0); - - VKLIntervalIteratorContext intervalContext = - vklNewIntervalIteratorContext(sampler); - - vklSetInt(intervalContext, "attributeIndex", attributeIndex); - - vklSetData(intervalContext, "valueRanges", rangesData); - vklRelease(rangesData); - - vklCommit(intervalContext); - - // hit iterator context setup - float values[2] = {32, 96}; - int num_values = 2; - VKLData valuesData = - vklNewData(device, num_values, VKL_FLOAT, values, VKL_DATA_DEFAULT, 0); - - VKLHitIteratorContext hitContext = vklNewHitIteratorContext(sampler); - - vklSetInt(hitContext, "attributeIndex", attributeIndex); - - vklSetData(hitContext, "values", valuesData); - vklRelease(valuesData); - - vklCommit(hitContext); - - // ray definition for iterators - vkl_vec3f rayOrigin = {0, 1, 1}; - vkl_vec3f rayDirection = {1, 0, 0}; - vkl_range1f rayTRange = {0, 200}; - printf("\trayOrigin = %f %f %f\n", rayOrigin.x, rayOrigin.y, rayOrigin.z); - printf("\trayDirection = %f %f %f\n", - rayDirection.x, - rayDirection.y, - rayDirection.z); - printf("\trayTRange = %f %f\n", rayTRange.lower, rayTRange.upper); - - // interval iteration. This is scoped - { - // Note: buffer will cease to exist at the end of this scope. -#if defined(_MSC_VER) - // MSVC does not support variable length arrays, but provides a - // safer version of alloca. - char *buffer = _malloca(vklGetIntervalIteratorSize(intervalContext)); -#else - char buffer[vklGetIntervalIteratorSize(intervalContext)]; -#endif - VKLIntervalIterator intervalIterator = - vklInitIntervalIterator(intervalContext, - &rayOrigin, - &rayDirection, - &rayTRange, - time, - buffer); - - printf("\n\tinterval iterator for value ranges {%f %f} {%f %f}\n", - ranges[0].lower, - ranges[0].upper, - ranges[1].lower, - ranges[1].upper); - - for (;;) { - VKLInterval interval; - int result = vklIterateInterval(intervalIterator, &interval); - if (!result) - break; - printf( - "\t\ttRange (%f %f)\n\t\tvalueRange (%f %f)\n\t\tnominalDeltaT " - "%f\n\n", - interval.tRange.lower, - interval.tRange.upper, - interval.valueRange.lower, - interval.valueRange.upper, - interval.nominalDeltaT); - } -#if defined(_MSC_VER) - _freea(buffer); -#endif - } - - // hit iteration - { -#if defined(_MSC_VER) - // MSVC does not support variable length arrays, but provides a - // safer version of alloca. - char *buffer = _malloca(vklGetHitIteratorSize(hitContext)); -#else - char buffer[vklGetHitIteratorSize(hitContext)]; -#endif - VKLHitIterator hitIterator = vklInitHitIterator(hitContext, - &rayOrigin, - &rayDirection, - &rayTRange, - time, - buffer); - - printf("\thit iterator for values %f %f\n", values[0], values[1]); - - for (;;) { - VKLHit hit; - int result = vklIterateHit(hitIterator, &hit); - if (!result) - break; - printf("\t\tt %f\n\t\tsample %f\n\t\tepsilon %f\n\n", - hit.t, - hit.sample, - hit.epsilon); - } -#if defined(_MSC_VER) - _freea(buffer); -#endif - } - - vklRelease(hitContext); - vklRelease(intervalContext); - vklRelease(sampler); -} - -void demoVectorAPI(VKLVolume volume) -{ - printf("demo of 4-wide API (8- and 16- follow the same pattern)\n"); - - VKLSampler sampler = vklNewSampler(volume); - vklCommit(sampler); - - // structure-of-array layout - vkl_vvec3f4 coord4; - int valid[4]; - for (int i = 0; i < 4; i++) { - coord4.x[i] = i * 3 + 0; - coord4.y[i] = i * 3 + 1; - coord4.z[i] = i * 3 + 2; - valid[i] = -1; // valid mask: 0 = not valid, -1 = valid - } - - for (int i = 0; i < 4; i++) { - printf( - "\tcoord[%d] = %f %f %f\n", i, coord4.x[i], coord4.y[i], coord4.z[i]); - } - - // sample, gradient (first attribute) - unsigned int attributeIndex = 0; - float time4[4] = {0.f}; - float sample4[4]; - vkl_vvec3f4 grad4; - vklComputeSample4(valid, sampler, &coord4, sample4, attributeIndex, time4); - vklComputeGradient4(valid, sampler, &coord4, &grad4, attributeIndex, time4); - - printf("\n\tsampling and gradient computation (first attribute)\n"); - - for (int i = 0; i < 4; i++) { - printf("\t\tsample[%d] = %f\n", i, sample4[i]); - printf( - "\t\tgrad[%d] = %f %f %f\n", i, grad4.x[i], grad4.y[i], grad4.z[i]); - } - - // sample (multiple attributes) - unsigned int M = 3; - unsigned int attributeIndices[] = {0, 1, 2}; - float samples[3 * 4]; - vklComputeSampleM4( - valid, sampler, &coord4, samples, M, attributeIndices, time4); - - printf("\n\tsampling (multiple attributes)\n"); - - printf("\t\tsamples = "); - - for (unsigned int j = 0; j < M; j++) { - printf("%f %f %f %f\n", - samples[j * 4 + 0], - samples[j * 4 + 1], - samples[j * 4 + 2], - samples[j * 4 + 3]); - printf("\t\t "); - } - - printf("\n"); - - vklRelease(sampler); -} - -void demoStreamAPI(VKLVolume volume) -{ - printf("demo of stream API\n"); - - VKLSampler sampler = vklNewSampler(volume); - vklCommit(sampler); - - // array-of-structure layout; arbitrary stream lengths are supported - vkl_vec3f coord[5]; - - for (int i = 0; i < 5; i++) { - coord[i].x = i * 3 + 0; - coord[i].y = i * 3 + 1; - coord[i].z = i * 3 + 2; - } - - for (int i = 0; i < 5; i++) { - printf("\tcoord[%d] = %f %f %f\n", i, coord[i].x, coord[i].y, coord[i].z); - } - - // sample, gradient (first attribute) - printf("\n\tsampling and gradient computation (first attribute)\n"); - unsigned int attributeIndex = 0; - float time[5] = {0.f}; - float sample[5]; - vkl_vec3f grad[5]; - vklComputeSampleN(sampler, 5, coord, sample, attributeIndex, time); - vklComputeGradientN(sampler, 5, coord, grad, attributeIndex, time); - - for (int i = 0; i < 5; i++) { - printf("\t\tsample[%d] = %f\n", i, sample[i]); - printf("\t\tgrad[%d] = %f %f %f\n", i, grad[i].x, grad[i].y, grad[i].z); - } - - // sample (multiple attributes) - unsigned int M = 3; - unsigned int attributeIndices[] = {0, 1, 2}; - float samples[3 * 5]; - vklComputeSampleMN(sampler, 5, coord, samples, M, attributeIndices, time); - - printf("\n\tsampling (multiple attributes)\n"); - - printf("\t\tsamples = "); - - for (int i = 0; i < 5; i++) { - for (unsigned int j = 0; j < M; j++) { - printf("%f ", samples[i * M + j]); - } - printf("\n\t\t "); - } - - printf("\n"); - - vklRelease(sampler); -} - -int main() -{ - vklLoadModule("cpu_device"); - - VKLDevice device = vklNewDevice("cpu"); - vklCommitDevice(device); - - const int dimensions[] = {128, 128, 128}; - - const int numVoxels = dimensions[0] * dimensions[1] * dimensions[2]; - - const int numAttributes = 3; - - VKLVolume volume = vklNewVolume(device, "structuredRegular"); - vklSetVec3i( - volume, "dimensions", dimensions[0], dimensions[1], dimensions[2]); - vklSetVec3f(volume, "gridOrigin", 0, 0, 0); - vklSetVec3f(volume, "gridSpacing", 1, 1, 1); - - float *voxels = malloc(numVoxels * sizeof(float)); - - if (!voxels) { - printf("failed to allocate voxel memory!\n"); - return 1; - } - - // volume attribute 0: x-grad - for (int k = 0; k < dimensions[2]; k++) - for (int j = 0; j < dimensions[1]; j++) - for (int i = 0; i < dimensions[0]; i++) - voxels[k * dimensions[0] * dimensions[1] + j * dimensions[2] + i] = - (float)i; - - VKLData data0 = - vklNewData(device, numVoxels, VKL_FLOAT, voxels, VKL_DATA_DEFAULT, 0); - - // volume attribute 1: y-grad - for (int k = 0; k < dimensions[2]; k++) - for (int j = 0; j < dimensions[1]; j++) - for (int i = 0; i < dimensions[0]; i++) - voxels[k * dimensions[0] * dimensions[1] + j * dimensions[2] + i] = - (float)j; - - VKLData data1 = - vklNewData(device, numVoxels, VKL_FLOAT, voxels, VKL_DATA_DEFAULT, 0); - - // volume attribute 2: z-grad - for (int k = 0; k < dimensions[2]; k++) - for (int j = 0; j < dimensions[1]; j++) - for (int i = 0; i < dimensions[0]; i++) - voxels[k * dimensions[0] * dimensions[1] + j * dimensions[2] + i] = - (float)k; - - VKLData data2 = - vklNewData(device, numVoxels, VKL_FLOAT, voxels, VKL_DATA_DEFAULT, 0); - - VKLData attributes[] = {data0, data1, data2}; - - VKLData attributesData = vklNewData( - device, numAttributes, VKL_DATA, attributes, VKL_DATA_DEFAULT, 0); - - vklRelease(data0); - vklRelease(data1); - vklRelease(data2); - - vklSetData(volume, "data", attributesData); - vklRelease(attributesData); - - vklCommit(volume); - - demoScalarAPI(device, volume); - demoVectorAPI(volume); - demoStreamAPI(volume); - - vklRelease(volume); - - vklReleaseDevice(device); - - free(voxels); - - printf("complete.\n"); - -#if defined(_MSC_VER) - // On Windows, sleep for a few seconds so the terminal window doesn't close - // immediately. - Sleep(3000); -#endif - - return 0; -} From 6c7e27cb998b5bf782fd1fd0ba3daafa1acc274f Mon Sep 17 00:00:00 2001 From: Michael R Carroll Date: Mon, 18 Oct 2021 15:07:34 -0700 Subject: [PATCH 17/36] Add description to base README.md Signed-off-by: Michael R Carroll --- RenderingToolkit/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/RenderingToolkit/README.md b/RenderingToolkit/README.md index 0f649dbfc6..63879084e8 100644 --- a/RenderingToolkit/README.md +++ b/RenderingToolkit/README.md @@ -1,10 +1,10 @@ # Getting Started Samples for Intel® oneAPI Rendering Toolkit (RenderKit) -TBD +The Intel® oneAPI Rendering Toolkit is designed to accelerate photorealistic rendering workloads with rendering and ray-tracing libraries to create high-performance, high-fidelity visual experiences. With the libraries, get the most from Intel® hardware by optimizing performance at any scale. Creators, scientists, and engineers can push the boundaries of visualization by using the toolkit to develop studio animation and visual effects or to create scientific and industrial visualizations. You can find more information at the [ Intel oneAPI Rendering Toolkit portal](https://software.intel.com/content/www/us/en/develop/tools/oneapi/rendering-toolkit.html). -Users learn how to build and run samples for the component libraries in Render Kit. +Users will learn how to build and run samples for the component libraries in Render Kit. ## License From f02d1af1b6c8fc80b2fdc4ed643e6672fd3a1f22 Mon Sep 17 00:00:00 2001 From: Michael R Carroll Date: Thu, 21 Oct 2021 12:39:17 -0700 Subject: [PATCH 18/36] removing overlapping content. overlap to RenderingToolkit-ospray branch Signed-off-by: Michael R Carroll --- .repo-tools/Docs_Automation/guids.json | 27 +-------------- RenderingToolkit/README.md | 46 -------------------------- 2 files changed, 1 insertion(+), 72 deletions(-) delete mode 100644 RenderingToolkit/README.md diff --git a/.repo-tools/Docs_Automation/guids.json b/.repo-tools/Docs_Automation/guids.json index fe76e848f7..08e1f96cb0 100644 --- a/.repo-tools/Docs_Automation/guids.json +++ b/.repo-tools/Docs_Automation/guids.json @@ -1106,31 +1106,6 @@ "removed": "False", "ver": "2021.1.Gold" }, - "81B93386-B5EB-4998-B91B-3453263EC03E": { - "guid": "81B93386-B5EB-4998-B91B-3453263EC03E", - "ver": "2021.4.0", - "name": "Intel® Python Scikit-learn Extension Getting Started" - }, - "87FA013D-0B19-45AE-BCD5-43412BE0A99F" : { - "guid": "87FA013D-0B19-45AE-BCD5-43412BE0A99F", - "ver": "2021.4.0", - "name": "Intel oneAPI Rendering Toolkit Embree Getting Started" - }, - "41F82C06-A9FA-4521-B87A-8F7304CB6631" : { - "guid": "41F82C06-A9FA-4521-B87A-8F7304CB6631", - "ver": "2021.4.0", - "name": "Intel oneAPI Rendering Toolkit Open Image Denoise Getting Started" - }, - "80BB7E55-6FCA-491F-8541-E271324CF169" : { - "guid": "80BB7E55-6FCA-491F-8541-E271324CF169", - "ver": "2021.4.0", - "name": "Intel oneAPI Rendering Toolkit Open VKL Getting Started" - }, - "40C26D31-D553-4BD9-9E1D-63DDF352CB85" : { - "guid": "40C26D31-D553-4BD9-9E1D-63DDF352CB85", - "ver": "2021.4.0", - "name": "Intel oneAPI Rendering Toolkit OSPRay Getting Started" - }, "f92e64c7-7a7c-4749-b421-9f7a9e120099": { "guid": "f92e64c7-7a7c-4749-b421-9f7a9e120099", "name": "Vectorize VecMatMult", @@ -1138,4 +1113,4 @@ "removed": "False", "ver": "2021.1.Gold" } -} +} \ No newline at end of file diff --git a/RenderingToolkit/README.md b/RenderingToolkit/README.md deleted file mode 100644 index 63879084e8..0000000000 --- a/RenderingToolkit/README.md +++ /dev/null @@ -1,46 +0,0 @@ -# Getting Started Samples for Intel® oneAPI Rendering Toolkit (RenderKit) - -The Intel® oneAPI Rendering Toolkit is designed to accelerate photorealistic rendering workloads with rendering and ray-tracing libraries to create high-performance, high-fidelity visual experiences. With the libraries, get the most from Intel® hardware by optimizing performance at any scale. Creators, scientists, and engineers can push the boundaries of visualization by using the toolkit to develop studio animation and visual effects or to create scientific and industrial visualizations. - -You can find more information at the [ Intel oneAPI Rendering Toolkit portal](https://software.intel.com/content/www/us/en/develop/tools/oneapi/rendering-toolkit.html). - -Users will learn how to build and run samples for the component libraries in Render Kit. - -## License - -TBD - -Code samples are licensed under the MIT license. See -[License.txt](https://github.com/oneapi-src/oneAPI-samples/blob/master/License.txt) for details. - -Third party program Licenses can be found here: [third-party-programs.txt](https://github.com/oneapi-src/oneAPI-samples/blob/master/third-party-programs.txt) - -## Requirements - -To build and run the samples you will need a compiler toolchain, the libraries, and imaging tools: - -Compiler: -- MSVS 2019 on Windows* OS -- On other platforms a C++11 compiler and a C99 compiler. (Ex: gcc/g++/clang) - -oneAPI Libraries: -Install the Intel oneAPI Rendering Toolkit -- OSPRay -- Embree -- Open VKL -- Open Image Denoise - -Imaging Tools: -- An image **display program** for .ppm and .pfm filetypes . Ex: [ImageMagick](https://www.imagemagick.org/) -- An image **converter** for .ppm filetypes, .pfm filetypes, and endian conversions. Ex: [ImageMagick](https://www.imagemagick.org/) - -## Getting Started Samples - -Please try the getting started sample programs in order. Outputs of a sample may serve as inputs for another sample. - -| Order | Component | Folder | Description | -| -- | --------- | ------------------------------------------------ | - | -| 1 | Intel OSPRay | [01_ospray_gsg](01_ospray_gsg) | Get started with Intel OSPRay | -| 2 | Intel Embree | [02_embree_gsg](02_embree_gsg)| Get started with Intel Embree | -| 3 | Intel Open Volume Kernel Library | [03_openvkl_gsg](03_openvkl_gsg)| Get started with Intel Open VKL | -| 4 | Intel Open Image Denoise | [04_oidn_gsg](04_oidn_gsg) | Get started with Intel Open Image Denoise | From c01aebb375d234299c140b6594028ff4f82abc7f Mon Sep 17 00:00:00 2001 From: Michael R Carroll Date: Thu, 21 Oct 2021 14:40:57 -0700 Subject: [PATCH 19/36] Updates for the oidn README.md Signed-off-by: Michael R Carroll --- RenderingToolkit/04_oidn_gsg/README.md | 59 ++++++++++++++------------ 1 file changed, 32 insertions(+), 27 deletions(-) diff --git a/RenderingToolkit/04_oidn_gsg/README.md b/RenderingToolkit/04_oidn_gsg/README.md index e99c3a8a9c..43f7464665 100644 --- a/RenderingToolkit/04_oidn_gsg/README.md +++ b/RenderingToolkit/04_oidn_gsg/README.md @@ -1,42 +1,49 @@ # Getting Started Sample for Intel oneAPI Rendering Toolkit: Intel Open Image Denoise -This sample program, oidnDenoise, denoises a raytraced image. -oidnDenoise takes a preprocessed image accumulatedFrameCpp for input. Recall, this image was originally generated from the Intel OSPRay getting started sample, ospTutorial. +Intel Open Image Denoise is an open source library of high-performance, high-quality, denoising filters for images rendered with ray tracing. Significantly reduce rendering times in ray tracing based rendering applications. -oidnDenoise writes a denoised .pfm image file to disk. +| Minimum Requirements | Description +|:--- |:--- +| OS | Linux* Ubuntu* 18.04, CentOS 8 (or compatible); Windows 10; MacOS 10.15+ +| Hardware | Intel 64 Penryn or newer with SSE4.1 extensions, ARM64 with NEON extensions +| Compiler Toolchain | Windows* OS: MSVS 2019 installed with Windows* SDK and CMake*; Other platforms: C++11 compiler, a C99 compiler (ex: gcc/c++/clang), and CMake* +| Libraries | Install Intel oneAPI Rendering Toolkit including OSPRay, Embree, Open Volume Kernel Library, Intel Open Image Denoise +| Image Display Tool | A .ppm filetype viewer. Ex: [ImageMagick](https://www.imagemagick.org) +| Image Conversion Tool | A converter for .ppm, .pfm, and endian conversions. Ex: [ImageMagick](https://www.imagemagick.org) -## License +| Optimized Requirements | Description +| :--- | :--- +| Hardware | Intel 64 Skylake or newer with AVX512 extentions, ARM64 with NEON extensions -TBD +| Objective | Description +|:--- |:--- +| What you will learn | How to build and run a basic rendering program using the Open Image Denoise API from the Render Kit. +| Time to complete | 5 minutes -Code samples are licensed under the MIT license. See -[License.txt](https://github.com/oneapi-src/oneAPI-samples/blob/master/License.txt) for details. -Third party program Licenses can be found here: [third-party-programs.txt](https://github.com/oneapi-src/oneAPI-samples/blob/master/third-party-programs.txt) +## Purpose + +This getting started sample program, `oidnDenoise`, denoises a raytraced image. The output is written to disk as a .pfm image file. + -## Requirements +## Key Implementation Details -To build and run the samples you will need a compiler toolchain and imaging tools: +- The program input is a noisy image. In this example, the `accumulatedFrameCpp` image is used for input. Recall, this image was originally generated from the Intel OSPRay getting started sample, `ospTutorial`. +- The program writes a denoised .pfm image file to disk. +Of course, oidnDenoise can denoise other, user-provided noisy input images. Along with the input image, the program can take in albedo and normal buffers corresponding to the same pixels of the input image. Inclusion of such auxialiary feature images can significantly improve denoising quality. See +- The Intel OSPRay Studio showcase application demonstrates in-source denoising with the Intel OSPRay library. The noisy image buffer and auxiliary buffers are readily emitted from the OSPRay API. All buffers are fed through the denoiser for a higher quality interactive experience. -Compiler: -- MSVS 2019 on Windows* OS -- On other platforms a C++11 compiler and a C99 compiler. (Ex: gcc/g++/clang) +## License -oneAPI Libraries: -Install the Intel oneAPI Rendering Toolkit -- OSPRay -- Embree -- Open VKL -- Open Image Denoise +This code sample is licensed under the Apache 2.0 license. See +[LICENSE.txt](LICENSE.txt) for details. -Imaging Tools: -- An image **display program** for .ppm and .pfm filetypes . Ex: [ImageMagick](https://www.imagemagick.org/) -- An image **converter** for .ppm filetypes, .pfm filetypes, and endian conversions. Ex: [ImageMagick](https://www.imagemagick.org/) +Third party program Licenses can be found here: [third-party-programs.txt](https://github.com/oneapi-src/oneAPI-samples/blob/master/third-party-programs.txt) ## Build and Run -First, build and run the sample Intel OSPray getting started sample, ospTutorial, from the 01_ospray_gsg folder to generate input. +First, build and run the sample Intel OSPRay getting started sample, `ospTutorial`, to generate input. Find it in the [01_ospray_gsg](../01_ospray_gsg) folder of this samples repository. ### Windows OS: @@ -56,7 +63,7 @@ cd Release Convert the accumulatedFrameCpp.ppm image to LSB data ordering and .pfm format. Example conversion with ImageMagick convert: ``` -\magick convert ..\..\..\01_ospray_gsg\build\Release\accumulatedFrameCpp.ppm -endian LSB PFM:accumulatedFrameCpp.pfm +\magick.exe convert ..\..\..\01_ospray_gsg\build\Release\accumulatedFrameCpp.ppm -endian LSB PFM:accumulatedFrameCpp.pfm ``` Denoise the image: @@ -68,11 +75,9 @@ oidnDenoise.exe -hdr accumulatedFrameCpp.pfm -o denoised.pfm Review the output for visual comparison to the input. Example view with ImageMagick display: ``` -\imdisplay denoised.pfm +\imdisplay.exe denoised.pfm ``` - - ### Linux OS: Start a new Terminal session From 6a15448f0293f350c498032c401099ea75654b82 Mon Sep 17 00:00:00 2001 From: Michael R Carroll Date: Thu, 21 Oct 2021 15:16:57 -0700 Subject: [PATCH 20/36] clang-format for source Signed-off-by: Michael R Carroll --- .../04_oidn_gsg/src/apps/oidnDenoise.cpp | 230 ++++----- .../04_oidn_gsg/src/apps/utils/arg_parser.h | 103 ++-- .../04_oidn_gsg/src/apps/utils/image_io.cpp | 486 +++++++++--------- .../04_oidn_gsg/src/apps/utils/image_io.h | 75 ++- .../04_oidn_gsg/src/common/platform.cpp | 202 ++++---- .../04_oidn_gsg/src/common/platform.h | 215 ++++---- .../04_oidn_gsg/src/common/timer.h | 39 +- 7 files changed, 628 insertions(+), 722 deletions(-) diff --git a/RenderingToolkit/04_oidn_gsg/src/apps/oidnDenoise.cpp b/RenderingToolkit/04_oidn_gsg/src/apps/oidnDenoise.cpp index 2e74ebf3f9..66b0cabffa 100644 --- a/RenderingToolkit/04_oidn_gsg/src/apps/oidnDenoise.cpp +++ b/RenderingToolkit/04_oidn_gsg/src/apps/oidnDenoise.cpp @@ -1,12 +1,13 @@ // Copyright 2009-2021 Intel Corporation // SPDX-License-Identifier: Apache-2.0 -#include -#include +#include + #include -#include #include -#include +#include +#include +#include #ifdef VTUNE #include @@ -14,43 +15,45 @@ #include -#include "common/timer.h" -#include "apps/utils/image_io.h" #include "apps/utils/arg_parser.h" +#include "apps/utils/image_io.h" +#include "common/timer.h" OIDN_NAMESPACE_USING using namespace oidn; -void printUsage() -{ +void printUsage() { std::cout << "Intel(R) Open Image Denoise" << std::endl; std::cout << "usage: oidnDenoise [-f/--filter RT|RTLightmap]" << std::endl - << " [--hdr color.pfm] [--ldr color.pfm] [--srgb] [--dir directional.pfm]" << std::endl - << " [--alb albedo.pfm] [--nrm normal.pfm] [--clean_aux]" << std::endl + << " [--hdr color.pfm] [--ldr color.pfm] " + "[--srgb] [--dir directional.pfm]" + << std::endl + << " [--alb albedo.pfm] [--nrm normal.pfm] " + "[--clean_aux]" + << std::endl << " [--is/--input_scale value]" << std::endl - << " [-o/--output output.pfm] [-r/--ref reference_output.pfm]" << std::endl + << " [-o/--output output.pfm] [-r/--ref " + "reference_output.pfm]" + << std::endl << " [-w/--weights weights.tza]" << std::endl - << " [--threads n] [--affinity 0|1] [--maxmem MB] [--inplace]" << std::endl - << " [--bench ntimes] [-v/--verbose 0-3]" << std::endl + << " [--threads n] [--affinity 0|1] [--maxmem " + "MB] [--inplace]" + << std::endl + << " [--bench ntimes] [-v/--verbose 0-3]" + << std::endl << " [-h/--help]" << std::endl; } -void errorCallback(void* userPtr, Error error, const char* message) -{ +void errorCallback(void* userPtr, Error error, const char* message) { throw std::runtime_error(message); } volatile bool isCancelled = false; -void signalHandler(int signal) -{ - isCancelled = true; -} +void signalHandler(int signal) { isCancelled = true; } -bool progressCallback(void* userPtr, double n) -{ - if (isCancelled) - { +bool progressCallback(void* userPtr, double n) { + if (isCancelled) { std::cout << std::endl; return false; } @@ -58,23 +61,19 @@ bool progressCallback(void* userPtr, double n) return true; } -std::vector loadFile(const std::string& filename) -{ +std::vector loadFile(const std::string& filename) { std::ifstream file(filename, std::ios::binary); - if (file.fail()) - throw std::runtime_error("cannot open file: " + filename); + if (file.fail()) throw std::runtime_error("cannot open file: " + filename); file.seekg(0, file.end); const size_t size = file.tellg(); file.seekg(0, file.beg); std::vector buffer(size); file.read(buffer.data(), size); - if (file.fail()) - throw std::runtime_error("error reading from file"); + if (file.fail()) throw std::runtime_error("error reading from file"); return buffer; } -int main(int argc, char* argv[]) -{ +int main(int argc, char* argv[]) { std::string filterType = "RT"; std::string colorFilename, albedoFilename, normalFilename; std::string outputFilename, refFilename; @@ -92,38 +91,29 @@ int main(int argc, char* argv[]) int verbose = -1; // Parse the arguments - if (argc == 1) - { + if (argc == 1) { printUsage(); return 1; } - try - { + try { ArgParser args(argc, argv); - while (args.hasNext()) - { + while (args.hasNext()) { std::string opt = args.getNextOpt(); if (opt == "f" || opt == "filter") filterType = args.getNextValue(); - else if (opt == "hdr") - { + else if (opt == "hdr") { colorFilename = args.getNextValue(); hdr = true; - } - else if (opt == "ldr") - { + } else if (opt == "ldr") { colorFilename = args.getNextValue(); hdr = false; - } - else if (opt == "srgb") + } else if (opt == "srgb") srgb = true; - else if (opt == "dir") - { + else if (opt == "dir") { colorFilename = args.getNextValue(); directional = true; - } - else if (opt == "alb" || opt == "albedo") + } else if (opt == "alb" || opt == "albedo") albedoFilename = args.getNextValue(); else if (opt == "nrm" || opt == "normal") normalFilename = args.getNextValue(); @@ -131,7 +121,8 @@ int main(int argc, char* argv[]) outputFilename = args.getNextValue(); else if (opt == "r" || opt == "ref" || opt == "reference") refFilename = args.getNextValue(); - else if (opt == "is" || opt == "input_scale" || opt == "inputScale" || opt == "inputscale") + else if (opt == "is" || opt == "input_scale" || opt == "inputScale" || + opt == "inputscale") inputScale = args.getNextValueFloat(); else if (opt == "clean_aux" || opt == "cleanAux") cleanAux = true; @@ -149,33 +140,30 @@ int main(int argc, char* argv[]) inplace = true; else if (opt == "v" || opt == "verbose") verbose = args.getNextValueInt(); - else if (opt == "h" || opt == "help") - { + else if (opt == "h" || opt == "help") { printUsage(); return 1; - } - else + } else throw std::invalid_argument("invalid argument"); } if (!refFilename.empty() && numBenchmarkRuns > 0) - throw std::runtime_error("reference and benchmark modes cannot be enabled at the same time"); + throw std::runtime_error( + "reference and benchmark modes cannot be enabled at the same time"); - #if defined(OIDN_X64) +#if defined(OIDN_X64) // Set MXCSR flags - if (!refFilename.empty()) - { - // In reference mode we have to disable the FTZ and DAZ flags to get accurate results + if (!refFilename.empty()) { + // In reference mode we have to disable the FTZ and DAZ flags to get + // accurate results _MM_SET_FLUSH_ZERO_MODE(_MM_FLUSH_ZERO_OFF); _MM_SET_DENORMALS_ZERO_MODE(_MM_DENORMALS_ZERO_OFF); - } - else - { + } else { // Enable the FTZ and DAZ flags to maximize performance _MM_SET_FLUSH_ZERO_MODE(_MM_FLUSH_ZERO_ON); _MM_SET_DENORMALS_ZERO_MODE(_MM_DENORMALS_ZERO_ON); } - #endif +#endif // Load the input image std::shared_ptr input, ref; @@ -186,23 +174,20 @@ int main(int argc, char* argv[]) if (!albedoFilename.empty()) input = albedo = loadImage(albedoFilename, 3, false); - if (!normalFilename.empty()) - input = normal = loadImage(normalFilename, 3); + if (!normalFilename.empty()) input = normal = loadImage(normalFilename, 3); if (!colorFilename.empty()) input = color = loadImage(colorFilename, 3, srgb); - if (!input) - throw std::runtime_error("no input image specified"); + if (!input) throw std::runtime_error("no input image specified"); - if (!refFilename.empty()) - { + if (!refFilename.empty()) { ref = loadImage(refFilename, 3, srgb); if (ref->dims() != input->dims()) throw std::runtime_error("invalid reference output image"); } - const int width = input->width; + const int width = input->width; const int height = input->height; std::cout << "Resolution: " << width << "x" << height << std::endl; @@ -215,8 +200,7 @@ int main(int argc, char* argv[]) // Load the filter weights if specified std::vector weights; - if (!weightsFilename.empty()) - { + if (!weightsFilename.empty()) { std::cout << "Loading filter weights" << std::endl; weights = loadFile(weightsFilename); } @@ -232,12 +216,9 @@ int main(int argc, char* argv[]) throw std::runtime_error(errorMessage); device.setErrorFunction(errorCallback); - if (numThreads > 0) - device.set("numThreads", numThreads); - if (setAffinity >= 0) - device.set("setAffinity", bool(setAffinity)); - if (verbose >= 0) - device.set("verbose", verbose); + if (numThreads > 0) device.set("numThreads", numThreads); + if (setAffinity >= 0) device.set("setAffinity", bool(setAffinity)); + if (verbose >= 0) device.set("verbose", verbose); device.commit(); const double deviceInitTime = timer.query(); @@ -246,42 +227,36 @@ int main(int argc, char* argv[]) FilterRef filter = device.newFilter(filterType.c_str()); if (color) - filter.setImage("color", color->data(), Format::Float3, color->width, color->height); + filter.setImage("color", color->data(), Format::Float3, color->width, + color->height); if (albedo) - filter.setImage("albedo", albedo->data(), Format::Float3, albedo->width, albedo->height); + filter.setImage("albedo", albedo->data(), Format::Float3, albedo->width, + albedo->height); if (normal) - filter.setImage("normal", normal->data(), Format::Float3, normal->width, normal->height); + filter.setImage("normal", normal->data(), Format::Float3, normal->width, + normal->height); - filter.setImage("output", output->data(), Format::Float3, output->width, output->height); + filter.setImage("output", output->data(), Format::Float3, output->width, + output->height); - if (filterType == "RT") - { - if (hdr) - filter.set("hdr", true); - if (srgb) - filter.set("srgb", true); - } - else if (filterType == "RTLightmap") - { - if (directional) - filter.set("directional", true); + if (filterType == "RT") { + if (hdr) filter.set("hdr", true); + if (srgb) filter.set("srgb", true); + } else if (filterType == "RTLightmap") { + if (directional) filter.set("directional", true); } - if (std::isfinite(inputScale)) - filter.set("inputScale", inputScale); + if (std::isfinite(inputScale)) filter.set("inputScale", inputScale); - if (cleanAux) - filter.set("cleanAux", cleanAux); + if (cleanAux) filter.set("cleanAux", cleanAux); - if (maxMemoryMB >= 0) - filter.set("maxMemoryMB", maxMemoryMB); + if (maxMemoryMB >= 0) filter.set("maxMemoryMB", maxMemoryMB); if (!weights.empty()) filter.setData("weights", weights.data(), weights.size()); const bool showProgress = !ref && numBenchmarkRuns == 0 && verbose <= 2; - if (showProgress) - { + if (showProgress) { filter.setProgressMonitorFunction(progressCallback); signal(SIGINT, signalHandler); } @@ -295,39 +270,35 @@ int main(int argc, char* argv[]) const int versionPatch = device.get("versionPatch"); std::cout << " device=CPU" - << ", version=" << versionMajor << "." << versionMinor << "." << versionPatch - << ", msec=" << (1000. * deviceInitTime) << std::endl + << ", version=" << versionMajor << "." << versionMinor << "." + << versionPatch << ", msec=" << (1000. * deviceInitTime) + << std::endl << " filter=" << filterType << ", msec=" << (1000. * filterInitTime) << std::endl; // Denoise the image - if (!showProgress) - std::cout << "Denoising" << std::endl; + if (!showProgress) std::cout << "Denoising" << std::endl; timer.reset(); filter.execute(); const double denoiseTime = timer.query(); - if (showProgress) - std::cout << std::endl; + if (showProgress) std::cout << std::endl; if (verbose <= 2) std::cout << " msec=" << (1000. * denoiseTime) << std::endl; - if (showProgress) - { + if (showProgress) { filter.setProgressMonitorFunction(nullptr); signal(SIGINT, SIG_DFL); } - if (!outputFilename.empty()) - { + if (!outputFilename.empty()) { // Save output image std::cout << "Saving output" << std::endl; saveImage(outputFilename, *output, srgb); } - if (ref) - { + if (ref) { // Verify the output values std::cout << "Verifying output" << std::endl; @@ -335,43 +306,42 @@ int main(int argc, char* argv[]) float maxError; std::tie(numErrors, maxError) = compareImage(*output, *ref, 1e-4); - std::cout << " values=" << output->size() << ", errors=" << numErrors << ", maxerror=" << maxError << std::endl; + std::cout << " values=" << output->size() << ", errors=" << numErrors + << ", maxerror=" << maxError << std::endl; - if (numErrors > 0) - { + if (numErrors > 0) { // Save debug images std::cout << "Saving debug images" << std::endl; - saveImage("denoise_in.ppm", *input, srgb); + saveImage("denoise_in.ppm", *input, srgb); saveImage("denoise_out.ppm", *output, srgb); - saveImage("denoise_ref.ppm", *ref, srgb); + saveImage("denoise_ref.ppm", *ref, srgb); throw std::runtime_error("output does not match the reference"); } } - if (numBenchmarkRuns > 0) - { + if (numBenchmarkRuns > 0) { // Benchmark loop - #ifdef VTUNE +#ifdef VTUNE __itt_resume(); - #endif +#endif - std::cout << "Benchmarking: " << "ntimes=" << numBenchmarkRuns << std::endl; + std::cout << "Benchmarking: " + << "ntimes=" << numBenchmarkRuns << std::endl; timer.reset(); - for (int i = 0; i < numBenchmarkRuns; ++i) - filter.execute(); + for (int i = 0; i < numBenchmarkRuns; ++i) filter.execute(); const double totalTime = timer.query(); - std::cout << " sec=" << totalTime << ", msec/image=" << (1000.*totalTime / numBenchmarkRuns) << std::endl; + std::cout << " sec=" << totalTime + << ", msec/image=" << (1000. * totalTime / numBenchmarkRuns) + << std::endl; - #ifdef VTUNE +#ifdef VTUNE __itt_pause(); - #endif +#endif } - } - catch (std::exception& e) - { + } catch (std::exception& e) { std::cerr << "Error: " << e.what() << std::endl; return 1; } diff --git a/RenderingToolkit/04_oidn_gsg/src/apps/utils/arg_parser.h b/RenderingToolkit/04_oidn_gsg/src/apps/utils/arg_parser.h index f69d30e2da..5114856f91 100644 --- a/RenderingToolkit/04_oidn_gsg/src/apps/utils/arg_parser.h +++ b/RenderingToolkit/04_oidn_gsg/src/apps/utils/arg_parser.h @@ -9,61 +9,48 @@ namespace oidn { - // Command-line argument parser - class ArgParser - { - private: - int argc; - char** argv; - int pos; - - public: - ArgParser(int argc, char* argv[]) - : argc(argc), argv(argv), - pos(1) - {} - - bool hasNext() const - { - return pos < argc; - } - - std::string getNext() - { - if (pos < argc) - return argv[pos++]; - else - throw std::invalid_argument("argument expected"); - } - - std::string getNextOpt() - { - std::string str = getNext(); - if (str.empty() || str[0] != '-') - throw std::invalid_argument("option expected"); - return str.substr(str.find_first_not_of("-")); - } - - std::string getNextValue() - { - std::string str = getNext(); - if (!str.empty() && str[0] == '-') - throw std::invalid_argument("value expected"); - return str; - } - - int getNextValueInt() - { - std::string str = getNextValue(); - return atoi(str.c_str()); - } - - float getNextValueFloat() - { - std::string str = getNextValue(); - return atof(str.c_str()); - } - }; - -} // namespace oidn - +// Command-line argument parser +class ArgParser { + private: + int argc; + char** argv; + int pos; + + public: + ArgParser(int argc, char* argv[]) : argc(argc), argv(argv), pos(1) {} + + bool hasNext() const { return pos < argc; } + + std::string getNext() { + if (pos < argc) + return argv[pos++]; + else + throw std::invalid_argument("argument expected"); + } + + std::string getNextOpt() { + std::string str = getNext(); + if (str.empty() || str[0] != '-') + throw std::invalid_argument("option expected"); + return str.substr(str.find_first_not_of("-")); + } + + std::string getNextValue() { + std::string str = getNext(); + if (!str.empty() && str[0] == '-') + throw std::invalid_argument("value expected"); + return str; + } + + int getNextValueInt() { + std::string str = getNextValue(); + return atoi(str.c_str()); + } + + float getNextValueFloat() { + std::string str = getNextValue(); + return atof(str.c_str()); + } +}; + +} // namespace oidn diff --git a/RenderingToolkit/04_oidn_gsg/src/apps/utils/image_io.cpp b/RenderingToolkit/04_oidn_gsg/src/apps/utils/image_io.cpp index fe181521de..ef2216890a 100644 --- a/RenderingToolkit/04_oidn_gsg/src/apps/utils/image_io.cpp +++ b/RenderingToolkit/04_oidn_gsg/src/apps/utils/image_io.cpp @@ -1,309 +1,281 @@ // Copyright 2009-2021 Intel Corporation // SPDX-License-Identifier: Apache-2.0 -#include +#include "image_io.h" + #include +#include #include -#include "image_io.h" #if defined(OIDN_USE_OPENIMAGEIO) - #include +#include #endif namespace oidn { - namespace - { - inline float srgbForward(float y) - { - return (y <= 0.0031308f) ? (12.92f * y) : (1.055f * std::pow(y, 1.f/2.4f) - 0.055f); - } - - inline float srgbInverse(float x) - { - return (x <= 0.04045f) ? (x / 12.92f) : std::pow((x + 0.055f) / 1.055f, 2.4f); - } - - void srgbForward(ImageBuffer& image) - { - for (size_t i = 0; i < image.size(); ++i) - image[i] = srgbForward(image[i]); +namespace { +inline float srgbForward(float y) { + return (y <= 0.0031308f) ? (12.92f * y) + : (1.055f * std::pow(y, 1.f / 2.4f) - 0.055f); +} + +inline float srgbInverse(float x) { + return (x <= 0.04045f) ? (x / 12.92f) : std::pow((x + 0.055f) / 1.055f, 2.4f); +} + +void srgbForward(ImageBuffer& image) { + for (size_t i = 0; i < image.size(); ++i) image[i] = srgbForward(image[i]); +} + +void srgbInverse(ImageBuffer& image) { + for (size_t i = 0; i < image.size(); ++i) image[i] = srgbInverse(image[i]); +} + +std::string getExtension(const std::string& filename) { + const size_t pos = filename.find_last_of('.'); + if (pos == std::string::npos) + return ""; // no extension + else { + std::string ext = filename.substr(pos + 1); + for (auto& c : ext) c = tolower(c); + return ext; + } +} + +std::shared_ptr loadImagePFM(const std::string& filename, + int numChannels) { + // Open the file + std::ifstream file(filename, std::ios::binary); + if (file.fail()) + throw std::runtime_error("cannot open image file: " + filename); + + // Read the header + std::string id; + file >> id; + int C; + if (id == "PF") + C = 3; + else if (id == "Pf") + C = 1; + else + throw std::runtime_error("invalid PFM image"); + + if (numChannels == 0) + numChannels = C; + else if (C < numChannels) + throw std::runtime_error("not enough image channnels"); + + int H, W; + file >> W >> H; + + float scale; + file >> scale; + + file.get(); // skip newline + + if (file.fail()) throw std::runtime_error("invalid PFM image"); + + if (scale >= 0.f) + throw std::runtime_error("big-endian PFM images are not supported"); + scale = fabs(scale); + + // Read the pixels + auto image = std::make_shared(W, H, numChannels); + + for (int h = 0; h < H; ++h) { + for (int w = 0; w < W; ++w) { + for (int c = 0; c < C; ++c) { + float x; + file.read((char*)&x, sizeof(float)); + if (c < numChannels) + (*image)[(size_t(H - 1 - h) * W + w) * numChannels + c] = x * scale; + } } + } - void srgbInverse(ImageBuffer& image) - { - for (size_t i = 0; i < image.size(); ++i) - image[i] = srgbInverse(image[i]); - } + if (file.fail()) throw std::runtime_error("invalid PFM image"); - std::string getExtension(const std::string& filename) - { - const size_t pos = filename.find_last_of('.'); - if (pos == std::string::npos) - return ""; // no extension - else - { - std::string ext = filename.substr(pos + 1); - for (auto& c : ext) c = tolower(c); - return ext; - } - } + return image; +} - std::shared_ptr loadImagePFM(const std::string& filename, int numChannels) - { - // Open the file - std::ifstream file(filename, std::ios::binary); - if (file.fail()) - throw std::runtime_error("cannot open image file: " + filename); - - // Read the header - std::string id; - file >> id; - int C; - if (id == "PF") - C = 3; - else if (id == "Pf") - C = 1; - else - throw std::runtime_error("invalid PFM image"); - - if (numChannels == 0) - numChannels = C; - else if (C < numChannels) - throw std::runtime_error("not enough image channnels"); - - int H, W; - file >> W >> H; - - float scale; - file >> scale; - - file.get(); // skip newline - - if (file.fail()) - throw std::runtime_error("invalid PFM image"); - - if (scale >= 0.f) - throw std::runtime_error("big-endian PFM images are not supported"); - scale = fabs(scale); - - // Read the pixels - auto image = std::make_shared(W, H, numChannels); - - for (int h = 0; h < H; ++h) - { - for (int w = 0; w < W; ++w) - { - for (int c = 0; c < C; ++c) - { - float x; - file.read((char*)&x, sizeof(float)); - if (c < numChannels) - (*image)[(size_t(H-1-h)*W + w) * numChannels + c] = x * scale; - } - } - } +void saveImagePFM(const std::string& filename, const ImageBuffer& image) { + const int H = image.height; + const int W = image.width; + const int C = image.numChannels; - if (file.fail()) - throw std::runtime_error("invalid PFM image"); + // Open the file + std::ofstream file(filename, std::ios::binary); + if (file.fail()) + throw std::runtime_error("cannot open image file: " + filename); - return image; - } + // Write the header + file << "PF" << std::endl; + file << W << " " << H << std::endl; + file << "-1.0" << std::endl; - void saveImagePFM(const std::string& filename, const ImageBuffer& image) - { - const int H = image.height; - const int W = image.width; - const int C = image.numChannels; - - // Open the file - std::ofstream file(filename, std::ios::binary); - if (file.fail()) - throw std::runtime_error("cannot open image file: " + filename); - - // Write the header - file << "PF" << std::endl; - file << W << " " << H << std::endl; - file << "-1.0" << std::endl; - - // Write the pixels - for (int h = 0; h < H; ++h) - { - for (int w = 0; w < W; ++w) - { - for (int c = 0; c < 3; ++c) - { - const float x = image[(size_t(H-1-h)*W + w) * C + c]; - file.write((char*)&x, sizeof(float)); - } - } + // Write the pixels + for (int h = 0; h < H; ++h) { + for (int w = 0; w < W; ++w) { + for (int c = 0; c < 3; ++c) { + const float x = image[(size_t(H - 1 - h) * W + w) * C + c]; + file.write((char*)&x, sizeof(float)); } } - - void saveImagePPM(const std::string& filename, const ImageBuffer& image) - { - if (image.numChannels != 3) - throw std::invalid_argument("image must have 3 channels"); - const int H = image.height; - const int W = image.width; - const int C = image.numChannels; - - // Open the file - std::ofstream file(filename, std::ios::binary); - if (file.fail()) - throw std::runtime_error("cannot open image file: " + filename); - - // Write the header - file << "P6" << std::endl; - file << W << " " << H << std::endl; - file << "255" << std::endl; - - // Write the pixels - for (int i = 0; i < W*H; ++i) - { - for (int c = 0; c < 3; ++c) - { - const float x = image[i*C+c]; - const int ch = std::min(std::max(int(x * 255.f), 0), 255); - file.put(char(ch)); - } - } + } +} + +void saveImagePPM(const std::string& filename, const ImageBuffer& image) { + if (image.numChannels != 3) + throw std::invalid_argument("image must have 3 channels"); + const int H = image.height; + const int W = image.width; + const int C = image.numChannels; + + // Open the file + std::ofstream file(filename, std::ios::binary); + if (file.fail()) + throw std::runtime_error("cannot open image file: " + filename); + + // Write the header + file << "P6" << std::endl; + file << W << " " << H << std::endl; + file << "255" << std::endl; + + // Write the pixels + for (int i = 0; i < W * H; ++i) { + for (int c = 0; c < 3; ++c) { + const float x = image[i * C + c]; + const int ch = std::min(std::max(int(x * 255.f), 0), 255); + file.put(char(ch)); } } +} +} // namespace #ifdef OIDN_USE_OPENIMAGEIO - std::shared_ptr loadImageOIIO(const std::string& filename, int numChannels) - { - auto in = OIIO::ImageInput::open(filename); - if (!in) - throw std::runtime_error("cannot open image file: " + filename); - - const OIIO::ImageSpec& spec = in->spec(); - if (numChannels == 0) - numChannels = spec.nchannels; - else if (spec.nchannels < numChannels) - throw std::runtime_error("not enough image channels"); - auto image = std::make_shared(spec.width, spec.height, numChannels); - if (!in->read_image(0, 0, 0, numChannels, OIIO::TypeDesc::FLOAT, image->data())) - throw std::runtime_error("failed to read image data"); - in->close(); +std::shared_ptr loadImageOIIO(const std::string& filename, + int numChannels) { + auto in = OIIO::ImageInput::open(filename); + if (!in) throw std::runtime_error("cannot open image file: " + filename); + + const OIIO::ImageSpec& spec = in->spec(); + if (numChannels == 0) + numChannels = spec.nchannels; + else if (spec.nchannels < numChannels) + throw std::runtime_error("not enough image channels"); + auto image = + std::make_shared(spec.width, spec.height, numChannels); + if (!in->read_image(0, 0, 0, numChannels, OIIO::TypeDesc::FLOAT, + image->data())) + throw std::runtime_error("failed to read image data"); + in->close(); #if OIIO_VERSION < 10903 - OIIO::ImageInput::destroy(in); + OIIO::ImageInput::destroy(in); #endif - return image; - } + return image; +} - void saveImageOIIO(const std::string& filename, const ImageBuffer& image) - { - auto out = OIIO::ImageOutput::create(filename); - if (!out) - throw std::runtime_error("cannot save unsupported image file format: " + filename); +void saveImageOIIO(const std::string& filename, const ImageBuffer& image) { + auto out = OIIO::ImageOutput::create(filename); + if (!out) + throw std::runtime_error("cannot save unsupported image file format: " + + filename); - OIIO::ImageSpec spec(image.width, - image.height, - image.numChannels, - OIIO::TypeDesc::FLOAT); + OIIO::ImageSpec spec(image.width, image.height, image.numChannels, + OIIO::TypeDesc::FLOAT); - if (!out->open(filename, spec)) - throw std::runtime_error("cannot create image file: " + filename); - if (!out->write_image(OIIO::TypeDesc::FLOAT, image.data())) - throw std::runtime_error("failed to write image data"); - out->close(); + if (!out->open(filename, spec)) + throw std::runtime_error("cannot create image file: " + filename); + if (!out->write_image(OIIO::TypeDesc::FLOAT, image.data())) + throw std::runtime_error("failed to write image data"); + out->close(); #if OIIO_VERSION < 10903 - OIIO::ImageOutput::destroy(out); + OIIO::ImageOutput::destroy(out); #endif - } +} #endif - std::shared_ptr loadImage(const std::string& filename, int numChannels) - { - const std::string ext = getExtension(filename); - std::shared_ptr image; +std::shared_ptr loadImage(const std::string& filename, + int numChannels) { + const std::string ext = getExtension(filename); + std::shared_ptr image; - if (ext == "pfm") - image = loadImagePFM(filename, numChannels); - else + if (ext == "pfm") + image = loadImagePFM(filename, numChannels); + else #if OIDN_USE_OPENIMAGEIO - image = loadImageOIIO(filename, numChannels); + image = loadImageOIIO(filename, numChannels); #else - throw std::runtime_error("cannot load unsupported image file format: " + filename); + throw std::runtime_error("cannot load unsupported image file format: " + + filename); #endif - return image; - } + return image; +} - void saveImage(const std::string& filename, const ImageBuffer& image) - { - const std::string ext = getExtension(filename); - if (ext == "pfm") - saveImagePFM(filename, image); - else if (ext == "ppm") - saveImagePPM(filename, image); - else +void saveImage(const std::string& filename, const ImageBuffer& image) { + const std::string ext = getExtension(filename); + if (ext == "pfm") + saveImagePFM(filename, image); + else if (ext == "ppm") + saveImagePPM(filename, image); + else #if OIDN_USE_OPENIMAGEIO - saveImageOIIO(filename, image); + saveImageOIIO(filename, image); #else - throw std::runtime_error("cannot write unsupported image file format: " + filename); + throw std::runtime_error("cannot write unsupported image file format: " + + filename); #endif +} + +bool isSrgbImage(const std::string& filename) { + const std::string ext = getExtension(filename); + return ext != "pfm" && ext != "exr" && ext != "hdr"; +} + +std::shared_ptr loadImage(const std::string& filename, + int numChannels, bool srgb) { + auto image = loadImage(filename, numChannels); + if (!srgb && isSrgbImage(filename)) srgbInverse(*image); + return image; +} + +void saveImage(const std::string& filename, const ImageBuffer& image, + bool srgb) { + if (!srgb && isSrgbImage(filename)) { + ImageBuffer newImage = image; + srgbForward(newImage); + saveImage(filename, newImage); + } else { + saveImage(filename, image); } +} - bool isSrgbImage(const std::string& filename) - { - const std::string ext = getExtension(filename); - return ext != "pfm" && ext != "exr" && ext != "hdr"; - } +std::tuple compareImage(const ImageBuffer& image, + const ImageBuffer& ref, + float threshold) { + assert(ref.dims() == image.dims()); - std::shared_ptr loadImage(const std::string& filename, int numChannels, bool srgb) - { - auto image = loadImage(filename, numChannels); - if (!srgb && isSrgbImage(filename)) - srgbInverse(*image); - return image; - } + size_t numErrors = 0; + float maxError = 0; - void saveImage(const std::string& filename, const ImageBuffer& image, bool srgb) - { - if (!srgb && isSrgbImage(filename)) - { - ImageBuffer newImage = image; - srgbForward(newImage); - saveImage(filename, newImage); - } - else - { - saveImage(filename, image); - } - } + for (size_t i = 0; i < image.size(); ++i) { + const float actual = image[i]; + const float expect = ref[i]; - std::tuple compareImage(const ImageBuffer& image, - const ImageBuffer& ref, - float threshold) - { - assert(ref.dims() == image.dims()); - - size_t numErrors = 0; - float maxError = 0; - - for (size_t i = 0; i < image.size(); ++i) - { - const float actual = image[i]; - const float expect = ref[i]; - - float error = std::abs(expect - actual); - if (expect != 0) - error = std::min(error, error / expect); - - maxError = std::max(maxError, error); - if (error > threshold) - { - //std::cerr << "i=" << i << " expect=" << expect << " actual=" << actual; - ++numErrors; - } - } + float error = std::abs(expect - actual); + if (expect != 0) error = std::min(error, error / expect); - return std::make_tuple(numErrors, maxError); + maxError = std::max(maxError, error); + if (error > threshold) { + // std::cerr << "i=" << i << " expect=" << expect << " actual=" << actual; + ++numErrors; + } } -} // namespace oidn + return std::make_tuple(numErrors, maxError); +} + +} // namespace oidn diff --git a/RenderingToolkit/04_oidn_gsg/src/apps/utils/image_io.h b/RenderingToolkit/04_oidn_gsg/src/apps/utils/image_io.h index f966ac55d4..894de39e9c 100644 --- a/RenderingToolkit/04_oidn_gsg/src/apps/utils/image_io.h +++ b/RenderingToolkit/04_oidn_gsg/src/apps/utils/image_io.h @@ -3,64 +3,59 @@ #pragma once +#include #include #include -#include -#include #include +#include namespace oidn { - struct ImageBuffer - { - std::vector buffer; - int width; - int height; - int numChannels; +struct ImageBuffer { + std::vector buffer; + int width; + int height; + int numChannels; - ImageBuffer() - : width(0), - height(0), - numChannels(0) {} + ImageBuffer() : width(0), height(0), numChannels(0) {} - ImageBuffer(int width, int height, int numChannels) + ImageBuffer(int width, int height, int numChannels) : buffer(size_t(width) * height * numChannels), width(width), height(height), numChannels(numChannels) {} - operator bool() const - { - return data() != nullptr; - } + operator bool() const { return data() != nullptr; } + + const float& operator[](size_t i) const { return buffer[i]; } + float& operator[](size_t i) { return buffer[i]; } - const float& operator [](size_t i) const { return buffer[i]; } - float& operator [](size_t i) { return buffer[i]; } + const float* data() const { return buffer.data(); } + float* data() { return buffer.data(); } - const float* data() const { return buffer.data(); } - float* data() { return buffer.data(); } - - size_t size() const { return buffer.size(); } - std::array dims() const { return {width, height, numChannels}; } - }; + size_t size() const { return buffer.size(); } + std::array dims() const { return {width, height, numChannels}; } +}; - // Loads an image with an optionally specified number of channels (loads all - // channels by default) - std::shared_ptr loadImage(const std::string& filename, int numChannels = 0); +// Loads an image with an optionally specified number of channels (loads all +// channels by default) +std::shared_ptr loadImage(const std::string& filename, + int numChannels = 0); - // Loads an image with/without sRGB to linear conversion - std::shared_ptr loadImage(const std::string& filename, int numChannels, bool srgb); +// Loads an image with/without sRGB to linear conversion +std::shared_ptr loadImage(const std::string& filename, + int numChannels, bool srgb); - // Saves an image - void saveImage(const std::string& filename, const ImageBuffer& image); +// Saves an image +void saveImage(const std::string& filename, const ImageBuffer& image); - // Saves an image with/without linear to sRGB conversion - void saveImage(const std::string& filename, const ImageBuffer& image, bool srgb); +// Saves an image with/without linear to sRGB conversion +void saveImage(const std::string& filename, const ImageBuffer& image, + bool srgb); - // Compares an image to a reference image and returns the number of errors - // and the maximum error value - std::tuple compareImage(const ImageBuffer& image, - const ImageBuffer& ref, - float threshold); +// Compares an image to a reference image and returns the number of errors +// and the maximum error value +std::tuple compareImage(const ImageBuffer& image, + const ImageBuffer& ref, float threshold); -} // namespace oidn +} // namespace oidn diff --git a/RenderingToolkit/04_oidn_gsg/src/common/platform.cpp b/RenderingToolkit/04_oidn_gsg/src/common/platform.cpp index d909a5acfa..f027da8ac3 100644 --- a/RenderingToolkit/04_oidn_gsg/src/common/platform.cpp +++ b/RenderingToolkit/04_oidn_gsg/src/common/platform.cpp @@ -5,107 +5,101 @@ namespace oidn { - // --------------------------------------------------------------------------- - // Common functions - // --------------------------------------------------------------------------- - - void* alignedMalloc(size_t size, size_t alignment) - { - if (size == 0) - return nullptr; - - assert((alignment & (alignment-1)) == 0); - #if defined(OIDN_X64) - void* ptr = _mm_malloc(size, alignment); - #else - void* ptr; - if (posix_memalign(&ptr, max(alignment, sizeof(void*)), size) != 0) - ptr = nullptr; - #endif - - if (ptr == nullptr) - throw std::bad_alloc(); - - return ptr; - } - - void alignedFree(void* ptr) - { - if (ptr) - #if defined(OIDN_X64) - _mm_free(ptr); - #else - free(ptr); - #endif - } - - // --------------------------------------------------------------------------- - // System information - // --------------------------------------------------------------------------- - - std::string getPlatformName() - { - std::string name; - - #if defined(__linux__) - name = "Linux"; - #elif defined(__FreeBSD__) - name = "FreeBSD"; - #elif defined(__CYGWIN__) - name = "Cygwin"; - #elif defined(_WIN32) - name = "Windows"; - #elif defined(__APPLE__) - name = "macOS"; - #elif defined(__unix__) - name = "Unix"; - #else - return "Unknown"; - #endif - - #if defined(__x86_64__) || defined(_M_X64) || defined(__ia64__) || defined(__aarch64__) - name += " (64-bit)"; - #else - name += " (32-bit)"; - #endif - - return name; - } - - std::string getCompilerName() - { - #if defined(__INTEL_COMPILER) - int major = __INTEL_COMPILER / 100 % 100; - int minor = __INTEL_COMPILER % 100 / 10; - std::string version = "Intel Compiler "; - version += toString(major); - version += "." + toString(minor); - #if defined(__INTEL_COMPILER_UPDATE) - version += "." + toString(__INTEL_COMPILER_UPDATE); - #endif - return version; - #elif defined(__clang__) - return "Clang " __clang_version__; - #elif defined(__GNUC__) - return "GCC " __VERSION__; - #elif defined(_MSC_VER) - std::string version = toString(_MSC_FULL_VER); - version.insert(4, "."); - version.insert(9, "."); - version.insert(2, "."); - return "Visual C++ Compiler " + version; - #else - return "Unknown"; - #endif - } - - std::string getBuildName() - { - #if defined(NDEBUG) - return "Release"; - #else - return "Debug"; - #endif - } - -} // namespace oidn +// --------------------------------------------------------------------------- +// Common functions +// --------------------------------------------------------------------------- + +void* alignedMalloc(size_t size, size_t alignment) { + if (size == 0) return nullptr; + + assert((alignment & (alignment - 1)) == 0); +#if defined(OIDN_X64) + void* ptr = _mm_malloc(size, alignment); +#else + void* ptr; + if (posix_memalign(&ptr, max(alignment, sizeof(void*)), size) != 0) + ptr = nullptr; +#endif + + if (ptr == nullptr) throw std::bad_alloc(); + + return ptr; +} + +void alignedFree(void* ptr) { + if (ptr) +#if defined(OIDN_X64) + _mm_free(ptr); +#else + free(ptr); +#endif +} + +// --------------------------------------------------------------------------- +// System information +// --------------------------------------------------------------------------- + +std::string getPlatformName() { + std::string name; + +#if defined(__linux__) + name = "Linux"; +#elif defined(__FreeBSD__) + name = "FreeBSD"; +#elif defined(__CYGWIN__) + name = "Cygwin"; +#elif defined(_WIN32) + name = "Windows"; +#elif defined(__APPLE__) + name = "macOS"; +#elif defined(__unix__) + name = "Unix"; +#else + return "Unknown"; +#endif + +#if defined(__x86_64__) || defined(_M_X64) || defined(__ia64__) || \ + defined(__aarch64__) + name += " (64-bit)"; +#else + name += " (32-bit)"; +#endif + + return name; +} + +std::string getCompilerName() { +#if defined(__INTEL_COMPILER) + int major = __INTEL_COMPILER / 100 % 100; + int minor = __INTEL_COMPILER % 100 / 10; + std::string version = "Intel Compiler "; + version += toString(major); + version += "." + toString(minor); +#if defined(__INTEL_COMPILER_UPDATE) + version += "." + toString(__INTEL_COMPILER_UPDATE); +#endif + return version; +#elif defined(__clang__) + return "Clang " __clang_version__; +#elif defined(__GNUC__) + return "GCC " __VERSION__; +#elif defined(_MSC_VER) + std::string version = toString(_MSC_FULL_VER); + version.insert(4, "."); + version.insert(9, "."); + version.insert(2, "."); + return "Visual C++ Compiler " + version; +#else + return "Unknown"; +#endif +} + +std::string getBuildName() { +#if defined(NDEBUG) + return "Release"; +#else + return "Debug"; +#endif +} + +} // namespace oidn diff --git a/RenderingToolkit/04_oidn_gsg/src/common/platform.h b/RenderingToolkit/04_oidn_gsg/src/common/platform.h index b750f7762c..6d959c3540 100644 --- a/RenderingToolkit/04_oidn_gsg/src/common/platform.h +++ b/RenderingToolkit/04_oidn_gsg/src/common/platform.h @@ -8,31 +8,31 @@ // --------------------------------------------------------------------------- #if defined(__x86_64__) || defined(_M_X64) - #define OIDN_X64 +#define OIDN_X64 #elif defined(__aarch64__) - #define OIDN_ARM64 +#define OIDN_ARM64 #endif #if defined(_WIN32) - // Windows - #if !defined(__noinline) - #define __noinline __declspec(noinline) - #endif +// Windows +#if !defined(__noinline) +#define __noinline __declspec(noinline) +#endif #else - // Unix - #if !defined(__forceinline) - #define __forceinline inline __attribute__((always_inline)) - #endif - #if !defined(__noinline) - #define __noinline __attribute__((noinline)) - #endif +// Unix +#if !defined(__forceinline) +#define __forceinline inline __attribute__((always_inline)) +#endif +#if !defined(__noinline) +#define __noinline __attribute__((noinline)) +#endif #endif #ifndef UNUSED - #define UNUSED(x) ((void)x) +#define UNUSED(x) ((void)x) #endif #ifndef MAYBE_UNUSED - #define MAYBE_UNUSED(x) UNUSED(x) +#define MAYBE_UNUSED(x) UNUSED(x) #endif // --------------------------------------------------------------------------- @@ -40,137 +40,130 @@ // --------------------------------------------------------------------------- #if defined(_WIN32) - #if !defined(WIN32_LEAN_AND_MEAN) - #define WIN32_LEAN_AND_MEAN - #endif - #if !defined(NOMINMAX) - #define NOMINMAX - #endif - #include +#if !defined(WIN32_LEAN_AND_MEAN) +#define WIN32_LEAN_AND_MEAN +#endif +#if !defined(NOMINMAX) +#define NOMINMAX +#endif +#include #elif defined(__APPLE__) - #include +#include #endif #if defined(OIDN_X64) - #include - #include +#include +#include #endif -#include +#include +#include +#include +#include +#include #include +#include #include -#include #include +#include #include -#include -#include #include -#include -#include #include -#include -#include +#include + #include "include/OpenImageDenoise/oidn.hpp" namespace oidn { - // Introduce all names from the API namespace - OIDN_NAMESPACE_USING +// Introduce all names from the API namespace +OIDN_NAMESPACE_USING - // --------------------------------------------------------------------------- - // Error handling and debugging - // --------------------------------------------------------------------------- +// --------------------------------------------------------------------------- +// Error handling and debugging +// --------------------------------------------------------------------------- - struct Verbose - { - int verbose; +struct Verbose { + int verbose; - Verbose(int v = 0) : verbose(v) {} - __forceinline bool isVerbose(int v = 1) const { return v <= verbose; } - }; + Verbose(int v = 0) : verbose(v) {} + __forceinline bool isVerbose(int v = 1) const { return v <= verbose; } +}; - #define OIDN_WARNING(message) { if (isVerbose()) std::cerr << "Warning: " << message << std::endl; } - #define OIDN_FATAL(message) throw std::runtime_error(message); +#define OIDN_WARNING(message) \ + { \ + if (isVerbose()) std::cerr << "Warning: " << message << std::endl; \ + } +#define OIDN_FATAL(message) throw std::runtime_error(message); - // --------------------------------------------------------------------------- - // Common functions - // --------------------------------------------------------------------------- +// --------------------------------------------------------------------------- +// Common functions +// --------------------------------------------------------------------------- - using std::min; - using std::max; +using std::max; +using std::min; - template - __forceinline T clamp(const T& value, const T& minValue, const T& maxValue) - { - return min(max(value, minValue), maxValue); - } +template +__forceinline T clamp(const T& value, const T& minValue, const T& maxValue) { + return min(max(value, minValue), maxValue); +} - constexpr size_t memoryAlignment = 128; +constexpr size_t memoryAlignment = 128; - void* alignedMalloc(size_t size, size_t alignment = memoryAlignment); - void alignedFree(void* ptr); +void* alignedMalloc(size_t size, size_t alignment = memoryAlignment); +void alignedFree(void* ptr); - template - inline std::string toString(const T& a) - { - std::stringstream sm; - sm << a; - return sm.str(); - } +template +inline std::string toString(const T& a) { + std::stringstream sm; + sm << a; + return sm.str(); +} - template - inline T fromString(const std::string& str) - { - std::stringstream sm(str); - T a{}; - sm >> a; - return a; - } +template +inline T fromString(const std::string& str) { + std::stringstream sm(str); + T a{}; + sm >> a; + return a; +} - template<> - inline std::string fromString(const std::string& str) - { - return str; - } +template <> +inline std::string fromString(const std::string& str) { + return str; +} #if defined(__APPLE__) - template - inline bool getSysctl(const char* name, T& value) - { - int64_t result = 0; - size_t size = sizeof(result); +template +inline bool getSysctl(const char* name, T& value) { + int64_t result = 0; + size_t size = sizeof(result); - if (sysctlbyname(name, &result, &size, nullptr, 0) != 0) - return false; + if (sysctlbyname(name, &result, &size, nullptr, 0) != 0) return false; - value = T(result); - return true; - } + value = T(result); + return true; +} #endif - template - inline bool getEnvVar(const std::string& name, T& value) - { - auto* str = getenv(name.c_str()); - bool found = (str != nullptr); - if (found) - value = fromString(str); - return found; - } +template +inline bool getEnvVar(const std::string& name, T& value) { + auto* str = getenv(name.c_str()); + bool found = (str != nullptr); + if (found) value = fromString(str); + return found; +} - inline bool isEnvVar(const std::string& name) - { - auto* str = getenv(name.c_str()); - return (str != nullptr); - } - - // --------------------------------------------------------------------------- - // System information - // --------------------------------------------------------------------------- +inline bool isEnvVar(const std::string& name) { + auto* str = getenv(name.c_str()); + return (str != nullptr); +} - std::string getPlatformName(); - std::string getCompilerName(); - std::string getBuildName(); +// --------------------------------------------------------------------------- +// System information +// --------------------------------------------------------------------------- -} // namespace oidn +std::string getPlatformName(); +std::string getCompilerName(); +std::string getBuildName(); +} // namespace oidn diff --git a/RenderingToolkit/04_oidn_gsg/src/common/timer.h b/RenderingToolkit/04_oidn_gsg/src/common/timer.h index 8d64a69178..c3314b6cb0 100644 --- a/RenderingToolkit/04_oidn_gsg/src/common/timer.h +++ b/RenderingToolkit/04_oidn_gsg/src/common/timer.h @@ -3,34 +3,29 @@ #pragma once -#include "platform.h" #include +#include "platform.h" + namespace oidn { - class Timer - { - private: - using clock = std::chrono::high_resolution_clock; +class Timer { + private: + using clock = std::chrono::high_resolution_clock; - std::chrono::time_point start; + std::chrono::time_point start; - public: - Timer() - { - reset(); - } + public: + Timer() { reset(); } - void reset() - { - start = clock::now(); - } + void reset() { start = clock::now(); } - double query() const - { - auto end = clock::now(); - return std::chrono::duration_cast>(end - start).count(); - } - }; + double query() const { + auto end = clock::now(); + return std::chrono::duration_cast>(end - + start) + .count(); + } +}; -} // namespace oidn +} // namespace oidn From 2447c981d44f5f89e8ba92d4e36df5b3cbbe17a2 Mon Sep 17 00:00:00 2001 From: Michael R Carroll Date: Thu, 21 Oct 2021 15:17:53 -0700 Subject: [PATCH 21/36] README.md update Signed-off-by: Michael R Carroll --- RenderingToolkit/04_oidn_gsg/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/RenderingToolkit/04_oidn_gsg/README.md b/RenderingToolkit/04_oidn_gsg/README.md index 43f7464665..956191142a 100644 --- a/RenderingToolkit/04_oidn_gsg/README.md +++ b/RenderingToolkit/04_oidn_gsg/README.md @@ -31,7 +31,7 @@ This getting started sample program, `oidnDenoise`, denoises a raytraced image. - The program input is a noisy image. In this example, the `accumulatedFrameCpp` image is used for input. Recall, this image was originally generated from the Intel OSPRay getting started sample, `ospTutorial`. - The program writes a denoised .pfm image file to disk. -Of course, oidnDenoise can denoise other, user-provided noisy input images. Along with the input image, the program can take in albedo and normal buffers corresponding to the same pixels of the input image. Inclusion of such auxialiary feature images can significantly improve denoising quality. See +- Of course, oidnDenoise can denoise other, user-provided noisy input images. Along with the input image, the program can take in albedo and normal buffers corresponding to the same pixels of the input image. Inclusion of such auxialiary feature images can significantly improve denoising quality. See - The Intel OSPRay Studio showcase application demonstrates in-source denoising with the Intel OSPRay library. The noisy image buffer and auxiliary buffers are readily emitted from the OSPRay API. All buffers are fed through the denoiser for a higher quality interactive experience. ## License From f52b67dcd2782b2b32d88e0ed026ba33ba63aad4 Mon Sep 17 00:00:00 2001 From: Michael R Carroll Date: Thu, 21 Oct 2021 16:44:42 -0700 Subject: [PATCH 22/36] Triage samples.json for CI process. Hopefully this unblocks! Signed-off-by: Michael R Carroll --- RenderingToolkit/04_oidn_gsg/sample.json | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/RenderingToolkit/04_oidn_gsg/sample.json b/RenderingToolkit/04_oidn_gsg/sample.json index 4d139aa371..956f3bc886 100644 --- a/RenderingToolkit/04_oidn_gsg/sample.json +++ b/RenderingToolkit/04_oidn_gsg/sample.json @@ -16,10 +16,11 @@ "steps": [ "mkdir build", "cd build", - "cmake -DCMAKE_PREFIX_PATH=\"/opt/intel/oneAPI\" ..", + "cmake -DCMAKE_PREFIX_PATH=\"/opt/intel/oneapi\" ..", "cmake --build . ", "cd Release", - "./oidnDenoise" + "cp ../../accumulatedFrameCpp.pfm .", + "./oidnDenoise -hdr accumulatedFrame.pfm -o denoised.pfm" ] } ], @@ -33,7 +34,8 @@ "cmake -G\"Visual Studio 16 2019\" -A x64 -DCMAKE_PREFIX_PATH=\"C:/Program Files (x86)/Intel/oneAPI\" ..", "cmake --build . --config Release", "cd Release", - "oidnDenoise.exe" + "copy ..\..\accumulatedFrameCpp.pfm .", + ".\oidnDenoise.exe -hdr accumulatedFrame.pfm -o denoised.pfm" ] } @@ -45,10 +47,11 @@ "steps": [ "mkdir build", "cd build", - "cmake -DCMAKE_PREFIX_PATH=\"/opt/intel/oneAPI\" ..", + "cmake -DCMAKE_PREFIX_PATH=\"/opt/intel/oneapi\" ..", "cmake --build . ", "cd Release", - "./oidnDenoise" + "cp ../../accumulatedFrameCpp.pfm .", + "./oidnDenoise -hdr accumulatedFrame.pfm -o denoised.pfm" ] } ] From 1d706326ff5a2bc83530f5c5733cbe72f18a4ee5 Mon Sep 17 00:00:00 2001 From: Michael R Carroll Date: Thu, 21 Oct 2021 17:14:14 -0700 Subject: [PATCH 23/36] Escape the spaces for CI in sample.json Signed-off-by: Michael R Carroll --- RenderingToolkit/04_oidn_gsg/sample.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/RenderingToolkit/04_oidn_gsg/sample.json b/RenderingToolkit/04_oidn_gsg/sample.json index 956f3bc886..9c5c8dcf30 100644 --- a/RenderingToolkit/04_oidn_gsg/sample.json +++ b/RenderingToolkit/04_oidn_gsg/sample.json @@ -26,7 +26,7 @@ ], "windows":[ { - "env": ["call C:\\Program Files (x86)\\Intel\\oneAPI\\setvars.bat"], + "env": ["call C:\\Program\ Files\ (x86)\\Intel\\oneAPI\\setvars.bat"], "id": "Intel_OIDN_oidnDenoise_win", "steps":[ "mkdir build", From a6b6aeb64210f9785f4dc7c4411b0950208aee59 Mon Sep 17 00:00:00 2001 From: Michael R Carroll Date: Thu, 21 Oct 2021 17:21:32 -0700 Subject: [PATCH 24/36] Escape extra quotes for CI in sample.json Signed-off-by: Michael R Carroll --- RenderingToolkit/04_oidn_gsg/sample.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/RenderingToolkit/04_oidn_gsg/sample.json b/RenderingToolkit/04_oidn_gsg/sample.json index 9c5c8dcf30..58137ead30 100644 --- a/RenderingToolkit/04_oidn_gsg/sample.json +++ b/RenderingToolkit/04_oidn_gsg/sample.json @@ -26,7 +26,7 @@ ], "windows":[ { - "env": ["call C:\\Program\ Files\ (x86)\\Intel\\oneAPI\\setvars.bat"], + "env": ["call \"C:\\Program Files (x86)\\Intel\\oneAPI\\setvars.bat\""], "id": "Intel_OIDN_oidnDenoise_win", "steps":[ "mkdir build", From 06b7b5504ddac784cbea316c0e01c72f2de2cc5d Mon Sep 17 00:00:00 2001 From: Michael R Carroll Date: Thu, 21 Oct 2021 17:35:29 -0700 Subject: [PATCH 25/36] Should be no Release folder for sample.json on macos or lin. It has been removed Signed-off-by: Michael R Carroll --- RenderingToolkit/04_oidn_gsg/sample.json | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/RenderingToolkit/04_oidn_gsg/sample.json b/RenderingToolkit/04_oidn_gsg/sample.json index 58137ead30..2358660cce 100644 --- a/RenderingToolkit/04_oidn_gsg/sample.json +++ b/RenderingToolkit/04_oidn_gsg/sample.json @@ -18,8 +18,7 @@ "cd build", "cmake -DCMAKE_PREFIX_PATH=\"/opt/intel/oneapi\" ..", "cmake --build . ", - "cd Release", - "cp ../../accumulatedFrameCpp.pfm .", + "cp ../accumulatedFrameCpp.pfm .", "./oidnDenoise -hdr accumulatedFrame.pfm -o denoised.pfm" ] } @@ -49,8 +48,7 @@ "cd build", "cmake -DCMAKE_PREFIX_PATH=\"/opt/intel/oneapi\" ..", "cmake --build . ", - "cd Release", - "cp ../../accumulatedFrameCpp.pfm .", + "cp ../accumulatedFrameCpp.pfm .", "./oidnDenoise -hdr accumulatedFrame.pfm -o denoised.pfm" ] } From 186d13c91f775523a0af8992621e6757948d9461 Mon Sep 17 00:00:00 2001 From: Michael R Carroll Date: Thu, 21 Oct 2021 17:37:42 -0700 Subject: [PATCH 26/36] Escapes for sample.json input files and exe invoke Signed-off-by: Michael R Carroll --- RenderingToolkit/04_oidn_gsg/sample.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/RenderingToolkit/04_oidn_gsg/sample.json b/RenderingToolkit/04_oidn_gsg/sample.json index 2358660cce..f674b8b271 100644 --- a/RenderingToolkit/04_oidn_gsg/sample.json +++ b/RenderingToolkit/04_oidn_gsg/sample.json @@ -33,8 +33,8 @@ "cmake -G\"Visual Studio 16 2019\" -A x64 -DCMAKE_PREFIX_PATH=\"C:/Program Files (x86)/Intel/oneAPI\" ..", "cmake --build . --config Release", "cd Release", - "copy ..\..\accumulatedFrameCpp.pfm .", - ".\oidnDenoise.exe -hdr accumulatedFrame.pfm -o denoised.pfm" + "copy ..\\..\\accumulatedFrameCpp.pfm .", + ".\\oidnDenoise.exe -hdr accumulatedFrame.pfm -o denoised.pfm" ] } From 1ada59d61bd1e52e24dd30560cf39ee2ce93b774 Mon Sep 17 00:00:00 2001 From: Michael R Carroll Date: Tue, 26 Oct 2021 14:45:21 -0700 Subject: [PATCH 27/36] README.md updates for better pathing and simplified build Signed-off-by: Michael R Carroll --- RenderingToolkit/04_oidn_gsg/README.md | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/RenderingToolkit/04_oidn_gsg/README.md b/RenderingToolkit/04_oidn_gsg/README.md index 956191142a..5c7107185c 100644 --- a/RenderingToolkit/04_oidn_gsg/README.md +++ b/RenderingToolkit/04_oidn_gsg/README.md @@ -52,10 +52,10 @@ Run a new **x64 Native Tools Command Prompt for MSVS 2019** ``` call \setvars.bat -cd \RenderingToolkit\oidn_gsg +cd \RenderingToolkit\GettingStarted\04_oidn_gsg mkdir build cd build -cmake -G"Visual Studio 16 2019" -A x64 -DCMAKE_PREFIX_PATH="" .. +cmake .. cmake --build . --config Release cd Release ``` @@ -63,7 +63,7 @@ cd Release Convert the accumulatedFrameCpp.ppm image to LSB data ordering and .pfm format. Example conversion with ImageMagick convert: ``` -\magick.exe convert ..\..\..\01_ospray_gsg\build\Release\accumulatedFrameCpp.ppm -endian LSB PFM:accumulatedFrameCpp.pfm +\magick.exe convert \01_ospray_gsg\build\Release\accumulatedFrameCpp.ppm -endian LSB PFM:accumulatedFrameCpp.pfm ``` Denoise the image: @@ -83,16 +83,16 @@ Review the output for visual comparison to the input. Example view with ImageMag Start a new Terminal session ``` source /setvars.sh -cd /RenderingToolkit/oidn_gsg +cd /RenderingToolkit/GettingStarted/04_oidn_gsg mkdir build cd build -cmake -DCMAKE_PREFIX_PATH="" .. +cmake .. cmake --build . ``` Convert the accumulatedFrameCpp.ppm image to LSB data ordering and .pfm format. Example conversion with ImageMagick convert: ``` -/convert-im6 ../../../01_ospray_gsg/build/accumulatedFrameCpp.ppm -endian LSB PFM:accumulatedFrameCpp.pfm +/convert-im6 /01_ospray_gsg/build/accumulatedFrameCpp.ppm -endian LSB PFM:accumulatedFrameCpp.pfm ``` Denoise the image: @@ -115,16 +115,16 @@ Start a new Terminal session ``` source /setvars.sh -cd /RenderingToolkit/oidn_gsg +cd /RenderingToolkit/GettingStarted/04_oidn_gsg mkdir build cd build -cmake -DCMAKE_PREFIX_PATH="" .. +cmake .. cmake --build . ``` Convert the accumulatedFrameCpp.ppm image to LSB data ordering and .pfm format. Example conversion with ImageMagick convert: ``` -/magick convert ../../../01_ospray_gsg/build/accumulatedFrameCpp.ppm -endian LSB PFM:accumulatedFrameCpp.pfm +/magick convert /01_ospray_gsg/build/accumulatedFrameCpp.ppm -endian LSB PFM:accumulatedFrameCpp.pfm ``` Denoise the image: From 3bdf3cb48962dfbf7de7d047a884e2818f64015e Mon Sep 17 00:00:00 2001 From: Michael R Carroll Date: Tue, 26 Oct 2021 14:50:48 -0700 Subject: [PATCH 28/36] CMakeLists convenience updates Signed-off-by: Michael R Carroll --- RenderingToolkit/04_oidn_gsg/CMakeLists.txt | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/RenderingToolkit/04_oidn_gsg/CMakeLists.txt b/RenderingToolkit/04_oidn_gsg/CMakeLists.txt index 50ff52d1a6..b128f1ec3b 100644 --- a/RenderingToolkit/04_oidn_gsg/CMakeLists.txt +++ b/RenderingToolkit/04_oidn_gsg/CMakeLists.txt @@ -1,8 +1,5 @@ cmake_minimum_required(VERSION 3.16) -project(OIDN_GSG LANGUAGES C CXX) - -find_package(OpenImageDenoise REQUIRED) -find_package(TBB REQUIRED) +project(oidn_gsg LANGUAGES C CXX) set(ONEAPI_ROOT "") if($ENV{ONEAPI_ROOT}) @@ -18,6 +15,8 @@ set(OIDN_ROOT ${ONEAPI_ROOT}/oidn/latest) set(OIDN_INCLUDE_DIR ${OIDN_ROOT}/include) set(OIDN_LIB_DIR ${OIDN_ROOT}/lib) message(STATUS "ONEAPI_ROOT: ${ONEAPI_ROOT}") +find_package(OpenImageDenoise REQUIRED PATHS ${ONEAPI_ROOT}) +find_package(TBB REQUIRED PATHS ${ONEAPI_ROOT}) add_subdirectory(src/common) add_subdirectory(src/apps/utils) From 339b71f40d7d03833ed2390c9e0629ee64fade65 Mon Sep 17 00:00:00 2001 From: Michael R Carroll Date: Tue, 26 Oct 2021 14:51:38 -0700 Subject: [PATCH 29/36] Changing paths for better CI Signed-off-by: Michael R Carroll --- .../{ => GettingStarted}/04_oidn_gsg/CMakeLists.txt | 0 .../{ => GettingStarted}/04_oidn_gsg/LICENSE.txt | 0 .../{ => GettingStarted}/04_oidn_gsg/README.md | 0 .../04_oidn_gsg/accumulatedFrameCpp.pfm | Bin .../{ => GettingStarted}/04_oidn_gsg/sample.json | 0 .../04_oidn_gsg/src/apps/oidnDenoise.cpp | 0 .../04_oidn_gsg/src/apps/utils/CMakeLists.txt | 0 .../04_oidn_gsg/src/apps/utils/arg_parser.h | 0 .../04_oidn_gsg/src/apps/utils/image_io.cpp | 0 .../04_oidn_gsg/src/apps/utils/image_io.h | 0 .../04_oidn_gsg/src/common/CMakeLists.txt | 0 .../04_oidn_gsg/src/common/platform.cpp | 0 .../04_oidn_gsg/src/common/platform.h | 0 .../04_oidn_gsg/src/common/timer.h | 0 14 files changed, 0 insertions(+), 0 deletions(-) rename RenderingToolkit/{ => GettingStarted}/04_oidn_gsg/CMakeLists.txt (100%) rename RenderingToolkit/{ => GettingStarted}/04_oidn_gsg/LICENSE.txt (100%) rename RenderingToolkit/{ => GettingStarted}/04_oidn_gsg/README.md (100%) rename RenderingToolkit/{ => GettingStarted}/04_oidn_gsg/accumulatedFrameCpp.pfm (100%) rename RenderingToolkit/{ => GettingStarted}/04_oidn_gsg/sample.json (100%) rename RenderingToolkit/{ => GettingStarted}/04_oidn_gsg/src/apps/oidnDenoise.cpp (100%) rename RenderingToolkit/{ => GettingStarted}/04_oidn_gsg/src/apps/utils/CMakeLists.txt (100%) rename RenderingToolkit/{ => GettingStarted}/04_oidn_gsg/src/apps/utils/arg_parser.h (100%) rename RenderingToolkit/{ => GettingStarted}/04_oidn_gsg/src/apps/utils/image_io.cpp (100%) rename RenderingToolkit/{ => GettingStarted}/04_oidn_gsg/src/apps/utils/image_io.h (100%) rename RenderingToolkit/{ => GettingStarted}/04_oidn_gsg/src/common/CMakeLists.txt (100%) rename RenderingToolkit/{ => GettingStarted}/04_oidn_gsg/src/common/platform.cpp (100%) rename RenderingToolkit/{ => GettingStarted}/04_oidn_gsg/src/common/platform.h (100%) rename RenderingToolkit/{ => GettingStarted}/04_oidn_gsg/src/common/timer.h (100%) diff --git a/RenderingToolkit/04_oidn_gsg/CMakeLists.txt b/RenderingToolkit/GettingStarted/04_oidn_gsg/CMakeLists.txt similarity index 100% rename from RenderingToolkit/04_oidn_gsg/CMakeLists.txt rename to RenderingToolkit/GettingStarted/04_oidn_gsg/CMakeLists.txt diff --git a/RenderingToolkit/04_oidn_gsg/LICENSE.txt b/RenderingToolkit/GettingStarted/04_oidn_gsg/LICENSE.txt similarity index 100% rename from RenderingToolkit/04_oidn_gsg/LICENSE.txt rename to RenderingToolkit/GettingStarted/04_oidn_gsg/LICENSE.txt diff --git a/RenderingToolkit/04_oidn_gsg/README.md b/RenderingToolkit/GettingStarted/04_oidn_gsg/README.md similarity index 100% rename from RenderingToolkit/04_oidn_gsg/README.md rename to RenderingToolkit/GettingStarted/04_oidn_gsg/README.md diff --git a/RenderingToolkit/04_oidn_gsg/accumulatedFrameCpp.pfm b/RenderingToolkit/GettingStarted/04_oidn_gsg/accumulatedFrameCpp.pfm similarity index 100% rename from RenderingToolkit/04_oidn_gsg/accumulatedFrameCpp.pfm rename to RenderingToolkit/GettingStarted/04_oidn_gsg/accumulatedFrameCpp.pfm diff --git a/RenderingToolkit/04_oidn_gsg/sample.json b/RenderingToolkit/GettingStarted/04_oidn_gsg/sample.json similarity index 100% rename from RenderingToolkit/04_oidn_gsg/sample.json rename to RenderingToolkit/GettingStarted/04_oidn_gsg/sample.json diff --git a/RenderingToolkit/04_oidn_gsg/src/apps/oidnDenoise.cpp b/RenderingToolkit/GettingStarted/04_oidn_gsg/src/apps/oidnDenoise.cpp similarity index 100% rename from RenderingToolkit/04_oidn_gsg/src/apps/oidnDenoise.cpp rename to RenderingToolkit/GettingStarted/04_oidn_gsg/src/apps/oidnDenoise.cpp diff --git a/RenderingToolkit/04_oidn_gsg/src/apps/utils/CMakeLists.txt b/RenderingToolkit/GettingStarted/04_oidn_gsg/src/apps/utils/CMakeLists.txt similarity index 100% rename from RenderingToolkit/04_oidn_gsg/src/apps/utils/CMakeLists.txt rename to RenderingToolkit/GettingStarted/04_oidn_gsg/src/apps/utils/CMakeLists.txt diff --git a/RenderingToolkit/04_oidn_gsg/src/apps/utils/arg_parser.h b/RenderingToolkit/GettingStarted/04_oidn_gsg/src/apps/utils/arg_parser.h similarity index 100% rename from RenderingToolkit/04_oidn_gsg/src/apps/utils/arg_parser.h rename to RenderingToolkit/GettingStarted/04_oidn_gsg/src/apps/utils/arg_parser.h diff --git a/RenderingToolkit/04_oidn_gsg/src/apps/utils/image_io.cpp b/RenderingToolkit/GettingStarted/04_oidn_gsg/src/apps/utils/image_io.cpp similarity index 100% rename from RenderingToolkit/04_oidn_gsg/src/apps/utils/image_io.cpp rename to RenderingToolkit/GettingStarted/04_oidn_gsg/src/apps/utils/image_io.cpp diff --git a/RenderingToolkit/04_oidn_gsg/src/apps/utils/image_io.h b/RenderingToolkit/GettingStarted/04_oidn_gsg/src/apps/utils/image_io.h similarity index 100% rename from RenderingToolkit/04_oidn_gsg/src/apps/utils/image_io.h rename to RenderingToolkit/GettingStarted/04_oidn_gsg/src/apps/utils/image_io.h diff --git a/RenderingToolkit/04_oidn_gsg/src/common/CMakeLists.txt b/RenderingToolkit/GettingStarted/04_oidn_gsg/src/common/CMakeLists.txt similarity index 100% rename from RenderingToolkit/04_oidn_gsg/src/common/CMakeLists.txt rename to RenderingToolkit/GettingStarted/04_oidn_gsg/src/common/CMakeLists.txt diff --git a/RenderingToolkit/04_oidn_gsg/src/common/platform.cpp b/RenderingToolkit/GettingStarted/04_oidn_gsg/src/common/platform.cpp similarity index 100% rename from RenderingToolkit/04_oidn_gsg/src/common/platform.cpp rename to RenderingToolkit/GettingStarted/04_oidn_gsg/src/common/platform.cpp diff --git a/RenderingToolkit/04_oidn_gsg/src/common/platform.h b/RenderingToolkit/GettingStarted/04_oidn_gsg/src/common/platform.h similarity index 100% rename from RenderingToolkit/04_oidn_gsg/src/common/platform.h rename to RenderingToolkit/GettingStarted/04_oidn_gsg/src/common/platform.h diff --git a/RenderingToolkit/04_oidn_gsg/src/common/timer.h b/RenderingToolkit/GettingStarted/04_oidn_gsg/src/common/timer.h similarity index 100% rename from RenderingToolkit/04_oidn_gsg/src/common/timer.h rename to RenderingToolkit/GettingStarted/04_oidn_gsg/src/common/timer.h From 2c6f56895274f9e19582b526b3fdb40a7896261a Mon Sep 17 00:00:00 2001 From: Michael R Carroll Date: Tue, 26 Oct 2021 15:28:18 -0700 Subject: [PATCH 30/36] Nameing in CMakeLists for global variables build fix Signed-off-by: Michael R Carroll --- RenderingToolkit/GettingStarted/04_oidn_gsg/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/RenderingToolkit/GettingStarted/04_oidn_gsg/CMakeLists.txt b/RenderingToolkit/GettingStarted/04_oidn_gsg/CMakeLists.txt index b128f1ec3b..bb161ac1b2 100644 --- a/RenderingToolkit/GettingStarted/04_oidn_gsg/CMakeLists.txt +++ b/RenderingToolkit/GettingStarted/04_oidn_gsg/CMakeLists.txt @@ -1,5 +1,5 @@ cmake_minimum_required(VERSION 3.16) -project(oidn_gsg LANGUAGES C CXX) +project(OIDN_GSG LANGUAGES C CXX) set(ONEAPI_ROOT "") if($ENV{ONEAPI_ROOT}) From 4e069bae6797e07460378f40266c167b46cbf148 Mon Sep 17 00:00:00 2001 From: Michael R Carroll Date: Tue, 26 Oct 2021 16:30:18 -0700 Subject: [PATCH 31/36] Update sample.json to take our oneapi env... check paths to input images (OK) Signed-off-by: Michael R Carroll --- RenderingToolkit/GettingStarted/04_oidn_gsg/sample.json | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/RenderingToolkit/GettingStarted/04_oidn_gsg/sample.json b/RenderingToolkit/GettingStarted/04_oidn_gsg/sample.json index f674b8b271..d79d174e51 100644 --- a/RenderingToolkit/GettingStarted/04_oidn_gsg/sample.json +++ b/RenderingToolkit/GettingStarted/04_oidn_gsg/sample.json @@ -11,12 +11,11 @@ "ciTests": { "linux": [ { - "env": ["source /opt/intel/oneapi/setvars.sh --force"], "id": "Intel_OIDN_oidnDenoise_lin", "steps": [ "mkdir build", "cd build", - "cmake -DCMAKE_PREFIX_PATH=\"/opt/intel/oneapi\" ..", + "cmake ..", "cmake --build . ", "cp ../accumulatedFrameCpp.pfm .", "./oidnDenoise -hdr accumulatedFrame.pfm -o denoised.pfm" @@ -25,12 +24,11 @@ ], "windows":[ { - "env": ["call \"C:\\Program Files (x86)\\Intel\\oneAPI\\setvars.bat\""], "id": "Intel_OIDN_oidnDenoise_win", "steps":[ "mkdir build", "cd build", - "cmake -G\"Visual Studio 16 2019\" -A x64 -DCMAKE_PREFIX_PATH=\"C:/Program Files (x86)/Intel/oneAPI\" ..", + "cmake ..", "cmake --build . --config Release", "cd Release", "copy ..\\..\\accumulatedFrameCpp.pfm .", @@ -41,12 +39,11 @@ ], "darwin": [ { - "env": ["source /opt/intel/oneapi/setvars.sh --force"], "id": "Intel_OIDN_oidnDenoise_mac", "steps": [ "mkdir build", "cd build", - "cmake -DCMAKE_PREFIX_PATH=\"/opt/intel/oneapi\" ..", + "cmake ..", "cmake --build . ", "cp ../accumulatedFrameCpp.pfm .", "./oidnDenoise -hdr accumulatedFrame.pfm -o denoised.pfm" From c754c491c428f3065f5b39457d95f8b68c7aa437 Mon Sep 17 00:00:00 2001 From: Michael R Carroll Date: Tue, 26 Oct 2021 16:45:00 -0700 Subject: [PATCH 32/36] fix typo/text ommission in sample.json to unblock CI Signed-off-by: Michael R Carroll --- RenderingToolkit/GettingStarted/04_oidn_gsg/sample.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/RenderingToolkit/GettingStarted/04_oidn_gsg/sample.json b/RenderingToolkit/GettingStarted/04_oidn_gsg/sample.json index d79d174e51..01588fac93 100644 --- a/RenderingToolkit/GettingStarted/04_oidn_gsg/sample.json +++ b/RenderingToolkit/GettingStarted/04_oidn_gsg/sample.json @@ -18,7 +18,7 @@ "cmake ..", "cmake --build . ", "cp ../accumulatedFrameCpp.pfm .", - "./oidnDenoise -hdr accumulatedFrame.pfm -o denoised.pfm" + "./oidnDenoise -hdr accumulatedFrameCpp.pfm -o denoised.pfm" ] } ], @@ -32,7 +32,7 @@ "cmake --build . --config Release", "cd Release", "copy ..\\..\\accumulatedFrameCpp.pfm .", - ".\\oidnDenoise.exe -hdr accumulatedFrame.pfm -o denoised.pfm" + ".\\oidnDenoise.exe -hdr accumulatedFrameCpp.pfm -o denoised.pfm" ] } @@ -46,7 +46,7 @@ "cmake ..", "cmake --build . ", "cp ../accumulatedFrameCpp.pfm .", - "./oidnDenoise -hdr accumulatedFrame.pfm -o denoised.pfm" + "./oidnDenoise -hdr accumulatedFrameCpp.pfm -o denoised.pfm" ] } ] From 636c00ba63316e9c98a1b4e108dda0523932d93a Mon Sep 17 00:00:00 2001 From: Michael R Carroll <43764969+MichaelRoyceCarroll@users.noreply.github.com> Date: Wed, 27 Oct 2021 15:14:37 -0700 Subject: [PATCH 33/36] Update sample.json --- RenderingToolkit/GettingStarted/04_oidn_gsg/sample.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/RenderingToolkit/GettingStarted/04_oidn_gsg/sample.json b/RenderingToolkit/GettingStarted/04_oidn_gsg/sample.json index 01588fac93..631039c2fd 100644 --- a/RenderingToolkit/GettingStarted/04_oidn_gsg/sample.json +++ b/RenderingToolkit/GettingStarted/04_oidn_gsg/sample.json @@ -1,6 +1,6 @@ { "guid": "41F82C06-A9FA-4521-B87A-8F7304CB6631", - "name": "Intel Open Image Denoise Getting Started", + "name": "Intel Open Image Denoise Getting Started", "categories": ["Toolkit/oneAPI Libraries/Open Image Denoise"], "description": "This introductory 'hello rendering toolkit' sample program demonstrates how to denoise a raytraced image with Intel Open Image Denoise", "builder": ["cli"], From 896b376f23f5a879279d4ae8530ef336b1ed111f Mon Sep 17 00:00:00 2001 From: Michael R Carroll <43764969+MichaelRoyceCarroll@users.noreply.github.com> Date: Fri, 29 Oct 2021 11:02:30 -0700 Subject: [PATCH 34/36] sample.json to match for macos (env vars) --- RenderingToolkit/GettingStarted/04_oidn_gsg/sample.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/RenderingToolkit/GettingStarted/04_oidn_gsg/sample.json b/RenderingToolkit/GettingStarted/04_oidn_gsg/sample.json index 631039c2fd..99b03ec62a 100644 --- a/RenderingToolkit/GettingStarted/04_oidn_gsg/sample.json +++ b/RenderingToolkit/GettingStarted/04_oidn_gsg/sample.json @@ -46,7 +46,7 @@ "cmake ..", "cmake --build . ", "cp ../accumulatedFrameCpp.pfm .", - "./oidnDenoise -hdr accumulatedFrameCpp.pfm -o denoised.pfm" + "export DYLD_LIBRARY_PATH=${LIBRARY_PATH} && ./oidnDenoise -hdr accumulatedFrameCpp.pfm -o denoised.pfm" ] } ] From 9f483f6db0288f4b6b567606824856f8ca1d41a5 Mon Sep 17 00:00:00 2001 From: Michael R Carroll Date: Fri, 29 Oct 2021 16:56:10 -0700 Subject: [PATCH 35/36] Healthier CMakeLists for macos and c++11 on all platforms Signed-off-by: Michael R Carroll --- .../GettingStarted/04_oidn_gsg/CMakeLists.txt | 28 +++++++++++++------ 1 file changed, 19 insertions(+), 9 deletions(-) diff --git a/RenderingToolkit/GettingStarted/04_oidn_gsg/CMakeLists.txt b/RenderingToolkit/GettingStarted/04_oidn_gsg/CMakeLists.txt index bb161ac1b2..3ccc9186c9 100644 --- a/RenderingToolkit/GettingStarted/04_oidn_gsg/CMakeLists.txt +++ b/RenderingToolkit/GettingStarted/04_oidn_gsg/CMakeLists.txt @@ -2,22 +2,32 @@ cmake_minimum_required(VERSION 3.16) project(OIDN_GSG LANGUAGES C CXX) set(ONEAPI_ROOT "") -if($ENV{ONEAPI_ROOT}) - set(ONEAPI_ROOT $ENV{ONEAPI_ROOT}) +if(DEFINED ENV{ONEAPI_ROOT}) + set(ONEAPI_ROOT "$ENV{ONEAPI_ROOT}") + message(STATUS "ONEAPI_ROOT FROM ENVIRONMENT: ${ONEAPI_ROOT}") else() - if(WIN32) - set(ONEAPI_ROOT "C:/Program Files (x86)/Intel/oneAPI") - else() - set(ONEAPI_ROOT /opt/intel/oneapi) - endif() -endif($ENV{ONEAPI_ROOT}) + if(WIN32) + set(ONEAPI_ROOT "C:/Program Files (x86)/Intel/oneAPI") + else() + set(ONEAPI_ROOT /opt/intel/oneapi) + endif() + message(STATUS "ONEAPI_ROOT DEFAULT: ${ONEAPI_ROOT}") +endif(DEFINED ENV{ONEAPI_ROOT}) set(OIDN_ROOT ${ONEAPI_ROOT}/oidn/latest) set(OIDN_INCLUDE_DIR ${OIDN_ROOT}/include) set(OIDN_LIB_DIR ${OIDN_ROOT}/lib) -message(STATUS "ONEAPI_ROOT: ${ONEAPI_ROOT}") + find_package(OpenImageDenoise REQUIRED PATHS ${ONEAPI_ROOT}) find_package(TBB REQUIRED PATHS ${ONEAPI_ROOT}) +if(MSVC) + set(CMAKE_CXX_STANDARD 11) + set(CMAKE_CXX_STANDARD_REQUIRED ON) + set(CMAKE_CXX_EXTENSIONS OFF) +else() + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11") +endif(MSVC) + add_subdirectory(src/common) add_subdirectory(src/apps/utils) From 0b20e738a132db91d9d1b127886dad264587cfd2 Mon Sep 17 00:00:00 2001 From: Michael R Carroll <43764969+MichaelRoyceCarroll@users.noreply.github.com> Date: Mon, 1 Nov 2021 16:27:32 -0700 Subject: [PATCH 36/36] Update samples.json for better Macos env vars... (CI Only) --- RenderingToolkit/GettingStarted/04_oidn_gsg/sample.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/RenderingToolkit/GettingStarted/04_oidn_gsg/sample.json b/RenderingToolkit/GettingStarted/04_oidn_gsg/sample.json index 99b03ec62a..7add0c29d2 100644 --- a/RenderingToolkit/GettingStarted/04_oidn_gsg/sample.json +++ b/RenderingToolkit/GettingStarted/04_oidn_gsg/sample.json @@ -46,7 +46,7 @@ "cmake ..", "cmake --build . ", "cp ../accumulatedFrameCpp.pfm .", - "export DYLD_LIBRARY_PATH=${LIBRARY_PATH} && ./oidnDenoise -hdr accumulatedFrameCpp.pfm -o denoised.pfm" + "export DYLD_LIBRARY_PATH=${ONEAPI_ROOT}/openvkl/latest/lib:${ONEAPI_ROOT}/rkcommon/latest/lib:${ONEAPI_ROOT}/tbb/latest/lib:${ONEAPI_ROOT}/embree/latest/lib:${ONEAPI_ROOT}/oidn/latest/lib && ./oidnDenoise -hdr accumulatedFrameCpp.pfm -o denoised.pfm" ] } ]