@@ -74,6 +74,7 @@ Liverpool::~Liverpool() {
74
74
75
75
void Liverpool::Process (std::stop_token stoken) {
76
76
Common::SetCurrentThreadName (" shadPS4:GpuCommandProcessor" );
77
+ gpu_id = std::this_thread::get_id ();
77
78
78
79
while (!stoken.stop_requested ()) {
79
80
{
@@ -635,9 +636,8 @@ Liverpool::Task Liverpool::ProcessGraphics(std::span<const u32> dcb, std::span<c
635
636
} else if ((dma_data->src_sel == DmaDataSrc::Memory ||
636
637
dma_data->src_sel == DmaDataSrc::MemoryUsingL2) &&
637
638
dma_data->dst_sel == DmaDataDst::Gds) {
638
- rasterizer->InlineData (dma_data->dst_addr_lo ,
639
- dma_data->SrcAddress <const void *>(),
640
- dma_data->NumBytes (), true );
639
+ rasterizer->CopyBuffer (dma_data->dst_addr_lo , dma_data->SrcAddress <VAddr>(),
640
+ dma_data->NumBytes (), true , false );
641
641
} else if (dma_data->src_sel == DmaDataSrc::Data &&
642
642
(dma_data->dst_sel == DmaDataDst::Memory ||
643
643
dma_data->dst_sel == DmaDataDst::MemoryUsingL2)) {
@@ -646,14 +646,15 @@ Liverpool::Task Liverpool::ProcessGraphics(std::span<const u32> dcb, std::span<c
646
646
} else if (dma_data->src_sel == DmaDataSrc::Gds &&
647
647
(dma_data->dst_sel == DmaDataDst::Memory ||
648
648
dma_data->dst_sel == DmaDataDst::MemoryUsingL2)) {
649
- // LOG_WARNING(Render_Vulkan, "GDS memory read");
649
+ rasterizer->CopyBuffer (dma_data->DstAddress <VAddr>(), dma_data->src_addr_lo ,
650
+ dma_data->NumBytes (), false , true );
650
651
} else if ((dma_data->src_sel == DmaDataSrc::Memory ||
651
652
dma_data->src_sel == DmaDataSrc::MemoryUsingL2) &&
652
653
(dma_data->dst_sel == DmaDataDst::Memory ||
653
654
dma_data->dst_sel == DmaDataDst::MemoryUsingL2)) {
654
- rasterizer->InlineData (dma_data->DstAddress <VAddr>(),
655
- dma_data->SrcAddress <const void *> (),
656
- dma_data-> NumBytes () , false );
655
+ rasterizer->CopyBuffer (dma_data->DstAddress <VAddr>(),
656
+ dma_data->SrcAddress <VAddr>(), dma_data-> NumBytes (),
657
+ false , false );
657
658
} else {
658
659
UNREACHABLE_MSG (" WriteData src_sel = {}, dst_sel = {}" ,
659
660
u32 (dma_data->src_sel .Value ()), u32 (dma_data->dst_sel .Value ()));
@@ -689,6 +690,9 @@ Liverpool::Task Liverpool::ProcessGraphics(std::span<const u32> dcb, std::span<c
689
690
break ;
690
691
}
691
692
case PM4ItOpcode::Rewind: {
693
+ if (!rasterizer) {
694
+ break ;
695
+ }
692
696
const PM4CmdRewind* rewind = reinterpret_cast <const PM4CmdRewind*>(header);
693
697
while (!rewind->Valid ()) {
694
698
YIELD_GFX ();
@@ -837,8 +841,8 @@ Liverpool::Task Liverpool::ProcessCompute(const u32* acb, u32 acb_dwords, u32 vq
837
841
} else if ((dma_data->src_sel == DmaDataSrc::Memory ||
838
842
dma_data->src_sel == DmaDataSrc::MemoryUsingL2) &&
839
843
dma_data->dst_sel == DmaDataDst::Gds) {
840
- rasterizer->InlineData (dma_data->dst_addr_lo , dma_data->SrcAddress <const void * >(),
841
- dma_data->NumBytes (), true );
844
+ rasterizer->CopyBuffer (dma_data->dst_addr_lo , dma_data->SrcAddress <VAddr >(),
845
+ dma_data->NumBytes (), true , false );
842
846
} else if (dma_data->src_sel == DmaDataSrc::Data &&
843
847
(dma_data->dst_sel == DmaDataDst::Memory ||
844
848
dma_data->dst_sel == DmaDataDst::MemoryUsingL2)) {
@@ -847,14 +851,14 @@ Liverpool::Task Liverpool::ProcessCompute(const u32* acb, u32 acb_dwords, u32 vq
847
851
} else if (dma_data->src_sel == DmaDataSrc::Gds &&
848
852
(dma_data->dst_sel == DmaDataDst::Memory ||
849
853
dma_data->dst_sel == DmaDataDst::MemoryUsingL2)) {
850
- // LOG_WARNING(Render_Vulkan, "GDS memory read");
854
+ rasterizer->CopyBuffer (dma_data->DstAddress <VAddr>(), dma_data->src_addr_lo ,
855
+ dma_data->NumBytes (), false , true );
851
856
} else if ((dma_data->src_sel == DmaDataSrc::Memory ||
852
857
dma_data->src_sel == DmaDataSrc::MemoryUsingL2) &&
853
858
(dma_data->dst_sel == DmaDataDst::Memory ||
854
859
dma_data->dst_sel == DmaDataDst::MemoryUsingL2)) {
855
- rasterizer->InlineData (dma_data->DstAddress <VAddr>(),
856
- dma_data->SrcAddress <const void *>(), dma_data->NumBytes (),
857
- false );
860
+ rasterizer->CopyBuffer (dma_data->DstAddress <VAddr>(), dma_data->SrcAddress <VAddr>(),
861
+ dma_data->NumBytes (), false , false );
858
862
} else {
859
863
UNREACHABLE_MSG (" WriteData src_sel = {}, dst_sel = {}" ,
860
864
u32 (dma_data->src_sel .Value ()), u32 (dma_data->dst_sel .Value ()));
@@ -865,6 +869,9 @@ Liverpool::Task Liverpool::ProcessCompute(const u32* acb, u32 acb_dwords, u32 vq
865
869
break ;
866
870
}
867
871
case PM4ItOpcode::Rewind: {
872
+ if (!rasterizer) {
873
+ break ;
874
+ }
868
875
const PM4CmdRewind* rewind = reinterpret_cast <const PM4CmdRewind*>(header);
869
876
while (!rewind->Valid ()) {
870
877
YIELD_ASC (vqid);
0 commit comments