forked from suyu/suyu
gl_shader_disk_cache: Special-case boolean handling
Booleans don't have a guaranteed size, but we still want to have them integrate into the disk cache system without needing to actually use a different type. We can do this by supplying non-template overloads for the bool type. Non-template overloads always have precedence during function resolution, so this is safe to provide. This gets rid of the need to smatter ternary conditionals, as well as the need to use u8 types to store the value in.
This commit is contained in:
parent
fb85d5670d
commit
f417be9d3b
2 changed files with 37 additions and 24 deletions
|
@ -303,12 +303,12 @@ std::optional<ShaderDiskCacheDecompiled> ShaderDiskCacheOpenGL::LoadDecompiledEn
|
||||||
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{};
|
||||||
u8 is_indirect{};
|
bool is_indirect{};
|
||||||
if (!LoadObjectFromPrecompiled(max_offset) || !LoadObjectFromPrecompiled(index) ||
|
if (!LoadObjectFromPrecompiled(max_offset) || !LoadObjectFromPrecompiled(index) ||
|
||||||
!LoadObjectFromPrecompiled(is_indirect)) {
|
!LoadObjectFromPrecompiled(is_indirect)) {
|
||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
entry.entries.const_buffers.emplace_back(max_offset, is_indirect != 0, index);
|
entry.entries.const_buffers.emplace_back(max_offset, is_indirect, index);
|
||||||
}
|
}
|
||||||
|
|
||||||
u32 samplers_count{};
|
u32 samplers_count{};
|
||||||
|
@ -320,18 +320,17 @@ std::optional<ShaderDiskCacheDecompiled> ShaderDiskCacheOpenGL::LoadDecompiledEn
|
||||||
u64 offset{};
|
u64 offset{};
|
||||||
u64 index{};
|
u64 index{};
|
||||||
u32 type{};
|
u32 type{};
|
||||||
u8 is_array{};
|
bool is_array{};
|
||||||
u8 is_shadow{};
|
bool is_shadow{};
|
||||||
u8 is_bindless{};
|
bool is_bindless{};
|
||||||
if (!LoadObjectFromPrecompiled(offset) || !LoadObjectFromPrecompiled(index) ||
|
if (!LoadObjectFromPrecompiled(offset) || !LoadObjectFromPrecompiled(index) ||
|
||||||
!LoadObjectFromPrecompiled(type) || !LoadObjectFromPrecompiled(is_array) ||
|
!LoadObjectFromPrecompiled(type) || !LoadObjectFromPrecompiled(is_array) ||
|
||||||
!LoadObjectFromPrecompiled(is_shadow) || !LoadObjectFromPrecompiled(is_bindless)) {
|
!LoadObjectFromPrecompiled(is_shadow) || !LoadObjectFromPrecompiled(is_bindless)) {
|
||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
entry.entries.samplers.emplace_back(static_cast<std::size_t>(offset),
|
entry.entries.samplers.emplace_back(
|
||||||
static_cast<std::size_t>(index),
|
static_cast<std::size_t>(offset), static_cast<std::size_t>(index),
|
||||||
static_cast<Tegra::Shader::TextureType>(type),
|
static_cast<Tegra::Shader::TextureType>(type), is_array, is_shadow, is_bindless);
|
||||||
is_array != 0, is_shadow != 0, is_bindless != 0);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
u32 global_memory_count{};
|
u32 global_memory_count{};
|
||||||
|
@ -342,21 +341,20 @@ std::optional<ShaderDiskCacheDecompiled> ShaderDiskCacheOpenGL::LoadDecompiledEn
|
||||||
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{};
|
||||||
u8 is_read{};
|
bool is_read{};
|
||||||
u8 is_written{};
|
bool is_written{};
|
||||||
if (!LoadObjectFromPrecompiled(cbuf_index) || !LoadObjectFromPrecompiled(cbuf_offset) ||
|
if (!LoadObjectFromPrecompiled(cbuf_index) || !LoadObjectFromPrecompiled(cbuf_offset) ||
|
||||||
!LoadObjectFromPrecompiled(is_read) || !LoadObjectFromPrecompiled(is_written)) {
|
!LoadObjectFromPrecompiled(is_read) || !LoadObjectFromPrecompiled(is_written)) {
|
||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
entry.entries.global_memory_entries.emplace_back(cbuf_index, cbuf_offset, is_read != 0,
|
entry.entries.global_memory_entries.emplace_back(cbuf_index, cbuf_offset, is_read,
|
||||||
is_written != 0);
|
is_written);
|
||||||
}
|
}
|
||||||
|
|
||||||
for (auto& clip_distance : entry.entries.clip_distances) {
|
for (auto& clip_distance : entry.entries.clip_distances) {
|
||||||
u8 clip_distance_raw{};
|
if (!LoadObjectFromPrecompiled(clip_distance)) {
|
||||||
if (!LoadObjectFromPrecompiled(clip_distance_raw))
|
|
||||||
return {};
|
return {};
|
||||||
clip_distance = clip_distance_raw != 0;
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
u64 shader_length{};
|
u64 shader_length{};
|
||||||
|
@ -384,7 +382,7 @@ bool ShaderDiskCacheOpenGL::SaveDecompiledFile(u64 unique_identifier, const std:
|
||||||
for (const auto& cbuf : entries.const_buffers) {
|
for (const auto& cbuf : entries.const_buffers) {
|
||||||
if (!SaveObjectToPrecompiled(static_cast<u32>(cbuf.GetMaxOffset())) ||
|
if (!SaveObjectToPrecompiled(static_cast<u32>(cbuf.GetMaxOffset())) ||
|
||||||
!SaveObjectToPrecompiled(static_cast<u32>(cbuf.GetIndex())) ||
|
!SaveObjectToPrecompiled(static_cast<u32>(cbuf.GetIndex())) ||
|
||||||
!SaveObjectToPrecompiled(static_cast<u8>(cbuf.IsIndirect() ? 1 : 0))) {
|
!SaveObjectToPrecompiled(cbuf.IsIndirect())) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -396,9 +394,9 @@ bool ShaderDiskCacheOpenGL::SaveDecompiledFile(u64 unique_identifier, const std:
|
||||||
if (!SaveObjectToPrecompiled(static_cast<u64>(sampler.GetOffset())) ||
|
if (!SaveObjectToPrecompiled(static_cast<u64>(sampler.GetOffset())) ||
|
||||||
!SaveObjectToPrecompiled(static_cast<u64>(sampler.GetIndex())) ||
|
!SaveObjectToPrecompiled(static_cast<u64>(sampler.GetIndex())) ||
|
||||||
!SaveObjectToPrecompiled(static_cast<u32>(sampler.GetType())) ||
|
!SaveObjectToPrecompiled(static_cast<u32>(sampler.GetType())) ||
|
||||||
!SaveObjectToPrecompiled(static_cast<u8>(sampler.IsArray() ? 1 : 0)) ||
|
!SaveObjectToPrecompiled(sampler.IsArray()) ||
|
||||||
!SaveObjectToPrecompiled(static_cast<u8>(sampler.IsShadow() ? 1 : 0)) ||
|
!SaveObjectToPrecompiled(sampler.IsShadow()) ||
|
||||||
!SaveObjectToPrecompiled(static_cast<u8>(sampler.IsBindless() ? 1 : 0))) {
|
!SaveObjectToPrecompiled(sampler.IsBindless())) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -409,14 +407,13 @@ bool ShaderDiskCacheOpenGL::SaveDecompiledFile(u64 unique_identifier, const std:
|
||||||
for (const auto& gmem : entries.global_memory_entries) {
|
for (const auto& gmem : entries.global_memory_entries) {
|
||||||
if (!SaveObjectToPrecompiled(static_cast<u32>(gmem.GetCbufIndex())) ||
|
if (!SaveObjectToPrecompiled(static_cast<u32>(gmem.GetCbufIndex())) ||
|
||||||
!SaveObjectToPrecompiled(static_cast<u32>(gmem.GetCbufOffset())) ||
|
!SaveObjectToPrecompiled(static_cast<u32>(gmem.GetCbufOffset())) ||
|
||||||
!SaveObjectToPrecompiled(static_cast<u8>(gmem.IsRead() ? 1 : 0)) ||
|
!SaveObjectToPrecompiled(gmem.IsRead()) || !SaveObjectToPrecompiled(gmem.IsWritten())) {
|
||||||
!SaveObjectToPrecompiled(static_cast<u8>(gmem.IsWritten() ? 1 : 0))) {
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for (const bool clip_distance : entries.clip_distances) {
|
for (const bool clip_distance : entries.clip_distances) {
|
||||||
if (!SaveObjectToPrecompiled(static_cast<u8>(clip_distance ? 1 : 0))) {
|
if (!SaveObjectToPrecompiled(clip_distance)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -259,12 +259,28 @@ private:
|
||||||
return SaveArrayToPrecompiled(&object, 1);
|
return SaveArrayToPrecompiled(&object, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool SaveObjectToPrecompiled(bool object) {
|
||||||
|
const auto value = static_cast<u8>(object);
|
||||||
|
return SaveArrayToPrecompiled(&value, 1);
|
||||||
|
}
|
||||||
|
|
||||||
template <typename T>
|
template <typename T>
|
||||||
bool LoadObjectFromPrecompiled(T& object) {
|
bool LoadObjectFromPrecompiled(T& object) {
|
||||||
return LoadArrayFromPrecompiled(&object, 1);
|
return LoadArrayFromPrecompiled(&object, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Copre system
|
bool LoadObjectFromPrecompiled(bool& object) {
|
||||||
|
u8 value;
|
||||||
|
const bool read_ok = LoadArrayFromPrecompiled(&value, 1);
|
||||||
|
if (!read_ok) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
object = value != 0;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Core system
|
||||||
Core::System& system;
|
Core::System& system;
|
||||||
// Stored transferable shaders
|
// Stored transferable shaders
|
||||||
std::map<u64, std::unordered_set<ShaderDiskCacheUsage>> transferable;
|
std::map<u64, std::unordered_set<ShaderDiskCacheUsage>> transferable;
|
||||||
|
|
Loading…
Reference in a new issue