video_core: shaders hash switched to one from binary header

This commit is contained in:
psucien 2024-06-15 23:24:32 +02:00
parent 37cbdad57b
commit fd8ceacef7
4 changed files with 26 additions and 12 deletions

View file

@ -49,7 +49,9 @@ struct Liverpool {
using UserData = std::array<u32, NumShaderUserData>;
struct BinaryInfo {
u8 signature[7];
static constexpr u8 signature_ref[] = {0x4f, 0x72, 0x62, 0x53, 0x68, 0x64, 0x72}; // OrbShdr
std::array<u8, sizeof(signature_ref)> signature;
u8 version;
u32 pssl_or_cg : 1;
u32 cached : 1;
@ -65,6 +67,11 @@ struct Liverpool {
u8 reserved3;
u64 shader_hash;
u32 crc32;
bool Valid() const {
return shader_hash && crc32 &&
(std::memcmp(signature.data(), signature_ref, sizeof(signature_ref)) == 0);
}
};
struct ShaderProgram {
@ -134,6 +141,14 @@ struct Liverpool {
}
};
template <typename Shader>
static constexpr auto* GetBinaryInfo(const Shader& sh) {
const auto* code = sh.template Address<u32>();
const auto* bininfo = std::bit_cast<const BinaryInfo*>(code + (code[1] + 1) * 2);
ASSERT_MSG(bininfo->Valid(), "Invalid shader binary header");
return bininfo;
}
union PsInputControl {
u32 raw;
BitField<0, 5, u32> input_offset;

View file

@ -71,7 +71,7 @@ public:
}
[[nodiscard]] bool IsEmbeddedVs() const noexcept {
static constexpr size_t EmbeddedVsHash = 0x59c556606a027efd;
static constexpr size_t EmbeddedVsHash = 0x9b2da5cf47f8c29f;
return key.stage_hashes[0] == EmbeddedVsHash;
}

View file

@ -1,7 +1,6 @@
// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
#include <xxhash.h>
#include "common/config.h"
#include "common/io_file.h"
#include "common/path_util.h"
@ -74,8 +73,8 @@ const GraphicsPipeline* PipelineCache::GetGraphicsPipeline() {
const ComputePipeline* PipelineCache::GetComputePipeline() {
const auto& cs_pgm = liverpool->regs.cs_program;
ASSERT(cs_pgm.Address() != nullptr);
const auto code = cs_pgm.Code();
compute_key = XXH3_64bits(code.data(), code.size_bytes());
const auto* bininfo = Liverpool::GetBinaryInfo(cs_pgm);
compute_key = bininfo->shader_hash;
const auto [it, is_new] = compute_pipelines.try_emplace(compute_key);
if (is_new) {
it.value() = CreateComputePipeline();
@ -147,8 +146,8 @@ void PipelineCache::RefreshGraphicsKey() {
key.stage_hashes[i] = 0;
continue;
}
const auto code = pgm->Code();
key.stage_hashes[i] = XXH3_64bits(code.data(), code.size_bytes());
const auto* bininfo = Liverpool::GetBinaryInfo(*pgm);
key.stage_hashes[i] = bininfo->shader_hash;
}
}
@ -243,7 +242,7 @@ void PipelineCache::DumpShader(std::span<const u32> code, u64 hash, Shader::Stag
if (!std::filesystem::exists(dump_dir)) {
std::filesystem::create_directories(dump_dir);
}
const auto filename = fmt::format("{}_{:#X}.{}", stage, hash, ext);
const auto filename = fmt::format("{}_{:#018x}.{}", stage, hash, ext);
const auto file = IOFile{dump_dir / filename, FileAccessMode::Write};
file.WriteSpan(code);
}