Virtual resolutions in OpenGL

Also made fades use core functions if they are available.
This commit is contained in:
Ronald Kinard 2014-11-13 18:06:38 -06:00
parent 5d0eafb26a
commit d8484a86e0
8 changed files with 142 additions and 25 deletions

View file

@ -84,6 +84,8 @@ EXPORT void HWRAPI(EndScreenWipe) (void);
EXPORT void HWRAPI(DoScreenWipe) (float alpha); EXPORT void HWRAPI(DoScreenWipe) (float alpha);
EXPORT void HWRAPI(DrawIntermissionBG) (void); EXPORT void HWRAPI(DrawIntermissionBG) (void);
EXPORT void HWRAPI(MakeScreenTexture) (void); EXPORT void HWRAPI(MakeScreenTexture) (void);
EXPORT void HWRAPI(MakeScreenFinalTexture) (void);
EXPORT void HWRAPI(DrawScreenFinalTexture) (int width, int height);
// ========================================================================== // ==========================================================================
// HWR DRIVER OBJECT, FOR CLIENT PROGRAM // HWR DRIVER OBJECT, FOR CLIENT PROGRAM
// ========================================================================== // ==========================================================================
@ -127,6 +129,8 @@ struct hwdriver_s
DoScreenWipe pfnDoScreenWipe; DoScreenWipe pfnDoScreenWipe;
DrawIntermissionBG pfnDrawIntermissionBG; DrawIntermissionBG pfnDrawIntermissionBG;
MakeScreenTexture pfnMakeScreenTexture; MakeScreenTexture pfnMakeScreenTexture;
MakeScreenFinalTexture pfnMakeScreenFinalTexture;
DrawScreenFinalTexture pfnDrawScreenFinalTexture;
}; };
extern struct hwdriver_s hwdriver; extern struct hwdriver_s hwdriver;

View file

@ -5936,4 +5936,14 @@ void HWR_DoWipe(UINT8 wipenum, UINT8 scrnnum)
HWRWipeCounter = 1.0f; HWRWipeCounter = 1.0f;
} }
void HWR_MakeScreenFinalTexture(void)
{
HWD.pfnMakeScreenFinalTexture();
}
void HWR_DrawScreenFinalTexture(int width, int height)
{
HWD.pfnDrawScreenFinalTexture(width, height);
}
#endif // HWRENDER #endif // HWRENDER

View file

@ -65,6 +65,8 @@ void HWR_StartScreenWipe(void);
void HWR_EndScreenWipe(void); void HWR_EndScreenWipe(void);
void HWR_DrawIntermissionBG(void); void HWR_DrawIntermissionBG(void);
void HWR_DoWipe(UINT8 wipenum, UINT8 scrnnum); void HWR_DoWipe(UINT8 wipenum, UINT8 scrnnum);
void HWR_MakeScreenFinalTexture(void);
void HWR_DrawScreenFinalTexture(int width, int height);
// This stuff is put here so MD2's can use them // This stuff is put here so MD2's can use them
UINT32 HWR_Lighting(INT32 light, UINT32 color, UINT32 fadecolor, boolean fogblockpoly, boolean plane); UINT32 HWR_Lighting(INT32 light, UINT32 color, UINT32 fadecolor, boolean fogblockpoly, boolean plane);

View file

@ -110,6 +110,7 @@ static GLint viewport[4];
static GLuint screentexture = 60000; static GLuint screentexture = 60000;
static GLuint startScreenWipe = 60001; static GLuint startScreenWipe = 60001;
static GLuint endScreenWipe = 60002; static GLuint endScreenWipe = 60002;
static GLuint finalScreenTexture = 60003;
#if 0 #if 0
GLuint screentexture = FIRST_TEX_AVAIL; GLuint screentexture = FIRST_TEX_AVAIL;
#endif #endif
@ -269,8 +270,8 @@ FUNCPRINTF void DBG_Printf(const char *lpFmt, ...)
#endif #endif
#ifndef MINI_GL_COMPATIBILITY #ifndef MINI_GL_COMPATIBILITY
/* 1.3 functions for multitexturing */ /* 1.3 functions for multitexturing */
#define pglActiveTexture, glActiveTexture; #define pglActiveTexture glActiveTexture
#define pglMultiTexCoord2f, glMultiTexCoord2f; #define pglMultiTexCoord2f glMultiTexCoord2f
#endif #endif
#else //!STATIC_OPENGL #else //!STATIC_OPENGL
@ -520,13 +521,40 @@ boolean SetupGLfunc(void)
// This has to be done after the context is created so the version number can be obtained // This has to be done after the context is created so the version number can be obtained
boolean SetupGLFunc13(void) boolean SetupGLFunc13(void)
{ {
const GLubyte *version = pglGetString(GL_VERSION);
int glmajor, glminor;
gl13 = false;
#ifdef MINI_GL_COMPATIBILITY #ifdef MINI_GL_COMPATIBILITY
return false; return false;
#else #else
#ifdef STATIC_OPENGL #ifdef STATIC_OPENGL
gl13 = true; gl13 = true;
#else #else
if (isExtAvailable("GL_ARB_multitexture", gl_extensions))
// Parse the GL version
if (version != NULL)
{
if (sscanf(version, "%d.%d", &glmajor, &glminor) == 2)
{
// Look, we gotta prepare for the inevitable arrival of GL 2.0 code...
switch (glmajor)
{
case 1:
if (glminor == 3) gl13 = true;
break;
default:
break;
}
}
}
if (gl13)
{
pglActiveTexture = GetGLFunc("glActiveTexture");
pglMultiTexCoord2f = GetGLFunc("glMultiTexCoord2f");
}
else if (isExtAvailable("GL_ARB_multitexture", gl_extensions))
{ {
// Get the functions // Get the functions
pglActiveTexture = GetGLFunc("glActiveTextureARB"); pglActiveTexture = GetGLFunc("glActiveTextureARB");
@ -2245,6 +2273,7 @@ EXPORT void HWRAPI(DoScreenWipe)(float alpha)
pglActiveTexture(GL_TEXTURE0); pglActiveTexture(GL_TEXTURE0);
pglEnable(GL_TEXTURE_2D); pglEnable(GL_TEXTURE_2D);
pglBindTexture(GL_TEXTURE_2D, endScreenWipe); pglBindTexture(GL_TEXTURE_2D, endScreenWipe);
pglTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
pglActiveTexture(GL_TEXTURE1); pglActiveTexture(GL_TEXTURE1);
pglEnable(GL_TEXTURE_2D); pglEnable(GL_TEXTURE_2D);
@ -2339,4 +2368,81 @@ EXPORT void HWRAPI(MakeScreenTexture) (void)
tex_downloaded = 0; // 0 so it knows it doesn't have any of the cached patches downloaded right now tex_downloaded = 0; // 0 so it knows it doesn't have any of the cached patches downloaded right now
} }
EXPORT void HWRAPI(MakeScreenFinalTexture) (void)
{
INT32 texsize = 2048;
// Use a power of two texture, dammit
if(screen_width <= 512)
texsize = 512;
else if(screen_width <= 1024)
texsize = 1024;
// Create screen texture
pglBindTexture(GL_TEXTURE_2D, finalScreenTexture);
#ifdef KOS_GL_COMPATIBILITY
pglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_FILTER_NONE);
pglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_FILTER_NONE);
#else
pglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
pglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
#endif
Clamp2D(GL_TEXTURE_WRAP_S);
Clamp2D(GL_TEXTURE_WRAP_T);
#ifndef KOS_GL_COMPATIBILITY
pglCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 0, 0, texsize, texsize, 0);
#endif
tex_downloaded = 0; // 0 so it knows it doesn't have any of the cached patches downloaded right now
}
EXPORT void HWRAPI(DrawScreenFinalTexture)(int width, int height)
{
float xfix, yfix;
int lmaxx, lmaxy;
INT32 texsize = 2048;
lmaxx = width < screen_width ? screen_width : width;
lmaxy = height < screen_height ? screen_height : height;
if(screen_width <= 1024)
texsize = 1024;
if(screen_width <= 512)
texsize = 512;
xfix = 1/((float)(texsize)/((float)((screen_width))));
yfix = 1/((float)(texsize)/((float)((screen_height))));
//pglClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
pglViewport(0, 0, width, height);
pglBindTexture(GL_TEXTURE_2D, finalScreenTexture);
pglBegin(GL_QUADS);
pglColor4f(1.0f, 1.0f, 1.0f, 1.0f);
// Bottom left
pglTexCoord2f(0.0f, 0.0f);
pglVertex3f(-1, -1, 1.0f);
// Top left
pglTexCoord2f(0.0f, yfix);
pglVertex3f(-1, 1, 1.0f);
// Top right
pglTexCoord2f(xfix, yfix);
pglVertex3f(1, 1, 1.0f);
// Bottom right
pglTexCoord2f(xfix, 0.0f);
pglVertex3f(1, -1, 1.0f);
pglEnd();
SetModelView(screen_width, screen_height);
SetStates();
tex_downloaded = 0; // 0 so it knows it doesn't have any of the cached patches downloaded right now
}
#endif //HWRENDER #endif //HWRENDER

View file

@ -105,6 +105,8 @@ void *hwSym(const char *funcName,void *handle)
GETFUNC(DoScreenWipe); GETFUNC(DoScreenWipe);
GETFUNC(DrawIntermissionBG); GETFUNC(DrawIntermissionBG);
GETFUNC(MakeScreenTexture); GETFUNC(MakeScreenTexture);
GETFUNC(MakeScreenFinalTexture);
GETFUNC(DrawScreenFinalTexture);
#else //HWRENDER #else //HWRENDER
if (0 == strcmp("FinishUpdate", funcName)) if (0 == strcmp("FinishUpdate", funcName))
return funcPointer; //&FinishUpdate; return funcPointer; //&FinishUpdate;

View file

@ -124,8 +124,8 @@ static SDL_Color localPalette[256];
static SDL_Rect **modeList = NULL; static SDL_Rect **modeList = NULL;
static Uint8 BitsPerPixel = 16; static Uint8 BitsPerPixel = 16;
#endif #endif
static Uint16 realwidth = BASEVIDWIDTH; Uint16 realwidth = BASEVIDWIDTH;
static Uint16 realheight = BASEVIDHEIGHT; Uint16 realheight = BASEVIDHEIGHT;
static const Uint32 surfaceFlagsW = 0/*|SDL_RESIZABLE*/; static const Uint32 surfaceFlagsW = 0/*|SDL_RESIZABLE*/;
static const Uint32 surfaceFlagsF = 0; static const Uint32 surfaceFlagsF = 0;
static SDL_bool mousegrabok = SDL_TRUE; static SDL_bool mousegrabok = SDL_TRUE;
@ -221,26 +221,6 @@ static void SDLSetMode(INT32 width, INT32 height, SDL_bool fullscreen)
if (rendermode == render_opengl) if (rendermode == render_opengl)
{ {
int sdlw, sdlh;
SDL_GetWindowSize(window, &sdlw, &sdlh);
// Logical fullscreen is not implemented yet for OpenGL, so...
// Special case handling
if (glfallbackresolution == SDL_FALSE && fullscreen && width != sdlw && height != sdlh)
{
if (VID_GetModeForSize(sdlw, sdlh) != -1)
{
wasfullscreen = SDL_TRUE;
VID_SetMode(VID_GetModeForSize(sdlw, sdlh));
return;
}
else
{
wasfullscreen = SDL_TRUE;
glfallbackresolution = SDL_TRUE;
VID_SetMode(-1);
return;
}
}
OglSdlSurface(vid.width, vid.height); OglSdlSurface(vid.width, vid.height);
} }
@ -1779,6 +1759,8 @@ void I_StartupGraphics(void)
HWD.pfnDoScreenWipe = hwSym("DoScreenWipe",NULL); HWD.pfnDoScreenWipe = hwSym("DoScreenWipe",NULL);
HWD.pfnDrawIntermissionBG=hwSym("DrawIntermissionBG",NULL); HWD.pfnDrawIntermissionBG=hwSym("DrawIntermissionBG",NULL);
HWD.pfnMakeScreenTexture= hwSym("MakeScreenTexture",NULL); HWD.pfnMakeScreenTexture= hwSym("MakeScreenTexture",NULL);
HWD.pfnMakeScreenFinalTexture=hwSym("MakeScreenFinalTexture",NULL);
HWD.pfnDrawScreenFinalTexture=hwSym("DrawScreenFinalTexture",NULL);
// check gl renderer lib // check gl renderer lib
if (HWD.pfnGetRenderVersion() != VERSION) if (HWD.pfnGetRenderVersion() != VERSION)
I_Error("%s", M_GetText("The version of the renderer doesn't match the version of the executable\nBe sure you have installed SRB2 properly.\n")); I_Error("%s", M_GetText("The version of the renderer doesn't match the version of the executable\nBe sure you have installed SRB2 properly.\n"));

View file

@ -201,13 +201,22 @@ boolean OglSdlSurface(INT32 w, INT32 h)
void OglSdlFinishUpdate(boolean waitvbl) void OglSdlFinishUpdate(boolean waitvbl)
{ {
static boolean oldwaitvbl = false; static boolean oldwaitvbl = false;
int sdlw, sdlh;
if (oldwaitvbl != waitvbl) if (oldwaitvbl != waitvbl)
{ {
SDL_GL_SetSwapInterval(waitvbl ? 1 : 0); SDL_GL_SetSwapInterval(waitvbl ? 1 : 0);
} }
oldwaitvbl = waitvbl; oldwaitvbl = waitvbl;
SDL_GetWindowSize(window, &sdlw, &sdlh);
HWR_MakeScreenFinalTexture();
HWR_DrawScreenFinalTexture(sdlw, sdlh);
SDL_GL_SwapWindow(window); SDL_GL_SwapWindow(window);
SetModelView(realwidth, realheight);
SetStates();
} }
EXPORT void HWRAPI( OglSdlSetPalette) (RGBA_t *palette, RGBA_t *pgamma) EXPORT void HWRAPI( OglSdlSetPalette) (RGBA_t *palette, RGBA_t *pgamma)

View file

@ -27,6 +27,8 @@ void OglSdlFinishUpdate(boolean vidwait);
extern SDL_Window *window; extern SDL_Window *window;
extern SDL_Renderer *renderer; extern SDL_Renderer *renderer;
extern SDL_GLContext sdlglcontext; extern SDL_GLContext sdlglcontext;
extern Uint16 realwidth;
extern Uint16 realheight;
#ifdef _CREATE_DLL_ #ifdef _CREATE_DLL_
EXPORT void HWRAPI( OglSdlSetPalette ) (RGBA_t *palette, RGBA_t *pgamma); EXPORT void HWRAPI( OglSdlSetPalette ) (RGBA_t *palette, RGBA_t *pgamma);