diff --git a/panda/src/wdxdisplay8/wdxGraphicsWindow8.cxx b/panda/src/wdxdisplay8/wdxGraphicsWindow8.cxx index 208f7d9b16..c0b44cc5b0 100644 --- a/panda/src/wdxdisplay8/wdxGraphicsWindow8.cxx +++ b/panda/src/wdxdisplay8/wdxGraphicsWindow8.cxx @@ -1973,7 +1973,7 @@ int D3DFMT_to_DepthBits(D3DFORMAT fmt) { } } -bool wdxGraphicsWindow::FindBestDepthFormat(DXScreenData &Display,D3DDISPLAYMODE &TestDisplayMode,D3DFORMAT *pBestFmt,bool bWantStencil,bool bForce16bpp) const { +bool wdxGraphicsWindow::FindBestDepthFormat(DXScreenData &Display,D3DDISPLAYMODE &TestDisplayMode,D3DFORMAT *pBestFmt,bool bWantStencil,bool bForce16bpp,bool bVerboseMode) const { // list fmts in order of preference #define NUM_TEST_ZFMTS 3 static D3DFORMAT NoStencilPrefList[NUM_TEST_ZFMTS]={D3DFMT_D32,D3DFMT_D24X8,D3DFMT_D16}; @@ -1991,6 +1991,9 @@ bool wdxGraphicsWindow::FindBestDepthFormat(DXScreenData &Display,D3DDISPLAYMODE bool bOnlySelect16bpp= (dx_force_16bpp_zbuffer || bForce16bpp || (IS_NVIDIA(Display.DXDeviceID) && IS_16BPP_DISPLAY_FORMAT(TestDisplayMode.Format))); + if(bVerboseMode) + wdxdisplay_cat.info() << "FindBestDepthFmt: bSelectOnly16bpp: " << bOnlySelect16bpp << endl; + for(int i=0;iscrn.pD3D8)); HRESULT hr; @@ -2043,13 +2054,15 @@ void wdxGraphicsWindow::search_for_valid_displaymode(UINT RequestedXsize,UINT Re #endif *pSuggestedPixFmt = D3DFMT_UNKNOWN; - *pSupportedScreenDepthsMask = 0x0; + *pCouldntFindAnyValidZBuf=false; + int cNumModes=_dxgsg->scrn.pD3D8->GetAdapterModeCount(_dxgsg->scrn.CardIDNum); D3DDISPLAYMODE BestDispMode; ZeroMemory(&BestDispMode,sizeof(BestDispMode)); - *pCouldntFindAnyValidZBuf=false; + if(bVerboseMode) + wdxdisplay_cat.info() << "searching for valid display modes at res: (" << RequestedXsize << "," << RequestedYsize << "), TotalModes: " << cNumModes<< endl; for(int i=0;i1)) { // dont want refresh rates under 60Hz, but 0 or 1 might indicate a default refresh rate, which is usually >=60 + if(bVerboseMode) + wdxdisplay_cat.info() << "skipping mode["<scrn.pD3D8->CheckDeviceFormat(_dxgsg->scrn.CardIDNum,D3DDEVTYPE_HAL,dispmode.Format, D3DUSAGE_RENDERTARGET,D3DRTYPE_SURFACE,dispmode.Format); if(FAILED(hr)) { - if(hr==D3DERR_NOTAVAILABLE) + if(hr==D3DERR_NOTAVAILABLE) { + if(bVerboseMode) + wdxdisplay_cat.info() << "skipping mode["<scrn.CardIDNum << D3DERRORSTRING(hr); exit(1); } @@ -2103,13 +2120,13 @@ void wdxGraphicsWindow::search_for_valid_displaymode(UINT RequestedXsize,UINT Re RendTgtMinMemReqmt = ((float)RequestedXsize)*((float)RequestedYsize)*bytes_per_pixel*2+REQD_TEXMEM; - if(wdxdisplay_cat.is_spam()) - wdxdisplay_cat.spam() << "Testing Mode (" <scrn.MaxAvailVidMem << endl; if(RendTgtMinMemReqmt>_dxgsg->scrn.MaxAvailVidMem) { - if(wdxdisplay_cat.is_debug()) - wdxdisplay_cat.debug() << "not enough VidMem for render tgt, skipping display fmt " << D3DFormatStr(dispmode.Format) + if(bVerboseMode || wdxdisplay_cat.is_debug()) + wdxdisplay_cat.info() << "not enough VidMem for render tgt, skipping display fmt " << D3DFormatStr(dispmode.Format) << " (" << (int)RendTgtMinMemReqmt << " > " << _dxgsg->scrn.MaxAvailVidMem << ")\n"; continue; } @@ -2128,13 +2145,13 @@ void wdxGraphicsWindow::search_for_valid_displaymode(UINT RequestedXsize,UINT Re float zbytes_per_pixel = (IS_16BPP_ZBUFFER(zformat) ? 2 : 4); float MinMemReqmt = RendTgtMinMemReqmt + ((float)RequestedXsize)*((float)RequestedYsize)*zbytes_per_pixel; - if(wdxdisplay_cat.is_spam()) - wdxdisplay_cat.spam() << "Testing Mode w/Z (" <scrn.MaxAvailVidMem << endl; if(MinMemReqmt>_dxgsg->scrn.MaxAvailVidMem) { - if(wdxdisplay_cat.is_debug()) - wdxdisplay_cat.debug() << "not enough VidMem for RendTgt+zbuf, skipping display fmt " << D3DFormatStr(dispmode.Format) + if(bVerboseMode || wdxdisplay_cat.is_debug()) + wdxdisplay_cat.info() << "not enough VidMem for RendTgt+zbuf, skipping display fmt " << D3DFormatStr(dispmode.Format) << " (" << (int)MinMemReqmt << " > " << _dxgsg->scrn.MaxAvailVidMem << ")\n"; continue; } @@ -2143,7 +2160,9 @@ void wdxGraphicsWindow::search_for_valid_displaymode(UINT RequestedXsize,UINT Re if(!IS_16BPP_ZBUFFER(zformat)) { // see if things fit with a 16bpp zbuffer - if(!FindBestDepthFormat(_dxgsg->scrn,dispmode,&zformat,bWantStencil,true)) { + if(!FindBestDepthFormat(_dxgsg->scrn,dispmode,&zformat,bWantStencil,true,bVerboseMode)) { + if(bVerboseMode) + wdxdisplay_cat.info() << "FindBestDepthFmt rejected Mode["<scrn.bIsLowVidMemCard) { - bool bUseDefaultSize=dx_pick_best_screenres&& ((_dxgsg->scrn.MaxAvailVidMem == UNKNOWN_VIDMEM_SIZE) || is_badvidmem_card(&_dxgsg->scrn.DXDeviceID)); @@ -2356,6 +2381,12 @@ bool wdxGraphicsWindow::search_for_device(LPDIRECT3D8 pD3D8,DXDeviceInfo *pDevIn wdxdisplay_cat.fatal() << (bCouldntFindValidZBuf ? "Couldnt find valid zbuffer format to go with FullScreen mode" : "No supported FullScreen modes") << " at " << dwRenderWidth << "x" << dwRenderHeight << " for device #" << _dxgsg->scrn.CardIDNum <scrn.SupportedScreenDepthsMask, + &bCouldntFindValidZBuf, + &pixFmt,true); return false; } } @@ -2382,6 +2413,12 @@ bool wdxGraphicsWindow::search_for_device(LPDIRECT3D8 pD3D8,DXDeviceInfo *pDevIn else { wdxdisplay_cat.fatal() << "Low Memory VidCard has no supported FullScreen 16bpp resolutions at "<< dwRenderWidth << "x" << dwRenderHeight << " for device #" << pDevInfo->cardID << " (" << _dxgsg->scrn.DXDeviceID.Description <<"), skipping device...\n"; + + // run it again in verbose mode to get more dbg info to log + search_for_valid_displaymode(dwRenderWidth,dwRenderHeight,bNeedZBuffer,bWantStencil, + &_dxgsg->scrn.SupportedScreenDepthsMask, + &bCouldntFindValidZBuf, + &pixFmt,true); return false; } @@ -2466,7 +2503,7 @@ CreateScreenBuffersAndDevice(DXScreenData &Display) { pPresParams->Windowed = !_props._fullscreen; if(dx_multisample_antialiasing_level>1) { - // need to check both rendertarget and zbuffer fmts + // need to check both rendertarget and zbuffer fmts hr = pD3D8->CheckDeviceMultiSampleType(Display.CardIDNum, D3DDEVTYPE_HAL, Display.DisplayMode.Format, _props._fullscreen, D3DMULTISAMPLE_TYPE(dx_multisample_antialiasing_level)); if(FAILED(hr)) { diff --git a/panda/src/wdxdisplay8/wdxGraphicsWindow8.h b/panda/src/wdxdisplay8/wdxGraphicsWindow8.h index 540ffd6c83..0b6ad82bcd 100644 --- a/panda/src/wdxdisplay8/wdxGraphicsWindow8.h +++ b/panda/src/wdxdisplay8/wdxGraphicsWindow8.h @@ -100,8 +100,8 @@ protected: bool search_for_device(LPDIRECT3D8 pD3D8,DXDeviceInfo *pDevinfo); void search_for_valid_displaymode(UINT RequestedXsize,UINT RequestedYsize,bool bWantZBuffer,bool bWantStencil, UINT *pSupportedScreenDepthsMask,bool *pCouldntFindAnyValidZBuf, - D3DFORMAT *pSuggestedPixFmt); - bool FindBestDepthFormat(DXScreenData &Display,D3DDISPLAYMODE &TestDisplayMode,D3DFORMAT *pBestFmt,bool bWantStencil,bool bForce16bpp) const; + D3DFORMAT *pSuggestedPixFmt,bool bVerboseMode = false); + bool FindBestDepthFormat(DXScreenData &Display,D3DDISPLAYMODE &TestDisplayMode,D3DFORMAT *pBestFmt,bool bWantStencil,bool bForce16bpp,bool bVerboseMode = false) const; void init_resized_window(void); bool reset_device_resize_window(UINT new_xsize, UINT new_ysize); void setup_colormap(void);