From a91d3fc6397560fc6294a24faeed73d45abd1753 Mon Sep 17 00:00:00 2001 From: Fernando Sahmkow Date: Mon, 22 Apr 2019 18:50:56 -0400 Subject: Revamp Kepler Memory to use a subegine to manage uploads --- src/video_core/engines/engine_upload.cpp | 44 ++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) create mode 100644 src/video_core/engines/engine_upload.cpp (limited to 'src/video_core/engines/engine_upload.cpp') diff --git a/src/video_core/engines/engine_upload.cpp b/src/video_core/engines/engine_upload.cpp new file mode 100644 index 000000000..201f8e273 --- /dev/null +++ b/src/video_core/engines/engine_upload.cpp @@ -0,0 +1,44 @@ +// Copyright 2019 yuzu Emulator Project +// Licensed under GPLv2 or any later version +// Refer to the license.txt file included. + +#include "common/assert.h" +#include "video_core/engines/engine_upload.h" +#include "video_core/memory_manager.h" +#include "video_core/textures/decoders.h" + +namespace Tegra::Engines::Upload { + +void State::ProcessExec(const bool is_linear) { + write_offset = 0; + copy_size = regs.line_length_in * regs.line_count; + inner_buffer.resize(copy_size); + linear = is_linear; +} + +void State::ProcessData(const u32 data, const bool is_last_call) { + const u32 sub_copy_size = std::min(4U, copy_size - write_offset); + std::memcpy(&inner_buffer[write_offset], &data, sub_copy_size); + write_offset += sub_copy_size; + if (is_last_call) { + const GPUVAddr address{regs.dest.Address()}; + if (linear) { + memory_manager.WriteBlock(address, inner_buffer.data(), copy_size); + } else { + UNIMPLEMENTED_IF(regs.dest.z != 0); + UNIMPLEMENTED_IF(regs.dest.depth != 1); + UNIMPLEMENTED_IF(regs.dest.BlockWidth() != 1); + UNIMPLEMENTED_IF(regs.dest.BlockDepth() != 1); + const std::size_t dst_size = Tegra::Texture::CalculateSize( + true, 1, regs.dest.width, regs.dest.height, 1, regs.dest.BlockHeight(), 1); + std::vector tmp_buffer(dst_size); + memory_manager.ReadBlock(address, tmp_buffer.data(), dst_size); + Tegra::Texture::SwizzleKepler(regs.dest.width, regs.dest.height, regs.dest.x, + regs.dest.y, regs.dest.BlockHeight(), copy_size, + inner_buffer.data(), tmp_buffer.data()); + memory_manager.WriteBlock(address, tmp_buffer.data(), dst_size); + } + } +} + +} // namespace Tegra::Engines::Upload -- cgit v1.2.3 From 021d28c9b81d86d52b989b4cc6828f33c6a63c9b Mon Sep 17 00:00:00 2001 From: Fernando Sahmkow Date: Tue, 23 Apr 2019 08:02:24 -0400 Subject: Corrections and styling --- src/video_core/engines/engine_upload.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) (limited to 'src/video_core/engines/engine_upload.cpp') diff --git a/src/video_core/engines/engine_upload.cpp b/src/video_core/engines/engine_upload.cpp index 201f8e273..663d5517a 100644 --- a/src/video_core/engines/engine_upload.cpp +++ b/src/video_core/engines/engine_upload.cpp @@ -9,11 +9,14 @@ namespace Tegra::Engines::Upload { +State::State(MemoryManager& memory_manager, Data& regs) + : memory_manager(memory_manager), regs(regs) {} + void State::ProcessExec(const bool is_linear) { write_offset = 0; copy_size = regs.line_length_in * regs.line_count; inner_buffer.resize(copy_size); - linear = is_linear; + this->is_linear = is_linear; } void State::ProcessData(const u32 data, const bool is_last_call) { -- cgit v1.2.3 From f1e5314f1a57b09bd45e0db3ca91449e761c431a Mon Sep 17 00:00:00 2001 From: Fernando Sahmkow Date: Tue, 23 Apr 2019 11:21:00 -0400 Subject: Add Swizzle Parameters to the DMA engine --- src/video_core/engines/engine_upload.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/video_core/engines/engine_upload.cpp') diff --git a/src/video_core/engines/engine_upload.cpp b/src/video_core/engines/engine_upload.cpp index 663d5517a..867457f25 100644 --- a/src/video_core/engines/engine_upload.cpp +++ b/src/video_core/engines/engine_upload.cpp @@ -25,7 +25,7 @@ void State::ProcessData(const u32 data, const bool is_last_call) { write_offset += sub_copy_size; if (is_last_call) { const GPUVAddr address{regs.dest.Address()}; - if (linear) { + if (is_linear) { memory_manager.WriteBlock(address, inner_buffer.data(), copy_size); } else { UNIMPLEMENTED_IF(regs.dest.z != 0); -- cgit v1.2.3 From e64c41efe88e8f88014fef912b06b71b3df17e85 Mon Sep 17 00:00:00 2001 From: Fernando Sahmkow Date: Thu, 25 Apr 2019 12:57:10 -0400 Subject: Refactors and name corrections. --- src/video_core/engines/engine_upload.cpp | 39 ++++++++++++++++---------------- 1 file changed, 20 insertions(+), 19 deletions(-) (limited to 'src/video_core/engines/engine_upload.cpp') diff --git a/src/video_core/engines/engine_upload.cpp b/src/video_core/engines/engine_upload.cpp index 867457f25..f8aa4ff55 100644 --- a/src/video_core/engines/engine_upload.cpp +++ b/src/video_core/engines/engine_upload.cpp @@ -9,7 +9,7 @@ namespace Tegra::Engines::Upload { -State::State(MemoryManager& memory_manager, Data& regs) +State::State(MemoryManager& memory_manager, Registers& regs) : memory_manager(memory_manager), regs(regs) {} void State::ProcessExec(const bool is_linear) { @@ -23,24 +23,25 @@ void State::ProcessData(const u32 data, const bool is_last_call) { const u32 sub_copy_size = std::min(4U, copy_size - write_offset); std::memcpy(&inner_buffer[write_offset], &data, sub_copy_size); write_offset += sub_copy_size; - if (is_last_call) { - const GPUVAddr address{regs.dest.Address()}; - if (is_linear) { - memory_manager.WriteBlock(address, inner_buffer.data(), copy_size); - } else { - UNIMPLEMENTED_IF(regs.dest.z != 0); - UNIMPLEMENTED_IF(regs.dest.depth != 1); - UNIMPLEMENTED_IF(regs.dest.BlockWidth() != 1); - UNIMPLEMENTED_IF(regs.dest.BlockDepth() != 1); - const std::size_t dst_size = Tegra::Texture::CalculateSize( - true, 1, regs.dest.width, regs.dest.height, 1, regs.dest.BlockHeight(), 1); - std::vector tmp_buffer(dst_size); - memory_manager.ReadBlock(address, tmp_buffer.data(), dst_size); - Tegra::Texture::SwizzleKepler(regs.dest.width, regs.dest.height, regs.dest.x, - regs.dest.y, regs.dest.BlockHeight(), copy_size, - inner_buffer.data(), tmp_buffer.data()); - memory_manager.WriteBlock(address, tmp_buffer.data(), dst_size); - } + if (!is_last_call) { + return; + } + const GPUVAddr address{regs.dest.Address()}; + if (is_linear) { + memory_manager.WriteBlock(address, inner_buffer.data(), copy_size); + } else { + UNIMPLEMENTED_IF(regs.dest.z != 0); + UNIMPLEMENTED_IF(regs.dest.depth != 1); + UNIMPLEMENTED_IF(regs.dest.BlockWidth() != 1); + UNIMPLEMENTED_IF(regs.dest.BlockDepth() != 1); + const std::size_t dst_size = Tegra::Texture::CalculateSize( + true, 1, regs.dest.width, regs.dest.height, 1, regs.dest.BlockHeight(), 1); + tmp_buffer.resize(dst_size); + memory_manager.ReadBlock(address, tmp_buffer.data(), dst_size); + Tegra::Texture::SwizzleKepler(regs.dest.width, regs.dest.height, regs.dest.x, regs.dest.y, + regs.dest.BlockHeight(), copy_size, inner_buffer.data(), + tmp_buffer.data()); + memory_manager.WriteBlock(address, tmp_buffer.data(), dst_size); } } -- cgit v1.2.3