mirror of
https://github.com/shadps4-emu/shadPS4.git
synced 2025-05-14 08:12:16 +00:00
Handle VgtStreamoutFlush event (#2929)
This commit is contained in:
parent
6abda17532
commit
647b1d3ee4
3 changed files with 146 additions and 2 deletions
|
@ -584,7 +584,16 @@ Liverpool::Task Liverpool::ProcessGraphics(std::span<const u32> dcb, std::span<c
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case PM4ItOpcode::EventWrite: {
|
case PM4ItOpcode::EventWrite: {
|
||||||
// const auto* event = reinterpret_cast<const PM4CmdEventWrite*>(header);
|
const auto* event = reinterpret_cast<const PM4CmdEventWrite*>(header);
|
||||||
|
LOG_DEBUG(Render_Vulkan,
|
||||||
|
"Encountered EventWrite: event_type = {}, event_index = {}",
|
||||||
|
magic_enum::enum_name(event->event_type.Value()),
|
||||||
|
magic_enum::enum_name(event->event_index.Value()));
|
||||||
|
if (event->event_type.Value() == EventType::SoVgtStreamoutFlush) {
|
||||||
|
// TODO: handle proper synchronization, for now signal that update is done
|
||||||
|
// immediately
|
||||||
|
regs.cp_strmout_cntl.offset_update_done = 1;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case PM4ItOpcode::EventWriteEos: {
|
case PM4ItOpcode::EventWriteEos: {
|
||||||
|
@ -732,6 +741,16 @@ Liverpool::Task Liverpool::ProcessGraphics(std::span<const u32> dcb, std::span<c
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case PM4ItOpcode::StrmoutBufferUpdate: {
|
||||||
|
const auto* strmout = reinterpret_cast<const PM4CmdStrmoutBufferUpdate*>(header);
|
||||||
|
LOG_WARNING(Render_Vulkan,
|
||||||
|
"Unimplemented IT_STRMOUT_BUFFER_UPDATE, update_memory = {}, "
|
||||||
|
"source_select = {}, buffer_select = {}",
|
||||||
|
strmout->update_memory.Value(),
|
||||||
|
magic_enum::enum_name(strmout->source_select.Value()),
|
||||||
|
strmout->buffer_select.Value());
|
||||||
|
break;
|
||||||
|
}
|
||||||
default:
|
default:
|
||||||
UNREACHABLE_MSG("Unknown PM4 type 3 opcode {:#x} with count {}",
|
UNREACHABLE_MSG("Unknown PM4 type 3 opcode {:#x} with count {}",
|
||||||
static_cast<u32>(opcode), count);
|
static_cast<u32>(opcode), count);
|
||||||
|
|
|
@ -1175,6 +1175,14 @@ struct Liverpool {
|
||||||
BitField<22, 2, u32> onchip;
|
BitField<22, 2, u32> onchip;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
union StreamOutControl {
|
||||||
|
u32 raw;
|
||||||
|
struct {
|
||||||
|
u32 offset_update_done : 1;
|
||||||
|
u32 : 31;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
union StreamOutConfig {
|
union StreamOutConfig {
|
||||||
u32 raw;
|
u32 raw;
|
||||||
struct {
|
struct {
|
||||||
|
@ -1378,7 +1386,9 @@ struct Liverpool {
|
||||||
AaConfig aa_config;
|
AaConfig aa_config;
|
||||||
INSERT_PADDING_WORDS(0xA318 - 0xA2F8 - 1);
|
INSERT_PADDING_WORDS(0xA318 - 0xA2F8 - 1);
|
||||||
ColorBuffer color_buffers[NumColorBuffers];
|
ColorBuffer color_buffers[NumColorBuffers];
|
||||||
INSERT_PADDING_WORDS(0xC242 - 0xA390);
|
INSERT_PADDING_WORDS(0xC03F - 0xA390);
|
||||||
|
StreamOutControl cp_strmout_cntl;
|
||||||
|
INSERT_PADDING_WORDS(0xC242 - 0xC040);
|
||||||
PrimitiveType primitive_type;
|
PrimitiveType primitive_type;
|
||||||
INSERT_PADDING_WORDS(0xC24C - 0xC243);
|
INSERT_PADDING_WORDS(0xC24C - 0xC243);
|
||||||
u32 num_indices;
|
u32 num_indices;
|
||||||
|
@ -1668,6 +1678,7 @@ static_assert(GFX6_3D_REG_INDEX(color_buffers[0].base_address) == 0xA318);
|
||||||
static_assert(GFX6_3D_REG_INDEX(color_buffers[0].pitch) == 0xA319);
|
static_assert(GFX6_3D_REG_INDEX(color_buffers[0].pitch) == 0xA319);
|
||||||
static_assert(GFX6_3D_REG_INDEX(color_buffers[0].slice) == 0xA31A);
|
static_assert(GFX6_3D_REG_INDEX(color_buffers[0].slice) == 0xA31A);
|
||||||
static_assert(GFX6_3D_REG_INDEX(color_buffers[7].base_address) == 0xA381);
|
static_assert(GFX6_3D_REG_INDEX(color_buffers[7].base_address) == 0xA381);
|
||||||
|
static_assert(GFX6_3D_REG_INDEX(cp_strmout_cntl) == 0xC03F);
|
||||||
static_assert(GFX6_3D_REG_INDEX(primitive_type) == 0xC242);
|
static_assert(GFX6_3D_REG_INDEX(primitive_type) == 0xC242);
|
||||||
static_assert(GFX6_3D_REG_INDEX(num_instances) == 0xC24D);
|
static_assert(GFX6_3D_REG_INDEX(num_instances) == 0xC24D);
|
||||||
static_assert(GFX6_3D_REG_INDEX(vgt_tf_memory_base) == 0xc250);
|
static_assert(GFX6_3D_REG_INDEX(vgt_tf_memory_base) == 0xc250);
|
||||||
|
|
|
@ -246,6 +246,46 @@ struct PM4CmdNop {
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
enum class SourceSelect : u32 {
|
||||||
|
BufferOffset = 0,
|
||||||
|
VgtStrmoutBufferFilledSize = 1,
|
||||||
|
SrcAddress = 2,
|
||||||
|
None = 3,
|
||||||
|
};
|
||||||
|
|
||||||
|
struct PM4CmdStrmoutBufferUpdate {
|
||||||
|
PM4Type3Header header;
|
||||||
|
union {
|
||||||
|
BitField<0, 1, u32> update_memory;
|
||||||
|
BitField<1, 2, SourceSelect> source_select;
|
||||||
|
BitField<8, 2, u32> buffer_select;
|
||||||
|
u32 control;
|
||||||
|
};
|
||||||
|
union {
|
||||||
|
BitField<2, 30, u32> dst_address_lo;
|
||||||
|
BitField<0, 2, u32> swap_dst;
|
||||||
|
};
|
||||||
|
u32 dst_address_hi;
|
||||||
|
union {
|
||||||
|
u32 buffer_offset;
|
||||||
|
BitField<2, 30, u32> src_address_lo;
|
||||||
|
BitField<0, 2, u32> swap_src;
|
||||||
|
};
|
||||||
|
u32 src_address_hi;
|
||||||
|
|
||||||
|
template <typename T = u64>
|
||||||
|
T DstAddress() const {
|
||||||
|
ASSERT(update_memory.Value() == 1);
|
||||||
|
return reinterpret_cast<T>(dst_address_lo.Value() | u64(dst_address_hi & 0xFFFF) << 32);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename T = u64>
|
||||||
|
T SrcAddress() const {
|
||||||
|
ASSERT(source_select.Value() == SourceSelect::SrcAddress);
|
||||||
|
return reinterpret_cast<T>(src_address_lo.Value() | u64(src_address_hi & 0xFFFF) << 32);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
struct PM4CmdDrawIndexOffset2 {
|
struct PM4CmdDrawIndexOffset2 {
|
||||||
PM4Type3Header header;
|
PM4Type3Header header;
|
||||||
u32 max_size; ///< Maximum number of indices
|
u32 max_size; ///< Maximum number of indices
|
||||||
|
@ -303,6 +343,80 @@ static u64 GetGpuClock64() {
|
||||||
return static_cast<u64>(ticks);
|
return static_cast<u64>(ticks);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// VGT_EVENT_INITIATOR.EVENT_TYPE
|
||||||
|
enum class EventType : u32 {
|
||||||
|
SampleStreamoutStats1 = 1,
|
||||||
|
SampleStreamoutStats2 = 2,
|
||||||
|
SampleStreamoutStats3 = 3,
|
||||||
|
CacheFlushTs = 4,
|
||||||
|
ContextDone = 5,
|
||||||
|
CacheFlush = 6,
|
||||||
|
CsPartialFlush = 7,
|
||||||
|
VgtStreamoutSync = 8,
|
||||||
|
VgtStreamoutReset = 10,
|
||||||
|
EndOfPipeIncrDe = 11,
|
||||||
|
EndOfPipeIbEnd = 12,
|
||||||
|
RstPixCnt = 13,
|
||||||
|
VsPartialFlush = 15,
|
||||||
|
PsPartialFlush = 16,
|
||||||
|
FlushHsOutput = 17,
|
||||||
|
FlushLsOutput = 18,
|
||||||
|
CacheFlushAndInvTsEvent = 20,
|
||||||
|
ZpassDone = 21,
|
||||||
|
CacheFlushAndInvEvent = 22,
|
||||||
|
PerfcounterStart = 23,
|
||||||
|
PerfcounterStop = 24,
|
||||||
|
PipelineStatStart = 25,
|
||||||
|
PipelineStatStop = 26,
|
||||||
|
PerfcounterSample = 27,
|
||||||
|
FlushEsOutput = 28,
|
||||||
|
FlushGsOutput = 29,
|
||||||
|
SamplePipelineStat = 30,
|
||||||
|
SoVgtStreamoutFlush = 31,
|
||||||
|
SampleStreamoutStats = 32,
|
||||||
|
ResetVtxCnt = 33,
|
||||||
|
VgtFlush = 36,
|
||||||
|
ScSendDbVpz = 39,
|
||||||
|
BottomOfPipeTs = 40,
|
||||||
|
DbCacheFlushAndInv = 42,
|
||||||
|
FlushAndInvDbDataTs = 43,
|
||||||
|
FlushAndInvDbMeta = 44,
|
||||||
|
FlushAndInvCbDataTs = 45,
|
||||||
|
FlushAndInvCbMeta = 46,
|
||||||
|
CsDone = 47,
|
||||||
|
PsDone = 48,
|
||||||
|
FlushAndInvCbPixelData = 49,
|
||||||
|
ThreadTraceStart = 51,
|
||||||
|
ThreadTraceStop = 52,
|
||||||
|
ThreadTraceFlush = 54,
|
||||||
|
ThreadTraceFinish = 55,
|
||||||
|
PixelPipeStatControl = 56,
|
||||||
|
PixelPipeStatDump = 57,
|
||||||
|
PixelPipeStatReset = 58,
|
||||||
|
};
|
||||||
|
|
||||||
|
enum class EventIndex : u32 {
|
||||||
|
Other = 0,
|
||||||
|
ZpassDone = 1,
|
||||||
|
SamplePipelineStat = 2,
|
||||||
|
SampleStreamoutStatSx = 3,
|
||||||
|
CsVsPsPartialFlush = 4,
|
||||||
|
EopReserved = 5,
|
||||||
|
EosReserved = 6,
|
||||||
|
CacheFlush = 7,
|
||||||
|
};
|
||||||
|
|
||||||
|
struct PM4CmdEventWrite {
|
||||||
|
PM4Type3Header header;
|
||||||
|
union {
|
||||||
|
u32 event_control;
|
||||||
|
BitField<0, 6, EventType> event_type; ///< Event type written to VGT_EVENT_INITIATOR
|
||||||
|
BitField<8, 4, EventIndex> event_index; ///< Event index
|
||||||
|
BitField<20, 1, u32> inv_l2; ///< Send WBINVL2 op to the TC L2 cache when EVENT_INDEX = 0111
|
||||||
|
};
|
||||||
|
u32 address[];
|
||||||
|
};
|
||||||
|
|
||||||
struct PM4CmdEventWriteEop {
|
struct PM4CmdEventWriteEop {
|
||||||
PM4Type3Header header;
|
PM4Type3Header header;
|
||||||
union {
|
union {
|
||||||
|
|
Loading…
Add table
Reference in a new issue