@@ -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
{
@@ -606,9 +607,8 @@ Liverpool::Task Liverpool::ProcessGraphics(std::span<const u32> dcb, std::span<c
606
607
} else if ((dma_data->src_sel == DmaDataSrc::Memory ||
607
608
dma_data->src_sel == DmaDataSrc::MemoryUsingL2) &&
608
609
dma_data->dst_sel == DmaDataDst::Gds) {
609
- rasterizer->InlineData (dma_data->dst_addr_lo ,
610
- dma_data->SrcAddress <const void *>(),
611
- dma_data->NumBytes (), true );
610
+ rasterizer->CopyBuffer (dma_data->dst_addr_lo , dma_data->SrcAddress <VAddr>(),
611
+ dma_data->NumBytes (), true , false );
612
612
} else if (dma_data->src_sel == DmaDataSrc::Data &&
613
613
(dma_data->dst_sel == DmaDataDst::Memory ||
614
614
dma_data->dst_sel == DmaDataDst::MemoryUsingL2)) {
@@ -617,14 +617,15 @@ Liverpool::Task Liverpool::ProcessGraphics(std::span<const u32> dcb, std::span<c
617
617
} else if (dma_data->src_sel == DmaDataSrc::Gds &&
618
618
(dma_data->dst_sel == DmaDataDst::Memory ||
619
619
dma_data->dst_sel == DmaDataDst::MemoryUsingL2)) {
620
- // LOG_WARNING(Render_Vulkan, "GDS memory read");
620
+ rasterizer->CopyBuffer (dma_data->DstAddress <VAddr>(), dma_data->src_addr_lo ,
621
+ dma_data->NumBytes (), false , true );
621
622
} else if ((dma_data->src_sel == DmaDataSrc::Memory ||
622
623
dma_data->src_sel == DmaDataSrc::MemoryUsingL2) &&
623
624
(dma_data->dst_sel == DmaDataDst::Memory ||
624
625
dma_data->dst_sel == DmaDataDst::MemoryUsingL2)) {
625
- rasterizer->InlineData (dma_data->DstAddress <VAddr>(),
626
- dma_data->SrcAddress <const void *> (),
627
- dma_data-> NumBytes () , false );
626
+ rasterizer->CopyBuffer (dma_data->DstAddress <VAddr>(),
627
+ dma_data->SrcAddress <VAddr>(), dma_data-> NumBytes (),
628
+ false , false );
628
629
} else {
629
630
UNREACHABLE_MSG (" WriteData src_sel = {}, dst_sel = {}" ,
630
631
u32 (dma_data->src_sel .Value ()), u32 (dma_data->dst_sel .Value ()));
@@ -660,6 +661,9 @@ Liverpool::Task Liverpool::ProcessGraphics(std::span<const u32> dcb, std::span<c
660
661
break ;
661
662
}
662
663
case PM4ItOpcode::Rewind: {
664
+ if (!rasterizer) {
665
+ break ;
666
+ }
663
667
const PM4CmdRewind* rewind = reinterpret_cast <const PM4CmdRewind*>(header);
664
668
while (!rewind->Valid ()) {
665
669
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