2014-03-15 16:59:03 +00:00
|
|
|
// Emacs style mode select -*- C++ -*-
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
//
|
|
|
|
// Copyright (C) 1998-2000 by DooM Legacy Team.
|
2019-12-06 18:49:42 +00:00
|
|
|
// Copyright (C) 2014-2019 by Sonic Team Junior.
|
2014-03-15 16:59:03 +00:00
|
|
|
//
|
|
|
|
// This program 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 2
|
|
|
|
// of the License, or (at your option) any later version.
|
|
|
|
//
|
|
|
|
// This program 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.
|
|
|
|
//
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
/// \file
|
|
|
|
/// \brief SDL specific part of the OpenGL API for SRB2
|
|
|
|
|
|
|
|
#ifdef _MSC_VER
|
|
|
|
#pragma warning(disable : 4214 4244)
|
|
|
|
#endif
|
|
|
|
|
2014-07-25 23:10:24 +00:00
|
|
|
#ifdef HAVE_SDL
|
2016-05-22 03:53:04 +00:00
|
|
|
#define _MATH_DEFINES_DEFINED
|
2014-03-15 16:59:03 +00:00
|
|
|
|
|
|
|
#include "SDL.h"
|
|
|
|
|
2014-07-26 07:06:00 +00:00
|
|
|
#include "sdlmain.h"
|
|
|
|
|
2014-03-15 16:59:03 +00:00
|
|
|
#ifdef _MSC_VER
|
|
|
|
#pragma warning(default : 4214 4244)
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#include "../doomdef.h"
|
|
|
|
|
|
|
|
#ifdef HWRENDER
|
|
|
|
#include "../hardware/r_opengl/r_opengl.h"
|
2019-12-25 19:22:01 +00:00
|
|
|
#include "../hardware/hw_main.h"
|
2014-03-15 16:59:03 +00:00
|
|
|
#include "ogl_sdl.h"
|
|
|
|
#include "../i_system.h"
|
|
|
|
#include "hwsym_sdl.h"
|
|
|
|
#include "../m_argv.h"
|
|
|
|
|
|
|
|
#ifdef DEBUG_TO_FILE
|
|
|
|
#include <stdarg.h>
|
|
|
|
#if defined (_WIN32) && !defined (__CYGWIN__)
|
|
|
|
#include <direct.h>
|
|
|
|
#else
|
|
|
|
#include <unistd.h>
|
|
|
|
#endif
|
|
|
|
#include <sys/types.h>
|
|
|
|
#include <sys/stat.h>
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#ifdef USE_WGL_SWAP
|
|
|
|
PFNWGLEXTSWAPCONTROLPROC wglSwapIntervalEXT = NULL;
|
|
|
|
#else
|
|
|
|
typedef int (*PFNGLXSWAPINTERVALPROC) (int);
|
|
|
|
PFNGLXSWAPINTERVALPROC glXSwapIntervalSGIEXT = NULL;
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#ifndef STATIC_OPENGL
|
|
|
|
PFNglClear pglClear;
|
|
|
|
PFNglGetIntegerv pglGetIntegerv;
|
|
|
|
PFNglGetString pglGetString;
|
|
|
|
#endif
|
|
|
|
|
|
|
|
/** \brief SDL video display surface
|
|
|
|
*/
|
|
|
|
INT32 oglflags = 0;
|
|
|
|
void *GLUhandle = NULL;
|
2014-07-26 07:06:00 +00:00
|
|
|
SDL_GLContext sdlglcontext = 0;
|
2014-03-15 16:59:03 +00:00
|
|
|
|
|
|
|
void *GetGLFunc(const char *proc)
|
|
|
|
{
|
|
|
|
if (strncmp(proc, "glu", 3) == 0)
|
|
|
|
{
|
|
|
|
if (GLUhandle)
|
|
|
|
return hwSym(proc, GLUhandle);
|
|
|
|
else
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
return SDL_GL_GetProcAddress(proc);
|
|
|
|
}
|
|
|
|
|
|
|
|
boolean LoadGL(void)
|
|
|
|
{
|
|
|
|
#ifndef STATIC_OPENGL
|
|
|
|
const char *OGLLibname = NULL;
|
|
|
|
const char *GLULibname = NULL;
|
|
|
|
|
2019-12-25 19:22:01 +00:00
|
|
|
if (M_CheckParm("-OGLlib") && M_IsNextParm())
|
2014-03-15 16:59:03 +00:00
|
|
|
OGLLibname = M_GetNextParm();
|
|
|
|
|
|
|
|
if (SDL_GL_LoadLibrary(OGLLibname) != 0)
|
|
|
|
{
|
2019-12-25 19:22:01 +00:00
|
|
|
CONS_Alert(CONS_ERROR, "Could not load OpenGL Library: %s\n"
|
2014-03-15 16:59:03 +00:00
|
|
|
"Falling back to Software mode.\n", SDL_GetError());
|
2019-12-25 19:22:01 +00:00
|
|
|
if (!M_CheckParm("-OGLlib"))
|
|
|
|
CONS_Printf("If you know what is the OpenGL library's name, use -OGLlib\n");
|
2014-03-15 16:59:03 +00:00
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
#if 0
|
|
|
|
GLULibname = "/proc/self/exe";
|
|
|
|
#elif defined (_WIN32)
|
|
|
|
GLULibname = "GLU32.DLL";
|
|
|
|
#elif defined (__MACH__)
|
|
|
|
GLULibname = "/System/Library/Frameworks/OpenGL.framework/Libraries/libGLU.dylib";
|
|
|
|
#elif defined (macintos)
|
|
|
|
GLULibname = "OpenGLLibrary";
|
|
|
|
#elif defined (__unix__)
|
|
|
|
GLULibname = "libGLU.so.1";
|
|
|
|
#elif defined (__HAIKU__)
|
|
|
|
GLULibname = "libGLU.so";
|
|
|
|
#else
|
|
|
|
GLULibname = NULL;
|
|
|
|
#endif
|
|
|
|
|
2019-12-25 19:22:01 +00:00
|
|
|
if (M_CheckParm("-GLUlib") && M_IsNextParm())
|
2014-03-15 16:59:03 +00:00
|
|
|
GLULibname = M_GetNextParm();
|
|
|
|
|
|
|
|
if (GLULibname)
|
|
|
|
{
|
|
|
|
GLUhandle = hwOpen(GLULibname);
|
|
|
|
if (GLUhandle)
|
|
|
|
return SetupGLfunc();
|
|
|
|
else
|
|
|
|
{
|
|
|
|
I_OutputMsg("Could not load GLU Library: %s\n", GLULibname);
|
|
|
|
if (!M_CheckParm ("-GLUlib"))
|
|
|
|
I_OutputMsg("If you know what is the GLU library's name, use -GLUlib\n");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
I_OutputMsg("Could not load GLU Library\n");
|
|
|
|
I_OutputMsg("If you know what is the GLU library's name, use -GLUlib\n");
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
return SetupGLfunc();
|
|
|
|
}
|
|
|
|
|
|
|
|
/** \brief The OglSdlSurface function
|
|
|
|
|
|
|
|
\param w width
|
|
|
|
\param h height
|
|
|
|
\param isFullscreen if true, go fullscreen
|
|
|
|
|
|
|
|
\return if true, changed video mode
|
|
|
|
*/
|
2014-07-26 07:06:00 +00:00
|
|
|
boolean OglSdlSurface(INT32 w, INT32 h)
|
2014-03-15 16:59:03 +00:00
|
|
|
{
|
2019-12-25 19:22:01 +00:00
|
|
|
INT32 cbpp = cv_scr_depth.value < 16 ? 16 : cv_scr_depth.value;
|
|
|
|
static boolean first_init = false;
|
|
|
|
|
2014-03-15 16:59:03 +00:00
|
|
|
oglflags = 0;
|
|
|
|
|
2019-12-25 19:22:01 +00:00
|
|
|
if (!first_init)
|
|
|
|
{
|
|
|
|
gl_version = pglGetString(GL_VERSION);
|
|
|
|
gl_renderer = pglGetString(GL_RENDERER);
|
|
|
|
gl_extensions = pglGetString(GL_EXTENSIONS);
|
|
|
|
|
|
|
|
GL_DBG_Printf("OpenGL %s\n", gl_version);
|
|
|
|
GL_DBG_Printf("GPU: %s\n", gl_renderer);
|
|
|
|
GL_DBG_Printf("Extensions: %s\n", gl_extensions);
|
|
|
|
}
|
|
|
|
first_init = true;
|
|
|
|
|
2014-03-15 16:59:03 +00:00
|
|
|
if (isExtAvailable("GL_EXT_texture_filter_anisotropic", gl_extensions))
|
|
|
|
pglGetIntegerv(GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT, &maximumAnisotropy);
|
|
|
|
else
|
2014-07-26 07:06:00 +00:00
|
|
|
maximumAnisotropy = 1;
|
2014-03-15 16:59:03 +00:00
|
|
|
|
2019-12-25 19:22:01 +00:00
|
|
|
SetupGLFunc4();
|
2014-11-02 06:11:37 +00:00
|
|
|
|
2014-03-15 16:59:03 +00:00
|
|
|
granisotropicmode_cons_t[1].value = maximumAnisotropy;
|
|
|
|
|
2014-07-26 07:06:00 +00:00
|
|
|
SDL_GL_SetSwapInterval(cv_vidwait.value ? 1 : 0);
|
|
|
|
|
2014-03-15 16:59:03 +00:00
|
|
|
SetModelView(w, h);
|
|
|
|
SetStates();
|
|
|
|
pglClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
|
|
|
|
|
|
|
|
HWR_Startup();
|
|
|
|
textureformatGL = cbpp > 16 ? GL_RGBA : GL_RGB5_A1;
|
|
|
|
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
/** \brief The OglSdlFinishUpdate function
|
|
|
|
|
|
|
|
\param vidwait wait for video sync
|
|
|
|
|
|
|
|
\return void
|
|
|
|
*/
|
|
|
|
void OglSdlFinishUpdate(boolean waitvbl)
|
|
|
|
{
|
|
|
|
static boolean oldwaitvbl = false;
|
2014-11-14 00:06:38 +00:00
|
|
|
int sdlw, sdlh;
|
2014-03-15 16:59:03 +00:00
|
|
|
if (oldwaitvbl != waitvbl)
|
|
|
|
{
|
2014-07-26 07:06:00 +00:00
|
|
|
SDL_GL_SetSwapInterval(waitvbl ? 1 : 0);
|
2014-03-15 16:59:03 +00:00
|
|
|
}
|
2014-11-14 00:06:38 +00:00
|
|
|
|
2014-03-15 16:59:03 +00:00
|
|
|
oldwaitvbl = waitvbl;
|
|
|
|
|
2014-11-14 00:06:38 +00:00
|
|
|
SDL_GetWindowSize(window, &sdlw, &sdlh);
|
|
|
|
|
|
|
|
HWR_MakeScreenFinalTexture();
|
|
|
|
HWR_DrawScreenFinalTexture(sdlw, sdlh);
|
2014-07-26 07:06:00 +00:00
|
|
|
SDL_GL_SwapWindow(window);
|
2014-11-14 00:06:38 +00:00
|
|
|
|
2018-03-18 17:12:12 +00:00
|
|
|
GClipRect(0, 0, realwidth, realheight, NZCLIP_PLANE);
|
|
|
|
|
|
|
|
// Sryder: We need to draw the final screen texture again into the other buffer in the original position so that
|
|
|
|
// effects that want to take the old screen can do so after this
|
|
|
|
HWR_DrawScreenFinalTexture(realwidth, realheight);
|
2014-03-15 16:59:03 +00:00
|
|
|
}
|
|
|
|
|
2019-12-25 19:22:01 +00:00
|
|
|
EXPORT void HWRAPI(OglSdlSetPalette) (RGBA_t *palette)
|
2014-03-15 16:59:03 +00:00
|
|
|
{
|
2019-12-09 01:28:13 +00:00
|
|
|
size_t palsize = (sizeof(RGBA_t) * 256);
|
|
|
|
// on a palette change, you have to reload all of the textures
|
|
|
|
if (memcmp(&myPaletteData, palette, palsize))
|
2014-03-15 16:59:03 +00:00
|
|
|
{
|
2019-12-09 01:28:13 +00:00
|
|
|
memcpy(&myPaletteData, palette, palsize);
|
|
|
|
Flush();
|
2014-03-15 16:59:03 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
#endif //HWRENDER
|
|
|
|
#endif //SDL
|