mirror of
https://github.com/shadps4-emu/shadPS4.git
synced 2025-05-25 04:45:00 +00:00
Implement DmaDataSrc::MemoryUsingL2 and DmaDataDst::MemoryUsingL2 (#2680)
* Implement DmaDataSrc::MemoryUsingL2 and DmaDataDst::MemoryUsingL2 * Add L2 handling to the other place it's used
This commit is contained in:
parent
9c37aa039b
commit
5caab76a45
2 changed files with 22 additions and 10 deletions
|
@ -602,20 +602,25 @@ Liverpool::Task Liverpool::ProcessGraphics(std::span<const u32> dcb, std::span<c
|
||||||
if (dma_data->src_sel == DmaDataSrc::Data && dma_data->dst_sel == DmaDataDst::Gds) {
|
if (dma_data->src_sel == DmaDataSrc::Data && dma_data->dst_sel == DmaDataDst::Gds) {
|
||||||
rasterizer->InlineData(dma_data->dst_addr_lo, &dma_data->data, sizeof(u32),
|
rasterizer->InlineData(dma_data->dst_addr_lo, &dma_data->data, sizeof(u32),
|
||||||
true);
|
true);
|
||||||
} else if (dma_data->src_sel == DmaDataSrc::Memory &&
|
} else if ((dma_data->src_sel == DmaDataSrc::Memory ||
|
||||||
|
dma_data->src_sel == DmaDataSrc::MemoryUsingL2) &&
|
||||||
dma_data->dst_sel == DmaDataDst::Gds) {
|
dma_data->dst_sel == DmaDataDst::Gds) {
|
||||||
rasterizer->InlineData(dma_data->dst_addr_lo,
|
rasterizer->InlineData(dma_data->dst_addr_lo,
|
||||||
dma_data->SrcAddress<const void*>(),
|
dma_data->SrcAddress<const void*>(),
|
||||||
dma_data->NumBytes(), true);
|
dma_data->NumBytes(), true);
|
||||||
} else if (dma_data->src_sel == DmaDataSrc::Data &&
|
} else if (dma_data->src_sel == DmaDataSrc::Data &&
|
||||||
dma_data->dst_sel == DmaDataDst::Memory) {
|
(dma_data->dst_sel == DmaDataDst::Memory ||
|
||||||
|
dma_data->dst_sel == DmaDataDst::MemoryUsingL2)) {
|
||||||
rasterizer->InlineData(dma_data->DstAddress<VAddr>(), &dma_data->data,
|
rasterizer->InlineData(dma_data->DstAddress<VAddr>(), &dma_data->data,
|
||||||
sizeof(u32), false);
|
sizeof(u32), false);
|
||||||
} else if (dma_data->src_sel == DmaDataSrc::Gds &&
|
} else if (dma_data->src_sel == DmaDataSrc::Gds &&
|
||||||
dma_data->dst_sel == DmaDataDst::Memory) {
|
(dma_data->dst_sel == DmaDataDst::Memory ||
|
||||||
|
dma_data->dst_sel == DmaDataDst::MemoryUsingL2)) {
|
||||||
// LOG_WARNING(Render_Vulkan, "GDS memory read");
|
// LOG_WARNING(Render_Vulkan, "GDS memory read");
|
||||||
} else if (dma_data->src_sel == DmaDataSrc::Memory &&
|
} else if ((dma_data->src_sel == DmaDataSrc::Memory ||
|
||||||
dma_data->dst_sel == DmaDataDst::Memory) {
|
dma_data->src_sel == DmaDataSrc::MemoryUsingL2) &&
|
||||||
|
(dma_data->dst_sel == DmaDataDst::Memory ||
|
||||||
|
dma_data->dst_sel == DmaDataDst::MemoryUsingL2)) {
|
||||||
rasterizer->InlineData(dma_data->DstAddress<VAddr>(),
|
rasterizer->InlineData(dma_data->DstAddress<VAddr>(),
|
||||||
dma_data->SrcAddress<const void*>(),
|
dma_data->SrcAddress<const void*>(),
|
||||||
dma_data->NumBytes(), false);
|
dma_data->NumBytes(), false);
|
||||||
|
@ -785,19 +790,24 @@ Liverpool::Task Liverpool::ProcessCompute(const u32* acb, u32 acb_dwords, u32 vq
|
||||||
}
|
}
|
||||||
if (dma_data->src_sel == DmaDataSrc::Data && dma_data->dst_sel == DmaDataDst::Gds) {
|
if (dma_data->src_sel == DmaDataSrc::Data && dma_data->dst_sel == DmaDataDst::Gds) {
|
||||||
rasterizer->InlineData(dma_data->dst_addr_lo, &dma_data->data, sizeof(u32), true);
|
rasterizer->InlineData(dma_data->dst_addr_lo, &dma_data->data, sizeof(u32), true);
|
||||||
} else if (dma_data->src_sel == DmaDataSrc::Memory &&
|
} else if ((dma_data->src_sel == DmaDataSrc::Memory ||
|
||||||
|
dma_data->src_sel == DmaDataSrc::MemoryUsingL2) &&
|
||||||
dma_data->dst_sel == DmaDataDst::Gds) {
|
dma_data->dst_sel == DmaDataDst::Gds) {
|
||||||
rasterizer->InlineData(dma_data->dst_addr_lo, dma_data->SrcAddress<const void*>(),
|
rasterizer->InlineData(dma_data->dst_addr_lo, dma_data->SrcAddress<const void*>(),
|
||||||
dma_data->NumBytes(), true);
|
dma_data->NumBytes(), true);
|
||||||
} else if (dma_data->src_sel == DmaDataSrc::Data &&
|
} else if (dma_data->src_sel == DmaDataSrc::Data &&
|
||||||
dma_data->dst_sel == DmaDataDst::Memory) {
|
(dma_data->dst_sel == DmaDataDst::Memory ||
|
||||||
|
dma_data->dst_sel == DmaDataDst::MemoryUsingL2)) {
|
||||||
rasterizer->InlineData(dma_data->DstAddress<VAddr>(), &dma_data->data, sizeof(u32),
|
rasterizer->InlineData(dma_data->DstAddress<VAddr>(), &dma_data->data, sizeof(u32),
|
||||||
false);
|
false);
|
||||||
} else if (dma_data->src_sel == DmaDataSrc::Gds &&
|
} else if (dma_data->src_sel == DmaDataSrc::Gds &&
|
||||||
dma_data->dst_sel == DmaDataDst::Memory) {
|
(dma_data->dst_sel == DmaDataDst::Memory ||
|
||||||
|
dma_data->dst_sel == DmaDataDst::MemoryUsingL2)) {
|
||||||
// LOG_WARNING(Render_Vulkan, "GDS memory read");
|
// LOG_WARNING(Render_Vulkan, "GDS memory read");
|
||||||
} else if (dma_data->src_sel == DmaDataSrc::Memory &&
|
} else if ((dma_data->src_sel == DmaDataSrc::Memory ||
|
||||||
dma_data->dst_sel == DmaDataDst::Memory) {
|
dma_data->src_sel == DmaDataSrc::MemoryUsingL2) &&
|
||||||
|
(dma_data->dst_sel == DmaDataDst::Memory ||
|
||||||
|
dma_data->dst_sel == DmaDataDst::MemoryUsingL2)) {
|
||||||
rasterizer->InlineData(dma_data->DstAddress<VAddr>(),
|
rasterizer->InlineData(dma_data->DstAddress<VAddr>(),
|
||||||
dma_data->SrcAddress<const void*>(), dma_data->NumBytes(),
|
dma_data->SrcAddress<const void*>(), dma_data->NumBytes(),
|
||||||
false);
|
false);
|
||||||
|
|
|
@ -377,12 +377,14 @@ struct PM4CmdAcquireMem {
|
||||||
enum class DmaDataDst : u32 {
|
enum class DmaDataDst : u32 {
|
||||||
Memory = 0,
|
Memory = 0,
|
||||||
Gds = 1,
|
Gds = 1,
|
||||||
|
MemoryUsingL2 = 3,
|
||||||
};
|
};
|
||||||
|
|
||||||
enum class DmaDataSrc : u32 {
|
enum class DmaDataSrc : u32 {
|
||||||
Memory = 0,
|
Memory = 0,
|
||||||
Gds = 1,
|
Gds = 1,
|
||||||
Data = 2,
|
Data = 2,
|
||||||
|
MemoryUsingL2 = 3,
|
||||||
};
|
};
|
||||||
|
|
||||||
struct PM4DmaData {
|
struct PM4DmaData {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue