From 3554721a534903ac55efa556ce1c4838d5a519b4 Mon Sep 17 00:00:00 2001 From: Andrew Church Date: Mon, 22 Aug 2016 04:28:59 +0900 Subject: [PATCH] gpu: Remove flags from EVENT_WRITE high address word. At minimum, the word does not have a DATA_SEL field, since GX2 query functions pass zero (DISCARD) in those bits and expect the result to not be discarded. Removed INT_SEL from that word as well since there is no evidence for its existence (and it's not handled anyway). --- src/libdecaf/src/gpu/opengl/opengl_driver.cpp | 26 ++++-------- src/libdecaf/src/gpu/pm4.h | 40 ++++++++++--------- src/libdecaf/src/modules/gx2/gx2_query.cpp | 4 +- 3 files changed, 31 insertions(+), 39 deletions(-) diff --git a/src/libdecaf/src/gpu/opengl/opengl_driver.cpp b/src/libdecaf/src/gpu/opengl/opengl_driver.cpp index 8a95cf9e..990e9e7d 100644 --- a/src/libdecaf/src/gpu/opengl/opengl_driver.cpp +++ b/src/libdecaf/src/gpu/opengl/opengl_driver.cpp @@ -441,8 +441,7 @@ GLDriver::eventWrite(const pm4::EventWrite &data) decaf_abort(fmt::format("Unexpected event type {}", type)); } - switch (data.addrLo.ENDIAN_SWAP()) - { + switch (data.addrLo.ENDIAN_SWAP()) { case latte::CB_ENDIAN_NONE: break; case latte::CB_ENDIAN_8IN64: @@ -455,18 +454,7 @@ GLDriver::eventWrite(const pm4::EventWrite &data) decaf_abort("Unexpected EVENT_WRITE endian swap 8IN16"); } - switch (data.addrHi.DATA_SEL()) { - case pm4::EW_DATA_DISCARD: - break; - case pm4::EW_DATA_32: - *reinterpret_cast(ptr) = static_cast(value); - break; - case pm4::EW_DATA_64: - *reinterpret_cast(ptr) = value; - break; - case pm4::EW_DATA_CLOCK: - decaf_abort("Unexpected EW_DATA_CLOCK in EVENT_WRITE"); - } + *reinterpret_cast(ptr) = value; } void @@ -506,17 +494,17 @@ GLDriver::handlePendingEOP() value = byte_swap(static_cast(value)); break; case latte::CB_ENDIAN_8IN16: - decaf_abort(fmt::format("Unexpected EOP event endian swap {}", mPendingEOP.addrLo.ENDIAN_SWAP())); + decaf_abort("Unexpected EVENT_WRITE_EOP endian swap 8IN16"); } switch (mPendingEOP.addrHi.DATA_SEL()) { - case pm4::EW_DATA_DISCARD: + case pm4::EWP_DATA_DISCARD: break; - case pm4::EW_DATA_32: + case pm4::EWP_DATA_32: *reinterpret_cast(ptr) = static_cast(value); break; - case pm4::EW_DATA_64: - case pm4::EW_DATA_CLOCK: + case pm4::EWP_DATA_64: + case pm4::EWP_DATA_CLOCK: *reinterpret_cast(ptr) = value; break; } diff --git a/src/libdecaf/src/gpu/pm4.h b/src/libdecaf/src/gpu/pm4.h index 5019abc9..971afc42 100644 --- a/src/libdecaf/src/gpu/pm4.h +++ b/src/libdecaf/src/gpu/pm4.h @@ -790,25 +790,8 @@ BITFIELD(EW_ADDR_LO, uint32_t) BITFIELD_ENTRY(2, 30, uint32_t, ADDR_LO); BITFIELD_END -enum EW_DATA_SEL : uint32_t -{ - EW_DATA_DISCARD = 0, - EW_DATA_32 = 1, - EW_DATA_64 = 2, - EW_DATA_CLOCK = 3, -}; - -enum EW_INT_SEL : uint32_t -{ - EW_INT_NONE = 0, - EW_INT_ONLY = 1, - EW_INT_WRITE_CONFIRM = 2, -}; - BITFIELD(EW_ADDR_HI, uint32_t) BITFIELD_ENTRY(0, 8, uint32_t, ADDR_HI); - BITFIELD_ENTRY(24, 2, EW_INT_SEL, INT_SEL); - BITFIELD_ENTRY(29, 3, EW_DATA_SEL, DATA_SEL); BITFIELD_END struct EventWrite @@ -827,12 +810,33 @@ struct EventWrite } }; +enum EWP_DATA_SEL : uint32_t +{ + EWP_DATA_DISCARD = 0, + EWP_DATA_32 = 1, + EWP_DATA_64 = 2, + EWP_DATA_CLOCK = 3, +}; + +enum EWP_INT_SEL : uint32_t +{ + EWP_INT_NONE = 0, + EWP_INT_ONLY = 1, + EWP_INT_WRITE_CONFIRM = 2, +}; + +BITFIELD(EWP_ADDR_HI, uint32_t) + BITFIELD_ENTRY(0, 8, uint32_t, ADDR_HI); + BITFIELD_ENTRY(24, 2, EWP_INT_SEL, INT_SEL); + BITFIELD_ENTRY(29, 3, EWP_DATA_SEL, DATA_SEL); +BITFIELD_END + struct EventWriteEOP { static const auto Opcode = type3::EVENT_WRITE_EOP; latte::VGT_EVENT_INITIATOR eventInitiator; EW_ADDR_LO addrLo; - EW_ADDR_HI addrHi; + EWP_ADDR_HI addrHi; uint32_t dataLo; uint32_t dataHi; diff --git a/src/libdecaf/src/modules/gx2/gx2_query.cpp b/src/libdecaf/src/modules/gx2/gx2_query.cpp index 416d106b..a837261b 100644 --- a/src/libdecaf/src/modules/gx2/gx2_query.cpp +++ b/src/libdecaf/src/modules/gx2/gx2_query.cpp @@ -36,8 +36,8 @@ GX2SampleBottomGPUCycle(be_val *result) .ADDR_LO(mem::untranslate(result) >> 2) .ENDIAN_SWAP(latte::CB_ENDIAN_8IN64); - auto addrHi = pm4::EW_ADDR_HI::get(0) - .DATA_SEL(pm4::EW_DATA_CLOCK); + auto addrHi = pm4::EWP_ADDR_HI::get(0) + .DATA_SEL(pm4::EWP_DATA_CLOCK); pm4::write(pm4::EventWriteEOP { eventInitiator, addrLo, addrHi, 0, 0 }); }