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