Skip to content

Commit cc50d6b

Browse files
authored
DDGI (#18)
* Refactord LPV and RTGI into a common interface, ready to add more IG * Fixed half-pixel offset when reprojecting depth * Place irradiance cache cascades * Added DLSS-RR * Further work on probes * Update probe depth * Converting to eastl * Updated fastgltf and suffered the consequences * Got EASTL working, fixed a normalmapping bug * Initial implementation done, time for debugging * Updated fastgltf again, and some bugfixes to the irradiance cache * Got the debug visualization setup working * Building out GI Probe debugging technology * Slight LPV optimizations, organized shaders better, tore my hair out a little * Fixing bugs and chewing bubblegum - and I still have some bubblegum * SPent some time debugging the GV, didn't make much progress * Tweaked base AO range
1 parent ee8bc8a commit cc50d6b

File tree

176 files changed

+4441
-2553
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

176 files changed

+4441
-2553
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
# Render thing
1+
# 𒊓𒊏
22

33
## Build Prerequisites
44

RenderCore/SahCore.cmake

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@ target_compile_definitions(SahCore PUBLIC
5555
SAH_USE_STREAMLINE=${SAH_USE_STREAMLINE}
5656
SAH_USE_XESS=${SAH_USE_XESS}
5757
UTF_CPP_CPLUSPLUS=202002
58+
EASTL_EASTDC_VSNPRINTF=0
5859
)
5960

6061
if(WIN32)
@@ -75,6 +76,7 @@ target_include_directories(SahCore PUBLIC
7576

7677
# set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wno-format-security")
7778
target_link_libraries(SahCore PUBLIC
79+
EASTL
7880
fastgltf::fastgltf
7981
glm::glm-header-only
8082
GPUOpen::VulkanMemoryAllocator

RenderCore/console/cvars.cpp

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
11
#include "cvars.hpp"
22

3-
#include <array>
3+
#include <EASTL/array.h>
44
#include <algorithm>
55
#include <shared_mutex>
6-
#include <unordered_map>
7-
#include <vector>
6+
#include <EASTL/unordered_map.h>
7+
#include <EASTL/vector.h>
88

99
#include <imgui.h>
10-
#include <imgui_stdlib.h>
1110
#include <imgui_internal.h>
11+
#include <imgui_stdlib.h>
1212

1313
#include "core/user_options_controller.hpp"
1414

@@ -187,9 +187,9 @@ class CVarSystemImpl final : public CVarSystem {
187187

188188
CVarParameter* InitCVar(const char* name, const char* description);
189189

190-
std::unordered_map<uint32_t, CVarParameter> savedCVars;
190+
eastl::unordered_map<uint32_t, CVarParameter> savedCVars;
191191

192-
std::vector<CVarParameter*> cachedEditParameters;
192+
eastl::vector<CVarParameter*> cachedEditParameters;
193193

194194
CvarChangeDispatcher dispatcher;
195195
};

RenderCore/console/cvars.hpp

Lines changed: 70 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -10,111 +10,120 @@ class CvarChangeDispatcher;
1010

1111
class CVarParameter;
1212

13-
enum class CVarFlags : uint32_t
14-
{
15-
None = 0,
16-
Noedit = 1 << 1,
17-
EditReadOnly = 1 << 2,
18-
Advanced = 1 << 3,
19-
20-
EditCheckbox = 1 << 8,
21-
EditFloatDrag = 1 << 9,
13+
enum class CVarFlags : uint32_t {
14+
None = 0,
15+
Noedit = 1 << 1,
16+
EditReadOnly = 1 << 2,
17+
Advanced = 1 << 3,
18+
19+
EditCheckbox = 1 << 8,
20+
EditFloatDrag = 1 << 9,
2221
};
23-
class CVarSystem
24-
{
2522

23+
class CVarSystem {
2624
public:
2725
virtual ~CVarSystem() = default;
2826
static CVarSystem* Get();
2927

30-
//pimpl
31-
virtual CVarParameter* GetCVar(StringUtils::StringHash hash) = 0;
28+
//pimpl
29+
virtual CVarParameter* GetCVar(StringUtils::StringHash hash) = 0;
3230

33-
virtual double* GetFloatCVar(StringUtils::StringHash hash) = 0;
31+
virtual double* GetFloatCVar(StringUtils::StringHash hash) = 0;
3432

35-
virtual int32_t* GetIntCVar(StringUtils::StringHash hash) = 0;
33+
virtual int32_t* GetIntCVar(StringUtils::StringHash hash) = 0;
3634

37-
virtual const char* GetStringCVar(StringUtils::StringHash hash) = 0;
35+
virtual const char* GetStringCVar(StringUtils::StringHash hash) = 0;
3836

39-
virtual void SetFloatCVar(StringUtils::StringHash hash, double value) = 0;
37+
virtual void SetFloatCVar(StringUtils::StringHash hash, double value) = 0;
4038

41-
virtual void SetIntCVar(StringUtils::StringHash hash, int32_t value) = 0;
39+
virtual void SetIntCVar(StringUtils::StringHash hash, int32_t value) = 0;
4240

43-
virtual void SetStringCVar(StringUtils::StringHash hash, const char* value) = 0;
41+
virtual void SetStringCVar(StringUtils::StringHash hash, const char* value) = 0;
4442

45-
46-
virtual CVarParameter* CreateFloatCVar(const char* name, const char* description, double defaultValue, double currentValue) = 0;
47-
48-
virtual CVarParameter* CreateIntCVar(const char* name, const char* description, int32_t defaultValue, int32_t currentValue) = 0;
49-
50-
virtual CVarParameter* CreateStringCVar(const char* name, const char* description, const char* defaultValue, const char* currentValue) = 0;
43+
template <typename EnumType>
44+
void SetEnumCVar(StringUtils::StringHash hash, EnumType value);
5145

52-
virtual void register_listener(std::string_view cvar_name, std::function<void(int32_t)> listener) = 0;
46+
virtual CVarParameter* CreateFloatCVar(
47+
const char* name, const char* description, double defaultValue, double currentValue
48+
) = 0;
5349

54-
virtual void DrawImguiEditor() = 0;
50+
virtual CVarParameter* CreateIntCVar(
51+
const char* name, const char* description, int32_t defaultValue, int32_t currentValue
52+
) = 0;
53+
54+
virtual CVarParameter* CreateStringCVar(
55+
const char* name, const char* description, const char* defaultValue, const char* currentValue
56+
) = 0;
57+
58+
virtual void register_listener(std::string_view cvar_name, std::function<void(int32_t)> listener) = 0;
59+
60+
virtual void DrawImguiEditor() = 0;
5561
};
5662

57-
template<typename T>
58-
struct AutoCVar
59-
{
63+
template <typename T>
64+
struct AutoCVar {
6065
protected:
61-
int index;
62-
using CVarType = T;
66+
int index;
67+
using CVarType = T;
6368
};
6469

65-
struct AutoCVar_Float : AutoCVar<double>
66-
{
67-
AutoCVar_Float(const char* name, const char* description, double defaultValue, CVarFlags flags = CVarFlags::None);
70+
struct AutoCVar_Float : AutoCVar<double> {
71+
AutoCVar_Float(const char* name, const char* description, double defaultValue, CVarFlags flags = CVarFlags::None);
6872

69-
double Get();
70-
double* GetPtr();
71-
float GetFloat();
72-
float* GetFloatPtr();
73-
void Set(double val);
73+
double Get();
74+
double* GetPtr();
75+
float GetFloat();
76+
float* GetFloatPtr();
77+
void Set(double val);
7478
};
7579

76-
struct AutoCVar_Int : AutoCVar<int32_t>
77-
{
78-
AutoCVar_Int(const char* name, const char* description, int32_t defaultValue, CVarFlags flags = CVarFlags::None);
79-
int32_t Get();
80-
int32_t* GetPtr();
81-
void Set(int32_t val);
80+
struct AutoCVar_Int : AutoCVar<int32_t> {
81+
AutoCVar_Int(const char* name, const char* description, int32_t defaultValue, CVarFlags flags = CVarFlags::None);
82+
int32_t Get();
83+
int32_t* GetPtr();
84+
void Set(int32_t val);
8285

83-
void Toggle();
86+
void Toggle();
8487
};
8588

86-
struct AutoCVar_String : AutoCVar<std::string>
87-
{
88-
AutoCVar_String(const char* name, const char* description, const char* defaultValue, CVarFlags flags = CVarFlags::None);
89+
struct AutoCVar_String : AutoCVar<std::string> {
90+
AutoCVar_String(
91+
const char* name, const char* description, const char* defaultValue, CVarFlags flags = CVarFlags::None
92+
);
8993

90-
const char* Get();
91-
void Set(std::string&& val);
94+
const char* Get();
95+
void Set(std::string&& val);
9296
};
9397

9498
template <typename EnumType>
9599
struct AutoCVar_Enum : AutoCVar_Int {
96-
AutoCVar_Enum(const char* name, const char* description, EnumType defaultValue, CVarFlags flags = CVarFlags::None);
97-
EnumType Get();
98-
EnumType* GetPtr();
99-
void Set(EnumType val);
100+
AutoCVar_Enum(const char* name, const char* description, EnumType defaultValue, CVarFlags flags = CVarFlags::None);
101+
EnumType Get();
102+
EnumType* GetPtr();
103+
void Set(EnumType val);
100104
};
101105

106+
template <typename EnumType>
107+
void CVarSystem::SetEnumCVar(StringUtils::StringHash hash, EnumType value) {
108+
SetIntCVar(hash, static_cast<int32_t>(value));
109+
}
110+
102111
template <typename EnumType>
103112
AutoCVar_Enum<EnumType>::AutoCVar_Enum(
104-
const char* name, const char* description, EnumType defaultValue, CVarFlags flags
105-
) : AutoCVar_Int{ name, description, static_cast<int32_t>(defaultValue), flags } {}
113+
const char* name, const char* description, EnumType defaultValue, CVarFlags flags
114+
) : AutoCVar_Int{name, description, static_cast<int32_t>(defaultValue), flags} {}
106115

107116
template <typename EnumType>
108117
EnumType AutoCVar_Enum<EnumType>::Get() {
109-
return static_cast<EnumType>(AutoCVar_Int::Get());
118+
return static_cast<EnumType>(AutoCVar_Int::Get());
110119
}
111120

112121
template <typename EnumType>
113122
EnumType* AutoCVar_Enum<EnumType>::GetPtr() {
114-
return static_cast<EnumType*>(AutoCVar_Int::GetPtr());
123+
return static_cast<EnumType*>(AutoCVar_Int::GetPtr());
115124
}
116125

117126
template <typename EnumType>
118127
void AutoCVar_Enum<EnumType>::Set(EnumType val) {
119-
AutoCVar_Int::Set(static_cast<int32_t>(val));
128+
AutoCVar_Int::Set(static_cast<int32_t>(val));
120129
}

RenderCore/core/android_system_interface.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ AndroidSystemInterface::AndroidSystemInterface(android_app* app) :
1616
begin_stdout_redirection("SAH");
1717
}
1818

19-
static std::vector<std::shared_ptr<spdlog::logger>> all_loggers{};
19+
static eastl::vector<std::shared_ptr<spdlog::logger>> all_loggers{};
2020

2121
std::shared_ptr<spdlog::logger> AndroidSystemInterface::get_logger(const std::string& name) {
2222
auto logger = spdlog::android_logger_mt(name);
@@ -32,7 +32,7 @@ void AndroidSystemInterface::flush_all_loggers() {
3232
}
3333
}
3434

35-
tl::optional<std::vector<uint8_t>> AndroidSystemInterface::load_file(const std::filesystem::path& filepath) {
35+
tl::optional<eastl::vector<uint8_t>> AndroidSystemInterface::load_file(const std::filesystem::path& filepath) {
3636
const auto filename_string = filepath.string();
3737

3838
AAsset* file = AAssetManager_open(asset_manager, filename_string.c_str(), AASSET_MODE_BUFFER);
@@ -42,7 +42,7 @@ tl::optional<std::vector<uint8_t>> AndroidSystemInterface::load_file(const std::
4242

4343
const auto file_length = AAsset_getLength(file);
4444

45-
auto file_content = std::vector<uint8_t>{};
45+
auto file_content = eastl::vector<uint8_t>{};
4646
file_content.resize(file_length);
4747

4848
AAsset_read(file, file_content.data(), file_length);

RenderCore/core/application.cpp

Lines changed: 39 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,16 @@
77
#include <imgui.h>
88
#include <magic_enum.hpp>
99
#include <tracy/Tracy.hpp>
10+
#include <fastgltf/core.hpp>
1011

1112
#include "system_interface.hpp"
1213
#include "model_import/gltf_model.hpp"
1314

1415
static std::shared_ptr<spdlog::logger> logger;
1516

1617
Application::Application() : parser{fastgltf::Extensions::KHR_texture_basisu} {
18+
ZoneScoped;
19+
1720
logger = SystemInterface::get().get_logger("Application");
1821
spdlog::set_level(spdlog::level::trace);
1922
spdlog::flush_on(spdlog::level::critical);
@@ -24,24 +27,34 @@ Application::Application() : parser{fastgltf::Extensions::KHR_texture_basisu} {
2427

2528
scene_renderer = std::make_unique<SceneRenderer>();
2629
scene = std::make_unique<RenderScene>(
27-
scene_renderer->get_mesh_storage(), scene_renderer->get_material_storage()
30+
scene_renderer->get_mesh_storage(),
31+
scene_renderer->get_material_storage()
2832
);
2933

3034
scene_renderer->set_scene(*scene);
3135

32-
input.add_input_event_callback([&](const InputEvent& event) { switch (event.button) {
33-
case InputButtons::FlycamEnabled:
34-
if(event.action == InputAction::Pressed) {
35-
logger->trace("Enabling the flycam");
36-
flycam_enabled = true;
37-
} else {
38-
logger->trace("Disabling the flycam");
39-
flycam_enabled = false;
40-
}
41-
break;
42-
} });
43-
input.add_player_movement_callback([&](const glm::vec3& movement) { update_player_location(movement); });
44-
input.add_player_rotation_callback([&](const glm::vec2& rotation) { update_player_rotation(rotation); });
36+
input.add_input_event_callback(
37+
[&](const InputEvent& event) {
38+
switch(event.button) {
39+
case InputButtons::FlycamEnabled:
40+
if(event.action == InputAction::Pressed) {
41+
logger->trace("Enabling the flycam");
42+
flycam_enabled = true;
43+
} else {
44+
logger->trace("Disabling the flycam");
45+
flycam_enabled = false;
46+
}
47+
break;
48+
}
49+
});
50+
input.add_player_movement_callback(
51+
[&](const glm::vec3& movement) {
52+
update_player_location(movement);
53+
});
54+
input.add_player_rotation_callback(
55+
[&](const glm::vec2& rotation) {
56+
update_player_rotation(rotation);
57+
});
4558

4659
last_frame_start_time = std::chrono::high_resolution_clock::now();
4760

@@ -61,7 +74,7 @@ void Application::load_scene(const std::filesystem::path& scene_path) {
6174
}
6275
#endif
6376

64-
if (scene_path.has_parent_path()) {
77+
if(scene_path.has_parent_path()) {
6578
logger->info("Scene path {} has parent path {}", scene_path.string(), scene_path.parent_path().string());
6679
} else {
6780
logger->warn("Scene path {} has no parent path!", scene_path.string());
@@ -75,35 +88,20 @@ void Application::load_scene(const std::filesystem::path& scene_path) {
7588
data.loadFromAndroidAsset(scene_path);
7689
}
7790
#else
78-
fastgltf::GltfDataBuffer data;
79-
{
80-
ZoneScopedN("Load file data");
81-
data.loadFromFile(scene_path);
82-
}
91+
92+
auto data = fastgltf::GltfDataBuffer::FromPath(scene_path);
93+
8394
#endif
84-
std::unique_ptr<fastgltf::glTF> gltf;
85-
{
86-
ZoneScopedN("Parse glTF");
87-
if (scene_path.extension() == ".gltf") {
88-
gltf = parser.loadGLTF(&data, scene_path.parent_path(), fastgltf::Options::LoadExternalBuffers);
89-
} else if (scene_path.extension() == ".glb") {
90-
gltf = parser.loadBinaryGLTF(&data, scene_path.parent_path(), fastgltf::Options::LoadGLBBuffers);
91-
}
92-
}
93-
if (parser.getError() != fastgltf::Error::None) {
94-
logger->error("Could not load scene {}: {}", scene_path.string(), magic_enum::enum_name(parser.getError()));
95-
return;
96-
}
95+
auto gltf = parser.loadGltf(data.get(), scene_path.parent_path(), fastgltf::Options::LoadExternalBuffers);
9796

98-
const auto parse_error = gltf->parse(fastgltf::Category::All & ~(fastgltf::Category::Images));
99-
if (parse_error != fastgltf::Error::None) {
100-
logger->error("Could not parse glTF file {}: {}", scene_path.string(), magic_enum::enum_name(parse_error));
97+
if(gltf.error() != fastgltf::Error::None) {
98+
logger->error("Could not load scene {}: {}", scene_path.string(), magic_enum::enum_name(gltf.error()));
10199
return;
102100
}
103101

104102
logger->info("Beginning import of scene {}", scene_path.string());
105103

106-
auto imported_model = GltfModel{scene_path, gltf->getParsedAsset(), *scene_renderer};
104+
auto imported_model = GltfModel{scene_path, std::move(gltf.get()), *scene_renderer};
107105
imported_model.add_to_scene(*scene);
108106

109107
logger->info("Loaded scene {}", scene_path.string());
@@ -154,7 +152,7 @@ void Application::update_player_location(const glm::vec3& movement_axis) const {
154152
}
155153

156154
void Application::update_player_rotation(const glm::vec2& rotation_input) const {
157-
if (!flycam_enabled) {
155+
if(!flycam_enabled) {
158156
scene_renderer->rotate_player(0.f, 0.f);
159157
return;
160158
}
@@ -164,7 +162,9 @@ void Application::update_player_rotation(const glm::vec2& rotation_input) const
164162
scene_renderer->rotate_player(rotation.y, rotation.x);
165163
}
166164

167-
SceneRenderer& Application::get_renderer() const { return *scene_renderer; }
165+
SceneRenderer& Application::get_renderer() const {
166+
return *scene_renderer;
167+
}
168168

169169
void Application::update_delta_time() {
170170
const auto frame_start_time = std::chrono::high_resolution_clock::now();

0 commit comments

Comments
 (0)