shader: parse vertex metadata once when a shader is mapped

This commit is contained in:
nmzik committed 2026-10-24 05:44:46 +02:00
1 parent dbc7b8b2ff
commit 8291cfeb04
6 files changed
+44 -44

No files matched your search

+17 -9
View File
@@ -40,9 +40,15 @@
namespace Libs::Graphics {
// A mapped shader and its vertex metadata, parsed once when it is mapped.
struct ShaderMapData: ShaderMappedData {
ShaderVertexMetadata vertex;
const char* vertex_error = nullptr;
};
struct ShaderMapEntry {
ShaderMappedData data;
uint64_t hash;
ShaderMapData data;
uint64_t hash;
};
static std::unique_ptr<std::unordered_map<uint64_t, ShaderMapEntry>> g_shader_map;
@@ -64,8 +70,11 @@ void ShaderMapUserData(uint64_t addr, const ShaderMappedData& data) {
addr, data.code_size_bytes);
}
const auto hash = XXH3_64bits(reinterpret_cast<const void*>(addr), data.code_size_bytes);
ShaderMapData mapped {data};
mapped.vertex_error =
ShaderReadVertexMetadata(data, HW::UserSgprInfo::SGPRS_MAX, mapped.vertex);
std::scoped_lock lock(g_shader_map_mutex);
(*g_shader_map)[addr] = {data, hash};
(*g_shader_map)[addr] = {mapped, hash};
}
static ShaderMapEntry ShaderGetMappedData(uint64_t addr, const char* label) {
@@ -261,8 +270,8 @@ static uint32_t ShaderCalcPsSystemInputBase(const HW::ShaderRegisters& regs) {
static bool ShaderGetStaticVertexInputInfo(uint64_t shader_addr, const HW::UserSgprInfo& user_sgpr,
uint32_t user_sgpr_num, const HW::ShaderRegisters& sh,
const ShaderMappedData& data,
ShaderVertexInputInfo& info) {
const ShaderMapData& data,
ShaderVertexInputInfo& info) {
KYTY_PROFILER_FUNCTION();
info = {};
@@ -277,13 +286,12 @@ static bool ShaderGetStaticVertexInputInfo(uint64_t shader_addr, const HW::UserS
" user_sgpr_num=%u\n",
shader_addr, user_sgpr_num);
}
ShaderVertexMetadata metadata;
std::string metadata_error;
if (!ShaderReadVertexMetadata(data, HW::UserSgprInfo::SGPRS_MAX, metadata, &metadata_error)) {
if (data.vertex_error != nullptr) {
LOGF("ShaderGetVertexInputInfo(): invalid AGC metadata shader=0x%016" PRIx64 ": %s\n",
shader_addr, metadata_error.c_str());
shader_addr, data.vertex_error);
return false;
}
const auto& metadata = data.vertex;
if (metadata.vertex_attrib_reg >= 0) {
info.fetch_external = false;