diff options
author | liamwhite <liamwhite@users.noreply.github.com> | 2023-07-26 16:33:28 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-07-26 16:33:28 +0200 |
commit | d3da1e6517fe27670b6c2d713d144872d55057d8 (patch) | |
tree | ab5c72b17b15185ec40945c5ba29400569b50630 /src/video_core | |
parent | Merge pull request #11142 from german77/avoid_crash (diff) | |
parent | Fixes and workarounds to make UBSan happier on macOS (diff) | |
download | yuzu-d3da1e6517fe27670b6c2d713d144872d55057d8.tar yuzu-d3da1e6517fe27670b6c2d713d144872d55057d8.tar.gz yuzu-d3da1e6517fe27670b6c2d713d144872d55057d8.tar.bz2 yuzu-d3da1e6517fe27670b6c2d713d144872d55057d8.tar.lz yuzu-d3da1e6517fe27670b6c2d713d144872d55057d8.tar.xz yuzu-d3da1e6517fe27670b6c2d713d144872d55057d8.tar.zst yuzu-d3da1e6517fe27670b6c2d713d144872d55057d8.zip |
Diffstat (limited to 'src/video_core')
-rw-r--r-- | src/video_core/query_cache.h | 4 | ||||
-rw-r--r-- | src/video_core/rasterizer_accelerated.cpp | 5 | ||||
-rw-r--r-- | src/video_core/rasterizer_accelerated.h | 3 |
3 files changed, 8 insertions, 4 deletions
diff --git a/src/video_core/query_cache.h b/src/video_core/query_cache.h index 1528cc1dd..7047e2e63 100644 --- a/src/video_core/query_cache.h +++ b/src/video_core/query_cache.h @@ -103,7 +103,9 @@ public: explicit QueryCacheBase(VideoCore::RasterizerInterface& rasterizer_, Core::Memory::Memory& cpu_memory_) : rasterizer{rasterizer_}, - cpu_memory{cpu_memory_}, streams{{CounterStream{static_cast<QueryCache&>(*this), + // Use reinterpret_cast instead of static_cast as workaround for + // UBSan bug (https://github.com/llvm/llvm-project/issues/59060) + cpu_memory{cpu_memory_}, streams{{CounterStream{reinterpret_cast<QueryCache&>(*this), VideoCore::QueryType::SamplesPassed}}} { (void)slot_async_jobs.insert(); // Null value } diff --git a/src/video_core/rasterizer_accelerated.cpp b/src/video_core/rasterizer_accelerated.cpp index 4a197d65d..f200a650f 100644 --- a/src/video_core/rasterizer_accelerated.cpp +++ b/src/video_core/rasterizer_accelerated.cpp @@ -13,7 +13,8 @@ namespace VideoCore { using namespace Core::Memory; -RasterizerAccelerated::RasterizerAccelerated(Memory& cpu_memory_) : cpu_memory{cpu_memory_} {} +RasterizerAccelerated::RasterizerAccelerated(Memory& cpu_memory_) + : cached_pages(std::make_unique<CachedPages>()), cpu_memory{cpu_memory_} {} RasterizerAccelerated::~RasterizerAccelerated() = default; @@ -26,7 +27,7 @@ void RasterizerAccelerated::UpdatePagesCachedCount(VAddr addr, u64 size, int del std::atomic_thread_fence(std::memory_order_acquire); const u64 page_end = Common::DivCeil(addr + size, YUZU_PAGESIZE); for (u64 page = addr >> YUZU_PAGEBITS; page != page_end; ++page) { - std::atomic_uint16_t& count = cached_pages.at(page >> 2).Count(page); + std::atomic_uint16_t& count = cached_pages->at(page >> 2).Count(page); if (delta > 0) { ASSERT_MSG(count.load(std::memory_order::relaxed) < UINT16_MAX, "Count may overflow!"); diff --git a/src/video_core/rasterizer_accelerated.h b/src/video_core/rasterizer_accelerated.h index 7118b8aff..e6c0ea87a 100644 --- a/src/video_core/rasterizer_accelerated.h +++ b/src/video_core/rasterizer_accelerated.h @@ -41,7 +41,8 @@ private: }; static_assert(sizeof(CacheEntry) == 8, "CacheEntry should be 8 bytes!"); - std::array<CacheEntry, 0x2000000> cached_pages; + using CachedPages = std::array<CacheEntry, 0x2000000>; + std::unique_ptr<CachedPages> cached_pages; Core::Memory::Memory& cpu_memory; }; |