diff options
| author | 2023-12-02 09:28:30 -0500 | |
|---|---|---|
| committer | 2023-12-02 09:28:30 -0500 | |
| commit | 7fb6fbcd87729ec40e4c9a2ddf6493156e3d22bb (patch) | |
| tree | 1b4f2582bbf3fb4da0ef3fc366c501630c78e120 | |
| parent | Merge pull request #12256 from GPUCode/fxaa (diff) | |
| parent | host_memory: move MAP_ALIGNED_SUPER attempt after 448d4815dece (diff) | |
| download | yuzu-7fb6fbcd87729ec40e4c9a2ddf6493156e3d22bb.tar.gz yuzu-7fb6fbcd87729ec40e4c9a2ddf6493156e3d22bb.tar.xz yuzu-7fb6fbcd87729ec40e4c9a2ddf6493156e3d22bb.zip | |
Merge pull request #12259 from jbeich/freebsd-mmap
host_memory: unbreak build on FreeBSD x86_64
| -rw-r--r-- | src/common/host_memory.cpp | 28 |
1 files changed, 15 insertions, 13 deletions
diff --git a/src/common/host_memory.cpp b/src/common/host_memory.cpp index 3a9ea6eb4..4bfc64f2d 100644 --- a/src/common/host_memory.cpp +++ b/src/common/host_memory.cpp | |||
| @@ -25,6 +25,10 @@ | |||
| 25 | #include <unistd.h> | 25 | #include <unistd.h> |
| 26 | #include "common/scope_exit.h" | 26 | #include "common/scope_exit.h" |
| 27 | 27 | ||
| 28 | #ifndef MAP_NORESERVE | ||
| 29 | #define MAP_NORESERVE 0 | ||
| 30 | #endif | ||
| 31 | |||
| 28 | #endif // ^^^ Linux ^^^ | 32 | #endif // ^^^ Linux ^^^ |
| 29 | 33 | ||
| 30 | #include <mutex> | 34 | #include <mutex> |
| @@ -404,6 +408,16 @@ static void* ChooseVirtualBase(size_t virtual_size) { | |||
| 404 | #else | 408 | #else |
| 405 | 409 | ||
| 406 | static void* ChooseVirtualBase(size_t virtual_size) { | 410 | static void* ChooseVirtualBase(size_t virtual_size) { |
| 411 | #if defined(__FreeBSD__) | ||
| 412 | void* virtual_base = | ||
| 413 | mmap(nullptr, virtual_size, PROT_READ | PROT_WRITE, | ||
| 414 | MAP_PRIVATE | MAP_ANONYMOUS | MAP_NORESERVE | MAP_ALIGNED_SUPER, -1, 0); | ||
| 415 | |||
| 416 | if (virtual_base != MAP_FAILED) { | ||
| 417 | return virtual_base; | ||
| 418 | } | ||
| 419 | #endif | ||
| 420 | |||
| 407 | return mmap(nullptr, virtual_size, PROT_READ | PROT_WRITE, | 421 | return mmap(nullptr, virtual_size, PROT_READ | PROT_WRITE, |
| 408 | MAP_PRIVATE | MAP_ANONYMOUS | MAP_NORESERVE, -1, 0); | 422 | MAP_PRIVATE | MAP_ANONYMOUS | MAP_NORESERVE, -1, 0); |
| 409 | } | 423 | } |
| @@ -459,24 +473,12 @@ public: | |||
| 459 | } | 473 | } |
| 460 | 474 | ||
| 461 | // Virtual memory initialization | 475 | // Virtual memory initialization |
| 462 | #if defined(__FreeBSD__) | ||
| 463 | virtual_base = | ||
| 464 | static_cast<u8*>(mmap(nullptr, virtual_size, PROT_NONE, | ||
| 465 | MAP_PRIVATE | MAP_ANONYMOUS | MAP_ALIGNED_SUPER, -1, 0)); | ||
| 466 | if (virtual_base == MAP_FAILED) { | ||
| 467 | virtual_base = static_cast<u8*>( | ||
| 468 | mmap(nullptr, virtual_size, PROT_NONE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0)); | ||
| 469 | if (virtual_base == MAP_FAILED) { | ||
| 470 | LOG_CRITICAL(HW_Memory, "mmap failed: {}", strerror(errno)); | ||
| 471 | throw std::bad_alloc{}; | ||
| 472 | } | ||
| 473 | } | ||
| 474 | #else | ||
| 475 | virtual_base = virtual_map_base = static_cast<u8*>(ChooseVirtualBase(virtual_size)); | 476 | virtual_base = virtual_map_base = static_cast<u8*>(ChooseVirtualBase(virtual_size)); |
| 476 | if (virtual_base == MAP_FAILED) { | 477 | if (virtual_base == MAP_FAILED) { |
| 477 | LOG_CRITICAL(HW_Memory, "mmap failed: {}", strerror(errno)); | 478 | LOG_CRITICAL(HW_Memory, "mmap failed: {}", strerror(errno)); |
| 478 | throw std::bad_alloc{}; | 479 | throw std::bad_alloc{}; |
| 479 | } | 480 | } |
| 481 | #if defined(__linux__) | ||
| 480 | madvise(virtual_base, virtual_size, MADV_HUGEPAGE); | 482 | madvise(virtual_base, virtual_size, MADV_HUGEPAGE); |
| 481 | #endif | 483 | #endif |
| 482 | 484 | ||