@@ -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 ();
@@ -817,8 +821,8 @@ Liverpool::Task Liverpool::ProcessCompute(const u32* acb, u32 acb_dwords, u32 vq
817
821
} else if ((dma_data->src_sel == DmaDataSrc::Memory ||
818
822
dma_data->src_sel == DmaDataSrc::MemoryUsingL2) &&
819
823
dma_data->dst_sel == DmaDataDst::Gds) {
820
- rasterizer->InlineData (dma_data->dst_addr_lo , dma_data->SrcAddress <const void * >(),
821
- dma_data->NumBytes (), true );
824
+ rasterizer->CopyBuffer (dma_data->dst_addr_lo , dma_data->SrcAddress <VAddr >(),
825
+ dma_data->NumBytes (), true , false );
822
826
} else if (dma_data->src_sel == DmaDataSrc::Data &&
823
827
(dma_data->dst_sel == DmaDataDst::Memory ||
824
828
dma_data->dst_sel == DmaDataDst::MemoryUsingL2)) {
@@ -827,14 +831,14 @@ Liverpool::Task Liverpool::ProcessCompute(const u32* acb, u32 acb_dwords, u32 vq
827
831
} else if (dma_data->src_sel == DmaDataSrc::Gds &&
828
832
(dma_data->dst_sel == DmaDataDst::Memory ||
829
833
dma_data->dst_sel == DmaDataDst::MemoryUsingL2)) {
830
- // LOG_WARNING(Render_Vulkan, "GDS memory read");
834
+ rasterizer->CopyBuffer (dma_data->DstAddress <VAddr>(), dma_data->src_addr_lo ,
835
+ dma_data->NumBytes (), false , true );
831
836
} else if ((dma_data->src_sel == DmaDataSrc::Memory ||
832
837
dma_data->src_sel == DmaDataSrc::MemoryUsingL2) &&
833
838
(dma_data->dst_sel == DmaDataDst::Memory ||
834
839
dma_data->dst_sel == DmaDataDst::MemoryUsingL2)) {
835
- rasterizer->InlineData (dma_data->DstAddress <VAddr>(),
836
- dma_data->SrcAddress <const void *>(), dma_data->NumBytes (),
837
- false );
840
+ rasterizer->CopyBuffer (dma_data->DstAddress <VAddr>(), dma_data->SrcAddress <VAddr>(),
841
+ dma_data->NumBytes (), false , false );
838
842
} else {
839
843
UNREACHABLE_MSG (" WriteData src_sel = {}, dst_sel = {}" ,
840
844
u32 (dma_data->src_sel .Value ()), u32 (dma_data->dst_sel .Value ()));
@@ -845,6 +849,9 @@ Liverpool::Task Liverpool::ProcessCompute(const u32* acb, u32 acb_dwords, u32 vq
845
849
break ;
846
850
}
847
851
case PM4ItOpcode::Rewind: {
852
+ if (!rasterizer) {
853
+ break ;
854
+ }
848
855
const PM4CmdRewind* rewind = reinterpret_cast <const PM4CmdRewind*>(header);
849
856
while (!rewind->Valid ()) {
850
857
YIELD_ASC (vqid);
0 commit comments