diff --git a/README.md b/README.md index 33d303fa5..9d70f021a 100755 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ yuzu emulator early access ============= -This is the source code for early-access 2610. +This is the source code for early-access 2612. ## Legal Notice diff --git a/src/core/hle/kernel/k_page_table.cpp b/src/core/hle/kernel/k_page_table.cpp index 599013cf6..1a94ed5ec 100755 --- a/src/core/hle/kernel/k_page_table.cpp +++ b/src/core/hle/kernel/k_page_table.cpp @@ -563,6 +563,9 @@ ResultCode KPageTable::UnmapProcessMemory(VAddr dst_addr, std::size_t size, block_manager->Update(dst_addr, num_pages, KMemoryState::Free, KMemoryPermission::None, KMemoryAttribute::None); + // Invalidate CPU cache, as code may have been patched by the guest app. + system.InvalidateCpuInstructionCaches(); + return ResultSuccess; } diff --git a/src/core/memory.cpp b/src/core/memory.cpp index 3fed51400..28d30eee2 100755 --- a/src/core/memory.cpp +++ b/src/core/memory.cpp @@ -322,7 +322,7 @@ struct Memory::Impl { } if (Settings::IsFastmemEnabled()) { - const bool is_read_enable = !Settings::IsGPULevelExtreme() || !cached; + const bool is_read_enable = Settings::IsGPULevelHigh() || !cached; system.DeviceMemory().buffer.Protect(vaddr, size, is_read_enable, !cached); } diff --git a/src/video_core/renderer_opengl/gl_rasterizer.cpp b/src/video_core/renderer_opengl/gl_rasterizer.cpp index 7e06d0069..4d632d211 100755 --- a/src/video_core/renderer_opengl/gl_rasterizer.cpp +++ b/src/video_core/renderer_opengl/gl_rasterizer.cpp @@ -352,7 +352,7 @@ void RasterizerOpenGL::OnCPUWrite(VAddr addr, u64 size) { shader_cache.OnCPUWrite(addr, size); { std::scoped_lock lock{texture_cache.mutex}; - texture_cache.CachedWriteMemory(addr, size); + texture_cache.WriteMemory(addr, size); } { std::scoped_lock lock{buffer_cache.mutex}; @@ -363,10 +363,6 @@ void RasterizerOpenGL::OnCPUWrite(VAddr addr, u64 size) { void RasterizerOpenGL::SyncGuestHost() { MICROPROFILE_SCOPE(OpenGL_CacheManagement); shader_cache.SyncGuestHost(); - { - std::scoped_lock lock{texture_cache.mutex}; - texture_cache.FlushCachedWrites(); - } { std::scoped_lock lock{buffer_cache.mutex}; buffer_cache.FlushCachedWrites(); diff --git a/src/video_core/renderer_vulkan/vk_rasterizer.cpp b/src/video_core/renderer_vulkan/vk_rasterizer.cpp index dd6e0027e..fa87d37f8 100755 --- a/src/video_core/renderer_vulkan/vk_rasterizer.cpp +++ b/src/video_core/renderer_vulkan/vk_rasterizer.cpp @@ -408,7 +408,7 @@ void RasterizerVulkan::OnCPUWrite(VAddr addr, u64 size) { pipeline_cache.OnCPUWrite(addr, size); { std::scoped_lock lock{texture_cache.mutex}; - texture_cache.CachedWriteMemory(addr, size); + texture_cache.WriteMemory(addr, size); } { std::scoped_lock lock{buffer_cache.mutex}; @@ -418,10 +418,6 @@ void RasterizerVulkan::OnCPUWrite(VAddr addr, u64 size) { void RasterizerVulkan::SyncGuestHost() { pipeline_cache.SyncGuestHost(); - { - std::scoped_lock lock{texture_cache.mutex}; - texture_cache.FlushCachedWrites(); - } { std::scoped_lock lock{buffer_cache.mutex}; buffer_cache.FlushCachedWrites(); diff --git a/src/video_core/texture_cache/image_base.h b/src/video_core/texture_cache/image_base.h index cc7999027..dd0106432 100755 --- a/src/video_core/texture_cache/image_base.h +++ b/src/video_core/texture_cache/image_base.h @@ -39,9 +39,6 @@ enum class ImageFlagBits : u32 { Rescaled = 1 << 13, CheckingRescalable = 1 << 14, IsRescalable = 1 << 15, - - // Cached CPU - CachedCpuModified = 1 << 16, ///< Contents have been modified from the CPU }; DECLARE_ENUM_FLAG_OPERATORS(ImageFlagBits) diff --git a/src/video_core/texture_cache/texture_cache.h b/src/video_core/texture_cache/texture_cache.h index 099b2ae1b..efc1c4525 100755 --- a/src/video_core/texture_cache/texture_cache.h +++ b/src/video_core/texture_cache/texture_cache.h @@ -437,23 +437,6 @@ void TextureCache
::WriteMemory(VAddr cpu_addr, size_t size) {
});
}
-template ::CachedWriteMemory(VAddr cpu_addr, size_t size) {
- const VAddr new_cpu_addr = Common::AlignDown(cpu_addr, CPU_PAGE_SIZE);
- const size_t new_size = Common::AlignUp(size + cpu_addr - new_cpu_addr, CPU_PAGE_SIZE);
- ForEachImageInRegion(new_cpu_addr, new_size, [this](ImageId image_id, Image& image) {
- if (True(image.flags & ImageFlagBits::CachedCpuModified)) {
- return;
- }
- image.flags |= ImageFlagBits::CachedCpuModified;
- cached_cpu_invalidate.insert(image_id);
-
- if (True(image.flags & ImageFlagBits::Tracked)) {
- UntrackImage(image, image_id);
- }
- });
-}
-
template ::DownloadMemory(VAddr cpu_addr, size_t size) {
std::vector ::UnmapGPUMemory(GPUVAddr gpu_addr, size_t size) {
}
}
-template ::FlushCachedWrites() {
- for (ImageId image_id : cached_cpu_invalidate) {
- Image& image = slot_images[image_id];
- if (True(image.flags & ImageFlagBits::CachedCpuModified)) {
- image.flags &= ~ImageFlagBits::CachedCpuModified;
- image.flags |= ImageFlagBits::CpuModified;
- }
- }
- cached_cpu_invalidate.clear();
-}
-
template ::BlitImage(const Tegra::Engines::Fermi2D::Surface& dst,
const Tegra::Engines::Fermi2D::Surface& src,
@@ -1589,9 +1560,6 @@ void TextureCache ::UnregisterImage(ImageId image_id) {
template ::TrackImage(ImageBase& image, ImageId image_id) {
ASSERT(False(image.flags & ImageFlagBits::Tracked));
- if (True(image.flags & ImageFlagBits::CachedCpuModified)) {
- return;
- }
image.flags |= ImageFlagBits::Tracked;
if (False(image.flags & ImageFlagBits::Sparse)) {
rasterizer.UpdatePagesCachedCount(image.cpu_addr, image.guest_size_bytes, 1);
@@ -1648,9 +1616,6 @@ void TextureCache ::DeleteImage(ImageId image_id, bool immediate_delete) {
tentative_size = EstimatedDecompressedSize(tentative_size, image.info.format);
}
total_used_memory -= Common::AlignUp(tentative_size, 1024);
- if (True(image.flags & ImageFlagBits::CachedCpuModified)) {
- cached_cpu_invalidate.erase(image_id);
- }
const GPUVAddr gpu_addr = image.gpu_addr;
const auto alloc_it = image_allocs_table.find(gpu_addr);
if (alloc_it == image_allocs_table.end()) {
@@ -1817,11 +1782,7 @@ template ::PrepareImage(ImageId image_id, bool is_modification, bool invalidate) {
Image& image = slot_images[image_id];
if (invalidate) {
- if (True(image.flags & ImageFlagBits::CachedCpuModified)) {
- cached_cpu_invalidate.erase(image_id);
- }
- image.flags &= ~(ImageFlagBits::CpuModified | ImageFlagBits::GpuModified |
- ImageFlagBits::CachedCpuModified);
+ image.flags &= ~(ImageFlagBits::CpuModified | ImageFlagBits::GpuModified);
if (False(image.flags & ImageFlagBits::Tracked)) {
TrackImage(image, image_id);
}
diff --git a/src/video_core/texture_cache/texture_cache_base.h b/src/video_core/texture_cache/texture_cache_base.h
index ad5978a33..b1324edf3 100755
--- a/src/video_core/texture_cache/texture_cache_base.h
+++ b/src/video_core/texture_cache/texture_cache_base.h
@@ -8,7 +8,6 @@
#include
#include