mirror of
https://github.com/panda3d/panda3d.git
synced 2025-10-03 02:15:43 -04:00
unworking stuff
This commit is contained in:
parent
168e572faa
commit
7cb2d0d19f
@ -61,15 +61,15 @@ typedef struct {
|
|||||||
bool bIsLowVidMemCard;
|
bool bIsLowVidMemCard;
|
||||||
bool bIsTNLDevice;
|
bool bIsTNLDevice;
|
||||||
ushort depth_buffer_bitdepth; //GetSurfaceDesc is not reliable so must store this explicitly
|
ushort depth_buffer_bitdepth; //GetSurfaceDesc is not reliable so must store this explicitly
|
||||||
ushort CardIDNum; // its posn in DisplayArray, for dbgprint purposes
|
ushort CardIDNum; // adapter ID
|
||||||
DDDEVICEIDENTIFIER2 DXDeviceID;
|
|
||||||
// D3DDEVICEDESC8 D3DDevDesc;
|
|
||||||
DWORD dwSupportedScreenDepthsMask;
|
DWORD dwSupportedScreenDepthsMask;
|
||||||
D3DCAPS8 d3dcaps;
|
D3DCAPS8 d3dcaps;
|
||||||
D3DDISPLAYMODE DisplayMode;
|
D3DDISPLAYMODE DisplayMode;
|
||||||
|
D3DPRESENT_PARAMETERS PresParams; // not redundant with DisplayMode since width/height must be 0 for windowed mode
|
||||||
#ifdef USE_TEXFMTVEC
|
#ifdef USE_TEXFMTVEC
|
||||||
DDPixelFormatVec TexPixFmts;
|
DDPixelFormatVec TexPixFmts;
|
||||||
#endif
|
#endif
|
||||||
|
D3DADAPTER_IDENTIFIER8 DXDeviceID;
|
||||||
} DXScreenData;
|
} DXScreenData;
|
||||||
// typedef vector<DXScreenData> ScreenDataVector;
|
// typedef vector<DXScreenData> ScreenDataVector;
|
||||||
|
|
||||||
|
@ -992,7 +992,7 @@ void wdxGraphicsWindowGroup::CreateWindows(void) {
|
|||||||
_hMouseCursor = LoadCursor(NULL, DEFAULT_CURSOR);
|
_hMouseCursor = LoadCursor(NULL, DEFAULT_CURSOR);
|
||||||
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (!wc_registered) {
|
if (!wc_registered) {
|
||||||
// We only need to register the window class once per session.
|
// We only need to register the window class once per session.
|
||||||
@ -1007,23 +1007,34 @@ void wdxGraphicsWindowGroup::CreateWindows(void) {
|
|||||||
wc_registered = true;
|
wc_registered = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
DWORD window_style = WS_POPUP | WS_SYSMENU; // for CreateWindow
|
DWORD base_window_style = WS_POPUP | WS_SYSMENU; // for CreateWindow
|
||||||
|
|
||||||
|
|
||||||
global_wdxwinptr = _windows[0]; // for use during createwin() bugbug look at this again
|
global_wdxwinptr = _windows[0]; // for use during createwin() bugbug look at this again
|
||||||
|
|
||||||
|
HINSTANCE hUser32 = NULL;
|
||||||
|
|
||||||
// rect now contains the coords for the entire window, not the client
|
// rect now contains the coords for the entire window, not the client
|
||||||
if(dx_full_screen) {
|
if(dx_full_screen) {
|
||||||
// get upper-left corner coords using GetMonitorInfo
|
// get upper-left corner coords using GetMonitorInfo
|
||||||
|
|
||||||
// GetMonInfo doesnt exist on w95, so dont statically link to it
|
// GetMonInfo doesnt exist on w95, so dont statically link to it
|
||||||
HINSTANCE hUser32 = (HINSTANCE) LoadLibrary("user32.dll");
|
hUser32 = (HINSTANCE) LoadLibrary("user32.dll");
|
||||||
assert(hUser32);
|
assert(hUser32);
|
||||||
typedef BOOL (WINAPI* LPGETMONITORINFO)(HMONITOR, LPMONITORINFO);
|
typedef BOOL (WINAPI* LPGETMONITORINFO)(HMONITOR, LPMONITORINFO);
|
||||||
LPGETMONITORINFO pfnGetMonitorInfo = (LPGETMONITORINFO) GetProcAddress(hUser32, "GetMonitorInfoA");
|
LPGETMONITORINFO pfnGetMonitorInfo = (LPGETMONITORINFO) GetProcAddress(hUser32, "GetMonitorInfoA");
|
||||||
|
}
|
||||||
|
|
||||||
// extra windows must be parented to the first so app doesnt minimize when user selects them
|
// extra windows must be parented to the first so app doesnt minimize when user selects them
|
||||||
|
|
||||||
for(int devnum=0;devnum<_windows.size();devnum++) {
|
for(int devnum=0;devnum<_windows.size();devnum++) {
|
||||||
|
DWORD xleft,ytop,xsize,ysize;
|
||||||
|
GraphicsWindow::Properties *props = &_windows[devnum]->_props;
|
||||||
|
DWORD final_window_style;
|
||||||
|
|
||||||
|
final_window_style=base_window_style;
|
||||||
|
|
||||||
|
if(dx_full_screen) {
|
||||||
MONITORINFO minfo;
|
MONITORINFO minfo;
|
||||||
ZeroMemory(&minfo, sizeof(MONITORINFO));
|
ZeroMemory(&minfo, sizeof(MONITORINFO));
|
||||||
minfo.cbSize = sizeof(MONITORINFO);
|
minfo.cbSize = sizeof(MONITORINFO);
|
||||||
@ -1032,30 +1043,58 @@ void wdxGraphicsWindowGroup::CreateWindows(void) {
|
|||||||
else {
|
else {
|
||||||
minfo.rcMonitor.left = minfo.rcMonitor.top = 0;
|
minfo.rcMonitor.left = minfo.rcMonitor.top = 0;
|
||||||
}
|
}
|
||||||
|
xleft=minfo.rcMonitor.left;
|
||||||
GraphicsWindow::Properties *props = &_windows[devnum]->_props;
|
ytop=minfo.rcMonitor.top;
|
||||||
|
xsize=props->_xsize;
|
||||||
HWND hWin = CreateWindow(WDX_WINDOWCLASSNAME, props->_title.c_str(),
|
ysize=props->_ysize;
|
||||||
window_style, minfo.rcMonitor.left, minfo.rcMonitor.top,
|
} else {
|
||||||
props->_xsize,props->_ysize,
|
RECT win_rect;
|
||||||
_hParentWindow, NULL, hProgramInstance, 0);
|
SetRect(&win_rect, props->_xorg, props->_yorg, props->_xorg + props->_xsize,
|
||||||
|
props->_yorg + props->_ysize);
|
||||||
if(!hWin) {
|
|
||||||
wdxdisplay_cat.fatal() << "CreateWindow failed for monitor " << devnum << "!, LastError=" << GetLastError() << endl;
|
if(props->_border)
|
||||||
#ifdef _DEBUG
|
final_window_style |= WS_OVERLAPPEDWINDOW; // should we just use WS_THICKFRAME instead?
|
||||||
PrintErrorMessage(LAST_ERROR);
|
|
||||||
#endif
|
AdjustWindowRect(&win_rect, window_style, FALSE); //compute window size based on desired client area size
|
||||||
exit(1);
|
|
||||||
|
// make sure origin is on screen
|
||||||
|
if(win_rect.left < 0) {
|
||||||
|
win_rect.right -= win_rect.left; win_rect.left = 0;
|
||||||
|
}
|
||||||
|
if(win_rect.top < 0) {
|
||||||
|
win_rect.bottom -= win_rect.top; win_rect.top = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
_windows[devnum]->_dxgsg->scrn.hWnd = hWin;
|
xleft=win_rect.left;
|
||||||
if(devnum==0) {
|
ytop= win_rect.top;
|
||||||
_hParentWindow=hWin;
|
xsize=win_rect.right-win_rect.left;
|
||||||
}
|
ysize=win_rect.bottom-win_rect.top;
|
||||||
}
|
}
|
||||||
FreeLibrary(hUser32);
|
|
||||||
|
// BUGBUG: this sets window posns based on desktop arrangement of monitors (that is what GetMonInfo is for).
|
||||||
|
// need to move to chancfg stuff instead (i.e. use the properties x/yorg's) when that is ready
|
||||||
|
HWND hWin = CreateWindow(WDX_WINDOWCLASSNAME, props->_title.c_str(),
|
||||||
|
final_window_style, xleft,ytop,xsize,ysize,
|
||||||
|
_hParentWindow, NULL, hProgramInstance, 0);
|
||||||
|
|
||||||
|
if(!hWin) {
|
||||||
|
wdxdisplay_cat.fatal() << "CreateWindow failed for monitor " << devnum << "!, LastError=" << GetLastError() << endl;
|
||||||
|
#ifdef _DEBUG
|
||||||
|
PrintErrorMessage(LAST_ERROR);
|
||||||
|
#endif
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
_windows[devnum]->_dxgsg->scrn.hWnd = hWin;
|
||||||
|
if(devnum==0)
|
||||||
|
_hParentWindow=hWin;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(hUser32)
|
||||||
|
FreeLibrary(hUser32);
|
||||||
|
/*
|
||||||
} else {
|
} else {
|
||||||
assert(_windows.size()==1);
|
// assert(_windows.size()==1);
|
||||||
|
|
||||||
GraphicsWindow::Properties *props = &_windows[0]->_props;
|
GraphicsWindow::Properties *props = &_windows[0]->_props;
|
||||||
|
|
||||||
@ -1078,8 +1117,8 @@ void wdxGraphicsWindowGroup::CreateWindows(void) {
|
|||||||
|
|
||||||
_hParentWindow =
|
_hParentWindow =
|
||||||
CreateWindow(WDX_WINDOWCLASSNAME, props->_title.c_str(),
|
CreateWindow(WDX_WINDOWCLASSNAME, props->_title.c_str(),
|
||||||
window_style, win_rect.left, win_rect.top, win_rect.right-win_rect.left,
|
window_style,
|
||||||
win_rect.bottom-win_rect.top,
|
win_rect.left, win_rect.top, win_rect.right-win_rect.left,win_rect.bottom-win_rect.top,
|
||||||
NULL, NULL, hProgramInstance, 0);
|
NULL, NULL, hProgramInstance, 0);
|
||||||
_windows[0]->_dxgsg->scrn.hWnd = _hParentWindow;
|
_windows[0]->_dxgsg->scrn.hWnd = _hParentWindow;
|
||||||
}
|
}
|
||||||
@ -1088,7 +1127,7 @@ void wdxGraphicsWindowGroup::CreateWindows(void) {
|
|||||||
wdxdisplay_cat.fatal() << "CreateWindow failed!\n";
|
wdxdisplay_cat.fatal() << "CreateWindow failed!\n";
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
for(int devnum=0;devnum<_windows.size();devnum++) {
|
for(int devnum=0;devnum<_windows.size();devnum++) {
|
||||||
wdxGraphicsWindow *pWDXWin = _windows[devnum];
|
wdxGraphicsWindow *pWDXWin = _windows[devnum];
|
||||||
// for use by the window_proc
|
// for use by the window_proc
|
||||||
@ -1171,7 +1210,7 @@ void wdxGraphicsWindow::finish_window_setup(void) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#if 0
|
||||||
HRESULT CALLBACK EnumDevicesCallback(LPSTR pDeviceDescription, LPSTR pDeviceName,
|
HRESULT CALLBACK EnumDevicesCallback(LPSTR pDeviceDescription, LPSTR pDeviceName,
|
||||||
LPD3DDEVICEDESC7 pD3DDeviceDesc,LPVOID pContext) {
|
LPD3DDEVICEDESC7 pD3DDeviceDesc,LPVOID pContext) {
|
||||||
D3DDEVICEDESC7 *pd3ddevs = (D3DDEVICEDESC7 *)pContext;
|
D3DDEVICEDESC7 *pd3ddevs = (D3DDEVICEDESC7 *)pContext;
|
||||||
@ -1217,7 +1256,7 @@ HRESULT WINAPI EnumDisplayModesCallBack(LPDDSURFACEDESC2 lpDDSurfaceDesc,LPVOID
|
|||||||
|
|
||||||
return DDENUMRET_OK;
|
return DDENUMRET_OK;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
/*
|
/*
|
||||||
BOOL WINAPI DriverEnumCallback_Voodoo1( GUID* pGUID, TCHAR* strDesc,TCHAR* strName,
|
BOOL WINAPI DriverEnumCallback_Voodoo1( GUID* pGUID, TCHAR* strDesc,TCHAR* strName,
|
||||||
VOID *argptr, HMONITOR hm) {
|
VOID *argptr, HMONITOR hm) {
|
||||||
@ -1499,6 +1538,49 @@ check_for_color_cursor_support(void) {
|
|||||||
}
|
}
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
bool wdxGraphicsWindow::FindBestDepthFormat(DXScreenData &Display,D3DFORMAT *pBestFmt,bool bWantStencil) {
|
||||||
|
// list fmts in order of preference
|
||||||
|
#define NUM_TEST_ZFMTS 3
|
||||||
|
const static D3DFORMAT NoStencilPrefList={D3DFMT_D32,D3DFMT_D24X8,D3DFMT_D16};
|
||||||
|
const static D3DFORMAT StencilPrefList={D3DFMT_D24S8,D3DFMT_D24X4S4,D3DFMT_D15S1};
|
||||||
|
|
||||||
|
// int want_depth_bits = _props._want_depth_bits; should we pay attn to these at some point?
|
||||||
|
// int want_color_bits = _props._want_color_bits;
|
||||||
|
|
||||||
|
*pBestFmt = D3DFMT_UNKNOWN;
|
||||||
|
HRESULT hr;
|
||||||
|
|
||||||
|
// nvidia likes zbuf depth to match rendertarget depth
|
||||||
|
bool bOnlySelect16bpp= (dx_force_16bpp_zbuffer ||
|
||||||
|
((IS_NVIDIA(Display.DXDeviceID) && ((Display.DisplayMode.Format==D3DFMT_X1R5G5B5) ||
|
||||||
|
(Display.DisplayMode.Format==D3DFMT_R5G5B5))));
|
||||||
|
|
||||||
|
for(int i=0;i<NUM_TEST_ZFMTS;i++) {
|
||||||
|
D3DFORMAT TestDepthFmt = (bWantStencil ? StencilPrefList[i] : NoStencilPrefList[i]);
|
||||||
|
|
||||||
|
if(bOnlySelect16bpp && (TestDepthFmt!=D3DFMT_D16) && (TestDepthFmt!=D3DFMT_D15S1))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
hr = Display.pD3D8->CheckDeviceFormat(Display.CardIDNum,D3DDEVTYPE_HAL,Display.DisplayMode.Format,
|
||||||
|
D3DUSAGE_DEPTHSTENCIL,D3DRTYPE_SURFACE,TestDepthFmt);
|
||||||
|
|
||||||
|
if(FAILED(hr))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
hr = Display.pD3D8->CheckDepthStencilMatch(Display.CardIDNum,D3DDEVTYPE_HAL,
|
||||||
|
Display.DisplayMode.Format, // adapter format
|
||||||
|
Display.DisplayMode.Format, // backbuffer fmt (should be the same in my apps)
|
||||||
|
TestDepthFmt);
|
||||||
|
if(!FAILED(hr)) {
|
||||||
|
*pBestFmt = TestDepthFmt;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return (*pBestFmt != D3DFMT_UNKNOWN);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// returns true if successful
|
// returns true if successful
|
||||||
bool wdxGraphicsWindow::search_for_device(LPDIRECT3D8 pD3D8,DXDeviceInfo *pDevinfo) {
|
bool wdxGraphicsWindow::search_for_device(LPDIRECT3D8 pD3D8,DXDeviceInfo *pDevinfo) {
|
||||||
DWORD dwRenderWidth = _props._xsize;
|
DWORD dwRenderWidth = _props._xsize;
|
||||||
@ -1508,6 +1590,13 @@ bool wdxGraphicsWindow::search_for_device(LPDIRECT3D8 pD3D8,DXDeviceInfo *pDevin
|
|||||||
assert(_dxgsg!=NULL);
|
assert(_dxgsg!=NULL);
|
||||||
_dxgsg->scrn.pD3D8 = pD3D8;
|
_dxgsg->scrn.pD3D8 = pD3D8;
|
||||||
|
|
||||||
|
bool bWantStencil = ((_props._mask & W_STENCIL)!=0);
|
||||||
|
|
||||||
|
hr = pD3D8->GetAdapterIdentifier(pDevInfo->cardID,D3DENUM_NO_WHQL_LEVEL,&_dxgsg->scrn.DXDeviceID);
|
||||||
|
if(FAILED(hr)) {
|
||||||
|
wdxdisplay_cat.fatal() << "D3D GetAdapterID failed" << D3DERRORSTRING(hr);
|
||||||
|
}
|
||||||
|
|
||||||
D3DCAPS8 d3dcaps;
|
D3DCAPS8 d3dcaps;
|
||||||
hr = pD3D8->GetDeviceCaps(pDevInfo->cardID,D3DDEVTYPE_HAL,&d3dcaps);
|
hr = pD3D8->GetDeviceCaps(pDevInfo->cardID,D3DDEVTYPE_HAL,&d3dcaps);
|
||||||
if(FAILED(hr)) {
|
if(FAILED(hr)) {
|
||||||
@ -1519,6 +1608,11 @@ bool wdxGraphicsWindow::search_for_device(LPDIRECT3D8 pD3D8,DXDeviceInfo *pDevin
|
|||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(bWantStencil & (d3dcaps.StencilCaps==0x0)) {
|
||||||
|
wdxdisplay_cat.fatal() << "Stencil ability requested, but device #" << pDevInfo->cardID << " (" << _dxgsg->scrn.DXDeviceID.szDescription<<"), has no stencil capability!\n";
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
LPDIRECTDRAW7 pDD;
|
LPDIRECTDRAW7 pDD;
|
||||||
D3DDEVICEDESC7 d3ddevs[2]; // put HAL in 0, TnLHAL in 1
|
D3DDEVICEDESC7 d3ddevs[2]; // put HAL in 0, TnLHAL in 1
|
||||||
@ -1553,7 +1647,7 @@ bool wdxGraphicsWindow::search_for_device(LPDIRECT3D8 pD3D8,DXDeviceInfo *pDevin
|
|||||||
// Create the Direct Draw Objects
|
// Create the Direct Draw Objects
|
||||||
hr = (*_pParentWindowGroup->_pDDCreateEx)(&pDevInfo->guidDeviceIdentifier,(void **)&pDD, IID_IDirectDraw7, NULL);
|
hr = (*_pParentWindowGroup->_pDDCreateEx)(&pDevInfo->guidDeviceIdentifier,(void **)&pDD, IID_IDirectDraw7, NULL);
|
||||||
if(hr != DD_OK) {
|
if(hr != DD_OK) {
|
||||||
wdxdisplay_cat.fatal() << "DirectDrawCreateEx failed for monitor("<<devnum<< "): result = " << D3DERRORSTRING(hr);
|
wdxdisplay_cat.fatal() << "DirectDrawCreateEx failed for device ("<<pDevInfo->cardID<< "): result = " << D3DERRORSTRING(hr);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1567,7 +1661,7 @@ bool wdxGraphicsWindow::search_for_device(LPDIRECT3D8 pD3D8,DXDeviceInfo *pDevin
|
|||||||
ZeroMemory(&ddsGAVMCaps,sizeof(DDSCAPS2));
|
ZeroMemory(&ddsGAVMCaps,sizeof(DDSCAPS2));
|
||||||
ddsGAVMCaps.dwCaps = DDSCAPS_VIDEOMEMORY; //set internally by DX anyway, dont think this any different than 0x0
|
ddsGAVMCaps.dwCaps = DDSCAPS_VIDEOMEMORY; //set internally by DX anyway, dont think this any different than 0x0
|
||||||
if(FAILED(hr = pDD->GetAvailableVidMem(&ddsGAVMCaps,&dwVidMemTotal,&dwVidMemFree))) {
|
if(FAILED(hr = pDD->GetAvailableVidMem(&ddsGAVMCaps,&dwVidMemTotal,&dwVidMemFree))) {
|
||||||
wdxdisplay_cat.error() << "GetAvailableVidMem failed for device #"<<devnum<<": result = " << D3DERRORSTRING(hr);
|
wdxdisplay_cat.error() << "GetAvailableVidMem failed for device #"<<pDevInfo->cardID<<": result = " << D3DERRORSTRING(hr);
|
||||||
// goto skip_device;
|
// goto skip_device;
|
||||||
exit(1); // probably want to exit, since it may be my fault
|
exit(1); // probably want to exit, since it may be my fault
|
||||||
}
|
}
|
||||||
@ -1580,8 +1674,15 @@ bool wdxGraphicsWindow::search_for_device(LPDIRECT3D8 pD3D8,DXDeviceInfo *pDevin
|
|||||||
_dxgsg->scrn.MaxAvailVidMem = dwVidMemTotal;
|
_dxgsg->scrn.MaxAvailVidMem = dwVidMemTotal;
|
||||||
|
|
||||||
#define LOWVIDMEMTHRESHOLD 3500000
|
#define LOWVIDMEMTHRESHOLD 3500000
|
||||||
// assume buggy drivers (this means you, FireGL2) may return zero for dwVidMemFree, so ignore value if its 0
|
#define CRAPPY_DRIVER_IS_LYING_VIDMEMTHRESHOLD 1000000
|
||||||
_dxgsg->scrn.bIsLowVidMemCard = ((dwVidMemFree>0) && (dwVidMemFree< LOWVIDMEMTHRESHOLD));
|
|
||||||
|
// assume buggy drivers (this means you, FireGL2) may return zero for dwVidMemTotal, so ignore value if its < CRAPPY_DRIVER_IS_LYING_VIDMEMTHRESHOLD
|
||||||
|
_dxgsg->scrn.bIsLowVidMemCard = ((dwVidMemTotal>CRAPPYDRIVERISLYING_VIDMEMTHRESHOLD) && (dwVidMemTotal< LOWVIDMEMTHRESHOLD));
|
||||||
|
|
||||||
|
bool bNeedZBuffer = ((!(Display.d3dcaps.dwRasterCaps & D3DPRASTERCAPS_ZBUFFERLESSHSR ))
|
||||||
|
&& (_props._mask & W_DEPTH));
|
||||||
|
|
||||||
|
Display.PresentParams.EnableAutoDepthStencil=bNeedZBuffer;
|
||||||
|
|
||||||
if(dx_full_screen) {
|
if(dx_full_screen) {
|
||||||
_props._xorg = _props._yorg = 0;
|
_props._xorg = _props._yorg = 0;
|
||||||
@ -1591,6 +1692,8 @@ bool wdxGraphicsWindow::search_for_device(LPDIRECT3D8 pD3D8,DXDeviceInfo *pDevin
|
|||||||
D3DDISPLAYMODE BestDispMode;
|
D3DDISPLAYMODE BestDispMode;
|
||||||
ZeroMemory(BestDispMode,sizeof(BestDispMode));
|
ZeroMemory(BestDispMode,sizeof(BestDispMode));
|
||||||
|
|
||||||
|
bool bCouldntFindValidZBuf=false;
|
||||||
|
|
||||||
for(i=0;i<cNumModes;i++) {
|
for(i=0;i<cNumModes;i++) {
|
||||||
D3DDISPLAYMODE dispmode;
|
D3DDISPLAYMODE dispmode;
|
||||||
if(FAILED(hr = pD3D8->EnumAdapterDisplayModes(pDevInfo->cardID,i,&dispmode))) {
|
if(FAILED(hr = pD3D8->EnumAdapterDisplayModes(pDevInfo->cardID,i,&dispmode))) {
|
||||||
@ -1598,9 +1701,14 @@ bool wdxGraphicsWindow::search_for_device(LPDIRECT3D8 pD3D8,DXDeviceInfo *pDevin
|
|||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if((dispmode.RefreshRate<60) && (dispmode.RefreshRate>1)) {
|
||||||
|
// dont want refresh rates under 60Hz, but 0 or 1 might indicate a default refresh rate, which is usually >=60
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
if((dispmode.Width==dwRenderWidth) && (dispmode.Height==dwRenderHeight)) {
|
if((dispmode.Width==dwRenderWidth) && (dispmode.Height==dwRenderHeight)) {
|
||||||
if(FAILED(hr = pD3D8->CheckDeviceFormat(pDevInfo->cardID,D3DDEVTYPE_HAL,dispmode.Format,
|
if(FAILED(hr = pD3D8->CheckDeviceFormat(pDevInfo->cardID,D3DDEVTYPE_HAL,dispmode.Format,
|
||||||
D3DUSAGE_RENDERTARGET,dispmode.Format)) {
|
D3DUSAGE_RENDERTARGET,dispmode.Format)) {
|
||||||
if(hr==D3DERR_NOTAVAILABLE)
|
if(hr==D3DERR_NOTAVAILABLE)
|
||||||
continue;
|
continue;
|
||||||
else {
|
else {
|
||||||
@ -1609,6 +1717,14 @@ bool wdxGraphicsWindow::search_for_device(LPDIRECT3D8 pD3D8,DXDeviceInfo *pDevin
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(bNeedZBuffer) {
|
||||||
|
D3DFORMAT junk;
|
||||||
|
if(!FindBestDepthFormat(Display,&junk,bWantStencil)) {
|
||||||
|
bCouldntFindValidZBuf=true;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
switch(dispmode.Format) {
|
switch(dispmode.Format) {
|
||||||
case D3DFMT_X1R5G5B5:
|
case D3DFMT_X1R5G5B5:
|
||||||
_dxgsg->scrn.dwSupportedScreenDepths |= X1R5G5B5_FLAG;
|
_dxgsg->scrn.dwSupportedScreenDepths |= X1R5G5B5_FLAG;
|
||||||
@ -1652,8 +1768,12 @@ bool wdxGraphicsWindow::search_for_device(LPDIRECT3D8 pD3D8,DXDeviceInfo *pDevin
|
|||||||
else if(_dxgsg->scrn.dwSupportedScreenDepths & X1R5G5B5_FLAG)
|
else if(_dxgsg->scrn.dwSupportedScreenDepths & X1R5G5B5_FLAG)
|
||||||
pixFmt = D3DFORMAT_X1R5G5B5;
|
pixFmt = D3DFORMAT_X1R5G5B5;
|
||||||
else {
|
else {
|
||||||
wdxdisplay_cat.fatal() << "No supported FullScreen resolutions at " << dwRenderWidth << "x" << dwRenderHeight
|
if(bCouldntFindValidZBuf) {
|
||||||
<< " for device #" << pDevInfo->cardID << " (" << _dxgsg->scrn.DXDeviceID.szDescription<<"), skipping device...\n";
|
wdxdisplay_cat.fatal() << "Couldnt find valid zbuffer format to go with FullScreen mode at " << dwRenderWidth << "x" << dwRenderHeight
|
||||||
|
<< " for device #" << pDevInfo->cardID << " (" << _dxgsg->scrn.DXDeviceID.szDescription<<"), skipping device...\n";
|
||||||
|
} else
|
||||||
|
wdxdisplay_cat.fatal() << "No supported FullScreen modes at " << dwRenderWidth << "x" << dwRenderHeight
|
||||||
|
<< " for device #" << pDevInfo->cardID << " (" << _dxgsg->scrn.DXDeviceID.szDescription<<"), skipping device...\n";
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1689,6 +1809,7 @@ bool wdxGraphicsWindow::search_for_device(LPDIRECT3D8 pD3D8,DXDeviceInfo *pDevin
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if 0
|
||||||
void wdxGraphicsWindowGroup::
|
void wdxGraphicsWindowGroup::
|
||||||
SetCoopLevelsAndDisplayModes(void) {
|
SetCoopLevelsAndDisplayModes(void) {
|
||||||
HRESULT hr;
|
HRESULT hr;
|
||||||
@ -1768,6 +1889,7 @@ SetCoopLevelsAndDisplayModes(void) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
//return true if successful
|
//return true if successful
|
||||||
void wdxGraphicsWindow::
|
void wdxGraphicsWindow::
|
||||||
@ -1775,9 +1897,10 @@ CreateScreenBuffersAndDevice(DXScreenData &Display) {
|
|||||||
|
|
||||||
DWORD dwRenderWidth=Display.dwRenderWidth;
|
DWORD dwRenderWidth=Display.dwRenderWidth;
|
||||||
DWORD dwRenderHeight=Display.dwRenderHeight;
|
DWORD dwRenderHeight=Display.dwRenderHeight;
|
||||||
LPDIRECT3D7 pD3DI=Display.pD3D;
|
LPDIRECT3D8 pD3D8=Display.pD3D;
|
||||||
LPDIRECTDRAW7 pDD=Display.pDD;
|
// LPDIRECTDRAW7 pDD=Display.pDD;
|
||||||
D3DDEVICEDESC7 *pD3DDevDesc=&Display.D3DDevDesc;
|
// D3DDEVICEDESC7 *pD3DDevDesc=&Display.D3DDevDesc;
|
||||||
|
LPD3DCAPS8 pD3Dcaps = &Display.d3dcaps;
|
||||||
|
|
||||||
LPDIRECTDRAWSURFACE7 pPrimaryDDSurf,pBackDDSurf,pZDDSurf;
|
LPDIRECTDRAWSURFACE7 pPrimaryDDSurf,pBackDDSurf,pZDDSurf;
|
||||||
LPDIRECT3DDEVICE7 pD3DDevice;
|
LPDIRECT3DDEVICE7 pD3DDevice;
|
||||||
@ -1785,12 +1908,10 @@ CreateScreenBuffersAndDevice(DXScreenData &Display) {
|
|||||||
int i;
|
int i;
|
||||||
HRESULT hr;
|
HRESULT hr;
|
||||||
DX_DECLARE_CLEAN( DDSURFACEDESC2, SurfaceDesc );
|
DX_DECLARE_CLEAN( DDSURFACEDESC2, SurfaceDesc );
|
||||||
|
bool bWantStencil = ((_props._mask & W_STENCIL)!=0);
|
||||||
|
|
||||||
assert(pDD!=NULL);
|
assert(pD3D8!=NULL);
|
||||||
assert(pD3DI!=NULL);
|
assert(pD3Dcaps->dwDevCaps & D3DDEVCAPS_HWRASTERIZATION);
|
||||||
assert(pD3DDevDesc->dwDevCaps & D3DDEVCAPS_HWRASTERIZATION );
|
|
||||||
|
|
||||||
ResourceManagerDiscardBytes(0);
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
// select the best device if the caller does not provide one
|
// select the best device if the caller does not provide one
|
||||||
@ -1824,12 +1945,73 @@ CreateScreenBuffersAndDevice(DXScreenData &Display) {
|
|||||||
}
|
}
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
ResourceManagerDiscardBytes(0);
|
||||||
|
|
||||||
|
// DX_DECLARE_CLEAN(DDCAPS,DDCaps);
|
||||||
|
// pDD->GetCaps(&DDCaps,NULL);
|
||||||
|
|
||||||
|
// find zbuffer format
|
||||||
|
|
||||||
|
#ifndef NDEBUG
|
||||||
|
if(!(_props._mask & W_DEPTH)) {
|
||||||
|
wdxdisplay_cat.info() << "no zbuffer requested, skipping zbuffer creation\n";
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if(Display.PresParams.EnableAutoDepthStencil) {
|
||||||
|
if(!FindBestDepthFormat(Display,&Display.PresParams.AutoDepthStencilFormat,bWantStencil)) {
|
||||||
|
wdxdisplay_cat.error() << "FindBestDepthFormat failed in CreateScreenBuffers for device #"<<Display.cardIDNum<< endl;
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
DX_DECLARE_CLEAN(DDCAPS,DDCaps);
|
D3DPRESENT_PARAMETERS* pPresParams = &Display.PresParams;
|
||||||
pDD->GetCaps(&DDCaps,NULL);
|
pPresParams->Windowed = dx_full_screen;
|
||||||
|
DWORD dwBehaviorFlags=0x0;
|
||||||
|
|
||||||
if(dx_full_screen) {
|
if(dx_full_screen) {
|
||||||
|
/*
|
||||||
|
pD3DModeInfo = &pD3DDeviceInfo->modes[pD3DDeviceInfo->dwCurrentMode];
|
||||||
|
pRenderUnit->DeviceType = pD3DDeviceInfo->DeviceType;
|
||||||
|
pRenderUnit->dwBehavior = pD3DModeInfo->dwBehavior;
|
||||||
|
pRenderUnit->iMonitor = iMonitor;
|
||||||
|
*/
|
||||||
|
|
||||||
|
pPresParams->BackBufferCount = 1;
|
||||||
|
pPresParams->MultiSampleType = D3DMULTISAMPLE_NONE; // bugbug: should we enable this use config var?
|
||||||
|
pPresParams->Flags = 0x0;
|
||||||
|
pPresParams->hDeviceWindow = Display.hWnd;
|
||||||
|
pPresParams->BackBufferFormat = Display.DisplayMode.Format;
|
||||||
|
pPresParams->BackBufferWidth = Display.DisplayMode.Width;
|
||||||
|
pPresParams->BackBufferHeight = Display.DisplayMode.Height;
|
||||||
|
pPresParams->FullScreen_RefreshRateInHz = Display.DisplayMode.RefreshRate;
|
||||||
|
|
||||||
|
pRenderUnit->d3dpp.SwapEffect =
|
||||||
|
pPresParams->FullScreen_PresentationInterval = (dx_sync_video ? D3DPRESENT_INTERVAL_ONE : D3DPRESENT_INTERVAL_IMMEDIATE);
|
||||||
|
|
||||||
|
if(_dxgsg->scrn.bIsTNLDevice) {
|
||||||
|
dwBehaviorFlags|=D3DCREATE_HARDWARE_VERTEXPROCESSING;
|
||||||
|
// note: we could create a pure device in this case if I eliminated the GetRenderState calls in dxgsg
|
||||||
|
|
||||||
|
// also, no software vertex processing available since I specify D3DCREATE_HARDWARE_VERTEXPROCESSING
|
||||||
|
// and not D3DCREATE_MIXED_VERTEXPROCESSING
|
||||||
|
} else {
|
||||||
|
dwBehaviorFlags|=D3DCREATE_SOFTWARE_VERTEXPROCESSING;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(dx_preserve_fpu_state)
|
||||||
|
dwBehaviorFlags|=D3DCREATE_FPU_PRESERVE;
|
||||||
|
|
||||||
|
// Create device
|
||||||
|
hr = pD3D8->CreateDevice(Display.CardIDNum, D3DDEVTYPE_HAL, _pParentWindowGroup->_hParentWindow,
|
||||||
|
dwBehaviorFlags, pPresParams, &Display.pD3DDevice);
|
||||||
|
|
||||||
|
if(FAILED(hr)) {
|
||||||
|
wdxdisplay_cat.fatal() << "D3D CreateDevice failed" << D3DERRORSTRING(hr);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
// Setup to create the primary surface w/backbuffer
|
// Setup to create the primary surface w/backbuffer
|
||||||
DX_DECLARE_CLEAN(DDSURFACEDESC2,ddsd)
|
DX_DECLARE_CLEAN(DDSURFACEDESC2,ddsd)
|
||||||
ddsd.dwFlags = DDSD_CAPS|DDSD_BACKBUFFERCOUNT;
|
ddsd.dwFlags = DDSD_CAPS|DDSD_BACKBUFFERCOUNT;
|
||||||
@ -1898,7 +2080,7 @@ CreateScreenBuffersAndDevice(DXScreenData &Display) {
|
|||||||
|
|
||||||
else { // CREATE WINDOWED BUFFERS
|
else { // CREATE WINDOWED BUFFERS
|
||||||
|
|
||||||
if(!(DDCaps.dwCaps2 & DDCAPS2_CANRENDERWINDOWED)) {
|
if(!(pD3DCaps->Caps2 & D3DCAPS2_CANRENDERWINDOWED)) {
|
||||||
wdxdisplay_cat.fatal() << "the 3D HW cannot render windowed, exiting..." << endl;
|
wdxdisplay_cat.fatal() << "the 3D HW cannot render windowed, exiting..." << endl;
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
@ -2009,172 +2191,7 @@ CreateScreenBuffersAndDevice(DXScreenData &Display) {
|
|||||||
|
|
||||||
resized(dwRenderWidth,dwRenderHeight); // update panda channel/display rgn info
|
resized(dwRenderWidth,dwRenderHeight); // update panda channel/display rgn info
|
||||||
|
|
||||||
#ifndef NDEBUG
|
|
||||||
if(!(_props._mask & W_DEPTH)) {
|
|
||||||
wdxdisplay_cat.info() << "no zbuffer requested, skipping zbuffer creation\n";
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// Check if the device supports z-bufferless hidden surface removal. If so,
|
|
||||||
// we don't really need a z-buffer
|
|
||||||
if((!(pD3DDevDesc->dpcTriCaps.dwRasterCaps & D3DPRASTERCAPS_ZBUFFERLESSHSR )) &&
|
|
||||||
(_props._mask & W_DEPTH)) {
|
|
||||||
|
|
||||||
// Get z-buffer dimensions from the render target
|
|
||||||
DX_DECLARE_CLEAN(DDSURFACEDESC2,ddsd);
|
|
||||||
pBackDDSurf->GetSurfaceDesc( &ddsd );
|
|
||||||
|
|
||||||
// Setup the surface desc for the z-buffer.
|
|
||||||
ddsd.dwFlags = DDSD_WIDTH | DDSD_HEIGHT | DDSD_CAPS | DDSD_PIXELFORMAT;
|
|
||||||
ddsd.ddsCaps.dwCaps = DDSCAPS_ZBUFFER | DDSCAPS_VIDEOMEMORY;
|
|
||||||
|
|
||||||
DDPIXELFORMAT ZBufPixFmts[MAX_DX_ZBUF_FMTS];
|
|
||||||
cNumZBufFmts=0;
|
|
||||||
|
|
||||||
// Get an appropiate pixel format from enumeration of the formats. On the
|
|
||||||
// first pass, we look for a zbuffer dpeth which is equal to the frame
|
|
||||||
// buffer depth (as some cards unfornately require this).
|
|
||||||
if(FAILED(pD3DI->EnumZBufferFormats((Display.bIsTNLDevice ? IID_IDirect3DHALDevice : IID_IDirect3DTnLHalDevice),
|
|
||||||
EnumZBufFmtsCallback,
|
|
||||||
(VOID*)&ZBufPixFmts ))) {
|
|
||||||
wdxdisplay_cat.fatal() << "EnumZBufferFormats failed" << endl;
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef _DEBUG
|
|
||||||
{ static BOOL bPrinted=FALSE;
|
|
||||||
if(!bPrinted) {
|
|
||||||
for(i=0;i<cNumZBufFmts;i++) {
|
|
||||||
DebugPrintPixFmt(&ZBufPixFmts[i]);
|
|
||||||
}
|
|
||||||
bPrinted=TRUE;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// int want_depth_bits = _props._want_depth_bits; should we pay attn to these at some point?
|
|
||||||
// int want_color_bits = _props._want_color_bits;
|
|
||||||
bool bWantStencil = ((_props._mask & W_STENCIL)!=0);
|
|
||||||
|
|
||||||
LPDDPIXELFORMAT pCurPixFmt,pz16=NULL,pz24=NULL,pz32=NULL;
|
|
||||||
for(i=0,pCurPixFmt=ZBufPixFmts;i<cNumZBufFmts;i++,pCurPixFmt++) {
|
|
||||||
if(bWantStencil==((pCurPixFmt->dwFlags & DDPF_STENCILBUFFER)!=0)) {
|
|
||||||
switch(pCurPixFmt->dwRGBBitCount) {
|
|
||||||
case 16:
|
|
||||||
pz16=pCurPixFmt;
|
|
||||||
break;
|
|
||||||
case 24:
|
|
||||||
pz24=pCurPixFmt;
|
|
||||||
break;
|
|
||||||
case 32:
|
|
||||||
pz32=pCurPixFmt;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if((pz16==NULL)&&(pz24==NULL)&&(pz32==NULL)) {
|
|
||||||
if(bWantStencil)
|
|
||||||
wdxdisplay_cat.fatal() << "stencil buffer requested, device has no stencil capability\n";
|
|
||||||
else wdxdisplay_cat.fatal() << "failed to find adequate zbuffer capability\n";
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
#define SET_ZBUF_DEPTH(DEPTH) { assert(pz##DEPTH != NULL); Display.depth_buffer_bitdepth=DEPTH; ddsd.ddpfPixelFormat = *pz##DEPTH;}
|
|
||||||
|
|
||||||
if(IS_NVIDIA(Display.DXDeviceID)) {
|
|
||||||
DX_DECLARE_CLEAN(DDSURFACEDESC2,ddsd_pri)
|
|
||||||
pPrimaryDDSurf->GetSurfaceDesc(&ddsd_pri);
|
|
||||||
|
|
||||||
// must pick zbuf depth to match primary surface depth for nvidia
|
|
||||||
if(ddsd_pri.ddpfPixelFormat.dwRGBBitCount==16) {
|
|
||||||
SET_ZBUF_DEPTH(16);
|
|
||||||
} else {
|
|
||||||
if(dx_force_16bpp_zbuffer) {
|
|
||||||
wdxdisplay_cat.fatal() << "'dx-force-16bpp-zbuffer #t' requires a 16bpp desktop on nvidia cards\n";
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
// take the smaller of 24 or 32. (already assured to match stencil capability)
|
|
||||||
if(pz24!=NULL) {
|
|
||||||
SET_ZBUF_DEPTH(24);
|
|
||||||
} else SET_ZBUF_DEPTH(32);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if(dx_force_16bpp_zbuffer) {
|
|
||||||
if(pz16==NULL) {
|
|
||||||
wdxdisplay_cat.fatal() << "'dx-force-16bpp-zbuffer #t', but no 16bpp zbuf fmts available on this card\n";
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
if(wdxdisplay_cat.is_debug())
|
|
||||||
wdxdisplay_cat.debug() << "forcing use of 16bpp Z-Buffer\n";
|
|
||||||
SET_ZBUF_DEPTH(16);
|
|
||||||
ddsd.ddpfPixelFormat = *pz16;
|
|
||||||
} else {
|
|
||||||
// pick the highest res zbuffer format avail. Note: this is choosing to waste vid-memory
|
|
||||||
// and possibly perf for more accuracy, less z-fighting at long distance (std 16bpp would
|
|
||||||
// be smaller// maybe faster)
|
|
||||||
// order of preference 24: (should be enough), 32: probably means 24 of Z, then 16
|
|
||||||
|
|
||||||
if(bWantStencil && (pz32!=NULL)) {
|
|
||||||
// dont want to select 16/8 z/stencil over 24/8 z/stenc
|
|
||||||
SET_ZBUF_DEPTH(32);
|
|
||||||
} else {
|
|
||||||
if(pz24!=NULL) {
|
|
||||||
SET_ZBUF_DEPTH(24);
|
|
||||||
} else if(pz32!=NULL) {
|
|
||||||
SET_ZBUF_DEPTH(32);
|
|
||||||
} else {
|
|
||||||
SET_ZBUF_DEPTH(16);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
PRINTVIDMEM(pDD,&ddsd.ddsCaps,"initial zbuf");
|
|
||||||
|
|
||||||
#ifdef _DEBUG
|
|
||||||
wdxdisplay_cat.info() << "Creating " << ddsd.ddpfPixelFormat.dwRGBBitCount << "bpp zbuffer\n";
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// Create and attach a z-buffer
|
|
||||||
if(FAILED( hr = pDD->CreateSurface( &ddsd, &pZDDSurf, NULL ) )) {
|
|
||||||
wdxdisplay_cat.fatal() << "CreateSurface failed for Z buffer: result = " << ConvD3DErrorToString(hr) << endl;
|
|
||||||
|
|
||||||
if(((hr==DDERR_OUTOFVIDEOMEMORY)||(hr==DDERR_OUTOFMEMORY)) &&
|
|
||||||
((Display.dwFullScreenBitDepth>16)||(ddsd.ddpfPixelFormat.dwRGBBitCount>16))) {
|
|
||||||
Display.dwFullScreenBitDepth=16;
|
|
||||||
// emergency fallback to 16bpp (shouldnt have to do this unless GetAvailVidMem lied)
|
|
||||||
// will this work for multimon? what if surfs are already created on 1st mon?
|
|
||||||
|
|
||||||
if(wdxdisplay_cat.info())
|
|
||||||
wdxdisplay_cat.info() << "GetAvailVidMem lied, not enough VidMem for 32bpp, so trying 16bpp on device #"<< Display.CardIDNum<< endl;
|
|
||||||
|
|
||||||
ULONG refcnt;
|
|
||||||
|
|
||||||
// free pri and back (maybe should just free pri since created as complex chain?)
|
|
||||||
RELEASE(pBackDDSurf,wdxdisplay,"backbuffer",false);
|
|
||||||
RELEASE(pPrimaryDDSurf,wdxdisplay,"primary surface",false);
|
|
||||||
|
|
||||||
if(FAILED( hr = pDD->SetDisplayMode( Display.dwRenderWidth, Display.dwRenderHeight,Display.dwFullScreenBitDepth, 0, 0 ))) {
|
|
||||||
wdxdisplay_cat.fatal() << "SetDisplayMode failed to set ("<<Display.dwRenderWidth<<"x"<<Display.dwRenderHeight<<"x"<<Display.dwFullScreenBitDepth<<") on device #"<< Display.CardIDNum<<": result = " << ConvD3DErrorToString(hr) << endl;
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
bool saved_value=dx_force_16bpp_zbuffer;
|
|
||||||
dx_force_16bpp_zbuffer=true;
|
|
||||||
CreateScreenBuffersAndDevice(Display);
|
|
||||||
dx_force_16bpp_zbuffer=saved_value;
|
|
||||||
return;
|
|
||||||
} else {
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if(FAILED( hr = pBackDDSurf->AddAttachedSurface( pZDDSurf ) )) {
|
|
||||||
wdxdisplay_cat.fatal() << "AddAttachedSurface failed : result = " << ConvD3DErrorToString(hr) << endl;
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Create the device. The device is created off of our back buffer, which
|
// Create the device. The device is created off of our back buffer, which
|
||||||
// becomes the render target for the newly created device.
|
// becomes the render target for the newly created device.
|
||||||
@ -2858,7 +2875,7 @@ void wdxGraphicsWindowGroup::initWindowGroup(void) {
|
|||||||
CreateWindows(); // creates win32 windows (need to do this before Setting coopLvls and display modes,
|
CreateWindows(); // creates win32 windows (need to do this before Setting coopLvls and display modes,
|
||||||
// but after we have all the monitor handles needed by CreateWindow()
|
// but after we have all the monitor handles needed by CreateWindow()
|
||||||
|
|
||||||
SetCoopLevelsAndDisplayModes();
|
// SetCoopLevelsAndDisplayModes();
|
||||||
|
|
||||||
if(dx_show_fps_meter)
|
if(dx_show_fps_meter)
|
||||||
_windows[0]->_dxgsg->_bShowFPSMeter = true; // just show fps on 1st mon
|
_windows[0]->_dxgsg->_bShowFPSMeter = true; // just show fps on 1st mon
|
||||||
|
@ -163,7 +163,7 @@ public:
|
|||||||
// dont publish variable length one, since FFI wont support it
|
// dont publish variable length one, since FFI wont support it
|
||||||
wdxGraphicsWindowGroup(GraphicsPipe *pipe,int num_windows,GraphicsWindow::Properties *WinPropArray);
|
wdxGraphicsWindowGroup(GraphicsPipe *pipe,int num_windows,GraphicsWindow::Properties *WinPropArray);
|
||||||
~wdxGraphicsWindowGroup();
|
~wdxGraphicsWindowGroup();
|
||||||
void SetCoopLevelsAndDisplayModes(void);
|
// void SetCoopLevelsAndDisplayModes(void);
|
||||||
public:
|
public:
|
||||||
void CreateWindows(void);
|
void CreateWindows(void);
|
||||||
void make_windows(GraphicsPipe *,int num_windows,GraphicsWindow::Properties *pWinPropArray);
|
void make_windows(GraphicsPipe *,int num_windows,GraphicsWindow::Properties *pWinPropArray);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user