@@ -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 ();
@@ -833,8 +837,8 @@ Liverpool::Task Liverpool::ProcessCompute(const u32* acb, u32 acb_dwords, u32 vq
833
837
} else if ((dma_data->src_sel == DmaDataSrc::Memory ||
834
838
dma_data->src_sel == DmaDataSrc::MemoryUsingL2) &&
835
839
dma_data->dst_sel == DmaDataDst::Gds) {
836
- rasterizer->InlineData (dma_data->dst_addr_lo , dma_data->SrcAddress <const void * >(),
837
- dma_data->NumBytes (), true );
840
+ rasterizer->CopyBuffer (dma_data->dst_addr_lo , dma_data->SrcAddress <VAddr >(),
841
+ dma_data->NumBytes (), true , false );
838
842
} else if (dma_data->src_sel == DmaDataSrc::Data &&
839
843
(dma_data->dst_sel == DmaDataDst::Memory ||
840
844
dma_data->dst_sel == DmaDataDst::MemoryUsingL2)) {
@@ -843,14 +847,14 @@ Liverpool::Task Liverpool::ProcessCompute(const u32* acb, u32 acb_dwords, u32 vq
843
847
} else if (dma_data->src_sel == DmaDataSrc::Gds &&
844
848
(dma_data->dst_sel == DmaDataDst::Memory ||
845
849
dma_data->dst_sel == DmaDataDst::MemoryUsingL2)) {
846
- // LOG_WARNING(Render_Vulkan, "GDS memory read");
850
+ rasterizer->CopyBuffer (dma_data->DstAddress <VAddr>(), dma_data->src_addr_lo ,
851
+ dma_data->NumBytes (), false , true );
847
852
} else if ((dma_data->src_sel == DmaDataSrc::Memory ||
848
853
dma_data->src_sel == DmaDataSrc::MemoryUsingL2) &&
849
854
(dma_data->dst_sel == DmaDataDst::Memory ||
850
855
dma_data->dst_sel == DmaDataDst::MemoryUsingL2)) {
851
- rasterizer->InlineData (dma_data->DstAddress <VAddr>(),
852
- dma_data->SrcAddress <const void *>(), dma_data->NumBytes (),
853
- false );
856
+ rasterizer->CopyBuffer (dma_data->DstAddress <VAddr>(), dma_data->SrcAddress <VAddr>(),
857
+ dma_data->NumBytes (), false , false );
854
858
} else {
855
859
UNREACHABLE_MSG (" WriteData src_sel = {}, dst_sel = {}" ,
856
860
u32 (dma_data->src_sel .Value ()), u32 (dma_data->dst_sel .Value ()));
@@ -861,6 +865,9 @@ Liverpool::Task Liverpool::ProcessCompute(const u32* acb, u32 acb_dwords, u32 vq
861
865
break ;
862
866
}
863
867
case PM4ItOpcode::Rewind: {
868
+ if (!rasterizer) {
869
+ break ;
870
+ }
864
871
const PM4CmdRewind* rewind = reinterpret_cast <const PM4CmdRewind*>(header);
865
872
while (!rewind->Valid ()) {
866
873
YIELD_ASC (vqid);
0 commit comments