Skip to content

Commit f38f43b

Browse files
author
Pier-Olivier Boulianne
committed
WIP: builds, still need a few things to work
1 parent 3f7ccfa commit f38f43b

114 files changed

Lines changed: 7104 additions & 73 deletions

File tree

Some content is hidden

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

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,3 +25,4 @@ Editor/Resources/Scripts/ScriptCore.dll
2525
Editor/Resources/Scripts/ScriptCore.pdb
2626
Editor/Resources/Scripts/Lux-ScriptCore.dll
2727
Editor/Resources/Scripts/Lux-ScriptCore.pdb
28+
Sandbox/Resources/Cache

Core/Source/Lux/Core/FileSystem.cpp

Lines changed: 0 additions & 33 deletions
This file was deleted.

Core/Source/Lux/Core/FileSystem.h

Lines changed: 0 additions & 14 deletions
This file was deleted.
Lines changed: 230 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,230 @@
1+
#include "lpch.h"
2+
#include "ShaderPack.h"
3+
4+
#include "Lux/Core/Hash.h"
5+
6+
#include "Lux/Serialization/FileStream.h"
7+
8+
#include "Lux/Platform/Vulkan/VulkanShader.h"
9+
10+
namespace Lux {
11+
12+
namespace Utils {
13+
14+
enum class ShaderStage : uint8_t
15+
{
16+
None = 0, Vertex = 1, Fragment = 2, Compute = 3
17+
};
18+
19+
VkShaderStageFlagBits ShaderStageToVkShaderStage(ShaderStage stage)
20+
{
21+
switch (stage)
22+
{
23+
case ShaderStage::Vertex: return VK_SHADER_STAGE_VERTEX_BIT;
24+
case ShaderStage::Fragment: return VK_SHADER_STAGE_FRAGMENT_BIT;
25+
case ShaderStage::Compute: return VK_SHADER_STAGE_COMPUTE_BIT;
26+
}
27+
28+
LUX_CORE_VERIFY(false);
29+
return (VkShaderStageFlagBits)0;
30+
}
31+
32+
ShaderStage ShaderStageFromVkShaderStage(VkShaderStageFlagBits stage)
33+
{
34+
switch (stage)
35+
{
36+
case VK_SHADER_STAGE_VERTEX_BIT: return ShaderStage::Vertex;
37+
case VK_SHADER_STAGE_FRAGMENT_BIT: return ShaderStage::Fragment;
38+
case VK_SHADER_STAGE_COMPUTE_BIT: return ShaderStage::Compute;
39+
}
40+
41+
LUX_CORE_VERIFY(false);
42+
return (ShaderStage)0;
43+
}
44+
45+
}
46+
47+
ShaderPack::ShaderPack(const std::filesystem::path& path)
48+
: m_Path(path)
49+
{
50+
// Read index
51+
FileStreamReader serializer(path);
52+
if (!serializer)
53+
return;
54+
55+
serializer.ReadRaw(m_File.Header);
56+
if (memcmp(m_File.Header.HEADER, "HZSP", 4) != 0)
57+
return;
58+
59+
m_Loaded = true;
60+
for (uint32_t i = 0; i < m_File.Header.ShaderProgramCount; i++)
61+
{
62+
uint32_t key;
63+
serializer.ReadRaw(key);
64+
auto& shaderProgramInfo = m_File.Index.ShaderPrograms[key];
65+
serializer.ReadRaw(shaderProgramInfo.ReflectionDataOffset);
66+
serializer.ReadArray(shaderProgramInfo.ModuleIndices);
67+
}
68+
69+
auto sp = serializer.GetStreamPosition();
70+
serializer.ReadArray(m_File.Index.ShaderModules, m_File.Header.ShaderModuleCount);
71+
}
72+
73+
bool ShaderPack::Contains(std::string_view name) const
74+
{
75+
return m_File.Index.ShaderPrograms.find(Hash::GenerateFNVHash(name)) != m_File.Index.ShaderPrograms.end();
76+
}
77+
78+
Ref<Shader> ShaderPack::LoadShader(std::string_view name)
79+
{
80+
uint32_t nameHash = Hash::GenerateFNVHash(name);
81+
LUX_CORE_VERIFY(Contains(name));
82+
83+
const auto& shaderProgramInfo = m_File.Index.ShaderPrograms.at(nameHash);
84+
85+
FileStreamReader serializer(m_Path);
86+
87+
serializer.SetStreamPosition(shaderProgramInfo.ReflectionDataOffset);
88+
89+
// Debug only
90+
std::string shaderName;
91+
{
92+
std::string path(name);
93+
size_t found = path.find_last_of("/\\");
94+
shaderName = found != std::string::npos ? path.substr(found + 1) : path;
95+
found = shaderName.find_last_of('.');
96+
shaderName = found != std::string::npos ? shaderName.substr(0, found) : name;
97+
}
98+
99+
Ref<VulkanShader> vulkanShader = Ref<VulkanShader>::Create();
100+
vulkanShader->m_Name = shaderName;
101+
vulkanShader->m_AssetPath = name;
102+
//vulkanShader->TryReadReflectionData(&serializer);
103+
// vulkanShader->m_DisableOptimization =
104+
105+
std::map<nvrhi::ShaderType, std::vector<uint32_t>> shaderModules;
106+
for (uint32_t index : shaderProgramInfo.ModuleIndices)
107+
{
108+
const auto& info = m_File.Index.ShaderModules[index];
109+
auto& moduleData = shaderModules[info.Stage];
110+
111+
serializer.SetStreamPosition(info.PackedOffset);
112+
serializer.ReadArray(moduleData, (uint32_t)info.PackedSize);
113+
}
114+
115+
serializer.SetStreamPosition(shaderProgramInfo.ReflectionDataOffset);
116+
vulkanShader->TryReadReflectionData(&serializer);
117+
118+
vulkanShader->LoadAndCreateShaders(shaderModules);
119+
vulkanShader->CreateDescriptors();
120+
121+
//Renderer::AcknowledgeParsedGlobalMacros(compiler->GetAcknowledgedMacros(), vulkanShader);
122+
//Renderer::OnShaderReloaded(vulkanShader->GetHash());
123+
return vulkanShader;
124+
}
125+
126+
Ref<ShaderPack> ShaderPack::CreateFromLibrary(Ref<ShaderLibrary> shaderLibrary, const std::filesystem::path& path)
127+
{
128+
Ref<ShaderPack> shaderPack = Ref<ShaderPack>::Create();
129+
130+
const auto& shaderMap = shaderLibrary->GetShaders();
131+
auto& shaderPackFile = shaderPack->m_File;
132+
133+
shaderPackFile.Header.Version = 1;
134+
shaderPackFile.Header.ShaderProgramCount = (uint32_t)shaderMap.size();
135+
shaderPackFile.Header.ShaderModuleCount = 0;
136+
137+
// Determine number of modules (per shader)
138+
// NOTE(Yan): this currently doesn't care about duplicated modules, but it should (eventually, not that important atm)
139+
uint32_t shaderModuleIndex = 0;
140+
uint32_t shaderModuleIndexArraySize = 0;
141+
for (const auto& [name, shader] : shaderMap)
142+
{
143+
Ref<VulkanShader> vulkanShader = shader.As<VulkanShader>();
144+
const auto& shaderData = vulkanShader->m_ShaderData;
145+
146+
shaderPackFile.Header.ShaderModuleCount += (uint32_t)shaderData.size();
147+
auto& shaderProgramInfo = shaderPackFile.Index.ShaderPrograms[(uint32_t)vulkanShader->GetHash()];
148+
149+
for (int i = 0; i < (int)shaderData.size(); i++)
150+
shaderProgramInfo.ModuleIndices.emplace_back(shaderModuleIndex++);
151+
152+
shaderModuleIndexArraySize += sizeof(uint32_t); // size
153+
shaderModuleIndexArraySize += (uint32_t)shaderData.size() * sizeof(uint32_t); // indices
154+
}
155+
156+
uint32_t shaderProgramIndexSize = shaderPackFile.Header.ShaderProgramCount *
157+
(sizeof(std::map<uint32_t, ShaderPackFile::ShaderProgramInfo>::key_type) + sizeof(ShaderPackFile::ShaderProgramInfo::ReflectionDataOffset))
158+
+ shaderModuleIndexArraySize;
159+
160+
FileStreamWriter serializer(path);
161+
162+
// Write header
163+
serializer.WriteRaw<ShaderPackFile::FileHeader>(shaderPackFile.Header);
164+
165+
// ===============
166+
// Write index
167+
// ===============
168+
// Write dummy data for shader programs
169+
uint64_t shaderProgramIndexPos = serializer.GetStreamPosition();
170+
serializer.WriteZero(shaderProgramIndexSize);
171+
172+
// Write dummy data for shader modules
173+
uint64_t shaderModuleIndexPos = serializer.GetStreamPosition();
174+
serializer.WriteZero(shaderPackFile.Header.ShaderModuleCount * sizeof(ShaderPackFile::ShaderModuleInfo));
175+
for (const auto& [name, shader] : shaderMap)
176+
{
177+
Ref<VulkanShader> vulkanShader = shader.As<VulkanShader>();
178+
179+
// Serialize reflection data
180+
shaderPackFile.Index.ShaderPrograms[(uint32_t)vulkanShader->GetHash()].ReflectionDataOffset = serializer.GetStreamPosition();
181+
vulkanShader->SerializeReflectionData(&serializer);
182+
183+
// Serialize SPIR-V data
184+
const auto& shaderData = vulkanShader->m_ShaderData;
185+
for (const auto& [stage, data] : shaderData)
186+
{
187+
auto& indexShaderModule = shaderPackFile.Index.ShaderModules.emplace_back();
188+
indexShaderModule.PackedOffset = serializer.GetStreamPosition();
189+
indexShaderModule.PackedSize = data.size();
190+
indexShaderModule.Stage = stage;
191+
192+
serializer.WriteArray(data, false);
193+
}
194+
}
195+
196+
// Write program index
197+
serializer.SetStreamPosition(shaderProgramIndexPos);
198+
uint64_t begin = shaderProgramIndexPos;
199+
for (const auto& [name, programInfo] : shaderPackFile.Index.ShaderPrograms)
200+
{
201+
serializer.WriteRaw(name);
202+
serializer.WriteRaw(programInfo.ReflectionDataOffset);
203+
serializer.WriteArray(programInfo.ModuleIndices);
204+
}
205+
uint64_t end = serializer.GetStreamPosition();
206+
uint64_t s = end - begin;
207+
208+
// Write module index
209+
serializer.SetStreamPosition(shaderModuleIndexPos);
210+
serializer.WriteArray(shaderPackFile.Index.ShaderModules, false);
211+
212+
return shaderPack;
213+
}
214+
215+
#if 0
216+
void ShaderPack::CompileAndStoreShader(std::string_view shaderSourcePath)
217+
{
218+
uint32_t hash = Hash::GenerateFNVHash(shaderSourcePath);
219+
m_File.Index.ShaderPrograms[hash];
220+
221+
BinarySerializer serializer(m_File);
222+
serializer.SerializeToFile(m_Path);
223+
}
224+
225+
void ShaderPack::AddShader(Ref<Shader> shader)
226+
{
227+
}
228+
#endif
229+
230+
}

Core/Source/Lux/Scripting/ScriptEngine.cpp

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,12 +15,13 @@
1515
#include "Lux/Core/Application.h"
1616
#include "Lux/Core/Timer.h"
1717
#include "Lux/Core/Buffer.h"
18-
#include "Lux/Core/FileSystem.h"
1918

2019
#include "Lux/Project/Project.h"
2120

2221
#include <format>
2322

23+
#include "Lux/Utilities/FileSystem.h"
24+
2425
namespace Lux {
2526

2627
static std::unordered_map<std::string, ScriptFieldType> s_ScriptFieldTypeMap =
@@ -48,7 +49,7 @@ namespace Lux {
4849

4950
static MonoAssembly* LoadMonoAssembly(const std::filesystem::path& assemblyPath, bool loadPDB = false)
5051
{
51-
ScopedBuffer fileData = FileSystem::ReadFileBinary(assemblyPath);
52+
ScopedBuffer fileData = FileSystem::ReadBytes(assemblyPath);
5253

5354
// NOTE: We can't use this image for anything other than loading the assembly because this image doesn't have a reference to the assembly
5455
MonoImageOpenStatus status;
@@ -68,7 +69,7 @@ namespace Lux {
6869

6970
if (std::filesystem::exists(pdbPath))
7071
{
71-
ScopedBuffer pdbFileData = FileSystem::ReadFileBinary(pdbPath);
72+
ScopedBuffer pdbFileData = FileSystem::ReadBytes(pdbPath);
7273
mono_debug_open_image_from_memory(image, pdbFileData.As<const mono_byte>(), pdbFileData.Size());
7374
LUX_CORE_INFO("Loaded PDB {}", pdbPath);
7475
}

0 commit comments

Comments
 (0)