mirror of
https://git.eden-emu.dev/eden-emu/eden
synced 2026-10-20 21:09:37 +02:00
[shader_recompiler] fix META_TABLE/NUM_ARGS table being duplicated per TU that included opcodes.h (#4180)
small oopsie; we dont need 6 copies of the same 22KB table (removes 5*22 = 110 KB worth of redundant stuff) this also enforces static on the types defined in the header so they arent memoized into a non-inlined value (aka. compiler just grabs value instead of well, yknow, assuming its a constant area) Signed-off-by: lizzie <lizzie@eden-emu.dev> Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/4180 Reviewed-by: MaranBr <maranbr@eden-emu.dev> Reviewed-by: CamilleLaVey <camillelavey99@gmail.com>
This commit is contained in:
parent
66b073ab8d
commit
072be286d1
2 changed files with 59 additions and 50 deletions
|
|
@ -1,3 +1,6 @@
|
||||||
|
// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
|
||||||
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
|
||||||
// SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project
|
// SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project
|
||||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
|
||||||
|
|
@ -5,6 +8,27 @@
|
||||||
|
|
||||||
namespace Shader::IR {
|
namespace Shader::IR {
|
||||||
|
|
||||||
|
namespace Detail {
|
||||||
|
|
||||||
|
OpcodeMeta META_TABLE[532] = {
|
||||||
|
#define OPCODE(name_token, type_token, ...) \
|
||||||
|
{ \
|
||||||
|
.name{#name_token}, \
|
||||||
|
.type = type_token, \
|
||||||
|
.arg_types{__VA_ARGS__}, \
|
||||||
|
},
|
||||||
|
#include "opcodes.inc"
|
||||||
|
#undef OPCODE
|
||||||
|
};
|
||||||
|
|
||||||
|
u8 NUM_ARGS[532] = {
|
||||||
|
#define OPCODE(name_token, type_token, ...) u8(CalculateNumArgsOf(Opcode::name_token)),
|
||||||
|
#include "opcodes.inc"
|
||||||
|
#undef OPCODE
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
std::string_view NameOf(Opcode op) {
|
std::string_view NameOf(Opcode op) {
|
||||||
return Detail::META_TABLE[static_cast<size_t>(op)].name;
|
return Detail::META_TABLE[static_cast<size_t>(op)].name;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
|
// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
|
||||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
|
||||||
// SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project
|
// SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project
|
||||||
|
|
@ -30,69 +30,54 @@ struct OpcodeMeta {
|
||||||
};
|
};
|
||||||
|
|
||||||
// using enum Type;
|
// using enum Type;
|
||||||
constexpr Type Void{Type::Void};
|
static constexpr Type Void{Type::Void};
|
||||||
constexpr Type Opaque{Type::Opaque};
|
static constexpr Type Opaque{Type::Opaque};
|
||||||
constexpr Type Reg{Type::Reg};
|
static constexpr Type Reg{Type::Reg};
|
||||||
constexpr Type Pred{Type::Pred};
|
static constexpr Type Pred{Type::Pred};
|
||||||
constexpr Type Attribute{Type::Attribute};
|
static constexpr Type Attribute{Type::Attribute};
|
||||||
constexpr Type Patch{Type::Patch};
|
static constexpr Type Patch{Type::Patch};
|
||||||
constexpr Type U1{Type::U1};
|
static constexpr Type U1{Type::U1};
|
||||||
constexpr Type U8{Type::U8};
|
static constexpr Type U8{Type::U8};
|
||||||
constexpr Type U16{Type::U16};
|
static constexpr Type U16{Type::U16};
|
||||||
constexpr Type U32{Type::U32};
|
static constexpr Type U32{Type::U32};
|
||||||
constexpr Type U64{Type::U64};
|
static constexpr Type U64{Type::U64};
|
||||||
constexpr Type F16{Type::F16};
|
static constexpr Type F16{Type::F16};
|
||||||
constexpr Type F32{Type::F32};
|
static constexpr Type F32{Type::F32};
|
||||||
constexpr Type F64{Type::F64};
|
static constexpr Type F64{Type::F64};
|
||||||
constexpr Type U32x2{Type::U32x2};
|
static constexpr Type U32x2{Type::U32x2};
|
||||||
constexpr Type U32x3{Type::U32x3};
|
static constexpr Type U32x3{Type::U32x3};
|
||||||
constexpr Type U32x4{Type::U32x4};
|
static constexpr Type U32x4{Type::U32x4};
|
||||||
constexpr Type F16x2{Type::F16x2};
|
static constexpr Type F16x2{Type::F16x2};
|
||||||
constexpr Type F16x3{Type::F16x3};
|
static constexpr Type F16x3{Type::F16x3};
|
||||||
constexpr Type F16x4{Type::F16x4};
|
static constexpr Type F16x4{Type::F16x4};
|
||||||
constexpr Type F32x2{Type::F32x2};
|
static constexpr Type F32x2{Type::F32x2};
|
||||||
constexpr Type F32x3{Type::F32x3};
|
static constexpr Type F32x3{Type::F32x3};
|
||||||
constexpr Type F32x4{Type::F32x4};
|
static constexpr Type F32x4{Type::F32x4};
|
||||||
constexpr Type F64x2{Type::F64x2};
|
static constexpr Type F64x2{Type::F64x2};
|
||||||
constexpr Type F64x3{Type::F64x3};
|
static constexpr Type F64x3{Type::F64x3};
|
||||||
constexpr Type F64x4{Type::F64x4};
|
static constexpr Type F64x4{Type::F64x4};
|
||||||
|
|
||||||
constexpr OpcodeMeta META_TABLE[]{
|
extern OpcodeMeta META_TABLE[532];
|
||||||
#define OPCODE(name_token, type_token, ...) \
|
constexpr size_t CalculateNumArgsOf(Opcode op) noexcept {
|
||||||
{ \
|
const auto& arg_types = META_TABLE[size_t(op)].arg_types;
|
||||||
.name{#name_token}, \
|
return size_t(std::distance(arg_types.begin(), std::ranges::find(arg_types, Type::Void)));
|
||||||
.type = type_token, \
|
|
||||||
.arg_types{__VA_ARGS__}, \
|
|
||||||
},
|
|
||||||
#include "opcodes.inc"
|
|
||||||
#undef OPCODE
|
|
||||||
};
|
|
||||||
constexpr size_t CalculateNumArgsOf(Opcode op) {
|
|
||||||
const auto& arg_types{META_TABLE[static_cast<size_t>(op)].arg_types};
|
|
||||||
return static_cast<size_t>(
|
|
||||||
std::distance(arg_types.begin(), std::ranges::find(arg_types, Type::Void)));
|
|
||||||
}
|
}
|
||||||
|
extern u8 NUM_ARGS[532];
|
||||||
constexpr u8 NUM_ARGS[]{
|
|
||||||
#define OPCODE(name_token, type_token, ...) static_cast<u8>(CalculateNumArgsOf(Opcode::name_token)),
|
|
||||||
#include "opcodes.inc"
|
|
||||||
#undef OPCODE
|
|
||||||
};
|
|
||||||
} // namespace Detail
|
} // namespace Detail
|
||||||
|
|
||||||
/// Get return type of an opcode
|
/// Get return type of an opcode
|
||||||
[[nodiscard]] inline Type TypeOf(Opcode op) noexcept {
|
[[nodiscard]] inline Type TypeOf(Opcode op) noexcept {
|
||||||
return Detail::META_TABLE[static_cast<size_t>(op)].type;
|
return Detail::META_TABLE[size_t(op)].type;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Get the number of arguments an opcode accepts
|
/// Get the number of arguments an opcode accepts
|
||||||
[[nodiscard]] inline size_t NumArgsOf(Opcode op) noexcept {
|
[[nodiscard]] inline size_t NumArgsOf(Opcode op) noexcept {
|
||||||
return static_cast<size_t>(Detail::NUM_ARGS[static_cast<size_t>(op)]);
|
return size_t(Detail::NUM_ARGS[size_t(op)]);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Get the required type of an argument of an opcode
|
/// Get the required type of an argument of an opcode
|
||||||
[[nodiscard]] inline Type ArgTypeOf(Opcode op, size_t arg_index) noexcept {
|
[[nodiscard]] inline Type ArgTypeOf(Opcode op, size_t arg_index) noexcept {
|
||||||
return Detail::META_TABLE[static_cast<size_t>(op)].arg_types[arg_index];
|
return Detail::META_TABLE[size_t(op)].arg_types[arg_index];
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Get the name of an opcode
|
/// Get the name of an opcode
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue