|
@@ -34,11 +34,11 @@ enum class PrecompiledEntryKind : u32 {
|
|
|
Dump,
|
|
Dump,
|
|
|
};
|
|
};
|
|
|
|
|
|
|
|
-constexpr u32 NativeVersion = 2;
|
|
|
|
|
|
|
+constexpr u32 NativeVersion = 3;
|
|
|
|
|
|
|
|
// Making sure sizes doesn't change by accident
|
|
// Making sure sizes doesn't change by accident
|
|
|
-static_assert(sizeof(BaseBindings) == 12);
|
|
|
|
|
-static_assert(sizeof(ShaderDiskCacheUsage) == 32);
|
|
|
|
|
|
|
+static_assert(sizeof(BaseBindings) == 16);
|
|
|
|
|
+static_assert(sizeof(ShaderDiskCacheUsage) == 40);
|
|
|
|
|
|
|
|
namespace {
|
|
namespace {
|
|
|
|
|
|
|
@@ -285,8 +285,7 @@ std::optional<ShaderDiskCacheDecompiled> ShaderDiskCacheOpenGL::LoadDecompiledEn
|
|
|
if (!LoadObjectFromPrecompiled(code_size)) {
|
|
if (!LoadObjectFromPrecompiled(code_size)) {
|
|
|
return {};
|
|
return {};
|
|
|
}
|
|
}
|
|
|
-
|
|
|
|
|
- std::string code(code_size, '\0');
|
|
|
|
|
|
|
+ std::vector<u8> code(code_size);
|
|
|
if (!LoadArrayFromPrecompiled(code.data(), code.size())) {
|
|
if (!LoadArrayFromPrecompiled(code.data(), code.size())) {
|
|
|
return {};
|
|
return {};
|
|
|
}
|
|
}
|
|
@@ -298,7 +297,6 @@ std::optional<ShaderDiskCacheDecompiled> ShaderDiskCacheOpenGL::LoadDecompiledEn
|
|
|
if (!LoadObjectFromPrecompiled(const_buffers_count)) {
|
|
if (!LoadObjectFromPrecompiled(const_buffers_count)) {
|
|
|
return {};
|
|
return {};
|
|
|
}
|
|
}
|
|
|
-
|
|
|
|
|
for (u32 i = 0; i < const_buffers_count; ++i) {
|
|
for (u32 i = 0; i < const_buffers_count; ++i) {
|
|
|
u32 max_offset{};
|
|
u32 max_offset{};
|
|
|
u32 index{};
|
|
u32 index{};
|
|
@@ -314,7 +312,6 @@ std::optional<ShaderDiskCacheDecompiled> ShaderDiskCacheOpenGL::LoadDecompiledEn
|
|
|
if (!LoadObjectFromPrecompiled(samplers_count)) {
|
|
if (!LoadObjectFromPrecompiled(samplers_count)) {
|
|
|
return {};
|
|
return {};
|
|
|
}
|
|
}
|
|
|
-
|
|
|
|
|
for (u32 i = 0; i < samplers_count; ++i) {
|
|
for (u32 i = 0; i < samplers_count; ++i) {
|
|
|
u64 offset{};
|
|
u64 offset{};
|
|
|
u64 index{};
|
|
u64 index{};
|
|
@@ -332,11 +329,28 @@ std::optional<ShaderDiskCacheDecompiled> ShaderDiskCacheOpenGL::LoadDecompiledEn
|
|
|
static_cast<Tegra::Shader::TextureType>(type), is_array, is_shadow, is_bindless);
|
|
static_cast<Tegra::Shader::TextureType>(type), is_array, is_shadow, is_bindless);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ u32 images_count{};
|
|
|
|
|
+ if (!LoadObjectFromPrecompiled(images_count)) {
|
|
|
|
|
+ return {};
|
|
|
|
|
+ }
|
|
|
|
|
+ for (u32 i = 0; i < images_count; ++i) {
|
|
|
|
|
+ u64 offset{};
|
|
|
|
|
+ u64 index{};
|
|
|
|
|
+ u32 type{};
|
|
|
|
|
+ u8 is_bindless{};
|
|
|
|
|
+ if (!LoadObjectFromPrecompiled(offset) || !LoadObjectFromPrecompiled(index) ||
|
|
|
|
|
+ !LoadObjectFromPrecompiled(type) || !LoadObjectFromPrecompiled(is_bindless)) {
|
|
|
|
|
+ return {};
|
|
|
|
|
+ }
|
|
|
|
|
+ entry.entries.images.emplace_back(
|
|
|
|
|
+ static_cast<std::size_t>(offset), static_cast<std::size_t>(index),
|
|
|
|
|
+ static_cast<Tegra::Shader::ImageType>(type), is_bindless != 0);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
u32 global_memory_count{};
|
|
u32 global_memory_count{};
|
|
|
if (!LoadObjectFromPrecompiled(global_memory_count)) {
|
|
if (!LoadObjectFromPrecompiled(global_memory_count)) {
|
|
|
return {};
|
|
return {};
|
|
|
}
|
|
}
|
|
|
-
|
|
|
|
|
for (u32 i = 0; i < global_memory_count; ++i) {
|
|
for (u32 i = 0; i < global_memory_count; ++i) {
|
|
|
u32 cbuf_index{};
|
|
u32 cbuf_index{};
|
|
|
u32 cbuf_offset{};
|
|
u32 cbuf_offset{};
|
|
@@ -360,7 +374,6 @@ std::optional<ShaderDiskCacheDecompiled> ShaderDiskCacheOpenGL::LoadDecompiledEn
|
|
|
if (!LoadObjectFromPrecompiled(shader_length)) {
|
|
if (!LoadObjectFromPrecompiled(shader_length)) {
|
|
|
return {};
|
|
return {};
|
|
|
}
|
|
}
|
|
|
-
|
|
|
|
|
entry.entries.shader_length = static_cast<std::size_t>(shader_length);
|
|
entry.entries.shader_length = static_cast<std::size_t>(shader_length);
|
|
|
|
|
|
|
|
return entry;
|
|
return entry;
|
|
@@ -400,6 +413,18 @@ bool ShaderDiskCacheOpenGL::SaveDecompiledFile(u64 unique_identifier, const std:
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ if (!SaveObjectToPrecompiled(static_cast<u32>(entries.images.size()))) {
|
|
|
|
|
+ return false;
|
|
|
|
|
+ }
|
|
|
|
|
+ for (const auto& image : entries.images) {
|
|
|
|
|
+ if (!SaveObjectToPrecompiled(static_cast<u64>(image.GetOffset())) ||
|
|
|
|
|
+ !SaveObjectToPrecompiled(static_cast<u64>(image.GetIndex())) ||
|
|
|
|
|
+ !SaveObjectToPrecompiled(static_cast<u32>(image.GetType())) ||
|
|
|
|
|
+ !SaveObjectToPrecompiled(static_cast<u8>(image.IsBindless() ? 1 : 0))) {
|
|
|
|
|
+ return false;
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
if (!SaveObjectToPrecompiled(static_cast<u32>(entries.global_memory_entries.size()))) {
|
|
if (!SaveObjectToPrecompiled(static_cast<u32>(entries.global_memory_entries.size()))) {
|
|
|
return false;
|
|
return false;
|
|
|
}
|
|
}
|