Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .gitmodules
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
[submodule "third_party/RTXDI-Library"]
path = third_party/RTXDI-Library
url = https://github.com/NVIDIA-RTX/RTXDI-Library
86 changes: 82 additions & 4 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,15 @@ set(NVTX3_INCLUDE_DIR "" CACHE PATH "Path containing nvtx3/nvToolsExt.h")
set(NSIGHT_GRAPHICS_SDK_DIR "" CACHE PATH "Path to NVIDIA Nsight Graphics SDK")
set(NSIGHT_AFTERMATH_SDK_DIR "" CACHE PATH "Path to NVIDIA Nsight Aftermath SDK")
set(NSIGHT_PERF_SDK_DIR "" CACHE PATH "Path to NVIDIA Nsight Perf SDK")
option(RTV_ENABLE_RTXDI "Enable the native NVIDIA RTXDI runtime" ON)
set(RTXDI_LIBRARY_DIR "${CMAKE_CURRENT_SOURCE_DIR}/third_party/RTXDI-Library" CACHE PATH "Path to the pinned RTXDI-Library checkout")

if(RTV_ENABLE_RTXDI)
if(NOT EXISTS "${RTXDI_LIBRARY_DIR}/CMakeLists.txt")
message(FATAL_ERROR "RTXDI-Library was not found at ${RTXDI_LIBRARY_DIR}. Initialize third_party/RTXDI-Library at the pinned submodule commit.")
endif()
add_subdirectory("${RTXDI_LIBRARY_DIR}" "${CMAKE_BINARY_DIR}/rtxdi" EXCLUDE_FROM_ALL)
endif()

if(NVTX3_INCLUDE_DIR STREQUAL "" AND WIN32)
file(GLOB NVTX3_CANDIDATES LIST_DIRECTORIES true
Expand Down Expand Up @@ -225,6 +234,8 @@ add_executable(rtvulkan
src/rtv/RenderSettingsPanel.cpp
src/rtv/RenderGraph.cpp
src/rtv/RenderGraphDump.cpp
src/rtv/RendererCoreRegressionTests.cpp
src/rtv/RtxdiRuntime.cpp
src/rtv/RendererDebug.cpp
src/rtv/RtpkgIO.cpp
src/rtv/RuntimeSkeleton.cpp
Expand Down Expand Up @@ -275,8 +286,10 @@ add_executable(rtvulkan

if(WIN32)
set(RTV_GLSLANG_VALIDATOR "$ENV{VULKAN_SDK}/Bin/glslangValidator.exe")
set(RTV_DXC "$ENV{VULKAN_SDK}/Bin/dxc.exe")
else()
set(RTV_GLSLANG_VALIDATOR "$ENV{VULKAN_SDK}/Bin/glslangValidator")
set(RTV_DXC "$ENV{VULKAN_SDK}/Bin/dxc")
endif()
if(NOT EXISTS "${RTV_GLSLANG_VALIDATOR}")
message(FATAL_ERROR "glslangValidator was not found at ${RTV_GLSLANG_VALIDATOR}")
Expand All @@ -302,6 +315,37 @@ file(GLOB RTV_SHADER_INCLUDE_FILES CONFIGURE_DEPENDS
)
set(RTV_SHADER_OUTPUTS)

if(RTV_ENABLE_RTXDI)
if(NOT EXISTS "${RTV_DXC}")
message(FATAL_ERROR "DXC was not found at ${RTV_DXC}; native RTXDI SPIR-V compilation requires the Vulkan SDK DXC package.")
endif()
file(GLOB_RECURSE RTV_RTXDI_SHADER_DEPENDENCIES CONFIGURE_DEPENDS
"${RTXDI_LIBRARY_DIR}/Include/Rtxdi/*.h"
"${RTXDI_LIBRARY_DIR}/Include/Rtxdi/*.hlsli")

set(RTV_RTXDI_CONTRACT_SMOKE_SOURCE "${RTV_SHADER_SOURCE_DIR}/rtxdi/rtxdi_contract_smoke.hlsl")
set(RTV_RTXDI_CONTRACT_SMOKE_OUTPUT "${RTV_SHADER_OUTPUT_DIR}/rtxdi_contract_smoke.comp.spv")
add_custom_command(
OUTPUT "${RTV_RTXDI_CONTRACT_SMOKE_OUTPUT}" "${RTV_RTXDI_CONTRACT_SMOKE_OUTPUT}.options"
COMMAND ${CMAKE_COMMAND}
"-DDXC=${RTV_DXC}"
"-DSOURCE=${RTV_RTXDI_CONTRACT_SMOKE_SOURCE}"
"-DOUTPUT=${RTV_RTXDI_CONTRACT_SMOKE_OUTPUT}"
"-DOUTPUT_DIR=${RTV_SHADER_OUTPUT_DIR}"
"-DINCLUDE_DIR=${RTXDI_LIBRARY_DIR}/Include"
"-DPROFILE=cs_6_6"
"-DENTRY_POINT=main"
-P "${CMAKE_CURRENT_SOURCE_DIR}/cmake/CompileHlslShader.cmake"
DEPENDS
"${RTV_RTXDI_CONTRACT_SMOKE_SOURCE}"
"${CMAKE_CURRENT_SOURCE_DIR}/cmake/CompileHlslShader.cmake"
${RTV_RTXDI_SHADER_DEPENDENCIES}
VERBATIM)
list(APPEND RTV_SHADER_OUTPUTS
"${RTV_RTXDI_CONTRACT_SMOKE_OUTPUT}"
"${RTV_RTXDI_CONTRACT_SMOKE_OUTPUT}.options")
endif()

function(rtv_add_shader_variant source suffix)
set(extra_defines ${ARGN})
get_filename_component(shader_name "${source}" NAME)
Expand Down Expand Up @@ -343,6 +387,9 @@ rtv_add_shader_variant("taa.comp" "")
rtv_add_shader_variant("gpu_skinning.comp" "")
rtv_add_shader_variant("dlss_guides.comp" "")
rtv_add_shader_variant("dlss_rr_guides.comp" "")
rtv_add_shader_variant("dlss_guide_visualize.comp" "")
rtv_add_shader_variant("nrd_confidence_gradient.comp" "")
rtv_add_shader_variant("nrd_confidence_filter.comp" "")
rtv_add_shader_variant("nrd_prepare.comp" "")
rtv_add_shader_variant("nrd_resolve.comp" "")
rtv_add_shader_variant("restir_spatial.comp" "")
Expand Down Expand Up @@ -386,6 +433,7 @@ rtv_add_shader_variant("fullscreen.vert" "")
rtv_add_shader_variant("fullscreen.frag" "")
rtv_add_shader_variant("pathtrace.rgen" ".di_packed" "RTV_RESTIR_DI_VALIDATION_FULL=0" "RTV_RESTIR_GI_UNCOMPRESSED_LAYOUT=0")
rtv_add_shader_variant("pathtrace.rgen" ".beauty_fast.di_packed" "RTV_RESTIR_DI_VALIDATION_FULL=0" "RTV_RESTIR_GI_UNCOMPRESSED_LAYOUT=0" "RTV_BEAUTY_OUTPUT_ONLY=1" "RTV_REGIR_TRACE_ENABLED=0" "RTV_MATERIAL_RAY_CONE_LOD=1" "RTV_GENERIC_SECONDARY_ONE_INFINITE_LIGHT=1" "RTV_GENERIC_SECONDARY_DIRECT_PROB=0.5" "RTV_GENERIC_DEEP_SECONDARY_DIRECT_PROB=0.5")
rtv_add_shader_variant("pathtrace.rgen" ".beauty_fast.no_textures.di_packed" "RTV_RESTIR_DI_VALIDATION_FULL=0" "RTV_RESTIR_GI_UNCOMPRESSED_LAYOUT=0" "RTV_BEAUTY_OUTPUT_ONLY=1" "RTV_REGIR_TRACE_ENABLED=0" "RTV_MATERIAL_RAY_CONE_LOD=1" "RTV_GENERIC_SECONDARY_ONE_INFINITE_LIGHT=1" "RTV_GENERIC_SECONDARY_DIRECT_PROB=0.5" "RTV_GENERIC_DEEP_SECONDARY_DIRECT_PROB=0.5" "RTV_MATERIAL_TEXTURES_ENABLED=0")
rtv_add_shader_variant("pathtrace.rgen" ".regir_beauty_fast.di_packed" "RTV_RESTIR_DI_VALIDATION_FULL=0" "RTV_RESTIR_GI_UNCOMPRESSED_LAYOUT=0" "RTV_BEAUTY_OUTPUT_ONLY=1" "RTV_REGIR_TRACE_ENABLED=1" "RTV_REGIR_FINITE_LIGHT_TRACE_ENABLED=1" "RTV_REGIR_FRAME_COHERENT_FINITE_QUERY=1" "RTV_MATERIAL_RAY_CONE_LOD=1" "RTV_GENERIC_SECONDARY_ONE_INFINITE_LIGHT=1" "RTV_GENERIC_SECONDARY_DIRECT_PROB=0.5" "RTV_GENERIC_DEEP_SECONDARY_DIRECT_PROB=0.5")
rtv_add_shader_variant("pathtrace.rgen" ".regir_stochastic_beauty_fast.di_packed" "RTV_RESTIR_DI_VALIDATION_FULL=0" "RTV_RESTIR_GI_UNCOMPRESSED_LAYOUT=0" "RTV_BEAUTY_OUTPUT_ONLY=1" "RTV_REGIR_TRACE_ENABLED=1" "RTV_REGIR_FINITE_LIGHT_TRACE_ENABLED=0" "RTV_MATERIAL_RAY_CONE_LOD=1" "RTV_GENERIC_SECONDARY_ONE_INFINITE_LIGHT=1" "RTV_GENERIC_SECONDARY_DIRECT_PROB=0.5" "RTV_GENERIC_DEEP_SECONDARY_DIRECT_PROB=0.5")
rtv_add_shader_variant("pathtrace.rgen" ".di_full" "RTV_RESTIR_DI_VALIDATION_FULL=1" "RTV_RESTIR_GI_UNCOMPRESSED_LAYOUT=0")
Expand All @@ -395,13 +443,13 @@ rtv_add_shader_variant("pathtrace.rgen" ".motion.di_packed" "RTV_MOTION_BLUR_ENA
rtv_add_shader_variant("pathtrace.rgen" ".motion.di_full" "RTV_MOTION_BLUR_ENABLED=1" "RTV_RESTIR_DI_VALIDATION_FULL=1" "RTV_RESTIR_GI_UNCOMPRESSED_LAYOUT=0")
rtv_add_shader_variant("pathtrace.rgen" ".motion.gi_full" "RTV_MOTION_BLUR_ENABLED=1" "RTV_RESTIR_DI_VALIDATION_FULL=0" "RTV_RESTIR_GI_UNCOMPRESSED_LAYOUT=1")
rtv_add_shader_variant("pathtrace.rgen" ".motion.di_full.gi_full" "RTV_MOTION_BLUR_ENABLED=1" "RTV_RESTIR_DI_VALIDATION_FULL=1" "RTV_RESTIR_GI_UNCOMPRESSED_LAYOUT=1")
rtv_add_shader_variant("pathtrace.rgen" ".native2b" "RTV_NATIVE2B_PIPELINE=1" "RTV_MOTION_BLUR_ENABLED=0" "RTV_RESTIR_DI_VALIDATION_FULL=0" "RTV_RESTIR_GI_UNCOMPRESSED_LAYOUT=0")
rtv_add_shader_variant("pathtrace.rgen" ".native2b.compact_primary_lights" "RTV_NATIVE2B_PIPELINE=1" "RTV_NATIVE2B_COMPACT_PRIMARY_LIGHTS=1" "RTV_MOTION_BLUR_ENABLED=0" "RTV_RESTIR_DI_VALIDATION_FULL=0" "RTV_RESTIR_GI_UNCOMPRESSED_LAYOUT=0")
rtv_add_shader_variant("pathtrace.rgen" ".native2b" "RTV_NATIVE2B_PIPELINE=1" "RTV_BEAUTY_OUTPUT_ONLY=1" "RTV_REGIR_TRACE_ENABLED=0" "RTV_MOTION_BLUR_ENABLED=0" "RTV_RESTIR_DI_VALIDATION_FULL=0" "RTV_RESTIR_GI_UNCOMPRESSED_LAYOUT=0")
rtv_add_shader_variant("pathtrace.rgen" ".native2b.compact_primary_lights" "RTV_NATIVE2B_PIPELINE=1" "RTV_NATIVE2B_COMPACT_PRIMARY_LIGHTS=1" "RTV_BEAUTY_OUTPUT_ONLY=1" "RTV_REGIR_TRACE_ENABLED=0" "RTV_MOTION_BLUR_ENABLED=0" "RTV_RESTIR_DI_VALIDATION_FULL=0" "RTV_RESTIR_GI_UNCOMPRESSED_LAYOUT=0")
rtv_add_shader_variant("pathtrace.rgen" ".rt_diag.di_packed" "RTV_RT_DIAGNOSTIC_COUNTERS=1" "RTV_RESTIR_DI_VALIDATION_FULL=0" "RTV_RESTIR_GI_UNCOMPRESSED_LAYOUT=0")
rtv_add_shader_variant("pathtrace.rgen" ".rt_diag.di_full" "RTV_RT_DIAGNOSTIC_COUNTERS=1" "RTV_RESTIR_DI_VALIDATION_FULL=1" "RTV_RESTIR_GI_UNCOMPRESSED_LAYOUT=0")
rtv_add_shader_variant("pathtrace.rgen" ".rt_diag.gi_full" "RTV_RT_DIAGNOSTIC_COUNTERS=1" "RTV_RESTIR_DI_VALIDATION_FULL=0" "RTV_RESTIR_GI_UNCOMPRESSED_LAYOUT=1")
rtv_add_shader_variant("pathtrace.rgen" ".rt_diag.di_full.gi_full" "RTV_RT_DIAGNOSTIC_COUNTERS=1" "RTV_RESTIR_DI_VALIDATION_FULL=1" "RTV_RESTIR_GI_UNCOMPRESSED_LAYOUT=1")
rtv_add_shader_variant("pathtrace.rgen" ".rt_diag.native2b" "RTV_RT_DIAGNOSTIC_COUNTERS=1" "RTV_NATIVE2B_PIPELINE=1" "RTV_MOTION_BLUR_ENABLED=0" "RTV_RESTIR_DI_VALIDATION_FULL=0" "RTV_RESTIR_GI_UNCOMPRESSED_LAYOUT=0")
rtv_add_shader_variant("pathtrace.rgen" ".rt_diag.native2b" "RTV_RT_DIAGNOSTIC_COUNTERS=1" "RTV_NATIVE2B_PIPELINE=1" "RTV_BEAUTY_OUTPUT_ONLY=1" "RTV_REGIR_TRACE_ENABLED=0" "RTV_MOTION_BLUR_ENABLED=0" "RTV_RESTIR_DI_VALIDATION_FULL=0" "RTV_RESTIR_GI_UNCOMPRESSED_LAYOUT=0")
rtv_add_shader_variant("wavefront_trace.rgen" "")
rtv_add_shader_variant("wavefront_trace.rgen" ".ser" "RTV_SER_ENABLED=1")
rtv_add_shader_variant("wavefront_shadow_trace.rgen" "")
Expand Down Expand Up @@ -491,7 +539,8 @@ target_compile_definitions(rtvulkan PRIVATE
RTV_ENABLE_ASSIMP_IMPORTER=$<BOOL:${RTV_ENABLE_ASSIMP_IMPORTER}>
RTV_ASSIMP_IMPORTER_AVAILABLE=$<BOOL:${RTV_ASSIMP_IMPORTER_AVAILABLE}>
RTV_ENABLE_OPENUSD_IMPORTER=$<BOOL:${RTV_ENABLE_OPENUSD_IMPORTER}>
RTV_OPENUSD_IMPORTER_AVAILABLE=$<BOOL:${RTV_OPENUSD_IMPORTER_AVAILABLE}>)
RTV_OPENUSD_IMPORTER_AVAILABLE=$<BOOL:${RTV_OPENUSD_IMPORTER_AVAILABLE}>
RTV_HAS_RTXDI=$<BOOL:${RTV_ENABLE_RTXDI}>)
target_link_libraries(rtvulkan PRIVATE
volk
glfw
Expand All @@ -503,6 +552,9 @@ target_link_libraries(rtvulkan PRIVATE
KTX::ktx
TIFF::TIFF
)
if(RTV_ENABLE_RTXDI)
target_link_libraries(rtvulkan PRIVATE Rtxdi)
endif()

if(EXISTS "${RENDERDOC_SDK_DIR}/renderdoc_app.h")
target_compile_definitions(rtvulkan PRIVATE RTV_HAS_RENDERDOC=1)
Expand Down Expand Up @@ -830,3 +882,29 @@ endif()
target_precompile_headers(rtvulkan PRIVATE
"$<$<COMPILE_LANGUAGE:CXX>:${CMAKE_CURRENT_SOURCE_DIR}/include/rtv/Pch.h>"
)

include(CTest)
if(BUILD_TESTING)
add_test(NAME renderer_core_regressions
COMMAND $<TARGET_FILE:rtvulkan> --selftest-renderer-core)
add_test(NAME cli_rejects_unknown_argument
COMMAND $<TARGET_FILE:rtvulkan> --selftest-renderer-core --definitely-not-a-real-flag)
add_test(NAME cli_rejects_missing_value
COMMAND $<TARGET_FILE:rtvulkan> --selftest-renderer-core --render-scale)
add_test(NAME cli_accepts_known_value_argument
COMMAND $<TARGET_FILE:rtvulkan> --selftest-renderer-core --inspection-json renderer_core_cli_probe.json)
add_test(NAME cli_accepts_known_two_value_argument
COMMAND $<TARGET_FILE:rtvulkan> --selftest-renderer-core --compare-image baseline.png current.png)
add_test(NAME cli_rejects_missing_second_value
COMMAND $<TARGET_FILE:rtvulkan> --selftest-renderer-core --compare-image baseline.png)
add_test(NAME cli_known_option_table_matches_parser
COMMAND ${CMAKE_COMMAND}
-DMAIN_SOURCE=${CMAKE_CURRENT_SOURCE_DIR}/src/main.cpp
-DOPTIONS_HEADER=${CMAKE_CURRENT_SOURCE_DIR}/include/rtv/KnownCommandLineOptions.h
-P ${CMAKE_CURRENT_SOURCE_DIR}/cmake/VerifyKnownCommandLineOptions.cmake)
set_tests_properties(
cli_rejects_unknown_argument
cli_rejects_missing_value
cli_rejects_missing_second_value
PROPERTIES WILL_FAIL TRUE)
endif()
41 changes: 41 additions & 0 deletions cmake/CompileHlslShader.cmake
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
if(NOT DEFINED DXC OR DXC STREQUAL "")
message(FATAL_ERROR "DXC is required")
endif()
if(NOT DEFINED SOURCE OR SOURCE STREQUAL "")
message(FATAL_ERROR "SOURCE is required")
endif()
if(NOT DEFINED OUTPUT OR OUTPUT STREQUAL "")
message(FATAL_ERROR "OUTPUT is required")
endif()
if(NOT DEFINED INCLUDE_DIR OR INCLUDE_DIR STREQUAL "")
message(FATAL_ERROR "INCLUDE_DIR is required")
endif()
if(NOT DEFINED PROFILE OR PROFILE STREQUAL "")
set(PROFILE "cs_6_6")
endif()
if(NOT DEFINED ENTRY_POINT OR ENTRY_POINT STREQUAL "")
set(ENTRY_POINT "main")
endif()

file(MAKE_DIRECTORY "${OUTPUT_DIR}")

execute_process(
COMMAND "${DXC}"
-spirv
-fspv-target-env=vulkan1.3
-fspv-reflect
-HV 2021
-T "${PROFILE}"
-E "${ENTRY_POINT}"
-D SPIRV=1
-I "${INCLUDE_DIR}"
-Fo "${OUTPUT}"
"${SOURCE}"
RESULT_VARIABLE compile_result)

if(NOT compile_result EQUAL 0)
message(FATAL_ERROR "DXC failed for ${SOURCE}")
endif()

file(WRITE "${OUTPUT}.options"
"PROFILE=${PROFILE}\nENTRY_POINT=${ENTRY_POINT}\nSPIRV=1\nINCLUDE_DIR=${INCLUDE_DIR}\n")
58 changes: 58 additions & 0 deletions cmake/VerifyKnownCommandLineOptions.cmake
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
if(NOT DEFINED MAIN_SOURCE OR NOT DEFINED OPTIONS_HEADER)
message(FATAL_ERROR "MAIN_SOURCE and OPTIONS_HEADER are required")
endif()

file(READ "${MAIN_SOURCE}" main_source)
string(REGEX MATCHALL "==[ \t\r\n]*\"--[A-Za-z0-9-]+\"" parser_matches "${main_source}")
set(parser_options)
foreach(match IN LISTS parser_matches)
string(REGEX REPLACE ".*\"(--[A-Za-z0-9-]+)\".*" "\\1" option "${match}")
list(APPEND parser_options "${option}")
endforeach()
list(REMOVE_DUPLICATES parser_options)
list(SORT parser_options)

file(READ "${OPTIONS_HEADER}" options_header)
string(FIND "${options_header}" "kKnownCommandLineOptions{{" known_start)
if(known_start EQUAL -1)
message(FATAL_ERROR "Could not locate kKnownCommandLineOptions in ${OPTIONS_HEADER}")
endif()
string(SUBSTRING "${options_header}" ${known_start} -1 known_tail)
string(FIND "${known_tail}" "}};" known_end)
if(known_end EQUAL -1)
message(FATAL_ERROR "Could not locate the end of kKnownCommandLineOptions in ${OPTIONS_HEADER}")
endif()
string(SUBSTRING "${known_tail}" 0 ${known_end} known_block)
string(REGEX MATCHALL "\"--[A-Za-z0-9-]+\"" known_matches "${known_block}")
set(known_options)
foreach(match IN LISTS known_matches)
string(REGEX REPLACE "\"(--[A-Za-z0-9-]+)\"" "\\1" option "${match}")
list(APPEND known_options "${option}")
endforeach()
list(LENGTH known_options known_count_with_duplicates)
list(REMOVE_DUPLICATES known_options)
list(LENGTH known_options known_count)
if(NOT known_count EQUAL known_count_with_duplicates)
message(FATAL_ERROR "kKnownCommandLineOptions contains duplicate entries")
endif()
list(SORT known_options)

set(missing_options)
foreach(option IN LISTS parser_options)
if(NOT option IN_LIST known_options)
list(APPEND missing_options "${option}")
endif()
endforeach()
set(extra_options)
foreach(option IN LISTS known_options)
if(NOT option IN_LIST parser_options)
list(APPEND extra_options "${option}")
endif()
endforeach()

if(missing_options OR extra_options)
message(FATAL_ERROR
"Known CLI option table is out of sync. Missing: [${missing_options}] Extra: [${extra_options}]")
endif()

message(STATUS "Known CLI option table matches ${known_count} parser options")
10 changes: 9 additions & 1 deletion include/rtv/Application.h
Original file line number Diff line number Diff line change
Expand Up @@ -105,6 +105,8 @@ class Application final : private NonCopyable {
bool debugViewOverride = false,
bool validationCameraMotion = false,
bool validationObjectMotion = false,
bool validationLightReorder = false,
bool validationLightFlicker = false,
bool headless = false,
ApplicationMode mode = ApplicationMode::Editor,
uint32_t headlessWidth = 1280,
Expand Down Expand Up @@ -459,6 +461,8 @@ class Application final : private NonCopyable {
void mainLoop(uint32_t maxFrames);
void applyValidationCameraMotion(uint32_t frameIndex);
void applyValidationObjectMotion(uint32_t frameIndex);
void applyValidationLightReorder(uint32_t frameIndex);
void applyValidationLightFlicker(uint32_t frameIndex);
void updateAutosave(float deltaSeconds);
bool writeAutosave();
void writeCrashMarker(bool running);
Expand Down Expand Up @@ -637,7 +641,7 @@ class Application final : private NonCopyable {
void createPathTracer(const RendererSettings* settingsToRestore = nullptr);
void applyActiveSceneCamera();
void syncActiveSceneCameraFromController();
void rebuildGpuSceneAsset();
void rebuildGpuSceneAsset(const RendererSettings* settingsOverride = nullptr);
void processRendererOnlyRequests(const RendererOnlyRequests& requests);
void updateCaptureReadyState(uint32_t frameNumber);
[[nodiscard]] std::string activeCaptureSceneName() const;
Expand Down Expand Up @@ -699,6 +703,10 @@ class Application final : private NonCopyable {
bool debugViewOverride_ = false;
bool validationCameraMotion_ = false;
bool validationObjectMotion_ = false;
bool validationLightReorder_ = false;
bool validationLightReorderApplied_ = false;
bool validationLightFlicker_ = false;
bool validationLightFlickerUnavailableLogged_ = false;
EntityId validationObjectMotionEntity_{};
Transform validationObjectMotionBaseTransform_{};
bool disableAsyncCompute_ = false;
Expand Down
6 changes: 4 additions & 2 deletions include/rtv/AssetBrowserPanel.h
Original file line number Diff line number Diff line change
Expand Up @@ -167,8 +167,10 @@ class AssetBrowserPanel {
std::string selectedRecordGuid_;
std::vector<std::filesystem::path> backStack_;
std::vector<std::filesystem::path> forwardStack_;
bool gridView_ = false;
bool showDetails_ = true;
int viewMode_ = 0;
bool gridView_ = true;
bool showDetails_ = false;
bool presentationPreferencesLoaded_ = false;
bool compatibilityMode_ = true;
bool openImportSettings_ = false;
int importMode_ = 0;
Expand Down
21 changes: 18 additions & 3 deletions include/rtv/BindlessResources.h
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@

#include <Volk/volk.h>

#include <array>
#include <cstdint>
#include <filesystem>
#include <memory>
Expand All @@ -12,6 +13,8 @@

namespace rtv {

inline constexpr uint32_t kBindlessTextureHeapVersionCount = 3;

class Image;
class Buffer;

Expand All @@ -21,6 +24,11 @@ struct BindlessCapabilities {
bool partiallyBound = false;
bool updateAfterBind = false;
uint32_t maxSampledImages = 0;
uint32_t maxPerStageSampledImages = 0;
uint32_t maxPerStageSamplers = 0;
uint32_t maxDescriptorSetSampledImages = 0;
uint32_t maxDescriptorSetSamplers = 0;
uint32_t maxUpdateAfterBindDescriptorsInAllPools = 0;
};

[[nodiscard]] BindlessCapabilities queryBindlessCapabilities(VkPhysicalDevice physicalDevice);
Expand Down Expand Up @@ -56,22 +64,29 @@ class BindlessTextureHeap {
void destroy();
void updateAll(const std::vector<VkDescriptorImageInfo>& descriptors);
void patch(uint32_t slot, const VkDescriptorImageInfo& descriptor);
void beginFrame(uint32_t frameIndex);

[[nodiscard]] VkDescriptorSetLayout layout() const { return layout_; }
[[nodiscard]] VkDescriptorSet descriptorSet() const { return descriptorSet_; }
[[nodiscard]] VkDescriptorSet descriptorSet() const;
[[nodiscard]] uint32_t capacity() const { return capacity_; }
[[nodiscard]] uint32_t patchCount() const { return patchCount_; }
[[nodiscard]] bool initialized() const { return descriptorSet_ != VK_NULL_HANDLE; }
[[nodiscard]] bool initialized() const { return descriptorSets_.front() != VK_NULL_HANDLE; }
[[nodiscard]] BindlessTextureHeapStats stats() const;

private:
VkDevice device_ = VK_NULL_HANDLE;
VkDescriptorPool pool_ = VK_NULL_HANDLE;
VkDescriptorSetLayout layout_ = VK_NULL_HANDLE;
VkDescriptorSet descriptorSet_ = VK_NULL_HANDLE;
std::array<VkDescriptorSet, kBindlessTextureHeapVersionCount> descriptorSets_{};
std::array<uint64_t, kBindlessTextureHeapVersionCount> appliedGenerations_{};
std::vector<VkDescriptorImageInfo> descriptors_;
std::vector<uint8_t> descriptorValid_;
uint64_t descriptorGeneration_ = 0;
uint32_t currentFrameSlot_ = 0;
uint32_t capacity_ = 0;
uint32_t descriptorCount_ = 0;
uint32_t patchCount_ = 0;
bool frameSetSelected_ = false;
};

struct TextureHandle { uint32_t index = UINT32_MAX; [[nodiscard]] bool valid() const { return index != UINT32_MAX; } };
Expand Down
1 change: 1 addition & 0 deletions include/rtv/CommandSystem.h
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,7 @@ class CommandSystem final : private NonCopyable {
UiOverlay* uiOverlay_ = nullptr;
std::array<FrameResources, framesInFlight> frames_{};
std::vector<VkSemaphore> imageRenderFinished_;
std::vector<VkFence> imageInFlightFences_;
mutable uint64_t asyncTimelineValue_ = 0;
mutable uint64_t asyncHistoryCompleteValue_ = 0;
uint32_t frameIndex_ = 0;
Expand Down
Loading