[shader_recompiler] ISBERD minor cleanups

This commit is contained in:
SDK Chan 2025-08-06 19:04:41 +00:00
parent fed33c7a54
commit 29c6c52355
7 changed files with 44 additions and 55 deletions

@ -1 +1 @@
Subproject commit 3dbfa16f0cd9e8ed4fec916c6c00f41c738cb8f4 Subproject commit c060e9ce30ac2e3ffb49d94209c4dae77b6642f7

View file

@ -243,7 +243,7 @@ add_library(shader_recompiler STATIC
runtime_info.h runtime_info.h
shader_info.h shader_info.h
varying_state.h varying_state.h
frontend/maxwell/translate/impl/internal_stage_buffer_entry_read.h
) )
if (YUZU_USE_EXTERNAL_VULKAN_SPIRV_TOOLS) if (YUZU_USE_EXTERNAL_VULKAN_SPIRV_TOOLS)

View file

@ -271,21 +271,21 @@ void TranslatorVisitor::ResetOFlag() {
SetOFlag(ir.Imm1(false)); SetOFlag(ir.Imm1(false));
} }
IR::U32 TranslatorVisitor::apply_ISBERD_shift(IR::U32 result, isberd::Shift shift_value) { IR::U32 TranslatorVisitor::apply_ISBERD_shift(IR::U32 result, Isberd::Shift shift_value) {
if (shift_value != isberd::Shift::Default) { if (shift_value != Isberd::Shift::Default) {
return ir.ShiftLeftLogical(result, ir.Imm32(1)); return ir.ShiftLeftLogical(result, ir.Imm32(1));
} }
return result; return result;
} }
IR::U32 TranslatorVisitor::apply_ISBERD_size_read(IR::U32 address, isberd::SZ sz) { IR::U32 TranslatorVisitor::apply_ISBERD_size_read(IR::U32 address, Isberd::SZ sz) {
switch (sz) { switch (sz) {
case isberd::SZ::U8: case Isberd::SZ::U8:
return ir.LoadGlobalU8(ir.UConvert(64, address)); return ir.LoadGlobalU8(ir.UConvert(64, address));
case isberd::SZ::U16: case Isberd::SZ::U16:
return ir.LoadGlobalU16(ir.UConvert(64, address)); return ir.LoadGlobalU16(ir.UConvert(64, address));
case isberd::SZ::U32: case Isberd::SZ::U32:
case isberd::SZ::F32: case Isberd::SZ::F32:
return ir.LoadGlobal32(ir.UConvert(64, address)); return ir.LoadGlobal32(ir.UConvert(64, address));
default: default:
UNREACHABLE(); UNREACHABLE();

View file

@ -10,7 +10,6 @@
#include "shader_recompiler/frontend/ir/basic_block.h" #include "shader_recompiler/frontend/ir/basic_block.h"
#include "shader_recompiler/frontend/ir/ir_emitter.h" #include "shader_recompiler/frontend/ir/ir_emitter.h"
#include "shader_recompiler/frontend/maxwell/instruction.h" #include "shader_recompiler/frontend/maxwell/instruction.h"
#include "shader_recompiler/frontend/maxwell/translate/impl/internal_stage_buffer_entry_read.h"
namespace Shader::Maxwell { namespace Shader::Maxwell {
@ -57,6 +56,30 @@ enum class FPCompareOp : u64 {
T, T,
}; };
namespace Isberd {
enum class Mode : u64 {
Default,
Patch,
Prim,
Attr,
};
enum class Shift : u64 {
Default,
U16,
B32,
};
enum class SZ : u64 {
U8,
U16,
U32,
F32,
};
} // namespace Isberd
class TranslatorVisitor { class TranslatorVisitor {
public: public:
explicit TranslatorVisitor(Environment& env_, IR::Block& block) : env{env_}, ir(block) {} explicit TranslatorVisitor(Environment& env_, IR::Block& block) : env{env_}, ir(block) {}
@ -386,9 +409,10 @@ public:
void ResetCFlag(); void ResetCFlag();
void ResetOFlag(); void ResetOFlag();
private:
// Helper functions for various translator visitors // Helper functions for various translator visitors
IR::U32 apply_ISBERD_shift(IR::U32 result, isberd::Shift shift_value); IR::U32 apply_ISBERD_shift(IR::U32 result, Isberd::Shift shift_value);
IR::U32 apply_ISBERD_size_read(IR::U32 address, isberd::SZ sz_value); IR::U32 apply_ISBERD_size_read(IR::U32 address, Isberd::SZ sz_value);
IR::U32 compute_ISBERD_address(IR::Reg src_reg, u32 src_reg_num, u32 imm, u64 skew_value); IR::U32 compute_ISBERD_address(IR::Reg src_reg, u32 src_reg_num, u32 imm, u64 skew_value);
}; };

View file

@ -7,7 +7,6 @@
#include "common/bit_field.h" #include "common/bit_field.h"
#include "common/common_types.h" #include "common/common_types.h"
#include "shader_recompiler/frontend/maxwell/translate/impl/impl.h" #include "shader_recompiler/frontend/maxwell/translate/impl/impl.h"
#include "shader_recompiler/frontend/maxwell/translate/impl/internal_stage_buffer_entry_read.h"
namespace Shader::Maxwell { namespace Shader::Maxwell {
@ -21,9 +20,9 @@ void TranslatorVisitor::ISBERD(u64 insn) {
BitField<24, 8, u32> imm; BitField<24, 8, u32> imm;
BitField<31, 1, u64> skew; BitField<31, 1, u64> skew;
BitField<32, 1, u64> o; BitField<32, 1, u64> o;
BitField<33, 2, isberd::Mode> mode; BitField<33, 2, Isberd::Mode> mode;
BitField<36, 4, isberd::SZ> sz; BitField<36, 4, Isberd::SZ> sz;
BitField<47, 2, isberd::Shift> shift; BitField<47, 2, Isberd::Shift> shift;
} const isberd{insn}; } const isberd{insn};
auto address = compute_ISBERD_address(isberd.src_reg, isberd.src_reg_num, isberd.imm, isberd.skew); auto address = compute_ISBERD_address(isberd.src_reg, isberd.src_reg_num, isberd.imm, isberd.skew);
@ -34,16 +33,16 @@ void TranslatorVisitor::ISBERD(u64 insn) {
return; return;
} }
if (isberd.mode != isberd::Mode::Default) { if (isberd.mode != Isberd::Mode::Default) {
IR::F32 result_f32{}; IR::F32 result_f32{};
switch (isberd.mode.Value()) { switch (isberd.mode.Value()) {
case isberd::Mode::Patch: case Isberd::Mode::Patch:
result_f32 = ir.GetPatch(address.Patch()); result_f32 = ir.GetPatch(address.Patch());
break; break;
case isberd::Mode::Prim: case Isberd::Mode::Prim:
result_f32 = ir.GetAttribute(address.Attribute()); result_f32 = ir.GetAttribute(address.Attribute());
break; break;
case isberd::Mode::Attr: case Isberd::Mode::Attr:
result_f32 = ir.GetAttributeIndexed(address); result_f32 = ir.GetAttributeIndexed(address);
break; break;
default: default:

View file

@ -1,34 +0,0 @@
// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
// SPDX-License-Identifier: GPL-3.0-or-later
#pragma once
#include "shader_recompiler/environment.h"
#include "shader_recompiler/frontend/ir/basic_block.h"
#include "shader_recompiler/frontend/ir/ir_emitter.h"
#include "shader_recompiler/frontend/maxwell/instruction.h"
namespace Shader::Maxwell {
namespace isberd {
enum class Mode : u64 {
Default,
Patch,
Prim,
Attr,
};
enum class Shift : u64 {
Default,
U16,
B32,
};
enum class SZ : u64 {
U8,
U16,
U32,
F32,
};
} // Anonymous namespace
} // namespace Shader::Maxwell