wayland: Clean up library references

This commit is contained in:
Reg Tiangha 2024-06-11 16:12:52 -06:00
parent 99b9cec967
commit 5f1a26237b
No known key found for this signature in database
GPG key ID: 00D437798B1C2970
23 changed files with 202 additions and 251 deletions

View file

@ -312,10 +312,8 @@ elseif(UNIX)
externals/duckstation/gl/context_egl_x11.cpp externals/duckstation/gl/context_egl_x11.cpp
externals/duckstation/gl/context_glx.cpp externals/duckstation/gl/context_glx.cpp
externals/duckstation/gl/x11_window.cpp externals/duckstation/gl/x11_window.cpp
../../externals/glad/src/glad_egl.c
../../externals/glad/src/glad_glx.c
) )
target_link_libraries(citra PRIVATE "${X11_LIBRARIES}" "${EGL_LIBRARIES}") target_link_libraries(citra PRIVATE "${X11_LIBRARIES}" "${EGL_LIBRARIES}")
target_include_directories(citra PRIVATE "${X11_INCLUDE_DIR}") target_include_directories(citra PRIVATE "${X11_INCLUDE_DIR}")
add_compile_definitions(QAPPLICATION_CLASS=QApplication) add_compile_definitions(QAPPLICATION_CLASS=QApplication)

View file

@ -1,7 +1,7 @@
#include <cstdlib> #include <cstdlib>
#include <cstring> #include <cstring>
#include <stdlib.h> #include <stdlib.h>
#include "../log.h" #include "citra_qt/wayland/log.h"
#include "context.h" #include "context.h"
#include "loader.h" #include "loader.h"
Log_SetChannel(GL::Context); Log_SetChannel(GL::Context);

View file

@ -2,8 +2,9 @@
#include <array> #include <array>
#include <memory> #include <memory>
#include <vector> #include <vector>
#include "../duckstation_compat.h"
#include "../window_info.h" #include "citra_qt/wayland/duckstation_compat.h"
#include "citra_qt/wayland/window_info.h"
namespace GL { namespace GL {
using namespace citra; using namespace citra;

View file

@ -1,20 +1,19 @@
#include "context_agl.h"
#include "../duckstation_compat.h"
#include "../log.h"
#include "loader.h"
#include <dlfcn.h> #include <dlfcn.h>
#include "citra_qt/wayland/duckstation_compat.h"
#include "citra_qt/wayland/log.h"
#include "context_agl.h"
#include "loader.h"
Log_SetChannel(GL::ContextAGL); Log_SetChannel(GL::ContextAGL);
namespace GL { namespace GL {
ContextAGL::ContextAGL(const WindowInfo& wi) : Context(wi) ContextAGL::ContextAGL(const WindowInfo& wi) : Context(wi) {
{ m_opengl_module_handle =
m_opengl_module_handle = dlopen("/System/Library/Frameworks/OpenGL.framework/Versions/Current/OpenGL", RTLD_NOW); dlopen("/System/Library/Frameworks/OpenGL.framework/Versions/Current/OpenGL", RTLD_NOW);
if (!m_opengl_module_handle) if (!m_opengl_module_handle)
Log_ErrorPrint("Could not open OpenGL.framework, function lookups will probably fail"); Log_ErrorPrint("Could not open OpenGL.framework, function lookups will probably fail");
} }
ContextAGL::~ContextAGL() ContextAGL::~ContextAGL() {
{
if ([NSOpenGLContext currentContext] == m_context) if ([NSOpenGLContext currentContext] == m_context)
[NSOpenGLContext clearCurrentContext]; [NSOpenGLContext clearCurrentContext];
@ -29,8 +28,7 @@ ContextAGL::~ContextAGL()
} }
std::unique_ptr<Context> ContextAGL::Create(const WindowInfo& wi, const Version* versions_to_try, std::unique_ptr<Context> ContextAGL::Create(const WindowInfo& wi, const Version* versions_to_try,
size_t num_versions_to_try) size_t num_versions_to_try) {
{
std::unique_ptr<ContextAGL> context = std::make_unique<ContextAGL>(wi); std::unique_ptr<ContextAGL> context = std::make_unique<ContextAGL>(wi);
if (!context->Initialize(versions_to_try, num_versions_to_try)) if (!context->Initialize(versions_to_try, num_versions_to_try))
return nullptr; return nullptr;
@ -38,25 +36,22 @@ std::unique_ptr<Context> ContextAGL::Create(const WindowInfo& wi, const Version*
return context; return context;
} }
bool ContextAGL::Initialize(const Version* versions_to_try, size_t num_versions_to_try) bool ContextAGL::Initialize(const Version* versions_to_try, size_t num_versions_to_try) {
{ for (size_t i = 0; i < num_versions_to_try; i++) {
for (size_t i = 0; i < num_versions_to_try; i++)
{
const Version& cv = versions_to_try[i]; const Version& cv = versions_to_try[i];
if (cv.profile == Profile::NoProfile && CreateContext(nullptr, NSOpenGLProfileVersionLegacy, true)) if (cv.profile == Profile::NoProfile &&
{ CreateContext(nullptr, NSOpenGLProfileVersionLegacy, true)) {
// we already have the dummy context, so just use that // we already have the dummy context, so just use that
m_version = cv; m_version = cv;
return true; return true;
} } else if (cv.profile == Profile::Core) {
else if (cv.profile == Profile::Core)
{
if (cv.major_version > 4 && cv.minor_version > 1) if (cv.major_version > 4 && cv.minor_version > 1)
continue; continue;
const NSOpenGLPixelFormatAttribute profile = (cv.major_version > 3 || cv.minor_version > 2) ? NSOpenGLProfileVersion4_1Core : NSOpenGLProfileVersion3_2Core; const NSOpenGLPixelFormatAttribute profile =
if (CreateContext(nullptr, static_cast<int>(profile), true)) (cv.major_version > 3 || cv.minor_version > 2) ? NSOpenGLProfileVersion4_1Core
{ : NSOpenGLProfileVersion3_2Core;
if (CreateContext(nullptr, static_cast<int>(profile), true)) {
m_version = cv; m_version = cv;
return true; return true;
} }
@ -66,8 +61,7 @@ bool ContextAGL::Initialize(const Version* versions_to_try, size_t num_versions_
return false; return false;
} }
void* ContextAGL::GetProcAddress(const char* name) void* ContextAGL::GetProcAddress(const char* name) {
{
void* addr = m_opengl_module_handle ? dlsym(m_opengl_module_handle, name) : nullptr; void* addr = m_opengl_module_handle ? dlsym(m_opengl_module_handle, name) : nullptr;
if (addr) if (addr)
return addr; return addr;
@ -75,24 +69,22 @@ void* ContextAGL::GetProcAddress(const char* name)
return dlsym(RTLD_NEXT, name); return dlsym(RTLD_NEXT, name);
} }
bool ContextAGL::ChangeSurface(const WindowInfo& new_wi) bool ContextAGL::ChangeSurface(const WindowInfo& new_wi) {
{
m_wi = new_wi; m_wi = new_wi;
BindContextToView(); BindContextToView();
return true; return true;
} }
void ContextAGL::ResizeSurface(u32 new_surface_width /*= 0*/, u32 new_surface_height /*= 0*/) void ContextAGL::ResizeSurface(u32 new_surface_width /*= 0*/, u32 new_surface_height /*= 0*/) {
{
UpdateDimensions(); UpdateDimensions();
} }
bool ContextAGL::UpdateDimensions() bool ContextAGL::UpdateDimensions() {
{
const NSSize window_size = [GetView() frame].size; const NSSize window_size = [GetView() frame].size;
const CGFloat window_scale = [[GetView() window] backingScaleFactor]; const CGFloat window_scale = [[GetView() window] backingScaleFactor];
const u32 new_width = static_cast<u32>(static_cast<CGFloat>(window_size.width) * window_scale); const u32 new_width = static_cast<u32>(static_cast<CGFloat>(window_size.width) * window_scale);
const u32 new_height = static_cast<u32>(static_cast<CGFloat>(window_size.height) * window_scale); const u32 new_height =
static_cast<u32>(static_cast<CGFloat>(window_size.height) * window_scale);
if (m_wi.surface_width == new_width && m_wi.surface_height == new_height) if (m_wi.surface_width == new_width && m_wi.surface_height == new_height)
return false; return false;
@ -112,36 +104,32 @@ bool ContextAGL::UpdateDimensions()
return true; return true;
} }
bool ContextAGL::SwapBuffers() bool ContextAGL::SwapBuffers() {
{
[m_context flushBuffer]; [m_context flushBuffer];
return true; return true;
} }
bool ContextAGL::MakeCurrent() bool ContextAGL::MakeCurrent() {
{
[m_context makeCurrentContext]; [m_context makeCurrentContext];
return true; return true;
} }
bool ContextAGL::DoneCurrent() bool ContextAGL::DoneCurrent() {
{
[NSOpenGLContext clearCurrentContext]; [NSOpenGLContext clearCurrentContext];
return true; return true;
} }
bool ContextAGL::SetSwapInterval(s32 interval) bool ContextAGL::SetSwapInterval(s32 interval) {
{
GLint gl_interval = static_cast<GLint>(interval); GLint gl_interval = static_cast<GLint>(interval);
[m_context setValues:&gl_interval forParameter:NSOpenGLCPSwapInterval]; [m_context setValues:&gl_interval forParameter:NSOpenGLCPSwapInterval];
return true; return true;
} }
std::unique_ptr<Context> ContextAGL::CreateSharedContext(const WindowInfo& wi) std::unique_ptr<Context> ContextAGL::CreateSharedContext(const WindowInfo& wi) {
{
std::unique_ptr<ContextAGL> context = std::make_unique<ContextAGL>(wi); std::unique_ptr<ContextAGL> context = std::make_unique<ContextAGL>(wi);
context->m_context = [[NSOpenGLContext alloc] initWithFormat:m_pixel_format shareContext:m_context]; context->m_context = [[NSOpenGLContext alloc] initWithFormat:m_pixel_format
shareContext:m_context];
if (context->m_context == nil) if (context->m_context == nil)
return nullptr; return nullptr;
@ -155,10 +143,8 @@ std::unique_ptr<Context> ContextAGL::CreateSharedContext(const WindowInfo& wi)
return context; return context;
} }
bool ContextAGL::CreateContext(NSOpenGLContext* share_context, int profile, bool make_current) bool ContextAGL::CreateContext(NSOpenGLContext* share_context, int profile, bool make_current) {
{ if (m_context) {
if (m_context)
{
[m_context release]; [m_context release];
m_context = nullptr; m_context = nullptr;
} }
@ -166,15 +152,11 @@ bool ContextAGL::CreateContext(NSOpenGLContext* share_context, int profile, bool
if (m_pixel_format) if (m_pixel_format)
[m_pixel_format release]; [m_pixel_format release];
const std::array<NSOpenGLPixelFormatAttribute, 5> attribs = {{ const std::array<NSOpenGLPixelFormatAttribute, 5> attribs = {
NSOpenGLPFADoubleBuffer, {NSOpenGLPFADoubleBuffer, NSOpenGLPFAOpenGLProfile,
NSOpenGLPFAOpenGLProfile, static_cast<NSOpenGLPixelFormatAttribute>(profile), NSOpenGLPFAAccelerated, 0}};
static_cast<NSOpenGLPixelFormatAttribute>(profile),
NSOpenGLPFAAccelerated,
0}};
m_pixel_format = [[NSOpenGLPixelFormat alloc] initWithAttributes:attribs.data()]; m_pixel_format = [[NSOpenGLPixelFormat alloc] initWithAttributes:attribs.data()];
if (m_pixel_format == nil) if (m_pixel_format == nil) {
{
Log_ErrorPrintf("Failed to initialize pixel format"); Log_ErrorPrintf("Failed to initialize pixel format");
return false; return false;
} }
@ -192,8 +174,7 @@ bool ContextAGL::CreateContext(NSOpenGLContext* share_context, int profile, bool
return true; return true;
} }
void ContextAGL::BindContextToView() void ContextAGL::BindContextToView() {
{
NSView* const view = GetView(); NSView* const view = GetView();
NSWindow* const window = [view window]; NSWindow* const window = [view window];
[view setWantsBestResolutionOpenGLSurface:YES]; [view setWantsBestResolutionOpenGLSurface:YES];

View file

@ -1,8 +1,8 @@
#include <cstring> #include <cstring>
#include <optional> #include <optional>
#include <vector> #include <vector>
#include "../duckstation_compat.h" #include "citra_qt/wayland/duckstation_compat.h"
#include "../log.h" #include "citra_qt/wayland/log.h"
#include "context_egl.h" #include "context_egl.h"
Log_SetChannel(GL::ContextEGL); Log_SetChannel(GL::ContextEGL);

View file

@ -1,7 +1,9 @@
#pragma once #pragma once
#include "../../../../../externals/glad/src/glad_egl.h"
#include "context.h" #include "context.h"
#include <glad/glad_egl.h>
namespace GL { namespace GL {
class ContextEGL : public Context { class ContextEGL : public Context {

View file

@ -1,5 +1,5 @@
#include <dlfcn.h> #include <dlfcn.h>
#include "../log.h" #include "citra_qt/wayland/log.h"
#include "context_egl_wayland.h" #include "context_egl_wayland.h"
Log_SetChannel(ContextEGLWayland); Log_SetChannel(ContextEGLWayland);

View file

@ -1,4 +1,4 @@
#include "../log.h" #include "citra_qt/wayland/log.h"
#include "context_egl_x11.h" #include "context_egl_x11.h"
Log_SetChannel(GL::ContextEGLX11); Log_SetChannel(GL::ContextEGLX11);

View file

@ -1,6 +1,6 @@
#include <dlfcn.h> #include <dlfcn.h>
#include "../duckstation_compat.h" #include "citra_qt/wayland/duckstation_compat.h"
#include "../log.h" #include "citra_qt/wayland/log.h"
#include "context_glx.h" #include "context_glx.h"
Log_SetChannel(GL::ContextGLX); Log_SetChannel(GL::ContextGLX);

View file

@ -1,8 +1,10 @@
#pragma once #pragma once
#include "../../../../../externals/glad/src/glad_glx.h"
#include "context.h" #include "context.h"
#include "x11_window.h" #include "x11_window.h"
#include <glad/glad_glx.h>
namespace GL { namespace GL {
class ContextGLX final : public Context { class ContextGLX final : public Context {

View file

@ -1,6 +1,6 @@
#include "../duckstation_compat.h" #include "citra_qt/wayland/duckstation_compat.h"
#include "../log.h" #include "citra_qt/wayland/log.h"
#include "../scoped_guard.h" #include "citra_qt/wayland/scoped_guard.h"
#include "context_wgl.h" #include "context_wgl.h"
#include "loader.h" #include "loader.h"
using namespace melonDS; using namespace melonDS;

View file

@ -1,8 +1,10 @@
#pragma once #pragma once
#include "../windows_headers.h"
#include "citra+qt/wayland/windows_headers.h"
#include <optional> #include <optional>
#include "../../../../../externals/glad/src/glad_wgl.h" #include <glad/glad_wgl.h>
#include "context.h" #include "context.h"
#include "loader.h" #include "loader.h"

View file

@ -2,7 +2,7 @@
// Fix glad.h including windows.h // Fix glad.h including windows.h
#ifdef _WIN32 #ifdef _WIN32
#include "../windows_headers.h" #include "citra_qt/wayland/windows_headers.h"
#endif #endif
#include "../../../../../externals/glad/src/glad.h" #include <glad/glad.h>

View file

@ -1,6 +1,6 @@
#include <cstdio> #include <cstdio>
#include "../duckstation_compat.h" #include "citra_qt/wayland/duckstation_compat.h"
#include "../log.h" #include "citra_qt/wayland/log.h"
#include "x11_window.h" #include "x11_window.h"
Log_SetChannel(X11Window); Log_SetChannel(X11Window);

View file

@ -1,7 +1,7 @@
#pragma once #pragma once
#include <X11/Xlib.h> #include <X11/Xlib.h>
#include <X11/Xutil.h> #include <X11/Xutil.h>
#include "../duckstation_compat.h" #include "citra_qt/wayland/duckstation_compat.h"
namespace GL { namespace GL {
using namespace citra; using namespace citra;

View file

@ -1,38 +0,0 @@
/*
Copyright 2016-2023 melonDS team
This file is part of melonDS.
melonDS is free software: you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free
Software Foundation, either version 3 of the License, or (at your option)
any later version.
melonDS is distributed in the hope that it will be useful, but WITHOUT ANY
WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License along
with melonDS. If not, see http://www.gnu.org/licenses/.
*/
#ifndef TYPES_H
#define TYPES_H
#include <array>
#include <stdint.h>
namespace citra {
typedef uint8_t u8;
typedef uint16_t u16;
typedef uint32_t u32;
typedef uint64_t u64;
typedef int8_t s8;
typedef int16_t s16;
typedef int32_t s32;
typedef int64_t s64;
template <class T, std::size_t A, std::size_t B>
using array2d = std::array<std::array<T, B>, A>;
} // namespace citra
#endif // TYPES_H

View file

@ -1,7 +1,7 @@
#ifndef DUCKSTATION_COMPAT_H #ifndef DUCKSTATION_COMPAT_H
#define DUCKSTATION_COMPAT_H #define DUCKSTATION_COMPAT_H
#include "../types.h" #include "common/common_types.h"
#include <assert.h> #include <assert.h>

View file

@ -86,7 +86,7 @@ bool WindowInfo::QueryRefreshRateForWindow(const WindowInfo& wi, float* refresh_
#include <X11/extensions/Xrandr.h> #include <X11/extensions/Xrandr.h>
#include "common/scoped_guard.h" #include "common/scoped_guard.h"
#include "gl/x11_window.h" #include "x11_window.h"
static bool GetRefreshRateFromXRandR(const WindowInfo& wi, float* refresh_rate) { static bool GetRefreshRateFromXRandR(const WindowInfo& wi, float* refresh_rate) {
Display* display = static_cast<Display*>(wi.display_connection); Display* display = static_cast<Display*>(wi.display_connection);

View file

@ -1,5 +1,5 @@
#pragma once #pragma once
#include "../types.h" #include "common/common_types.h"
// Contains the information required to create a graphics context in a window. // Contains the information required to create a graphics context in a window.
struct WindowInfo { struct WindowInfo {

View file

@ -54,6 +54,9 @@ typedef u32 PAddr; ///< Represents a pointer in the ARM11 physical address space
using u128 = std::array<std::uint64_t, 2>; using u128 = std::array<std::uint64_t, 2>;
static_assert(sizeof(u128) == 16, "u128 must be 128 bits wide"); static_assert(sizeof(u128) == 16, "u128 must be 128 bits wide");
template <class T, std::size_t A, std::size_t B>
using array2d = std::array<std::array<T, B>, A>;
// An inheritable class to disallow the copy constructor and operator= functions // An inheritable class to disallow the copy constructor and operator= functions
class NonCopyable { class NonCopyable {
protected: protected: