From e8f45553290e3f3689d0c99d82e0f5731af35341 Mon Sep 17 00:00:00 2001 From: LTDCrissOK Date: Sat, 7 Nov 2026 15:36:06 -0300 Subject: [PATCH] Implement GSOpenGLBackend class for OpenGL support --- ps2xRuntime/src/lib/gs/gs_opengl_backend.cpp | 62 ++++++++++++++++++++ 1 file changed, 62 insertions(+) create mode 100644 ps2xRuntime/src/lib/gs/gs_opengl_backend.cpp diff --git a/ps2xRuntime/src/lib/gs/gs_opengl_backend.cpp b/ps2xRuntime/src/lib/gs/gs_opengl_backend.cpp new file mode 100644 index 0000000000..e4df320e87 --- /dev/null +++ b/ps2xRuntime/src/lib/gs/gs_opengl_backend.cpp @@ -0,0 +1,62 @@ +#include "runtime/gs/gs_opengl_backend.h" +#include "runtime/gs/gs_cpu_backend.h" + +#if defined(__ANDROID__) +#include +#include +#endif + +#include +#include + +GSOpenGLBackend::GSOpenGLBackend() + : m_cpu(std::make_unique()) +{ +#if defined(__ANDROID__) + // Esto solo es válido después de crear y hacer current el contexto EGL + // en el hilo que vaya a utilizar OpenGL. + const GLubyte* version = glGetString(GL_VERSION); + if (version != nullptr) + { + std::strncpy(m_glVersion, reinterpret_cast(version), + sizeof(m_glVersion) - 1); + GLint major = 0; + GLint minor = 0; + glGetIntegerv(GL_MAJOR_VERSION, &major); + glGetIntegerv(GL_MINOR_VERSION, &minor); + m_gles32Available = (major > 3) || (major == 3 && minor >= 2); + } +#endif +} + +GSOpenGLBackend::~GSOpenGLBackend() = default; + +bool GSOpenGLBackend::IsOpenGLES32Available() const +{ + return m_gles32Available; +} + +const char* GSOpenGLBackend::GetOpenGLVersion() const +{ + return m_glVersion; +} + +void GSOpenGLBackend::Initialize(uint8_t* vram, uint32_t vramSize) +{ + m_cpu->Initialize(vram, vramSize); +} +void GSOpenGLBackend::Reset() { m_cpu->Reset(); } +void GSOpenGLBackend::Submit(const GSPrimitiveBatch& batch) { m_cpu->Submit(batch); } +void GSOpenGLBackend::LoadClut(const GSTex0Reg& a, const GSTexClutReg& b) { m_cpu->LoadClut(a, b); } +void GSOpenGLBackend::BeginTransfer(const GSTransferCommand& command) { m_cpu->BeginTransfer(command); } +void GSOpenGLBackend::UploadImage(const uint8_t* data, uint32_t sizeBytes) { m_cpu->UploadImage(data, sizeBytes); } +void GSOpenGLBackend::Flush() { m_cpu->Flush(); } +void GSOpenGLBackend::TextureFlush() { m_cpu->TextureFlush(); } +void GSOpenGLBackend::Sync(GSSyncReason reason) { m_cpu->Sync(reason); } +PresentationFrame GSOpenGLBackend::Present(const GSPresentationRequest& request) { return m_cpu->Present(request); } +bool GSOpenGLBackend::ClearFramebuffer(const GSContext& context, uint32_t rgba) { return m_cpu->ClearFramebuffer(context, rgba); } +uint32_t GSOpenGLBackend::ConsumeLocalToHostBytes(uint8_t* dst, uint32_t maxBytes) { return m_cpu->ConsumeLocalToHostBytes(dst, maxBytes); } +uint32_t GSOpenGLBackend::ReadVram(uint32_t psm, uint32_t base, uint32_t bw, uint32_t x, uint32_t y) const { return m_cpu->ReadVram(psm, base, bw, x, y); } +void GSOpenGLBackend::WriteVram(uint32_t psm, uint32_t base, uint32_t bw, uint32_t x, uint32_t y, uint32_t value) { m_cpu->WriteVram(psm, base, bw, x, y, value); } +void GSOpenGLBackend::SnapshotVram(std::vector& out) const { m_cpu->SnapshotVram(out); } +GSTransferSnapshot GSOpenGLBackend::GetTransferSnapshot() const { return m_cpu->GetTransferSnapshot(); }