Skip to content

6.0

Compare
Choose a tag to compare
@skallweitNV skallweitNV released this 03 Jul 09:02
· 12 commits to master since this release
3f30b44

Overview

This release of Falcor provides the following significant improvements and new features:

  • Initial work on making Falcor available as a Python module in an external Python environment.
  • Introduce a plugin system for handling render passes and scene importers.
  • Remove native D3D12 backend and switch to Slang/GFX exclusively for supporting both D3D12 and Vulkan.
  • Remove legacy raster code that was not maintained and far from state-of-the-art.
  • Replace glm with custom vector/matrix classes with more aligned sematics to Slang.
  • Introduce intrusive reference counted Object base class and replace Type::SharedPtr with ref<Type>.
  • Improved Linux support.
  • Introduce clang-format for automatic code formatting of both C/C++ and Slang source files.

Dependencies

  • Update slang to 2023.0.3.
  • Update nvapi to R520.
  • Update dlss to 3.1.0.
  • Update ImGUI to latest docking branch.
  • Update dxcompiler to 1.7.2207.
  • Update Agility SDK to 1.606.3.
  • Update assimp to 5.2.5.
  • Update python to 3.10.11.
  • Update USD to 22.11 and switch to no-python version.
  • Update fmt to 10.0.0.
  • Add nlohmann::json header-only library.
  • Add pybind11_json header-only library.
  • Switch from using RapidJSON to nlohmann::json.
  • Stop including dependencies from tiny-cuda-nn globally into Falcor.

Project Structure

  • Add new top-level scripts folder for render scripts.
  • Add new top-level data folder that contains all the data that was before spread within the Source folder.
  • Write plugin libraries (dlls) to a separate plugins folder, de-cluttering the main output folder.
  • Reorganize media package:
    • Generally go to snake_case filenames.
    • Move everything into two folders: test_scenes and test_images.
    • Remove some obsolete files.

Tooling

  • Add clang-format for automatic code formatting.
  • Add .clang-format-ignore file to black-, and white-list paths.
  • Enable clang-format on all of Source/Falcor/Core, Source/Falcor/RenderGraph, Source/Falcor/RenderPasses, Source/Tools, and Source/Samples.
  • Add tools/update_comment_style script to automatically convert old to new comment style.
  • Improve update_legal_headers.py to abort if git is unavailable and gracefully handle untracked files.
  • Extend generate_stubs.py with support for generating bindings for python submodules.
  • Add pymacro utility to expand PYMACRO macros in C++ code. This utility is used in VectorMath.h and the various VectorSwizzleX.inl.h files.

Coding Conventions

  • Change the function comment coding convention for new code to utilize the existing tool support in Visual Studio and Visual Studio Code.
  • Add coding rule that slang requires 1.f float literals.

Project Templates

  • Rename PassLibraryTemplate to RenderPassTemplate.
  • Rename ProjectTemplate to SampleAppTemplate.
  • Rename make_new_render_pass_library to make_new_render_pass.
  • Rename make_new_sample to make_new_sample_app.
  • Build templates by default to avoid bitrot.

Build System

  • Build with VS2022/14.4 toolchain by default
  • Remove FALCOR_RENDER_BACKEND cmake option.
  • Simplify build configurations because render backend configuration is gone now.
  • Remove d3d12 flag from VS setup scripts.
  • Fix missing includes.
  • Extend header validation with option to ignore individual files.
  • Add new cmake presets for building with additional settings for continuous integration.
  • Use FALCOR_SLANG_CONFIG cmake cache option to switch between release and debug version of slang.
  • Debug version of slang is only available if you build slang yourself and point packman to it, e.g., via dependencies.user.xml.
  • Link args library directly in executables that use it.
  • Make internal dependencies of Falcor private, add dependencies to render passes where required.
  • Split falcor_deps into multiple finer grained targets.
  • Silence finding git during configure time.
  • Introduce FALCOR_ENABLE_USD to enable/disable compilation of components requiring USD.
  • Use find_package to find a python distribution.
  • Compile Falcor python bindings as a separate module and place it in the python directory in the output directory.
  • Setup python search path to locate the falcor module when starting the embedded python interpreter.
  • Move some targets to Misc folder in VS.
  • Embed git version info in Falcor library.
  • Log version string on startup, (e.g. Falcor 5.2 (commit: ab4852274, branch: git-version)).
  • Copy scripts to binary output directory.
  • Use lower-case shaders folder in binary output directory.
  • Add FALCOR_REPORT_EXCEPTION_AS_ERROR cmake option to enable reporting exceptions as errors.
  • Generate plugins.json in output directory containing a list of all plugins.
  • Generate setpath.xxx scripts in output directory.
  • Generate python stub files for the falcor module.
  • Rename CMake preset linux-ninja-clang to linux-clang.
  • Add support for compiling with GCC (add linux-gcc CMake preset).
  • Compile with _GLIBCXX_USE_CXX11_ABI=0 for compatibility with USD libraries.
  • Increase MSVC warnings to /W4 and disable some specific warnings.
  • Generally enable "shadowing" warnings which avoids non-obvious bugs and paves the way to use text replacement for removing hungerian notation.
  • Add FALCOR_ENABLE_ASAN cmake option to enable address sanitizer.

Remove Legacy Code

  • Remove VariablesBufferUI.
  • Remove CUDAProgram.
  • Remove EnvMapLighting.
  • Remove Perception utils.
  • Remove ModelViewer sample.
  • Remove RTXGI module.
  • Remove CSM render pass.
  • Remove FXAA render passes.
  • Remove SSAO render pass.
  • Remove SkyBox render pass.
  • Remove ForwardLightingPass render pass.
  • Remove DepthPass render pass.
  • Remove TemporalDelayPass render pass.

Falcor Python Module

  • Falcor no longer requires exact 3.7 Python version.
  • Rename Falcor python extension module from falcor to falcor_ext and wrap it in a falcor package that sets up the DLL search directory.
  • Fix Python naming conventions in the bindings of the following classes: Texture, Testbed, RenderGraph, AABB, Rectangle, Profiler
    • Note: old bindings are still available but marked PYTHONDEPRECATED, with the exception of Profiler
  • Cleanup RenderGraph bindings and write render graphs with RenderPass.create_pass instead of free standing createPass followed by addPass.
  • Remove obsolete bindings for DeviceDesc, SampleAppDesc and WindowDesc.
  • Add initial bindings for Device, Resource, Texture, Buffer, CopyContext, ComputeContext, RenderContext
  • Add initial python test that just instantiates a Device.
  • Add new Testbed application class for running Falcor from Python interpreter.
  • Automatically release Falcor python module handle using python's atexit infrastructure.
  • Allow Testbed to run in headless mode (enabled by default).
  • Add a mechanism to detect if falcor Python module is loaded from the embedded interpreter or not.
  • Attempt to load Agility SDK when using falcor from the Python interpreter.
  • Add pybind11 backport of nanobind ndarray class supporting both python buffer protocol and dlpack for CPU/GPU tensor exchange.

Plugin System

  • Introduces a new more generic plugin system, replacing the RenderPassLibrary and allowing for new plugin types.
  • Add PluginManager for loading/unloading plugins, querying plugin information and creating plugin instances.
  • Add FALCOR_PLUGIN_BASE_CLASS macro for extending a base class to be used as a plugin interface.
  • Add FALCOR_PLUGIN_CLASS macro for extending a class to be used as a plugin class.
  • Rename getPasses in render pass libraries to registerPlugin and use new register mechanism.
  • Minor adjustments in render pass libraries to make compatible with new plugin system.
  • Rename cmake add_renderpass macro to add_plugin.
  • Always load all plugins at startup based on the plugins/plugins.json index file.

Cleanup Globals

  • Tag globals to be removed using // TODO: REMOVEGLOBAL.
  • Remove global gpDevice device pointer.
  • Remove Renderer and Framework interfaces.
  • Rename Sample to SampleApp and refactor to not rely on Renderer and Framework interfaces.
  • Rename SampleConfig to SampleAppConfig.
  • Remove global gpFramework pointer.
  • Remove gMainWindowHandle and setMainWindowHandle.
  • Convert TextRenderer from singleton to a normal class.
  • Cleanup TextRenderer and Font and enable clang-format.
  • Make QueryHeap and GpuMemoryHeap having non-owning reference to device.
  • Remove global in RenderContext.
  • Remove global createRenderGraph() and loadRenderGraph() in Falcor for Python. Use testbed.createRenderGraph() and testbed.loadRenderGraph() instead.
  • Remove global createPass() in Falcor for Python. Use RenderGraph.createPass() instead.
  • Keep device in a std::unique_ptr<Device> in SampleApp and Testbed to better indicated ownership.
  • Add SharedCache utility class for managing shared global data.
  • Use SharedCache in FullScreenPass.
  • Use SharedCache in to replace global SDF GPU data.
  • Make Device own the Profiler.
  • Also use non-owning pointer to device in CopyContext/ComputeContext/RenderContext as the life-time of these are tied to the device.
  • Manage multiple ImGui contexts.
  • Add support managing a list of images in the GUI context to get rid of globals.
  • Allow creating multiple Testbed instances.
  • Handle multiple GUI contexts.
  • Add image caching in GUI system to remove global clock image textures.

Cleanup

  • Prefer using static constexpr in class/struct scoped constants.
  • Rewrite T const& to const T& which is the prevalent convention in Falcor.

Intrusive reference counting

  • Add Object base class for reference counted objects.
  • Add ref<T> reference counting helper to reference objects derived from Object.
  • Add BreakableReference type, to allow a subset of API classes to break their strong reference to the Device. This allows to break cyclic references and allow proper shutdown of the Device class when all references go out of scope.
  • Replace SharedPtr with ref.
  • Use new reference counted objects for all graphics API classes.
  • Use FALCOR_OBJECT to add object class names across the code base.
  • Add support for object lifetime tracking and reference tracking.
  • Expose dumping of alive objects in Python using dump_alive_objects.

Custom Vector/Matrix classes

  • Remove glm.
  • Add custom vector/matrix/quaternion classes with similar semantics to HLSL/Slang:
    • +,-,*,/,== and != are all component-wise operations.
    • Use mul to multiply vector/matrix, matrix/matrix, quaternion/quaternion or quaternion/vector.
    • Free standing functions for intrinsics (dot, cross, min, max, clamp, inverse, transpose etc.)
  • Introduce ScalarTypes.h for scalar types and ScalarMath.h for math functions on scalars.
    • Add support for h half float literals.
  • Introduce VectorTypes.h for vector types and VectorMath.h for operators/functions.
    • Add vector<T, N> type and type aliases.
    • Replace glm::vec type with math::vector type.
    • Most notable difference is that all comparisons are component-wise and return a boolX.
      • x == float3(1.f, 2.f, 3.f) becomes all(x == float3(1.f, 2.f, 3.f)
      • x != float3(1.f, 2.f, 3.f) becomes any(x != float3(1.f, 2.f, 3.f)
    • Use vector<> for float16 vector types.
  • Introduce MatrixTypes.h for matrix types and MatrixMath.h for operators/functions.
    • Add matrix<T, R, C> type and type aliases.
    • Replace mat4 with float4x4 type.
  • Introduce QuaternionTypes.h for quaternion types and QuaternionMath.h for operators/functions.
    • Add quat<T> quaternion type.
  • Introduce matrix::identity(), matrix::zeros() and quat::identity() functions and use them where appropriate.
  • Add transformVector and transformPoint helper functions.
  • Replace glm:: constants with M_XXX constants.
  • Add unit tests.

Eums & Properties

  • Introduce Core/Enum.h for defining enum strings:
    • Add enumToString and stringToEnum functions to convert enums to/from strings.
    • Add FALCOR_ENUM_INFO to define enum strings.
    • Add FALCOR_ENUM_REGISTER to register enum strings for use with enumToString and stringToEnum.
  • Automatically handle enum strings in Dictionary to minimize code changes.
  • Add a new dropdown function to the Widgets class which automatically uses the registered strings in the GUI.
  • Replace enum python bindings for render passes with enum strings.
  • Add tools/fix_render_script.py helper script to automatically update existing scripts (replace EnumType.Value with 'Value').
  • Add Properties class for storing configuration properties.
  • Add PropertiesWriter and PropertiesReader classes for serializing structs.
  • Replace SerializableStruct with properties archives.
  • Update all render passes to use Properties.
  • Update all render scripts.
  • Add flagsToStringList and stringListToFlags helpers for converting enum flags to/from string lists.
  • Cleanup unknown property warnings.
  • Rename applySettings to setProperties.
  • Replace RenderPass get_properties Python binding with read-only properties attribute plus a set_properties method for modifying properties.
  • Make RenderPass::getProperties() const.

Graphics API

  • Report GFX/D3D12 live objects on shutdown in debug builds (helps debugging clean shutdown).
  • Cleanup resource format list to match what we have in gfx.
  • Add conversion to native Vulkan formats.
  • Move utilities for conversion to native formats to NativeFormats.h (reduce d3d12/vulkan header exposure).
  • Add NativeHandle used for passing native graphics API handles.
  • Add support for querying both D3D12 and Vulkan native handles.
  • Move D3D12 specific code into Shared directory (specifically ConstantBufferView).
  • Remove most obsolete handle definitions in D3D12Handles.h.
  • Simplify ResourceView base class.
  • Work towards not exposing d3d12.h and vulkan.h by default, only where it's actually used.
  • Enable shader cache by default.
  • Add Swapchain class.
  • Remove implicit swapchain and framebuffer handling from Device.
  • Add mechanism for passing a shader prelude to the downstream compiler.
  • Pass NVAPI search path to dxc.
  • Add ShaderExecutionReorderingAPI and RaytracingReordering feature flag.
  • Add support for creating device on specific graphics adapter.
  • Remove documentation of FALCOR_GPU_VENDOR_ID and FALCOR_GPU_DEVICE_ID which are no longer supported.
  • Remove FALCOR_D3D12 and FALCOR_GFX macros.
  • Remove most handle types and replace with gfx types directly.
  • Use gfx::BufferResource and gfx::ImageResource to reduce amount of casting.
  • Add device limits to remove D3D12 specific code.
  • Remove global blit context.
  • Merge all GFX sources in Source/Falcor/Core/API/GFX into the main source files in Source/Falcor/Core/API.
  • Remove D3D12 backend sources in Source/Falcor/Core/API/D3D12.
  • Replace [__unsafeForceInlineEarly] with new [ForceInline].
  • Fix GFXParameterBlock to own resources that are assigned with setBuffer.
  • Fix to_string for ShaderType.
  • Check for Device::SupportedFeatures::WaveOperations in GFXDevice.
  • Add additional FALCOR_GFX_CALL checks and improve logging of failures.
  • Replace static configuration of GFX device type with the option to set device type at runtime.
  • Add runtime checks for D3D12 (requireD3D12()) to throw an exception not having D3D12 available.
  • Throw when trying to create invalid entry points on an RtProgram.
  • Pass RenderContext to profile calls.
  • Add Device::enableAgilitySDK() to load Agility SDK at runtime.
  • Add getImage and getData functions to Texture Python API, allowing to get images as numpy arrays.
  • Fix depth clip flag in gfx rasterizer state.
  • Disable slang conversion warnings.
  • Fix hang with deferred loading of identical textures.
  • Remove unnecessary GPU flush in deferred texture loading.
  • Add support to load mip levels from individual files.
  • Remove the ParameterBlockSharedPtr shared pointer wrapper.
  • Programs kept version history based on DefinesList as the only key. Meaning that if the conformances changed, it would pick up the wrong version. It now uses both defines and type conformances.
  • Check all calls to GFX.
  • Log DXGI device removed/hung/reset errors.
  • Add initial NSight Aftermath support.
  • Add RGBA16Snorm, BGRA4Unorm and D32FloatS8Uint resource formats.
  • Add missing ITransientResourceHeap::finish() calls to fix crashing on releasing transient buffers that are still in use.
  • Rename Shader class to EntryPointKernel and move to Core/Program/ProgramVersion.h.
  • Move Shader::DefineList class to Core/Program/DefineList.h and into global namespace.
  • Replace Program::DefineList and Shader::DefineList with DefineList.
  • Move ShaderType enum to Core/API/ShaderType.h.
  • Move Shader::CompilerFlags enum into Program class.
  • Move Shader::TypeConformance and Shader::TypeConformanceList into Program class.
  • Remove Shader.h/Shader.cpp.
  • Rename shader define FALCOR_D3D to FALCOR_D3D12.
  • Rename shader define FALCOR_VK to FALCOR_VULKAN.

Core

  • Search paths in Settings are now always weakly cannonicalized.
  • Break into debugger if error message box is disabled.
  • Add setKeyboardInterruptHandler() in OS.h for setting up a callback for Ctrl-C.
  • Add operator< on floatX and intX types.
  • Remove postQuitMessage function.
  • Fix return code handling in SampleApp.
  • Extend SampleApp to allow for running without creating a window/swapchain (headless mode).
  • Do not create FBOs for swapchain images but copy final output to swapchain image instead.
  • Rename SampleApp::onResourceSwapChain() to SampleApp::onResize().
  • Add Window::setWindowIcon() function.
  • Disable show error message box by default.
  • Introduce settings.json, JSON config file that allows specifying global options by placing it in ~/.falcor/settings.json.
    • Supports ["standardsearchpath"] and ["searchpath"].
    • Within these, supports category = "path1;path2;&;@" or ``category = ["path1", "path2", "&", "@"]`
    • The & gets replaced by previous value of the searchpath (useful when setting these via setOptions in scripts) and @ by the same category from the standardsearchpath.
    • The resulting searchpaths are stores in SampleApp's settings and obtained via getSearchDirectories call.
    • The intent is that these are set when the scene is being loaded and left as such (e.g., scenes generally shouldn't set these, and we do not expect to unset these).
  • Switch to compile-time format strings.
  • Remove unused/unimplemented getCUDADeviceAddress().
  • Remove reportAssert in favor of using reportFatalError with optional showStackFrame argument.
  • Remove msgBoxTitle() and gMsgBoxTitle global and instead take a title argument in the msgBox() function.
  • Make various static pNull shared pointers const.
  • Flush output stream when logging to the console.
  • Print stack trace on asserts.
  • Append stack trace to exceptions.
  • Minor formatting changes to assert/check messages.
  • Extend ImGui key mapping to support all keys.
  • Show/focus window when created, not when msg loop is run.
  • Add FALCOR_CHECK_ARG family of macros for checking arguments, which assert when asserts are enabled and throw otherwise.
  • Add getRuntimeDirectory() which returns the runtime directory where Falcor.dll or libFalcor.so is located.
  • Replace calling getExecutableDirectory() with getRuntimeDirectory() in most places.
  • Make all functions returning paths thread-safe.
  • Include windef.h instead of windows.h in PlatformHandles.h to improve compilation time.
  • Stop using findFileInDataDirectories in places where it's not required and instead use the provided path as-is (relative to working directory, or absolute path).
  • Refactor ProgressBar to be an object (get rid of globals), it's now a member in SampleApp.
  • Reduce usage of stringstream and remove obsolete sstream includes.
  • Move ComputePass, RasterPass etc. from RenderGraph/BasePasses to Core/Pass.
  • Remove RasterScenePass (migrate HelloDXR to use RasterPass instead).
  • Add logWarningOnce and logErrorOnce to allow deduplicating error messages. Intended to prevent spamming the log when a Hydra mesh is broken in multiple ways.
  • Rename Dictionary to PythonDictionary, making it's dependency to Python more explicit.
  • Remove SerializableStruct python binding helper.
  • Add local bindings to SceneRenderSettings bindings (will become obsolete in the future anyway).
  • Add global settings accessible by Settings::getGlobalSettings().
  • Add Python bindings to Logger class and allow to set logfile path at runtime.

Scene

  • Add texture stats for average number of channels per texel.
  • Disable subdivision for meshes with skinning.
  • Fix int2 compare function in Scene::createMeshUVTiles().
  • Fix missing vbOffset when loading vertices from global vertex buffer.
  • Add a way for Scene to return a list of GlobalGeometryIDs bound to a given material.
  • Add a way for Scene to return a an array of Rectangles spanned by the given GlobalGeometryID.
  • Add additional scene update flags to notify users of shader code changes.
  • Add Scene update flag SceneDefinesChanged to indicate when defines change.
  • Remove functions for getting default scene defines.
  • Refactor Scene to prepare for dynamic materials.
  • Add support for re-using GridSequences, which allows GridVolumes to be instanced.
  • Add support for specifying initial grid volume index for playback.
  • Increase MaterialHeader size to 16B and add IoR value.

Importers

  • It is now possible to set options and attributes in pyscene files. This is scoped to the given pyscene file and all files it loads, but does not propagate up.
  • Move asset importers from core Falcor library to individual importer plugins.
  • Remove dependency to nv-usd from core Falcor library.
  • Remove the instances parameter on import. This was only ever supported for AssimpImporter and probably not used in a long time.
  • Pass the Settings instead of accessing the global gpFramework pointer which we want to remove.
  • Minor improvement to handle URIs in GLTF texture paths, improving loading assets from Path Tracing SDK.
  • Use pybind11::dict instead of Dictionary on Importer::importScene.
  • Add interfaces for loading pyscene from memory.

USDImporter

  • Fix issue that could cause dereference of a null primvar on meshes with no texture coordinates.
  • Add support for instanced curves.
  • Initial support for subdivided meshes in USDImporter, courtesy of OpenSubdiv.
  • Match USD texture coordinate primvars by type (texCoord2f, etc.) or by name.
  • Fixes missing texture coordinates on assets exported from certain DCC apps.
  • Use OpenSubdiv::Bfr to perform refinement. Remove Hydra dependency.

Materials

  • Cleanup comments and unused imports in BSDFs/materials.
  • Rename SpecularMicrofacetBTDF to SpecularMicrofacetBSDF.
  • Move ShadingFrame to its own module.
  • Store the smooth shading frame (TBN vectors) as a ShadingFrame in ShadingData.
  • Cleanup handling of shading frames and add helpers.
  • Remove unused applyNormalMap() function (missed in previous MR).
  • Switch to using separate BSDF modules for StandardMaterial.
  • Remove legacy BxDF.slang.
  • Do not call adjustShadingNormal() from the rendering code.
  • Add calls to adjustShadingNormal() in the material instance setup for all materials that didn't already have this.
  • Do not automatically flip the shading normal stored in ShadingData.
  • Move normal mapping into setup for StandardMaterial.
  • Remove IMaterial::modifyTangentSpace interface that is no longer needed.
  • Add hemisphere checks to transmissive PBRT materials.
  • Use the geometric normal for NEE in the path tracers.
  • Use guide normal for remaining parts of NRD.
  • Fix StandardMaterial::getExtraBSDFProperties() to output shading frames in local space.
  • Fix shading normal adjustment to preserve orientation of the shading normal.
  • Add hemisphere checks to coated PBRT materials.
  • Add hemisphere checks to StandardMaterial.
  • Add full hemisphere checks to all reflective, non-layered materials.
  • Add backfacing checks to PBRTDiffuseMaterial.
  • Add image test for light leaks due to normal mapping.
  • Add MaterialInstanceHints to control how materials apply normal mapping and/or shading normal adjustment.
  • Move normal mapping into material instance setup for most materials.
  • Add MERL mixture material (MERLMixMaterial).
  • Add helpers for hemisphere checks.
  • Move functionality for loading a MERL BRDF and associated data into utility MERLFile.
  • Texture statistics are now gathered from the TextureManager, rather than from the Materials.
  • Add importance sampling to MERLMaterial using fitted diffuse-specular BRDF.
  • Add DiffuseSpecularBRDF for sampling purposes.
  • Move helper for detecting normal mapping type to the Material base class.
  • Add ShadingFrame stored internally in each material instance.
  • Add MaterialInstanceHints parameter to the setupMaterialInstance interface to allow controlling its behavior (currently no hints).
  • Move tangentW holding the interpolated tangent and sign into ShadingData for use in orthogonalization.
  • Increase default max size of IMaterialInstance to 128B.
  • Add ShadingFrame utility for holding an orthonormal TBN frame.
  • Add utilities for computing a ShadingFrame due to normal mapping and normal adjustment (bent normals).
  • Add mechanism for IMaterialInstance to report a feature guide normal via BSDFProperties.
  • Add guideNormal output to GBufferRT and GBufferRaster.
  • Update GBufferRT.normWRoughnessMaterialID output to use the guide normal.
  • Update GBufferRaster.pnFwidth output to use the guide normal.
  • Add primitive support to all BSDFs to query their roughness.
  • IMaterial can now return VolumeProperties via getHomogeneousVolumeProperties for programmable homogeneous materials, with multiple phase functions.
  • All materials now inherit from MaterialDefaultImplementation, that provides default implementations for the getHomogeneousVolumeProperties call.
  • Add a thinwalled dielectric BSDF.
  • Pull out IOR flip from PBRTDielectricBSDF and into its material instance.
  • When more textures are loaded than MaterialSystem has descriptors for, the error reports both numbers.
  • TextureManager can now report how many textures it actually loaded (for UDIMs).
  • TextureManager now supports looking for textures in caller-supplied directories, rather than data directories.
  • The MaterialSystem and TextureManager now support UDIMs.
  • Material::update is now called before creating a MaterialSystem parameter block and separate from the uploadMaterial.
  • Split up the microfacet code into separate files:
    • IsotropicGGX.slang: used throughout most of Falcor, including the speed-of-light StandardMaterial.
    • Microfacet.slang: general interface, to be used throughout material refactors.
  • Work on microfacet distributions:
    • Add generalized interface for microfacet distributions.
    • Add Trowbridge-Reitz (GGX) & Beckmann-Spizzichino NDFs adhering to general microfacet interface.
    • Elliptical anisotropy (alphaX, alphaY + rotation).
    • Typical microfacet functions (D, pdfAll, visibleD, G1, G2, sampleAll, sampleVisible).
    • More specialized functions used in multiscatter random walks (sigma, Lambda).
  • Split the BSDF unit tests so each BSDF has its own test.
  • Disabled the TestBsdf_SpecularReflectionTransmissionMicrofacet as it is failing (pending microfacet refactor)
  • Add interface for materials to set shader defines.
  • Make registered material type names unique.
  • Add replaceMaterial to SceneBuilder and MaterialSystem for allow to replace existing materials.
  • Add diffuseAlbedoMultiplier material override to RenderSettings and handle in StandardMaterial and ClothMaterial.
  • Rename IBxDF into IBSDF.
  • Refactor MaterialSystem to allow adding materials at runtime.
  • Rename IBSDF into IMaterialInstance.
  • Rename Lobe into LobeType where applicable.
  • Add sampleNext4D helper function.
  • Change int Material::getBufferCount() const to size_t Material::getMaxBufferCount() const.
  • Change size_t Material::getMaterialInstanceByteSize() to size_t Material::getMaterialInstanceByteSize() const.
  • Add managed 3D textures to MaterialSystem.

Volumes

  • Add DualHenyeyGreensteinPhaseFunction phase function.

Utils

  • Improve formatByteSize output and add tests.
  • Add replaceCharacters helper function in StringUtils.
  • Add UnionFind utility.
  • Add Rectangle type that acts as a 2D AABB.
  • Add LockFile helper class for inter-process file locks.
  • Add MemoryMappedFile utility class for accessing files through memory mapping.
  • Add basic operators to float16_t type.
  • Add spherical_to_cartesian_rad utility (inverse of cartesian_to_spherical_rad) and unit test.
  • Add sample_hemisphere utility.
  • Add helper functions for handling search paths.
  • Remove legacy ParallelReduction class.
  • Rename ComputeParallelReduction to ParallelReduction.
  • Change getEnvironmentVariable to return std::optional<string>.
  • Add findFileInDirectories and globFilesInDirectories to look and glob in user provided directories.
  • Convert std::filesystem::path to string when writing to Dictionary.
  • Add warp profiling utilities (see WarpProfiler).
  • Add unit tests for warp profiling tools.
  • Add utility class BufferAllocator for managing sub-allocations and updates of GPU buffers.
  • Add unit tests for BufferAllocator interfaces.
  • Add utility function to convert string to lower case.
  • Fix alignment in AlignedAllocator and update test.
  • Add utility functions to SHA1.
  • Rename Properties to SettingsProperties.
  • Fix 2x2 matrix inversion.
  • Memory mapped image loading in Bitmap and ImageIO.
  • Make Console not be a singleton, it's now a member in SampleApp.
  • Remove shared globals in ImageProcessing. Resources are now created per instance (we can cache it at the caller if necessary).
  • Fix Profiler singleton to be thread-safe.
  • Change FrameRate::getAverageFrameTime to return time in seconds and cleanup string formatting.
  • Take into account scaling factor for GUI window size.
  • Add decodeURI string utility.
  • Move/extend CudaUtils helpers from OptixDenoiser into Utils/.

Rendering

  • Extend SampleGenerator CPU interface with renderUI, beginFrame and endFrame methods.
  • Fix setting environment map sampler when creating pdf texture.

Renderpasses

  • Extend SceneDebugger to show the fields of ShadingData for the selected pixel.
  • Add support for running DLSS on Vulkan.
  • Fix bug that GBufferRT wasn't clearing all outputs on miss.
  • Remove some obsolete register specifiers in shaders (get rid of slang warnings).
  • Serialize maxFrameCount and overflowMode in AccumulatePass.
  • Change convention for G-buffer tangent to store original geometric tangent (not orthogonalized to the normal).
  • Refactor AccumulatePass options:
    • Remove maxAccumulatedFrames option.
    • Remove subFrameCount option.
    • Add maxFrameCount and overflowMode options.
    • Add overflow modes Stop, Reset and EMA to control what happens after the maxFrameCount (if not 0) is reached.
  • Add antiFlicker option to TAA pass.
  • Remove obsolete manual loading of render pass libraries in render scripts.
  • Rename mRTXGIContextParams to mRTXDIContextParams.
  • Make the depth pre pass part of the GBufferRaster render pass.
  • Add RenderGraph::createFromFile to load render graph python scripts.
  • Remove the obsolete getProjDir from render passes.
  • Add outputFormat property to BlitPass.
  • Cleanup RenderPassLibrary singleton and remove disabled hot reloading support.
  • Rename PathTracer.normal output to PathTracer.guideNormal and use the guide normal for computing it.
  • Throw when creating RenderGraph with no gpDevice available.
  • Add CrossFade pass for time-dependent fading between two inputs.
  • Cleanup and add additional visualization modes to SceneDebugger.
  • Add mask output to VBuffer.

Mogwai

  • Add --fullscreen flag to start in fullscreen mode.
  • Add --headless flag to run in headless mode (used for image tests).
  • Add --list-adapters and --adapter-index flags for selecting the GPU adapter.
  • Add -d,--device-type flag for selecting the graphics API.
  • Rename resizeSwapChain to resizeFrameBuffer in Mogwai's Python API and adjust render scripts (resizeSwapChain is still available but deprecated).

Testing

  • Use argument forwarding in unit test runner. No longer need to mimick FalcorTest's arguments in the test runner.
  • Add simple barebones python test runner with a single dummy test and support for writing JUint XML reports.
  • Remove functionality to build Falcor from the test runners (was broken anyway).
  • Extend test runners to autodetect the latest build config.

Unit Tests

  • Change FalcorTest to run in headless mode.
  • Add --list-adapters and --adapter-index flags to FalcorTest for selecting the GPU adapter.
  • Add -d,--device-type flag to FalcorTest for selecting the graphics API.
  • Abort when Ctrl-C is detected.
  • Add cpu and gpu categories.
  • Add a unit test for Bitmap.
  • Fix issue with *TestException on Linux.
  • Add unit test for resource aliasing.
  • Cleanup unit test reporting.
  • Messages are only printed once (printed to std::cout only if logger does not print them).
  • Failures are now printed right away when they fail, rather than waiting until the whole test ends.
  • Skip exception no longer prints stack trace.
  • Add new EXPECT macros with easier to read formatting.
  • Add new ASSERT macris, to abort the test if an invariant would cause the rest of the test to be nonsensical/crashing.
  • Add unit tests for buffer update and map functionality.
  • Add unit tests for microfacet sampling.
  • Move most of the unit testing code into unittest namespace.
  • Introduce optional arguments to CPU_TEST and GPU_TEST macros to configure tests:
    • skip messages
    • tagging
    • device types to run on
  • Remove GPU_TEST_D3D12 and GPU_TEST_VULKAN macros (we can now use the optional arguments).
  • Refactor FalcorTest application to not use SampleApp.
  • Add a separate enumeration and filter stage.
  • Introduce separate test suite and case filters.
  • Write XML report file with proper test suites.
  • Remove unittest::CategoryFlags.
  • Add --list-test-suites, --list-test-cases and --list-tags options to FalcorTest.
  • Add -t, --tags option to FalcorTest for filtering on tags.
  • Add experimental parallel runner for unit tests.
  • Replace unit test mapBuffer/unmapBuffer with faster/safer readBuffer.
  • Optimize performance of SampleGeneratorTests.
  • Fix LockFileTests to run in parallel.
  • Add support for running unit tests on multiple devices (device types) in a single run.
  • Make PseudorandomTests re-entrant.
  • Add endFrame() after running each unit test to cleanup resources.

Image Tests

  • Extend image tests to allow running on both D3D12 and Vulkan.
  • Reduce default image test resolution to 640x360.
  • Enable a few simple image tests to run on Vulkan (ColorMapPass, CompositePass, SideBySide, ToneMapping).
  • Add image test wrapper script for Linux.
  • The report.json coming from image tests now contains the cwd and args passed to Mogwai, used to run that test. It is in the form that can be directly used with VSCode's launch.json.