diff --git a/src/gl/data/gl_viewpointbuffer.cpp b/src/gl/data/gl_viewpointbuffer.cpp index 7af26ca52..eb4d8c92e 100644 --- a/src/gl/data/gl_viewpointbuffer.cpp +++ b/src/gl/data/gl_viewpointbuffer.cpp @@ -41,6 +41,7 @@ GLViewpointBuffer::GLViewpointBuffer() Allocate(); Clear(); mLastMappedIndex = UINT_MAX; + mClipPlaneInfo.Push(0); } GLViewpointBuffer::~GLViewpointBuffer() @@ -121,10 +122,9 @@ int GLViewpointBuffer::Bind(unsigned int index) glBindBufferRange(GL_UNIFORM_BUFFER, VIEWPOINT_BINDINGPOINT, mBufferId, index * mBlockAlign, mBlockAlign); // Update the viewpoint-related clip plane setting. - auto *vp = (HWViewpointUniforms*)(((char*)mBufferPointer) + mUploadIndex * mBlockAlign); if (!(gl.flags & RFL_NO_CLIP_PLANES)) { - if (index > 0 && (vp->mClipHeightDirection != 0.f || vp->mClipLine.X > -10000000.0f)) + if (mClipPlaneInfo[index]) { glEnable(GL_CLIP_DISTANCE0); } @@ -163,6 +163,7 @@ int GLViewpointBuffer::SetViewpoint(HWViewpointUniforms *vp) memcpy(((char*)mBufferPointer) + mUploadIndex * mBlockAlign, vp, sizeof(*vp)); Unmap(); + mClipPlaneInfo.Push(vp->mClipHeightDirection != 0.f || vp->mClipLine.X > -10000000.0f); return Bind(mUploadIndex++); } @@ -170,5 +171,6 @@ void GLViewpointBuffer::Clear() { // Index 0 is reserved for the 2D projection. mUploadIndex = 1; + mClipPlaneInfo.Resize(1); } diff --git a/src/gl/data/gl_viewpointbuffer.h b/src/gl/data/gl_viewpointbuffer.h index 208a42a5d..3ec1093df 100644 --- a/src/gl/data/gl_viewpointbuffer.h +++ b/src/gl/data/gl_viewpointbuffer.h @@ -12,6 +12,7 @@ class GLViewpointBuffer unsigned int mLastMappedIndex; unsigned int mByteSize; void * mBufferPointer; + TArray mClipPlaneInfo; unsigned int m2DWidth = ~0u, m2DHeight = ~0u; diff --git a/src/posix/sdl/gl_sysfb.h b/src/posix/sdl/gl_sysfb.h index ee2713bc5..44b92cf1a 100644 --- a/src/posix/sdl/gl_sysfb.h +++ b/src/posix/sdl/gl_sysfb.h @@ -52,11 +52,7 @@ protected: static const int MIN_WIDTH = 320; static const int MIN_HEIGHT = 200; - - typedef DECLSPEC int SDLCALL (*SDL_GetWindowBordersSizePtr)(SDL_Window *, int *, int *, int *, int *); - - SDL_GetWindowBordersSizePtr SDL_GetWindowBordersSize_; - void *sdl_lib; }; #endif // __POSIX_SDL_GL_SYSFB_H__ + diff --git a/src/posix/sdl/sdlglvideo.cpp b/src/posix/sdl/sdlglvideo.cpp index 15c0e4944..b270fcdab 100644 --- a/src/posix/sdl/sdlglvideo.cpp +++ b/src/posix/sdl/sdlglvideo.cpp @@ -35,6 +35,7 @@ #include "doomtype.h" +#include "i_module.h" #include "i_system.h" #include "i_video.h" #include "m_argv.h" @@ -172,6 +173,11 @@ IVideo *gl_CreateVideo() // FrameBuffer implementation ----------------------------------------------- +FModule sdl_lib("SDL2"); + +typedef int (*SDL_GetWindowBordersSizePtr)(SDL_Window *, int *, int *, int *, int *); +static TOptProc SDL_GetWindowBordersSize_("SDL_GetWindowBordersSize"); + SystemGLFrameBuffer::SystemGLFrameBuffer (void *, bool fullscreen) : DFrameBuffer (vid_defwidth, vid_defheight) { @@ -180,10 +186,9 @@ SystemGLFrameBuffer::SystemGLFrameBuffer (void *, bool fullscreen) // SDL_GetWindowBorderSize() is only available since 2.0.5, but because // GZDoom supports platforms with older SDL2 versions, this function // has to be dynamically loaded - sdl_lib = SDL_LoadObject("libSDL2.so"); - if (sdl_lib != nullptr) + if (!sdl_lib.IsLoaded()) { - SDL_GetWindowBordersSize_ = (SDL_GetWindowBordersSizePtr)SDL_LoadFunction(sdl_lib,"SDL_GetWindowBordersSize"); + sdl_lib.Load({ "libSDL2.so", "libSDL2-2.0.so" }); } // NOTE: Core profiles were added with GL 3.2, so there's no sense trying @@ -261,11 +266,6 @@ SystemGLFrameBuffer::SystemGLFrameBuffer (void *, bool fullscreen) SystemGLFrameBuffer::~SystemGLFrameBuffer () { - if (sdl_lib != nullptr) - { - SDL_UnloadObject(sdl_lib); - } - if (Screen) { ResetGammaTable(); @@ -391,7 +391,7 @@ void SystemGLFrameBuffer::SetWindowSize(int w, int h) void SystemGLFrameBuffer::GetWindowBordersSize(int &top, int &left) { - if (SDL_GetWindowBordersSize_ != nullptr) + if (SDL_GetWindowBordersSize_) { SDL_GetWindowBordersSize_(Screen, &top, &left, nullptr, nullptr); }