Initial Linux OpenGL code and vid mode fix
This commit is contained in:
@@ -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
|
||||
|
||||
; ****************************
|
||||
|
||||
@@ -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];
|
||||
|
||||
Reference in New Issue
Block a user