Merge pull request #4099 from MerryMage/macOS-build
Fix compilation on macOS
This commit is contained in:
		@@ -23,7 +23,7 @@ VirtualFile PackBFTTF(const std::array<u8, Size>& data, const std::string& name)
 | 
			
		||||
 | 
			
		||||
    std::vector<u8> bfttf(Size + sizeof(u64));
 | 
			
		||||
 | 
			
		||||
    u64 offset = 0;
 | 
			
		||||
    size_t offset = 0;
 | 
			
		||||
    Service::NS::EncryptSharedFont(vec, bfttf, offset);
 | 
			
		||||
    return std::make_shared<VectorVfsFile>(std::move(bfttf), name);
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -104,7 +104,7 @@ ResultCode MemoryManager::Allocate(PageLinkedList& page_list, std::size_t num_pa
 | 
			
		||||
    // Ensure that we don't leave anything un-freed
 | 
			
		||||
    auto group_guard = detail::ScopeExit([&] {
 | 
			
		||||
        for (const auto& it : page_list.Nodes()) {
 | 
			
		||||
            const auto min_num_pages{std::min(
 | 
			
		||||
            const auto min_num_pages{std::min<size_t>(
 | 
			
		||||
                it.GetNumPages(), (chosen_manager.GetEndAddress() - it.GetAddress()) / PageSize)};
 | 
			
		||||
            chosen_manager.Free(it.GetAddress(), min_num_pages);
 | 
			
		||||
        }
 | 
			
		||||
@@ -165,7 +165,7 @@ ResultCode MemoryManager::Free(PageLinkedList& page_list, std::size_t num_pages,
 | 
			
		||||
 | 
			
		||||
    // Free all of the pages
 | 
			
		||||
    for (const auto& it : page_list.Nodes()) {
 | 
			
		||||
        const auto min_num_pages{std::min(
 | 
			
		||||
        const auto min_num_pages{std::min<size_t>(
 | 
			
		||||
            it.GetNumPages(), (chosen_manager.GetEndAddress() - it.GetAddress()) / PageSize)};
 | 
			
		||||
        chosen_manager.Free(it.GetAddress(), min_num_pages);
 | 
			
		||||
    }
 | 
			
		||||
 
 | 
			
		||||
@@ -220,8 +220,8 @@ private:
 | 
			
		||||
            return cache_begin < addr_end && addr_begin < cache_end;
 | 
			
		||||
        };
 | 
			
		||||
 | 
			
		||||
        const u64 page_end = addr_end >> PAGE_SHIFT;
 | 
			
		||||
        for (u64 page = addr_begin >> PAGE_SHIFT; page <= page_end; ++page) {
 | 
			
		||||
        const u64 page_end = addr_end >> PAGE_BITS;
 | 
			
		||||
        for (u64 page = addr_begin >> PAGE_BITS; page <= page_end; ++page) {
 | 
			
		||||
            const auto& it = cached_queries.find(page);
 | 
			
		||||
            if (it == std::end(cached_queries)) {
 | 
			
		||||
                continue;
 | 
			
		||||
@@ -242,14 +242,14 @@ private:
 | 
			
		||||
    /// Registers the passed parameters as cached and returns a pointer to the stored cached query.
 | 
			
		||||
    CachedQuery* Register(VideoCore::QueryType type, VAddr cpu_addr, u8* host_ptr, bool timestamp) {
 | 
			
		||||
        rasterizer.UpdatePagesCachedCount(cpu_addr, CachedQuery::SizeInBytes(timestamp), 1);
 | 
			
		||||
        const u64 page = static_cast<u64>(cpu_addr) >> PAGE_SHIFT;
 | 
			
		||||
        const u64 page = static_cast<u64>(cpu_addr) >> PAGE_BITS;
 | 
			
		||||
        return &cached_queries[page].emplace_back(static_cast<QueryCache&>(*this), type, cpu_addr,
 | 
			
		||||
                                                  host_ptr);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /// Tries to a get a cached query. Returns nullptr on failure.
 | 
			
		||||
    CachedQuery* TryGet(VAddr addr) {
 | 
			
		||||
        const u64 page = static_cast<u64>(addr) >> PAGE_SHIFT;
 | 
			
		||||
        const u64 page = static_cast<u64>(addr) >> PAGE_BITS;
 | 
			
		||||
        const auto it = cached_queries.find(page);
 | 
			
		||||
        if (it == std::end(cached_queries)) {
 | 
			
		||||
            return nullptr;
 | 
			
		||||
@@ -268,7 +268,7 @@ private:
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    static constexpr std::uintptr_t PAGE_SIZE = 4096;
 | 
			
		||||
    static constexpr unsigned PAGE_SHIFT = 12;
 | 
			
		||||
    static constexpr unsigned PAGE_BITS = 12;
 | 
			
		||||
 | 
			
		||||
    Core::System& system;
 | 
			
		||||
    VideoCore::RasterizerInterface& rasterizer;
 | 
			
		||||
 
 | 
			
		||||
@@ -13,6 +13,7 @@
 | 
			
		||||
#include <fmt/format.h>
 | 
			
		||||
 | 
			
		||||
#include "common/dynamic_library.h"
 | 
			
		||||
#include "common/file_util.h"
 | 
			
		||||
#include "common/logging/log.h"
 | 
			
		||||
#include "common/telemetry.h"
 | 
			
		||||
#include "core/core.h"
 | 
			
		||||
@@ -76,7 +77,8 @@ Common::DynamicLibrary OpenVulkanLibrary() {
 | 
			
		||||
    char* libvulkan_env = getenv("LIBVULKAN_PATH");
 | 
			
		||||
    if (!libvulkan_env || !library.Open(libvulkan_env)) {
 | 
			
		||||
        // Use the libvulkan.dylib from the application bundle.
 | 
			
		||||
        std::string filename = File::GetBundleDirectory() + "/Contents/Frameworks/libvulkan.dylib";
 | 
			
		||||
        const std::string filename =
 | 
			
		||||
            FileUtil::GetBundleDirectory() + "/Contents/Frameworks/libvulkan.dylib";
 | 
			
		||||
        library.Open(filename.c_str());
 | 
			
		||||
    }
 | 
			
		||||
#else
 | 
			
		||||
 
 | 
			
		||||
@@ -870,7 +870,7 @@ void RasterizerVulkan::BeginTransformFeedback() {
 | 
			
		||||
    UNIMPLEMENTED_IF(binding.buffer_offset != 0);
 | 
			
		||||
 | 
			
		||||
    const GPUVAddr gpu_addr = binding.Address();
 | 
			
		||||
    const std::size_t size = binding.buffer_size;
 | 
			
		||||
    const auto size = static_cast<VkDeviceSize>(binding.buffer_size);
 | 
			
		||||
    const auto [buffer, offset] = buffer_cache.UploadMemory(gpu_addr, size, 4, true);
 | 
			
		||||
 | 
			
		||||
    scheduler.Record([buffer = buffer, offset = offset, size](vk::CommandBuffer cmdbuf) {
 | 
			
		||||
 
 | 
			
		||||
@@ -66,12 +66,12 @@ ProgramCode GetShaderCode(Tegra::MemoryManager& memory_manager, GPUVAddr gpu_add
 | 
			
		||||
 | 
			
		||||
u64 GetUniqueIdentifier(Tegra::Engines::ShaderType shader_type, bool is_a, const ProgramCode& code,
 | 
			
		||||
                        const ProgramCode& code_b) {
 | 
			
		||||
    u64 unique_identifier = boost::hash_value(code);
 | 
			
		||||
    size_t unique_identifier = boost::hash_value(code);
 | 
			
		||||
    if (is_a) {
 | 
			
		||||
        // VertexA programs include two programs
 | 
			
		||||
        boost::hash_combine(unique_identifier, boost::hash_value(code_b));
 | 
			
		||||
    }
 | 
			
		||||
    return unique_identifier;
 | 
			
		||||
    return static_cast<u64>(unique_identifier);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
} // namespace VideoCommon::Shader
 | 
			
		||||
 
 | 
			
		||||
@@ -19,7 +19,7 @@ namespace VideoCommon {
 | 
			
		||||
 | 
			
		||||
template <class T>
 | 
			
		||||
class ShaderCache {
 | 
			
		||||
    static constexpr u64 PAGE_SHIFT = 14;
 | 
			
		||||
    static constexpr u64 PAGE_BITS = 14;
 | 
			
		||||
 | 
			
		||||
    struct Entry {
 | 
			
		||||
        VAddr addr_start;
 | 
			
		||||
@@ -87,8 +87,8 @@ protected:
 | 
			
		||||
        const VAddr addr_end = addr + size;
 | 
			
		||||
        Entry* const entry = NewEntry(addr, addr_end, data.get());
 | 
			
		||||
 | 
			
		||||
        const u64 page_end = addr_end >> PAGE_SHIFT;
 | 
			
		||||
        for (u64 page = addr >> PAGE_SHIFT; page <= page_end; ++page) {
 | 
			
		||||
        const u64 page_end = addr_end >> PAGE_BITS;
 | 
			
		||||
        for (u64 page = addr >> PAGE_BITS; page <= page_end; ++page) {
 | 
			
		||||
            invalidation_cache[page].push_back(entry);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
@@ -108,8 +108,8 @@ private:
 | 
			
		||||
    /// @pre invalidation_mutex is locked
 | 
			
		||||
    void InvalidatePagesInRegion(VAddr addr, std::size_t size) {
 | 
			
		||||
        const VAddr addr_end = addr + size;
 | 
			
		||||
        const u64 page_end = addr_end >> PAGE_SHIFT;
 | 
			
		||||
        for (u64 page = addr >> PAGE_SHIFT; page <= page_end; ++page) {
 | 
			
		||||
        const u64 page_end = addr_end >> PAGE_BITS;
 | 
			
		||||
        for (u64 page = addr >> PAGE_BITS; page <= page_end; ++page) {
 | 
			
		||||
            const auto it = invalidation_cache.find(page);
 | 
			
		||||
            if (it == invalidation_cache.end()) {
 | 
			
		||||
                continue;
 | 
			
		||||
 
 | 
			
		||||
@@ -208,6 +208,10 @@ if (MSVC)
 | 
			
		||||
    copy_yuzu_unicorn_deps(yuzu)
 | 
			
		||||
endif()
 | 
			
		||||
 | 
			
		||||
if (NOT APPLE)
 | 
			
		||||
    target_compile_definitions(yuzu PRIVATE HAS_OPENGL)
 | 
			
		||||
endif()
 | 
			
		||||
 | 
			
		||||
if (ENABLE_VULKAN)
 | 
			
		||||
    target_include_directories(yuzu PRIVATE ../../externals/Vulkan-Headers/include)
 | 
			
		||||
    target_compile_definitions(yuzu PRIVATE HAS_VULKAN)
 | 
			
		||||
 
 | 
			
		||||
@@ -8,13 +8,16 @@
 | 
			
		||||
#include <QHBoxLayout>
 | 
			
		||||
#include <QKeyEvent>
 | 
			
		||||
#include <QMessageBox>
 | 
			
		||||
#include <QOffscreenSurface>
 | 
			
		||||
#include <QOpenGLContext>
 | 
			
		||||
#include <QPainter>
 | 
			
		||||
#include <QScreen>
 | 
			
		||||
#include <QStringList>
 | 
			
		||||
#include <QWindow>
 | 
			
		||||
 | 
			
		||||
#ifdef HAS_OPENGL
 | 
			
		||||
#include <QOffscreenSurface>
 | 
			
		||||
#include <QOpenGLContext>
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if !defined(WIN32) && HAS_VULKAN
 | 
			
		||||
#include <qpa/qplatformnativeinterface.h>
 | 
			
		||||
#endif
 | 
			
		||||
@@ -98,6 +101,7 @@ void EmuThread::run() {
 | 
			
		||||
#endif
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#ifdef HAS_OPENGL
 | 
			
		||||
class OpenGLSharedContext : public Core::Frontend::GraphicsContext {
 | 
			
		||||
public:
 | 
			
		||||
    /// Create the original context that should be shared from
 | 
			
		||||
@@ -183,6 +187,7 @@ private:
 | 
			
		||||
    std::unique_ptr<QOffscreenSurface> offscreen_surface{};
 | 
			
		||||
    QSurface* surface;
 | 
			
		||||
};
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
class DummyContext : public Core::Frontend::GraphicsContext {};
 | 
			
		||||
 | 
			
		||||
@@ -473,6 +478,7 @@ void GRenderWindow::resizeEvent(QResizeEvent* event) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
std::unique_ptr<Core::Frontend::GraphicsContext> GRenderWindow::CreateSharedContext() const {
 | 
			
		||||
#ifdef HAS_OPENGL
 | 
			
		||||
    if (Settings::values.renderer_backend == Settings::RendererBackend::OpenGL) {
 | 
			
		||||
        auto c = static_cast<OpenGLSharedContext*>(main_context.get());
 | 
			
		||||
        // Bind the shared contexts to the main surface in case the backend wants to take over
 | 
			
		||||
@@ -480,6 +486,7 @@ std::unique_ptr<Core::Frontend::GraphicsContext> GRenderWindow::CreateSharedCont
 | 
			
		||||
        return std::make_unique<OpenGLSharedContext>(c->GetShareContext(),
 | 
			
		||||
                                                     child_widget->windowHandle());
 | 
			
		||||
    }
 | 
			
		||||
#endif
 | 
			
		||||
    return std::make_unique<DummyContext>();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -560,6 +567,7 @@ void GRenderWindow::OnMinimalClientAreaChangeRequest(std::pair<u32, u32> minimal
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool GRenderWindow::InitializeOpenGL() {
 | 
			
		||||
#ifdef HAS_OPENGL
 | 
			
		||||
    // TODO: One of these flags might be interesting: WA_OpaquePaintEvent, WA_NoBackground,
 | 
			
		||||
    // WA_DontShowOnScreen, WA_DeleteOnClose
 | 
			
		||||
    auto child = new OpenGLRenderWidget(this);
 | 
			
		||||
@@ -571,6 +579,11 @@ bool GRenderWindow::InitializeOpenGL() {
 | 
			
		||||
        std::make_unique<OpenGLSharedContext>(context->GetShareContext(), child->windowHandle()));
 | 
			
		||||
 | 
			
		||||
    return true;
 | 
			
		||||
#else
 | 
			
		||||
    QMessageBox::warning(this, tr("OpenGL not available!"),
 | 
			
		||||
                         tr("yuzu has not been compiled with OpenGL support."));
 | 
			
		||||
    return false;
 | 
			
		||||
#endif
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool GRenderWindow::InitializeVulkan() {
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user