From 06c8a875343cb46725ef6cc6632ee556d8626b0e Mon Sep 17 00:00:00 2001 From: kd-11 Date: Wed, 10 Jun 2026 23:22:39 +0300 Subject: [PATCH] gl: Drop use of the retired glNamedBufferStorageEXT function - The DSA_EXT fallback is now GLES-only. - We introduce a wrapper to act as a fallback for older GPUs - NamedBufferStorageEX. --- rpcs3/Emu/CMakeLists.txt | 1 + rpcs3/Emu/RSX/GL/GLProcTable.h | 2 +- rpcs3/Emu/RSX/GL/glutils/buffer_object.cpp | 3 ++- rpcs3/Emu/RSX/GL/glutils/common.h | 14 +++++++++++++- rpcs3/Emu/RSX/GL/glutils/ex.cpp | 19 +++++++++++++++++++ rpcs3/Emu/RSX/GL/glutils/ex.h | 12 ++++++++++++ rpcs3/Emu/RSX/GL/glutils/ring_buffer.cpp | 5 +++-- rpcs3/GLGSRender.vcxproj | 2 ++ rpcs3/GLGSRender.vcxproj.filters | 6 ++++++ 9 files changed, 59 insertions(+), 5 deletions(-) create mode 100644 rpcs3/Emu/RSX/GL/glutils/ex.cpp create mode 100644 rpcs3/Emu/RSX/GL/glutils/ex.h diff --git a/rpcs3/Emu/CMakeLists.txt b/rpcs3/Emu/CMakeLists.txt index 3a3d202a2e..045fa30769 100644 --- a/rpcs3/Emu/CMakeLists.txt +++ b/rpcs3/Emu/CMakeLists.txt @@ -588,6 +588,7 @@ if(NOT ANDROID AND NOT APPLE) RSX/GL/glutils/buffer_object.cpp RSX/GL/glutils/capabilities.cpp RSX/GL/glutils/common.cpp + RSX/GL/glutils/ex.cpp RSX/GL/glutils/fbo.cpp RSX/GL/glutils/image.cpp RSX/GL/glutils/program.cpp diff --git a/rpcs3/Emu/RSX/GL/GLProcTable.h b/rpcs3/Emu/RSX/GL/GLProcTable.h index b4a9c1c289..f39610012d 100644 --- a/rpcs3/Emu/RSX/GL/GLProcTable.h +++ b/rpcs3/Emu/RSX/GL/GLProcTable.h @@ -248,7 +248,7 @@ OPENGL_PROC(PFNGLCOPYIMAGESUBDATAPROC, CopyImageSubData); // ARB_Buffer_Storage OPENGL_PROC(PFNGLNAMEDBUFFERSTORAGEPROC, NamedBufferStorage); -OPENGL_PROC(PFNGLNAMEDBUFFERSTORAGEEXTPROC, NamedBufferStorageEXT); +OPENGL_PROC(PFNGLBUFFERSTORAGEPROC, BufferStorage); // ARB_sync OPENGL_PROC(PFNGLFENCESYNCPROC, FenceSync); diff --git a/rpcs3/Emu/RSX/GL/glutils/buffer_object.cpp b/rpcs3/Emu/RSX/GL/glutils/buffer_object.cpp index f3849718d0..d47848f393 100644 --- a/rpcs3/Emu/RSX/GL/glutils/buffer_object.cpp +++ b/rpcs3/Emu/RSX/GL/glutils/buffer_object.cpp @@ -1,6 +1,7 @@ #include "stdafx.h" #include "buffer_object.h" #include "common.h" +#include "ex.h" namespace gl { @@ -44,7 +45,7 @@ namespace gl flags |= GL_CLIENT_STORAGE_BIT; } - DSA_CALL2(NamedBufferStorage, m_id, size, data_, flags); + DSA_CALL_EX(NamedBufferStorage, m_id, static_cast(m_target), size, data_, flags); m_size = size; } else diff --git a/rpcs3/Emu/RSX/GL/glutils/common.h b/rpcs3/Emu/RSX/GL/glutils/common.h index 326a79b9e8..ef714a991c 100644 --- a/rpcs3/Emu/RSX/GL/glutils/common.h +++ b/rpcs3/Emu/RSX/GL/glutils/common.h @@ -25,19 +25,31 @@ #define GL_COMPUTE_BUFFER_SLOT(index) SSBO_SLOT(2 + index) #define GL_COMPUTE_IMAGE_SLOT(index) SSBO_SLOT(index) -//Function call wrapped in ARB_DSA vs EXT_DSA compat check +// Function call wrapped in ARB_DSA vs EXT_DSA compat check #define DSA_CALL(func, object_name, target, ...)\ if (::gl::get_driver_caps().ARB_direct_state_access_supported)\ gl##func(object_name, __VA_ARGS__);\ else\ gl##func##EXT(object_name, target, __VA_ARGS__); +#define DSA_CALL_EX(func, object_name, target, ...)\ + if (::gl::get_driver_caps().ARB_direct_state_access_supported)\ + gl##func(object_name, __VA_ARGS__);\ + else\ + gl##func##EX(object_name, target, __VA_ARGS__); + #define DSA_CALL2(func, ...)\ if (::gl::get_driver_caps().ARB_direct_state_access_supported)\ gl##func(__VA_ARGS__);\ else\ gl##func##EXT(__VA_ARGS__); +#define DSA_CALL2_EX(func, ...)\ + if (::gl::get_driver_caps().ARB_direct_state_access_supported)\ + gl##func(__VA_ARGS__);\ + else\ + gl##func##EX(__VA_ARGS__); + #define DSA_CALL2_RET(func, ...)\ (::gl::get_driver_caps().ARB_direct_state_access_supported) ?\ gl##func(__VA_ARGS__) :\ diff --git a/rpcs3/Emu/RSX/GL/glutils/ex.cpp b/rpcs3/Emu/RSX/GL/glutils/ex.cpp new file mode 100644 index 0000000000..867930724d --- /dev/null +++ b/rpcs3/Emu/RSX/GL/glutils/ex.cpp @@ -0,0 +1,19 @@ +#include "stdafx.h" +#include "ex.h" + +namespace gl::ex +{ + void glNamedBufferStorageEX(GLuint buffer, GLenum target, GLsizeiptr size, const void* data, GLbitfield flags) + { + GLint restore = GL_NONE; + glGetIntegerv(target, &restore); + + glBindBuffer(target, buffer); + glBufferStorage(target, size, data, flags); + + if (restore != buffer) + { + glBindBuffer(target, restore); + } + } +} diff --git a/rpcs3/Emu/RSX/GL/glutils/ex.h b/rpcs3/Emu/RSX/GL/glutils/ex.h new file mode 100644 index 0000000000..5464e50580 --- /dev/null +++ b/rpcs3/Emu/RSX/GL/glutils/ex.h @@ -0,0 +1,12 @@ +#pragma once + +#include "capabilities.h" + +namespace gl::ex +{ + // Fallback EX implementation of NamedBufferStorage. The official EXT_DSA variant was dropped from desktop spec as it was originally meant for GLES only. + // Target parameter reintroduced as an optimization to avoid side effects. + void glNamedBufferStorageEX(GLuint buffer, GLenum target, GLsizeiptr size, const void* data, GLbitfield flags); +} + +using namespace ::gl::ex; diff --git a/rpcs3/Emu/RSX/GL/glutils/ring_buffer.cpp b/rpcs3/Emu/RSX/GL/glutils/ring_buffer.cpp index ac0cc48afe..8ec0e29590 100644 --- a/rpcs3/Emu/RSX/GL/glutils/ring_buffer.cpp +++ b/rpcs3/Emu/RSX/GL/glutils/ring_buffer.cpp @@ -1,5 +1,6 @@ #include "stdafx.h" #include "ring_buffer.h" +#include "ex.h" namespace gl { @@ -17,7 +18,7 @@ namespace gl GLbitfield buffer_storage_flags = GL_MAP_WRITE_BIT | GL_MAP_PERSISTENT_BIT | GL_MAP_COHERENT_BIT; if (gl::get_driver_caps().vendor_MESA) buffer_storage_flags |= GL_CLIENT_STORAGE_BIT; - DSA_CALL2(NamedBufferStorage, m_id, size, data, buffer_storage_flags); + DSA_CALL_EX(NamedBufferStorage, m_id, static_cast(m_target), size, data, buffer_storage_flags); m_memory_mapping = DSA_CALL2_RET(MapNamedBufferRange, m_id, 0, size, GL_MAP_WRITE_BIT | GL_MAP_PERSISTENT_BIT | GL_MAP_COHERENT_BIT); ensure(m_memory_mapping != nullptr); @@ -206,7 +207,7 @@ namespace gl buffer::create(); save_binding_state save(current_target(), *this); - DSA_CALL2(NamedBufferStorage, m_id, size, data, GL_MAP_WRITE_BIT); + DSA_CALL_EX(NamedBufferStorage, m_id, static_cast(m_target), size, data, GL_MAP_WRITE_BIT); m_data_loc = 0; m_size = ::narrow(size); diff --git a/rpcs3/GLGSRender.vcxproj b/rpcs3/GLGSRender.vcxproj index 8d6ba02dd9..c48f3845b9 100644 --- a/rpcs3/GLGSRender.vcxproj +++ b/rpcs3/GLGSRender.vcxproj @@ -66,6 +66,7 @@ + @@ -102,6 +103,7 @@ + diff --git a/rpcs3/GLGSRender.vcxproj.filters b/rpcs3/GLGSRender.vcxproj.filters index c4fe752d10..72aee7172c 100644 --- a/rpcs3/GLGSRender.vcxproj.filters +++ b/rpcs3/GLGSRender.vcxproj.filters @@ -49,6 +49,9 @@ + + glutils + @@ -125,6 +128,9 @@ glutils + + glutils +