diff --git a/Classes/Video/OpenGLHostDisplayOverride.cpp b/Classes/Video/OpenGLHostDisplayOverride.cpp deleted file mode 100644 index a0116e7..0000000 --- a/Classes/Video/OpenGLHostDisplayOverride.cpp +++ /dev/null @@ -1,489 +0,0 @@ -/* PCSX2 - PS2 Emulator for PCs - * Copyright (C) 2002-2021 PCSX2 Dev Team - * - * PCSX2 is free software: you can redistribute it and/or modify it under the terms - * of the GNU Lesser General Public License as published by the Free Software Found- - * ation, either version 3 of the License, or (at your option) any later version. - * - * PCSX2 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 PCSX2. - * If not, see . - */ - -#include "PrecompiledHeader.h" -#include "Video/OEHostDisplay.h" - -#include "common/Assertions.h" -#include "common/Console.h" -#include "common/ScopedGuard.h" -#include "common/StringUtil.h" -//#include "common/GL/Program.h" -#include -#include - -static int OE_FBO = 0; - -#if 0 -class OpenGLHostDisplayTexture : public HostDisplayTexture -{ -public: - OpenGLHostDisplayTexture(GLuint texture, u32 width, u32 height) - : m_texture(texture) - , m_width(width) - , m_height(height) - { - } - ~OpenGLHostDisplayTexture() override = default; - - void* GetHandle() const override { return reinterpret_cast(static_cast(m_texture)); } - u32 GetWidth() const override { return m_width; } - u32 GetHeight() const override { return m_height; } - - GLuint GetGLID() const { return m_texture; } - -private: - GLuint m_texture; - u32 m_width; - u32 m_height; -}; - -OpenGLHostDisplay::OpenGLHostDisplay() = default; - -OpenGLHostDisplay::~OpenGLHostDisplay() -{ - if (m_gl_context) - { - m_gl_context->DoneCurrent(); - m_gl_context.reset(); - } -} - -RenderAPI OpenGLHostDisplay::GetRenderAPI() const -{ - return m_gl_context->IsGLES() ? RenderAPI::OpenGLES : RenderAPI::OpenGL; -} - -void* OpenGLHostDisplay::GetDevice() const -{ - return nullptr; -} - -void* OpenGLHostDisplay::GetContext() const -{ - return m_gl_context.get(); -} - -void* OpenGLHostDisplay::GetSurface() const -{ - return nullptr; -} - -std::unique_ptr OpenGLHostDisplay::CreateTexture(u32 width, u32 height, const void* data, u32 data_stride, bool dynamic /* = false */) -{ - // clear error - glGetError(); - - // don't worry, I'm planning on removing this eventually - we'll use GSTexture instead. - glActiveTexture(GL_TEXTURE7); - - GLuint id; - glGenTextures(1, &id); - glBindTexture(GL_TEXTURE_2D, id); - - if (GLAD_GL_ARB_texture_storage || GLAD_GL_ES_VERSION_3_0) - { - glTexStorage2D(GL_TEXTURE_2D, 1, GL_RGBA8, width, height); - glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, width, height, GL_RGBA, GL_UNSIGNED_BYTE, data); - } - else - { - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 0); - glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, data); - } - - glActiveTexture(GL_TEXTURE0); - - GLenum error = glGetError(); - if (error != GL_NO_ERROR) - { - Console.Error("Failed to create texture: 0x%X", error); - glDeleteTextures(1, &id); - return nullptr; - } - - return std::make_unique(id, width, height); -} - -void OpenGLHostDisplay::UpdateTexture(HostDisplayTexture* texture, u32 x, u32 y, u32 width, u32 height, const void* texture_data, u32 texture_data_stride) -{ - glActiveTexture(GL_TEXTURE7); - - glPixelStorei(GL_UNPACK_ROW_LENGTH, texture_data_stride / sizeof(u32)); - - glTexSubImage2D(GL_TEXTURE_2D, 0, x, y, width, height, GL_RGBA8, GL_UNSIGNED_BYTE, texture_data); - - glPixelStorei(GL_UNPACK_ROW_LENGTH, 0); - - glActiveTexture(GL_TEXTURE0); -} - -void OpenGLHostDisplay::SetVSync(VsyncMode mode) -{ - if (m_vsync_mode == mode || m_gl_context->GetWindowInfo().type == WindowInfo::Type::Surfaceless) - return; - - // Window framebuffer has to be bound to call SetSwapInterval. - GLint current_fbo = 0; - glGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, ¤t_fbo); - glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0); - - if (mode != VsyncMode::Adaptive || !m_gl_context->SetSwapInterval(-1)) - m_gl_context->SetSwapInterval(static_cast(mode != VsyncMode::Off)); - - glBindFramebuffer(GL_DRAW_FRAMEBUFFER, current_fbo); - m_vsync_mode = mode; -} - -const char* OpenGLHostDisplay::GetGLSLVersionString() const -{ - if (GetRenderAPI() == RenderAPI::OpenGLES) - { - if (GLAD_GL_ES_VERSION_3_0) - return "#version 300 es"; - else - return "#version 100"; - } - else - { - if (GLAD_GL_VERSION_3_3) - return "#version 330"; - else - return "#version 130"; - } -} - -std::string OpenGLHostDisplay::GetGLSLVersionHeader() const -{ - std::string header = GetGLSLVersionString(); - header += "\n\n"; - if (GetRenderAPI() == RenderAPI::OpenGLES) - { - header += "precision highp float;\n"; - header += "precision highp int;\n\n"; - } - - return header; -} - -bool OpenGLHostDisplay::HasDevice() const -{ - return static_cast(m_gl_context); -} - -bool OpenGLHostDisplay::HasSurface() const -{ - return m_window_info.type != WindowInfo::Type::Surfaceless; -} - -bool OpenGLHostDisplay::CreateDevice(const WindowInfo& wi, VsyncMode vsync) -{ - m_gl_context = GL::Context::Create(wi); - if (!m_gl_context) - { - Console.Error("Failed to create any GL context"); - m_gl_context.reset(); - return false; - } - - OE_FBO = Host::PresentFrameBuffer(); - - m_window_info = m_gl_context->GetWindowInfo(); - m_vsync_mode = vsync; - return true; -} - -bool OpenGLHostDisplay::SetupDevice() -{ - // We do use 8-bit formats, and higher alignment for 32-bit formats won't hurt anything. - glPixelStorei(GL_UNPACK_ALIGNMENT, 1); - - SetSwapInterval(); - GL::Program::ResetLastProgram(); - return true; -} - -void OpenGLHostDisplay::SetSwapInterval() -{ - const int interval = ((m_vsync_mode == VsyncMode::Adaptive) ? -1 : ((m_vsync_mode == VsyncMode::On) ? 1 : 0)); - m_gl_context->SetSwapInterval(interval); -} - -bool OpenGLHostDisplay::MakeCurrent() -{ - if (!m_gl_context->MakeCurrent()) - { - Console.Error("Failed to make GL context current"); - return false; - } - - SetSwapInterval(); - return true; -} - -bool OpenGLHostDisplay::DoneCurrent() -{ - return m_gl_context->DoneCurrent(); -} - -bool OpenGLHostDisplay::ChangeWindow(const WindowInfo& new_wi) -{ - pxAssert(m_gl_context); - - if (!m_gl_context->ChangeSurface(new_wi)) - { - Console.Error("Failed to change surface"); - return false; - } - - m_window_info = m_gl_context->GetWindowInfo(); - - if (new_wi.type != WindowInfo::Type::Surfaceless) - { - // reset vsync rate, since it (usually) gets lost - if (m_vsync_mode != VsyncMode::Adaptive || !m_gl_context->SetSwapInterval(-1)) - m_gl_context->SetSwapInterval(static_cast(m_vsync_mode != VsyncMode::Off)); - } - - return true; -} - -void OpenGLHostDisplay::ResizeWindow(s32 new_window_width, s32 new_window_height, float new_window_scale) -{ - if (!m_gl_context) - return; - - m_window_info.surface_scale = new_window_scale; - if (m_window_info.surface_width == static_cast(new_window_width) && - m_window_info.surface_height == static_cast(new_window_height)) - { - return; - } - - m_gl_context->ResizeSurface(static_cast(new_window_width), static_cast(new_window_height)); - m_window_info = m_gl_context->GetWindowInfo(); -} - -bool OpenGLHostDisplay::SupportsFullscreen() const -{ - return false; -} - -bool OpenGLHostDisplay::IsFullscreen() -{ - return false; -} - -bool OpenGLHostDisplay::SetFullscreen(bool fullscreen, u32 width, u32 height, float refresh_rate) -{ - return false; -} - -HostDisplay::AdapterAndModeList OpenGLHostDisplay::GetAdapterAndModeList() -{ - AdapterAndModeList aml; - - if (m_gl_context) - { - for (const GL::Context::FullscreenModeInfo& fmi : m_gl_context->EnumerateFullscreenModes()) - aml.fullscreen_modes.push_back(GetFullscreenModeString(fmi.width, fmi.height, fmi.refresh_rate)); - } - - return aml; -} - -void OpenGLHostDisplay::DestroySurface() -{ - if (!m_gl_context) - return; - - m_window_info = {}; - if (!m_gl_context->ChangeSurface(m_window_info)) - Console.Error("Failed to switch to surfaceless"); -} - -std::string OpenGLHostDisplay::GetDriverInfo() const -{ - const char* gl_vendor = reinterpret_cast(glGetString(GL_VENDOR)); - const char* gl_renderer = reinterpret_cast(glGetString(GL_RENDERER)); - const char* gl_version = reinterpret_cast(glGetString(GL_VERSION)); - return StringUtil::StdStringFromFormat( - "%s Context:\n%s\n%s %s", m_gl_context->IsGLES() ? "OpenGL ES" : "OpenGL", gl_version, gl_vendor, gl_renderer); -} - -bool OpenGLHostDisplay::CreateImGuiContext() -{ - return true; -} - -void OpenGLHostDisplay::DestroyImGuiContext() -{ -} - -bool OpenGLHostDisplay::UpdateImGuiFontTexture() -{ - return true; -} - -HostDisplay::PresentResult OpenGLHostDisplay::BeginPresent(bool frame_skip) -{ - if (frame_skip || m_window_info.type == WindowInfo::Type::Surfaceless) - { - return PresentResult::FrameSkipped; - } - - glDisable(GL_SCISSOR_TEST); - glBindFramebuffer(GL_DRAW_FRAMEBUFFER, OE_FBO); - glClearColor(0.0f, 0.0f, 0.0f, 1.0f); - glClear(GL_COLOR_BUFFER_BIT); - glViewport(0, 0, m_window_info.surface_width, m_window_info.surface_height); - - return PresentResult::OK; -} - -void OpenGLHostDisplay::EndPresent() -{ - glDisable(GL_SCISSOR_TEST); - glDisable(GL_STENCIL_TEST); - - GL::Program::ResetLastProgram(); - - if (m_gpu_timing_enabled) - PopTimestampQuery(); - - m_gl_context->SwapBuffers(); - - if (m_gpu_timing_enabled) - KickTimestampQuery(); -} - -void OpenGLHostDisplay::CreateTimestampQueries() -{ - const bool gles = m_gl_context->IsGLES(); - const auto GenQueries = gles ? glGenQueriesEXT : glGenQueries; - - GenQueries(static_cast(m_timestamp_queries.size()), m_timestamp_queries.data()); - KickTimestampQuery(); -} - -void OpenGLHostDisplay::DestroyTimestampQueries() -{ - if (m_timestamp_queries[0] == 0) - return; - - const bool gles = m_gl_context->IsGLES(); - const auto DeleteQueries = gles ? glDeleteQueriesEXT : glDeleteQueries; - - if (m_timestamp_query_started) - { - const auto EndQuery = gles ? glEndQueryEXT : glEndQuery; - EndQuery(GL_TIME_ELAPSED); - } - - DeleteQueries(static_cast(m_timestamp_queries.size()), m_timestamp_queries.data()); - m_timestamp_queries.fill(0); - m_read_timestamp_query = 0; - m_write_timestamp_query = 0; - m_waiting_timestamp_queries = 0; - m_timestamp_query_started = false; -} - -void OpenGLHostDisplay::PopTimestampQuery() -{ - const bool gles = m_gl_context->IsGLES(); - - if (gles) - { - GLint disjoint = 0; - glGetIntegerv(GL_GPU_DISJOINT_EXT, &disjoint); - if (disjoint) - { - DevCon.WriteLn("GPU timing disjoint, resetting."); - if (m_timestamp_query_started) - glEndQueryEXT(GL_TIME_ELAPSED); - - m_read_timestamp_query = 0; - m_write_timestamp_query = 0; - m_waiting_timestamp_queries = 0; - m_timestamp_query_started = false; - } - } - - while (m_waiting_timestamp_queries > 0) - { - const auto GetQueryObjectiv = gles ? glGetQueryObjectivEXT : glGetQueryObjectiv; - const auto GetQueryObjectui64v = gles ? glGetQueryObjectui64vEXT : glGetQueryObjectui64v; - - GLint available = 0; - GetQueryObjectiv(m_timestamp_queries[m_read_timestamp_query], GL_QUERY_RESULT_AVAILABLE, &available); - - if (!available) - break; - - u64 result = 0; - GetQueryObjectui64v(m_timestamp_queries[m_read_timestamp_query], GL_QUERY_RESULT, &result); - m_accumulated_gpu_time += static_cast(static_cast(result) / 1000000.0); - m_read_timestamp_query = (m_read_timestamp_query + 1) % NUM_TIMESTAMP_QUERIES; - m_waiting_timestamp_queries--; - } - - if (m_timestamp_query_started) - { - const auto EndQuery = gles ? glEndQueryEXT : glEndQuery; - EndQuery(GL_TIME_ELAPSED); - - m_write_timestamp_query = (m_write_timestamp_query + 1) % NUM_TIMESTAMP_QUERIES; - m_timestamp_query_started = false; - m_waiting_timestamp_queries++; - } -} - -void OpenGLHostDisplay::KickTimestampQuery() -{ - if (m_timestamp_query_started || m_waiting_timestamp_queries == NUM_TIMESTAMP_QUERIES) - return; - - const bool gles = m_gl_context->IsGLES(); - const auto BeginQuery = gles ? glBeginQueryEXT : glBeginQuery; - - BeginQuery(GL_TIME_ELAPSED, m_timestamp_queries[m_write_timestamp_query]); - m_timestamp_query_started = true; -} - -bool OpenGLHostDisplay::SetGPUTimingEnabled(bool enabled) -{ - if (m_gpu_timing_enabled == enabled) - return true; - - if (enabled && m_gl_context->IsGLES() && !GLAD_GL_EXT_disjoint_timer_query) - return false; - - m_gpu_timing_enabled = enabled; - if (m_gpu_timing_enabled) - CreateTimestampQueries(); - else - DestroyTimestampQueries(); - - return true; -} - -float OpenGLHostDisplay::GetAndResetAccumulatedGPUTime() -{ - const float value = m_accumulated_gpu_time; - m_accumulated_gpu_time = 0.0f; - return value; -} - -#endif diff --git a/PCSX2.xcodeproj/project.pbxproj b/PCSX2.xcodeproj/project.pbxproj index 37bdb84..ea65df6 100644 --- a/PCSX2.xcodeproj/project.pbxproj +++ b/PCSX2.xcodeproj/project.pbxproj @@ -956,7 +956,6 @@ DD03001927BD695D0006ABDC /* tfx_fs.glsl in Copy OpenGL Shaders */ = {isa = PBXBuildFile; fileRef = 558065C627AD3A31008CD5D2 /* tfx_fs.glsl */; }; DD0302B127C435760006ABDC /* SndOut_Cubeb.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 558063BB27AB4B6C008CD5D2 /* SndOut_Cubeb.cpp */; }; DD0302B727C491020006ABDC /* OESndOut.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DD0302B527C491020006ABDC /* OESndOut.cpp */; }; - DD0302BD27C491160006ABDC /* OpenGLHostDisplayOverride.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DD0302B927C491160006ABDC /* OpenGLHostDisplayOverride.cpp */; }; DD0302C027C491160006ABDC /* GLContextAGL.mm in Sources */ = {isa = PBXBuildFile; fileRef = DD0302BC27C491160006ABDC /* GLContextAGL.mm */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; DD03FFD827B721F20006ABDC /* GSTextureMTL.mm in Sources */ = {isa = PBXBuildFile; fileRef = DD03FFB927B70F0C0006ABDC /* GSTextureMTL.mm */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; DD5A404E298CA9B700EFBE7A /* SndOut.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5517FCD0263D49BC000219EC /* SndOut.cpp */; }; @@ -3011,7 +3010,6 @@ 55F9D7E228120385005286B6 /* fxaa.metal */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.metal; path = fxaa.metal; sourceTree = ""; }; DD0302B427C491020006ABDC /* OESndOut.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OESndOut.h; sourceTree = ""; }; DD0302B527C491020006ABDC /* OESndOut.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = OESndOut.cpp; sourceTree = ""; }; - DD0302B927C491160006ABDC /* OpenGLHostDisplayOverride.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = OpenGLHostDisplayOverride.cpp; sourceTree = ""; }; DD0302BA27C491160006ABDC /* GSDeviceMTL.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = GSDeviceMTL.mm; sourceTree = ""; usesTabs = 1; }; DD0302BC27C491160006ABDC /* GLContextAGL.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = GLContextAGL.mm; sourceTree = ""; }; DD0302C827C5494A0006ABDC /* keymap.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = keymap.h; sourceTree = ""; }; @@ -6676,7 +6674,6 @@ 55484D3C28855E740066EDEB /* GSDumpReplayer.cpp */, DD75EE5E29898A3A0056B3BA /* GSMTLDeviceInfo.mm */, DD5D197D27D708A900ED83D9 /* OEHostDisplay.h */, - DD0302B927C491160006ABDC /* OpenGLHostDisplayOverride.cpp */, ); path = Video; sourceTree = ""; @@ -7665,7 +7662,6 @@ 551BF637264216F50008C529 /* BlockdumpFileReader.cpp in Sources */, DDE1B427298C68130028DF05 /* audiodev-cubeb.cpp in Sources */, 551BF57926420E720008C529 /* Vif0_Dma.cpp in Sources */, - DD0302BD27C491160006ABDC /* OpenGLHostDisplayOverride.cpp in Sources */, 55B1F02C295BAD5600DB297F /* ICMP_Session.cpp in Sources */, 551BF56826420E3B0008C529 /* newVif_Unpack.cpp in Sources */, 557D49D027D00BE7006C2C69 /* merge.metal in Sources */,