Fixed sound thread issues in Subversion
Updated SDL port so that it now compiles with fex_mini.cpp Added custom GLSL shader support to Win32 OGL renderer (requires GLEW) Updated code in OpenGL renderer to be more tidy
This commit is contained in:
parent
98079e809a
commit
4fff47a824
4
Makefile
4
Makefile
|
@ -50,9 +50,9 @@ ${MAINDIR}/hq2x${OE} ${MAINDIR}/GBA-thumb${OE} ${MAINDIR}/GBA-arm${OE} ${MAINDIR
|
||||||
${MAINDIR}/Mode1${OE} ${MAINDIR}/Mode2${OE} ${MAINDIR}/Mode3${OE} ${MAINDIR}/Mode4${OE} \
|
${MAINDIR}/Mode1${OE} ${MAINDIR}/Mode2${OE} ${MAINDIR}/Mode3${OE} ${MAINDIR}/Mode4${OE} \
|
||||||
${MAINDIR}/Mode5${OE} ${MAINDIR}/motionblur${OE} ${MAINDIR}/pixel${OE} ${MAINDIR}/portable${OE} \
|
${MAINDIR}/Mode5${OE} ${MAINDIR}/motionblur${OE} ${MAINDIR}/pixel${OE} ${MAINDIR}/portable${OE} \
|
||||||
${MAINDIR}/remote${OE} ${MAINDIR}/RTC${OE} ${MAINDIR}/scanline${OE} ${MAINDIR}/simpleFilter${OE} \
|
${MAINDIR}/remote${OE} ${MAINDIR}/RTC${OE} ${MAINDIR}/scanline${OE} ${MAINDIR}/simpleFilter${OE} \
|
||||||
${MAINDIR}/snd_interp${OE} ${MAINDIR}/Sound${OE} ${MAINDIR}/Sram${OE} ${MAINDIR}/Text${OE} \
|
${MAINDIR}/fex_mini${OE} ${MAINDIR}/Sound${OE} ${MAINDIR}/Sram${OE} ${MAINDIR}/Text${OE} \
|
||||||
${MAINDIR}/unzip${OE} ${MAINDIR}/Util${OE} ${MAINDIR}/exprNode${OE} ${MAINDIR}/getopt${OE} \
|
${MAINDIR}/unzip${OE} ${MAINDIR}/Util${OE} ${MAINDIR}/exprNode${OE} ${MAINDIR}/getopt${OE} \
|
||||||
${MAINDIR}/getopt1${OE} ${MAINDIR}/memgzio${OE} ${MAINDIR}/expr-lex${OE} ${MAINDIR}/expr${OE}
|
${MAINDIR}/getopt1${OE} ${MAINDIR}/memgzio${OE} ${MAINDIR}/expr-lex${OE} ${MAINDIR}/expr${OE} \
|
||||||
|
|
||||||
DMGOBJ=${DMGDIR}/GB${OE} ${DMGDIR}/gbCheats${OE} ${DMGDIR}/gbDis${OE} ${DMGDIR}/gbGfx${OE} \
|
DMGOBJ=${DMGDIR}/GB${OE} ${DMGDIR}/gbCheats${OE} ${DMGDIR}/gbDis${OE} ${DMGDIR}/gbGfx${OE} \
|
||||||
${DMGDIR}/gbGlobals${OE} ${DMGDIR}/gbMemory${OE} ${DMGDIR}/gbPrinter${OE} ${DMGDIR}/gbSGB${OE} \
|
${DMGDIR}/gbGlobals${OE} ${DMGDIR}/gbMemory${OE} ${DMGDIR}/gbPrinter${OE} ${DMGDIR}/gbSGB${OE} \
|
||||||
|
|
|
@ -28,7 +28,7 @@ File_Extractor* fex_open( const char* path, fex_err_t* err_out );
|
||||||
int fex_done( File_Extractor const* );
|
int fex_done( File_Extractor const* );
|
||||||
|
|
||||||
/* Name of current file. */
|
/* Name of current file. */
|
||||||
const char* fex_name( File_Extractor const* );
|
const char* fex_name( File_Extractor* );
|
||||||
|
|
||||||
/* Size of current file. */
|
/* Size of current file. */
|
||||||
long fex_size( File_Extractor const* );
|
long fex_size( File_Extractor const* );
|
||||||
|
|
|
@ -150,7 +150,7 @@ void fex_set_user_cleanup ( File_Extractor* fe, fex_user_cleanup_t func )
|
||||||
|
|
||||||
fex_type_t fex_type ( File_Extractor const* ) { return fex_bin_type; }
|
fex_type_t fex_type ( File_Extractor const* ) { return fex_bin_type; }
|
||||||
int fex_done ( File_Extractor const* fe ) { return fe->done; }
|
int fex_done ( File_Extractor const* fe ) { return fe->done; }
|
||||||
const char* fex_name ( File_Extractor const* fe ) { return fe->name(); }
|
const char* fex_name ( File_Extractor* fe ) { return fe->name(); }
|
||||||
unsigned long fex_dos_date ( File_Extractor const* ) { return 0; }
|
unsigned long fex_dos_date ( File_Extractor const* ) { return 0; }
|
||||||
long fex_size ( File_Extractor const* fe ) { return fe->size; }
|
long fex_size ( File_Extractor const* fe ) { return fe->size; }
|
||||||
long fex_remain ( File_Extractor const* fe ) { return fe->size - FILE_GZ(ftell,gztell)( fe->file ); }
|
long fex_remain ( File_Extractor const* fe ) { return fe->size - FILE_GZ(ftell,gztell)( fe->file ); }
|
||||||
|
|
181
src/sdl/SDL.cpp
181
src/sdl/SDL.cpp
|
@ -285,11 +285,32 @@ char screenMessageBuffer[21];
|
||||||
u32 screenMessageTime = 0;
|
u32 screenMessageTime = 0;
|
||||||
|
|
||||||
// Patch #1382692 by deathpudding.
|
// Patch #1382692 by deathpudding.
|
||||||
SDL_sem *sdlBufferLock = NULL;
|
const int sdlSoundSamples = 2048;
|
||||||
SDL_sem *sdlBufferFull = NULL;
|
const int sdlSoundAlign = 4;
|
||||||
SDL_sem *sdlBufferEmpty = NULL;
|
const int sdlSoundCapacity = sdlSoundSamples * 2;
|
||||||
u8 sdlBuffer[4096];
|
const int sdlSoundTotalLen = sdlSoundCapacity + sdlSoundAlign;
|
||||||
int sdlSoundLen = 0;
|
static u8 sdlSoundBuffer[sdlSoundTotalLen];
|
||||||
|
static int sdlSoundRPos;
|
||||||
|
static int sdlSoundWPos;
|
||||||
|
static SDL_cond *sdlSoundCond;
|
||||||
|
static SDL_mutex *sdlSoundMutex;
|
||||||
|
|
||||||
|
static inline int soundBufferFree()
|
||||||
|
{
|
||||||
|
int ret = sdlSoundRPos - sdlSoundWPos - sdlSoundAlign;
|
||||||
|
if (ret < 0)
|
||||||
|
ret += sdlSoundTotalLen;
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline int soundBufferUsed()
|
||||||
|
{
|
||||||
|
int ret = sdlSoundWPos - sdlSoundRPos;
|
||||||
|
if (ret < 0)
|
||||||
|
ret += sdlSoundTotalLen;
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
char *arg0;
|
char *arg0;
|
||||||
|
|
||||||
|
@ -2078,6 +2099,8 @@ int main(int argc, char **argv)
|
||||||
"FNO:T:Y:G:D:b:c:df:hi:p::s:t:v:1234",
|
"FNO:T:Y:G:D:b:c:df:hi:p::s:t:v:1234",
|
||||||
sdlOptions,
|
sdlOptions,
|
||||||
NULL)) != -1) {
|
NULL)) != -1) {
|
||||||
|
if (optarg)
|
||||||
|
optarg++;
|
||||||
switch(op) {
|
switch(op) {
|
||||||
case 0:
|
case 0:
|
||||||
// long option already processed by getopt_long
|
// long option already processed by getopt_long
|
||||||
|
@ -3139,73 +3162,71 @@ void systemScreenCapture(int a)
|
||||||
systemScreenMessage("Screen capture");
|
systemScreenMessage("Screen capture");
|
||||||
}
|
}
|
||||||
|
|
||||||
void soundCallback(void *,u8 *stream,int len)
|
static void soundCallback(void *,u8 *stream,int len)
|
||||||
{
|
{
|
||||||
if (!emulating)
|
if (len <= 0 || !emulating)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
// Patch #1382692 by deathpudding.
|
SDL_mutexP(sdlSoundMutex);
|
||||||
/* since this is running in a different thread, speedup and
|
const int nAvail = soundBufferUsed();
|
||||||
* throttle can change at any time; save the value so locks
|
if (len > nAvail)
|
||||||
* stay in sync */
|
len = nAvail;
|
||||||
bool lock = (!speedup && !throttle) ? true : false;
|
const int nAvail2 = ((sdlSoundTotalLen - sdlSoundRPos) + sdlSoundTotalLen) % sdlSoundTotalLen;
|
||||||
|
if (len >= nAvail2) {
|
||||||
if (lock)
|
memcpy(stream, &sdlSoundBuffer[sdlSoundRPos], nAvail2);
|
||||||
SDL_SemWait (sdlBufferFull);
|
sdlSoundRPos = 0;
|
||||||
|
stream += nAvail2;
|
||||||
SDL_SemWait (sdlBufferLock);
|
len -= nAvail2;
|
||||||
memcpy (stream, sdlBuffer, len);
|
}
|
||||||
sdlSoundLen = 0;
|
if (len > 0) {
|
||||||
SDL_SemPost (sdlBufferLock);
|
memcpy(stream, &sdlSoundBuffer[sdlSoundRPos], len);
|
||||||
|
sdlSoundRPos = (sdlSoundRPos + len) % sdlSoundTotalLen;
|
||||||
if (lock)
|
stream += len;
|
||||||
SDL_SemPost (sdlBufferEmpty);
|
}
|
||||||
|
SDL_CondSignal(sdlSoundCond);
|
||||||
|
SDL_mutexV(sdlSoundMutex);
|
||||||
}
|
}
|
||||||
|
|
||||||
void systemWriteDataToSoundBuffer()
|
void systemWriteDataToSoundBuffer()
|
||||||
{
|
{
|
||||||
// Patch #1382692 by deathpudding.
|
if (SDL_GetAudioStatus() != SDL_AUDIO_PLAYING)
|
||||||
if (SDL_GetAudioStatus () != SDL_AUDIO_PLAYING)
|
{
|
||||||
SDL_PauseAudio (0);
|
SDL_PauseAudio(0);
|
||||||
|
|
||||||
if ((sdlSoundLen + soundBufferLen) >= 2048*2) {
|
|
||||||
bool lock = (!speedup && !throttle) ? true : false;
|
|
||||||
|
|
||||||
if (lock)
|
|
||||||
SDL_SemWait (sdlBufferEmpty);
|
|
||||||
|
|
||||||
SDL_SemWait (sdlBufferLock);
|
|
||||||
int copied = 2048*2 - sdlSoundLen;
|
|
||||||
memcpy (sdlBuffer + sdlSoundLen, soundFinalWave, copied);
|
|
||||||
sdlSoundLen = 2048*2;
|
|
||||||
SDL_SemPost (sdlBufferLock);
|
|
||||||
|
|
||||||
if (lock) {
|
|
||||||
SDL_SemPost (sdlBufferFull);
|
|
||||||
|
|
||||||
/* wait for buffer to be dumped by soundCallback() */
|
|
||||||
SDL_SemWait (sdlBufferEmpty);
|
|
||||||
SDL_SemPost (sdlBufferEmpty);
|
|
||||||
|
|
||||||
SDL_SemWait (sdlBufferLock);
|
|
||||||
memcpy (sdlBuffer, ((u8 *)soundFinalWave) + copied,
|
|
||||||
soundBufferLen - copied);
|
|
||||||
sdlSoundLen = soundBufferLen - copied;
|
|
||||||
SDL_SemPost (sdlBufferLock);
|
|
||||||
}
|
}
|
||||||
else {
|
int remain = soundBufferLen;
|
||||||
SDL_SemWait (sdlBufferLock);
|
const u8 *wave = reinterpret_cast<const u8 *>(soundFinalWave);
|
||||||
memcpy (sdlBuffer, ((u8 *) soundFinalWave) + copied, soundBufferLen);
|
if (remain <= 0)
|
||||||
SDL_SemPost (sdlBufferLock);
|
return;
|
||||||
|
SDL_mutexP(sdlSoundMutex);
|
||||||
|
int n;
|
||||||
|
while (remain >= (n = soundBufferFree())) {
|
||||||
|
const int nAvail = ((sdlSoundTotalLen - sdlSoundWPos) + sdlSoundTotalLen) % sdlSoundTotalLen;
|
||||||
|
if (n >= nAvail) {
|
||||||
|
memcpy(&sdlSoundBuffer[sdlSoundWPos], wave, nAvail);
|
||||||
|
sdlSoundWPos = 0;
|
||||||
|
wave += nAvail;
|
||||||
|
remain -= nAvail;
|
||||||
|
n -= nAvail;
|
||||||
}
|
}
|
||||||
|
if (!emulating || speedup || throttle) {
|
||||||
|
SDL_mutexV(sdlSoundMutex);
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
else {
|
SDL_CondWait(sdlSoundCond, sdlSoundMutex);
|
||||||
SDL_SemWait (sdlBufferLock);
|
|
||||||
memcpy (sdlBuffer + sdlSoundLen, soundFinalWave, soundBufferLen);
|
|
||||||
sdlSoundLen += soundBufferLen;
|
|
||||||
SDL_SemPost (sdlBufferLock);
|
|
||||||
}
|
}
|
||||||
}
|
const int nAvail = ((sdlSoundTotalLen - sdlSoundWPos) + sdlSoundTotalLen) % sdlSoundTotalLen;
|
||||||
|
if (remain >= nAvail) {
|
||||||
|
memcpy(&sdlSoundBuffer[sdlSoundWPos], wave, nAvail);
|
||||||
|
sdlSoundWPos = 0;
|
||||||
|
wave += nAvail;
|
||||||
|
remain -= nAvail;
|
||||||
|
}
|
||||||
|
if (remain > 0) {
|
||||||
|
memcpy(&sdlSoundBuffer[sdlSoundWPos], wave, remain);
|
||||||
|
sdlSoundWPos = (sdlSoundWPos + remain) % sdlSoundTotalLen;
|
||||||
|
}
|
||||||
|
SDL_mutexV(sdlSoundMutex);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
bool systemSoundInit()
|
bool systemSoundInit()
|
||||||
{
|
{
|
||||||
|
@ -3234,26 +3255,34 @@ bool systemSoundInit()
|
||||||
fprintf(stderr,"Failed to open audio: %s\n", SDL_GetError());
|
fprintf(stderr,"Failed to open audio: %s\n", SDL_GetError());
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
soundBufferTotalLen = soundBufferLen*10;
|
|
||||||
// Patch #1382692 by deathpudding.
|
sdlSoundCond = SDL_CreateCond();
|
||||||
sdlBufferLock = SDL_CreateSemaphore (1);
|
sdlSoundMutex = SDL_CreateMutex();
|
||||||
sdlBufferFull = SDL_CreateSemaphore (0);
|
|
||||||
sdlBufferEmpty = SDL_CreateSemaphore (1);
|
sdlSoundRPos = sdlSoundWPos = 0;
|
||||||
sdlSoundLen = 0;
|
|
||||||
systemSoundOn = true;
|
systemSoundOn = true;
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void systemSoundShutdown()
|
void systemSoundShutdown()
|
||||||
{
|
{
|
||||||
// Patch #1382692 by deathpudding.
|
SDL_mutexP(sdlSoundMutex);
|
||||||
SDL_CloseAudio (); //TODO: fix freeze
|
int iSave = emulating;
|
||||||
SDL_DestroySemaphore (sdlBufferLock);
|
emulating = 0;
|
||||||
SDL_DestroySemaphore (sdlBufferFull);
|
SDL_CondSignal(sdlSoundCond);
|
||||||
SDL_DestroySemaphore (sdlBufferEmpty);
|
SDL_mutexV(sdlSoundMutex);
|
||||||
sdlBufferLock = NULL;
|
|
||||||
sdlBufferFull = NULL;
|
SDL_DestroyCond(sdlSoundCond);
|
||||||
sdlBufferEmpty = NULL;
|
sdlSoundCond = NULL;
|
||||||
|
|
||||||
|
SDL_DestroyMutex(sdlSoundMutex);
|
||||||
|
sdlSoundMutex = NULL;
|
||||||
|
|
||||||
|
SDL_CloseAudio();
|
||||||
|
|
||||||
|
emulating = iSave;
|
||||||
|
systemSoundOn = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
void systemSoundPause()
|
void systemSoundPause()
|
||||||
|
|
|
@ -180,6 +180,8 @@ BEGIN_MESSAGE_MAP(MainWnd, CWnd)
|
||||||
ON_UPDATE_COMMAND_UI(ID_OPTIONS_VIDEO_RENDEROPTIONS_GLQUADS, OnUpdateOptionsVideoRenderoptionsGlquads)
|
ON_UPDATE_COMMAND_UI(ID_OPTIONS_VIDEO_RENDEROPTIONS_GLQUADS, OnUpdateOptionsVideoRenderoptionsGlquads)
|
||||||
ON_COMMAND(ID_OPTIONS_VIDEO_RENDEROPTIONS_GLPOLYGONS, OnOptionsVideoRenderoptionsGlpolygons)
|
ON_COMMAND(ID_OPTIONS_VIDEO_RENDEROPTIONS_GLPOLYGONS, OnOptionsVideoRenderoptionsGlpolygons)
|
||||||
ON_UPDATE_COMMAND_UI(ID_OPTIONS_VIDEO_RENDEROPTIONS_GLPOLYGONS, OnUpdateOptionsVideoRenderoptionsGlpolygons)
|
ON_UPDATE_COMMAND_UI(ID_OPTIONS_VIDEO_RENDEROPTIONS_GLPOLYGONS, OnUpdateOptionsVideoRenderoptionsGlpolygons)
|
||||||
|
ON_COMMAND(ID_OPTIONS_VIDEO_RENDEROPTIONS_GLSLSHADERS, OnOptionsVideoRenderingoptionsGLSLShaders)
|
||||||
|
ON_UPDATE_COMMAND_UI(ID_OPTIONS_VIDEO_RENDEROPTIONS_GLSLSHADERS, OnUpdateOptionsVideoRenderingoptionsGLSLShaders)
|
||||||
|
|
||||||
ON_WM_CONTEXTMENU()
|
ON_WM_CONTEXTMENU()
|
||||||
ON_COMMAND(ID_OPTIONS_EMULATOR_ASSOCIATE, OnOptionsEmulatorAssociate)
|
ON_COMMAND(ID_OPTIONS_EMULATOR_ASSOCIATE, OnOptionsEmulatorAssociate)
|
||||||
|
|
|
@ -200,8 +200,8 @@ class MainWnd : public CWnd
|
||||||
afx_msg void OnUpdateOptionsVideoRenderoptionsGlnearest(CCmdUI* pCmdUI);
|
afx_msg void OnUpdateOptionsVideoRenderoptionsGlnearest(CCmdUI* pCmdUI);
|
||||||
afx_msg void OnOptionsVideoRenderoptionsGlbilinear();
|
afx_msg void OnOptionsVideoRenderoptionsGlbilinear();
|
||||||
afx_msg void OnUpdateOptionsVideoRenderoptionsGlbilinear(CCmdUI* pCmdUI);
|
afx_msg void OnUpdateOptionsVideoRenderoptionsGlbilinear(CCmdUI* pCmdUI);
|
||||||
afx_msg void OnUpdateOptionsVideoRenderoptionsGlanisotropic(CCmdUI* pCmdUI);
|
afx_msg void OnOptionsVideoRenderingoptionsGLSLShaders();
|
||||||
afx_msg void OnOptionsVideoRenderoptionsGlanisotropic();
|
afx_msg void OnUpdateOptionsVideoRenderingoptionsGLSLShaders(CCmdUI* pCmdUI);
|
||||||
|
|
||||||
afx_msg void OnOptionsVideoRenderoptionsGltriangle();
|
afx_msg void OnOptionsVideoRenderoptionsGltriangle();
|
||||||
afx_msg void OnUpdateOptionsVideoRenderoptionsGltriangle(CCmdUI* pCmdUI);
|
afx_msg void OnUpdateOptionsVideoRenderoptionsGltriangle(CCmdUI* pCmdUI);
|
||||||
|
|
|
@ -625,6 +625,19 @@ void MainWnd::OnUpdateOptionsVideoRenderoptionsGlpolygons(CCmdUI* pCmdUI)
|
||||||
pCmdUI->SetCheck(theApp.glType == 2);
|
pCmdUI->SetCheck(theApp.glType == 2);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void MainWnd::OnUpdateOptionsVideoRenderingoptionsGLSLShaders(CCmdUI* pCmdUI)
|
||||||
|
{
|
||||||
|
pCmdUI->SetCheck(theApp.GLSLShaders);
|
||||||
|
}
|
||||||
|
|
||||||
|
void MainWnd::OnOptionsVideoRenderingoptionsGLSLShaders()
|
||||||
|
{
|
||||||
|
theApp.GLSLShaders = !theApp.GLSLShaders;
|
||||||
|
if( theApp.GLSLShaders ) {
|
||||||
|
theApp.display->setOption( _T("GLSLShaders"), theApp.GLSLShaders );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void MainWnd::OnOptionsEmulatorAssociate()
|
void MainWnd::OnOptionsEmulatorAssociate()
|
||||||
{
|
{
|
||||||
theApp.winCheckFullscreen();
|
theApp.winCheckFullscreen();
|
||||||
|
|
|
@ -32,6 +32,8 @@
|
||||||
#include <cmath>
|
#include <cmath>
|
||||||
#include "glFont.h"
|
#include "glFont.h"
|
||||||
|
|
||||||
|
#pragma comment(lib,"glew32.lib")
|
||||||
|
#include <GL/glew.h>
|
||||||
// OpenGL
|
// OpenGL
|
||||||
#include <gl/GL.h> // main include file
|
#include <gl/GL.h> // main include file
|
||||||
#ifdef HAS_GLEXT
|
#ifdef HAS_GLEXT
|
||||||
|
@ -68,6 +70,9 @@ private:
|
||||||
RECT destRect;
|
RECT destRect;
|
||||||
bool failed;
|
bool failed;
|
||||||
GLFONT font;
|
GLFONT font;
|
||||||
|
char *VertexShaderSource,*FragmentShaderSource;
|
||||||
|
int VertexShader,FragmentShader;
|
||||||
|
int ShaderProgram;
|
||||||
|
|
||||||
void initializeMatrices( int w, int h );
|
void initializeMatrices( int w, int h );
|
||||||
bool initializeTexture( int w, int h );
|
bool initializeTexture( int w, int h );
|
||||||
|
@ -75,6 +80,10 @@ private:
|
||||||
void setVSync( int interval = 1 );
|
void setVSync( int interval = 1 );
|
||||||
void calculateDestRect( int w, int h );
|
void calculateDestRect( int w, int h );
|
||||||
void initializeFont();
|
void initializeFont();
|
||||||
|
void InitShader();
|
||||||
|
void DeInitShader();
|
||||||
|
void rasterise();
|
||||||
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
OpenGLDisplay();
|
OpenGLDisplay();
|
||||||
|
@ -93,8 +102,10 @@ public:
|
||||||
virtual int selectFullScreenMode( GUID ** );
|
virtual int selectFullScreenMode( GUID ** );
|
||||||
};
|
};
|
||||||
|
|
||||||
#include "gzglfont.h"
|
|
||||||
|
|
||||||
|
|
||||||
|
#include "gzglfont.h"
|
||||||
|
char *readShaderFile(char *FileName);
|
||||||
void OpenGLDisplay::initializeFont()
|
void OpenGLDisplay::initializeFont()
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
|
@ -126,7 +137,61 @@ void OpenGLDisplay::initializeFont()
|
||||||
(void)inflateEnd(&strm);
|
(void)inflateEnd(&strm);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
char *readShaderFile(char *FileName) {
|
||||||
|
FILE *fp;
|
||||||
|
char *DATA = NULL;
|
||||||
|
|
||||||
|
int flength = 0;
|
||||||
|
|
||||||
|
fp = fopen(FileName,"rt");
|
||||||
|
|
||||||
|
fseek(fp, 0, SEEK_END);
|
||||||
|
flength = ftell(fp);
|
||||||
|
rewind(fp);
|
||||||
|
|
||||||
|
DATA = (char *)malloc(sizeof(char) * (flength+1));
|
||||||
|
flength = fread(DATA, sizeof(char), flength, fp);
|
||||||
|
DATA[flength] = '\0';
|
||||||
|
|
||||||
|
fclose(fp);
|
||||||
|
|
||||||
|
return DATA;
|
||||||
|
}
|
||||||
|
|
||||||
|
void OpenGLDisplay::DeInitShader () {
|
||||||
|
glDetachObjectARB(ShaderProgram,VertexShader);
|
||||||
|
glDetachObjectARB(ShaderProgram,FragmentShader);
|
||||||
|
glDeleteObjectARB(ShaderProgram);
|
||||||
|
}
|
||||||
|
|
||||||
|
void OpenGLDisplay::InitShader () {
|
||||||
|
GLEW_ARB_vertex_shader;
|
||||||
|
GLEW_ARB_fragment_shader;
|
||||||
|
|
||||||
|
VertexShader = glCreateShaderObjectARB(GL_VERTEX_SHADER_ARB);
|
||||||
|
FragmentShader = glCreateShaderObjectARB(GL_FRAGMENT_SHADER_ARB);
|
||||||
|
|
||||||
|
VertexShaderSource = readShaderFile("vertex_shader.vert");
|
||||||
|
FragmentShaderSource = readShaderFile("fragment_shader.frag");
|
||||||
|
|
||||||
|
const char * VS = VertexShaderSource;
|
||||||
|
const char * FS = FragmentShaderSource;
|
||||||
|
|
||||||
|
glShaderSourceARB(VertexShader, 1, &VS,NULL);
|
||||||
|
glShaderSourceARB(FragmentShader, 1, &FS,NULL);
|
||||||
|
|
||||||
|
free(VertexShaderSource);free(FragmentShaderSource);
|
||||||
|
|
||||||
|
glCompileShaderARB(VertexShader);
|
||||||
|
glCompileShaderARB(FragmentShader);
|
||||||
|
|
||||||
|
ShaderProgram = glCreateProgramObjectARB();
|
||||||
|
|
||||||
|
glAttachObjectARB(ShaderProgram,VertexShader);
|
||||||
|
glAttachObjectARB(ShaderProgram,FragmentShader);
|
||||||
|
|
||||||
|
glLinkProgramARB(ShaderProgram);
|
||||||
|
}
|
||||||
|
|
||||||
OpenGLDisplay::OpenGLDisplay()
|
OpenGLDisplay::OpenGLDisplay()
|
||||||
{
|
{
|
||||||
|
@ -143,6 +208,7 @@ OpenGLDisplay::OpenGLDisplay()
|
||||||
|
|
||||||
OpenGLDisplay::~OpenGLDisplay()
|
OpenGLDisplay::~OpenGLDisplay()
|
||||||
{
|
{
|
||||||
|
DeInitShader();
|
||||||
cleanup();
|
cleanup();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -205,7 +271,7 @@ bool OpenGLDisplay::initialize()
|
||||||
glEnable( GL_TEXTURE_2D );
|
glEnable( GL_TEXTURE_2D );
|
||||||
glEnable(GL_BLEND);
|
glEnable(GL_BLEND);
|
||||||
glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
|
glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
|
||||||
|
glewInit();
|
||||||
|
|
||||||
initializeMatrices( theApp.surfaceSizeX, theApp.surfaceSizeY );
|
initializeMatrices( theApp.surfaceSizeX, theApp.surfaceSizeY );
|
||||||
|
|
||||||
|
@ -243,12 +309,8 @@ void OpenGLDisplay::clear()
|
||||||
glClear( GL_COLOR_BUFFER_BIT );
|
glClear( GL_COLOR_BUFFER_BIT );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void OpenGLDisplay::rasterise()
|
||||||
void OpenGLDisplay::render()
|
|
||||||
{
|
{
|
||||||
clear();
|
|
||||||
|
|
||||||
|
|
||||||
int pitch = theApp.filterWidth * (systemColorDepth>>3) + 4;
|
int pitch = theApp.filterWidth * (systemColorDepth>>3) + 4;
|
||||||
u8 *data = pix + ( theApp.sizeX + 1 ) * 4;
|
u8 *data = pix + ( theApp.sizeX + 1 ) * 4;
|
||||||
|
|
||||||
|
@ -273,17 +335,7 @@ void OpenGLDisplay::render()
|
||||||
} else {
|
} else {
|
||||||
glPixelStorei( GL_UNPACK_ROW_LENGTH, theApp.sizeX + 1 );
|
glPixelStorei( GL_UNPACK_ROW_LENGTH, theApp.sizeX + 1 );
|
||||||
}
|
}
|
||||||
|
glTexSubImage2D(GL_TEXTURE_2D,0,0,0,width,height,GL_RGBA,GL_UNSIGNED_BYTE,data );
|
||||||
glTexSubImage2D(
|
|
||||||
GL_TEXTURE_2D,
|
|
||||||
0,
|
|
||||||
0,
|
|
||||||
0,
|
|
||||||
width,
|
|
||||||
height,
|
|
||||||
GL_RGBA,
|
|
||||||
GL_UNSIGNED_BYTE,
|
|
||||||
data );
|
|
||||||
|
|
||||||
if( theApp.glType == 0 ) {
|
if( theApp.glType == 0 ) {
|
||||||
glBegin( GL_TRIANGLE_STRIP );
|
glBegin( GL_TRIANGLE_STRIP );
|
||||||
|
@ -377,8 +429,26 @@ void OpenGLDisplay::render()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void OpenGLDisplay::render()
|
||||||
|
{
|
||||||
|
clear();
|
||||||
|
if (theApp.GLSLShaders){
|
||||||
|
InitShader();
|
||||||
|
glUseProgramObjectARB(ShaderProgram);
|
||||||
|
int texture_location = glGetUniformLocationARB(ShaderProgram, "ShaderTexture");
|
||||||
|
glUniform1iARB(texture_location, 0);
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
glUseProgramObjectARB(NULL);
|
||||||
|
DeInitShader();
|
||||||
|
}
|
||||||
|
rasterise();
|
||||||
|
|
||||||
glFlush();
|
glFlush();
|
||||||
|
|
||||||
|
|
||||||
SwapBuffers( hDC );
|
SwapBuffers( hDC );
|
||||||
// since OpenGL draws on the back buffer,
|
// since OpenGL draws on the back buffer,
|
||||||
// we have to swap it to the front buffer to see it
|
// we have to swap it to the front buffer to see it
|
||||||
|
|
|
@ -288,6 +288,7 @@ VBA::VBA()
|
||||||
ddrawUseVideoMemory = false;
|
ddrawUseVideoMemory = false;
|
||||||
d3dFilter = 0;
|
d3dFilter = 0;
|
||||||
glFilter = 0;
|
glFilter = 0;
|
||||||
|
GLSLShaders = 0;
|
||||||
glType = 0;
|
glType = 0;
|
||||||
skin = NULL;
|
skin = NULL;
|
||||||
skinName = "";
|
skinName = "";
|
||||||
|
@ -1489,6 +1490,10 @@ void VBA::loadSettings()
|
||||||
if(glFilter < 0 || glFilter > 1)
|
if(glFilter < 0 || glFilter > 1)
|
||||||
glFilter = 1;
|
glFilter = 1;
|
||||||
|
|
||||||
|
GLSLShaders = regQueryDwordValue("GLSLShaders", 0);
|
||||||
|
if(GLSLShaders < 0 || GLSLShaders > 1)
|
||||||
|
GLSLShaders = 0;
|
||||||
|
|
||||||
glType = regQueryDwordValue("glType", 0);
|
glType = regQueryDwordValue("glType", 0);
|
||||||
if(glType < 0 || glType > 2)
|
if(glType < 0 || glType > 2)
|
||||||
glType = 0;
|
glType = 0;
|
||||||
|
@ -2571,6 +2576,7 @@ void VBA::saveSettings()
|
||||||
|
|
||||||
regSetDwordValue("d3dFilter", d3dFilter);
|
regSetDwordValue("d3dFilter", d3dFilter);
|
||||||
regSetDwordValue("glFilter", glFilter);
|
regSetDwordValue("glFilter", glFilter);
|
||||||
|
regSetDwordValue("GLSLShaders", GLSLShaders);
|
||||||
regSetDwordValue("glType", glType);
|
regSetDwordValue("glType", glType);
|
||||||
|
|
||||||
regSetDwordValue("filter", filterType);
|
regSetDwordValue("filter", filterType);
|
||||||
|
|
|
@ -163,6 +163,7 @@ class VBA : public CWinApp
|
||||||
bool ddrawUseVideoMemory;
|
bool ddrawUseVideoMemory;
|
||||||
int d3dFilter;
|
int d3dFilter;
|
||||||
int glFilter;
|
int glFilter;
|
||||||
|
int GLSLShaders;
|
||||||
int glType;
|
int glType;
|
||||||
bool dinputKeyFocus;
|
bool dinputKeyFocus;
|
||||||
CSkin *skin;
|
CSkin *skin;
|
||||||
|
|
|
@ -1595,6 +1595,7 @@ BEGIN
|
||||||
MENUITEM " Vertex: Triangle", ID_OPTIONS_VIDEO_RENDEROPTIONS_GLTRIANGLE
|
MENUITEM " Vertex: Triangle", ID_OPTIONS_VIDEO_RENDEROPTIONS_GLTRIANGLE
|
||||||
MENUITEM " Vertex: Quads", ID_OPTIONS_VIDEO_RENDEROPTIONS_GLQUADS
|
MENUITEM " Vertex: Quads", ID_OPTIONS_VIDEO_RENDEROPTIONS_GLQUADS
|
||||||
MENUITEM " Vertex: Polygons", ID_OPTIONS_VIDEO_RENDEROPTIONS_GLPOLYGONS
|
MENUITEM " Vertex: Polygons", ID_OPTIONS_VIDEO_RENDEROPTIONS_GLPOLYGONS
|
||||||
|
MENUITEM " GLSL Shaders", ID_OPTIONS_VIDEO_RENDEROPTIONS_GLSLSHADERS
|
||||||
MENUITEM SEPARATOR
|
MENUITEM SEPARATOR
|
||||||
MENUITEM "&VSync", ID_OPTIONS_VIDEO_VSYNC
|
MENUITEM "&VSync", ID_OPTIONS_VIDEO_VSYNC
|
||||||
MENUITEM "Triple Buffering", ID_OPTIONS_VIDEO_TRIPLEBUFFERING
|
MENUITEM "Triple Buffering", ID_OPTIONS_VIDEO_TRIPLEBUFFERING
|
||||||
|
|
|
@ -813,13 +813,15 @@
|
||||||
#define ID_OUTPUTAPI_SOFTWAREMIXING 40348
|
#define ID_OUTPUTAPI_SOFTWAREMIXING 40348
|
||||||
#define ID_OUTPUTAPI_CONFIGURATION 40349
|
#define ID_OUTPUTAPI_CONFIGURATION 40349
|
||||||
#define ID_OUTPUTAPI_OALCONFIGURATION 40350
|
#define ID_OUTPUTAPI_OALCONFIGURATION 40350
|
||||||
|
#define ID_RENDERAPI_FILTER 40351
|
||||||
|
#define ID_OPTIONS_VIDEO_RENDEROPTIONS_GLSLSHADERS 40352
|
||||||
|
|
||||||
// Next default values for new objects
|
// Next default values for new objects
|
||||||
//
|
//
|
||||||
#ifdef APSTUDIO_INVOKED
|
#ifdef APSTUDIO_INVOKED
|
||||||
#ifndef APSTUDIO_READONLY_SYMBOLS
|
#ifndef APSTUDIO_READONLY_SYMBOLS
|
||||||
#define _APS_NEXT_RESOURCE_VALUE 161
|
#define _APS_NEXT_RESOURCE_VALUE 161
|
||||||
#define _APS_NEXT_COMMAND_VALUE 40351
|
#define _APS_NEXT_COMMAND_VALUE 40353
|
||||||
#define _APS_NEXT_CONTROL_VALUE 1270
|
#define _APS_NEXT_CONTROL_VALUE 1270
|
||||||
#define _APS_NEXT_SYMED_VALUE 103
|
#define _APS_NEXT_SYMED_VALUE 103
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Reference in New Issue