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