Initial Linux OpenGL code and vid mode fix

This commit is contained in:
hpsolo
2001-05-29 20:49:46 +00:00
parent a4abe44e85
commit e647e6e0d6
3 changed files with 175 additions and 58 deletions

View File

@@ -972,37 +972,46 @@ NEWSYM ClearScreen
SECTION .data
; Total Number of Video Modes
%ifdef __OPENGL__
NEWSYM NumVideoModes, dd 7
%else
NEWSYM NumVideoModes, dd 4
%endif
; GUI Video Mode Names - Make sure that all names are of the same length
; and end with a NULL terminator
NEWSYM GUIVideoModeNames
db '256X224 R WIN ',0 ;2
db '256x224 R FULL',0 ;3
db '512X448 DR WIN ',0 ;5
db '640x480 DR FULL',0 ;6
db '256X224 R WIN ',0 ;0
db '256x224 R FULL',0 ;1
db '512X448 DR WIN ',0 ;2
db '640x480 DR FULL',0 ;3
%ifdef __OPENGL__
db '256x224 OGL WIN ',0 ;4
db '512x448 OGL WIN ',0 ;5
db '640x480 OGL FULL',0 ;6
db '800x600 OGL FULL',0 ;7
%endif
; Video Mode Feature Availability (1 = Available, 0 = Not Available)
; Left side starts with Video Mode 0
NEWSYM GUI16VID, db 1,1,1,1 ; 16-bit mode
NEWSYM GUINGVID, db 0,0,0,0 ; New Graphics Mode Available
NEWSYM GUISLVID, db 0,0,0,0 ; Scanlines
NEWSYM GUIINVID, db 0,0,0,0 ; Interpolation
NEWSYM GUII2VID, db 0,0,1,1 ; Interpolation(w)
NEWSYM GUIEAVID, db 0,0,0,0 ; Eagle
NEWSYM GUIIEVID, db 0,0,0,0 ; (Interp | Eagle)
NEWSYM GUIFSVID, db 0,0,0,0 ; Full Screen
NEWSYM GUISSVID, db 0,0,0,0 ; Small Screen
NEWSYM GUITBVID, db 0,0,0,0 ; Triple Buffering
NEWSYM GUIHSVID, db 0,0,1,1 ; Half/Quarter Scanlines
NEWSYM GUI2xVID, db 0,0,1,1 ; 2xSaI/Super Eagle Engines
NEWSYM GUIM7VID, db 0,0,1,1 ; ?Mode 7 video thing?
NEWSYM GUIWFVID, db 0,1,0,1 ; If Windows Full Screen
NEWSYM GUIDSIZE, db 0,0,1,1
NEWSYM GUIRATIO, db 0,1,0,0
NEWSYM GUIBIFIL, db 0,0,0,0 ; If Video mode supports Bilinear Filtering
NEWSYM GUI16VID, db 1,1,1,1,1,1,1 ; 16-bit mode
NEWSYM GUINGVID, db 0,0,0,0,0,0,0 ; New Graphics Mode Available
NEWSYM GUISLVID, db 0,0,0,0,0,0,0 ; Scanlines
NEWSYM GUIINVID, db 0,0,0,0,0,0,0 ; Interpolation
NEWSYM GUII2VID, db 0,0,1,1,0,0,0 ; Interpolation(w)
NEWSYM GUIEAVID, db 0,0,0,0,0,0,0 ; Eagle
NEWSYM GUIIEVID, db 0,0,0,0,0,0,0 ; (Interp | Eagle)
NEWSYM GUIFSVID, db 0,0,0,0,0,0,0 ; Full Screen
NEWSYM GUISSVID, db 0,0,0,0,0,0,0 ; Small Screen
NEWSYM GUITBVID, db 0,0,0,0,0,0,0 ; Triple Buffering
NEWSYM GUIHSVID, db 0,0,1,1,0,0,0 ; Half/Quarter Scanlines
NEWSYM GUI2xVID, db 0,0,1,1,0,0,0 ; 2xSaI/Super Eagle Engines
NEWSYM GUIM7VID, db 0,0,1,1,0,0,0 ; ?Mode 7 video thing?
NEWSYM GUIWFVID, db 0,1,0,1,0,0,1 ; If Windows Full Screen
NEWSYM GUIDSIZE, db 0,0,1,1,0,0,0
NEWSYM GUIRATIO, db 0,1,0,0,0,0,1
NEWSYM GUIBIFIL, db 0,0,0,0,1,1,1 ; binlinear = 1, nearest = 0
SECTION .text
; ****************************

View File

@@ -4,6 +4,9 @@
#include <sys/types.h>
#include <time.h>
#include "SDL.h"
#ifdef __OPENGL__
#include <GL/gl.h>
#endif
#define BYTE unsigned char
#define WORD unsigned short
@@ -36,7 +39,7 @@ DWORD CurrentJoy=0;
SDL_Joystick *JoystickInput[4];
DWORD BitDepth=0;
DWORD BitDepth=16;
BYTE BackColor=0;
float MouseMinX=0;
@@ -128,6 +131,19 @@ DWORD numlockptr;
void ProcessKeyBuf(int scancode);
void LinuxExit(void);
#ifdef __OPENGL__
int gl_inited = 0;
unsigned short *glvidbuffer = 0;
int glvbtexture[1];
float ratiox = 1.0;
int UseOpenGL = 0;
int glfilters = GL_NEAREST;
extern Uint8 BilinearFilter;
extern Uint8 FilteredGUI;
#endif
extern unsigned char cvidmode;
DWORD vidbuff_w, vidbuff_h;
int Main_Proc(void)
{
int j;
@@ -512,6 +528,12 @@ int startgame(void)
}
flags |= ( FullScreen ? SDL_FULLSCREEN : 0);
#ifdef __OPENGL__
if (UseOpenGL) {
flags |= SDL_OPENGL;
SDL_GL_SetAttribute( SDL_GL_DOUBLEBUFFER, 1 );
}
#endif
surface = SDL_SetVideoMode(WindowWidth, WindowHeight, BitDepth, flags);
if (surface == NULL) {
@@ -520,6 +542,24 @@ int startgame(void)
return FALSE;
}
#ifdef __OPENGL__
if (UseOpenGL) {
if (SurfaceY) glViewport(0,0, SurfaceX, SurfaceY);
else glViewport(0,0, SurfaceX, 1);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glMatrixMode(GL_MODELVIEW);
glFlush();
if (!gl_inited) {
glGenTextures(1,&glvbtexture[0]);
gl_inited = 1;
glvidbuffer = malloc(256*256*2);
}
}
#endif
SurfaceLocking = SDL_MUSTLOCK(surface);
SDL_WarpMouse(SurfaceX/4,SurfaceY/4);
@@ -534,15 +574,23 @@ int startgame(void)
// Check hardware for 565/555
GBitMask = surface->format->Gmask;
if(BitDepth==16 && GBitMask!=0x07E0)
{
converta=1;
// Init_2xSaI(555);
}
else
{
converta=0;
#ifdef __OPENGL__
if (!UseOpenGL) {
#endif
if(BitDepth==16 && GBitMask!=0x07E0)
{
converta=1;
// Init_2xSaI(555);
}
else
{
converta=0;
}
#ifdef __OPENGL__
}
#endif
return TRUE;
}
@@ -558,8 +606,14 @@ DWORD LockSurface(void)
void UnlockSurface(void)
{
if (SurfaceLocking) SDL_UnlockSurface(surface);
SDL_Flip(surface);
SurfBuf = surface->pixels;
#ifdef __OPENGL__
if (!UseOpenGL) {
#endif
SDL_Flip(surface);
SurfBuf = surface->pixels;
#ifdef __OPENGL__
}
#endif
}
void WinUpdateDevices();
@@ -637,7 +691,6 @@ void Stop36HZ(void)
T36HZEnabled=0;
}
extern unsigned char cvidmode;
extern BYTE BlackAndWhite;
extern BYTE V8Mode;
DWORD FirstVid=1;
@@ -667,13 +720,19 @@ void initwinvideo(void)
X=0;
Y=0;
FullScreen=GUIWFVID[cvidmode];
#ifdef __OPENGL__
UseOpenGL = 0;
if (cvidmode > 3) UseOpenGL = 1;
#endif
switch(cvidmode)
{
/* redundant
case 0:
WindowWidth=256;
WindowHeight=224;
break;
*/
case 1:
//WindowWidth=640;
//WindowHeight=480 ;
@@ -682,13 +741,13 @@ void initwinvideo(void)
SurfaceX=320;
SurfaceY=240;
break;
case 2:
case 2: case 5:
WindowWidth=512;
WindowHeight=448;
SurfaceX=512;
SurfaceY=448;
break;
case 3:
case 3: case 6:
WindowWidth=640;
WindowHeight=480;
SurfaceX=640;
@@ -954,9 +1013,21 @@ void clearwin()
Temp1=LockSurface();
if(Temp1==0) { return; }
vidbuff_w = SurfaceX; vidbuff_h = SurfaceY;
SurfBufD=(DWORD) &SurfBuf[0];
SURFDW=(DWORD *) &SurfBuf[0];
#ifdef __OPENGL__
if (!UseOpenGL) {
#endif
SurfBufD=(DWORD) &SurfBuf[0];
SURFDW=(DWORD *) &SurfBuf[0];
#ifdef __OPENGL__
} else {
SurfBufD=(DWORD) &glvidbuffer[0];
SURFDW=(DWORD *) &glvidbuffer[0];
vidbuff_w=256; vidbuff_h=224;
Temp1 = 512; // Temp1 = 2 * SurfaceX
}
#endif
if (SurfBufD == 0) { UnlockSurface(); return; }
@@ -972,14 +1043,14 @@ void clearwin()
movl SurfBufD, %%edi
xorl %%ebx, %%ebx
Blank2:
movl SurfaceX, %%ecx
movl vidbuff_w, %%ecx
rep
stosw
addl Temp1, %%edi
subl SurfaceX, %%edi
subl SurfaceX, %%edi
subl vidbuff_w, %%edi
subl vidbuff_w, %%edi
addl $1, %%ebx
cmpl SurfaceY, %%ebx
cmpl vidbuff_h, %%ebx
jne Blank2
popw %%es
" : : : "cc", "memory", "eax", "ebx", "ecx", "edi");
@@ -993,16 +1064,16 @@ void clearwin()
movl SurfBufD, %%edi
xorl %%ebx, %%ebx
Blank3:
movl SurfaceX, %%ecx
movl vidbuff_w, %%ecx
rep
stosl
addl Temp1, %%edi
subl SurfaceX, %%edi
subl SurfaceX, %%edi
subl SurfaceX, %%edi
subl SurfaceX, %%edi
subl vidbuff_w, %%edi
subl vidbuff_w, %%edi
subl vidbuff_w, %%edi
subl vidbuff_w, %%edi
addl $1, %%ebx
cmpl SurfaceY, %%ebx
cmpl vidbuff_h, %%ebx
jne Blank3
popw %%es
" : : : "cc", "memory", "eax", "ebx", "ecx","edi");
@@ -1023,8 +1094,8 @@ void LinuxExit (void)
void drawscreenwin(void)
{
DWORD i,j,color32;
DWORD *SURFDW;
DWORD i,j,color32;
DWORD *SURFDW;
NGNoTransp = 0; // Set this value to 1 within the appropriate
// video mode if you want to add a custom
@@ -1036,6 +1107,35 @@ void drawscreenwin(void)
UpdateVFrame();
if(curblank!=0) return;
#ifdef __OPENGL__
if (UseOpenGL) {
for (j = 0; j<224; j++) {
memcpy(glvidbuffer + 256*j, (short *) (vidbuffer) + 16 + 288 + (256+32)*j, 256*2);
}
if (BilinearFilter && FilteredGUI) glfilters = GL_LINEAR; else glfilters = GL_NEAREST;
if (FullScreen && cvidmode != 7) ratiox = 0.875; else ratiox = 1.0;
glClear(GL_COLOR_BUFFER_BIT);
glLoadIdentity();
glEnable(GL_TEXTURE_2D);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,glfilters);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,glfilters);
glBindTexture(GL_TEXTURE_2D, *glvbtexture);
glColor3f(1.0f,1.0f,1.0f);
glTexImage2D(GL_TEXTURE_2D, 0, 3, 256, 256, 0, GL_RGB, GL_UNSIGNED_SHORT_5_6_5, glvidbuffer);
glBegin(GL_QUADS);
glTexCoord2f(0.0f, 0.0f); glVertex3f(-ratiox, 1.0f, -1.0f);
glTexCoord2f(1.0f, 0.0f); glVertex3f( ratiox, 1.0f, -1.0f);
glTexCoord2f(1.0f, 2.240/2.560); glVertex3f( ratiox, -1.0f, -1.0f);
glTexCoord2f(0.0f, 2.240/2.560); glVertex3f(-ratiox, -1.0f, -1.0f);
glEnd();
SDL_GL_SwapBuffers();
} else {
#endif
Temp1=LockSurface();
if(Temp1==0) { return; }
@@ -1486,6 +1586,9 @@ void drawscreenwin(void)
}
UnlockSurface();
#ifdef __OPENGL__
}
#endif
}
extern char fulladdtab[65536*2];