Updated Direct3D to Spacy's 1.8 beta build

Added new code to disable backbuffer locking to enable proper Vsync
Enabled triple buffering for Direct3D
Removed some unneeded binary VS.NET files
This commit is contained in:
DJRobX 2007-11-01 10:28:09 +00:00
parent cb3bac591d
commit 5659db8a9a
9 changed files with 1429 additions and 1336 deletions

BIN
VBA.suo

Binary file not shown.

View File

@ -1642,6 +1642,10 @@
> >
</File> </File>
</Filter> </Filter>
<File
RelativePath=".\res\VBA.manifest"
>
</File>
</Files> </Files>
<Globals> <Globals>
<Global <Global

Binary file not shown.

View File

@ -71,8 +71,8 @@ END
// Dialog // Dialog
// //
IDD_LINKTAB DIALOG DISCARDABLE 0, 0, 225, 162 IDD_LINKTAB DIALOG 0, 0, 225, 162
STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU STYLE DS_SETFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "Link Options" CAPTION "Link Options"
FONT 8, "MS Sans Serif" FONT 8, "MS Sans Serif"
BEGIN BEGIN
@ -81,72 +81,59 @@ BEGIN
PUSHBUTTON "Cancel",ID_CANCEL,114,140,57,15 PUSHBUTTON "Cancel",ID_CANCEL,114,140,57,15
END END
IDD_LINKTAB1 DIALOG DISCARDABLE 0, 0, 210, 130 IDD_LINKTAB1 DIALOG 0, 0, 210, 130
STYLE WS_CHILD | WS_VISIBLE STYLE DS_SETFONT | WS_CHILD | WS_VISIBLE
FONT 8, "MS Sans Serif" FONT 8, "MS Sans Serif"
BEGIN BEGIN
LTEXT "Link timeout (in milliseconds)",IDC_STATIC,17,12,92,16 LTEXT "Link timeout (in milliseconds)",IDC_STATIC,17,12,92,16
EDITTEXT IDC_LINKTIMEOUT,116,10,53,14,ES_AUTOHSCROLL | ES_NUMBER EDITTEXT IDC_LINKTIMEOUT,116,10,53,14,ES_AUTOHSCROLL | ES_NUMBER
CONTROL "Single Computer",IDC_LINK_SINGLE,"Button", CONTROL "Single Computer",IDC_LINK_SINGLE,"Button",BS_AUTORADIOBUTTON,17,27,71,16
BS_AUTORADIOBUTTON,17,27,71,16 CONTROL "Network",IDC_LINK_LAN,"Button",BS_AUTORADIOBUTTON,17,43,70,16
CONTROL "Network",IDC_LINK_LAN,"Button",BS_AUTORADIOBUTTON,17,43,
70,16
END END
IDD_LINKTAB2 DIALOG DISCARDABLE 0, 0, 210, 113 IDD_LINKTAB2 DIALOG 0, 0, 210, 113
STYLE WS_CHILD STYLE DS_SETFONT | WS_CHILD
FONT 8, "MS Sans Serif" FONT 8, "MS Sans Serif"
BEGIN BEGIN
CONTROL "2",IDC_LINK2P,"Button",BS_AUTORADIOBUTTON | WS_GROUP,46, CONTROL "2",IDC_LINK2P,"Button",BS_AUTORADIOBUTTON | WS_GROUP,46,16,21,13
16,21,13
CONTROL "3",IDC_LINK3P,"Button",BS_AUTORADIOBUTTON,94,16,21,13 CONTROL "3",IDC_LINK3P,"Button",BS_AUTORADIOBUTTON,94,16,21,13
CONTROL "4",IDC_LINK4P,"Button",BS_AUTORADIOBUTTON,142,16,21,13 CONTROL "4",IDC_LINK4P,"Button",BS_AUTORADIOBUTTON,142,16,21,13
CONTROL "TCP/IP",IDC_LINKTCP,"Button",BS_AUTORADIOBUTTON | CONTROL "TCP/IP",IDC_LINKTCP,"Button",BS_AUTORADIOBUTTON | WS_GROUP,54,47,42,14
WS_GROUP,54,47,42,14 CONTROL "UDP",IDC_LINKUDP,"Button",BS_AUTORADIOBUTTON | WS_DISABLED,121,47,33,14
CONTROL "UDP",IDC_LINKUDP,"Button",BS_AUTORADIOBUTTON |
WS_DISABLED,121,47,33,14
PUSHBUTTON "Start!",IDC_SERVERSTART,79,89,50,17 PUSHBUTTON "Start!",IDC_SERVERSTART,79,89,50,17
LTEXT "Select number of players:",IDC_STATIC,60,7,89,10 LTEXT "Select number of players:",IDC_STATIC,60,7,89,10
LTEXT "Select protocol:",IDC_STATIC,78,33,53,11 LTEXT "Select protocol:",IDC_STATIC,78,33,53,11
CONTROL "Speed hacks",IDC_SSPEED,"Button",BS_AUTOCHECKBOX | CONTROL "Speed hacks",IDC_SSPEED,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,76,70,57,12
WS_TABSTOP,76,70,57,12
END END
IDD_LINKTAB3 DIALOG DISCARDABLE 0, 0, 210, 108 IDD_LINKTAB3 DIALOG 0, 0, 210, 108
STYLE WS_CHILD STYLE DS_SETFONT | WS_CHILD
FONT 8, "MS Sans Serif" FONT 8, "MS Sans Serif"
BEGIN BEGIN
CONTROL "TCP/IP",IDC_CLINKTCP,"Button",BS_AUTORADIOBUTTON | CONTROL "TCP/IP",IDC_CLINKTCP,"Button",BS_AUTORADIOBUTTON | WS_GROUP,58,20,39,12
WS_GROUP,58,20,39,12 CONTROL "UDP",IDC_CLINKUDP,"Button",BS_AUTORADIOBUTTON | WS_DISABLED,118,20,32,12
CONTROL "UDP",IDC_CLINKUDP,"Button",BS_AUTORADIOBUTTON |
WS_DISABLED,118,20,32,12
EDITTEXT IDC_SERVERIP,84,39,79,12,ES_AUTOHSCROLL | WS_GROUP EDITTEXT IDC_SERVERIP,84,39,79,12,ES_AUTOHSCROLL | WS_GROUP
PUSHBUTTON "Connect",IDC_LINKCONNECT,75,81,59,16 PUSHBUTTON "Connect",IDC_LINKCONNECT,75,81,59,16
LTEXT "Select protocol:",IDC_STATIC,78,7,53,9 LTEXT "Select protocol:",IDC_STATIC,78,7,53,9
LTEXT "Server IP address or hostname:",IDC_STATIC,7,37,62,18 LTEXT "Server IP address or hostname:",IDC_STATIC,7,37,62,18
LTEXT "Speed hacks:",IDC_STATIC,7,64,47,10 LTEXT "Speed hacks:",IDC_STATIC,7,64,47,10
CONTROL "Off (accurate)",IDC_SPEEDOFF,"Button", CONTROL "Off (accurate)",IDC_SPEEDOFF,"Button",BS_AUTORADIOBUTTON | WS_GROUP,60,63,57,12
BS_AUTORADIOBUTTON | WS_GROUP,60,63,57,12 CONTROL "On (fast)",IDC_SPEEDON,"Button",BS_AUTORADIOBUTTON,128,63,48,12
CONTROL "On (fast)",IDC_SPEEDON,"Button",BS_AUTORADIOBUTTON,128,
63,48,12
END END
IDD_SERVERWAIT DIALOG DISCARDABLE 0, 0, 186, 90 IDD_SERVERWAIT DIALOG 0, 0, 186, 90
STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU STYLE DS_SETFONT | DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
CAPTION "Waiting for players" CAPTION "Waiting for players"
FONT 8, "MS Sans Serif" FONT 8, "MS Sans Serif"
BEGIN BEGIN
PUSHBUTTON "Cancel",IDCANCEL,63,69,50,14 PUSHBUTTON "Cancel",IDCANCEL,63,69,50,14
CONTROL "Progress1",IDC_SERVERWAIT,"msctls_progress32",WS_BORDER, CONTROL "Progress1",IDC_SERVERWAIT,"msctls_progress32",WS_BORDER,33,50,120,13
33,50,120,13
LTEXT "",IDC_STATIC1,7,7,154,8 LTEXT "",IDC_STATIC1,7,7,154,8
LTEXT "",IDC_STATIC2,7,17,105,8 LTEXT "",IDC_STATIC2,7,17,105,8
LTEXT "",IDC_STATIC3,7,25,105,8 LTEXT "",IDC_STATIC3,7,25,105,8
LTEXT "",IDC_STATIC4,7,33,105,8 LTEXT "",IDC_STATIC4,7,33,105,8
END END
IDD_OPENDLG DIALOG 36, 24, 202, 117 IDD_OPENDLG DIALOG 36, 24, 202, 117
STYLE DS_SETFONT | DS_MODALFRAME | DS_3DLOOK | DS_CONTEXTHELP | WS_POPUP | WS_CAPTION | WS_SYSMENU STYLE DS_SETFONT | DS_MODALFRAME | DS_3DLOOK | DS_CONTEXTHELP | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "Open" CAPTION "Open"
@ -1563,7 +1550,6 @@ BEGIN
MENUITEM "Direct&Draw", ID_OPTIONS_VIDEO_RENDERMETHOD_DIRECTDRAW MENUITEM "Direct&Draw", ID_OPTIONS_VIDEO_RENDERMETHOD_DIRECTDRAW
MENUITEM " Emulation only", ID_OPTIONS_VIDEO_DDRAWEMULATIONONLY MENUITEM " Emulation only", ID_OPTIONS_VIDEO_DDRAWEMULATIONONLY
MENUITEM " Use &Video Memory", ID_OPTIONS_VIDEO_DDRAWUSEVIDEOMEMORY MENUITEM " Use &Video Memory", ID_OPTIONS_VIDEO_DDRAWUSEVIDEOMEMORY
MENUITEM " Triple Buffering", ID_OPTIONS_VIDEO_TRIPLEBUFFERING
MENUITEM SEPARATOR MENUITEM SEPARATOR
MENUITEM "Direct&3D", ID_OPTIONS_VIDEO_RENDERMETHOD_DIRECT3D MENUITEM "Direct&3D", ID_OPTIONS_VIDEO_RENDERMETHOD_DIRECT3D
MENUITEM " Filter: Nearest", ID_OPTIONS_VIDEO_RENDEROPTIONS_D3DNOFILTER MENUITEM " Filter: Nearest", ID_OPTIONS_VIDEO_RENDEROPTIONS_D3DNOFILTER
@ -1576,6 +1562,7 @@ BEGIN
MENUITEM " Vertex: Quads", ID_OPTIONS_VIDEO_RENDEROPTIONS_GLQUADS MENUITEM " Vertex: Quads", ID_OPTIONS_VIDEO_RENDEROPTIONS_GLQUADS
MENUITEM SEPARATOR MENUITEM SEPARATOR
MENUITEM "&VSync", ID_OPTIONS_VIDEO_VSYNC MENUITEM "&VSync", ID_OPTIONS_VIDEO_VSYNC
MENUITEM "Triple Buffering", ID_OPTIONS_VIDEO_TRIPLEBUFFERING
END END
MENUITEM SEPARATOR MENUITEM SEPARATOR
POPUP "Windowed" POPUP "Windowed"
@ -1821,7 +1808,6 @@ BEGIN
POPUP "Li&nk" POPUP "Li&nk"
BEGIN BEGIN
MENUITEM "&Wireless Adapter", ID_OPTIONS_LINK_WIRELESSADAPTER MENUITEM "&Wireless Adapter", ID_OPTIONS_LINK_WIRELESSADAPTER
MENUITEM "&Log", ID_OPTIONS_LINK_LOG MENUITEM "&Log", ID_OPTIONS_LINK_LOG
MENUITEM "&Options...", ID_OPTIONS_LINK_OPTIONS MENUITEM "&Options...", ID_OPTIONS_LINK_OPTIONS
END END
@ -1960,13 +1946,6 @@ BEGIN
END END
/////////////////////////////////////////////////////////////////////////////
//
// RT_MANIFEST
//
1 RT_MANIFEST "VBA.manifest"
///////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////
// //
// Version // Version

View File

@ -17,20 +17,27 @@
// Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#include "stdafx.h" #include "stdafx.h"
#include <d3d9.h> #include <memory.h>
#include <d3dx9.h> #include "VBA.H"
#include "vba.h"
#include "MainWnd.h" #include "MainWnd.h"
#include "UniVideoModeDlg.h" #include "UniVideoModeDlg.h"
#include "../Util.h" #include "../Util.h"
#include "../Globals.h" #include "../Globals.h"
#include "../Util.h" #include "../Util.h"
#include "../gb/gbGlobals.h" #include "../gb/gbGlobals.h"
// Link with Direct3D9
#pragma comment(lib, "D3d9.lib")
#pragma comment(lib, "D3dx9.lib")
#define DIRECT3D_VERSION 0x0900
#include <D3d9.h>
#include <D3dx9core.h>
#include "../gbafilter.h" #include "../gbafilter.h"
#ifdef _DEBUG #ifdef _DEBUG
#define new DEBUG_NEW #define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif #endif
#ifdef MMX #ifdef MMX
@ -43,72 +50,32 @@ extern void winlog(const char *,...);
extern int systemSpeed; extern int systemSpeed;
// Textured Vertex // Vertex format declarations
typedef struct _D3DTLVERTEX { const DWORD D3DFVF_TEXTBOXVERTEX = D3DFVF_XYZRHW | D3DFVF_DIFFUSE;
float sx; /* Screen coordinates */ struct TEXTBOXVERTEX {
float sy;
float sz;
float rhw; /* Reciprocal of homogeneous w */
D3DCOLOR color; /* Vertex color */
float tu; /* Texture coordinates */
float tv;
_D3DTLVERTEX() { }
_D3DTLVERTEX(
const D3DVECTOR& v,
float _rhw,
D3DCOLOR _color,
float _tu, float _tv)
{ sx = v.x; sy = v.y; sz = v.z;
rhw = _rhw;
color = _color;
tu = _tu; tv = _tv; }
} D3DTLVERTEX, *LPD3DTLVERTEX;
#define D3DFVF_TLVERTEX D3DFVF_XYZRHW|D3DFVF_DIFFUSE|D3DFVF_TEX1
// Simple Vertex
struct D3DVERTEX_SIMPLE
{
FLOAT x, y, z, rhw; FLOAT x, y, z, rhw;
D3DCOLOR color; D3DCOLOR color;
}; };
#define D3DFVF_SIMPLE D3DFVF_XYZRHW | D3DFVF_DIFFUSE const DWORD D3DFVF_IMAGEVERTEX = D3DFVF_XYZ | D3DFVF_DIFFUSE | D3DFVF_TEX1;
struct IMAGEVERTEX {
FLOAT x, y, z;
D3DCOLOR color;
FLOAT u, v;
};
class Direct3DDisplay : public IDisplay class Direct3DDisplay : public IDisplay
{ {
private: public: // Class
HINSTANCE d3dDLL;
LPDIRECT3D9 pD3D;
LPDIRECT3DDEVICE9 pDevice;
LPDIRECT3DTEXTURE9 pTexture;
D3DPRESENT_PARAMETERS dpp;
D3DFORMAT screenFormat;
int width, height; // Size of the source image to display
bool filterDisabled;
ID3DXFont *pFont;
bool failed;
D3DTLVERTEX verts[4]; // The coordinates for our texture
D3DVERTEX_SIMPLE msgBox[4];
int textureWidth; // Size of the texture,
int textureHeight; // where the source image is copied to
int SelectedFreq, SelectedAdapter;
bool fullscreen;
void restoreDeviceObjects();
void invalidateDeviceObjects();
bool initializeOffscreen(unsigned int w, unsigned int h);
void updateFiltering(int);
void updateVSync(void);
public:
Direct3DDisplay(); Direct3DDisplay();
virtual ~Direct3DDisplay(); virtual ~Direct3DDisplay();
public: // Interface
virtual bool initialize(); virtual bool initialize();
virtual void cleanup(); virtual void cleanup();
virtual void render(); virtual void render();
virtual void checkFullScreen();
virtual void renderMenu(); virtual void renderMenu();
virtual void clear(); virtual void clear();
virtual bool changeRenderSize(int w, int h); virtual bool changeRenderSize(int w, int h);
@ -117,20 +84,55 @@ public:
virtual void setOption(const char *, int); virtual void setOption(const char *, int);
virtual int selectFullScreenMode(GUID **); virtual int selectFullScreenMode(GUID **);
virtual int selectFullScreenMode2(); virtual int selectFullScreenMode2();
private: // Functions
void restoreDeviceObjects(void);
void invalidateDeviceObjects();
void setPresentationType();
bool initializeOffscreen(unsigned int w, unsigned int h);
void updateFiltering(int);
bool resetDevice();
void initializeMatrices();
private: // Variables
int SelectedFreq, SelectedAdapter;
bool initSucessful;
bool doNotRender;
bool filterDisabled;
bool lockableBuffer;
LPDIRECT3D9 pD3D;
LPDIRECT3DDEVICE9 pDevice;
LPDIRECT3DTEXTURE9 pTexture;
LPD3DXFONT pFont;
D3DPRESENT_PARAMETERS dpp;
D3DFORMAT screenFormat;
D3DDISPLAYMODE mode;
bool fullscreen;
int width, height; // Size of the source image to display
IMAGEVERTEX verts[4]; // The coordinates for our image texture
TEXTBOXVERTEX msgBox[4];
int textureWidth; // Size of the texture,
int textureHeight; // where the source image is copied to
bool keepAspectRatio;
}; };
Direct3DDisplay::Direct3DDisplay() Direct3DDisplay::Direct3DDisplay()
{ {
d3dDLL = NULL; initSucessful = false;
doNotRender = true;
pD3D = NULL; pD3D = NULL;
pDevice = NULL; pDevice = NULL;
pTexture = NULL; pTexture = NULL;
pFont = NULL; pFont = NULL;
screenFormat = D3DFMT_R5G6B5; screenFormat = D3DFMT_UNKNOWN;
width = 0; width = 0;
height = 0; height = 0;
filterDisabled = false; filterDisabled = false;
failed = false; keepAspectRatio = true; // theApp.d3dKeepAspectRatio;
lockableBuffer = false;
} }
Direct3DDisplay::~Direct3DDisplay() Direct3DDisplay::~Direct3DDisplay()
@ -138,8 +140,33 @@ Direct3DDisplay::~Direct3DDisplay()
cleanup(); cleanup();
} }
void Direct3DDisplay::cleanup() void Direct3DDisplay::setPresentationType()
{ {
// Change display mode
memset(&dpp, 0, sizeof(dpp));
dpp.Windowed = !fullscreen;
if (fullscreen)
dpp.BackBufferFormat =
(theApp.fsColorDepth == 32) ? D3DFMT_X8R8G8B8 : D3DFMT_R5G6B5;
else
dpp.BackBufferFormat = mode.Format;
dpp.BackBufferCount = 3;
dpp.MultiSampleType = D3DMULTISAMPLE_NONE;
dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
dpp.BackBufferWidth = fullscreen ? theApp.fsWidth : theApp.surfaceSizeX;
dpp.BackBufferHeight = fullscreen ? theApp.fsHeight : theApp.surfaceSizeY;
dpp.hDeviceWindow = theApp.m_pMainWnd->GetSafeHwnd();
dpp.FullScreen_RefreshRateInHz = fullscreen ? theApp.fsFrequency : 0;
// dpp.Flags = D3DPRESENTFLAG_LOCKABLE_BACKBUFFER;
dpp.Flags = theApp.menuToggle ? D3DPRESENTFLAG_LOCKABLE_BACKBUFFER : 0;
if (theApp.vsync)
dpp.PresentationInterval = D3DPRESENT_INTERVAL_ONE; // VSync
else
dpp.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE; // No Sync
}
void Direct3DDisplay::cleanup()
{ // interface funtion
if(pD3D != NULL) { if(pD3D != NULL) {
if(pFont) { if(pFont) {
pFont->Release(); pFont->Release();
@ -159,16 +186,17 @@ void Direct3DDisplay::cleanup()
pD3D->Release(); pD3D->Release();
pD3D = NULL; pD3D = NULL;
}
if(d3dDLL != NULL) { initSucessful = false;
FreeLibrary(d3dDLL); doNotRender = true;
d3dDLL = NULL;
}
}
} }
bool Direct3DDisplay::initialize() bool Direct3DDisplay::initialize()
{ { // interface function
initSucessful = false;
doNotRender = true;
// Get emulated image's dimensions // Get emulated image's dimensions
switch(theApp.cartridgeType) switch(theApp.cartridgeType)
{ {
@ -302,28 +330,8 @@ bool Direct3DDisplay::initialize()
theApp.adjustDestRect(); theApp.adjustDestRect();
// Load DirectX DLL // Create an IDirect3D9 object
d3dDLL = LoadLibrary("D3D9.DLL"); pD3D = Direct3DCreate9(D3D_SDK_VERSION);
LPDIRECT3D9 (WINAPI *D3DCreate)(UINT);
if(d3dDLL != NULL)
{
D3DCreate = (LPDIRECT3D9 (WINAPI *)(UINT))
GetProcAddress(d3dDLL, "Direct3DCreate9");
if(D3DCreate == NULL)
{
theApp.directXMessage("Direct3DCreate9");
return FALSE;
}
}
else
{
theApp.directXMessage("D3D9.DLL");
return FALSE;
}
pD3D = D3DCreate(D3D_SDK_VERSION);
if(pD3D == NULL) if(pD3D == NULL)
{ {
winlog("Error creating Direct3D object\n"); winlog("Error creating Direct3D object\n");
@ -334,7 +342,6 @@ bool Direct3DDisplay::initialize()
// Display resolution // Display resolution
D3DDISPLAYMODE mode;
pD3D->GetAdapterDisplayMode(D3DADAPTER_DEFAULT, &mode); pD3D->GetAdapterDisplayMode(D3DADAPTER_DEFAULT, &mode);
switch(mode.Format) { switch(mode.Format) {
@ -343,6 +350,7 @@ bool Direct3DDisplay::initialize()
systemRedShift = 19; systemRedShift = 19;
systemGreenShift = 11; systemGreenShift = 11;
systemBlueShift = 3; systemBlueShift = 3;
Init_2xSaI(32);
break; break;
case D3DFMT_X8R8G8B8: case D3DFMT_X8R8G8B8:
systemColorDepth = 32; systemColorDepth = 32;
@ -371,7 +379,7 @@ bool Direct3DDisplay::initialize()
} }
theApp.fsColorDepth = systemColorDepth; theApp.fsColorDepth = systemColorDepth;
// Check the available fullscreen modes and enable menu items // Check the available pre-defined fullscreen modes and enable menu items
unsigned int nModes, i; unsigned int nModes, i;
D3DDISPLAYMODE dm; D3DDISPLAYMODE dm;
@ -381,10 +389,10 @@ bool Direct3DDisplay::initialize()
theApp.mode1024Available = false; theApp.mode1024Available = false;
theApp.mode1280Available = false; theApp.mode1280Available = false;
nModes = pD3D->GetAdapterModeCount(theApp.fsAdapter, D3DFMT_R5G6B5); nModes = pD3D->GetAdapterModeCount(theApp.fsAdapter, mode.Format);
for (i = 0; i<nModes; i++) for (i = 0; i<nModes; i++)
{ {
if (D3D_OK == pD3D->EnumAdapterModes(theApp.fsAdapter, D3DFMT_R5G6B5, i, &dm) ) if (D3D_OK == pD3D->EnumAdapterModes(theApp.fsAdapter, mode.Format, i, &dm) )
{ {
if ( (dm.Width == 320) && (dm.Height == 240) ) if ( (dm.Width == 320) && (dm.Height == 240) )
theApp.mode320Available = true; theApp.mode320Available = true;
@ -396,7 +404,6 @@ bool Direct3DDisplay::initialize()
theApp.mode1024Available = true; theApp.mode1024Available = true;
if ( (dm.Width == 1280) && (dm.Height == 1024) ) if ( (dm.Width == 1280) && (dm.Height == 1024) )
theApp.mode1280Available = true; theApp.mode1280Available = true;
} }
} }
@ -410,43 +417,56 @@ bool Direct3DDisplay::initialize()
screenFormat = mode.Format; screenFormat = mode.Format;
// Change display mode setPresentationType();
ZeroMemory(&dpp, sizeof(dpp));
dpp.Windowed = !fullscreen;
if (fullscreen)
dpp.BackBufferFormat =
(theApp.fsColorDepth == 32) ? D3DFMT_X8R8G8B8 : D3DFMT_R5G6B5;
else
dpp.BackBufferFormat = mode.Format;
dpp.BackBufferCount = 1;
dpp.MultiSampleType = D3DMULTISAMPLE_NONE;
dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
dpp.BackBufferWidth = fullscreen ? theApp.fsWidth : theApp.surfaceSizeX;
dpp.BackBufferHeight = fullscreen ? theApp.fsHeight : theApp.surfaceSizeY;
dpp.hDeviceWindow = pWnd->GetSafeHwnd();
dpp.FullScreen_RefreshRateInHz = fullscreen ? theApp.fsFrequency : 0;
dpp.Flags = D3DPRESENTFLAG_LOCKABLE_BACKBUFFER;
if (theApp.vsync)
dpp.PresentationInterval = D3DPRESENT_INTERVAL_ONE; // VSync
else
dpp.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE; // No Sync
HRESULT hret = pD3D->CreateDevice(theApp.fsAdapter,
D3DDEVTYPE_HAL, DWORD BehaviorFlags;
pWnd->GetSafeHwnd(), D3DCAPS9 caps;
D3DCREATE_SOFTWARE_VERTEXPROCESSING, if (D3D_OK == pD3D->GetDeviceCaps(theApp.fsAdapter, D3DDEVTYPE_HAL, &caps)) {
&dpp, if (caps.DevCaps & D3DDEVCAPS_HWTRANSFORMANDLIGHT) {
&pDevice); BehaviorFlags = D3DCREATE_HARDWARE_VERTEXPROCESSING;
if(hret != D3D_OK) } else {
{ BehaviorFlags = D3DCREATE_SOFTWARE_VERTEXPROCESSING;
winlog("Error creating Direct3DDevice %08x\n", hret); }
if (caps.DevCaps & D3DDEVCAPS_PUREDEVICE) {
BehaviorFlags |= D3DCREATE_PUREDEVICE;
}
} else {
winlog("Error retrieving device's D3D capabilities\n");
return false; return false;
} }
pDevice->SetDialogBoxMode(TRUE); // !!! Enable menu and windows !!!
HRESULT hret = pD3D->CreateDevice(theApp.fsAdapter,
caps.DeviceType,
pWnd->GetSafeHwnd(),
BehaviorFlags,
&dpp,
&pDevice);
#ifdef _DEBUG
switch(hret)
{
case D3DERR_DEVICELOST:
winlog("Error creating Direct3DDevice (D3DERR_DEVICELOST)\n");
return false;
break;
case D3DERR_INVALIDCALL:
winlog("Error creating Direct3DDevice (D3DERR_INVALIDCALL)\n");
return false;
break;
case D3DERR_NOTAVAILABLE:
winlog("Error creating Direct3DDevice (D3DERR_NOTAVAILABLE)\n");
return false;
break;
case D3DERR_OUTOFVIDEOMEMORY:
winlog("Error creating Direct3DDevice (D3DERR_OUTOFVIDEOMEMORY)\n");
return false;
break;
}
#endif
restoreDeviceObjects(); restoreDeviceObjects();
// Set the status message's background vertex information, that does not need to be changed in realtime // Set the status message's background vertex information, that does not need to be changed in realtime
msgBox[0].z = 0.5f; msgBox[0].z = 0.5f;
msgBox[0].rhw = 1.0f; msgBox[0].rhw = 1.0f;
@ -461,21 +481,35 @@ bool Direct3DDisplay::initialize()
msgBox[3].rhw = 1.0f; msgBox[3].rhw = 1.0f;
msgBox[3].color = 0x7f7f7f7f; msgBox[3].color = 0x7f7f7f7f;
// Set up the vertices of the texture
verts[0].z = verts[1].z = verts[2].z = verts[3].z = 1.0f;
verts[0].color = verts[1].color = verts[2].color = verts[3].color = D3DCOLOR_ARGB(0xff, 0xff, 0xff, 0xff);
verts[1].u = verts[2].u = 1.0f;
verts[0].u = verts[3].u = 0.0f;
verts[0].v = verts[1].v = 0.0f;
verts[2].v = verts[3].v = 1.0f;
verts[0].x = verts[3].x = 0.0f;
verts[1].x = verts[2].x = 1.0f;
verts[0].y = verts[1].y = 0.0f;
verts[2].y = verts[3].y = 1.0f;
utilUpdateSystemColorMaps(theApp.filterLCD ); utilUpdateSystemColorMaps(theApp.filterLCD );
theApp.updateFilter(); theApp.updateFilter();
theApp.updateIFB(); theApp.updateIFB();
if(failed)
return false;
pWnd->DragAcceptFiles(TRUE); pWnd->DragAcceptFiles(TRUE);
initSucessful = true;
doNotRender = false;
return TRUE; return TRUE;
} }
bool Direct3DDisplay::initializeOffscreen(unsigned int w, unsigned int h) bool Direct3DDisplay::initializeOffscreen(unsigned int w, unsigned int h)
{ {
D3DFORMAT format = screenFormat; D3DFORMAT format = screenFormat;
unsigned int correctedWidth=w, correctedHeight=h; unsigned int correctedWidth=w, correctedHeight=h;
// This function corrects the texture size automaticly // This function corrects the texture size automaticly
@ -505,10 +539,10 @@ bool Direct3DDisplay::initializeOffscreen(unsigned int w, unsigned int h)
pDevice, pDevice,
correctedWidth, correctedWidth,
correctedHeight, correctedHeight,
D3DX_DEFAULT, 1,
0, D3DUSAGE_DYNAMIC,
format, format,
D3DPOOL_MANAGED, D3DPOOL_DEFAULT,
&pTexture) ) &pTexture) )
{ {
width = w; width = w;
@ -524,26 +558,53 @@ bool Direct3DDisplay::initializeOffscreen(unsigned int w, unsigned int h)
void Direct3DDisplay::updateFiltering(int filter) void Direct3DDisplay::updateFiltering(int filter)
{ //TODO: use GetSampletState before changing
if(!pDevice) {
return;
}
HRESULT res;
switch(filter)
{ {
switch(filter) {
default: default:
case 0: case 0:
// point filtering // point filtering
pDevice->SetSamplerState( 0, D3DSAMP_MINFILTER, D3DTEXF_POINT ); res = pDevice->SetSamplerState( 0, D3DSAMP_MINFILTER, D3DTEXF_POINT );
pDevice->SetSamplerState( 0, D3DSAMP_MAGFILTER, D3DTEXF_POINT ); if (res != D3D_OK) {
pDevice->SetSamplerState( 0, D3DSAMP_MIPFILTER, D3DTEXF_POINT ); systemMessage(0, "Could not set point filtering mode: %d", res);
return;
}
res = pDevice->SetSamplerState( 0, D3DSAMP_MAGFILTER, D3DTEXF_POINT );
if (res != D3D_OK) {
systemMessage(0, "Could not set point filtering mode: %d", res);
return;
}
break; break;
case 1: case 1:
// bilinear // bilinear
pDevice->SetSamplerState( 0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR ); res = pDevice->SetSamplerState( 0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR );
pDevice->SetSamplerState( 0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR ); if (res != D3D_OK) {
pDevice->SetSamplerState( 0, D3DSAMP_MIPFILTER, D3DTEXF_POINT ); systemMessage(0, "Could not set bilinear filtering mode: %d", res);
return;
}
res = pDevice->SetSamplerState( 0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR );
if (res != D3D_OK) {
systemMessage(0, "Could not set bilinear filtering mode: %d", res);
return;
}
// Don't wrap textures .. otherwise bottom blurs top to bottom
pDevice->SetSamplerState(0, D3DSAMP_ADDRESSU, D3DTADDRESS_CLAMP);
pDevice->SetSamplerState(0, D3DSAMP_ADDRESSV, D3DTADDRESS_CLAMP);
break; break;
} }
return;
} }
void Direct3DDisplay::clear() void Direct3DDisplay::clear()
{ { // interface function
if(!initSucessful) return;
if (pDevice) if (pDevice)
pDevice->Clear( 0L, NULL, D3DCLEAR_TARGET, pDevice->Clear( 0L, NULL, D3DCLEAR_TARGET,
#ifdef _DEBUG #ifdef _DEBUG
@ -555,70 +616,43 @@ void Direct3DDisplay::clear()
} }
void Direct3DDisplay::renderMenu() void Direct3DDisplay::renderMenu()
{ { // interface function
checkFullScreen(); if(!initSucessful) return;
if(theApp.m_pMainWnd) if(theApp.m_pMainWnd)
theApp.m_pMainWnd->DrawMenuBar(); theApp.m_pMainWnd->DrawMenuBar();
} }
void Direct3DDisplay::checkFullScreen()
{
//if(tripleBuffering)
//pDirect3D->FlipToGDISurface();
}
void Direct3DDisplay::render() void Direct3DDisplay::render()
{ { // interface function
unsigned int nBytesPerPixel = systemColorDepth / 8; //This is the byte count of a Pixel
unsigned int pitch = (theApp.filterWidth * nBytesPerPixel) + 4;
HRESULT hr;
if(!pDevice) return; if(!pDevice) return;
if(!initSucessful) return;
if(doNotRender) return;
unsigned int nBytesPerPixel = systemColorDepth >> 3; // This is the byte count of a Pixel
unsigned int pitch = (theApp.filterWidth * nBytesPerPixel) + 4; // The size of a scanline in bytes
// Test the cooperative level to see if it's okay to render // Test the cooperative level to see if it's okay to render
HRESULT hr;
hr = pDevice->TestCooperativeLevel(); hr = pDevice->TestCooperativeLevel();
if(hr != D3D_OK)
{
switch(hr) switch(hr)
{ {
case D3DERR_DEVICELOST:
break;
case D3DERR_DEVICENOTRESET: case D3DERR_DEVICENOTRESET:
invalidateDeviceObjects(); resetDevice();
hr = pDevice->Reset(&dpp); break;
if( hr == D3D_OK )
{
restoreDeviceObjects();
}
#ifdef _DEBUG
else
switch (hr)
{
case D3DERR_DEVICELOST: case D3DERR_DEVICELOST:
winlog("Render_DeviceLost: D3DERR_DEVICELOST\n"); winlog("Render: D3DERR_DEVICELOST\n");
break; return;
case D3DERR_DRIVERINTERNALERROR:
winlog("Render_DeviceLost: D3DERR_DRIVERINTERNALERROR\n");
break;
case D3DERR_INVALIDCALL:
winlog("Render_DeviceLost: D3DERR_INVALIDCALL\n");
break;
case D3DERR_OUTOFVIDEOMEMORY:
winlog("Render_DeviceLost: D3DERR_OUTOFVIDEOMEMORY\n");
break;
case E_OUTOFMEMORY:
winlog("Render_DeviceLost: E_OUTOFMEMORY\n");
break;
}
#endif
break; break;
case D3DERR_DRIVERINTERNALERROR: case D3DERR_DRIVERINTERNALERROR:
winlog("Render: D3DERR_DRIVERINTERNALERROR\n"); winlog("Render: D3DERR_DRIVERINTERNALERROR\n");
theApp.ExitInstance(); cleanup();
break; if(initialize()) {
}
return; return;
} else { // reinitialize device failed
AfxPostQuitMessage(D3DERR_DRIVERINTERNALERROR);
}
break;
} }
// Clear the screen // Clear the screen
@ -704,8 +738,8 @@ gbaLoopEnd:
} }
//C Version of the code above //C Version of the code above
//int x,y,i; //unsigned int i;
//int srcPitch = (theApp.sizeX+1) * nBytesPerPixel; //int x, y, srcPitch = (theApp.sizeX+1) * nBytesPerPixel;
//unsigned char * src = ((unsigned char*)pix)+srcPitch; //unsigned char * src = ((unsigned char*)pix)+srcPitch;
//unsigned char * dst = (unsigned char*)locked.pBits; //unsigned char * dst = (unsigned char*)locked.pBits;
//for (y=0;y<theApp.sizeY;y++) //Width //for (y=0;y<theApp.sizeY;y++) //Width
@ -713,37 +747,12 @@ gbaLoopEnd:
// for (i=0;i<nBytesPerPixel;i++) //Byte# Of Pixel // for (i=0;i<nBytesPerPixel;i++) //Byte# Of Pixel
// *(dst+i+(x*nBytesPerPixel)+(y*locked.Pitch)) = *(src+i+(x*nBytesPerPixel)+(y*srcPitch)); // *(dst+i+(x*nBytesPerPixel)+(y*locked.Pitch)) = *(src+i+(x*nBytesPerPixel)+(y*srcPitch));
} }
pTexture->UnlockRect(0); pTexture->UnlockRect(0);
// Set the edges of the texture pDevice->SetFVF( D3DFVF_IMAGEVERTEX );
POINT p1, p2;
p1.x = theApp.dest.left;
p1.y = theApp.dest.top;
p2.x = theApp.dest.right;
p2.y = theApp.dest.bottom;
theApp.m_pMainWnd->ScreenToClient(&p1);
theApp.m_pMainWnd->ScreenToClient(&p2);
FLOAT left, right, top, bottom;
left = (FLOAT)(p1.x);
top = (FLOAT)(p1.y);
right = (FLOAT)(p2.x);
bottom = (FLOAT)(p2.y);
right *= (FLOAT)textureWidth/theApp.rect.right;
bottom *= (FLOAT)textureHeight/theApp.rect.bottom;
verts[0] = D3DTLVERTEX(D3DXVECTOR3( left, top, 0.0f), 1.0f, 0xffffffff, 0.0f, 0.0f );
verts[1] = D3DTLVERTEX(D3DXVECTOR3( right, top, 0.0f), 1.0f, 0xffffffff, 1.0f, 0.0f );
verts[2] = D3DTLVERTEX(D3DXVECTOR3( right, bottom, 0.0f), 1.0f, 0xffffffff, 1.0f, 1.0f );
verts[3] = D3DTLVERTEX(D3DXVECTOR3( left, bottom, 0.0f), 1.0f, 0xffffffff, 0.0f, 1.0f );
pDevice->SetFVF( D3DFVF_TLVERTEX );
pDevice->SetTexture( 0, pTexture ); pDevice->SetTexture( 0, pTexture );
pDevice->DrawPrimitiveUP( D3DPT_TRIANGLEFAN, 2, verts, sizeof(D3DTLVERTEX) ); pDevice->DrawPrimitiveUP( D3DPT_TRIANGLEFAN, 2, verts, sizeof( IMAGEVERTEX ) );
pTexture->UnlockRect(0);
} // SUCCEEDED(pTexture->LockRect... } // SUCCEEDED(pTexture->LockRect...
else else
{ {
@ -772,9 +781,9 @@ gbaLoopEnd:
msgBox[3].x = (FLOAT)msgRect.left; msgBox[3].x = (FLOAT)msgRect.left;
msgBox[3].y = (FLOAT)msgRect.bottom; msgBox[3].y = (FLOAT)msgRect.bottom;
pDevice->SetFVF( D3DFVF_SIMPLE ); pDevice->SetFVF( D3DFVF_TEXTBOXVERTEX );
pDevice->SetTexture( 0, NULL ); pDevice->SetTexture( 0, NULL );
pDevice->DrawPrimitiveUP( D3DPT_TRIANGLEFAN, 2, msgBox, sizeof(D3DVERTEX_SIMPLE)); pDevice->DrawPrimitiveUP( D3DPT_TRIANGLEFAN, 2, msgBox, sizeof(TEXTBOXVERTEX));
pFont->DrawText(NULL, theApp.screenMessageBuffer, -1, msgRect, DT_CENTER | DT_VCENTER, 0x7fff0000); pFont->DrawText(NULL, theApp.screenMessageBuffer, -1, msgRect, DT_CENTER | DT_VCENTER, 0x7fff0000);
} }
@ -816,57 +825,70 @@ gbaLoopEnd:
void Direct3DDisplay::invalidateDeviceObjects() void Direct3DDisplay::invalidateDeviceObjects()
{ {
if(pFont)
if(pFont) {
pFont->Release(); pFont->Release();
pFont = NULL; pFont = NULL;
} }
}
void Direct3DDisplay::restoreDeviceObjects() void Direct3DDisplay::restoreDeviceObjects()
{ {
// Create the font
D3DXCreateFont( pDevice, 24, 0, FW_BOLD, 1, FALSE, ANSI_CHARSET, OUT_DEFAULT_PRECIS, ANTIALIASED_QUALITY, FF_DONTCARE, "Arial", &pFont );
// Set texture filter
updateFiltering(theApp.d3dFilter); updateFiltering(theApp.d3dFilter);
// Enable transparent vectors // Set device settings
pDevice->SetRenderState( D3DRS_ZENABLE, D3DZB_FALSE ); pDevice->SetRenderState( D3DRS_ZENABLE, D3DZB_FALSE );
pDevice->SetRenderState( D3DRS_ALPHABLENDENABLE, TRUE ); pDevice->SetRenderState( D3DRS_ALPHABLENDENABLE, TRUE );
pDevice->SetRenderState( D3DRS_SRCBLEND, D3DBLEND_SRCALPHA ); pDevice->SetRenderState( D3DRS_SRCBLEND, D3DBLEND_SRCALPHA );
pDevice->SetRenderState( D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA ); pDevice->SetRenderState( D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA );
pDevice->SetTextureStageState( 0, D3DTSS_ALPHAARG1, D3DTA_DIFFUSE ); pDevice->SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_MODULATE);
if (theApp.menuToggle)
pDevice->SetDialogBoxMode( TRUE );
pDevice->SetRenderState( D3DRS_LIGHTING, FALSE );
// Set matrices
// Create the font initializeMatrices();
D3DXCreateFont( pDevice, 24, 0, FW_BOLD, 1, FALSE, ANSI_CHARSET, OUT_DEFAULT_PRECIS, ANTIALIASED_QUALITY, FF_DONTCARE, "Arial", &pFont );
} }
void Direct3DDisplay::resize(int w, int h) void Direct3DDisplay::resize(int w, int h)
{ { // interface function
if(!initSucessful) return;
if ( (w>0) && (h>0) ) {
if(pDevice) if(pDevice)
{ {
dpp.BackBufferWidth = w; dpp.BackBufferWidth = w;
dpp.BackBufferHeight = h; dpp.BackBufferHeight = h;
invalidateDeviceObjects(); setPresentationType();
HRESULT hr = pDevice->Reset(&dpp); if (resetDevice()) {
if( hr == D3D_OK ) doNotRender = false;
restoreDeviceObjects();
else
systemMessage(0, "Failed device reset %08x", hr);
} }
} }
} else {
doNotRender = true;
}
}
bool Direct3DDisplay::changeRenderSize(int w, int h) bool Direct3DDisplay::changeRenderSize(int w, int h)
{ { // interface function
if(!initSucessful) return false;
// w and h is the size of the filtered image (So this could be 3xGBASize) // w and h is the size of the filtered image (So this could be 3xGBASize)
if(w != width || h != height) if(w != width || h != height)
{ {
if(pTexture) if(pTexture) {
{
pTexture->Release(); pTexture->Release();
pTexture = NULL; pTexture = NULL;
} }
if(!initializeOffscreen(w, h)) { if(!initializeOffscreen(w, h)) {
failed = true;
return false; return false;
} }
} }
@ -874,44 +896,46 @@ bool Direct3DDisplay::changeRenderSize(int w, int h)
if(filterDisabled && theApp.filterFunction) if(filterDisabled && theApp.filterFunction)
theApp.filterFunction = NULL; theApp.filterFunction = NULL;
// Set up 2D matrices
initializeMatrices();
return true; return true;
} }
void Direct3DDisplay::setOption(const char *option, int value) void Direct3DDisplay::setOption(const char *option, int value)
{ { // interface function
if(!strcmp(option, "d3dFilter")) if(!initSucessful) return;
updateFiltering(value);
if(!strcmp(option, "d3dVSync")) if(!strcmp(option, "d3dFilter"))
updateVSync(); updateFiltering(theApp.d3dFilter);
if(!strcmp(option, "vsync"))
{
if (pDevice)
{
if (theApp.vsync)
dpp.PresentationInterval = D3DPRESENT_INTERVAL_ONE; // VSync
else
dpp.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE; // No Sync
resetDevice();
}
}
if(!strcmp(option, "triplebuffering"))
{
if (theApp.tripleBuffering)
dpp.BackBufferCount = 3;
else
dpp.BackBufferCount = 2;
resetDevice();
}
if(!strcmp(option, "d3dKeepAspectRatio"))
keepAspectRatio = true; //theApp.d3dKeepAspectRatio;
} }
int Direct3DDisplay::selectFullScreenMode(GUID **) int Direct3DDisplay::selectFullScreenMode(GUID **)
{ { // interface function
//int newScreenWidth, newScreenHeight;
//int newScreenBitsPerPixel;
//D3DDISPLAYMODE dm;
//pDevice->GetDisplayMode( 0, &dm );
//newScreenWidth = dm.Width;
//newScreenHeight = dm.Height;
//switch (dm.Format)
//{
//case D3DFMT_A2R10G10B10:
//case D3DFMT_A8R8G8B8:
//case D3DFMT_X8R8G8B8:
// newScreenBitsPerPixel = 32;
// break;
//case D3DFMT_A1R5G5B5:
//case D3DFMT_X1R5G5B5:
//case D3DFMT_R5G6B5:
// newScreenBitsPerPixel = 16;
// break;
//}
//
//return (newScreenBitsPerPixel << 24) | (newScreenWidth << 12) | newScreenHeight;
int w, h, b; int w, h, b;
UniVideoModeDlg dlg(0, &w, &h, &b, &SelectedFreq, &SelectedAdapter); UniVideoModeDlg dlg(0, &w, &h, &b, &SelectedFreq, &SelectedAdapter);
@ -926,29 +950,108 @@ int Direct3DDisplay::selectFullScreenMode(GUID **)
} }
} }
int Direct3DDisplay::selectFullScreenMode2() int Direct3DDisplay::selectFullScreenMode2()
{ {
return (SelectedAdapter<<16) + SelectedFreq; return (SelectedAdapter<<16) + SelectedFreq;
} }
// Reset Device and Resources
void Direct3DDisplay::updateVSync(void) bool Direct3DDisplay::resetDevice()
{ {
if (pDevice)
{
if (theApp.vsync)
dpp.PresentationInterval = D3DPRESENT_INTERVAL_ONE; // VSync
else
dpp.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE; // No Sync
invalidateDeviceObjects(); invalidateDeviceObjects();
if(pTexture) {
pDevice->SetTexture( 0, NULL);
pTexture->Release();
pTexture = NULL;
}
if (!theApp.menuToggle)
pDevice->SetDialogBoxMode( FALSE );
HRESULT hr = pDevice->Reset(&dpp); HRESULT hr = pDevice->Reset(&dpp);
if (hr == D3D_OK) if (hr == D3D_OK)
{
restoreDeviceObjects(); restoreDeviceObjects();
else if(!initializeOffscreen(width, height))
systemMessage(0, "Failed to change VSync option %08x", hr); return false;
return true;
} }
else
{
switch(hr)
{
case D3DERR_DEVICELOST:
winlog("Render_DeviceLost: D3DERR_DEVICELOST\n");
break;
case D3DERR_DRIVERINTERNALERROR:
winlog("Render_DeviceLost: D3DERR_DRIVERINTERNALERROR\n");
break;
case D3DERR_INVALIDCALL:
winlog("Render_DeviceLost: D3DERR_INVALIDCALL\n");
break;
case D3DERR_OUTOFVIDEOMEMORY:
winlog("Render_DeviceLost: D3DERR_OUTOFVIDEOMEMORY\n");
break;
case E_OUTOFMEMORY:
winlog("Render_DeviceLost: E_OUTOFMEMORY\n");
break;
}
winlog("Failed to reset device: %08x\n", hr);
return false;
}
}
void Direct3DDisplay::initializeMatrices()
{ // Configure matrices to use standard orthogonal projection (2D)
D3DXMATRIX Ortho2D;
D3DXMATRIX Identity;
D3DXMATRIX temp1, temp2;
// Initialize an orthographic matrix which automaticly compensates the difference between image size and texture size
if (!keepAspectRatio) {
D3DXMatrixOrthoOffCenterLH(
&Ortho2D,
0.0f, // left
1.0f * (FLOAT)width / (FLOAT)textureWidth, // right
1.0f * (FLOAT)height / (FLOAT)textureHeight, // bottom
0.0f, // top
0.0f, 1.0f); // z
} else {
FLOAT l=0.0f, r=0.0f, b=0.0f, t=0.0f;
FLOAT srcAspectRatio = (FLOAT)theApp.sizeX / (FLOAT)theApp.sizeY;
FLOAT aspectRatio = (FLOAT)dpp.BackBufferWidth / (FLOAT)dpp.BackBufferHeight;
FLOAT textureImageDiffX = (FLOAT)width / (FLOAT)textureWidth;
FLOAT textureImageDiffY = (FLOAT)height / (FLOAT)textureHeight;
aspectRatio /= srcAspectRatio;
if(aspectRatio > 1.0f) {
r = 1.0f * textureImageDiffX * aspectRatio;
b = 1.0f * textureImageDiffY;
} else {
r = 1.0f * textureImageDiffX;
b = 1.0f * textureImageDiffY * (1.0f / aspectRatio);
}
D3DXMatrixOrthoOffCenterLH(
&temp1,
l,
r,
b,
t,
0.0f, 1.0f); // z
D3DXMatrixTranslation( // translate matrix > move image
&temp2,
(aspectRatio>1.0)?( (aspectRatio - 1.0f) * 0.5f * textureImageDiffX ):0.0f,
(aspectRatio<1.0)?( ((1.0f/aspectRatio) - 1.0f) * 0.5f * textureImageDiffY ):0.0f,
0.0f);
D3DXMatrixMultiply(&Ortho2D, &temp2, &temp1);
}
D3DXMatrixIdentity(&Identity); // Identity = Do not change anything
pDevice->SetTransform(D3DTS_PROJECTION, &Ortho2D);
pDevice->SetTransform(D3DTS_WORLD, &Identity);
pDevice->SetTransform(D3DTS_VIEW, &Identity);
} }
IDisplay *newDirect3DDisplay() IDisplay *newDirect3DDisplay()

View File

@ -32,6 +32,8 @@ static char THIS_FILE[] = __FILE__;
#endif #endif
// Todo: Expand UI to allow user to enter multiple keys here. // Todo: Expand UI to allow user to enter multiple keys here.
// these are temporary quick hacks to make the new lists
// work with the old code.
int TempReadFirst(KeyList &Key) int TempReadFirst(KeyList &Key)
{ {

View File

@ -646,6 +646,9 @@ void MainWnd::OnFileTogglemenu()
} }
theApp.adjustDestRect(); theApp.adjustDestRect();
if(theApp.display)
theApp.display->resize(theApp.dest.right-theApp.dest.left, theApp.dest.bottom-theApp.dest.top);
} }
void MainWnd::OnUpdateFileTogglemenu(CCmdUI* pCmdUI) void MainWnd::OnUpdateFileTogglemenu(CCmdUI* pCmdUI)

View File

@ -225,6 +225,7 @@ void MainWnd::OnUpdateOptionsVideoFrameskip9(CCmdUI* pCmdUI)
void MainWnd::OnOptionsVideoVsync() void MainWnd::OnOptionsVideoVsync()
{ {
theApp.vsync = !theApp.vsync; theApp.vsync = !theApp.vsync;
theApp.updateRenderMethod(true);
} }
void MainWnd::OnUpdateOptionsVideoVsync(CCmdUI* pCmdUI) void MainWnd::OnUpdateOptionsVideoVsync(CCmdUI* pCmdUI)
@ -455,6 +456,7 @@ void MainWnd::OnUpdateOptionsVideoRendermethodOpengl(CCmdUI* pCmdUI)
void MainWnd::OnOptionsVideoTriplebuffering() void MainWnd::OnOptionsVideoTriplebuffering()
{ {
theApp.tripleBuffering = !theApp.tripleBuffering; theApp.tripleBuffering = !theApp.tripleBuffering;
theApp.updateRenderMethod(true);
} }
void MainWnd::OnUpdateOptionsVideoTriplebuffering(CCmdUI* pCmdUI) void MainWnd::OnUpdateOptionsVideoTriplebuffering(CCmdUI* pCmdUI)