@@ -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
{
@@ -605,9 +606,8 @@ Liverpool::Task Liverpool::ProcessGraphics(std::span<const u32> dcb, std::span<c
605
606
} else if ((dma_data->src_sel == DmaDataSrc::Memory ||
606
607
dma_data->src_sel == DmaDataSrc::MemoryUsingL2) &&
607
608
dma_data->dst_sel == DmaDataDst::Gds) {
608
- rasterizer->InlineData (dma_data->dst_addr_lo ,
609
- dma_data->SrcAddress <const void *>(),
610
- dma_data->NumBytes (), true );
609
+ rasterizer->CopyBuffer (dma_data->dst_addr_lo , dma_data->SrcAddress <VAddr>(),
610
+ dma_data->NumBytes (), true , false );
611
611
} else if (dma_data->src_sel == DmaDataSrc::Data &&
612
612
(dma_data->dst_sel == DmaDataDst::Memory ||
613
613
dma_data->dst_sel == DmaDataDst::MemoryUsingL2)) {
@@ -616,14 +616,15 @@ Liverpool::Task Liverpool::ProcessGraphics(std::span<const u32> dcb, std::span<c
616
616
} else if (dma_data->src_sel == DmaDataSrc::Gds &&
617
617
(dma_data->dst_sel == DmaDataDst::Memory ||
618
618
dma_data->dst_sel == DmaDataDst::MemoryUsingL2)) {
619
- // LOG_WARNING(Render_Vulkan, "GDS memory read");
619
+ rasterizer->CopyBuffer (dma_data->DstAddress <VAddr>(), dma_data->src_addr_lo ,
620
+ dma_data->NumBytes (), false , true );
620
621
} else if ((dma_data->src_sel == DmaDataSrc::Memory ||
621
622
dma_data->src_sel == DmaDataSrc::MemoryUsingL2) &&
622
623
(dma_data->dst_sel == DmaDataDst::Memory ||
623
624
dma_data->dst_sel == DmaDataDst::MemoryUsingL2)) {
624
- rasterizer->InlineData (dma_data->DstAddress <VAddr>(),
625
- dma_data->SrcAddress <const void *> (),
626
- dma_data-> NumBytes () , false );
625
+ rasterizer->CopyBuffer (dma_data->DstAddress <VAddr>(),
626
+ dma_data->SrcAddress <VAddr>(), dma_data-> NumBytes (),
627
+ false , false );
627
628
} else {
628
629
UNREACHABLE_MSG (" WriteData src_sel = {}, dst_sel = {}" ,
629
630
u32 (dma_data->src_sel .Value ()), u32 (dma_data->dst_sel .Value ()));
@@ -659,6 +660,9 @@ Liverpool::Task Liverpool::ProcessGraphics(std::span<const u32> dcb, std::span<c
659
660
break ;
660
661
}
661
662
case PM4ItOpcode::Rewind: {
663
+ if (!rasterizer) {
664
+ break ;
665
+ }
662
666
const PM4CmdRewind* rewind = reinterpret_cast <const PM4CmdRewind*>(header);
663
667
while (!rewind->Valid ()) {
664
668
YIELD_GFX ();
@@ -794,8 +798,8 @@ Liverpool::Task Liverpool::ProcessCompute(const u32* acb, u32 acb_dwords, u32 vq
794
798
} else if ((dma_data->src_sel == DmaDataSrc::Memory ||
795
799
dma_data->src_sel == DmaDataSrc::MemoryUsingL2) &&
796
800
dma_data->dst_sel == DmaDataDst::Gds) {
797
- rasterizer->InlineData (dma_data->dst_addr_lo , dma_data->SrcAddress <const void * >(),
798
- dma_data->NumBytes (), true );
801
+ rasterizer->CopyBuffer (dma_data->dst_addr_lo , dma_data->SrcAddress <VAddr >(),
802
+ dma_data->NumBytes (), true , false );
799
803
} else if (dma_data->src_sel == DmaDataSrc::Data &&
800
804
(dma_data->dst_sel == DmaDataDst::Memory ||
801
805
dma_data->dst_sel == DmaDataDst::MemoryUsingL2)) {
@@ -804,14 +808,14 @@ Liverpool::Task Liverpool::ProcessCompute(const u32* acb, u32 acb_dwords, u32 vq
804
808
} else if (dma_data->src_sel == DmaDataSrc::Gds &&
805
809
(dma_data->dst_sel == DmaDataDst::Memory ||
806
810
dma_data->dst_sel == DmaDataDst::MemoryUsingL2)) {
807
- // LOG_WARNING(Render_Vulkan, "GDS memory read");
811
+ rasterizer->CopyBuffer (dma_data->DstAddress <VAddr>(), dma_data->src_addr_lo ,
812
+ dma_data->NumBytes (), false , true );
808
813
} else if ((dma_data->src_sel == DmaDataSrc::Memory ||
809
814
dma_data->src_sel == DmaDataSrc::MemoryUsingL2) &&
810
815
(dma_data->dst_sel == DmaDataDst::Memory ||
811
816
dma_data->dst_sel == DmaDataDst::MemoryUsingL2)) {
812
- rasterizer->InlineData (dma_data->DstAddress <VAddr>(),
813
- dma_data->SrcAddress <const void *>(), dma_data->NumBytes (),
814
- false );
817
+ rasterizer->CopyBuffer (dma_data->DstAddress <VAddr>(), dma_data->SrcAddress <VAddr>(),
818
+ dma_data->NumBytes (), false , false );
815
819
} else {
816
820
UNREACHABLE_MSG (" WriteData src_sel = {}, dst_sel = {}" ,
817
821
u32 (dma_data->src_sel .Value ()), u32 (dma_data->dst_sel .Value ()));
@@ -822,6 +826,9 @@ Liverpool::Task Liverpool::ProcessCompute(const u32* acb, u32 acb_dwords, u32 vq
822
826
break ;
823
827
}
824
828
case PM4ItOpcode::Rewind: {
829
+ if (!rasterizer) {
830
+ break ;
831
+ }
825
832
const PM4CmdRewind* rewind = reinterpret_cast <const PM4CmdRewind*>(header);
826
833
while (!rewind->Valid ()) {
827
834
YIELD_ASC (vqid);
0 commit comments