@@ -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 ();
@@ -796,8 +800,8 @@ Liverpool::Task Liverpool::ProcessCompute(const u32* acb, u32 acb_dwords, u32 vq
796
800
} else if ((dma_data->src_sel == DmaDataSrc::Memory ||
797
801
dma_data->src_sel == DmaDataSrc::MemoryUsingL2) &&
798
802
dma_data->dst_sel == DmaDataDst::Gds) {
799
- rasterizer->InlineData (dma_data->dst_addr_lo , dma_data->SrcAddress <const void * >(),
800
- dma_data->NumBytes (), true );
803
+ rasterizer->CopyBuffer (dma_data->dst_addr_lo , dma_data->SrcAddress <VAddr >(),
804
+ dma_data->NumBytes (), true , false );
801
805
} else if (dma_data->src_sel == DmaDataSrc::Data &&
802
806
(dma_data->dst_sel == DmaDataDst::Memory ||
803
807
dma_data->dst_sel == DmaDataDst::MemoryUsingL2)) {
@@ -806,14 +810,14 @@ Liverpool::Task Liverpool::ProcessCompute(const u32* acb, u32 acb_dwords, u32 vq
806
810
} else if (dma_data->src_sel == DmaDataSrc::Gds &&
807
811
(dma_data->dst_sel == DmaDataDst::Memory ||
808
812
dma_data->dst_sel == DmaDataDst::MemoryUsingL2)) {
809
- // LOG_WARNING(Render_Vulkan, "GDS memory read");
813
+ rasterizer->CopyBuffer (dma_data->DstAddress <VAddr>(), dma_data->src_addr_lo ,
814
+ dma_data->NumBytes (), false , true );
810
815
} else if ((dma_data->src_sel == DmaDataSrc::Memory ||
811
816
dma_data->src_sel == DmaDataSrc::MemoryUsingL2) &&
812
817
(dma_data->dst_sel == DmaDataDst::Memory ||
813
818
dma_data->dst_sel == DmaDataDst::MemoryUsingL2)) {
814
- rasterizer->InlineData (dma_data->DstAddress <VAddr>(),
815
- dma_data->SrcAddress <const void *>(), dma_data->NumBytes (),
816
- false );
819
+ rasterizer->CopyBuffer (dma_data->DstAddress <VAddr>(), dma_data->SrcAddress <VAddr>(),
820
+ dma_data->NumBytes (), false , false );
817
821
} else {
818
822
UNREACHABLE_MSG (" WriteData src_sel = {}, dst_sel = {}" ,
819
823
u32 (dma_data->src_sel .Value ()), u32 (dma_data->dst_sel .Value ()));
@@ -824,6 +828,9 @@ Liverpool::Task Liverpool::ProcessCompute(const u32* acb, u32 acb_dwords, u32 vq
824
828
break ;
825
829
}
826
830
case PM4ItOpcode::Rewind: {
831
+ if (!rasterizer) {
832
+ break ;
833
+ }
827
834
const PM4CmdRewind* rewind = reinterpret_cast <const PM4CmdRewind*>(header);
828
835
while (!rewind->Valid ()) {
829
836
YIELD_ASC (vqid);
0 commit comments