forked from eden-emu/eden
[shader_recompiler] ISBERD minor cleanups
This commit is contained in:
parent
fed33c7a54
commit
29c6c52355
7 changed files with 44 additions and 55 deletions
2
externals/libusb/libusb
vendored
2
externals/libusb/libusb
vendored
|
@ -1 +1 @@
|
||||||
Subproject commit 3dbfa16f0cd9e8ed4fec916c6c00f41c738cb8f4
|
Subproject commit c060e9ce30ac2e3ffb49d94209c4dae77b6642f7
|
|
@ -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)
|
||||||
|
|
|
@ -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();
|
||||||
|
|
|
@ -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);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -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:
|
||||||
|
|
|
@ -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
|
|
Loading…
Add table
Add a link
Reference in a new issue