@@ -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
{
@@ -627,9 +628,8 @@ Liverpool::Task Liverpool::ProcessGraphics(std::span<const u32> dcb, std::span<c
627
628
} else if ((dma_data->src_sel == DmaDataSrc::Memory ||
628
629
dma_data->src_sel == DmaDataSrc::MemoryUsingL2) &&
629
630
dma_data->dst_sel == DmaDataDst::Gds) {
630
- rasterizer->InlineData (dma_data->dst_addr_lo ,
631
- dma_data->SrcAddress <const void *>(),
632
- dma_data->NumBytes (), true );
631
+ rasterizer->CopyBuffer (dma_data->dst_addr_lo , dma_data->SrcAddress <VAddr>(),
632
+ dma_data->NumBytes (), true , false );
633
633
} else if (dma_data->src_sel == DmaDataSrc::Data &&
634
634
(dma_data->dst_sel == DmaDataDst::Memory ||
635
635
dma_data->dst_sel == DmaDataDst::MemoryUsingL2)) {
@@ -638,14 +638,15 @@ Liverpool::Task Liverpool::ProcessGraphics(std::span<const u32> dcb, std::span<c
638
638
} else if (dma_data->src_sel == DmaDataSrc::Gds &&
639
639
(dma_data->dst_sel == DmaDataDst::Memory ||
640
640
dma_data->dst_sel == DmaDataDst::MemoryUsingL2)) {
641
- // LOG_WARNING(Render_Vulkan, "GDS memory read");
641
+ rasterizer->CopyBuffer (dma_data->DstAddress <VAddr>(), dma_data->src_addr_lo ,
642
+ dma_data->NumBytes (), false , true );
642
643
} else if ((dma_data->src_sel == DmaDataSrc::Memory ||
643
644
dma_data->src_sel == DmaDataSrc::MemoryUsingL2) &&
644
645
(dma_data->dst_sel == DmaDataDst::Memory ||
645
646
dma_data->dst_sel == DmaDataDst::MemoryUsingL2)) {
646
- rasterizer->InlineData (dma_data->DstAddress <VAddr>(),
647
- dma_data->SrcAddress <const void *> (),
648
- dma_data-> NumBytes () , false );
647
+ rasterizer->CopyBuffer (dma_data->DstAddress <VAddr>(),
648
+ dma_data->SrcAddress <VAddr>(), dma_data-> NumBytes (),
649
+ false , false );
649
650
} else {
650
651
UNREACHABLE_MSG (" WriteData src_sel = {}, dst_sel = {}" ,
651
652
u32 (dma_data->src_sel .Value ()), u32 (dma_data->dst_sel .Value ()));
@@ -681,6 +682,9 @@ Liverpool::Task Liverpool::ProcessGraphics(std::span<const u32> dcb, std::span<c
681
682
break ;
682
683
}
683
684
case PM4ItOpcode::Rewind: {
685
+ if (!rasterizer) {
686
+ break ;
687
+ }
684
688
const PM4CmdRewind* rewind = reinterpret_cast <const PM4CmdRewind*>(header);
685
689
while (!rewind->Valid ()) {
686
690
YIELD_GFX ();
@@ -815,8 +819,8 @@ Liverpool::Task Liverpool::ProcessCompute(const u32* acb, u32 acb_dwords, u32 vq
815
819
} else if ((dma_data->src_sel == DmaDataSrc::Memory ||
816
820
dma_data->src_sel == DmaDataSrc::MemoryUsingL2) &&
817
821
dma_data->dst_sel == DmaDataDst::Gds) {
818
- rasterizer->InlineData (dma_data->dst_addr_lo , dma_data->SrcAddress <const void * >(),
819
- dma_data->NumBytes (), true );
822
+ rasterizer->CopyBuffer (dma_data->dst_addr_lo , dma_data->SrcAddress <VAddr >(),
823
+ dma_data->NumBytes (), true , false );
820
824
} else if (dma_data->src_sel == DmaDataSrc::Data &&
821
825
(dma_data->dst_sel == DmaDataDst::Memory ||
822
826
dma_data->dst_sel == DmaDataDst::MemoryUsingL2)) {
@@ -825,14 +829,14 @@ Liverpool::Task Liverpool::ProcessCompute(const u32* acb, u32 acb_dwords, u32 vq
825
829
} else if (dma_data->src_sel == DmaDataSrc::Gds &&
826
830
(dma_data->dst_sel == DmaDataDst::Memory ||
827
831
dma_data->dst_sel == DmaDataDst::MemoryUsingL2)) {
828
- // LOG_WARNING(Render_Vulkan, "GDS memory read");
832
+ rasterizer->CopyBuffer (dma_data->DstAddress <VAddr>(), dma_data->src_addr_lo ,
833
+ dma_data->NumBytes (), false , true );
829
834
} else if ((dma_data->src_sel == DmaDataSrc::Memory ||
830
835
dma_data->src_sel == DmaDataSrc::MemoryUsingL2) &&
831
836
(dma_data->dst_sel == DmaDataDst::Memory ||
832
837
dma_data->dst_sel == DmaDataDst::MemoryUsingL2)) {
833
- rasterizer->InlineData (dma_data->DstAddress <VAddr>(),
834
- dma_data->SrcAddress <const void *>(), dma_data->NumBytes (),
835
- false );
838
+ rasterizer->CopyBuffer (dma_data->DstAddress <VAddr>(), dma_data->SrcAddress <VAddr>(),
839
+ dma_data->NumBytes (), false , false );
836
840
} else {
837
841
UNREACHABLE_MSG (" WriteData src_sel = {}, dst_sel = {}" ,
838
842
u32 (dma_data->src_sel .Value ()), u32 (dma_data->dst_sel .Value ()));
@@ -843,6 +847,9 @@ Liverpool::Task Liverpool::ProcessCompute(const u32* acb, u32 acb_dwords, u32 vq
843
847
break ;
844
848
}
845
849
case PM4ItOpcode::Rewind: {
850
+ if (!rasterizer) {
851
+ break ;
852
+ }
846
853
const PM4CmdRewind* rewind = reinterpret_cast <const PM4CmdRewind*>(header);
847
854
while (!rewind->Valid ()) {
848
855
YIELD_ASC (vqid);
0 commit comments