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