aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/core/memory.cpp
diff options
context:
space:
mode:
authorMai <[email protected]>2022-12-11 21:09:31 +0000
committerGitHub <[email protected]>2022-12-11 21:09:31 +0000
commitd5684dbe7d7a562a79e267350ef9a45f23dfb817 (patch)
treeb0d46890c04d8eada6e95f7a25a79f89ff8f6beb /src/core/memory.cpp
parent623429a27ec943f3c1ba758aaf741589b0493ddb (diff)
parented3719244111af380fbba9e13286192c00708dea (diff)
downloadyuzu-mainline-d5684dbe7d7a562a79e267350ef9a45f23dfb817.tar.gz
yuzu-mainline-d5684dbe7d7a562a79e267350ef9a45f23dfb817.zip
Merge pull request #9415 from liamwhite/dc
memory: correct semantics of data cache management operations
Diffstat (limited to 'src/core/memory.cpp')
-rw-r--r--src/core/memory.cpp29
1 files changed, 15 insertions, 14 deletions
diff --git a/src/core/memory.cpp b/src/core/memory.cpp
index b3f50223b..26be74df4 100644
--- a/src/core/memory.cpp
+++ b/src/core/memory.cpp
@@ -6,7 +6,6 @@
#include "common/assert.h"
#include "common/atomic_ops.h"
-#include "common/cache_management.h"
#include "common/common_types.h"
#include "common/logging/log.h"
#include "common/page_table.h"
@@ -340,10 +339,9 @@ struct Memory::Impl {
LOG_ERROR(HW_Memory, "Unmapped cache maintenance @ {:#018X}", current_vaddr);
throw InvalidMemoryException();
},
- [&](const std::size_t block_size, u8* const host_ptr) { cb(block_size, host_ptr); },
+ [&](const std::size_t block_size, u8* const host_ptr) {},
[&](const VAddr current_vaddr, const std::size_t block_size, u8* const host_ptr) {
- system.GPU().FlushRegion(current_vaddr, block_size);
- cb(block_size, host_ptr);
+ cb(current_vaddr, block_size);
},
[](const std::size_t block_size) {});
} catch (InvalidMemoryException&) {
@@ -354,27 +352,30 @@ struct Memory::Impl {
}
Result InvalidateDataCache(const Kernel::KProcess& process, VAddr dest_addr, std::size_t size) {
- auto perform = [&](const std::size_t block_size, u8* const host_ptr) {
- // Do nothing; this operation (dc ivac) cannot be supported
- // from EL0
+ auto on_rasterizer = [&](const VAddr current_vaddr, const std::size_t block_size) {
+ // dc ivac: Invalidate to point of coherency
+ // GPU flush -> CPU invalidate
+ system.GPU().FlushRegion(current_vaddr, block_size);
};
- return PerformCacheOperation(process, dest_addr, size, perform);
+ return PerformCacheOperation(process, dest_addr, size, on_rasterizer);
}
Result StoreDataCache(const Kernel::KProcess& process, VAddr dest_addr, std::size_t size) {
- auto perform = [&](const std::size_t block_size, u8* const host_ptr) {
+ auto on_rasterizer = [&](const VAddr current_vaddr, const std::size_t block_size) {
// dc cvac: Store to point of coherency
- Common::DataCacheLineCleanByVAToPoC(host_ptr, block_size);
+ // CPU flush -> GPU invalidate
+ system.GPU().InvalidateRegion(current_vaddr, block_size);
};
- return PerformCacheOperation(process, dest_addr, size, perform);
+ return PerformCacheOperation(process, dest_addr, size, on_rasterizer);
}
Result FlushDataCache(const Kernel::KProcess& process, VAddr dest_addr, std::size_t size) {
- auto perform = [&](const std::size_t block_size, u8* const host_ptr) {
+ auto on_rasterizer = [&](const VAddr current_vaddr, const std::size_t block_size) {
// dc civac: Store to point of coherency, and invalidate from cache
- Common::DataCacheLineCleanAndInvalidateByVAToPoC(host_ptr, block_size);
+ // CPU flush -> GPU invalidate
+ system.GPU().InvalidateRegion(current_vaddr, block_size);
};
- return PerformCacheOperation(process, dest_addr, size, perform);
+ return PerformCacheOperation(process, dest_addr, size, on_rasterizer);
}
void MarkRegionDebug(VAddr vaddr, u64 size, bool debug) {