|
|
|
@ -7,8 +7,7 @@
|
|
|
|
|
#include "video_core/rasterizer_interface.h"
|
|
|
|
|
#include "video_core/textures/decoders.h"
|
|
|
|
|
|
|
|
|
|
namespace Tegra {
|
|
|
|
|
namespace Engines {
|
|
|
|
|
namespace Tegra::Engines {
|
|
|
|
|
|
|
|
|
|
MaxwellDMA::MaxwellDMA(VideoCore::RasterizerInterface& rasterizer, MemoryManager& memory_manager)
|
|
|
|
|
: memory_manager(memory_manager), rasterizer{rasterizer} {}
|
|
|
|
@ -78,9 +77,9 @@ void MaxwellDMA::HandleCopy() {
|
|
|
|
|
|
|
|
|
|
ASSERT(regs.exec.enable_2d == 1);
|
|
|
|
|
|
|
|
|
|
std::size_t copy_size = regs.x_count * regs.y_count;
|
|
|
|
|
const std::size_t copy_size = regs.x_count * regs.y_count;
|
|
|
|
|
|
|
|
|
|
const auto FlushAndInvalidate = [&](u32 src_size, u32 dst_size) {
|
|
|
|
|
const auto FlushAndInvalidate = [&](u32 src_size, u64 dst_size) {
|
|
|
|
|
// TODO(Subv): For now, manually flush the regions until we implement GPU-accelerated
|
|
|
|
|
// copying.
|
|
|
|
|
rasterizer.FlushRegion(source_cpu, src_size);
|
|
|
|
@ -91,14 +90,11 @@ void MaxwellDMA::HandleCopy() {
|
|
|
|
|
rasterizer.InvalidateRegion(dest_cpu, dst_size);
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
u8* src_buffer = Memory::GetPointer(source_cpu);
|
|
|
|
|
u8* dst_buffer = Memory::GetPointer(dest_cpu);
|
|
|
|
|
|
|
|
|
|
if (regs.exec.is_dst_linear && !regs.exec.is_src_linear) {
|
|
|
|
|
ASSERT(regs.src_params.size_z == 1);
|
|
|
|
|
// If the input is tiled and the output is linear, deswizzle the input and copy it over.
|
|
|
|
|
|
|
|
|
|
u32 src_bytes_per_pixel = regs.src_pitch / regs.src_params.size_x;
|
|
|
|
|
const u32 src_bytes_per_pixel = regs.src_pitch / regs.src_params.size_x;
|
|
|
|
|
|
|
|
|
|
FlushAndInvalidate(regs.src_pitch * regs.src_params.size_y,
|
|
|
|
|
copy_size * src_bytes_per_pixel);
|
|
|
|
@ -111,7 +107,7 @@ void MaxwellDMA::HandleCopy() {
|
|
|
|
|
ASSERT(regs.dst_params.size_z == 1);
|
|
|
|
|
ASSERT(regs.src_pitch == regs.x_count);
|
|
|
|
|
|
|
|
|
|
u32 src_bpp = regs.src_pitch / regs.x_count;
|
|
|
|
|
const u32 src_bpp = regs.src_pitch / regs.x_count;
|
|
|
|
|
|
|
|
|
|
FlushAndInvalidate(regs.src_pitch * regs.y_count,
|
|
|
|
|
regs.dst_params.size_x * regs.dst_params.size_y * src_bpp);
|
|
|
|
@ -122,5 +118,4 @@ void MaxwellDMA::HandleCopy() {
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
} // namespace Engines
|
|
|
|
|
} // namespace Tegra
|
|
|
|
|
} // namespace Tegra::Engines
|
|
|
|
|