@@ -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
{
@@ -628,9 +629,8 @@ Liverpool::Task Liverpool::ProcessGraphics(std::span<const u32> dcb, std::span<c
628
629
} else if ((dma_data->src_sel == DmaDataSrc::Memory ||
629
630
dma_data->src_sel == DmaDataSrc::MemoryUsingL2) &&
630
631
dma_data->dst_sel == DmaDataDst::Gds) {
631
- rasterizer->InlineData (dma_data->dst_addr_lo ,
632
- dma_data->SrcAddress <const void *>(),
633
- dma_data->NumBytes (), true );
632
+ rasterizer->CopyBuffer (dma_data->dst_addr_lo , dma_data->SrcAddress <VAddr>(),
633
+ dma_data->NumBytes (), true , false );
634
634
} else if (dma_data->src_sel == DmaDataSrc::Data &&
635
635
(dma_data->dst_sel == DmaDataDst::Memory ||
636
636
dma_data->dst_sel == DmaDataDst::MemoryUsingL2)) {
@@ -639,14 +639,15 @@ Liverpool::Task Liverpool::ProcessGraphics(std::span<const u32> dcb, std::span<c
639
639
} else if (dma_data->src_sel == DmaDataSrc::Gds &&
640
640
(dma_data->dst_sel == DmaDataDst::Memory ||
641
641
dma_data->dst_sel == DmaDataDst::MemoryUsingL2)) {
642
- // LOG_WARNING(Render_Vulkan, "GDS memory read");
642
+ rasterizer->CopyBuffer (dma_data->DstAddress <VAddr>(), dma_data->src_addr_lo ,
643
+ dma_data->NumBytes (), false , true );
643
644
} else if ((dma_data->src_sel == DmaDataSrc::Memory ||
644
645
dma_data->src_sel == DmaDataSrc::MemoryUsingL2) &&
645
646
(dma_data->dst_sel == DmaDataDst::Memory ||
646
647
dma_data->dst_sel == DmaDataDst::MemoryUsingL2)) {
647
- rasterizer->InlineData (dma_data->DstAddress <VAddr>(),
648
- dma_data->SrcAddress <const void *> (),
649
- dma_data-> NumBytes () , false );
648
+ rasterizer->CopyBuffer (dma_data->DstAddress <VAddr>(),
649
+ dma_data->SrcAddress <VAddr>(), dma_data-> NumBytes (),
650
+ false , false );
650
651
} else {
651
652
UNREACHABLE_MSG (" WriteData src_sel = {}, dst_sel = {}" ,
652
653
u32 (dma_data->src_sel .Value ()), u32 (dma_data->dst_sel .Value ()));
@@ -682,6 +683,9 @@ Liverpool::Task Liverpool::ProcessGraphics(std::span<const u32> dcb, std::span<c
682
683
break ;
683
684
}
684
685
case PM4ItOpcode::Rewind: {
686
+ if (!rasterizer) {
687
+ break ;
688
+ }
685
689
const PM4CmdRewind* rewind = reinterpret_cast <const PM4CmdRewind*>(header);
686
690
while (!rewind->Valid ()) {
687
691
YIELD_GFX ();
@@ -818,8 +822,8 @@ Liverpool::Task Liverpool::ProcessCompute(const u32* acb, u32 acb_dwords, u32 vq
818
822
} else if ((dma_data->src_sel == DmaDataSrc::Memory ||
819
823
dma_data->src_sel == DmaDataSrc::MemoryUsingL2) &&
820
824
dma_data->dst_sel == DmaDataDst::Gds) {
821
- rasterizer->InlineData (dma_data->dst_addr_lo , dma_data->SrcAddress <const void * >(),
822
- dma_data->NumBytes (), true );
825
+ rasterizer->CopyBuffer (dma_data->dst_addr_lo , dma_data->SrcAddress <VAddr >(),
826
+ dma_data->NumBytes (), true , false );
823
827
} else if (dma_data->src_sel == DmaDataSrc::Data &&
824
828
(dma_data->dst_sel == DmaDataDst::Memory ||
825
829
dma_data->dst_sel == DmaDataDst::MemoryUsingL2)) {
@@ -828,14 +832,14 @@ Liverpool::Task Liverpool::ProcessCompute(const u32* acb, u32 acb_dwords, u32 vq
828
832
} else if (dma_data->src_sel == DmaDataSrc::Gds &&
829
833
(dma_data->dst_sel == DmaDataDst::Memory ||
830
834
dma_data->dst_sel == DmaDataDst::MemoryUsingL2)) {
831
- // LOG_WARNING(Render_Vulkan, "GDS memory read");
835
+ rasterizer->CopyBuffer (dma_data->DstAddress <VAddr>(), dma_data->src_addr_lo ,
836
+ dma_data->NumBytes (), false , true );
832
837
} else if ((dma_data->src_sel == DmaDataSrc::Memory ||
833
838
dma_data->src_sel == DmaDataSrc::MemoryUsingL2) &&
834
839
(dma_data->dst_sel == DmaDataDst::Memory ||
835
840
dma_data->dst_sel == DmaDataDst::MemoryUsingL2)) {
836
- rasterizer->InlineData (dma_data->DstAddress <VAddr>(),
837
- dma_data->SrcAddress <const void *>(), dma_data->NumBytes (),
838
- false );
841
+ rasterizer->CopyBuffer (dma_data->DstAddress <VAddr>(), dma_data->SrcAddress <VAddr>(),
842
+ dma_data->NumBytes (), false , false );
839
843
} else {
840
844
UNREACHABLE_MSG (" WriteData src_sel = {}, dst_sel = {}" ,
841
845
u32 (dma_data->src_sel .Value ()), u32 (dma_data->dst_sel .Value ()));
@@ -846,6 +850,9 @@ Liverpool::Task Liverpool::ProcessCompute(const u32* acb, u32 acb_dwords, u32 vq
846
850
break ;
847
851
}
848
852
case PM4ItOpcode::Rewind: {
853
+ if (!rasterizer) {
854
+ break ;
855
+ }
849
856
const PM4CmdRewind* rewind = reinterpret_cast <const PM4CmdRewind*>(header);
850
857
while (!rewind->Valid ()) {
851
858
YIELD_ASC (vqid);
0 commit comments