mirror of
https://github.com/KytyPS5/KytyPS5.git
synced 2026-10-26 21:06:53 +01:00
gpu: retain fused hull shader user-data addresses
This commit is contained in:
@@ -3654,12 +3654,13 @@ void GraphicsInitJmpTablesShIndirect() {
|
|||||||
g_hw_sh_indirect_func[Pm4::SPI_GRAPHICS_SHADER_CONTROL_HS] = [](KYTY_HW_SH_INDIRECT_ARGS) {
|
g_hw_sh_indirect_func[Pm4::SPI_GRAPHICS_SHADER_CONTROL_HS] = [](KYTY_HW_SH_INDIRECT_ARGS) {
|
||||||
HwShIgnoreShaderRegister(cmd_offset, value);
|
HwShIgnoreShaderRegister(cmd_offset, value);
|
||||||
};
|
};
|
||||||
g_hw_sh_indirect_func[Pm4::SPI_SHADER_USER_DATA_ADDR_LO_HS] = [](KYTY_HW_SH_INDIRECT_ARGS) {
|
for (uint32_t offset = Pm4::SPI_SHADER_USER_DATA_ADDR_LO_HS;
|
||||||
HwShIgnoreShaderRegister(cmd_offset, value);
|
offset <= Pm4::SPI_SHADER_USER_DATA_ADDR_HI_HS; offset++) {
|
||||||
};
|
g_hw_sh_indirect_func[offset] = [](KYTY_HW_SH_INDIRECT_ARGS) {
|
||||||
g_hw_sh_indirect_func[Pm4::SPI_SHADER_USER_DATA_ADDR_HI_HS] = [](KYTY_HW_SH_INDIRECT_ARGS) {
|
cp.GetShCtx().SetHsUserDataAddress(cmd_offset - Pm4::SPI_SHADER_USER_DATA_ADDR_LO_HS,
|
||||||
HwShIgnoreShaderRegister(cmd_offset, value);
|
value);
|
||||||
};
|
};
|
||||||
|
}
|
||||||
g_hw_sh_indirect_func[Pm4::SPI_SHADER_PGM_LO_HS] = [](KYTY_HW_SH_INDIRECT_ARGS) {
|
g_hw_sh_indirect_func[Pm4::SPI_SHADER_PGM_LO_HS] = [](KYTY_HW_SH_INDIRECT_ARGS) {
|
||||||
auto base = cp.GetShCtx().GetVs().hs_regs.data_addr;
|
auto base = cp.GetShCtx().GetVs().hs_regs.data_addr;
|
||||||
base &= 0xFFFFFF00000000FFull;
|
base &= 0xFFFFFF00000000FFull;
|
||||||
|
|||||||
@@ -498,7 +498,8 @@ struct LsStageRegisters {
|
|||||||
};
|
};
|
||||||
|
|
||||||
struct HsStageRegisters {
|
struct HsStageRegisters {
|
||||||
uint64_t data_addr = 0;
|
uint64_t data_addr = 0;
|
||||||
|
uint64_t user_data_addr = 0;
|
||||||
HsShaderResource1 rsrc1;
|
HsShaderResource1 rsrc1;
|
||||||
HsShaderResource2 rsrc2;
|
HsShaderResource2 rsrc2;
|
||||||
};
|
};
|
||||||
@@ -988,14 +989,14 @@ public:
|
|||||||
void SetEsShaderBase(uint64_t addr) { m_vs.es_regs.data_addr = addr; }
|
void SetEsShaderBase(uint64_t addr) { m_vs.es_regs.data_addr = addr; }
|
||||||
void SetLsShaderBase(uint64_t addr) { m_vs.ls_regs.data_addr = addr; }
|
void SetLsShaderBase(uint64_t addr) { m_vs.ls_regs.data_addr = addr; }
|
||||||
void SetHsShaderBase(uint64_t addr) { m_vs.hs_regs.data_addr = addr; }
|
void SetHsShaderBase(uint64_t addr) { m_vs.hs_regs.data_addr = addr; }
|
||||||
|
void SetHsUserDataAddress(uint32_t word, uint32_t value) {
|
||||||
|
SetUserDataAddressWord(m_vs.hs_regs.user_data_addr, word, value);
|
||||||
|
}
|
||||||
void SetHsShaderResource1(const HsShaderResource1& rsrc1) { m_vs.hs_regs.rsrc1 = rsrc1; }
|
void SetHsShaderResource1(const HsShaderResource1& rsrc1) { m_vs.hs_regs.rsrc1 = rsrc1; }
|
||||||
void SetHsShaderResource2(const HsShaderResource2& rsrc2) { m_vs.hs_regs.rsrc2 = rsrc2; }
|
void SetHsShaderResource2(const HsShaderResource2& rsrc2) { m_vs.hs_regs.rsrc2 = rsrc2; }
|
||||||
void SetGsShaderBase(uint64_t addr) { m_vs.gs_regs.data_addr = addr; }
|
void SetGsShaderBase(uint64_t addr) { m_vs.gs_regs.data_addr = addr; }
|
||||||
void SetGsUserDataAddress(uint32_t word, uint32_t value) {
|
void SetGsUserDataAddress(uint32_t word, uint32_t value) {
|
||||||
const auto shift = word * 32u;
|
SetUserDataAddressWord(m_vs.gs_regs.user_data_addr, word, value);
|
||||||
auto& address = m_vs.gs_regs.user_data_addr;
|
|
||||||
address = (address & ~(uint64_t {0xffffffffu} << shift)) |
|
|
||||||
(static_cast<uint64_t>(value) << shift);
|
|
||||||
}
|
}
|
||||||
void SetGsShaderResource1(const GsShaderResource1& rsrc1) { m_vs.gs_regs.rsrc1 = rsrc1; }
|
void SetGsShaderResource1(const GsShaderResource1& rsrc1) { m_vs.gs_regs.rsrc1 = rsrc1; }
|
||||||
void SetGsShaderResource2(const GsShaderResource2& rsrc2) { m_vs.gs_regs.rsrc2 = rsrc2; }
|
void SetGsShaderResource2(const GsShaderResource2& rsrc2) { m_vs.gs_regs.rsrc2 = rsrc2; }
|
||||||
@@ -1037,6 +1038,12 @@ public:
|
|||||||
[[nodiscard]] const ComputeShaderInfo& GetCs() const { return m_cs; }
|
[[nodiscard]] const ComputeShaderInfo& GetCs() const { return m_cs; }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
static void SetUserDataAddressWord(uint64_t& address, uint32_t word, uint32_t value) {
|
||||||
|
const auto shift = word * 32u;
|
||||||
|
address = (address & ~(uint64_t {0xffffffffu} << shift)) |
|
||||||
|
(static_cast<uint64_t>(value) << shift);
|
||||||
|
}
|
||||||
|
|
||||||
VertexShaderInfo m_vs;
|
VertexShaderInfo m_vs;
|
||||||
PixelShaderInfo m_ps;
|
PixelShaderInfo m_ps;
|
||||||
ComputeShaderInfo m_cs;
|
ComputeShaderInfo m_cs;
|
||||||
|
|||||||
Reference in New Issue
Block a user