Some testgl work

git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@1812 8ced0084-cf51-0410-be5f-012b33b47a6e
This commit is contained in:
nakeee 2009-01-06 20:54:47 +00:00
parent fa3c6c1247
commit ca3ebe743f
8 changed files with 105 additions and 174 deletions

View File

@ -1,6 +1,7 @@
#ifndef _GLWINDOW_H
#define _GLWINDOW_H
#include <vector>
#include "Common.h"
#include "EventHandler.h"
#include "Globals.h"
@ -21,28 +22,70 @@ enum OGL_Props {
OGL_PROP_COUNT
};
struct res {
u32 x;
u32 y;
};
class GLWindow {
private:
u32 width, height;
int yOffset, xOffset;
float xMax, yMax;
u32 xWin, yWin; // windows size
int xOffset, yOffset; // offset in window
float xMax, yMax; // ???
u32 xRender, yRender; // render area
bool properties[OGL_PROP_COUNT];
protected:
res origRes, currFullRes, currWinRes;
std::vector<res> fullResolutions;
std::vector<res> winResolutions;
virtual void SetRender(u32 x, u32 y) {
xRender = x;
yRender = y;
}
public:
virtual void SwapBuffers() {};
virtual void SetWindowText(const char *text) {};
virtual bool PeekMessages() {return false;};
virtual void Update() {};;
virtual void Update() {};
virtual bool MakeCurrent() {return false;};
bool getProperty(OGL_Props prop) {return properties[prop];}
virtual bool setProperty(OGL_Props prop, bool value)
virtual void updateDim() {
if (GetProperty(OGL_FULLSCREEN))
SetWinSize(currFullRes.x, currFullRes.y);
else
SetWinSize(currWinRes.x, currWinRes.y);
float FactorX = 640.0f / (float)GetXwin();
float FactorY = 480.0f / (float)GetYwin();
float Max = (FactorX < FactorY) ? FactorX : FactorY;
if(GetProperty(OGL_STRETCHTOFIT)) {
SetMax(1.0f / FactorX, 1.0f / FactorY);
SetOffset(0,0);
} else {
SetMax(1.0f / Max, 1.0f / Max);
SetOffset((int)((GetXwin() - (640 * GetXmax())) / 2),
(int)((GetYwin() - (480 * GetYmax())) / 2));
}
}
bool GetProperty(OGL_Props prop) {return properties[prop];}
virtual bool SetProperty(OGL_Props prop, bool value)
{return properties[prop] = value;}
u32 GetWidth() {return width;}
u32 GetHeight() {return height;}
void SetSize(u32 newWidth, u32 newHeight) {
width = newWidth;
height = newHeight;
u32 GetXrender() {return xRender;}
u32 GetYrender() {return yRender;}
u32 GetXwin() {return xWin;}
u32 GetYwin() {return yWin;}
void SetWinSize(u32 x, u32 y) {
xWin = x;
yWin = y;
}
int GetYoff() {return yOffset;}
@ -56,11 +99,28 @@ public:
yMax = y;
xMax = x;
}
float GetXmax() {return xMax;}
float GetYmax() {return yMax;}
static bool valid() { return false; }
// bool GLwindow(SVideoInitialize &_VideoInitialize, int _iwidth, int _iheight) {};
static bool valid() { return false;}
GLWindow() {
// Load defaults
sscanf(g_Config.iFSResolution, "%dx%d",
&currFullRes.x, &currFullRes.y);
sscanf(g_Config.iWindowedRes, "%dx%d",
&currWinRes.x, &currWinRes.y);
SetProperty(OGL_FULLSCREEN, g_Config.bFullscreen);
SetProperty(OGL_STRETCHTOFIT, g_Config.bFullscreen);
SetProperty(OGL_KEEPRATIO, g_Config.bFullscreen);
updateDim();
}
// setResolution
// resolution iter
};

View File

@ -21,21 +21,8 @@ void SDLWindow::Update() {
return;
}
SetSize(surface->w, surface->h);
float FactorW = 640.0f / (float)GetWidth();
float FactorH = 480.0f / (float)GetHeight();
float Max = (FactorW < FactorH) ? FactorH : FactorW;
// AR = (float)surface->w / (float)surface->h;;
if (g_Config.bStretchToFit) {
SetMax(1,1);
SetOffset(0,0);
} else {
SetMax(1.0f / Max, 1.0f / Max);
SetOffset((int)((GetWidth() - (640 * GetXmax())) / 2),
(int)((GetHeight() - (480 * GetYmax())) / 2));
}
// SetSize(surface->w, surface->h);
updateDim();
}
@ -61,7 +48,7 @@ bool SDLWindow::MakeCurrent() {
| ( g_Config.bFullscreen ? SDL_FULLSCREEN : 0);
// Set vide mode.
// TODO: Can we use this field or is a separate field needed?
SDL_Surface *screen = SDL_SetVideoMode(GetWidth(), GetHeight(),
SDL_Surface *screen = SDL_SetVideoMode(GetXwin(), GetYwin(),
0, videoFlags);
if (!screen) {
PanicAlert("Couldn't set video mode");
@ -76,38 +63,7 @@ SDLWindow::~SDLWindow() {
SDL_Quit();
}
SDLWindow::SDLWindow(int _iwidth, int _iheight) {
int _twidth, _theight;
if(g_Config.bFullscreen) {
if(strlen(g_Config.iFSResolution) > 1) {
sscanf(g_Config.iFSResolution, "%dx%d", &_twidth, &_theight);
} else { // No full screen reso set, fall back to default reso
_twidth = _iwidth;
_theight = _iheight;
}
} else { // Going Windowed
if(strlen(g_Config.iWindowedRes) > 1) {
sscanf(g_Config.iWindowedRes, "%dx%d", &_twidth, &_theight);
} else {// No Window reso set, fall back to default
_twidth = _iwidth;
_theight = _iheight;
}
}
SetSize(_iwidth, _theight);
float FactorW = 640.0f / (float)_twidth;
float FactorH = 480.0f / (float)_theight;
float Max = (FactorW < FactorH) ? FactorH : FactorW;
if(g_Config.bStretchToFit) {
SetMax(1.0f / FactorW, 1.0f / FactorH);
SetOffset(0,0);
} else {
SetMax(1.0f / Max, 1.0f / Max);
SetOffset((int)((_twidth - (640 * GetXmax())) / 2),
(int)((_theight - (480 * GetYmax())) / 2));
}
SDLWindow::SDLWindow() : GLWindow() {
//init sdl video
if (SDL_Init(SDL_INIT_VIDEO) < 0) {

View File

@ -16,14 +16,14 @@ public:
static bool valid() { return true; }
~SDLWindow();
SDLWindow(int _iwidth, int _iheight);
SDLWindow();
};
#else
class SDLWindow : public GLWindow
{
public:
SDLWindow(int _iwidth, int _iheight) {}
SDLWindow() {}
};
#endif
#endif

View File

@ -14,19 +14,7 @@ bool WXGLWindow::PeekMessages() {
}
void WXGLWindow::Update() {
float FactorW = 640.0f / (float)GetWidth();
float FactorH = 480.0f / (float)GetHeight();
float Max = (FactorW < FactorH) ? FactorH : FactorW;
//AR = (float)nBackbufferWidth / (float)nBackbufferHeight;
if(g_Config.bStretchToFit) {
SetMax(1,1);
SetOffset(0,0);
} else {
SetMax(1.0f / Max, 1.0f / Max);
SetOffset((int)((GetWidth() - (640 * GetXmax())) / 2),
(int)((GetHeight() - (480 * GetYmax())) / 2));
}
updateDim();
}
bool WXGLWindow::MakeCurrent() {
@ -39,38 +27,9 @@ WXGLWindow::~WXGLWindow() {
delete frame;
}
WXGLWindow::WXGLWindow(int _iwidth, int _iheight) {
int _twidth, _theight;
if(g_Config.bFullscreen) {
if(strlen(g_Config.iFSResolution) > 1) {
sscanf(g_Config.iFSResolution, "%dx%d", &_twidth, &_theight);
} else {// No full screen reso set, fall back to default reso
_twidth = _iwidth;
_theight = _iheight;
}
} else {// Going Windowed
if(strlen(g_Config.iWindowedRes) > 1) {
sscanf(g_Config.iWindowedRes, "%dx%d", &_twidth, &_theight);
} else {// No Window reso set, fall back to default
_twidth = _iwidth;
_theight = _iheight;
}
}
WXGLWindow::WXGLWindow() : GLWindow() {
SetSize(_iwidth, _theight);
float FactorW = 640.0f / (float)_twidth;
float FactorH = 480.0f / (float)_theight;
float Max = (FactorW < FactorH) ? FactorH : FactorW;
if(g_Config.bStretchToFit) {
SetMax(1.0f / FactorW, 1.0f / FactorH);
SetOffset(0,0);
} else {
SetMax(1.0f / Max, 1.0f / Max);
SetOffset((int)((_twidth - (640 * GetXmax())) / 2),
(int)((_theight - (480 * GetYmax())) / 2));
}
updateDim();
int args[] = {WX_GL_RGBA, WX_GL_DOUBLEBUFFER, WX_GL_DEPTH_SIZE, 16, 0};

View File

@ -23,14 +23,14 @@ public:
static bool valid() { return true; }
~WXGLWindow();
WXGLWindow(int _iwidth, int _iheight);
WXGLWindow();
};
#else
class WXGLWindow : public GLWindow
{
public:
WXGLWindow(int _iwidth, int _iheight) {}
WXGLWindow() {}
};
#endif
#endif

View File

@ -1,42 +1,9 @@
#include "X11Window.h"
static EventHandler *eventHandler = EventHandler::GetInstance();
X11Window::X11Window(int _iwidth, int _iheight) {
int _twidth, _theight;
if(g_Config.bFullscreen) {
if(strlen(g_Config.iFSResolution) > 1) {
sscanf(g_Config.iFSResolution, "%dx%d", &_twidth, &_theight);
}
else { // No full screen reso set, fall back to default {
_twidth = _iwidth;
_theight = _iheight;
}
} else {// Going Windowed
if(strlen(g_Config.iWindowedRes) > 1) {
sscanf(g_Config.iWindowedRes, "%dx%d", &_twidth, &_theight);
}
else { // No Window reso set, fall back to default
_twidth = _iwidth;
_theight = _iheight;
}
}
SetSize(_twidth, _theight);
float FactorW = 640.0f / (float)_twidth;
float FactorH = 480.0f / (float)_theight;
float Max = (FactorW < FactorH) ? FactorH : FactorW;
if(g_Config.bStretchToFit) {
SetMax(1.0f / FactorW, 1.0f / FactorH);
SetOffset(0,0);
} else {
SetMax(1.0f / Max, 1.0f / Max);
SetOffset((int)((_twidth - (640 * GetXmax())) / 2),
(int)((_theight - (480 * GetYmax())) / 2));
}
static EventHandler *eventHandler = EventHandler::GetInstance();
X11Window::X11Window() : GLWindow() {
XVisualInfo *vi;
Colormap cmap;
int dpyWidth, dpyHeight;
@ -115,8 +82,8 @@ X11Window::X11Window(int _iwidth, int _iheight) {
deskMode = *modes[0];
/* look for mode with requested resolution */
for (int i = 0; i < modeNum; i++) {
if ((modes[i]->hdisplay == _twidth) &&
(modes[i]->vdisplay == _theight)) {
if ((modes[i]->hdisplay == GetXwin()) &&
(modes[i]->vdisplay == GetYwin())) {
bestMode = i;
}
}
@ -158,8 +125,8 @@ X11Window::X11Window(int _iwidth, int _iheight) {
attr.event_mask = ExposureMask | KeyPressMask | ButtonPressMask |
KeyReleaseMask | ButtonReleaseMask |
StructureNotifyMask | ResizeRedirectMask;
win = XCreateWindow(dpy, RootWindow(dpy, vi->screen), 0, 0, _twidth,
_theight, 0, vi->depth, InputOutput, vi->visual,
win = XCreateWindow(dpy, RootWindow(dpy, vi->screen), 0, 0, GetXwin(),
GetYwin(), 0, vi->depth, InputOutput, vi->visual,
CWBorderPixel | CWColormap | CWEventMask, &attr);
// only set window title and handle wm_delete_events if in windowed mode
wmDelete = XInternAtom(dpy, "WM_DELETE_WINDOW", True);
@ -286,21 +253,7 @@ void X11Window::Update() {
}
eventHandler->Update();
float FactorW = 640.0f / (float)GetWidth();
float FactorH = 480.0f / (float)GetHeight();
float Max = (FactorW < FactorH) ? FactorH : FactorW;
// AR = (float)surface->w / (float)surface->h;;
if (g_Config.bStretchToFit) {
SetMax(1,1);
SetOffset(0,0);
} else {
SetMax(1.0f / Max, 1.0f / Max);
SetOffset((int)((GetWidth() - (640 * GetXmax())) / 2),
(int)((GetHeight() - (480 * GetYmax())) / 2));
}
updateDim();
}
bool X11Window::MakeCurrent() {
@ -313,7 +266,7 @@ bool X11Window::MakeCurrent() {
glXMakeCurrent(dpy, win, ctx);
XGetGeometry(dpy, win, &winDummy, &x, &y,
&w, &h, &borderDummy, &depth);
SetSize(w, h);
ERROR_LOG("GLWin Depth %d", depth);
if (glXIsDirect(dpy, ctx))
ERROR_LOG("you have Direct Rendering!");

View File

@ -33,7 +33,7 @@ public:
static bool valid() { return true; }
~X11Window();
X11Window(int _iwidth, int _iheight);
X11Window();
static sf::Key::Code KeysymToSF(KeySym Sym);
private:
void ProcessEvent(XEvent WinEvent);
@ -43,7 +43,7 @@ private:
class X11Window : public GLWindow
{
public:
X11Window(int _iwidth, int _iheight) {}
X11Window() {}
};
#endif
#endif

View File

@ -56,15 +56,18 @@ bool OpenGL_Create(SVideoInitialize &_VideoInitialize,
g_VideoInitialize.pUpdateFPSDisplay = &UpdateFPSDisplay;
if (strncasecmp(g_Config.iBackend, "sdl", 10) == 0)
glWin = new SDLWindow(width, height);
glWin = new SDLWindow();
else if (strncasecmp(g_Config.iBackend, "x11", 10) == 0)
glWin = new X11Window(width, height);
glWin = new X11Window();
else if (strncasecmp(g_Config.iBackend, "wxgl", 10) == 0)
glWin = new WXGLWindow(width, height);
glWin = new WXGLWindow();
else
PanicAlert("Invalid backend %s", g_Config.iBackend);
return (glWin?true:false);
if (! glWin)
return false;
return true;
}
bool OpenGL_MakeCurrent()
@ -92,15 +95,15 @@ void OpenGL_Shutdown()
}
u32 OpenGL_GetWidth() {
return glWin->GetWidth();
return glWin->GetXwin();
}
u32 OpenGL_GetHeight() {
return glWin->GetHeight();
return glWin->GetYwin();
}
void OpenGL_SetSize(u32 width, u32 height) {
glWin->SetSize(width, height);
glWin->SetWinSize(width, height);
}
int OpenGL_GetXoff() {